X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-game%2Fsrc%2Fdemuxers%2Fbmv.rs;h=700c8d07f2fd0620b03887b45fa8b33ec976d897;hb=8e14efb001fac3fecb0cb56df8705d23fa2231a8;hp=7553a94865b96b60479e744711c278a41f9919b2;hpb=ecda1cc1266117b3bb8669b06185d2e15a265ebe;p=nihav.git diff --git a/nihav-game/src/demuxers/bmv.rs b/nihav-game/src/demuxers/bmv.rs index 7553a94..700c8d0 100644 --- a/nihav-game/src/demuxers/bmv.rs +++ b/nihav-game/src/demuxers/bmv.rs @@ -12,17 +12,17 @@ struct BMVDemuxer<'a> { impl<'a> DemuxCore<'a> for BMVDemuxer<'a> { #[allow(unused_variables)] - fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> { + fn open(&mut self, strmgr: &mut StreamManager, _seek_index: &mut SeekIndex) -> DemuxerResult<()> { let src = &mut self.src; let vhdr = NAVideoInfo::new(640, 429, false, PAL8_FORMAT); let vci = NACodecTypeInfo::Video(vhdr); let vinfo = NACodecInfo::new("bmv-video", vci, None); - self.vid_id = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, 1, 12)).unwrap(); + self.vid_id = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, 1, 12, 0)).unwrap(); let ahdr = NAAudioInfo::new(22050, 2, SND_S16_FORMAT, 1); let ainfo = NACodecInfo::new("bmv-audio", NACodecTypeInfo::Audio(ahdr), None); - self.aud_id = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, 1, 22050)).unwrap(); + self.aud_id = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, 1, 22050, 0)).unwrap(); self.vpos = 0; self.apos = 0; @@ -30,7 +30,7 @@ impl<'a> DemuxCore<'a> for BMVDemuxer<'a> { } fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult { - if self.pkt_buf.len() > 0 { + if !self.pkt_buf.is_empty() { return Ok(self.pkt_buf.pop().unwrap()); } @@ -48,22 +48,19 @@ impl<'a> DemuxCore<'a> for BMVDemuxer<'a> { asize = (nblocks as usize) * 65 + 1; validate!(asize < size); let str = strmgr.get_stream(self.aud_id).unwrap(); - let (tb_num, tb_den) = str.get_timebase(); - let ts = NATimeInfo::new(Some(self.apos), None, None, tb_num, tb_den); + let ts = str.make_ts(Some(self.apos), None, None); let apkt = self.src.read_packet(str, ts, false, asize)?; - self.apos += (nblocks as u64) * 32; + self.apos += u64::from(nblocks) * 32; self.pkt_buf.push(apkt); } else { asize = 0; } - let mut buf: Vec = Vec::with_capacity(size - asize + 1); - buf.resize(size - asize + 1, 0); + let mut buf: Vec = vec![0; size - asize + 1]; buf[0] = ctype; self.src.read_buf(&mut buf[1..])?; let str = strmgr.get_stream(self.vid_id).unwrap(); - let (tb_num, tb_den) = str.get_timebase(); - let ts = NATimeInfo::new(Some(self.vpos), None, None, tb_num, tb_den); + let ts = str.make_ts(Some(self.vpos), None, None); let pkt = NAPacket::new(str, ts, (ctype & 3) == 3, buf); self.vpos += 1; @@ -71,10 +68,16 @@ impl<'a> DemuxCore<'a> for BMVDemuxer<'a> { } } - #[allow(unused_variables)] - fn seek(&mut self, time: u64) -> DemuxerResult<()> { - Err(DemuxerError::NotImplemented) + fn seek(&mut self, _time: NATimePoint, _seek_index: &SeekIndex) -> DemuxerResult<()> { + Err(DemuxerError::NotPossible) } + fn get_duration(&self) -> u64 { 0 } +} + +impl<'a> NAOptionHandler for BMVDemuxer<'a> { + fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } + fn set_options(&mut self, _options: &[NAOption]) { } + fn query_option_value(&self, _name: &str) -> Option { None } } impl<'a> BMVDemuxer<'a> { @@ -93,7 +96,7 @@ impl<'a> BMVDemuxer<'a> { pub struct BMVDemuxerCreator { } impl DemuxerCreator for BMVDemuxerCreator { - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { + fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { Box::new(BMVDemuxer::new(br)) } fn get_name(&self) -> &'static str { "bmv" } @@ -112,7 +115,8 @@ struct BMV3Demuxer<'a> { impl<'a> DemuxCore<'a> for BMV3Demuxer<'a> { #[allow(unused_variables)] - fn open(&mut self, strmgr: &mut StreamManager) -> DemuxerResult<()> { + #[allow(clippy::cast_lossless)] + fn open(&mut self, strmgr: &mut StreamManager, _seek_index: &mut SeekIndex) -> DemuxerResult<()> { let src = &mut self.src; let mut magic = [0u8; 4]; @@ -146,11 +150,11 @@ impl<'a> DemuxCore<'a> for BMV3Demuxer<'a> { let vhdr = NAVideoInfo::new(width, height, false, RGB565_FORMAT); let vci = NACodecTypeInfo::Video(vhdr); let vinfo = NACodecInfo::new("bmv3-video", vci, None); - self.vid_id = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, 256, fps)).unwrap(); + self.vid_id = strmgr.add_stream(NAStream::new(StreamType::Video, 0, vinfo, 256, fps, nframes as u64)).unwrap(); let ahdr = NAAudioInfo::new(22050, 2, SND_S16_FORMAT, audio_blob_size); let ainfo = NACodecInfo::new("bmv3-audio", NACodecTypeInfo::Audio(ahdr), None); - self.aud_id = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, 1, 22050)).unwrap(); + self.aud_id = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, 1, 22050, 0)).unwrap(); self.vpos = 0; self.apos = 0; @@ -158,7 +162,7 @@ impl<'a> DemuxCore<'a> for BMV3Demuxer<'a> { } fn get_frame(&mut self, strmgr: &mut StreamManager) -> DemuxerResult { - if self.pkt_buf.len() > 0 { + if !self.pkt_buf.is_empty() { return Ok(self.pkt_buf.pop().unwrap()); } @@ -178,14 +182,12 @@ impl<'a> DemuxCore<'a> for BMV3Demuxer<'a> { asize = self.asize; } validate!(asize <= size); - let mut buf: Vec = Vec::with_capacity(asize + 1); - buf.resize(asize + 1, 0); + let mut buf: Vec = vec![0; asize + 1]; buf[0] = (self.src.tell() & 1) as u8; self.src.read_buf(&mut buf[1..])?; let str = strmgr.get_stream(self.aud_id).unwrap(); - let (tb_num, tb_den) = str.get_timebase(); - let ts = NATimeInfo::new(Some(self.apos), None, None, tb_num, tb_den); + let ts = str.make_ts(Some(self.apos), None, None); let apkt = NAPacket::new(str, ts, false, buf); self.apos += (asize as u64) / 41 * 32; @@ -193,14 +195,19 @@ impl<'a> DemuxCore<'a> for BMV3Demuxer<'a> { } else { asize = 0; } - let mut buf: Vec = Vec::with_capacity(size - asize + 1); - buf.resize(size - asize + 1, 0); + if size == asize { + if !self.pkt_buf.is_empty() { + return Ok(self.pkt_buf.pop().unwrap()); + } else { + continue; + } + } + let mut buf: Vec = vec![0; size - asize + 1]; buf[0] = ctype; self.src.read_buf(&mut buf[1..])?; let str = strmgr.get_stream(self.vid_id).unwrap(); - let (tb_num, tb_den) = str.get_timebase(); - let ts = NATimeInfo::new(Some(self.vpos), None, None, tb_num, tb_den); + let ts = str.make_ts(Some(self.vpos), None, None); let pkt = NAPacket::new(str, ts, (ctype & 3) == 3, buf); self.vpos += 1; @@ -208,10 +215,16 @@ impl<'a> DemuxCore<'a> for BMV3Demuxer<'a> { } } - #[allow(unused_variables)] - fn seek(&mut self, time: u64) -> DemuxerResult<()> { - Err(DemuxerError::NotImplemented) + fn seek(&mut self, _time: NATimePoint, _seek_index: &SeekIndex) -> DemuxerResult<()> { + Err(DemuxerError::NotPossible) } + fn get_duration(&self) -> u64 { 0 } +} + +impl<'a> NAOptionHandler for BMV3Demuxer<'a> { + fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } + fn set_options(&mut self, _options: &[NAOption]) { } + fn query_option_value(&self, _name: &str) -> Option { None } } impl<'a> BMV3Demuxer<'a> { @@ -232,7 +245,7 @@ impl<'a> BMV3Demuxer<'a> { pub struct BMV3DemuxerCreator { } impl DemuxerCreator for BMV3DemuxerCreator { - fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { + fn new_demuxer<'a>(&self, br: &'a mut ByteReader<'a>) -> Box + 'a> { Box::new(BMV3Demuxer::new(br)) } fn get_name(&self) -> &'static str { "bmv3" } @@ -243,6 +256,7 @@ mod test { use super::*; use std::fs::File; + // samples from https://samples.mplayerhq.hu/game-formats/bmv #[test] fn test_bmv_demux() { let mut file = File::open("assets/Game/DW2-MOUSE.BMV").unwrap(); @@ -250,7 +264,8 @@ mod test { let mut br = ByteReader::new(&mut fr); let mut dmx = BMVDemuxer::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 { @@ -268,7 +283,8 @@ mod test { let mut br = ByteReader::new(&mut fr); let mut dmx = BMV3Demuxer::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 {