]> git.nihav.org Git - nihav.git/commitdiff
mov: hopefully improve seeking master
authorKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 6 Apr 2026 16:15:33 +0000 (18:15 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 6 Apr 2026 16:15:33 +0000 (18:15 +0200)
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
nihav-commonfmt/src/demuxers/mov/pktread.rs

index 0438a8ea3875dda6dbb9121ddd92068a47ffa692..02b814600167b058ae7bc5bc7314e2978249bf41 100644 (file)
@@ -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 {
index d8a2299c324ad4a30baf05f9b72ba3b9a1ad7f88..035293189f46807663825f0765e384737279bd80 100644 (file)
@@ -147,15 +147,18 @@ pub struct QTPacketDemuxer {
     pub ctts_map:       RLESearcher<u32>,
     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);