4、Dolby Vision 元数据详解:RPU、L1/L2/L3 与 Trim Passes

Dolby Vision 是当前消费电子与专业影院中应用最广的 动态 HDR 标准之一。其核心在于 RPU(Reference Processing Unit)——一个携带在视频流 SEI 中的元数据容器,承载了从内容创作到显示设备的所有色调映射与颜色转换指令。本章深入拆解 RPU 的结构、L1/L2/L3 三级元数据、Trim Passes 以及 Color Mapping Matrix(CMM)的作用与解析方法。

关键概念:RPU 不是视频编码数据,而是指导显示设备如何将 12-bit 母版映射到目标设备色域与亮度范围的“配方”。嵌入式系统需在解码后、显示前解析 RPU,并据此配置硬件 LUT 或 3D LUT。

4.1 RPU(Reference Processing Unit)结构总览

RPU 是 Dolby Vision 元数据的载体,通常以 NAL 单元形式嵌入在 HEVC 或 AV1 视频流中。其内部结构采用 TLV(Type-Length-Value) 格式,便于解析器逐段读取。一个典型的 RPU 包含以下主要字段:

字段长度(bits)说明
rpu_type8标识 RPU 类型(0 = 全帧,1 = 增量帧)
vdr_rpu_profile8Profile 版本(如 Profile 5/8.1/8.4)
vdr_rpu_level8Level 等级(决定最大亮度与色域)
num_ext_blocks8扩展块数量(用于厂商自定义数据)
ext_blocks[]可变扩展块列表(包含 L1/L2/L3 元数据)
rpu_data_mapping可变颜色映射矩阵(CMM)参数
trim_pass_metadata可变Trim Passes 参数(用于 SDR 或低亮度映射)
解析要点:嵌入式实现中,RPU 解析器应首先校验 rpu_type 和 vdr_rpu_profile,跳过不支持的 Profile。Profile 5 使用 ICtCp 颜色空间,Profile 8.1 使用 YCbCr,两者 CMM 解析逻辑不同。
RPU 元数据容器结构 RPU NAL Unit RPU Header rpu_type / profile / level L1 Metadata 亮度/色域边界 L2 Metadata 色调映射曲线 L3 Metadata Trim Pass CMM (Color Mapping Matrix) 颜色空间转换系数 Extension Blocks 厂商自定义 / 未来扩展 RPU 解析顺序:Header → L1 → L2 → CMM → L3 (Trim Pass) → Extension

4.2 L1 元数据:全局亮度与色域边界

L1 元数据定义了内容的 全局统计特征,用于显示设备判断当前场景的亮度与色域范围。主要参数包括:

  • Luminance Parameters:
    • max_content_light_level (MaxCLL):整部影片的最大像素亮度(cd/m²)
    • max_frame_average_light_level (MaxFALL):整部影片的帧平均亮度上限
    • min_pq / max_pq:当前场景在 PQ 曲线上的最小/最大亮度编码值
  • Color Primaries:
    • 母版色域边界(如 DCI-P3 或 BT.2020)
    • 白点坐标(通常为 D65)
嵌入式陷阱:部分显示 SoC 的硬件 HDR 引擎只支持固定 MaxCLL(如 1000 cd/m²)。若 RPU 中 MaxCLL 超过硬件能力,必须在 L2 映射阶段做 亮度压缩,否则会导致高光裁切。
L1 元数据:亮度与色域边界 亮度范围 (PQ 编码) min_pq max_pq DCI-P3 BT.2020 MaxCLL / MaxFALL 用于设备能力匹配

4.3 L2 元数据:色调映射曲线(Tone Mapping)

L2 元数据定义了从母版亮度到目标显示亮度的 映射曲线。这是 RPU 中最复杂的部分,包含多个分段曲线参数:

参数说明典型值范围
tone_mapping_curve_num曲线段数量(通常 1~3 段)1 ~ 3
targeted_system_display_maximum_luminance目标显示设备最大亮度(cd/m²)100 ~ 10000
base_curve_anchor基础曲线锚点(亮度拐点)0.0 ~ 1.0
base_curve_offset曲线偏移量(调整暗部/亮部)-0.5 ~ 0.5
base_curve_power曲线幂次(控制对比度)0.5 ~ 2.0

L2 映射的核心公式(简化):

