AVPicture里面有data[4]和linesize[4]其中data是一个指向指针的指针(二级、二维指针),也就是指向视频数据缓冲区的首地址,而data[0]~data[3]是一级指针,可以用如下的图来表示:
data -->xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
^ ^ ^
| | |
data[0] data[1] data[2]
比如说,当pix_fmt=PIX_FMT_YUV420P时,data中的数据是按照YUV的格式存储的,也就是:
data -->YYYYYYYYYYYYYYYYYYYYYYYYUUUUUUUUUUUVVVVVVVVVVVV
^ ^ ^
| | |
data[0] data[1] data[2]
linesize是指对应于每一行的大小,为什么需要这个变量,是因为在YUV格式和RGB格式时,每行的大小不一定等于图像的宽度。
linesize = width + padding size(16+16) for YUV
linesize = width*pixel_size for RGB
padding is needed during Motion Estimation and Motion Compensation for Optimizing MV serach and P/B frame reconstruction
for RGB only one channel is available
so RGB24 : data[0] = packet rgbrgbrgbrgb......
linesize[0] = width*3
data[1],data[2],data[3],linesize[1],linesize[2],linesize[2] have no any means for RGB
测试如下:(原始的320×182视频)
如果pix_fmt=PIX_FMT_RGBA32
linesize 的只分别为:1280 0 0 0
linesize为:width * 4、0、0、0
如果pix_fmt=PIX_FMT_RGB24
linesize 的只分别为:960 0 0 0
linesize为:width * 3、0、0、0
如果pix_fmt=PIX_FMT_YUV420P
linesize 的只分别为:352 176 176 0
linesize 的只分别为:width、width/2 、width/2
本文详细介绍了AVPicture结构中data和linesize字段的含义,特别是在YUV420P、RGBA32和RGB24格式下的数据存储方式。linesize字段用于表示每一行的大小,考虑了像素宽度和填充需求,对于优化运动估计和补偿以及P/B帧重建至关重要。例如,在YUV420P中,linesize分别为宽度、宽度的一半和宽度的一半,而在RGB格式中,linesize则直接等于宽度乘以像素大小。
877

被折叠的 条评论
为什么被折叠?



