introduce stream and container duration
[nihav.git] / nihav-rad / src / demuxers / bink.rs
index e83f12333ccce44a6a47ef5323886502cd72f8a5..83da6acaebcb95643070ae21d027b969dc2ded1b 100644 (file)
@@ -9,7 +9,7 @@ const BINK_AUD_FLAG_DCT:    u8 = 0x10;
 const BINK_AUD_FLAG_STEREO: u8 = 0x20;
 
 impl AudioTrack {
-    fn new(strmgr: &mut StreamManager, srate: u32, flags: u8, str_id: usize, magic: &[u8; 4]) -> DemuxerResult<Self> {
+    fn new(strmgr: &mut StreamManager, srate: u32, flags: u8, str_id: usize, magic: [u8; 4]) -> DemuxerResult<Self> {
         let channels = if (flags & BINK_AUD_FLAG_STEREO) != 0 { 2 } else { 1 };
         let codecname = if (flags & BINK_AUD_FLAG_DCT) != 0 {
                 "bink-audio-dct"
@@ -18,9 +18,9 @@ impl AudioTrack {
             };
         let ahdr = NAAudioInfo::new(srate, channels, SND_F32P_FORMAT, 1);
         let mut edata: Vec<u8> = Vec::with_capacity(4);
-        edata.extend_from_slice(magic);
+        edata.extend_from_slice(&magic);
         let ainfo = NACodecInfo::new(codecname, NACodecTypeInfo::Audio(ahdr), Some(edata));
-        let res = strmgr.add_stream(NAStream::new(StreamType::Audio, (str_id + 1) as u32, ainfo, 1, srate));
+        let res = strmgr.add_stream(NAStream::new(StreamType::Audio, (str_id + 1) as u32, ainfo, 1, srate, 0));
         validate!(res.is_some());
         let id = res.unwrap();
         Ok(Self{ id })
@@ -78,7 +78,7 @@ impl<'a> DemuxCore<'a> for BinkDemuxer<'a> {
         let vhdr = NAVideoInfo::new(width, height, false, YUV420_FORMAT);
         let codec = if magic[0] == b'K' && magic[1] == b'B' && magic[2] == b'2' { "bink2-video" } else { "bink-video" };
         let vinfo = NACodecInfo::new(codec, NACodecTypeInfo::Video(vhdr), Some(edata));
-        let res = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, self.tb_num, self.tb_den));
+        let res = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, self.tb_num, self.tb_den, self.frames as u64));
         validate!(res.is_some());
         self.video_id = res.unwrap();
 
@@ -93,7 +93,7 @@ impl<'a> DemuxCore<'a> for BinkDemuxer<'a> {
             let srate                       = src.read_u24le()?;
             let flags                       = src.read_byte()?;
             validate!(srate > 0);
-            self.ainfo.push(AudioTrack::new(strmgr, srate, flags, i, &magic)?);
+            self.ainfo.push(AudioTrack::new(strmgr, srate, flags, i, magic)?);
         }
         for _ in 0..num_audio {
             let _trk_id                     = src.read_u32le()?;
@@ -152,7 +152,7 @@ impl<'a> DemuxCore<'a> for BinkDemuxer<'a> {
 
         Ok(pkt)
     }
-    fn seek(&mut self, time: u64, seek_idx: &SeekIndex) -> DemuxerResult<()> {
+    fn seek(&mut self, time: NATimePoint, seek_idx: &SeekIndex) -> DemuxerResult<()> {
         let ret = seek_idx.find_pos(time);
         if ret.is_none() {
             return Err(DemuxerError::SeekError);
@@ -163,6 +163,13 @@ impl<'a> DemuxCore<'a> for BinkDemuxer<'a> {
         self.cur_frame = seek_info.pts as usize;
         Ok(())
     }
+    fn get_duration(&self) -> u64 { 0 }
+}
+
+impl<'a> NAOptionHandler for BinkDemuxer<'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> BinkDemuxer<'a> {