diff options
| -rw-r--r-- | remuxer/src/muxers/mp4.rs | 18 |
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, }); })); |