aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--remuxer/src/muxers/mp4.rs18
1 files changed, 9 insertions, 9 deletions
diff --git a/remuxer/src/muxers/mp4.rs b/remuxer/src/muxers/mp4.rs
index 85bb244..dd8a066 100644
--- a/remuxer/src/muxers/mp4.rs
+++ b/remuxer/src/muxers/mp4.rs
@@ -4,9 +4,9 @@
Copyright (C) 2026 metamuffin <metamuffin.org>
*/
-use std::sync::Mutex;
use crate::muxers::FragmentMuxer;
use anyhow::Result;
+use std::sync::Mutex;
use winter_matroska::{Segment, TrackType};
use winter_mp4::*;
@@ -138,23 +138,23 @@ impl FragmentMuxer for MP4FragmentMuxer {
.map(|c| c.simple_blocks.len())
.sum::<usize>();
let dts_delta = ((end_pts - start_pts as u64) / num_samples as u64) as u32;
- eprintln!("dts_delta {dts_delta}");
let mut mdat = Vec::new();
let mut samples = Vec::new();
+ let mut dts = 0;
for cluster in segment.clusters {
for block in cluster.simple_blocks {
- let ts = cluster.timestamp as i64 + block.timestamp_off as i64;
-
+ let ts = (cluster.timestamp as i64 + block.timestamp_off as i64)
+ * segment.info.timestamp_scale as i64;
+ let pts_off = (ts - start_pts) - dts;
samples.push(TrackRunSample {
- composition_time_offset: 0,
+ composition_time_offset: pts_off.try_into().expect("cts_offset overflow"),
duration: dts_delta as u32,
flags: 0,
size: block.data.len() as u32,
});
-
- // samples.push((ts, block.data.len()));
mdat.extend(block.data);
+ dts += dts_delta as i64;
}
}
@@ -174,9 +174,9 @@ impl FragmentMuxer for MP4FragmentMuxer {
traf.write(TrackFragmentBaseMediaDecodeTime {
base_media_decode_time: 0,
});
- *data_offset_offset.lock().unwrap() = traf.buffer_mut().len() + 12; // full box header (size+tag+ver+flags)
+ *data_offset_offset.lock().unwrap() = traf.buffer_mut().len() + 16; // full box header (size+tag+ver+flags+sample_count)
traf.write(TrackRun {
- data_offset: 0,
+ data_offset: -1,
samples: &samples,
});
}));