aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/src/lib.rs4
-rw-r--r--import/src/lib.rs4
-rw-r--r--remuxer/src/fragment.rs7
-rw-r--r--remuxer/src/lib.rs7
-rw-r--r--remuxer/src/remux.rs2
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<u64>,
+ pub seek_pre_roll: u64,
+ pub codec_delay: u64,
#[serde(default)]
pub federated: Vec<String>,
}
@@ -178,7 +180,7 @@ pub enum SourceTrackKind {
height: u64,
display_width: Option<u64>,
display_height: Option<u64>,
- display_unit: Option<u64>,
+ display_unit: u64,
fps: Option<f64>,
},
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<Vec<u8>>,
) -> 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)))?;