diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-03-07 15:37:32 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-03-07 15:37:32 +0100 |
| commit | 321388639c862cc37be2d485b9f32486521d5ac4 (patch) | |
| tree | ae0f611c1784f47a41bffca9b830c5f8171d0fbf /remuxer/src | |
| parent | 3a6205f6077c1555f2f3bcf308f5e9605b8dbf53 (diff) | |
| download | jellything-321388639c862cc37be2d485b9f32486521d5ac4.tar jellything-321388639c862cc37be2d485b9f32486521d5ac4.tar.bz2 jellything-321388639c862cc37be2d485b9f32486521d5ac4.tar.zst | |
fix mp4 trun bug; set correct cts_offset
Diffstat (limited to 'remuxer/src')
| -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, }); })); |