X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-commonfmt%2Fsrc%2Fdemuxers%2Favi.rs;h=c4b4817c633b335e62b01b739f3668da4ba7b8c2;hb=51382a9ad683e7b4d5907f63cd8e103f531f577c;hp=7c1d4f7b5a2ee0e4388be374ad84d42f51499254;hpb=5c390af2d5f975c2dbfb5d98b0fd472c0b9bc563;p=nihav.git diff --git a/nihav-commonfmt/src/demuxers/avi.rs b/nihav-commonfmt/src/demuxers/avi.rs index 7c1d4f7..c4b4817 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' { @@ -361,7 +366,7 @@ impl<'a> AVIDemuxer<'a> { if ret.is_err() { break; } let (csz, end) = ret.unwrap(); if end { - let _res = parse_idx1(&mut self.src, strmgr, seek_idx, csz, self.movi_pos, &mut self.key_offs); + let _res = parse_idx1(self.src, strmgr, seek_idx, csz, self.movi_pos, &mut self.key_offs); break; } rest_size -= csz; @@ -388,7 +393,7 @@ impl<'a> AVIDemuxer<'a> { start = 0; last_strm_no = stream_no; } - let ret = parse_odml_ix(&mut self.src, strmgr, seek_idx, stream_no, size, start); + let ret = parse_odml_ix(self.src, strmgr, seek_idx, stream_no, size, start); if let Ok(new_start) = ret { start = new_start; } else { @@ -782,7 +787,7 @@ fn parse_idx1(src: &mut ByteReader, strmgr: &mut StreamManager, seek_idx: &mut S offset += add_offset; if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' { - return Err(InvalidData); + continue; } let stream_no = ((tag[0] - b'0') * 10 + (tag[1] - b'0')) as usize; @@ -857,6 +862,7 @@ mod test { #[test] fn test_avi_demux() { + //test sample: https://samples.mplayerhq.hu/V-codecs/RT21/320x240/laser05.avi let mut file = File::open("assets/Indeo/laser05.avi").unwrap(); let mut fr = FileReader::new_read(&mut file); let mut br = ByteReader::new(&mut fr);