From 05ae425c1b906f81d6981e10688cb6949bf9daaf Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sat, 1 Feb 2025 02:09:28 +0100 Subject: add CodecDelay and SeekPreRoll (+ fix TrackUID collision) --- remuxer/src/fragment.rs | 7 ++++++- remuxer/src/lib.rs | 7 +++++-- remuxer/src/remux.rs | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) (limited to 'remuxer/src') diff --git a/remuxer/src/fragment.rs b/remuxer/src/fragment.rs index d7adc41..9fa68f3 100644 --- a/remuxer/src/fragment.rs +++ b/remuxer/src/fragment.rs @@ -153,7 +153,12 @@ pub fn write_fragment_into( (last_block_pts - start_block.pts) as f64 / 1000., ))?; output.write_tag(&MatroskaTag::Tracks(Master::Collected(vec![ - ebml_track_entry(mapped, &info, local_track.codec_private.clone()), + ebml_track_entry( + mapped, + local_track.track as u64 * 100, // TODO something else that is unique to the track + &info, + local_track.codec_private.clone(), + ), ])))?; reader.seek(start_block.source_off, MatroskaTag::Cluster(Master::Start))?; diff --git a/remuxer/src/lib.rs b/remuxer/src/lib.rs index 3ea16e2..b46369e 100644 --- a/remuxer/src/lib.rs +++ b/remuxer/src/lib.rs @@ -43,15 +43,18 @@ pub fn ebml_segment_info(title: String, duration: f64) -> MatroskaTag { pub fn ebml_track_entry( number: u64, + uid: u64, track: &SourceTrack, codec_private: Option>, ) -> MatroskaTag { let mut els = vec![ MatroskaTag::TrackNumber(number), - MatroskaTag::TrackUID(number), + MatroskaTag::TrackUID(uid), MatroskaTag::FlagLacing(0), MatroskaTag::Language(track.language.clone()), MatroskaTag::CodecID(track.codec.clone()), + MatroskaTag::CodecDelay(track.codec_delay.clone()), + MatroskaTag::SeekPreRoll(track.seek_pre_roll.clone()), ]; if let Some(d) = &track.default_duration { els.push(MatroskaTag::DefaultDuration(*d)); @@ -72,7 +75,7 @@ pub fn ebml_track_entry( ]; props.push(MatroskaTag::DisplayWidth(display_width.unwrap_or(width))); props.push(MatroskaTag::DisplayHeight(display_height.unwrap_or(height))); - props.push(MatroskaTag::DisplayUnit(display_unit.unwrap_or(0))); + props.push(MatroskaTag::DisplayUnit(display_unit)); if let Some(fps) = fps { props.push(MatroskaTag::FrameRate(fps)) } diff --git a/remuxer/src/remux.rs b/remuxer/src/remux.rs index a2e0d8a..0507f1e 100644 --- a/remuxer/src/remux.rs +++ b/remuxer/src/remux.rs @@ -114,7 +114,7 @@ pub fn remux_stream_into( let tracks_header = inputs .iter_mut() - .map(|rc| ebml_track_entry(rc.mapped, &rc.info, rc.codec_private.take())) + .map(|rc| ebml_track_entry(rc.mapped, rc.mapped, &rc.info, rc.codec_private.take())) .collect(); output.write_tag(&MatroskaTag::Tracks(Master::Collected(tracks_header)))?; -- cgit v1.2.3-70-g09d2