杜比视界(Dolby Vision)技术知识文档 # 杜比视界Dolby Vision技术知识文档## 1. 整体架构### 1.1 RPU 结构杜比视界的元数据核心是 RPUReference Processing Unit包含四个主要结构体DoviRpu├── RpuDataHeader → 信号规格说明书├── RpuDataMapping → BL→VDR 的数学变换│ └── RpuDataNlq → EL残差的量化解码参数└── VdrDmData → VDR→显示器的创意显示映射### 1.2 信号流向HEVC码流↓BL解码 → 10bit HDR10 PQ信号↓ RpuDataMappingPolynomial/MMR曲线VDR中间信号12bit更高精度↓ RpuDataNlqEL残差补偿FEL有效/MEL为零↓ VdrDmData针对目标显示器的色调映射目标显示器最终输出---## 2. 各结构体详解### 2.1 RpuDataHeader — 信号描述符回答这帧数据的基本属性是什么。关键字段| 字段 | 含义 ||------|------|| vdr_rpu_profile | Profile 编号0P5, 1P7/P8|| bl_bit_depth_minus8 | BL位深固定10bit值2|| el_bit_depth_minus8 | EL位深固定10bit值2|| vdr_bit_depth_minus8 | VDR中间信号位深通常12bit值4|| el_spatial_resampling_filter_flag | EL是否需要空间上采样 || disable_residual_flag | 是否禁用残差信号 || coefficient_log2_denom | 定点数精度影响所有系数解码 |**Profile 识别逻辑**rustfn get_dovi_profile(self) - u8 {if el_spatial_resampling_filter_flag !disable_residual_flag {7 // FEL 或 MEL} else {8 // Profile 8.x没有EL}}### 2.2 RpuDataMapping — BL到VDR的映射曲线回答10bit BL 信号如何映射成 12bit VDR 中间信号。**映射曲线本质** 把 BL 的编码值非线性变换到 VDR 编码空间的分段函数。BL编码值10bit, 0~1023→ VDR编码值12bit, 0~4095暗部BL100 → VDR380 拉伸保留暗部细节中部BL500 → VDR1800 接近线性高光BL900 → VDR3600 压缩防止高光过曝**两种算法**- **Polynomial多项式** — Y亮度分量每段VDR a0 a1×BL a2×BL²pivots 定义分段端点如 [0, 300, 700, 1023]- **MMR多变量回归** — Cb/Cr色度分量VDR_cb C c0×Y c1×Cb c2×Cr c3×Y² c4×Cb² c5×Cr² c6×Y×Cb色度依赖亮度必须用多变量公式**NLQ 控制参数RpuDataMapping 子字段**| 字段 | 含义 ||------|------|| nlq_method_idc | NLQ量化方法当前唯一值LinearDeadzone || nlq_num_pivots_minus2 | NLQ分段数-2固定01段|| nlq_pred_pivot_value | 量化区间端点BL 10bit → [0, 1023] |### 2.3 RpuDataNlq — EL残差量化参数**NLQ Non-Linear Quantization非线性量化**用带死区的线性量化压缩 EL 残差信号。**LinearDeadzone 量化模型**残差 r VDR真实值 - Mapping(BL)编码if |r| threshold: q 0死区忽略else: q slope × (|r| - threshold)解码if q 0: r 0else: r q / slope threshold**7个字段每个 Y/Cb/Cr 分量各一组**| 字段 | 含义 | FEL典型值 | MEL值 ||------|------|-----------|-------|| nlq_offset | 残差编码基准偏置 | [64,32,32] | [0,0,0] || vdr_in_max_int | 动态范围上限整数部分 | [940,960,960] | [1,1,1] || vdr_in_max | 动态范围上限小数部分 | 真实值 | [0,0,0] || linear_deadzone_slope_int | 死区外斜率整数部分 | [2,1,1] | [0,0,0] || linear_deadzone_slope | 死区外斜率小数部分 | 真实值 | [0,0,0] || linear_deadzone_threshold_int | 死区宽度整数部分 | [16,8,8] | [0,0,0] || linear_deadzone_threshold | 死区宽度小数部分 | 真实值 | [0,0,0] |**死区Dead Zone** 量化器在 [-threshold, threshold] 范围内输出恒为 0过滤人眼不敏感的微小残差节省码率。**斜率Slope** 死区外残差的放大倍数slope 越大精度越高EL 码率也越高。slope0 时输出恒为 0。### 2.4 VdrDmData — 显示管理元数据**VDR Variable Dynamic Range可变动态范围****DM Display Management显示管理**VDR 是杜比内部的 12bit 高精度中间格式VdrDmData 告诉解码器如何把 VDR 信号适配到具体显示器。**基础字段**| 字段 | 含义 ||------|------|| ycc_to_rgb_coef0~8 | YCbCr→RGB 3×3矩阵系数定点数除以2^13|| rgb_to_lms_coef0~8 | RGB→LMS 色觉空间矩阵 || signal_eotf | EOTF类型65535PQ || signal_bit_depth | 信号位深通常12 || signal_color_space | 0BT.2020, 1P3, 2BT.709 || source_min_pq | 母版显示最小亮度PQ值 || source_max_pq | 母版显示最大亮度PQ值 || source_diagonal | 母版显示屏尺寸英寸|**常见亮度对应PQ值**MDL 1000nit, min 1nit → source_min_pq7, source_max_pq3079MDL 4000nit, min 50nit → source_min_pq62, source_max_pq3696MDL 10000nit → source_max_pq4095---## 3. Level 扩展元数据块### 3.1 CM v2.9 支持的 Level1, 2, 4, 5, 6, 255#### Level 1 — 帧级亮度统计逐帧动态核心| 字段 | 位宽 | 含义 ||------|------|------|| min_pq | 12 | 当前帧最暗像素PQ值 || max_pq | 12 | 当前帧最亮像素PQ值范围[2081,4095] || avg_pq | 12 | 当前帧平均亮度PQ值 |这是动态元数据的核心解码器据此逐帧调整色调映射曲线。#### Level 2 — 目标显示器亮度修剪创意参数每种目标亮度一个块最多8个| 字段 | 含义 | 默认值(no-op) ||------|------|---------------|| target_max_pq | 目标显示器峰值亮度PQ值 | 2081(≈100nit) || trim_slope | 亮度曲线斜率 | 2048 || trim_offset | 亮度曲线偏移 | 2048 || trim_power | gamma幂次 | 2048 || trim_chroma_weight | 色度权重 | 2048 || trim_saturation_gain | 饱和度增益 | 2048 || ms_weight | 中间调权重 | 2048 |#### Level 3 — 帧级亮度偏移CM v4.0在 L1 基础上微调2048no offset。#### Level 4 — 时域稳定锚点anchor_pq anchor_power防止场景内帧间亮度跳变闪烁。#### Level 5 — 有效画面区域active_area_left/right/top/bottom_offset13bit各定义画面黑边范围L1 统计和色调映射只针对有效区域。#### Level 6 — HDR10静态元数据ST2086兼容| 字段 | 含义 | 单位 ||------|------|------|| max_display_mastering_luminance | 母版显示最大亮度 | nit || min_display_mastering_luminance | 母版显示最小亮度 | nit || max_content_light_level | MaxCLL | nit || max_frame_average_light_level | MaxFALL | nit |不支持杜比视界的设备用此字段做HDR10降级回退。### 3.2 CM v4.0 新增 Level3, 8, 9, 10, 11, 254#### Level 8 — 精细修剪替代L2可变长10~25字节在 L2 基础上增加- target_mid_contrast中间调对比度- clip_trim高光裁剪修剪- saturation_vector_field0~56个色相方向的饱和度调整- hue_vector_field0~56个色相方向的色相旋转#### Level 9 — 母版显示色域source_primary_index预设色域索引默认DCI-P3 D65。可扩展为自定义色域坐标17字节版本。#### Level 10 — 目标显示器色域针对每种目标显示器的色域和亮度范围描述与L8对应。#### Level 11 — 内容类型| 字段 | 含义 ||------|------|| content_type | 0未知,1电影院,2家庭,3游戏 || whitepoint | 白点0D65 || reference_mode_flag | 是否参考级显示模式 |#### Level 254 — CM版本标识dm_version_index2 表示 CMv4.0.2。---## 4. P7 转 MEL 流程### 4.1 调用链capi.rs:180 dovi_convert_rpu_with_mode(rpu, mode1) ← C FFI 入口ConversionMode::from(1) → ToMelrpu.convert_with_mode(ToMel)↓dovi_rpu.rs:342 convert_with_mode()检查 profile 必须是 7 或 8调用 convert_to_mel()↓dovi_rpu.rs:395 convert_to_mel()修改 Header 2个标志位修改 Mapping NLQ参数调用 nlq.convert_to_mel()↓rpu_data_nlq.rs:91 convert_to_mel()重置 7个字段×3分量21个值### 4.2 具体修改内容**① RpuDataHeader2个字段**| 字段 | P7 FEL | MEL ||------|--------|-----|| el_spatial_resampling_filter_flag | false | **true** || disable_residual_flag | true | **false** |这两个 flag 组合决定 get_dovi_profile() 返回 7MEL而非 8。**② RpuDataMapping3个字段**| 字段 | MEL值 ||------|-------|| nlq_method_idc | Some(LinearDeadzone)通常不变|| nlq_num_pivots_minus2 | Some(0)通常不变|| nlq_pred_pivot_value | **[0, 1023]** |**③ RpuDataNlq21个值全部清零**rustnlq_offset.fill(0) // [0,0,0]vdr_in_max_int.fill(1) // [1,1,1] 唯一非零vdr_in_max.fill(0) // [0,0,0]linear_deadzone_slope_int.fill(0) // [0,0,0]linear_deadzone_slope.fill(0) // [0,0,0]linear_deadzone_threshold_int.fill(0)// [0,0,0]linear_deadzone_threshold.fill(0) // [0,0,0]**完全不改的** VdrDmDataL1/L2/L5/L6/色彩矩阵全保留、Mapping曲线Polynomial/MMR。### 4.3 P7→MEL vs P7→P8.1 对比| | P7 → MEL (mode1) | P7 → P8.1 (mode2) ||--|--|--|| el_spatial_resampling_filter_flag | true | **false** || disable_residual_flag | false | **true** || profile识别结果 | **7** | **8** || NLQ结构体 | 保留但清零 | **整个删掉** || Mapping曲线 | 完全保留 | FEL来源时清为恒等变换 || EL码流 | 还在内容空操作 | **完全丢弃** || VdrDmData | 不动 | 色彩矩阵改为P8.1标准值 || 码率节省 | 20-30% | 更多 |### 4.4 修改参数详细说明总共修改 **3个结构体26个参数**完全不动 VdrDmData。#### 第一层RpuDataHeader2个参数**el_spatial_resampling_filter_flag**P7 FELfalseMEL trueEL 是否需要空间重采样滤波器。FEL 的 EL 与 BL 分辨率相同不需要重采样MEL 的 EL 是半分辨率需要上采样。这个 flag 是 get_dovi_profile() 的判断条件必须为 true 才能识别为 Profile 7。**disable_residual_flag**P7 FELtrueMEL false是否禁用 EL 残差。MEL 设为 false 让解码器走残差读取路径但 NLQ 全零使残差实际为 0。两个 flag 组合| filtertrue residualfalse | → Profile 7MEL || filterfalse residualtrue | → Profile 8 |#### 第二层RpuDataMapping3个参数**nlq_method_idc**量化方法保持 LinearDeadzone决定解码器解析 slope/threshold 字段的路径。**nlq_num_pivots_minus2**分段数保持 01段。**nlq_pred_pivot_value**P7 FEL[x, 1023-x]真实量化区间MEL [0, 1023] ← 覆盖整个BL范围配合NLQ全零禁用分段效果#### 第三层RpuDataNlq21个参数3分量×7字段| 字段 | P7 FEL | MEL | 含义 ||------|--------|-----|------|| nlq_offset ×3 | [64,32,32] | **[0,0,0]** | 残差编码基准偏置让无符号编码能表示正负残差 || vdr_in_max_int ×3 | [940,960,960] | **[1,1,1]** | 动态范围上限整数部分MEL设为1使范围压缩到极小 || vdr_in_max ×3 | 真实值 | **[0,0,0]** | 动态范围上限小数部分 || linear_deadzone_slope_int ×3 | [2,1,1] | **[0,0,0]** | 死区外斜率整数部分slope0使输出恒为0 || linear_deadzone_slope ×3 | 真实值 | **[0,0,0]** | 斜率小数部分 || linear_deadzone_threshold_int ×3 | [16,8,8] | **[0,0,0]** | 死区宽度整数部分 || linear_deadzone_threshold ×3 | 真实值 | **[0,0,0]** | 死区宽度小数部分 |MEL 的量化输出q 0 × (|r| - 0) 0无论残差多大EL 贡献恒为零。**设计逻辑** Header 的 2 个 flag 让解码器识别为 Profile 7保持格式合规NLQ 的 21 个参数让 EL 实际贡献为零节省码率实现格式上是 P7效果上是 P8。### 4.5 转换本质FEL: BL ──Mapping──▶ VDR近似值EL ──NLQ──────▶ 残差 r真实数据↓VDR精确值 近似值 r12bit完整精度MEL: BL ──Mapping──▶ VDR近似值EL ──NLQ0────▶ 残差 r 0↓VDR 近似值EL存在但贡献为零P8: BL ─────────────────────▶ 直接用BLEL 完全不存在---## 5. 解码处理阶段### 5.1 完整处理流程阶段1码流解析HEVC解码器├ 解码 BL → 10bit YCbCr 像素├ 解码 EL → 残差数据P7 FEL/MEL└ 解析 RPU NAL → DoviRpu 结构体阶段2VDR重建信号重建使用 RpuDataMapping RpuDataNlq├ Mapping曲线变换BL 10bit → VDR 12bit└ NLQ反量化叠加EL残差FEL有效/MEL为0输出VDR 12bit YCbCr阶段3色彩空间转换使用 VdrDmData 基础字段├ ycc_to_rgb_coefYCbCr → RGB└ rgb_to_lms_coefRGB → LMS人眼锥细胞空间输出VDR LMS 12bit阶段4显示管理Level数据在这里L5 → 确定有效画面区域排除黑边L9 → 母版色域L10 → 目标显示器色域L6 → 母版亮度范围参考L1 → 当前帧亮度统计逐帧动态L11 → 内容类型电影/游戏L2/L8 → 针对目标显示器的创意trim参数L3 → 帧级亮度微调L4 → 时域平滑防帧间闪烁输出目标显示器 RGB阶段5送显像素数据 HDR InfoFrameL6/L9派生 杜比VSifL11派生## 6. RPU 注入 HEVC NAL 流### 6.1 NAL 单元二进制格式RPU 被封装为 HEVC UNSPEC62 类型的 NAL 单元结构如下┌──────────────────────────────────────────────┐│ NAL Header2 字节 ││ Byte 0: 0x7C (62 1) | 0 ← type62 ││ Byte 1: 0x01 layer_id0, temporal_id1 │├──────────────────────────────────────────────┤│ RPU 前缀1 字节 ││ 0x19 ← rpu_nal_prefix固定值 │├──────────────────────────────────────────────┤│ RPU 有效载荷变长 ││ VDR映射曲线、DM色彩元数据、DM Level数据... │├──────────────────────────────────────────────┤│ CRC324 字节大端 ││ 覆盖范围0x19 有效载荷 │├──────────────────────────────────────────────┤│ 结束字节1 字节 ││ 0x80 ← RBSP trailing bits │└──────────────────────────────────────────────┘### 6.2 防竞争字节Emulation PreventionHEVC 规范要求 NAL 载荷中不能出现 00 00 00、00 00 01、00 00 02、00 00 03 序列会被误识别为起始码。写出 NAL 数据前需扫描并插入防竞争字节检测 [0x00, 0x00, x≤0x03] 模式 → 在 x 前插入 0x03示例[00 00 01] → [00 00 03 01]解析时做逆操作遇到 [00 00 03] 跳过 0x03。### 6.3 插入位置RPU NAL 附加在同一 AUAccess Unit末尾具体位置是**最后一个非 EOS/EOB NAL 之后**。一帧的典型 NAL 序列index: 0 1 2 3 4 5 6type: [AUD] [VPS] [SPS] [PPS] [IDR] [EOS] [EOB]↑RPU 插在这里idx415结果[AUD][VPS][SPS][PPS][IDR][RPU][EOS][EOB]无 EOS/EOB 的普通帧[AUD][SPS][PPS][slice] → [AUD][SPS][PPS][slice][RPU]EOS/EOB 必须是 AU 中最后的 NALHEVC 规范要求RPU 不能出现在它们之后。查找逻辑dovi_tool rpu_injector.rsrust// 从末尾反向扫描跳过 EOS/EOB找到第一个有意义的NALlet insert_index frame_buffer.nals.iter().rposition(|nb| !matches!(nb.nal_type, NAL_EOS_NUT | NAL_EOB_NUT));// 1 表示插在该 NAL 之后Ok((idx 1, rpu_nb))### 6.4 两遍处理机制dovi_tool 注入 RPU 采用两遍处理第一遍process_inputHevcParser 解析整个比特流├─ 解析 slice header 中的 first_slice_in_pic_flag 检测帧边界├─ 解析 POCPicture Order Count得到显示顺序├─ 建立 decoded_index解码顺序自增计数器└─ 输出 ordered_frames[]每帧含 decoded_number presentation_number第二遍interleave_rpu_nals按帧缓冲 NAL 单元frame_buffer.nals├─ 检测帧号变化nal.decoded_frame_index 不同于当前缓冲帧号├─ 帧号变化时按 presentation_number 找对应 RPU├─ 确定插入位置写出完整一帧的 NAL RPU└─ 清空缓冲区开始下一帧### 6.5 帧号匹配RPU 与视频帧的匹配使用 presentation_number显示顺序而非解码顺序rustif let Some(dovi_rpu) rpus.get(frame.presentation_number as usize) {let rpu_data dovi_rpu.write_hevc_unspec62_nalu()?;}presentation_number 来源HevcParser 解析 slice header 中的 POC 字段经 GOP 内排序后赋予连续编号。| 字段 | 来源 | 方式 ||------|------|------|| decoded_frame_index | 内部计数器 | 每完成一帧 add_current_frame() 自增 || presentation_number | slice header POC | SliceNAL::parse() 解析 HEVC 标准字段 || 帧边界检测 | first_slice_in_pic_flag | 解析 HEVC 标准字段判断 |### 6.6 帧数不匹配处理| 情况 | 处理方式 ||------|---------|| RPU 少于视频帧 | 末尾帧复用最后一个 RPUlast_metadata_written|| RPU 多于视频帧 | 多余的 RPU 直接丢弃 || 完全匹配 | 正常一一对应 |两种不匹配情况均打印 warning不终止处理。### 6.7 解码侧的 RPU 匹配FFmpeg解码器侧**不需要帧号匹配**原因是 RPU 与图像 NAL 同属一个 AUAU 边界 帧边界AU #N[AUD][SPS][PPS][slice][RPU][EOS?]└──────── 全部属于第 N 帧 ────────┘解码流程hevcdec.c1. h2645_parse 把一个 AU 的所有 NAL 收集到 s-pkt.nals[]2. 从末尾反向扫描找 UNSPEC62 → 存入 s-rpu_buf解析到 dovi_ctx3. 解码图像 NAL → AVFrame4. ff_dovi_attach_side_data() → 把 dovi_ctx 元数据挂到该帧整个过程在同一 AU 处理循环内完成RPU 和图像数据天然绑定不存在跨帧错位。---## 7. 关键技术概念### 7.1 PQPerceptual QuantizerPQ SMPTE ST.2084HDR视频亮度编码标准由杜比发明。**核心思想** 按人眼感知非线性分配编码级暗部精细高光粗糙。**关键刻度12bit**| 物理亮度 | PQ值 ||----------|------|| 0.001 nit | 7 || 100 nit | 2081 || 1000 nit | 3079 || 4000 nit | 3696 || 10000 nit | 4095 |**PQ 只针对亮度Y分量设计**色度 Cb/Cr 搭便车用同样编码空间但不是 PQ 的优化目标。### 7.2 色调映射Tone Mapping把 VDR 高动态范围信号适配到目标显示器能显示的范围。VDR范围0~10000nit目标显示器100nit电视 / 1000nit高端电视 / 48nit影院**色调映射 ≠ 伽马曲线**| | 伽马曲线EOTF | 色调映射 ||--|--|--|| 作用 | 编码值→物理亮度的换算 | 高动态范围→显示器范围压缩 || 是否逐帧变化 | 不变固定公式| 变L1驱动|| 类比 | 单位换算 | 内容适配 |**处理顺序**PQ编码值 → EOTF解码 → 线性光(nit) → 色调映射 → 目标亮度(nit) → 显示器逆EOTF → 面板发光### 7.3 VDR 中间信号VDR BL 经过 Mapping 曲线变换 EL 残差叠加的结果VDR Mapping(BL) NLQ反量化(EL残差)FEL两者都有12bit完整精度MELEL残差0精度依赖BL映射质量P8 无EL直接用BL### 7.4 压缩RPUCompressed DM通过 header.reserved_zero_3bits 1 识别。**当前版本支持情况**- 识别支持- 解析部分支持只读3个字段色彩矩阵等跳过- validate有 FIXME未完整实现- convert_to_mel有隐患压缩帧色彩数据丢失压缩RPU通常出现在场景内非关键帧引用前帧状态当前库未实现跨帧状态追踪。---## 8. Profile 详解### 8.1 各 Profile 对比| Profile | 基础层 | 增强层 | 向后兼容 | 典型场景 ||---------|--------|--------|----------|----------|| P4 | SDR | 有EL | 否 | 早期广播 || P5 | IPT-PQ2020 | 无EL | 否 | 杜比内部母版 || P7 FEL | HDR10 | 有EL全分辨率| 是HDR10| 蓝光盘 || P7 MEL | HDR10 | 有EL半分辨率| 是HDR10| 流媒体 || P8.1 | HDR10 | 无EL | 是HDR10| 流媒体/OTT || P8.4 | HLG | 无EL | 是HLG| 广播/iPhone拍摄 |### 8.2 Profile 5 特殊性P5 使用 IPT-PQ2020 色彩空间非标准 YCbCr不向后兼容 HDR10rustfn backwards_compatible() - bool {false // P5 专有不向后兼容}P5 VdrDmData 特征signal_color_space 2BT.709与 P8.1 使用不同的色彩矩阵系数。P5 转 P8.1mode2时需要额外修改- vdr_rpu_profile 改为 1- bl_video_full_range_flag 改为 false- 删除 Mapping 曲线设为恒等变换- 重新设置 P8.1 色彩矩阵系数### 8.3 Profile 8.4HLGP8.4 基于 HLGHybrid Log-Gamma基础层典型来源是 iPhone 13 杜比视界拍摄source_min_pq 62 ≈50nitHLG黑场source_max_pq 3079 ≈1000nitP8.4 使用静态 Mapping 曲线iPhone 13 多项式MMR 系数硬编码在 profile84.rs包含8段亮度多项式和3阶 MMR 色度回归。### 8.4 Profile 标准色彩矩阵系数各 Profile 的 VdrDmData 色彩矩阵系数定点数除以2¹³| | P4 | P5 | P7/P8.1 ||--|--|--|--|| YCC→RGB coef0 | 9575 | 8192 | 9574 || signal_eotf | 39322HLG | 65535PQ| 65535PQ|| signal_bit_depth | 14 | 12 | 12 || 色彩空间 | BT.2020 | BT.709 | BT.2020 |---## 9. ConversionMode 完整说明### 9.1 所有模式rustpub enum ConversionMode {Lossless 0, // mode0: 不修改ToMel, // mode1: 转MELTo81, // mode2/3: 转P8.1删除MappingTo84, // mode4: 转P8.4替换静态MappingTo81MappingPreserved, // 转P8.1但保留Mapping曲线}### 9.2 各模式修改内容对比| 修改项 | mode0 | mode1(MEL) | mode2(P8.1) | mode4(P8.4) ||--------|--------|-------------|--------------|--------------|| Header flag | 不变 | 修改2个 | 修改2个 | 重置为P8默认 || NLQ结构体 | 不变 | 清零保留 | **删除** | **删除** || Mapping曲线 | 不变 | 不变 | **删除** | **替换为P8.4静态** || VdrDmData色彩矩阵 | 不变 | 不变 | 设P8.1标准值 | 设P8.1标准值 || 来源profile限制 | 任意 | P7/P8 | P5/P7/P8 | 任意 |### 9.3 P8.1 保留 Mappingmode4vs 删除 Mappingmode2- **mode2**To81FEL来源时删除Mapping设为恒等变换set_empty_p81_mapping- **mode4**To81MappingPreserved仅修改Header和色彩矩阵保留原有 Polynomial/MMR 曲线mode4 是旧版 mode2 行为保留映射曲线可以维持 BL→VDR 的色彩精度。---## 10. RPU 生成GenerateConfig### 10.1 生成流程rustGenerateConfig {cm_version: CmVersion::V40, // CMv2.9 或 CMv4.0profile: GenerateProfile, // Profile5 / Profile81 / Profile84length: usize, // 总帧数source_min_pq: Optionu16, // 母版最小亮度source_max_pq: Optionu16, // 母版最大亮度level5: ExtMetadataBlockLevel5, // 黑边裁切level6: OptionLevel6, // HDR10静态元数据shots: VecVideoShot, // 镜头列表含逐镜头元数据}支持生成的 ProfileP5、P8.1、P8.4不支持生成 P7。### 10.2 镜头Shot与帧级编辑VideoShot├── start: usize 帧起始偏移├── duration: usize 镜头帧数├── metadata_blocks 镜头级元数据L1/L2/L5/L6等└── frame_edits 帧级覆盖元数据└── ShotFrameEdit├── edit_offset 帧在镜头内的偏移└── metadata_blocks 该帧专属元数据覆盖镜头级**场景切换标志** 每个镜头第一帧自动设置 scene_refresh_flag1long_play_modetrue 时每帧都设。### 10.3 XML 解析CM XML支持解析 Dolby CM XML 文件生成 GenerateConfigCmXmlParser::parse_file(path, opts) → GenerateConfigXML 中包含- 全局 L5黑边、L6HDR10静态、L11内容类型- 目标显示器定义peak_nits、min_nits、色域坐标- 每个镜头的 L1逐帧亮度、L2/L8trim 参数、L3亮度偏移- 帧级 ShotFrameEdit单帧元数据覆盖支持 CMv2.9 和 CMv4.0 两种 XML 格式通过 xml_version 字段判断。---## 11. AV1 杜比视界封装### 11.1 与 HEVC 封装的差异| | HEVC | AV1 ||--|--|--|| 封装类型 | UNSPEC62 NAL | ITU-T T.35 Metadata OBU || 容器格式 | 裸 RPU 防竞争字节 | EMDF容器 ITU-T T.35头 || 国家码 | 无 | 0xB5美国|| 供应商码 | 无 | 0x003B 0x800 |### 11.2 AV1 ITU-T T.35 载荷格式ITU-T T.35 Metadata OBU 结构┌────────────────────────────────────────┐│ country_code: 0xB5美国可选 ││ terminal_provider_code: 0x003B ││ terminal_provider_oriented_code: 0x800 │├────────────────────────────────────────┤│ EMDF 容器变长 ││ └── RPU 有效载荷去掉0x19前缀 │└────────────────────────────────────────┘固定头标识9字节00 3B 00 00 08 00 37 CD 08### 11.3 AV1 RPU 转换rust// AV1 → 标准 RPUconvert_av1_rpu_payload_to_regular(data) → Vecu8 // 解包EMDF加0x19前缀// 标准 RPU → AV1convert_regular_rpu_to_av1_payload(data) → Vecu8 // 加EMDF包装去0x19前缀write_av1_rpu_metadata_obu_t35_complete() → Vecu8 // 完整T.35 OBU含0xB5国家码---## 12. ST2094-10DASH-IF ITU-T T.35ST2094-10 是另一种通过 ITU-T T.35 SEI 传递的动态元数据格式非 RPU用于 DASH 流媒体。识别标志country_code 0xB5provider_code 0x31user_identifier 0x47413934GA94user_data_type_code:0x08 → CM DataContent Mapping0x09 → DM DataDisplay Management**与杜比 RPU 的区别**- RPU 封装在 HEVC UNSPEC62 NAL 或 AV1 EMDF OBU 中- ST2094-10 封装在标准 HEVC SEI 或 AV1 Metadata OBU 中ITU-T T.35- ST2094-10 用于流媒体DASHRPU 用于本地文件蓝光/文件---## 8. 送显信息送显不只是像素数据HDMI/DisplayPort 信号├── 像素数据已完成色调映射的RGB/YCbCr├── AVI InfoFrame│ ├── 色彩空间BT.2020│ ├── 色度采样4:2:0/4:4:4│ └── 量化范围full/limited├── HDR InfoFrame来自L6/L9│ ├── EOTF类型PQ2│ ├── 母版色域坐标│ ├── MaxCLL/MaxFALL/MDL│ └── 最大/最小母版亮度└── 杜比视界 VSif来自L11├── 杜比视界信号标识├── 低延迟模式标志└── 背光控制参数Level数据的归宿| Level | 用途 | 是否送显 ||-------|------|----------|| L1 min/max/avg_pq | 像素色调映射逐帧计算| 不送显 || L2/L8 trim参数 | 像素色调映射 | 不送显 || L3 亮度偏移 | 像素色调映射逐帧计算| 不送显 || L4 时域锚点 | 色调映射平滑 | 不送显 || L5 有效区域 | 像素处理范围限定 | 不送显 || L6 MaxCLL/MaxFALL/MDL | HDR InfoFrame | 送给显示器 || L9 母版色域 | HDR InfoFrame色域坐标 | 送给显示器 || L10 目标色域 | 内部色域转换 | 不送显 || L11 内容类型 | 杜比VSif | 送给显示器 |---