X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-game%2Fsrc%2Fdemuxers%2Fvmd.rs;h=a2c93f6d5dc6496dda7f92d0ddadc37ff4084c1e;hp=9c14f6956ac9721b2fb4da86c513c6ccb7ef8850;hb=a480a0de101483d802a11e72d758dae00fa4860a;hpb=5563dfce398cba4a9048ce811005ff65c36f0388 diff --git a/nihav-game/src/demuxers/vmd.rs b/nihav-game/src/demuxers/vmd.rs index 9c14f69..a2c93f6 100644 --- a/nihav-game/src/demuxers/vmd.rs +++ b/nihav-game/src/demuxers/vmd.rs @@ -26,6 +26,7 @@ struct VMDDemuxer<'a> { aud_id: usize, fno: usize, is_indeo: bool, + is_lhaud: bool, frames: Vec, } @@ -60,7 +61,7 @@ impl<'a> DemuxCore<'a> for VMDDemuxer<'a> { let vhdr = NAVideoInfo::new(width, height, false, PAL8_FORMAT); let vci = NACodecTypeInfo::Video(vhdr); let vinfo = NACodecInfo::new(if !self.is_indeo { "vmd-video" } else { "indeo3" }, vci, Some(edata)); - 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, nframes as u64)).unwrap(); let is_ext_audio = (hdr_size & 0xF) == 4; let ext_audio_id = if is_ext_audio { @@ -68,6 +69,7 @@ impl<'a> DemuxCore<'a> for VMDDemuxer<'a> { } else { 0 }; if is_ext_audio { validate!(ext_audio_id >= 3 && ext_audio_id <= 6); + self.is_lhaud = true; } let srate = u32::from(read_u16le(&header[804..])?); let block_size; @@ -89,10 +91,16 @@ impl<'a> DemuxCore<'a> for VMDDemuxer<'a> { let ac_name = if !is_ext_audio { "vmd-audio" } else { - "unknown" + match ext_audio_id { + 3 => "lhst15f8", + 4 => "lhst500f22", + 5 => "lhst250f11", + 6 => "lhst48", + _ => "unknown", + } }; let ainfo = NACodecInfo::new(ac_name, NACodecTypeInfo::Audio(ahdr), Some(aedata)); - self.aud_id = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, 1, srate)).unwrap(); + self.aud_id = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, 1, srate, 0)).unwrap(); } else { block_size = 0; } @@ -152,7 +160,7 @@ impl<'a> DemuxCore<'a> for VMDDemuxer<'a> { let is_video = cur_frame.chtype == CHTYPE_VIDEO; let mut buf: Vec = Vec::with_capacity(FRAME_HDR_SIZE + (cur_frame.size as usize)); - if !self.is_indeo || !is_video { + if !((is_video && self.is_indeo) || (!is_video && self.is_lhaud)) { buf.extend_from_slice(&cur_frame.hdr); buf.resize(FRAME_HDR_SIZE + (cur_frame.size as usize), 0); self.src.read_buf(&mut buf[FRAME_HDR_SIZE..])?; @@ -172,9 +180,17 @@ impl<'a> DemuxCore<'a> for VMDDemuxer<'a> { Ok(pkt) } - fn seek(&mut self, _time: u64, _seek_index: &SeekIndex) -> DemuxerResult<()> { + fn seek(&mut self, _time: NATimePoint, _seek_index: &SeekIndex) -> DemuxerResult<()> { Err(DemuxerError::NotPossible) } + + fn get_duration(&self) -> u64 { 0 } +} + +impl<'a> NAOptionHandler for VMDDemuxer<'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> VMDDemuxer<'a> { @@ -185,6 +201,7 @@ impl<'a> VMDDemuxer<'a> { aud_id: 0, fno: 0, is_indeo: false, + is_lhaud: false, frames: Vec::new(), } }