3. HDR10 元数据详解:MaxFALL、MaxCLL、MDCV 与 CLLI 的生成与解析

HDR10 静态元数据是显示链路中“一次写入,全局生效”的关键参数。本章深入剖析 MaxFALL、MaxCLL、Mastering Display Color Volume (MDCV) 和 Content Light Level Information (CLLI) 四项核心元数据的生成原理、解析流程及工程落地要点。

核心认知:MDCV 描述“母版监视器的能力边界”,CLLI 描述“内容本身的光强分布”。两者结合,显示端才能准确做色调映射(Tone Mapping)与亮度裁剪(Clipping)。

3.1 元数据全景与 ST.2094 标准框架

HDR10 静态元数据遵循 SMPTE ST.2094-1 标准,通过 SEI (Supplemental Enhancement Information) 消息嵌入视频码流。下表列出四项元数据的标准来源与核心作用:

元数据名称 缩写 标准来源 核心作用
Mastering Display Color Volume MDCV SMPTE ST.2086 定义母版监视器的色域、白点与亮度范围
Content Light Level Information CLLI CTA-861.3-G 提供内容的 MaxCLL 与 MaxFALL 值
Maximum Content Light Level MaxCLL CTA-861.3-G 单帧最亮像素的亮度(cd/m²)
Maximum Frame Average Light Level MaxFALL CTA-861.3-G 全片最亮帧的平均亮度(cd/m²)
HDR10 静态元数据在视频码流中的位置 视频编码层 (VCL) — HEVC / AVC 压缩数据 SEI NAL 单元 — 携带 HDR 静态元数据 MDCV ST.2086 CLLI CTA-861.3 MaxCLL 单帧峰值 MaxFALL 帧平均峰值 显示端解析 SEI → 提取 MDCV + CLLI → 驱动色调映射决策 注:MaxCLL 与 MaxFALL 内嵌于 CLLI 结构中

3.2 Mastering Display Color Volume (MDCV) 详解

MDCV 描述母版制作时使用的监视器色彩容积,包含以下关键字段:

  • Display Primaries (显示基色):RGB 三基色在 CIE 1931 xy 色度图中的坐标,各 2 字节,共 6 组 (x, y)。
  • White Point (白点):母版监视器白点的 xy 坐标,2 组 2 字节。
  • Max Display Mastering Luminance (最大母版亮度):母版监视器可显示的最高亮度,单位 0.0001 cd/m²,4 字节无符号整数。
  • Min Display Mastering Luminance (最小母版亮度):母版监视器可显示的最低亮度,单位 0.0001 cd/m²,4 字节无符号整数。
工程注意:MDCV 中的亮度值以 0.0001 cd/m² 为单位存储。例如,最大亮度 1000 cd/m² 在码流中表示为 1000 / 0.0001 = 10,000,000 (0x989680)。解析时务必做单位换算。

典型 MDCV 值示例(DCI-P3 色域,1000 cd/m² 母版监视器):

// MDCV 原始字节 (HEX)
// Primaries: R(0.680,0.320) G(0.265,0.690) B(0.150,0.060)
// White: (0.3127,0.3290)
// MaxLum: 1000 cd/m² → 0x00989680
// MinLum: 0.005 cd/m² → 0x00000032

display_primaries[0] = 0x2B02; // Rx
display_primaries[1] = 0x1400; // Ry
display_primaries[2] = 0x1094; // Gx
display_primaries[3] = 0x2B24; // Gy
display_primaries[4] = 0x0960; // Bx
display_primaries[5] = 0x03D8; // By
white_point[0] = 0x138B;       // Wx
white_point[1] = 0x149A;       // Wy
max_luminance = 0x00989680;    // 1000 cd/m²
min_luminance = 0x00000032;    // 0.005 cd/m²

3.3 Content Light Level Information (CLLI) 详解

CLLI 结构包含两个核心亮度指标,由内容制作方在后期调色阶段计算并嵌入:

字段 字节数 单位 含义
MaxCLL 4 0.0001 cd/m² 整部影片中,单帧最亮像素的亮度值
MaxFALL 4 0.0001 cd/m² 整部影片中,所有帧平均亮度的最大值

MaxCLL 计算流程:

  1. 遍历每一帧,对帧内所有像素的亮度值(Y 分量)取最大值。
  2. 记录所有帧的最大值,取全局最大值作为 MaxCLL。

MaxFALL 计算流程:

  1. 对每一帧,计算帧内所有像素亮度的算术平均值。
  2. 遍历所有帧,取帧平均亮度的最大值作为 MaxFALL。
