扩展颜色信息
如果你对 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) 都有不同的表示视频格式的方法。 幸运的是,可轻松将颜色空间信息从一个转换为另一个,因为相关的枚举是相同的。
DXVA 1.0:DXVA_ExtendedFormat 结构中提供了颜色空间信息。
DXVA 2.0:DXVA2_ExtendedFormat 结构中提供了颜色空间信息。 此结构与 DXVA 1.0 结构相同,字段的含义也相同。
DirectShow:VIDEOINFOHEADER2 结构中提供了颜色空间信息。 信息存储在 dwControlFlags 字段的高 24 位中。 如果存在颜色空间信息,请在 dwControlFlags 中设置 AMCONTROL_COLORINFO_PRESENT 标志。 设置此标志时,dwControlFlags 字段应解释为DXVA_ExtendedFormat 结构,但结构的低 8 位保留用于 AMCONTROL_xxx 标志。
视频捕获驱动程序:KS_VIDEOINFOHEADER2 结构中提供了颜色空间信息。 此结构与 VIDEOINFOHEADER2 结构相同,字段的含义也相同。
媒体基础:颜色空间信息作为特性存储在媒体类型中:
颜色信息 属性 原色 MF_MT_VIDEO_PRIMARIES 传输函数 MF_MT_TRANSFER_FUNCTION 传输矩阵 MF_MT_YUV_MATRIX 色度子采样 MF_MT_SUBTYPE
(由 FOURCC 给定,存储在子类型 GUID 的第一个 DWORD 中。)色度定位 MF_MT_VIDEO_CHROMA_SITING 名义范围 MF_MT_VIDEO_NOMINAL_RANGE
颜色空间转换
从一个 Y'CbCr 空间转换为另一个空间需要执行以下步骤。
逆量化:使用源名义范围将 Y'CbCr 表示形式转换为 Y'PbPr 表示形式。
上采样:通过内插色度值将采样的色度值转换为 4:4:4。
YUV 到 RGB 转换:使用源传输矩阵从 Y'PbPr 转换为非线性 R'G'B'。
逆传输函数:使用传输函数的逆函数将非线性 R'G'B' 转换为线性 RGB。
RGB 颜色空间转换:使用原色从源 RGB 空间转换为目标 RGB 空间。
传输函数:使用目标传输函数将线性 RGB 转换为非线性 R'G'B。
RGB 到 YUV 转换:使用目标传输矩阵将 R'G'B 转换为 Y'PbPr。
下采样:通过筛选色度值将 4:4:4 转换为 4:2:2、4:2:0 或 4:1:1。
量化:使用目标名义范围将 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 在执行硬性视频混合时,应使用此信息。
相关主题