make all codec crates export just register_all functions and document them
[nihav.git] / nihav-game / src / codecs / vmd.rs
index c6d98aa2d52dcfc1b26967883372e971426f8005..1f4964e7d2d9f487ce2faf514fbec8f51ad2a5c3 100644 (file)
@@ -142,12 +142,12 @@ fn decode_frame_data(br: &mut ByteReader, dst: &mut [u8], mut dpos: usize, strid
             }
             Ok(false)
         },
-        _ => return Err(DecoderError::InvalidData),
+        _ => Err(DecoderError::InvalidData),
     }
 }
 
 struct VMDVideoDecoder {
-    info:       Rc<NACodecInfo>,
+    info:       NACodecInfoRef,
     pal:        [u8; 768],
     buf:        Vec<u8>,
     width:      usize,
@@ -158,7 +158,7 @@ struct VMDVideoDecoder {
 impl VMDVideoDecoder {
     fn new() -> Self {
         Self {
-            info:       Rc::new(NACodecInfo::default()),
+            info:       NACodecInfoRef::default(),
             pal:        [0; 768],
             buf:        Vec::new(),
             width:      0,
@@ -169,7 +169,7 @@ impl VMDVideoDecoder {
     fn decode_frame(&mut self, br: &mut ByteReader, buf: &mut NAVideoBuffer<u8>) -> DecoderResult<bool> {
         let paloff = buf.get_offset(1);
         let stride = buf.get_stride(0);
-        let mut data = buf.get_data_mut();
+        let data = buf.get_data_mut().unwrap();
         let dst = data.as_mut_slice();
 
         let frame_x                             = br.read_u16le()? as usize;
@@ -202,7 +202,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);
@@ -215,12 +215,12 @@ impl VMDVideoDecoder {
 }
 
 impl NADecoder for VMDVideoDecoder {
-    fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
+    fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
         if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
             self.width  = vinfo.get_width();
             self.height = vinfo.get_height();
             let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(self.width, self.height, false, PAL8_FORMAT));
-            self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
+            self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
             validate!(info.get_extradata().is_some());
 
             if let Some(ref edata) = info.get_extradata() {
@@ -239,7 +239,7 @@ impl NADecoder for VMDVideoDecoder {
             Err(DecoderError::InvalidData)
         }
     }
-    fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
+    fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
         let src = pkt.get_buffer();
         validate!(src.len() >= 10);
 
@@ -251,9 +251,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();
@@ -264,12 +262,15 @@ impl NADecoder for VMDVideoDecoder {
         let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::Video(buf));
         frm.set_keyframe(is_intra);
         frm.set_frame_type(if is_intra { FrameType::I } else { FrameType::P });
-        Ok(Rc::new(RefCell::new(frm)))
+        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,18 +325,18 @@ 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;
                 }
                 let mut ch = 0;
                 let flip_ch = if channels == 2 { 1 } else { 0 };
-                for _ in 1..self.blk_align {
+                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;
@@ -351,19 +352,20 @@ impl VMDAudioDecoder {
 }
 
 impl NADecoder for VMDAudioDecoder {
-    fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
+    fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
         if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
             let fmt;
             if ainfo.get_format().get_bits() == 8 {
                 fmt = SND_U8_FORMAT;
                 self.is16bit = false;
                 self.blk_size = ainfo.get_block_len();
+                self.blk_align = ainfo.get_block_len() / (ainfo.get_channels() as usize);
             } else {
                 fmt = SND_S16P_FORMAT;
                 self.is16bit = true;
                 self.blk_size = (ainfo.get_block_len() + 1) * (ainfo.get_channels() as usize);
+                self.blk_align = ainfo.get_block_len();
             };
-            self.blk_align = ainfo.get_block_len() / (ainfo.get_channels() as usize);
             self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), ainfo.get_channels(), fmt, ainfo.get_block_len());
             self.chmap = NAChannelMap::from_str(if ainfo.get_channels() == 1 { "C" } else { "L,R" }).unwrap();
             Ok(())
@@ -371,7 +373,7 @@ impl NADecoder for VMDAudioDecoder {
             Err(DecoderError::InvalidData)
         }
     }
-    fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
+    fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
         let info = pkt.get_stream().get_info();
         if let NACodecTypeInfo::Audio(_) = info.get_properties() {
             let pktbuf = pkt.get_buffer();
@@ -397,11 +399,11 @@ impl NADecoder for VMDAudioDecoder {
             if self.is16bit {
                 let mut adata = abuf.get_abuf_i16().unwrap();
                 let off1 = adata.get_offset(1);
-                let mut dst = adata.get_data_mut();
+                let mut dst = adata.get_data_mut().unwrap();
                 self.decode_16bit(&mut dst, off1, &mut br, nblocks, mask)?;
             } else {
                 let mut adata = abuf.get_abuf_u8().unwrap();
-                let mut dst = adata.get_data_mut();
+                let dst = adata.get_data_mut().unwrap();
                 let mut doff = 0;
                 let mut mask = mask;
                 let channels = self.chmap.num_channels();
@@ -410,12 +412,21 @@ impl NADecoder for VMDAudioDecoder {
                         for i in 0..self.blk_align * channels {
                             dst[doff + i] = 0;
                         }
-                    } else {
-                        for i in 0..self.blk_align * channels {
+                    } else if channels == 1 {
+                        for i in 0..self.blk_size {
                             dst[doff + i]       = br.read_byte()?;
                         }
+                    } else {
+                        for i in 0..self.blk_size {
+                            let val             = br.read_byte()?;
+                            if val < 128 {
+                                dst[doff + i] = 127 - val;
+                            } else {
+                                dst[doff + i] = val;
+                            }
+                        }
                     }
-                    doff += self.blk_align;
+                    doff += self.blk_align * channels;
                     mask >>= 1;
                 }
             }
@@ -423,14 +434,16 @@ impl NADecoder for VMDAudioDecoder {
             let mut frm = NAFrame::new_from_pkt(pkt, info, abuf);
             frm.set_duration(Some(samples as u64));
             frm.set_keyframe(true);
-            Ok(Rc::new(RefCell::new(frm)))
+            Ok(frm.into_ref())
         } else {
             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())
 }
 
@@ -439,8 +452,8 @@ 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 crate::game_register_all_codecs;
+    use crate::game_register_all_demuxers;
     #[test]
     fn test_vmd_video() {
         let mut dmx_reg = RegisteredDemuxers::new();
@@ -448,8 +461,8 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         game_register_all_codecs(&mut dec_reg);
 
-//        let file = "assets/1491.VMD";
-        let file = "assets/128.vmd";
+//        let file = "assets/Game/1491.VMD";
+        let file = "assets/Game/128.vmd";
         test_file_decoding("vmd", file, Some(10), true, false, None/*Some("vmd")*/, &dmx_reg, &dec_reg);
     }
     #[test]
@@ -459,8 +472,10 @@ mod test {
         let mut dec_reg = RegisteredDecoders::new();
         game_register_all_codecs(&mut dec_reg);
 
-//        let file = "assets/1491.VMD";
-        let file = "assets/128.vmd";
-        test_decode_audio("vmd", file, None, "vmd", &dmx_reg, &dec_reg);
+//        let file = "assets/Game/1491.VMD";
+        let file = "assets/Game/128.vmd";
+//        let file = "assets/Game/1000.VMD";
+//        let file = "assets/Game/235.VMD";
+        test_decode_audio("vmd", file, None, None/*Some("vmd")*/, &dmx_reg, &dec_reg);
     }
 }