From 0b82b201b637d46859a3290418eb04b4fced5fee Mon Sep 17 00:00:00 2001 From: quietvoid Date: Sun, 12 Jul 2026 11:19:30 -0400 Subject: [PATCH] export: improve active area output format Fixes #401 --- dolby_vision/src/rpu/dovi_rpu.rs | 2 +- .../src/rpu/extension_metadata/blocks/mod.rs | 2 +- src/dovi/editor.rs | 27 +++++++++++-- src/dovi/exporter.rs | 40 +++++++++---------- src/dovi/generator.rs | 2 +- 5 files changed, 45 insertions(+), 28 deletions(-) diff --git a/dolby_vision/src/rpu/dovi_rpu.rs b/dolby_vision/src/rpu/dovi_rpu.rs index cceba13..b6ff697 100644 --- a/dolby_vision/src/rpu/dovi_rpu.rs +++ b/dolby_vision/src/rpu/dovi_rpu.rs @@ -69,7 +69,7 @@ pub struct DoviRpu { impl DoviRpu { pub fn validated_trimmed_data(data: &[u8]) -> Result<&[u8]> { if data.len() < 25 { - bail!("Invalid RPU length: {}", &data.len()); + bail!("Invalid RPU length: {}", data.len()); } // Including 0x7C01 prepended diff --git a/dolby_vision/src/rpu/extension_metadata/blocks/mod.rs b/dolby_vision/src/rpu/extension_metadata/blocks/mod.rs index c8abc01..3707dd2 100644 --- a/dolby_vision/src/rpu/extension_metadata/blocks/mod.rs +++ b/dolby_vision/src/rpu/extension_metadata/blocks/mod.rs @@ -186,7 +186,7 @@ impl ExtMetadataBlock { ensure!( T::ALLOWED_BLOCK_LEVELS.contains(&level), "Metadata block level {} is not allowed", - &level + level ); Ok(()) diff --git a/src/dovi/editor.rs b/src/dovi/editor.rs index da37d15..4874289 100644 --- a/src/dovi/editor.rs +++ b/src/dovi/editor.rs @@ -79,16 +79,16 @@ pub struct EditConfig { #[serde(deny_unknown_fields)] pub struct ActiveArea { #[serde(default)] - crop: bool, + pub crop: bool, #[serde(skip_serializing_if = "Option::is_none")] - drop_l5: Option, + pub drop_l5: Option, #[serde(skip_serializing_if = "Option::is_none")] - presets: Option>, + pub presets: Option>, #[serde(skip_serializing_if = "Option::is_none")] - edits: Option>, + pub edits: Option>, } #[derive(Serialize, Deserialize, Default, Debug, Clone)] @@ -192,6 +192,13 @@ impl EditConfig { Ok(config) } + pub fn from_active_area(active_area: ActiveArea) -> Self { + Self { + active_area: Some(active_area), + ..Default::default() + } + } + fn execute(&self, rpus: &mut [Option]) -> Result<()> { // Drop metadata frames if let Some(ranges) = &self.remove { @@ -521,6 +528,18 @@ impl EditConfig { } } +impl ActiveAreaOffsets { + pub fn new(id: u16, meta: &ExtMetadataBlockLevel5) -> Self { + Self { + id, + left: meta.active_area_left_offset, + right: meta.active_area_right_offset, + top: meta.active_area_top_offset, + bottom: meta.active_area_bottom_offset, + } + } +} + impl ActiveArea { fn execute(&self, rpus: &mut [Option]) -> Result<()> { if let Some(edits) = &self.edits diff --git a/src/dovi/exporter.rs b/src/dovi/exporter.rs index b0acded..94b0257 100644 --- a/src/dovi/exporter.rs +++ b/src/dovi/exporter.rs @@ -15,7 +15,10 @@ use serde_json::json; use dolby_vision::rpu::utils::parse_rpu_file; use crate::commands::{ExportArgs, ExportData, ExportLevel, LevelsOutputFormat}; -use crate::dovi::input_from_either; +use crate::dovi::{ + editor::{ActiveArea, ActiveAreaOffsets, EditConfig}, + input_from_either, +}; use super::DoviRpu; @@ -190,28 +193,23 @@ impl Exporter { let l5_presets = l5_presets .iter() .enumerate() - .map(|(id, l5)| { - json!({ - "id": id, - "left": l5.active_area_left_offset, - "right": l5.active_area_right_offset, - "top": l5.active_area_top_offset, - "bottom": l5.active_area_bottom_offset - }) - }) + .map(|(id, l5)| ActiveAreaOffsets::new(id as u16, l5)) .collect::>(); - let l5_edits = l5_edits.iter().map(|(edit_range, id)| { - ( - format!("{}-{}", edit_range.start, edit_range.end), - json!(id), - ) - }); - let l5_edits = serde_json::Value::Object(l5_edits.collect()); + let l5_edits = l5_edits + .into_iter() + .map(|(edit_range, id)| { + ( + format!("{}-{}", edit_range.start, edit_range.end), + id as u16, + ) + }) + .collect(); - let edit_config = json!({ - "crop": true, - "presets": l5_presets, - "edits": l5_edits, + let edit_config = EditConfig::from_active_area(ActiveArea { + crop: true, + presets: Some(l5_presets), + edits: Some(l5_edits), + ..Default::default() }); serde_json::to_writer_pretty(writer, &edit_config)?; diff --git a/src/dovi/generator.rs b/src/dovi/generator.rs index 8ae347c..4003fad 100644 --- a/src/dovi/generator.rs +++ b/src/dovi/generator.rs @@ -141,7 +141,7 @@ impl Generator { self.config = Some(config); if let Some(config) = self.config.as_mut() { - println!("Generating metadata: {}...", &config.profile); + println!("Generating metadata: {}...", config.profile); // Correct L1 for sources other than XML if self.xml_path.is_none() {