]> git.nihav.org Git - nihav.git/blobdiff - src/demuxers/avi.rs
avi: skip LISTs inside movi data
[nihav.git] / src / demuxers / avi.rs
index 2a3f8f0bb49fc3f84680c7002d4139b5794b1386..4be5217d2cffbf59839947d73aecefec84d595b5 100644 (file)
@@ -81,6 +81,7 @@ impl<'a> Demux<'a> for AVIDemuxer<'a> {
             if (self.src.tell() & 1) == 1 {
                 self.src.read_skip(1)?;
                 self.movi_size -= 1;
+                if self.movi_size == 0 { return Err(EOF); }
             }
             self.src.read_buf(&mut tag)?;
             let size = self.src.read_u32le()? as usize;
@@ -89,6 +90,12 @@ impl<'a> Demux<'a> for AVIDemuxer<'a> {
                 self.src.read_skip(size)?;
                 continue;
             }
+            if mktag!(tag) == mktag!(b"LIST") {
+                self.movi_size -= 12;
+                self.src.read_skip(4)?;
+                if self.movi_size == 0 { return Err(EOF); }
+                continue;
+            }
             if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' {
                 return Err(InvalidData);
             }
@@ -139,7 +146,8 @@ impl<'a> AVIDemuxer<'a> {
         if RIFFTag::Chunk(tag) == end_tag {
             return Ok((size, true));
         }
-        let ltag = if is_list_tag(tag) { self.src.read_u32be()? } else { 0 };
+        let is_list = is_list_tag(tag);
+        let ltag = if is_list { self.src.read_u32be()? } else { 0 };
         if RIFFTag::List(tag, ltag) == end_tag {
             return Ok((size, true));
         }
@@ -170,7 +178,12 @@ impl<'a> AVIDemuxer<'a> {
                 return Ok((size + 8, false));
             }
         }
-        self.src.read_skip(size)?;
+        if !is_list {
+            self.src.read_skip(size)?;
+        } else {
+            if size < 4 { return Err(InvalidData); }
+            self.src.read_skip(size - 4)?;
+        }
         if (size & 1) == 1 { self.src.read_skip(1)?; }
         return Ok((size + 8, false));
     }
@@ -322,7 +335,7 @@ fn parse_strf_auds(dmx: &mut AVIDemuxer, size: usize) -> DemuxerResult<usize> {
     let samplespersec       = dmx.src.read_u32le()?;
     let avgbytespersec      = dmx.src.read_u32le()?;
     let block_align         = dmx.src.read_u16le()?;
-    let bits_per_sample     = dmx.src.read_u16le()?;
+    let bits_per_sample     = dmx.src.read_u16le()? * 8;
 
     let soniton = NASoniton::new(bits_per_sample as u8, SONITON_FLAG_SIGNED);
     let ahdr = NAAudioInfo::new(samplespersec, channels as u8, soniton, block_align as usize);