]> git.nihav.org Git - nihav.git/blobdiff - nihav-commonfmt/src/demuxers/avi.rs
avi: correct offsets in idx1 chunks if required
[nihav.git] / nihav-commonfmt / src / demuxers / avi.rs
index 71cdb01d7d3ef80e781ca7461bb624c35ccd4430..a5e52a7d3c429649111a9af6f6dc9fafda3e0cae 100644 (file)
@@ -135,7 +135,7 @@ impl<'a> DemuxCore<'a> for AVIDemuxer<'a> {
         }
     }
 
-    fn seek(&mut self, time: u64, seek_index: &SeekIndex) -> DemuxerResult<()> {
+    fn seek(&mut self, time: NATimePoint, seek_index: &SeekIndex) -> DemuxerResult<()> {
         let ret = seek_index.find_pos(time);
         if ret.is_none() {
             return Err(DemuxerError::SeekError);
@@ -457,7 +457,7 @@ fn parse_strf_auds(dmx: &mut AVIDemuxer, strmgr: &mut StreamManager, size: usize
     let ahdr = NAAudioInfo::new(samplespersec, channels as u8, soniton, block_align as usize);
     let edata = if size > 16 {
             let edata_size  = dmx.src.read_u16le()? as usize;
-            validate!(edata_size + 18 == size);
+            validate!(edata_size + 18 <= size);
             dmx.read_extradata(size - 18)?
         } else {
             None
@@ -517,12 +517,21 @@ fn parse_idx1(src: &mut ByteReader, strmgr: &mut StreamManager, seek_idx: &mut S
     let mut tag = [0u8; 4];
     let num_entries = size >> 4;
     let mut counter = [0u64; 100];
+    let mut add_offset = 0;
+    let mut set_offset = false;
     for _ in 0..num_entries {
                               src.read_buf(&mut tag)?;
         let flags           = src.read_u32le()?;
-        let offset          = src.read_u32le()? as u64;
+        let mut offset      = src.read_u32le()? as u64;
         let _length         = src.read_u32le()?;
 
+        if !set_offset && offset < movi_pos {
+            add_offset = movi_pos - offset;
+        }
+        set_offset = true;
+
+        offset += add_offset;
+
         if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' {
             return Err(InvalidData);
         }