From 407a034c3f5c8742ab6bfdfe655eaef4551e4a99 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Mon, 6 Apr 2026 18:15:33 +0200 Subject: [PATCH] mov: hopefully improve seeking Since PTS in seek index are actually sample IDs and e.g. for remuxed tidemo1-24bit-rle.mov seek search returns audio first, it makes sense to search in the stream-specific index first before rescaling seek result PTS. --- nihav-commonfmt/src/demuxers/mov/mod.rs | 6 ++++-- nihav-commonfmt/src/demuxers/mov/pktread.rs | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/nihav-commonfmt/src/demuxers/mov/mod.rs b/nihav-commonfmt/src/demuxers/mov/mod.rs index 0438a8e..02b8146 100644 --- a/nihav-commonfmt/src/demuxers/mov/mod.rs +++ b/nihav-commonfmt/src/demuxers/mov/mod.rs @@ -627,10 +627,12 @@ impl<'a> DemuxCore<'a> for MOVDemuxer<'a> { let mut vpts = None; let mut apts = None; for track in self.tracks.iter_mut() { - let cur_pts = if track.track_id == seek_info.str_id { + let cur_pts = if track.pkt_demux.seek_id as u32 == seek_info.str_id { seek_info.pts + } else if let Some(cur_f) = seek_index.seek_info[track.pkt_demux.seek_id].find_pos(time) { + cur_f.pts } else { - seek_info.pts * u64::from(tbn) * u64::from(track.tb_den) / (u64::from(tbd) * u64::from(track.tb_num)) + NATimeInfo::rescale_ts(seek_info.pts, tbn, tbd, track.tb_num, track.tb_den) }; let actual_time = track.pkt_demux.seek(cur_pts, time, false)?; match track.stream_type { diff --git a/nihav-commonfmt/src/demuxers/mov/pktread.rs b/nihav-commonfmt/src/demuxers/mov/pktread.rs index d8a2299..0352931 100644 --- a/nihav-commonfmt/src/demuxers/mov/pktread.rs +++ b/nihav-commonfmt/src/demuxers/mov/pktread.rs @@ -147,15 +147,18 @@ pub struct QTPacketDemuxer { pub ctts_map: RLESearcher, pub ctts_version: u8, pub timesearch: TimeSearcher, + + pub seek_id: usize, } impl QTPacketDemuxer { pub fn new() -> Self { Self::default() } pub fn is_first(&self) -> bool { self.cur_sample == 0 } - pub fn fill_seek_index(&self, track_no: u32, seek_index: &mut SeekIndex) { + pub fn fill_seek_index(&mut self, track_no: u32, seek_index: &mut SeekIndex) { if !self.keyframes.is_empty() { seek_index.mode = SeekIndexMode::Present; } + self.seek_id = seek_index.add_stream(track_no); let mut tsearch = TimeSearcher::new(); for kf_time in self.keyframes.iter() { let pts = tsearch.map_time(*kf_time - 1, &self.time_to_sample); -- 2.39.5