YUV数据的几种采样格式以及保存方式

YUV数据的几种采样格式以及保存方式

1.YUV数据的几种采样格式

4:4:4 这个不用解释了,这是每个像素占三个字节的内存.

4:2:2  Y0U0V0  Y1U1V1  Y2U2V2  Y3U3V3对于这四个像素,采样之后存放的码流为:Y0U0 Y1V1 Y2U2 Y3V3,占用的内存大小为4+4/2 +4/2=8

4:2:0并不意味着只有Y和U而没有V,他指的是对于每行扫描线来说,只有一种色度分量以2:1的抽样率存储,相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2, 对于[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] [Y4 U4 V4] [Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] 。采样之后存放的码流为Y0 U0 Y1 Y2 U2 Y3 Y4 V4 Y5 Y6 V6 Y7.  占用的内存是width*height*3/2.

2.YUV数据的几种保存格式

通常有两大类,打包格式和平面格式,打包格式是指将YUV保存在一个数组里面,然后YUV交叉存放,平面格式是指将YUV分量分别保存在三个不同的数组中.

YUV422

对于YUV422来说,有三种保存方式分别是平面,半平面和交叉方式.

注意422交叉存放时的顺序是UYVY.

YUV420

420是应该是没有交叉模式的,只有平面模式和半平面模式.

 

 

 

HISI获取的YUV数据格式是YUV420的,保存格式一般是NV12或者NV21,就是UV交叉存放的那种。

 

对于YUV420SP的格式来说,从上图可以看到,对于第i行j列的像素来说(i的范围是0 ~ width-1,j的范围是0 ~ height-1),

他的y数据指针就是 i*width + j ; i j 都是从0开始。   

他的u数据指针是:width*height + (i/2) *width + (j/2)*2

他的V数据是:width*height + (i/2) *width + (j/2)*2 + 1