C++ LibAV中的'linesize'是什么

C++ LibAV中的'linesize'是什么,c++,libavcodec,libav,C++,Libavcodec,Libav,我正在使用LibAV播放视频编码,无法理解linesize的用途 例如,LibAV中av\u image\u alloc函数的声明将线条尺寸作为参数: int av_image_alloc ( uint8_t * pointers[4], int linesizes[4], int w, int h, enum AVPixelFormat pix_fmt, int align )

我正在使用LibAV播放视频编码,无法理解
linesize
的用途

例如,LibAV中
av\u image\u alloc
函数的声明将线条尺寸作为参数:

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

我不熟悉LibAV和视频编码。请随时提供任何链接,也可以给我一点视频编码的背景

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

检查:

对于视频,线条大小应该是CPU对齐首选项的倍数,对于现代桌面CPU,这是16或32。有些代码需要这种对齐方式,而其他代码在没有正确对齐的情况下可能会更慢,因为还有一些代码没有区别

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


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


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

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


对于RGB24像素格式,每个帧由单个平面和
linesize[0]
os仅相关,并且
linesize[0]=3*frame\u width

它不能小于宽度。@szatmary我提到了一个例子,当线条尺寸比图像宽度小2倍时就足够了。前半部分读起来很有趣,因为你必须有至少宽度大小的色度平面。@szatmary不太可能,色度平面有1/2的水平和垂直子采样,因此每条色度线比图像宽度小2倍……我理解色度子采样。当我第一次看到你的回答时,我觉得不太清楚。如果您不同意,也可以。对于RGB,linesize[0]表示R颜色通道每个像素的字节大小,linesize[1]表示G颜色通道每个像素的字节大小,依此类推?快速提问,帧->数据[0]包含R通道,帧->数据[1]包含G通道,对吗?@random_28这在平面RGB(如
AV_PIX\u FMT\u GBRP
)的情况下是正确的,但是通常libav使用压缩RGB,因此
linesize[0]
将表示
RGBRGB…
指针[0]
中存储的字节数组中的行的字节大小。请参见
pixfmt.h
,了解支持的格式列表(其中还解释了它们的存储方式)。还请注意,这个答案很容易引起误解,
linesize
可以小于或大于
w
取决于像素格式,而对齐实际上是可选的。@VTT所以指针[0]包含所有
RGBRGB…
值。那么
指针[1]
指针[2]
包含哪些内容?@random\u 28无任何内容,不使用时应为空。