Can anyone help in understanding AVFrame.linesize[]?
Solution 1
In the case of planar data, such as YUV420
, linesize[i]
contains stride for the i
-th plane.
For example, for frame 640x480
data[0]
contains pointer to Y
component, data[1]
and data[2]
contains pointers to U
and V
planes. In this case, linesize[0] == 640
, linesize[1] == linesize[2] == 320
(because the U
and V
planes is less than Y
plane half)
In the case of pixel data (RGB24
), there is only one plane (data[0]
) and linesize[0] == width * channels
(640 * 3
for RGB24
)
Solution 2
Have a look at description of video frame formats:
You will see that formats are split into two big groups: packed and planar, depending on whether the components are kept separately or interleaved. Strides have slightly different meaning for those, and basically they are number of bytes you need to skip to advance by a row.
Related videos on Youtube
theateist
Updated on June 05, 2022Comments
-
theateist about 2 years
I tried to find what each cell of
AVFrame.linesize[]
means, but I didn't found.As I understood
linesize[0]
is the width,linesize[1]
is the height.- If I'm right what does other cells mean?
- why after
avcodec_decode_video2(codecCtxDecode, frameDecoded, &frameFinished, &packet);
only linesize[0] has the value and other cells are always 0?
UPDATED
I think AVFrame.data[i] and AVFrame.linesize[i] are the data of specific color in the row and the length of the row, am I correct?
-
nmxprime over 10 yearshi, After
avcodec_decode_video2(dc, yuvFrame, &got_picture, &h264packet);
if i printlinesize
, it's not as you stated. why the linesize is such huge(a large 8 digit number) ? -
Matt Wolfe over 5 yearsthis is super old but the reason it's a huge 8 bit number is because it's a pointer to an array, not an integer.
-
Benjamin Crawford Ctrl-Alt-Tut about 3 yearsHow come then, if I have a YUV420p frame with resolution 500x500,
linesize[0] == 512
? -
pogorskiy about 3 years@BenjaminCrawfordCtrl-Alt-Tut Each next line in Y plane begin 512 bytes after previous even though it contains 500 significant bytes
-
Minnie over 2 yearslinesize[0] may be greater than the width. Check this one too stackoverflow.com/a/57666844/3871242
-
pentanol about 2 years@pogorskiy You mentioned that linesize[0] == 640, linesize[1] == linesize[2] == 320 Aren't UV planes interleaved on a single plane in case of 4:2:0, why to to mention plane 2 then ? If I am wrong could you correct me ?