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 {
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);