give 'str' variables more appropriate names
[nihav.git] / nihav-commonfmt / src / demuxers / avi.rs
index cc24fe308581882d4d34b39030d0b30bceba17de..1e7a10fe57f495a314efe107b3f7e74a9da64ae8 100644 (file)
@@ -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' {
@@ -162,9 +167,13 @@ impl<'a> DemuxCore<'a> for AVIDemuxer<'a> {
                 }
                 continue;
             }
-            let str = strmgr.get_stream(stream_no as usize);
-            if str.is_none() { return Err(InvalidData); }
-            let stream = str.unwrap();
+            let stream = strmgr.get_stream(stream_no as usize);
+            if stream.is_none() {
+                self.src.read_skip(size)?;
+                self.movi_size -= size + 8;
+                continue;
+            }
+            let stream = stream.unwrap();
             if size == 0 {
                 self.movi_size -= 8;
                 if self.movi_size == 0 {
@@ -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;
             }
@@ -361,7 +370,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 +397,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 +791,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;
 
@@ -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