use NATimePoint for seeking
[nihav.git] / nihav-rad / src / demuxers / smacker.rs
index 902be430fa7aef8915e4b10e39a3fd1a0e62182f..6d1173cc2b6350abad16c8397fb849f03244bd44 100644 (file)
@@ -95,6 +95,7 @@ fn get_pts_inc(val: i32) -> u64 {
 }
 
 impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> {
+    #[allow(clippy::unreadable_literal)]
     fn open(&mut self, strmgr: &mut StreamManager, _seek_idx: &mut SeekIndex) -> DemuxerResult<()> {
         let src = &mut self.src;
         let mut magic: [u8; 4] = [0; 4];
@@ -161,9 +162,11 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> {
         self.start = src.tell();
         self.cur_frame = 0;
         self.reset_state();
-        
+
         Ok(())
     }
+    #[allow(clippy::identity_op)]
+    #[allow(clippy::unreadable_literal)]
     fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> {
         if !self.queued_packets.is_empty() {
             let pkt = self.queued_packets.pop().unwrap();
@@ -213,11 +216,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();
@@ -245,8 +251,13 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> {
 
         Ok(pkt)
     }
-    fn seek(&mut self, time: u64, _seek_idx: &SeekIndex) -> DemuxerResult<()> {
-        if time == 0 {
+    fn seek(&mut self, time: NATimePoint, _seek_idx: &SeekIndex) -> DemuxerResult<()> {
+        let seek_to_start = match time {
+                NATimePoint::Milliseconds(0) => true,
+                NATimePoint::PTS(0) => true,
+                _ => false,
+            };
+        if seek_to_start {
             let start = self.start;
             self.src.seek(SeekFrom::Start(start))?;
             self.cur_frame = 0;
@@ -258,6 +269,12 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> {
     }
 }
 
+impl<'a> NAOptionHandler for SmackerVideoDemuxer<'a> {
+    fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
+    fn set_options(&mut self, _options: &[NAOption]) { }
+    fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
+}
+
 impl<'a> SmackerVideoDemuxer<'a> {
     fn new(io: &'a mut ByteReader<'a>) -> Self {
         SmackerVideoDemuxer {
@@ -304,7 +321,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 {