From a987c0ce09d2623e28e5e6c861b820a66407ba3d Mon Sep 17 00:00:00 2001 From: quietvoid Date: Sat, 14 Feb 2026 14:44:57 -0500 Subject: [PATCH] inject-rpu: fix duplicated metadata used to pad As the frames do not come in presentation order, the duplicated metadata would come from the last parsed frame so it was the last DTS instead of PTS. Use the actual last RPU from the list instead, it's already in presentation order. --- src/dovi/rpu_injector.rs | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/dovi/rpu_injector.rs b/src/dovi/rpu_injector.rs index ff8b19f..733bbf0 100644 --- a/src/dovi/rpu_injector.rs +++ b/src/dovi/rpu_injector.rs @@ -34,7 +34,6 @@ pub struct RpuInjector { mismatched_length: bool, frame_buffer: FrameBuffer, - last_metadata_written: Option, } impl RpuInjector { @@ -79,7 +78,6 @@ impl RpuInjector { frame_number: 0, nals: Vec::with_capacity(16), }, - last_metadata_written: None, }; println!("Parsing RPU file..."); @@ -162,7 +160,6 @@ impl RpuInjector { rpus: &[DoviRpu], frame_buffer: &FrameBuffer, mismatched_length: bool, - last_metadata: &Option, ) -> Result<(usize, NalBuffer)> { let existing_frame = frames .iter() @@ -171,24 +168,32 @@ impl RpuInjector { // If we have a RPU buffered frame, write it // Otherwise, write the same data as previous let rpu_nb = if let Some(frame) = existing_frame { - if let Some(dovi_rpu) = rpus.get(frame.presentation_number as usize) { - let rpu_data = dovi_rpu.write_hevc_unspec62_nalu()?; + let dovi_rpu = rpus + .get(frame.presentation_number as usize) + .or_else(|| mismatched_length.then(|| rpus.last()).flatten()); + + if let Some(rpu) = dovi_rpu { + let data = rpu.write_hevc_unspec62_nalu()?; Some(NalBuffer { nal_type: NAL_UNSPEC62, start_code: NALUStartCode::Length4, - data: rpu_data, + data, }) - } else if mismatched_length { - last_metadata.clone() } else { bail!( "No RPU found for presentation frame {}", frame.presentation_number ); } - } else if mismatched_length { - last_metadata.clone() + } else if mismatched_length && let Some(rpu) = rpus.last() { + let data = rpu.write_hevc_unspec62_nalu()?; + + Some(NalBuffer { + nal_type: NAL_UNSPEC62, + start_code: NALUStartCode::Length4, + data, + }) } else { None }; @@ -281,10 +286,8 @@ impl IoProcessor for RpuInjector { rpus, &self.frame_buffer, self.mismatched_length, - &self.last_metadata_written, )?; - self.last_metadata_written = Some(rpu_nb.clone()); self.frame_buffer.nals.insert(idx, rpu_nb); // Write NALUs for the frame @@ -369,10 +372,8 @@ impl IoProcessor for RpuInjector { rpus, &self.frame_buffer, self.mismatched_length, - &self.last_metadata_written, )?; - self.last_metadata_written = Some(rpu_nb.clone()); self.frame_buffer.nals.insert(idx, rpu_nb); // Write NALUs for the last frame