好久没更新,有好几篇翻译都沉寂在Wiznote中了。赶紧发出来~
http://linuxtv.org/downloads/v4l-dvb-apis/yuv-formats.html
YUV是源自于TV广播的符合视频信号,它将亮度信息(Y)从颜色信息(U、V或Cb、Cr)。颜色信息涵盖了红色和蓝色的颜色差异信号,这样蓝色部分就可以通过减去亮度信息进行重建。见“颜色空间”节的转换示例。YUV之所以被选择是因为早期的电视只传输亮度数据。向已接收信号中添加兼容颜色的方法就是传输差异信号。其次,在YUV格式中U和V部分通常比Y部分的分辨率低,这一点是模拟信号压缩技术利用了人类视觉系统的属性,其对亮度信息更加敏感。
组合YUV格式
与组合RGB相似,而存储的是Y,Cb,Cr部分,每个像素占16或32位。
表2.7 组合YUV图像格式
定义 | 码 | Byte 0 | Byte 1 | Byte 2 | Byte 3 |
---|---|---|---|---|---|
V4L2_PIX_FMT_YUV444 | Y444 | Cb3 Cb2 Cb1 Cb0 Cr3 Cr2 Cr1 Cr0 | a3 a2 a1 a0 Y'3 Y'2 Y'1 Y'0 | - | - |
V4L2_PIX_FMT_YUV555 | YUVO | Cb2 Cb1 Cb0 Cr4 Cr3 Cr2 Cr1 Cr0 | a Y'4 Y'3 Y'2 Y'1 Y'0 Cb4 Cb3 | - | - |
V4L2_PIX_FMT_YUV565 | YUVP | Cb2 Cb1 Cb0 Cr4 Cr3 Cr2 Cr1 Cr0 | Y'4 Y'3 Y'2 Y'1 Y'0 Cb5 Cb4 Cb3 | - | - |
V4L2_PIX_FMT_YUV32 | YUV4 | a7 a6 a5 a4 a3 a2 a1 a0 | Y'7 Y'6 Y'5 Y'4 Y'3 Y'2 Y'1 Y'0 | Cb7 Cb6 Cb5 Cb4 Cb3 Cb2 Cb1 Cb0 | Cr7 Cr6 Cr5 Cr4 Cr3 Cr2 Cr1 Cr0 |
第7位是符号位,a(alpha)的值在读取驱动时并未定义,所以编写驱动时忽略它吧,除非是在Overlay或输出Overlay时候协商了透明度。
V4L2_PIX_FMT_GREY 灰度图像
这是一个灰度图像,是一个退化的Y'CbCr格式,并不包含Cb和Cr数据。
例2.10 V4L2_PIX_FMT_GREY 4 x 4像素图像**
start + 0: Y'00 Y'01 Y'02 Y'03
start + 4: Y'10 Y'11 Y'12 Y'13
start + 8: Y'20 Y'21 Y'22 Y'23
start +12: Y'30 Y'31 Y'32 Y'33
V4L2_PIX_FMT_Y10 灰度图像
这是每个像素占10位的灰度图像,像素被保存在16位字段中,高位自动填充0,低位存储在低内存中(低位机)。
例2.11 V4L2_PIX_FMT_Y10 4 x 4像素图像
start + 0: Y'00low Y'00high Y'01low Y'01high Y'02low Y'02high Y'03low Y'03high
start + 8: Y'10low Y'10high Y'11low Y'11high Y'12low Y'12high Y'13low Y'13high
start +16: Y'20low Y'20high Y'21low Y'21high Y'22low Y'22high Y'23low Y'23high
start +24: Y'30low Y'30high Y'31low Y'31high Y'32low Y'32high Y'33low Y'33high
V4L2_PIX_FMT_Y12 灰度图
每个像素占12位的灰度图,保存在16位字段中,高位填充0,低位存储在低内存中(低位机)。
例2.12 V4L2_PIX_FMT_Y12
start + 0: Y'00low Y'00high Y'01low Y'01high Y'02low Y'02high Y'03low Y'03high
start + 8: Y'10low Y'10high Y'11low Y'11high Y'12low Y'12high Y'13low Y'13high
start +16: Y'20low Y'20high Y'21low Y'21high Y'22low Y'22high Y'23low Y'23high
start +24: Y'30low Y'30high Y'31low Y'31high Y'32low Y'32high Y'33low Y'33high
V4L2_PIX_FMT_Y10BPACK 位集合灰度图
每像素10位的组合灰度图格式,像素存储在一个位组合中,每像素占10位,这其中并没有任何填充。
例2.13 V4L2_PIX_FMT_Y10BPACK 占用5字节的4像素数据流
Y'00[9:2] Y'00[1:0]Y'01[9:4] Y'01[3:0]Y'02[9:6] Y'02[5:0]Y'03[9:8] Y'03[7:0]
V4L2_PIX_FMT_Y16 灰度图
16位深度灰度图,低位存储在低内存中(低位机)。请注意,可能真实取样精度会比16位低,比如10位深度代表0~1023。
例2.14 V4L2_PIX_FMT_Y16 4 x 4像素图像
start + 0: Y'00low Y'00high Y'01low Y'01high Y'02low Y'02high Y'03low Y'03high
start + 8: Y'10low Y'10high Y'11low Y'11high Y'12low Y'12high Y'13low Y'13high
start +16: Y'20low Y'20high Y'21low Y'21high Y'22low Y'22high Y'23low Y'23high
start +24: Y'30low Y'30high Y'31low Y'31high Y'32low Y'32high Y'33low Y'33high
V4L2_PIX_FMT_UV8 UV交叉平面
此格式没有Y平面数据,只有UV平面。
例2.15 V4L2_PIX_FMT_UV8 像素图像
start + 0: Cb00 Cr00 Cb01 Cr01
start + 4: Cb10 Cr10 Cb11 Cr11
start + 8: Cb20 Cr20 Cb21 Cr21
start + 12: Cb30 Cr30 Cb31 Cr31
V4L2_PIX_FMT_YUYV 1/2饱和度分辨率组合格式,即YUV 4:2:2
此格式中每四字节代表两个像素,其中有两个Y',一个Cb和Cr。两个Y是两个像素的,Cb和Cr同属于这两个像素。如你所见,Cr和Cb部分只有相对于Y部分的一般竖向饱和度分辨率,V4L2_PIX_FMT_YUYV相当于Windows环境下的YUY2。
例2.16 V4L2_PIX_FMT_YUYV 4 x 4像素图像
start + 0: Y'00 Cb00 Y'01 Cr00 Y'02 Cb01 Y'03 Cr01
start + 8: Y'10 Cb10 Y'11 Cr10 Y'12 Cb11 Y'13 Cr11
start +16: Y'20 Cb20 Y'21 Cr20 Y'22 Cb21 Y'23 Cr21
start +24: Y'30 Cb30 Y'31 Cr30 Y'32 Cb31 Y'33 Cr31
颜色取样位置
0 1 2 3
0 Y C Y Y C Y
1 Y C Y Y C Y
2 Y C Y Y C Y
3 Y C Y Y C Y
V4L2_PIX_FMT_UYVY V4L2_PIX_FMT_YUYV变体,在内存中排列顺序不一样。
每四字节代表两个像素,包含两个Y',一个Cb和Cr。两个Y是两个像素的数据,而Cb和Cr对于两个像素来说都是一样的。如你所见,Cr和Cb部分只有相对于Y部分的一半竖向分辨率。
例2.17 V4L2_PIX_FMT_UYVY 4 x 4像素图像
start + 0: Cb00 Y'00 Cr00 Y'01 Cb01 Y'02 Cr01 Y'03
start + 8: Cb10 Y'10 Cr10 Y'11 Cb11 Y'12 Cr11 Y'13
start +16: Cb20 Y'20 Cr20 Y'21 Cb21 Y'22 Cr21 Y'23
start +24: Cb30 Y'30 Cr30 Y'31 Cb31 Y'32 Cr31 Y'33
V4L2_PIX_FMT_UYVY V4L2_PIX_FMT_YUYV变体,在内存中排列顺序不一样。
每四字节代表两个像素,包含两个Y',一个Cb和Cr。两个Y是两个像素的数据,而Cb和Cr对于两个像素来说都是一样的。如你所见,Cr和Cb部分只有相对于Y部分的一半竖向分辨率。
例2.19 V4L2_PIX_FMT_VYUY 4 x 4像素图像
start + 0: Cr00 Y'00 Cb00 Y'01 Cr01 Y'02 Cb01 Y'03
start + 8: Cr10 Y'10 Cb10 Y'11 Cr11 Y'12 Cb11 Y'13
start +16: Cr20 Y'20 Cb20 Y'21 Cr21 Y'22 Cb21 Y'23
start +24: Cr30 Y'30 Cb30 Y'31 Cr31 Y'32 Cb31 Y'33
V4L2_PIX_FMT_Y41P 此格式有1/4横向饱和度分辨率,即YUV4:1:1
8个像素占用12字节。在此12个字节中有两队CbCr和8个Y'。第一对CbCr与前4个Y'匹配,第二对CbCr与另4个Y'匹配。Cb、Cr部分只有相对于Y部分的1/4竖向分辨率。
不要与V4L2_PIX_FMT_YUV411P混淆,Y41P是由YUV4:1:1组合衍生出来的,而YUV411P代表的是YUV4:1:1平面。
例2.20 V4L2_PIX_FMT_Y41P 8 x 4像素图像
start + 0: Cb00 Y'00 Cr00 Y'01 Cb01 Y'02 Cr01 Y'03 Y'04 Y'05 Y'06 Y'07
start +12: Cb10 Y'10 Cr10 Y'11 Cb11 Y'12 Cr11 Y'13 Y'14 Y'15 Y'16 Y'17
start +24: Cb20 Y'20 Cr20 Y'21 Cb21 Y'22 Cr21 Y'23 Y'24 Y'25 Y'26 Y'27
start +36: Cb30 Y'30 Cr30 Y'31 Cb31 Y'32 Cr31 Y'33 Y'34 Y'35 Y'36 Y'37
颜色取样位置
0 1 2 3 4 5 6 7
0 Y Y C Y Y Y Y C Y Y
1 Y Y C Y Y Y Y C Y Y
2 Y Y C Y Y Y Y C Y Y
3 Y Y C Y Y Y Y C Y Y
V4L2_PIX_FMT_YVU420, V4L2_PIX_FMT_YUV420 平面格式,有1/2的横向和竖向饱和度分辨率,即YUV4:2:0
平面格式,与组合格式恰恰相反。三个部分分别放在三个子图像或平面中,首先是Y平面,Y平面是每像素一个字节,对于V4L2_PIX_FMT_YVU420来说,在内存中Cr平面直接跟随Y平面,Cr平面有Y平面一般的宽度和高度,在2 x 2图像中每个Cr属于4个像素,Cr0属于Y'00,Y'01,Y'10和Y'11。在Cr平面后是Cb平面,像Cr平面一样。V4L2_PIX_FMT_YUV420基本一样,唯一区别是先Cb平面,后Cr平面。
如果Y平面在每行后有填充字节,那么Cr和Cb平面在他们的行后也拥有一半的填充字节。换句话说,两行Cx(包含填充)与一行Y(包含填充)一样长。
例2.21 V4L2_PIX_FMT_YVU420 4 x 4像素图像
start + 0: Y'00 Y'01 Y'02 Y'03
start + 4: Y'10 Y'11 Y'12 Y'13
start + 8: Y'20 Y'21 Y'22 Y'23
start +12: Y'30 Y'31 Y'32 Y'33
start +16: Cr00 Cr01
start +18: Cr10 Cr11
start +20: Cb00 Cb01
start +22: Cb10 Cb11
颜色取样位置
0 1 2 3
0 Y Y Y Y
C C
1 Y Y Y Y
2 Y Y Y Y
C C
3 Y Y Y Y
V4L2_PIX_FMT_YUV420M V4L2_PIX_FMT_YUV420的变体,平面存储在非连续内存中。
这是一个多平面格式,与组合格式相反。三个部分分别存入子图像或子平面中,首先是Y平面,每个像素占用一个字节。Cb数据有一半Y平面的宽高,组成了第二个平面。在2 x 2像素图像中每个Cb属于4个像素。比如,Cb0属于Y'00,Y'01,Y'10,Y'11。Cr数据和Cb平面一样,在第三个平面中。
如果Y平面每行都有填充数据,那么Cb和Cr平面在他们的行后会拥有一般的填充数据,两个Cx行和Y行一样长(包含填充数据)。
支持多平面API的驱动和应用程序可以使用V4L2_PIX_FMT_YUV420M,见“单/多平面API”。
例2.22 V4L2_PIX_FMT_YUV420M 4 x 4像素图像
start0 + 0: Y'00 Y'01 Y'02 Y'03
start0 + 4: Y'10 Y'11 Y'12 Y'13
start0 + 8: Y'20 Y'21 Y'22 Y'23
start0 +12: Y'30 Y'31 Y'32 Y'33
start1 + 0: Cb00 Cb01
start1 + 2: Cb10 Cb11
start2 + 0: Cr00 Cr01
start2 + 2: Cr10 Cr11
V4L2_PIX_FMT_YVU420M V4L2_PIX_FMT_YVU420的变体,区别是平面存储在非连续内存中。
此为多平面格式,与组合格式相反。三个部分分别存储在三个子图像或子平面中,首先是Y平面,每个像素占用一个字节。Cr数据组成了第二个平面,拥有Y平面一般的宽和高。2 x 2图片中每个Cr属于4个像素。比如,Cr0属于Y'00,Y'01,Y'10,Y'11。Cb数据和Cr一样,组成了第三个平面。
若Y平面每行后都带有填充数据,那么Cr和Cb平面在他们的每行后要有一般的填充数据,换句话说,两行Cx数据与Y行一样长(包含填充数据)。
当驱动和应用程序支持多平面API才可以使用V4L2_PIX_FMT_YVU420M格式,见“单/多平面API”。
例2.23 V4L2_PIX_FMT_YVU420M 4 x 4像素图像
start0 + 0: Y'00 Y'01 Y'02 Y'03
start0 + 4: Y'10 Y'11 Y'12 Y'13
start0 + 8: Y'20 Y'21 Y'22 Y'23
start0 +12: Y'30 Y'31 Y'32 Y'33
start1 + 0: Cr00 Cr01
start1 + 2: Cr10 Cr11
start2 + 0: Cb00 Cb01
start2 + 2: Cb10 Cb11
V4L2_PIX_FMT_YVU410,V4L2_PIX_FMT_YUV410 拥有1/4横向竖向饱和度分辨率的平面格式,即YUV4:1:0
这些是平面格式,与组合格式相反。三个部分存储在3个子图像或平面内。首先是Y平面,每个像素占用一个字节,对于V4L2_PIX_FMT_YVU410来说,Cr平面在内存中紧跟在Y平面后,Cr平面有Y平面1/4的宽度和高度。在一个4 x 4图片中每个Cr属于16个像素。在Cr平面后是Cb平面,像Cr平面一样。V4L2_PIX_FMT_YUV410除了是Cb跟在Y后,然后是Cr外与其一样。
若Y平面每行后多有填充数据,那么Cr和Cb平面在他们的行后也要后1/4的填充,换句话说,四行Cx数据与一行Y数据一样长(包含填充数据)。
例2.24 V4L2_PIX_FMT_YVU410 4 x 4像素图像
start + 0: Y'00 Y'01 Y'02 Y'03
start + 4: Y'10 Y'11 Y'12 Y'13
start + 8: Y'20 Y'21 Y'22 Y'23
start +12: Y'30 Y'31 Y'32 Y'33
start +16: Cr00
start +17: Cb00
颜色采样位置
0 1 2 3
0 Y Y Y Y
1 Y Y Y Y
C
2 Y Y Y Y
3 Y Y Y Y
V4L2_PIX_FMT_YUV422P 有一半横向饱和度分辨率的格式,即YUV4:2:2,平面布局与V4L2_PIX_FMT_YUYV相反。
这个格式通常不会使用,这YUYV格式的一个平面版本。三个部分分别存入三个子平面或子图像中。首先是Y平面,每个像素占用一个字节。Cb平面在内存中紧跟着Y平面,拥有Y平面一般的宽度,每个Cb属于两个像素。例如,Cb0属于Y'00,Y'01。在Cb平面后是Cr平面,其与Cb平面一样。
若Y平面每行后存在填充数据,那么Cr和Cb平面要在他们的行后包含一半的填充数据,即两行Cx数据与一行Y数据一样长(包含填充数据)。
例2.25 V4L2_PIX_FMT_YUV422P 4 x 4像素图像
start + 0: Y'00 Y'01 Y'02 Y'03
start + 4: Y'10 Y'11 Y'12 Y'13
start + 8: Y'20 Y'21 Y'22 Y'23
start +12: Y'30 Y'31 Y'32 Y'33
start +16: Cb00 Cb01
start +18: Cb10 Cb11
start +20: Cb20 Cb21
start +22: Cb30 Cb31
start +24: Cr00 Cr01
start +26: Cr10 Cr11
start +28: Cr20 Cr21
start +30: Cr30 Cr31
颜色取样位置
0 1 2 3
0 Y C Y Y C Y
1 Y C Y Y C Y
2 Y C Y Y C Y
3 Y C Y Y C Y
V4L2_PIX_FMT_YUV411P 拥有1/4横向饱和度分辨率的格式,即YUV4:1:1,平面布局与V4L2_PIX_FMT_Y41P相反。
此格式不常用,除了只有一般饱和度外其与4:2:2平面格式类似。三个部分分别放在子图像或子平面内。首先是Y平面,每个像素占用一个字节,然后在内存中跟随Y平面的是Cb平面,拥有Y平面1/4的宽度。每个Cb属于同一行的4个像素。例如,Cb0属于Y'00,Y'01,Y'02和Y'03。在Cb平面后是Cr平面,与Cb平面一样。
若Y平面每行后有填充数据,则Cr和Cb平面在他们的行后要有1/4的填充数据,即四行Cx数据与一行Y数据长度相同(包含填充)。
例2.26 V4L2_PIX_FMT_YUV411P 4 x 4像素图像
start + 0: Y'00 Y'01 Y'02 Y'03
start + 4: Y'10 Y'11 Y'12 Y'13
start + 8: Y'20 Y'21 Y'22 Y'23
start +12: Y'30 Y'31 Y'32 Y'33
start +16: Cb00
start +17: Cb10
start +18: Cb20
start +19: Cb30
start +20: Cr00
start +21: Cr10
start +22: Cr20
start +23: Cr30
颜色取样位置
0 1 2 3
0 Y Y C Y Y
1 Y Y C Y Y
2 Y Y C Y Y
3 Y Y C Y Y
V4L2_PIX_FMT_NV12, V4L2_PIX_FMT_NV21 拥有1/2横向、竖向饱和度分辨率的格式,即YUV4:2:0。与V4L2_PIX_FMT_YVU420不同的是,其有一个亮度、一个饱和度(交叉饱和取样)平面。
此为YUV4:2:0格式的两平面版本,三个部分分别放入两个子图像或子平面中。首先是Y平面,一个像素占用一个字节,对于V4L2_PIX_FMT_NV12来说,内存中跟随在Y平面后的是CbCr组合平面。CbCr平面有与Y平面相同的宽度(字节),但是高度是一半。每个CbCr对属于四个像素。比如,Cb0/Cr0属于Y'00,Y'01,Y'10,Y'11。V4L2_PIX_FMT_NV21除了Cb和Cr字节交换外(CrCb平面,以Cr开始)其他一样。
若Y平面每行后有填充数据,那么CbCr平面在他们的行后也要有同样数量的填充。
例2.27 V4L2_PIX_FMT_NV12 4 x 4像素图像
start + 0: Y'00 Y'01 Y'02 Y'03
start + 4: Y'10 Y'11 Y'12 Y'13
start + 8: Y'20 Y'21 Y'22 Y'23
start +12: Y'30 Y'31 Y'32 Y'33
start +16: Cb00 Cr00 Cb01 Cr01
start +20: Cb10 Cr10 Cb11 Cr11
颜色取样位置
0 1 2 3
0 Y Y Y Y
C C
1 Y Y Y Y
2 Y Y Y Y
C C
3 Y Y Y Y
V4L2_PIX_FMT_NV12M, V4L2_PIX_FMT_NV21M, V4L2_PIX_FMT_NV12MT_16X16 V4L2_PIX_FMT_NV12和V4L2_PIX_FMT_NV21的变种,平面存放在非连续内存中。
这是YUV4:2:0格式的双平面版本。三个部分分别放在两个子图像或子平面中。V4L2_PIX_FMT_NV12M与V4L2_PIX_FMT_NV12不同的是两个平面存放在不连续的内存中,如饱和度平面没有直接跟随在亮度平面后。亮度数据占据了第一个平面,Y平面每个像素占用一个字节。在第二个平面中是交叉饱和取样的饱和度数据。CbCr平面与Y平面有一样的宽度(字节),但是高度是一半(像素)。每个CbCr对属于4个像素。比如,Cb0/Cr0属于Y'00,Y'01,Y'10,Y'11。V4L2_PIX_FMT_NV12MT_16X16是V4L2_PIX_FMT_NV12M的16 x 16模块整合,这里的像素组合在16 x 16的2D平铺空间中,在内存中线性排列。V4L2_PIX_FMT_NV21M与V4L2_PIX_FMT_NV12M一样,除了Cb Cr字节交换了,在CrCb面是以Cr字节起始的。
驱动和应用程序要支持多平面API才可使用V4L2_PIX_FMT_NV12M,见“单/多平面API”。
若Y平面每行后有填充数据,那么CbCr平面在每行后也要有一样的填充。
例2.28 V4L2_PIX_FMT_NV12M 4 x 4像素图像
start0 + 0: Y'00 Y'01 Y'02 Y'03
start0 + 4: Y'10 Y'11 Y'12 Y'13
start0 + 8: Y'20 Y'21 Y'22 Y'23
start0 +12: Y'30 Y'31 Y'32 Y'33
start1 + 0: Cb00 Cr00 Cb01 Cr01
start1 + 4: Cb10 Cr10 Cb11 Cr11
V4L2_PIX_FMT_NV12MT 拥有1/2横向、竖向饱和度分辨率的格式。此格式有两个平面——一个亮度和一个饱和度,饱和度的取样的交叉的。与V4L2_PIX_FMT_NV12的区别是内存布局。像素组成64 x 32尺寸的模块,在内存中的顺序不标准。
此模式为YUV4:2:0格式的双平面版本,数据组成64 x 32大小的模块。三个部分分别放入两个子图像或子平面。Y平面每个像素占用一个字节,组成64 x 32尺寸模块。CbCr平面有与Y平面一样的宽度(字节),但是高度是其一般(像素)。饱和度平面同样组合成64 x 32尺寸模块。
缓存的宽度需要与128的倍数对齐,而高度的对齐是32。每4个相邻的缓存——2个书香和两个横向组合到一起,在内存中以Z形或反转的Z顺序排列。
子模块的内存布局如下所示:
宽度需要与128倍数对齐是因为,横向的一半不能切出Z字形。若模块竖向分辨率是奇数,那么最后一行以线性顺序排列。若饱和度则布局相同。Cb和Cr取样是交叉的,缓存高度对齐到32。
例2.28 V4L2_PIX_FMT_NV12格式像素图片在内存中的模块布局——极限情况
V4L2_PIX_FMT_NV16, V4L2_PIX_FMT_NV61 有一半横向饱和度分辨率,即YUV4:2:2。一个亮度、一个饱和度平面(交叉取样),与V4L2_PIX_FMT_YVU420相反。
是YUV4:2:2格式的双平面版本,三个部分分别放入两个子图像或子平面中,首先是Y平面,每个像素占用一个字节。对于V4L2_PIX_FMT_NV16来说,CbCr平面直接在内存中跟随在Y平面后,CbCr平面拥有与Y平面一样的宽和高(字节)。每个CbCr对属于两个像素,如Cb0/Cr0属于Y'00和Y'01。V4L2_PIX_FMT_NV61与其一样,区别是Cb与Cr字节交换,以Cr字节起始。
若Y平面有填充,则CbCr平面也要有同样的填充。
例2.30 V4L2_PIX_FMT_NV16 4 x 4像素图像
start + 0: Y'00 Y'01 Y'02 Y'03
start + 4: Y'10 Y'11 Y'12 Y'13
start + 8: Y'20 Y'21 Y'22 Y'23
start +12: Y'30 Y'31 Y'32 Y'33
start +16: Cb00 Cr00 Cb01 Cr01
start +20: Cb10 Cr10 Cb11 Cr11
start +24: Cb20 Cr20 Cb21 Cr21
start +28: Cb30 Cr30 Cb31 Cr31
颜色采样位置
0 1 2 3
0 Y Y Y Y
C C
1 Y Y Y Y
C C
2 Y Y Y Y
C C
3 Y Y Y Y
C C
V4L2_PIX_FMT_NV16M, V4L2_PIX_FMT_NV61M V4L2_PIX_FMT_NV16和V4L2_PIX_FMT_NV61的变体,存储在非连续的内存中。
是YUV4:2:2格式的双平面版本,三个部分分别放入两个子图像或子平面中。V4L2_PIX_FMT_NV16M区别与V4L2_PIX_FMT_NV16的是两个平面在内存中是不连续排列的,就是说饱和度平面不跟随着亮度平面。亮度数据组成了第一个平面,Y平面中每个像素占用一个字节。第二个平面是饱和度数据(交叉采样)。CbCr平面有着与Y平面一样的宽高(字节),每个CbCr对属于两个像素。例如,Cb0/Cr0属于Y'00,Y'01。V4L2_PIX_FMT_NV61M除了Cb和Cr字节数据交换外,其他与V4L2_PIX_FMT_NV16M一样。
驱动和应用程序支持多平面API才可以使用V4L2_PIX_FMT_NV16M和V4L2_PIX_FMT_NV61M。见“单/多平面API”。
例2.31 V4L2_PIX_FMT_NV16M 4 x 4像素图像
start0 + 0: Y'00 Y'01 Y'02 Y'03
start0 + 4: Y'10 Y'11 Y'12 Y'13
start0 + 8: Y'20 Y'21 Y'22 Y'23
start0 +12: Y'30 Y'31 Y'32 Y'33
start1 + 0: Cb00 Cr00 Cb02 Cr02
start1 + 4: Cb10 Cr10 Cb12 Cr12
start1 + 8: Cb20 Cr20 Cb22 Cr22
start1 +12: Cb30 Cr30 Cb32 Cr32
V4L2_PIX_FMT_NV24, V4L2_PIX_FMT_NV42 完整竖向横向饱和度分辨率格式,即YUV4:4:4。一个亮度和一个饱和度平面(交叉取样),这点与V4L2_PIX_FMT_YVU420相反。
是YUV4:4:4格式的双平面版本,三个部分分别放入两个子图像或子平面中。首先是Y平面,每个像素占用一个字节。对V4L2_PIX_FMT_NV24来说,CbCr平面在内存中跟随在Y平面后,CbCr平面与Y平面拥有一样的宽高(像素)。每个像素包含一对CbCr,每个Cb、Cr存储在一个字节内。V4L2_PIX_FMT_NV42只是Cb和Cr取样数据互换位置,其他一样。
若Y平面每行后有填充,则CbCr平面需要有双倍的填充数据。
例2.32 V4L2_PIX_FMT_NV24 4 x 4像素图像
start + 0: Y'00 Y'01 Y'02 Y'03
start + 4: Y'10 Y'11 Y'12 Y'13
start + 8: Y'20 Y'21 Y'22 Y'23
start +12: Y'30 Y'31 Y'32 Y'33
start +16: Cb00 Cr00 Cb01 Cr01 Cb02 Cr02 Cb03 Cr03
start +24: Cb10 Cr10 Cb11 Cr11 Cb12 Cr12 Cb13 Cr13
start +32: Cb20 Cr20 Cb21 Cr21 Cb22 Cr22 Cb23 Cr23
start +40: Cb30 Cr30 Cb31 Cr31 Cb32 Cr32 Cb33 Cr33
V4L2_PIX_FMT_M420 有1/2横向和竖向饱和度分辨率,即YUV4:2:0。交错线布局混合平面。
M420是拥有1/2横向和竖向分段取样饱和度的YUV格式。像素组合形式是交错的亮度和饱和度平面。一条饱和度数据后是两条亮度数据。
亮度平面每像素占一字节。饱和度平面包含交错的CbCr像素,他们由1/2横向竖向采样获得。每个CbCr对属于4个像素,比如,Cb0/Cr0属于Y'00,Y'01,Y'10,Y'11。
所有行长度完全一样:Y行拥有的填充字节CbCr行也要有。
例2.33 V4L2_PIX_FMT_M420 4 x 4像素图像
start + 0: Y'00 Y'01 Y'02 Y'03
start + 4: Y'10 Y'11 Y'12 Y'13
start + 8: Cb00 Cr00 Cb01 Cr01
start +16: Y'20 Y'21 Y'22 Y'23
start +20: Y'30 Y'31 Y'32 Y'33
start +24: Cb10 Cr10 Cb11 Cr11
色彩取样位置
0 1 2 3
0 Y Y Y Y
C C
1 Y Y Y Y
2 Y Y Y Y
C C
3 Y Y Y Y