]> git.nihav.org Git - nihav.git/blobdiff - nihav-game/src/demuxers/vmd.rs
avimux: do not record palette change chunks in OpenDML index
[nihav.git] / nihav-game / src / demuxers / vmd.rs
index a2c93f6d5dc6496dda7f92d0ddadc37ff4084c1e..4e85dea17d594d8f13c4680f92c01a10ee5d29ef 100644 (file)
@@ -31,7 +31,6 @@ struct VMDDemuxer<'a> {
 }
 
 impl<'a> DemuxCore<'a> for VMDDemuxer<'a> {
-    #[allow(unused_variables)]
     fn open(&mut self, strmgr: &mut StreamManager, _seek_index: &mut SeekIndex) -> DemuxerResult<()> {
         let src = &mut self.src;
 
@@ -46,7 +45,7 @@ impl<'a> DemuxCore<'a> for VMDDemuxer<'a> {
 
         let mut width  = read_u16le(&header[12..])? as usize;
         let mut height = read_u16le(&header[14..])? as usize;
-        self.is_indeo = &header[24..27] == b"iv3";
+        self.is_indeo = &header[24..27] == b"iv3" || &header[24..27] == b"IV3";
         if self.is_indeo && width > 320 {
             width  >>= 1;
             height >>= 1;
@@ -68,7 +67,7 @@ impl<'a> DemuxCore<'a> for VMDDemuxer<'a> {
                                                 src.read_u16le()?
             } else { 0 };
         if is_ext_audio {
-            validate!(ext_audio_id >= 3 && ext_audio_id <= 6);
+            validate!((3..=6).contains(&ext_audio_id));
             self.is_lhaud = true;
         }
         let srate = u32::from(read_u16le(&header[804..])?);
@@ -109,15 +108,15 @@ impl<'a> DemuxCore<'a> for VMDDemuxer<'a> {
         let idx_off = u64::from(read_u32le(&header[812..])?);
                                                 src.seek(SeekFrom::Start(idx_off))?;
         let mut offs: Vec<u32> = Vec::with_capacity(nframes);
-        for i in 0..nframes {
+        for _ in 0..nframes {
             let _flags                          = src.read_u16le()?;
             let off                             = src.read_u32le()?;
             offs.push(off);
         }
         self.frames.reserve(nframes * fpb);
         let mut ats = adelay;
-        for i in 0..nframes {
-            let mut off = offs[i];
+        for (i, &offset) in offs.iter().enumerate() {
+            let mut off = offset;
             for _ in 0..fpb {
                 let chtype                      = src.read_byte()?;
                                                   src.read_skip(1)?;
@@ -172,10 +171,9 @@ impl<'a> DemuxCore<'a> for VMDDemuxer<'a> {
         self.fno += 1;
 
         let str_id = if is_video { self.vid_id } else { self.aud_id };
-        let str = strmgr.get_stream(str_id).unwrap();
-        let (tb_num, tb_den) = str.get_timebase();
-        let ts = NATimeInfo::new(Some(u64::from(cur_frame.ts)), None, None, tb_num, tb_den);
-        let pkt = NAPacket::new(str, ts, false, buf);
+        let stream = strmgr.get_stream(str_id).unwrap();
+        let ts = stream.make_ts(Some(u64::from(cur_frame.ts)), None, None);
+        let pkt = NAPacket::new(stream, ts, false, buf);
 
         Ok(pkt)
     }
@@ -223,7 +221,8 @@ mod test {
 
     #[test]
     fn test_vmd_demux() {
-        let mut file = File::open("assets/Game/128.vmd").unwrap();
+        // sample: https://samples.mplayerhq.hu/game-formats/sierra-vmd/Lighthouse/128.vmd
+        let mut file = File::open("assets/Game/sierra/128.vmd").unwrap();
         //let mut file = File::open("assets/Game/1491.VMD").unwrap();
         let mut fr = FileReader::new_read(&mut file);
         let mut br = ByteReader::new(&mut fr);