扩展颜色信息

如果你知道有关 RGB 颜色的任何信息,你知道(255、255、255)是颜色 白色的 8 位 RGB 三重。 但是,这三重体定义的实际 颜色 是什么?

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

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

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

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

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

媒体类型中的颜色空间

DirectShow、Media Foundation 和 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字段中的颜色信息。 如果未在源中显式描述颜色信息,则可能由内容类型隐式定义。 例如,DV 视频的 NTSC 和 PAL 品种分别使用不同的颜色空间。 最后,解码器可以使用从源媒体类型获取的任何颜色信息。

其他组件

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

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

视频媒体类型

DirectX 视频加速 2.0