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 位设置为零,如下图所示。

显示 10 位表示形式的示意图

由于相同 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 示例,如下图所示。

显示 p016 和 p010 像素布局的示意图

如果将组合的 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 示例,如下图所示。

显示 p216 和 p210 像素布局的示意图

如果组合的 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的数组,如下图所示。

显示 y216 和 y210 像素布局的示意图。

数组中的第一个 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 ,其内存布局如下图所示。

显示 y410 像素布局的示意图。

位 0-9 包含 U 样本,位 10-19 包含 Y 样本,位 20-29 包含 V 样本,位 30-31 包含 alpha 值。 若要指示像素完全不透明,应用程序必须将两个 alpha 位设置为等于 0x03。

Y416

此格式是包含 16 位 alpha 的打包的 16 位表示形式。 每个像素编码为一对 DWORD,如下图所示。

显示 y416 像素布局的示意图。

位 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 格式。 (对象可能支持此处未列出的其他格式。)

推荐用于视频渲染的 8 位 YUV 格式

视频子类型 GUID

视频媒体类型