10 位和 16 位 YUV 视频格式
本主题介绍建议用于在 Microsoft Windows 操作系统中捕获、处理和显示视频的 10 位和 16 位 YUV 格式。
本主题包含以下各节:
概述
这些格式对亮度通道和色度 (C'b 和 C'r) 通道使用定点表示形式。 根据 SMPTE 274M 的第 7.7-7.8 和 7.11-7.12 节,样本值是缩放因子 2^ (n • 8) ,其中 n 为 10 或 16。 可以使用简单的位移来执行精度转换。 例如,如果 8 位格式的白点为 235,则相应的 10 位格式的白点为 940 (235 × 4) 。
此处所述的 16 位表示形式为每个通道使用 little-endian WORD 值。 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 代码字母 4:4:4 '4' 4:2:2 '2' 4:2:1 '1' 4:2:0 “0” FOURCC 中的最后两个字符指示每个通道的位数,“16”表示 16 位,“10”表示 10 位。
使用此方案时,已定义以下 FOURCC 代码。 目前尚未定义 10 位或 16 位 YUV 的 4:2:1 格式。
FOURCC | 说明 |
---|---|
P016 | 平面,4:2:0,16 位。 |
P010 | 平面,4:2:0,10 位。 |
P216 | 平面,4:2:2,16 位。 |
P210 | 平面,4:2:2,10 位。 |
Y216 | 打包,4:2:2,16 位。 |
Y210 | 已打包,4:2:2,10 位。 |
Y416 | 已打包,4:4:4,16 位 |
Y410 | Packed,4:4:4,10 位。 |
子类型 GUID 也从这些 FOURC 中定义;请参阅 视频子类型 GUID。
Surface 定义
本部分介绍每种格式的内存布局。 在后面的说明中,术语 WORD 是指一个 little-endian 16 位值,术语 DWORD 是指一个 little-endian 32 位值。
4:2:0 格式
定义了两种 4:2:0 格式,其中 FOURCC 代码为 P016 和 P010。 它们共享相同的内存布局,但 P016 使用每个通道 16 位,P010 使用每个通道 10 位。
P016 和 P010
在这两种格式中,所有 Y 样本首先在内存中显示为 WORD数组,行数为偶数。 图面步幅可以大于 Y 平面的宽度。 此数组后面紧跟一个 WORD数组,其中包含交错的你和 V 示例,如下图所示。
如果将组合的 U-V 数组寻址为 DWORD数组,则 LSW) (最低有效字包含 U 值,而 MSW) (最重要的单词包含 V 值。 组合的 U-V 平面的步幅等于 Y 平面的步幅。 U-V 平面的线条数是 Y 平面的一半。
这两种格式是首选的 4:2:0 平面像素格式,用于更精确的 YUV 表示形式。 它们应是支持 10 位或 16 位 4:2:0 视频的 DirectX 视频加速 (DXVA) 加速器的中期要求。
4:2:2 格式
定义了四种 4:2:2 格式,两种平面格式和两种打包格式。 它们具有以下 FOURCC 代码:
- P216
- P210
- Y216
- Y210
P216 和 P210
在这两种平面格式中,所有 Y 样本首先在内存中显示为 WORD的数组,其行数为偶数。 图面步幅可以大于 Y 平面的宽度。 此数组后面紧跟一个 WORD数组,其中包含交错的你和 V 示例,如下图所示。
如果组合的 U-V 数组作为 DWORD数组寻址,则 LSW 包含 U 值,MSW 包含 V 值。 组合的 U-V 平面的步幅等于 Y 平面的步幅。 U-V 平面的线条数与 Y 平面相同。
这两种格式是首选的 4:2:2 平面像素格式,用于更精确的 YUV 表示形式。 它们应是支持 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
此格式是包含 2 位 alpha 的打包 10 位表示形式。 每个像素都编码为单个 DWORD ,其内存布局如下图所示。
位 0-9 包含 U 样本,位 10-19 包含 Y 样本,位 20-29 包含 V 样本,位 30-31 包含 alpha 值。 若要指示像素完全不透明,应用程序必须将两个 alpha 位设置为等于 0x03。
Y416
此格式是包含 16 位 alpha 的打包的 16 位表示形式。 每个像素编码为一对 DWORD,如下图所示。
位 0-15 包含 U 样本,位 16-31 包含 Y 样本,位 32-47 包含 V 样本,位 48-63 包含 alpha 值。
若要指示像素完全不透明,应用程序必须将两个 alpha 字节设置为等于 0xFFFF。 此格式主要用于在图像处理期间用作中间格式,以避免错误累积。
首选 YUV 格式
下表列出了首选的 YUV 格式,包括 8 位格式。
格式 | 色度采样 | 已打包或平面 | 每个通道的位数 |
---|---|---|---|
AYUV | 4:4:4 | Packed | 8 |
Y410 | 4:4:4 | Packed | 10 |
Y416 | 4:4:4 | Packed | 16 |
AI44 | 4:4:4 | Packed | Palettized |
YUY2 | 4:2:2 | Packed | 8 |
Y210 | 4:2:2 | Packed | 10 |
Y216 | 4:2:2 | Packed | 16 |
P210 | 4:2:2 | 平面 | 10 |
P216 | 4:2:2 | 平面 | 16 |
NV12 | 4:2:0 | 平面 | 8 |
P010 | 4:2:0 | 平面 | 10 |
P016 | 4:2:0 | 平面 | 16 |
NV11 | 4:1:1 | 平面 | 8 |
建议如果对象支持给定的位深度和色度采样方案,则应支持此表中列出的相应 YUV 格式。 (对象可能支持此处未列出的其他格式。)
相关主题