常见误区:MaxFALL 不是全片平均亮度,而是“最亮帧的平均亮度”。例如,一部电影大部分场景平均亮度 100 cd/m²,但有一个爆炸场景平均亮度达到 600 cd/m²,则 MaxFALL = 600 cd/m²。
MaxCLL 与 MaxFALL 计算流程对比 MaxCLL 计算:逐帧像素级扫描 Step 1: 读取帧 Y 分量数据 Step 2: 遍历像素,记录最大值 Step 3: 跨帧比较,取全局最大值 MaxFALL 计算:逐帧平均后取峰值 Step 1: 计算每帧 Y 分量平均值 Step 2: 存储每帧平均亮度值 Step 3: 取所有帧平均值的最大值 MaxCLL 反映极端高光点;MaxFALL 反映场景整体亮度冲击力 两者结合决定显示端是否需要做亮度压缩

3.4 元数据解析的嵌入式实现要点

在嵌入式显示系统中,解析 HDR10 元数据需要关注以下关键环节:

  • SEI 消息过滤:在解码器输出侧,根据 nal_unit_type 识别 SEI NAL 单元,再根据 payloadType 区分 MDCV (payloadType=137) 和 CLLI (payloadType=144)。
  • 字节序处理:MDCV 和 CLLI 均采用大端字节序 (Big-Endian)。ARM 平台需做字节序转换。
  • 亮度单位换算:解析出的原始值乘以 0.0001 得到 cd/m² 真实值。浮点运算在嵌入式平台建议使用定点数或查表法加速。
  • 元数据缓存与更新:静态元数据在序列开始时解析一次,但部分编码器可能在 IDR 帧重复发送,需做去重处理。
代码示例:C 语言解析 CLLI 元数据
typedef struct {
    uint32_t max_content_light_level;   // MaxCLL, 单位 0.0001 cd/m²
    uint32_t max_frame_average_light_level; // MaxFALL, 单位 0.0001 cd/m²
} CLLI_metadata;

int parse_clli_sei(const uint8_t *payload, uint32_t payload_size, CLLI_metadata *out) {
    if (payload_size < 8) return -1; // 至少 8 字节

    // 大端转主机字节序
    out->max_content_light_level = (payload[0] << 24) | (payload[1] << 16) |
                                   (payload[2] << 8)  | payload[3];
    out->max_frame_average_light_level = (payload[4] << 24) | (payload[5] << 16) |
                                          (payload[6] << 8)  | payload[7];

    // 转换为 cd/m² (可选,保留原始值给硬件模块)
    // float maxcll_cdm2 = out->max_content_light_level * 0.0001f;
    // float maxfall_cdm2 = out->max_frame_average_light_level * 0.0001f;

    return 0;
}

3.5 元数据在显示链路中的传递路径

从解码到显示,HDR10 元数据经历以下传递阶段:

阶段 组件 操作 输出格式
1. 码流解析 视频解码器 提取 SEI NAL,分离 MDCV / CLLI 原始字节数组
2. 元数据解析 HDR 元数据解析器 字节序转换、单位换算、有效性校验 结构化元数据 (struct)
3. 显示驱动 显示控制器 / GPU 将元数据写入显示接口 (如 HDMI InfoFrame) HDMI Dynamic Range & Mastering InfoFrame
4. 面板渲染 显示面板 SoC 根据元数据调整背光、伽马、色域映射 最终像素输出
HDR10 元数据在显示链路中的传递路径 视频解码器 SEI 提取 元数据解析器 字节序/校验 显示控制器 HDMI InfoFrame 面板 SoC 色调映射 关键约束:元数据必须在 VSync 边界前送达显示控制器,否则导致帧延迟 嵌入式优化:使用 DMA 直接搬运元数据到显示寄存器,避免 CPU 轮询 MaxCLL / MaxFALL 用于决定 Tone Mapping 曲线斜率 MDCV 用于色域映射 (Gamut Mapping) 和白点校正

3.6 常见问题与避坑指南

问题 1:MaxCLL 值异常偏高
原因:部分制作工具将 MaxCLL 错误地设置为母版监视器最大亮度,而非内容实际峰值。解析侧应做合理性校验,例如 MaxCLL 不应超过 MDCV 中 max_luminance 的 1.2 倍。
问题 2:MaxFALL 为 0
原因:编码器未正确填充 CLLI 结构,或后期元数据注入工具遗漏。嵌入式系统应准备默认回退值(如 MaxFALL = 200 cd/m²),避免显示异常。
调试技巧:在嵌入式开发板上,通过 HDMI 分析仪抓取 InfoFrame 数据,比对解析出的 MDCV / CLLI 值与码流原始值是否一致。常见错误是字节序反转或单位换算系数错误。

本章详细拆解了 HDR10 四项核心元数据的语义、生成算法、解析代码与传递路径。掌握这些内容后,开发者能够准确地在嵌入式显示链路中提取、校验并应用静态元数据,为后续的色调映射与色域管理打下坚实基础。