3、HDR 元数据详解
HDR 元数据是连接内容制作与显示设备的“色彩与亮度地图”。没有元数据,显示器无法知道视频内容的最大亮度、色域范围或场景切换时的亮度变化。本章深入解析静态元数据(SMPTE ST 2086)与动态元数据(HDR10+、Dolby Vision)的核心参数,以及 MaxFALL 和 MaxCLL 的计算意义。
3.1 静态元数据:SMPTE ST 2086
SMPTE ST 2086 是 HDR10 标准强制携带的静态元数据,它描述整部影片的亮度与色域极限。显示器在播放前读取一次,之后不再改变。
| 参数 | 缩写 | 说明 | 典型值 |
|---|---|---|---|
| 显示主色度 | Display Primaries | 红、绿、蓝三基色在 CIE 1931 色度图中的坐标 | BT.2020 或 P3-D65 |
| 显示白点 | White Point | 参考白点的色度坐标 | D65 (0.3127, 0.3290) |
| 最大亮度 | MaxLum | 内容母版显示器的峰值亮度(cd/m²) | 1000 / 4000 |
| 最小亮度 | MinLum | 内容母版显示器的黑电平(cd/m²) | 0.0050 / 0.0001 |
| 最大内容光输出 | MaxCLL | 整部影片中单个像素的最大亮度 | 1000 / 4000 |
| 最大帧平均光输出 | MaxFALL | 整部影片中单帧平均亮度的最大值 | 400 / 800 |
驱动开发提示: 驱动解析 SMPTE ST 2086 时,需将 MaxLum 和 MinLum 映射到显示设备的 PQ 或 HLG 电光转换函数(EOTF)中。如果显示设备峰值亮度低于 MaxLum,驱动应触发色调映射(Tone Mapping)算法。
3.2 动态元数据:HDR10+ 与 Dolby Vision
动态元数据允许亮度与色域信息逐场景甚至逐帧更新,避免静态元数据“一刀切”导致的暗部细节丢失或高光过曝。
3.2.1 HDR10+(SMPTE ST 2094-40)
HDR10+ 基于 Samsung 主导的开放标准,在 HDR10 基础上增加每场景的动态元数据。核心参数包括:
- 场景裁剪点(Scene Trim Pass): 定义场景的最大亮度、最小亮度与平均亮度。
- 饱和度调整(Saturation Adjustment): 针对高亮度区域进行色饱和度微调。
- 色调映射曲线(Tone Mapping Curve): 提供一组 Bezier 曲线控制点,驱动可据此重建映射曲线。
// HDR10+ 动态元数据 SEI 消息结构(简化)
struct HDR10PlusMetadata {
uint8_t country_code;
uint16_t terminal_provider_code;
uint16_t terminal_model_code;
uint8_t application_version;
uint8_t num_windows; // 通常为 1
Window windows[1];
};
struct Window {
uint8_t window_upper_left_corner_x;
uint8_t window_upper_left_corner_y;
uint8_t window_lower_right_corner_x;
uint8_t window_lower_right_corner_y;
uint16_t max_content_light_level; // 场景 MaxCLL
uint16_t max_frame_average_light_level; // 场景 MaxFALL
uint8_t num_bezier_curve_anchors; // 最多 15 个锚点
uint16_t bezier_curve_anchors[15];
};
3.2.2 Dolby Vision(SMPTE ST 2094-10 / 2094-20)
Dolby Vision 采用双层编码(BL+EL+RPU)或单层编码(BL+RPU),其动态元数据通过 RPU(Reference Processing Unit)携带。关键参数包括:
- L1 元数据: 每帧的 MinLum、MaxLum、AverageLum。
- L2 元数据: 每帧的色域映射矩阵(3x3 或 3x4 矩阵)。
- L3 元数据: 每帧的直方图分布,用于驱动自适应色调映射。
- L5 元数据: 非线性映射曲线(NLQ 参数)。
驱动实现差异: HDR10+ 元数据通过 HEVC SEI 消息传递,驱动需在解码器回调中解析;Dolby Vision RPU 则作为独立 NAL 单元,驱动需在显示管线中插入 RPU 处理引擎。
3.3 MaxFALL 与 MaxCLL 详解
MaxFALL(Maximum Frame Average Light Level)和 MaxCLL(Maximum Content Light Level)是静态元数据中最容易被驱动工程师忽略但影响显示效果的关键指标。
| 指标 | 计算方式 | 物理意义 | 驱动用途 |
|---|---|---|---|
| MaxCLL | 遍历所有帧的所有像素,取亮度最大值 | 内容中“最亮的一个点”的亮度 | 决定显示设备是否需要削波(Clipping)或滚降(Roll-off) |
| MaxFALL | 计算每帧的平均亮度,再取所有帧平均亮度的最大值 | 内容中“最亮的一帧”的整体亮度水平 | 决定显示设备的背光功率控制与散热策略 |
常见误区: MaxCLL 高不代表整部影片都亮。例如一个 10000 cd/m² 的闪光灯镜头,MaxCLL=10000,但 MaxFALL 可能只有 200 cd/m²。驱动如果仅根据 MaxCLL 做全局色调映射,会导致大部分场景偏暗。正确做法是结合 MaxFALL 与动态元数据做逐帧调整。
3.4 元数据解析与验证流程
驱动开发中,元数据的解析与验证通常分为以下步骤:
- SEI/RPU 提取: 从视频解码器输出中提取 HDR10+ SEI 或 Dolby Vision RPU NAL 单元。
- 元数据校验: 检查 CRC、版本号、窗口坐标是否合法。
- 亮度映射: 将 MaxLum / MinLum / MaxCLL / MaxFALL 转换为显示设备的 PQ 代码值。
- 色调曲线生成: 根据 Bezier 锚点(HDR10+)或 L1/L2 矩阵(Dolby Vision)生成逐帧映射 LUT。
- 效果验证: 使用测试图案(如彩条、渐变、闪烁高光)验证映射结果是否准确。
3.5 元数据冲突处理策略
实际驱动开发中,可能遇到多种元数据同时存在或相互矛盾的情况。下表列出常见冲突场景及推荐处理策略:
| 冲突场景 | 原因 | 驱动处理策略 |
|---|---|---|
| 静态 MaxCLL 低于动态场景 MaxCLL | 母版制作时静态元数据未更新 | 优先使用动态元数据,静态值作为回退 |
| HDR10+ 与 Dolby Vision 同时存在 | 封装错误或双格式兼容 | 根据播放器配置选择主格式,忽略另一格式 |
| MaxFALL 为 0 | 元数据缺失或损坏 | 驱动自动计算前 10 帧平均亮度作为替代值 |
| MinLum 低于显示设备黑电平 | 内容要求极高对比度 | 钳位到显示设备最小亮度,避免黑色浮起 |
验证工具推荐: 使用
hdr10plus_tool(开源)解析 HDR10+ SEI 消息,使用 Dolby 官方 RPU Parser 验证 Dolby Vision 元数据。驱动开发阶段建议配合 libdrm 的 HDR_OUTPUT_METADATA 接口直接注入元数据测试。