smkdemux: ignore unknown audio streams with payload being present
[nihav.git] / nihav-rad / src / demuxers / smacker.rs
index 902be430fa7aef8915e4b10e39a3fd1a0e62182f..3fb1a6ee5963d67ad038a166c3bbb98b35b23ed5 100644 (file)
@@ -161,7 +161,7 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> {
         self.start = src.tell();
         self.cur_frame = 0;
         self.reset_state();
-        
+
         Ok(())
     }
     fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> {
@@ -213,11 +213,14 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> {
         let ts = NATimeInfo::new(Some(self.cur_pts), None, None, 1, 100000);
         for i in 0..NUM_AUDIO_TRACKS {
             if ((frame_flags >> (i + 1)) & 1) == 0 { continue; }
-            validate!(self.ainfo[i].is_present());
             let size                            = self.src.read_u32le()? as usize;
             validate!(size > 4);
             validate!(payload_size >= size);
             payload_size -= size;
+            if !self.ainfo[i].is_present() {
+                self.src.read_skip(size - 4)?;
+                continue;
+            }
             let strres = strmgr.get_stream(self.ainfo[i].id);
             validate!(strres.is_some());
             let stream = strres.unwrap();
@@ -304,7 +307,8 @@ mod test {
         let mut br = ByteReader::new(&mut fr);
         let mut dmx = SmackerVideoDemuxer::new(&mut br);
         let mut sm = StreamManager::new();
-        dmx.open(&mut sm).unwrap();
+        let mut si = SeekIndex::new();
+        dmx.open(&mut sm, &mut si).unwrap();
         loop {
             let pktres = dmx.get_frame(&mut sm);
             if let Err(e) = pktres {