X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-commonfmt%2Fsrc%2Fdemuxers%2Favi.rs;h=cd33c51ca150e210670834e3bfa4cee29bed411e;hb=8e14efb001fac3fecb0cb56df8705d23fa2231a8;hp=2329ae9be27c0ff893f453b697652060b8b4c8d8;hpb=735b56ab4e0fd4466b6d031009f9c63f7493b512;p=nihav.git diff --git a/nihav-commonfmt/src/demuxers/avi.rs b/nihav-commonfmt/src/demuxers/avi.rs index 2329ae9..cd33c51 100644 --- a/nihav-commonfmt/src/demuxers/avi.rs +++ b/nihav-commonfmt/src/demuxers/avi.rs @@ -140,11 +140,16 @@ impl<'a> DemuxCore<'a> for AVIDemuxer<'a> { continue; } if (tag[0] == b'i' && tag[1] == b'x') || (&tag == b"idx1") { + let idx_pos = self.src.tell() - 8; if !self.odml { return Err(EOF); } self.src.read_skip(size)?; - self.try_next_odml_chunk()?; + if idx_pos > self.movi_pos { + self.try_next_odml_chunk()?; + } else { + self.movi_pos = self.src.tell(); + } continue; } if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' { @@ -163,7 +168,11 @@ impl<'a> DemuxCore<'a> for AVIDemuxer<'a> { continue; } let str = strmgr.get_stream(stream_no as usize); - if str.is_none() { return Err(InvalidData); } + if str.is_none() { + self.src.read_skip(size)?; + self.movi_size -= size + 8; + continue; + } let stream = str.unwrap(); if size == 0 { self.movi_size -= 8; @@ -175,8 +184,8 @@ impl<'a> DemuxCore<'a> for AVIDemuxer<'a> { } continue; } - let (tb_num, tb_den) = stream.get_timebase(); - let mut ts = NATimeInfo::new(Some(self.cur_frame[stream_no as usize]), None, None, tb_num, tb_den); + let (tb_num, _) = stream.get_timebase(); + let mut ts = stream.make_ts(Some(self.cur_frame[stream_no as usize]), None, None); if stream.get_media_type() == StreamType::Audio && tb_num == 1 && stream.get_info().get_name() == "pcm" { ts.pts = None; } @@ -814,7 +823,7 @@ fn parse_odml_ix(src: &mut ByteReader, strmgr: &mut StreamManager, seek_idx: &mu let idx_type = src.read_byte()?; validate!(sub_type == 0 && idx_type == 1); let entries = src.read_u32le()? as usize; - validate!(size == 24 + entries * 4 * entry_size); + validate!(size >= 24 + entries * 4 * entry_size); src.read_tag()?; //chunk id let base_offset = src.read_u64le()?; src.read_u32le()?; //reserved