// 伪代码:L2 色调映射
float map_luminance(float L_in, L2_Metadata *l2) {
    float L_norm = (L_in - l2->min_pq) / (l2->max_pq - l2->min_pq);
    float L_mapped = pow(L_norm, l2->base_curve_power);
    L_mapped = L_mapped * (1.0 - l2->base_curve_offset) + l2->base_curve_offset;
    return L_mapped * l2->targeted_system_display_maximum_luminance;
}
优化建议:嵌入式实现中,L2 曲线可预计算为 1024 点 LUT,避免每像素实时 pow() 运算。LUT 精度建议 16-bit,防止 8-bit 量化引入条带。
L2 色调映射曲线示意 输入亮度 (PQ 归一化) 输出亮度 锚点 (base_curve_anchor) 线性映射 (无调整) 曲线形状由 base_curve_power 和 base_curve_offset 控制

4.4 L3 元数据与 Trim Passes:场景级微调

L3 元数据(Trim Passes)是 Dolby Vision 实现 场景级精确映射 的关键。它允许内容创作者针对不同显示亮度等级(如 100 cd/m² SDR、600 cd/m² HDR、1000 cd/m² HDR)分别指定微调参数。每个 Trim Pass 包含:

  • target_display_index: 目标显示亮度等级(0 = SDR, 1 = 600 cd/m², 2 = 1000 cd/m², 3 = 2000 cd/m², 4 = 4000 cd/m²)
  • trim_slope: 斜率调整(对比度微调)
  • trim_offset: 偏移调整(亮度偏移)
  • trim_power: 幂次调整(伽马微调)
  • trim_chroma_weight: 色度权重(饱和度微调)
  • trim_saturation_gain: 饱和度增益
实际应用:在嵌入式播放器中,Trim Passes 通常用于 SDR 兼容输出。当检测到显示设备仅支持 SDR 时,解析器选择 target_display_index=0 的 Trim Pass,将 HDR 内容映射为 SDR 画面,同时保留创作者的色彩意图。
Trim Passes 选择流程 读取 RPU L3 元数据 设备亮度? Trim Pass index=0 (SDR) Trim Pass index=1~4 (HDR) 应用 trim_slope/offset/power 应用 trim_slope/offset/power

4.5 Color Mapping Matrix (CMM):颜色空间转换

CMM 是 RPU 中负责 颜色空间转换 的矩阵集合。Dolby Vision 母版通常使用 ICtCp 颜色空间(Profile 5)或 YCbCr(Profile 8.1),而显示设备需要输出到 RGB 或 YCbCr。CMM 定义了:

  • 从 ICtCp 到 RGB 的 3x3 矩阵(含色域映射)
  • 从 YCbCr 到 RGB 的 3x3 矩阵(含色域映射)
  • 色域缩放系数(将母版色域映射到目标色域)
  • 交叉色项系数(用于色域外颜色修正)

CMM 矩阵格式示例(ICtCp → RGB):

// CMM 3x3 矩阵 (定点数, Q16 格式)
int32_t cmm[3][3] = {
    { 0x1A2B, 0x3C4D, 0x5E6F },  // R = a*I + b*Ct + c*Cp
    { 0x7F80, 0x9A1B, 0xC2D3 },  // G = d*I + e*Ct + f*Cp
    { 0xE4F5, 0x0607, 0x0809 }   // B = g*I + h*Ct + i*Cp
};
精度关键:CMM 系数通常以 Q16 定点数 存储(16 位整数 + 16 位小数)。嵌入式实现中,建议使用 32-bit 整数乘法 + 右移 16 位,避免浮点运算带来的性能开销。若 SoC 支持 NEON/SIMD,可一次处理 4 个像素。
CMM 颜色空间转换流程 ICtCp / YCbCr CMM 3x3 矩阵 RGB (目标色域) CMM 矩阵系数从 RPU ext_blocks 中解析 Profile 5 使用 ICtCp → RGB 矩阵 Profile 8.1 使用 YCbCr → RGB 矩阵

4.6 嵌入式解析优化要点

在嵌入式显示子系统中,RPU 解析与 CMM 应用需注意以下优化策略:

优化项方法收益
RPU 缓存缓存最近 10 帧的 RPU 元数据,避免重复解析减少 CPU 负载 30%
L2 LUT 预计算将 L2 曲线预计算为 1024 点 16-bit LUT消除实时 pow() 运算
CMM 定点化使用 Q16 定点矩阵乘法,避免浮点提升 2~3 倍性能
Trim Pass 选择根据 EDID 读取设备亮度,提前选择 Trim Pass减少运行时判断
增量 RPU 处理仅处理 rpu_type=1 的增量帧,跳过全帧降低带宽占用
调试建议:在开发阶段,将 RPU 元数据打印到日志中,验证 L1/L2/L3 参数是否与母版一致。常见问题包括:MaxCLL 为 0(表示未设置)、CMM 矩阵为单位矩阵(表示未做色域映射)、Trim Pass 索引越界。