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) --- common/src/lib.rs | 4 +++- import/src/lib.rs | 4 +++- remuxer/src/fragment.rs | 7 ++++++- remuxer/src/lib.rs | 7 +++++-- remuxer/src/remux.rs | 2 +- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/common/src/lib.rs b/common/src/lib.rs index 4d6123c..9d22eec 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -151,6 +151,8 @@ pub struct SourceTrack { pub codec: String, pub language: String, pub default_duration: Option, + pub seek_pre_roll: u64, + pub codec_delay: u64, #[serde(default)] pub federated: Vec, } @@ -178,7 +180,7 @@ pub enum SourceTrackKind { height: u64, display_width: Option, display_height: Option, - display_unit: Option, + display_unit: u64, fps: Option, }, Audio { diff --git a/import/src/lib.rs b/import/src/lib.rs index 6eceb31..4be2151 100644 --- a/import/src/lib.rs +++ b/import/src/lib.rs @@ -283,13 +283,15 @@ fn import_media_file(db: &Database, path: &Path, parent: NodeID) -> Result<()> { name: track.name.unwrap_or_default(), default_duration: track.default_duration, federated: Vec::new(), + codec_delay: track.codec_delay, + seek_pre_roll: track.seek_pre_roll, kind: if let Some(video) = track.video { SourceTrackKind::Video { width: video.pixel_width, height: video.pixel_height, display_width: video.display_width, display_height: video.display_height, - display_unit: Some(video.display_unit), + display_unit: video.display_unit, fps: video.frame_rate, } } else if let Some(audio) = track.audio { 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