introduce stream and container duration
[nihav.git] / nihav-rad / src / demuxers / smacker.rs
index 41cad05e853d5bd3527b3d8da737bff660fb40bc..340af85989617c928cc968dce3b09498d2da7315 100644 (file)
@@ -56,7 +56,7 @@ impl AudioTrack {
         let soniton = if (self.flags & SMK_AUD_FLAG_16BIT) != 0 { SND_S16_FORMAT } else { SND_U8_FORMAT };
         let ahdr = NAAudioInfo::new(self.srate, channels, soniton, 1);
         let ainfo = NACodecInfo::new(codecname, NACodecTypeInfo::Audio(ahdr), None);
-        let res = strmgr.add_stream(NAStream::new(StreamType::Audio, (str_id + 1) as u32, ainfo, 1, self.srate));
+        let res = strmgr.add_stream(NAStream::new(StreamType::Audio, (str_id + 1) as u32, ainfo, 1, self.srate, 0));
         validate!(res.is_some());
         self.id = res.unwrap();
 
@@ -90,11 +90,12 @@ struct SmackerVideoDemuxer<'a> {
 
 fn get_pts_inc(val: i32) -> u64 {
     if val > 0 { (val as u64) * 100 }
-    else if val < 0 { (-val as u64) }
+    else if val < 0 { -val as u64 }
     else { 1 }
 }
 
 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];
@@ -148,7 +149,7 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> {
 
         let vhdr = NAVideoInfo::new(width, height, false, PAL8_FORMAT);
         let vinfo = NACodecInfo::new("smacker-video", NACodecTypeInfo::Video(vhdr), Some(treedata));
-        let res = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, 1, 100000));
+        let res = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, 1, 100000, 0));
         validate!(res.is_some());
         self.video_id = res.unwrap();
 
@@ -164,6 +165,8 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> {
 
         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();
@@ -248,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;
@@ -259,6 +267,7 @@ impl<'a> DemuxCore<'a> for SmackerVideoDemuxer<'a> {
         }
         Err(DemuxerError::NotImplemented)
     }
+    fn get_duration(&self) -> u64 { self.frames as u64 * self.pts_inc / 100 }
 }
 
 impl<'a> NAOptionHandler for SmackerVideoDemuxer<'a> {