Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can anyone help in understanding AVFrame.linesize[]?

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.

  1. If I'm right what does other cells mean?
  2. 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?

like image 973
theateist Avatar asked Nov 08 '12 09:11

theateist


2 Answers

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)

like image 128
pogorskiy Avatar answered Nov 16 '22 20:11

pogorskiy


Have a look at description of video frame formats:

  • YUV pixel formats
  • Video Media Types - Image Stride

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.

like image 43
Roman R. Avatar answered Nov 16 '22 20:11

Roman R.