Perface
本主题介绍操作系统中捕获、处理和显示视频的 10 位和 16 位 YUV 格式。
概述
这些格式对亮度通道和色度(C’b 和 C’r)通道使用定点表示。样本值是缩放的 8 位值,使用缩放因子 2^(n − 8),其中 n 为 10 或 16,根据 SMPTE 274M 第 7.7-7.8 和 7.11-7.12 节。可以使用简单的位移位来执行精确转换。例如,如果 8 位格式的白点为 235,则相应的 10 位格式的白点为 940 (235 × 4)。
此处描述的 16 位表示对每个通道使用小端字节值。10 位格式还为每个通道使用 16 位,最低 6 位设置为零,如下图所示。
由于相同 YUV 格式的 10 位和 16 位表示具有相同的内存布局,因此可以将 10 位表示转换为 16 位表示,而不会损失精度。还可以将 16 位表示转换为 10 位表示。(但是,Y416 和 Y410 格式是此一般规则的例外,因为它们不共享相同的内存布局。)
当图形硬件读取包含 10 位表示的表面时,它应该忽略每个通道的低位 6 位。然而,如果表面包含有效的 16 位数据,则应将其识别为 16 位表面。
在包含 Alpha 的格式中,完全透明的像素的 Alpha 值为零,完全不透明的像素的 Alpha 值为 (2^n) – 1,其中 n 是 Alpha 位的数量。假设 Alpha 是一个线性值,在将组件转换为其归一化线性形式后,将其应用于每个组件。
对于视频内存中的图像,图形驱动程序选择表面的内存对齐方式。表面必须是DWORD对齐的。也就是说,表面内的各个行保证从 32 位边界开始,尽管对齐可以大于 32 位。原点 (0,0) 始终是曲面的左上角。
就本文而言,术语U相当于Cb,术语V相当于Cr。
10 位和 16 位 YUV 的 FOURCC 代码
此处描述的格式的 FOURCC 代码使用以下约定:
- 如果格式是平面的,则 FOURCC 代码中的第一个字符是“P”。如果格式是打包的,则第一个字符是“Y”。
- FOURCC码中的第二个字符由色度采样确定,如下表所示。
- FOURCC 中的最后两个字符表示每个通道的位数,“16”表示 16 位,“10”表示 10 位。
使用该方案,定义了以下 FOURCC 代码。目前尚未定义 10 位或 16 位 YUV 的 4:2:1 格式。
Surface定义
本节介绍每种格式的内存布局。在下面的描述中,术语WORD指的是小端 16 位值,术语DWORD指的是小端 32 位值。
4:2:0 格式
定义了两种 4:2:0 格式,FOURCC 代码为 P016 和 P010。它们共享相同的内存布局,但 P016 每通道使用 16 位,P010 每通道使用 10 位。
P016 和 P010
在这两种格式中,所有 Y 样本首先作为偶数行的WORD数组出现在内存中。表面步幅可以大于Y平面的宽度。该数组后面紧跟着一个WORD数组,其中包含交错的 U 和 V 样本,如下图所示。
如果组合的 UV 数组作为DWORD数组进行寻址,则最低有效字 (LSW) 包含 U 值,最高有效字 (MSW) 包含 V 值。组合 UV 平面的步幅等于 Y 平面的步幅。UV 平面的线数是 Y 平面的一半。
这两种格式是更高精度 YUV 表示的首选 4:2:0 平面像素格式。它们预计将成为支持 10 位或 16 位 4:2:0 视频的 DirectX 视频加速 (DXVA) 加速器的中期要求。
4:2:2 格式
定义了四种 4:2:2 格式,两种是平面格式,两种是压缩格式。他们有以下 FOURCC 代码:
- P216
- P210
- Y216
- Y210
P216 和 P210
在这两种平面格式中,所有 Y 样本首先作为偶数行的WORD数组出现在内存中。表面步幅可以大于Y平面的宽度。该数组后面紧跟着一个WORD数组,其中包含交错的 U 和 V 样本,如下图所示。
如果组合的 UV 数组作为DWORD数组进行寻址,则 LSW 包含 U 值,MSW 包含 V 值。组合 UV 平面的步幅等于 Y 平面的步幅。UV 平面与 Y 平面具有相同数量的线。
这两种格式是更高精度 YUV 表示的首选 4:2:2 平面像素格式。它们预计将成为支持 10 位或 16 位 4:2:2 视频的 DirectX 视频加速 (DXVA) 加速器的中期要求。
Y216 和 Y210
在这两种打包格式中,每对像素都存储为四个WORD的数组,如下图所示。
数组中的第一个WORD包含该对中的第一个 Y 样本,第二个WORD包含 U 样本,第三个WORD包含第二个 Y 样本,第四个WORD包含 V 样本。
Y210 与 Y216 相同,只是每个样本仅包含 10 位有效数据。如前所述,最低有效 6 位设置为零。
4:4:4 格式
定义了两种 4:4:4 格式,FOURCC 代码为 Y410 和 Y416。两者都是打包格式。
Y410
此格式是打包的 10 位表示形式,其中包括 2 位 alpha。每个像素都编码为单个DWORD,其内存布局如下图所示。
位 0-9 包含 U 样本,位 10-19 包含 Y 样本,位 20-29 包含 V 样本,位 30-31 包含 alpha 值。要指示像素完全不透明,应用程序必须将两个 alpha 位设置为等于 0x03。
Y416
此格式是打包的 16 位表示形式,其中包括 16 位 alpha。每个像素都编码为一对DWORD,如下图所示。
位 0-15 包含 U 样本,位 16-31 包含 Y 样本,位 32-47 包含 V 样本,位 48-63 包含 alpha 值。
要指示像素完全不透明,应用程序必须将两个 alpha 字节设置为等于 0xFFFF。该格式主要用作图像处理期间的中间格式,以避免错误累积。
首选 YUV 格式
下表列出了首选的 YUV 格式,包括 8 位格式。
建议如果对象支持给定的位深度和色度采样方案,则它应该支持此表中列出的相应 YUV 格式。(对象可能支持此处未列出的其他格式。)