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"
};
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 })
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();
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()?;
seek_idx.seek_info[0].filled = true;
self.cur_frame = 0;
-
+
Ok(())
}
fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<NAPacket> {
let stream = strres.unwrap();
let keyframe = (self.frame_pos[self.cur_frame] & 1) != 0;
let ts = NATimeInfo::new(Some(self.cur_frame as u64), None, None, self.tb_num, self.tb_den);
- let pkt = self.src.read_packet(stream.clone(), ts, keyframe, payload_size)?;
+ let pkt = self.src.read_packet(stream, ts, keyframe, payload_size)?;
self.cur_frame += 1;
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);
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> {