]> git.nihav.org Git - nihav.git/blobdiff - nihav-commonfmt/src/demuxers/avi.rs
avi: descend into 'rec' lists
[nihav.git] / nihav-commonfmt / src / demuxers / avi.rs
index 1e7a10fe57f495a314efe107b3f7e74a9da64ae8..d29ff45fbb3244caa58cbfa0c96deaad95467ce8 100644 (file)
@@ -243,7 +243,7 @@ impl<'a> DemuxCore<'a> for AVIDemuxer<'a> {
         }
         if seek_info.pos < self.movi_pos { return Err(DemuxerError::SeekError); }
         let skip_size = (seek_info.pos - self.movi_pos) as usize;
-        if skip_size > self.movi_size { return Err(DemuxerError::SeekError); }
+        if skip_size > self.movi_orig { return Err(DemuxerError::SeekError); }
         self.movi_size = self.movi_orig - skip_size;
 
         self.cur_frame[seek_info.str_id as usize] = seek_info.pts;
@@ -429,6 +429,7 @@ impl<'a> AVIDemuxer<'a> {
             if pe.stream_no == stream_no {
                 let start_clr           = self.src.read_byte()? as usize;
                 let len                 = self.src.read_byte()? as usize;
+                let len = if len == 0 { 256 } else { len };
                 let _flags              = self.src.read_u16le()?;
                 validate!(start_clr + len <= 256);
                 validate!(len * 4 + 4 == size);
@@ -502,6 +503,7 @@ const CHUNKS: &[RIFFParser] = &[
     RIFFParser { tag: RIFFTag::Chunk(mktag!(b"indx")), parse: parse_indx },
     RIFFParser { tag: RIFFTag::Chunk(mktag!(b"JUNK")), parse: parse_junk },
     RIFFParser { tag: RIFFTag::List(mktag!(b"LIST"), mktag!(b"odml")), parse: parse_odml },
+    RIFFParser { tag: RIFFTag::List(mktag!(b"LIST"), mktag!(b"rec ")), parse: parse_rec },
 ];
 
 fn is_list_tag(tag: u32) -> bool {
@@ -530,6 +532,10 @@ fn parse_odml(dmx: &mut AVIDemuxer, _strmgr: &mut StreamManager, _size: usize) -
     Ok(0)
 }
 
+fn parse_rec(_dmx: &mut AVIDemuxer, _strmgr: &mut StreamManager, _size: usize) -> DemuxerResult<usize> {
+    Ok(0)
+}
+
 #[allow(unused_variables)]
 fn parse_strh(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize) -> DemuxerResult<usize> {
     if size < 0x38 { return Err(InvalidData); }
@@ -796,9 +802,9 @@ fn parse_idx1(src: &mut ByteReader, strmgr: &mut StreamManager, seek_idx: &mut S
         let stream_no = ((tag[0] - b'0') * 10 + (tag[1] - b'0')) as usize;
 
         if (flags & 0x10) != 0 {
-            if let Some(str) = strmgr.get_stream(stream_no) {
-                if str.get_media_type() == StreamType::Video {
-                    let (tb_num, tb_den) = str.get_timebase();
+            if let Some(stream) = strmgr.get_stream(stream_no) {
+                if stream.get_media_type() == StreamType::Video {
+                    let (tb_num, tb_den) = stream.get_timebase();
                     let pts = counter[stream_no];
                     let time = NATimeInfo::ts_to_time(pts, 1000, tb_num, tb_den);
                     validate!(offset >= movi_pos);