我正在使用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和视频编码的新手。随时提供任何链接,这些链接也很少给我提供视频编码的背景。
答案 0 :(得分:2)
linesize
是每个颜色通道在内存中的图像宽度。对于内存对齐问题,它可能大于或等于w
。
对于视频,行大小应为CPU对齐首选项的倍数,对于现代台式机CPU,此值为16或32。有些代码要求进行这种对齐,而另一些代码如果没有正确的对齐可能会变慢,而其他代码则没有任何区别。
行大小可能大于可用数据的大小–出于性能原因,可能存在额外的填充。
答案 1 :(得分:2)
此功能将分配一个足够大的缓冲区,以容纳将图像数据分成一个或多个组件阵列(平面)的图像数据。根据格式,每个图片组件的行大小将具有其自己的宽度(以字节为单位)(可能比图像宽度小得多或大得多),并且还将被填充以实现指定的对齐方式(通常为16个字节使矢量指令起作用)。例如,对于具有4:2:0子采样的典型YCbCr图像,将有3个平面(即pointers
中存储了3个非空指针),亮度平面线的宽度将(填充)图像宽度,宽度每个色度分量行的像素宽度将被(填充)图像宽度的一半。
还要注意,此函数中的pointers
和linesizes
都是out指针参数,而不是数组。
答案 2 :(得分:0)
linesize数组值取决于像素格式。
对于NV12像素格式,每帧均包含两个平面:Y平面和UV平面(U和V值是交错的)。因此,linesize[0] = frame_width
和linesize[1]=frame_width
(由于对U像素的数量=亮度像素的1/2进行二次采样,而U像素和V像素的总数为frame_width)。
对于RGB24像素格式,每帧均由单个平面和linesize[0]
操作系统(仅与相关且linesize[0] = 3*frame_width