我正在使用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和视频编码的新手。请随时提供任何链接,这也可以给我很少的视频编码背景。
发布于 2018-11-12 15:10:52
linesize是每个颜色通道在内存中的图像宽度。对于内存对齐问题,它可能大于或等于w。
用于视频的
线条大小应为CPU对齐首选项的倍数,对于现代桌面CPU,此值为16或32。一些代码需要这样的对齐,其他代码在没有正确对齐的情况下可能会变慢,因为还有一些代码没有什么不同。
行大小可能大于可用数据的大小-出于性能原因,可能存在额外的填充。
发布于 2018-11-12 15:15:39
此函数将分配一个足够大的缓冲区来保存图像数据,将其拆分成一个或多个组件数组(平面)。根据格式的不同,每个图片分量的行的大小将有其自己的宽度(以字节为单位)(可能比图像宽度小得多,也可能比图像宽度大得多),并且还将进行填充以实现指定的对齐方式(通常为16字节,以使矢量指令工作)。例如,对于具有4:2:0二次采样的典型YCbCr图像,将有3个平面(即存储在pointers中的3个非空指针),并且亮度平面线的宽度将是(填充)图像宽度,每个色度分量线的宽度将是(填充)图像宽度的一半。
还要注意,此函数中的pointers和linesizes都是外部指针参数,而不是数组。
发布于 2019-08-14 19:23:17
行大小数组值取决于像素格式。对于NV12像素格式,每个帧由两个平面组成:Y平面和UV平面(U和V值是交错的)。因此,linesize[0] = frame_width和linesize[1]=frame_width (由于二次采样,U像素的数量=亮度像素的1/2,并且U像素和V像素的总数是frame_width)。
对于RGB24像素格式,每个帧由单个平面和仅相关的linesize[0] os和linesize[0] = 3*frame_width组成。
https://stackoverflow.com/questions/53257213
复制相似问题