AVPicture中data与linesize关系

本文详细介绍了AVPicture结构中data和linesize字段的含义,特别是在YUV420P、RGBA32和RGB24格式下的数据存储方式。linesize字段用于表示每一行的大小,考虑了像素宽度和填充需求,对于优化运动估计和补偿以及P/B帧重建至关重要。例如,在YUV420P中,linesize分别为宽度、宽度的一半和宽度的一半,而在RGB格式中,linesize则直接等于宽度乘以像素大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值