扩展颜色信息

如果你对 RGB 颜色有所了解,你就会知道 (255, 255, 255) 是颜色“白色”的 8 位 RGB 三元色。 但是,此三元色定义的实际颜色是什么?

答案可能令人惊讶:如果没有一些额外的信息,此三元色没有定义任何特定的颜色! 任何 RGB 值的含义取决于颜色空间。 如果我们不知道颜色空间,则严格地说,我们不知道颜色。

颜色空间定义了应如何将给定颜色值的数值表示形式重现为物理光。 当视频在一个颜色空间中编码,但在另一个颜色空间中显示时,除非该视频经过颜色更正,否则会导致颜色扭曲。 因此,为了实现准确的颜色保真度,了解源视频的颜色空间至关重要。 以前,Windows 中的视频管道未携带有关预期颜色空间的信息。 从 Windows Vista 开始,DirectShow 和媒体基础都支持媒体类型中的扩展颜色信息。 此信息也可用于 DirectX 视频加速 (DXVA)。

以数学方式描述颜色空间的标准方法是使用国际照明委员会 (CIE) 定义的 CIE XYZ 颜色空间。 直接在视频中使用 CIE XYZ 值并不实用,但在颜色空间之间转换时,CIE XYZ 颜色空间可用作中间表示形式。

若要准确重现颜色,需要以下信息:

  • 原色。 原色定义了 CIE XYZ 三色刺激值如何表示为 RGB 分量。 实际上,原色定义了给定 RGB 值的“含义”。
  • 传输函数。 传递函数是一个将线性 RGB 值转换为非线性 R'G'B' 值的函数。 此函数也称为 gamma 校正
  • 传输矩阵。 传输矩阵定义了 R'G'B' 如何转换为 Y'PbPr。
  • 色度采样。 大多数 YUV 视频传输时的色度分量的分辨率低于亮度分量的分辨率。 色度采样由视频格式的 FOURCC 指示。 例如,YUY2 是一种 4:2:2 格式,这意味着色度样本水平采样的系数为 2。
  • 色度定位。 对色度进行采样时,色度样本相对于亮度样本的位置决定了应如何内插缺失的样本。
  • 名义范围。 名义范围定义了如何将 Y'PbPr 值缩放到 Y'CbCr。

媒体类型中的颜色空间

DirectShow、媒体基础和 DirectX 视频加速 (DXVA) 都有不同的表示视频格式的方法。 幸运的是,可轻松将颜色空间信息从一个转换为另一个,因为相关的枚举是相同的。

颜色空间转换

从一个 Y'CbCr 空间转换为另一个空间需要执行以下步骤。

  1. 逆量化:使用源名义范围将 Y'CbCr 表示形式转换为 Y'PbPr 表示形式。

  2. 上采样:通过内插色度值将采样的色度值转换为 4:4:4。

  3. YUV 到 RGB 转换:使用源传输矩阵从 Y'PbPr 转换为非线性 R'G'B'。

  4. 逆传输函数:使用传输函数的逆函数将非线性 R'G'B' 转换为线性 RGB。

  5. RGB 颜色空间转换:使用原色从源 RGB 空间转换为目标 RGB 空间。

  6. 传输函数:使用目标传输函数将线性 RGB 转换为非线性 R'G'B。

  7. RGB 到 YUV 转换:使用目标传输矩阵将 R'G'B 转换为 Y'PbPr。

  8. 下采样:通过筛选色度值将 4:4:4 转换为 4:2:2、4:2:0 或 4:1:1。

  9. 量化:使用目标名义范围将 Y'PbPr 转换为 Y'CbCr。

步骤 1-4 发生在源颜色空间中,步骤 6-9 发生在目标颜色空间中。 在实际实现中,中间步骤可以是近似步骤,相邻步骤可以组合在一起。 准确性与计算成本之间通常存在权衡。

例如,若要从 RT.601 转换为 RT.709,需要以下阶段:

  • 逆量化:Y'CbCr(601) 到 Y'PbPr(601)

  • 上采样:Y'PbPr(601)

  • YUV 到 RGB:Y'PbPr(601) 到 R'G'B'(601)

  • 逆传输函数:R'G'B'(601) 到 RGB(601)

  • RGB 颜色空间转换:RGB(601) 到 RGB(709)

  • 传输函数:RGB(709) 到 R'G'B'(709)

  • RGB 到 YUV:R'G'B'(709) 到 Y'PbPr(709)

  • 下采样:Y'PbPr(709)

  • 量化:Y'PbPr(709) 到 Y'CbCr(709)

使用扩展颜色信息

若要在整个管道中保持颜色保真度,必须在源或解码器处引入颜色空间信息,并通过管道一路传送到接收器。

视频捕获设备

大多数模拟捕获设备在捕获视频时使用定义完善的颜色空间。 捕获驱动程序应提供带有包含颜色信息的 KS_VIDEOINFOHEADER2 格式块的格式。 为实现后向兼容,驱动程序应接受不包含颜色信息的格式。 这将使驱动程序能够使用不接受扩展颜色信息的分量。

基于文件的源

分析视频文件时,媒体源(或 DirectShow 中的分析程序筛选器)可能可以提供一些颜色信息。 例如,DVD 导航器可根据 DVD 内容确定颜色空间。 其他颜色信息可能可用于解码器。 例如,MPEG-2 基本视频流在 sequence_display_extension 字段中提供颜色信息。 如果未在源中显式描述颜色信息,则它可能由内容类型隐式定义。 例如,NTSC 和 PAL 制式的 DV 视频各自使用不同的颜色空间。 最后,解码器可使用从源媒体类型获取的任何颜色信息。

其他组件

其他分量可能需要在媒体类型中使用颜色空间信息:

  • 选择转换算法时,软件颜色空间转换器应使用颜色空间信息。
  • 视频混合器(如增强的视频呈现器 (EVR) 混合器)在混合来自不同类型内容的视频流时应使用颜色信息。
  • DXVA 视频处理 API 和 DDI 使调用方能够指定颜色空间信息。 GPU 在执行硬性视频混合时,应使用此信息。

视频媒体类型

DirectX 视频加速 2.0