LibAV中的`linesize'是什么

时间:2018-11-12 06:57:31

标签: c++ libavcodec libav

我正在使用LibAV进行视频编码,无法理解linesize的目的。

例如,在LibAV中av_image_alloc函数的声明将行大小作为参数:

int av_image_alloc  (   uint8_t *   pointers[4],
      int   linesizes[4],
      int   w,
      int   h,
      enum AVPixelFormat    pix_fmt,
      int   align 
   )        

我是LibAV和视频编码的新手。随时提供任何链接,这些链接也很少给我提供视频编码的背景。

3 个答案:

答案 0 :(得分:2)

linesize是每个颜色通道在内存中的图像宽度。对于内存对齐问题,它可能大于或等于w

检查ffmpeg av frame doc

  

对于视频,行大小应为CPU对齐首选项的倍数,对于现代台式机CPU,此值为16或32。有些代码要求进行这种对齐,而另一些代码如果没有正确的对齐可能会变慢,而其他代码则没有任何区别。

     

行大小可能大于可用数据的大小–出于性能原因,可能存在额外的填充。

答案 1 :(得分:2)

此功能将分配一个足够大的缓冲区,以容纳将图像数据分成一个或多个组件阵列(平面)的图像数据。根据格式,每个图片组件的行大小将具有其自己的宽度(以字节为单位)(可能比图像宽度小得多或大得多),并且还将被填充以实现指定的对齐方式(通常为16个字节使矢量指令起作用)。例如,对于具有4:2:0子采样的典型YCbCr图像,将有3个平面(即pointers中存储了3个非空指针),亮度平面线的宽度将(填充)图像宽度,宽度每个色度分量行的像素宽度将被(填充)图像宽度的一半。

还要注意,此函数中的pointerslinesizes都是out指针参数,而不是数组。

答案 2 :(得分:0)

linesize数组值取决于像素格式。 对于NV12像素格式,每帧均包含两个平面:Y平面和UV平面(U和V值是交错的)。因此,linesize[0] = frame_widthlinesize[1]=frame_width(由于对U像素的数量=亮度像素的1/2进行二次采样,而U像素和V像素的总数为frame_width)。

对于RGB24像素格式,每帧均由单个平面和linesize[0]操作系统(仅与相关且linesize[0] = 3*frame_width

)组成