]> git.nihav.org Git - nihav.git/blobdiff - nihav-game/src/codecs/vmd.rs
vmdaudio: fix u8 silent blocks value
[nihav.git] / nihav-game / src / codecs / vmd.rs
index a11e26c0f0df12f93f322f44ea66ec43db558337..f260f9b77598ef69ef3a91faefca9a2869b6ede0 100644 (file)
@@ -1,5 +1,6 @@
 use nihav_core::codecs::*;
 use nihav_core::io::byteio::*;
+use nihav_codec_support::codecs::HAMShuffler;
 use std::str::FromStr;
 
 macro_rules! lz_op {
@@ -142,7 +143,7 @@ fn decode_frame_data(br: &mut ByteReader, dst: &mut [u8], mut dpos: usize, strid
             }
             Ok(false)
         },
-        _ => return Err(DecoderError::InvalidData),
+        _ => Err(DecoderError::InvalidData),
     }
 }
 
@@ -179,6 +180,9 @@ impl VMDVideoDecoder {
                                                   br.read_skip(1)?;
         let flags                               = br.read_byte()?;
         let has_pal = (flags & 0x02) != 0;
+        if (frame_x == 0xFFFF) && (frame_y == 0xFFFF) && (frame_l == 0xFFFF) && (frame_d == 0xFFFF) {
+            return Ok(false);
+        }
         validate!(frame_l >= frame_x && frame_d >= frame_y);
         validate!(frame_l < self.width && frame_d < self.height);
 
@@ -202,7 +206,7 @@ impl VMDVideoDecoder {
         let method                              = br.read_byte()?;
         let is_intra;
         if (method & 0x80) != 0 {
-            validate!(self.buf.len() > 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);
@@ -251,9 +255,7 @@ impl NADecoder for VMDVideoDecoder {
         if let Some(bbuf) = bufret {
             buf = bbuf;
         } else {
-            let bufret = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 4);
-            if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
-            let bufinfo = bufret.unwrap();
+            let bufinfo = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 4)?;
             buf = bufinfo.get_vbuf().unwrap();
             self.hams.add_frame(buf);
             buf = self.hams.get_output_frame().unwrap();
@@ -266,10 +268,13 @@ impl NADecoder for VMDVideoDecoder {
         frm.set_frame_type(if is_intra { FrameType::I } else { FrameType::P });
         Ok(frm.into_ref())
     }
+    fn flush(&mut self) {
+        self.hams.clear();
+    }
 }
 
 
-pub fn get_decoder_video() -> Box<NADecoder> {
+pub fn get_decoder_video() -> Box<dyn NADecoder + Send> {
     Box::new(VMDVideoDecoder::new())
 }
 
@@ -324,7 +329,7 @@ impl VMDAudioDecoder {
             } else {
                 let mut pred: [i32; 2] = [0; 2];
                 for ch in 0..channels {
-                    pred[ch]                        = br.read_u16le()? as i32;
+                    pred[ch]                        = i32::from(br.read_u16le()?);
                     dst[off[ch]] = pred[ch] as i16;
                     off[ch] += 1;
                 }
@@ -333,9 +338,9 @@ impl VMDAudioDecoder {
                 for _ in channels..self.blk_align*channels {
                     let b                           = br.read_byte()? as usize;
                     if (b & 0x80) != 0 {
-                        pred[ch] -= SOL_AUD_STEPS16[b & 0x7F] as i32;
+                        pred[ch] -= i32::from(SOL_AUD_STEPS16[b & 0x7F]);
                     } else {
-                        pred[ch] += SOL_AUD_STEPS16[b & 0x7F] as i32;
+                        pred[ch] += i32::from(SOL_AUD_STEPS16[b & 0x7F]);
                     }
                     //pred[ch] = pred[ch].max(-32768).min(32767);
                     dst[off[ch]] = pred[ch] as i16;
@@ -409,7 +414,7 @@ impl NADecoder for VMDAudioDecoder {
                 for _ in 0..nblocks {
                     if (mask & 1) != 0 {
                         for i in 0..self.blk_align * channels {
-                            dst[doff + i] = 0;
+                            dst[doff + i] = 128;
                         }
                     } else if channels == 1 {
                         for i in 0..self.blk_size {
@@ -438,9 +443,11 @@ impl NADecoder for VMDAudioDecoder {
             Err(DecoderError::InvalidData)
         }
     }
+    fn flush(&mut self) {
+    }
 }
 
-pub fn get_decoder_audio() -> Box<NADecoder> {
+pub fn get_decoder_audio() -> Box<dyn NADecoder + Send> {
     Box::new(VMDAudioDecoder::new())
 }
 
@@ -448,9 +455,9 @@ pub fn get_decoder_audio() -> Box<NADecoder> {
 mod test {
     use nihav_core::codecs::RegisteredDecoders;
     use nihav_core::demuxers::RegisteredDemuxers;
-    use nihav_core::test::dec_video::*;
-    use crate::codecs::game_register_all_codecs;
-    use crate::demuxers::game_register_all_demuxers;
+    use nihav_codec_support::test::dec_video::*;
+    use crate::game_register_all_codecs;
+    use crate::game_register_all_demuxers;
     #[test]
     fn test_vmd_video() {
         let mut dmx_reg = RegisteredDemuxers::new();
@@ -473,6 +480,6 @@ mod test {
         let file = "assets/Game/128.vmd";
 //        let file = "assets/Game/1000.VMD";
 //        let file = "assets/Game/235.VMD";
-        test_decode_audio("vmd", file, None, "vmd", &dmx_reg, &dec_reg);
+        test_decode_audio("vmd", file, None, None/*Some("vmd")*/, &dmx_reg, &dec_reg);
     }
 }