]> git.nihav.org Git - nihav.git/blobdiff - nihav-game/src/codecs/vmd.rs
avimux: do not record palette change chunks in OpenDML index
[nihav.git] / nihav-game / src / codecs / vmd.rs
index e05899de67f2e4fe93feadcfa7825538e3021cb3..06cc63ba577d4641458ca37bdc4723a91865b86f 100644 (file)
@@ -220,16 +220,15 @@ impl VMDVideoDecoder {
         let dpos = (frame_x - self.xoff) * bpp + (frame_y - self.yoff) * stride;
 
         let method                              = br.read_byte()?;
-        let is_intra;
-        if (method & 0x80) != 0 {
-            validate!(!self.buf.is_empty());
-            lz_unpack(br, &mut self.buf)?;
-            let mut mr = MemoryReader::new_read(&self.buf);
-            let mut buf_br = ByteReader::new(&mut mr);
-            is_intra = decode_frame_data(&mut buf_br, &mut self.framebuf, dpos, stride, w, h, method & 0x7F)?;
-        } else {
-            is_intra = decode_frame_data(br, &mut self.framebuf, dpos, stride, w, h, method & 0x7F)?;
-        }
+        let is_intra = if (method & 0x80) != 0 {
+                validate!(!self.buf.is_empty());
+                lz_unpack(br, &mut self.buf)?;
+                let mut mr = MemoryReader::new_read(&self.buf);
+                let mut buf_br = ByteReader::new(&mut mr);
+                decode_frame_data(&mut buf_br, &mut self.framebuf, dpos, stride, w, h, method & 0x7F)?
+            } else {
+                decode_frame_data(br, &mut self.framebuf, dpos, stride, w, h, method & 0x7F)?
+            };
         Ok(is_intra && frame_x == 0 && frame_y == 0 && w == self.width && h == self.height)
     }
 }
@@ -308,10 +307,10 @@ impl NADecoder for VMDVideoDecoder {
             let paloff = buf.get_offset(1);
             let data = buf.get_data_mut().unwrap();
             for (inrow, outrow) in self.framebuf.chunks(self.width).zip(data.chunks_mut(stride)) {
-                (&mut outrow[..self.width]).copy_from_slice(inrow);
+                outrow[..self.width].copy_from_slice(inrow);
             }
             if !self.is_24bit {
-                (&mut data[paloff..][..768]).copy_from_slice(&self.pal);
+                data[paloff..][..768].copy_from_slice(&self.pal);
             }
             videobuf = if !self.is_24bit { NABufferType::Video(buf) } else { NABufferType::VideoPacked(buf) };
         } else {
@@ -519,8 +518,8 @@ impl NADecoder for VMDAudioDecoder {
                 VMDAudioMode::DPCM => {
                     let mut adata = abuf.get_abuf_i16().unwrap();
                     let off1 = adata.get_offset(1);
-                    let mut dst = adata.get_data_mut().unwrap();
-                    self.decode_16bit(&mut dst, off1, &mut br, nblocks, mask)?;
+                    let dst = adata.get_data_mut().unwrap();
+                    self.decode_16bit(dst, off1, &mut br, nblocks, mask)?;
                 },
                 VMDAudioMode::U8 => {
                     let mut adata = abuf.get_abuf_u8().unwrap();
@@ -692,6 +691,7 @@ mod test {
     use nihav_codec_support::test::dec_video::*;
     use crate::game_register_all_decoders;
     use crate::game_register_all_demuxers;
+    // samples from https://samples.mplayerhq.hu/game-formats/sierra-vmd/ and various games
     #[test]
     fn test_vmd_video() {
         let mut dmx_reg = RegisteredDemuxers::new();
@@ -699,7 +699,7 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         game_register_all_decoders(&mut dec_reg);
 
-        test_decoding("vmd", "vmd-video", "assets/Game/2832.VMD", Some(10), &dmx_reg, &dec_reg,
+        test_decoding("vmd", "vmd-video", "assets/Game/sierra/2832.VMD", Some(10), &dmx_reg, &dec_reg,
                       ExpectedTestResult::MD5Frames(vec![
                             [0xd29e0214, 0xf38ad154, 0xccbd381f, 0x3de1109c],
                             [0x904074eb, 0x202b1d6f, 0xe3f68538, 0xf0db641c],
@@ -720,7 +720,7 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         game_register_all_decoders(&mut dec_reg);
 
-        test_decoding("vmd", "vmd-video", "assets/Game/HLP1000.VMD", Some(10), &dmx_reg, &dec_reg,
+        test_decoding("vmd", "vmd-video", "assets/Game/sierra/HLP1000.VMD", Some(10), &dmx_reg, &dec_reg,
                       ExpectedTestResult::MD5Frames(vec![
                             [0x03d77d51, 0x8670ae24, 0x86184cc8, 0x9c928700],
                             [0xf4796f1b, 0x0f75a120, 0x62056509, 0xc83f1a2c],
@@ -736,7 +736,7 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         game_register_all_decoders(&mut dec_reg);
 
-        test_decoding("vmd", "vmd-video", "assets/Game/02C.VMD", None, &dmx_reg, &dec_reg,
+        test_decoding("vmd", "vmd-video", "assets/Game/sierra/02C.VMD", None, &dmx_reg, &dec_reg,
                       ExpectedTestResult::MD5([0xb580782c, 0xd7fb98c0, 0xaf9b83cc, 0xaea0846b]));
     }
     #[test]
@@ -746,7 +746,7 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         game_register_all_decoders(&mut dec_reg);
 
-        test_decoding("vmd", "vmd-audio", "assets/Game/1491.VMD", None, &dmx_reg, &dec_reg,
+        test_decoding("vmd", "vmd-audio", "assets/Game/sierra/1491.VMD", None, &dmx_reg, &dec_reg,
                       ExpectedTestResult::MD5([0x75037601, 0xbc7b3976, 0x6e1c948b, 0xf05a3d6c]));
     }
     #[test]
@@ -756,7 +756,7 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         game_register_all_decoders(&mut dec_reg);
 
-        test_decoding("vmd", "vmd-audio", "assets/Game/2832.VMD", None, &dmx_reg, &dec_reg,
+        test_decoding("vmd", "vmd-audio", "assets/Game/sierra/2832.VMD", None, &dmx_reg, &dec_reg,
                       ExpectedTestResult::MD5([0x32dcdf0e, 0xee058684, 0x43ed5bf1, 0x2ff18b5a]));
     }
     #[test]
@@ -766,7 +766,7 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         game_register_all_decoders(&mut dec_reg);
 
-        test_decoding("vmd", "vmd-audio", "assets/Game/1000.VMD", None, &dmx_reg, &dec_reg,
+        test_decoding("vmd", "vmd-audio", "assets/Game/sierra/1000.VMD", None, &dmx_reg, &dec_reg,
                       ExpectedTestResult::MD5([0xc36215d3, 0x96530a80, 0x89f1fa8e, 0x49da302b]));
     }
     #[test]
@@ -776,7 +776,7 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         game_register_all_decoders(&mut dec_reg);
 
-        test_decoding("vmd", "vmd-audio", "assets/Game/HLP1000.VMD", None, &dmx_reg, &dec_reg,
+        test_decoding("vmd", "vmd-audio", "assets/Game/sierra/HLP1000.VMD", None, &dmx_reg, &dec_reg,
                       ExpectedTestResult::MD5([0x76a00405, 0xe4e5378d, 0x495b2a68, 0x4dffe042]));
     }
 }