rename register_all_codecs to register_all_decoders
[nihav.git] / nihav-game / src / codecs / bmv.rs
index cea10eb272784e045b06d06dc447112678c44bb0..a407fb9c82c8c4018cd2cf67f740a4d626a8cc89 100644 (file)
@@ -84,11 +84,7 @@ impl<'a> BMVWriter<'a> {
         for _ in 0..len {
             let saddr = (self.pos as isize) + self.off;
             if saddr < 0 { continue; }
-            if self.fwd {
-                self.data[self.pos] = self.data[saddr as usize];
-            } else {
-                self.data[self.pos] = self.data[saddr as usize];
-            }
+            self.data[self.pos] = self.data[saddr as usize];
             self.advance();
         }
     }
@@ -101,16 +97,15 @@ impl<'a> BMVWriter<'a> {
 }
 
 struct BMVVideoDecoder {
-    info:       Rc<NACodecInfo>,
+    info:       NACodecInfoRef,
     pal:        [u8; 768],
     frame:      [u8; FRAME_W * FRAME_H],
 }
 
 impl BMVVideoDecoder {
     fn new() -> Self {
-        let dummy_info = Rc::new(DUMMY_CODEC_INFO);
         Self {
-            info: dummy_info, pal: [0; 768], frame: [0; FRAME_W * FRAME_H],
+            info: NACodecInfoRef::default(), pal: [0; 768], frame: [0; FRAME_W * FRAME_H],
         }
     }
     fn decode_frame(&mut self, src: &[u8], bufinfo: &mut NABufferType, line: i16) -> DecoderResult<()> {
@@ -118,7 +113,7 @@ impl BMVVideoDecoder {
         let mut buf = bufo.unwrap();
         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 fwd = (line <= -640) || (line >= 0);
@@ -147,7 +142,7 @@ impl BMVVideoDecoder {
             }
             validate!(val >= 2);
             let len = (val >> 1) - 1;
-            
+
             match mode {
                 1 => bw.copy(len),
                 2 => for _ in 0..len { bw.put_byte(br.get_byte()); },
@@ -170,7 +165,7 @@ impl BMVVideoDecoder {
 }
 
 impl NADecoder for BMVVideoDecoder {
-    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() {
             let fmt = NAPixelFormaton::new(ColorModel::RGB(RGBSubmodel::RGB),
                                            Some(NAPixelChromaton::new(0, 0, true, 8, 0, 0, 3)),
@@ -179,14 +174,14 @@ impl NADecoder for BMVVideoDecoder {
                                            None, None,
                                            FORMATON_FLAG_PALETTE, 3);
             let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(FRAME_W, FRAME_H, false, fmt));
-            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();
 
             Ok(())
         } else {
             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() > 1);
 
@@ -211,9 +206,7 @@ impl NADecoder for BMVVideoDecoder {
         }
         let pos = br.tell() as usize;
 
-        let bufret = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 0);
-        if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
-        let mut bufinfo = bufret.unwrap();
+        let mut bufinfo = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 0)?;
 
         self.decode_frame(&src[pos..], &mut bufinfo, line)?;
 
@@ -221,12 +214,20 @@ impl NADecoder for BMVVideoDecoder {
         let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
         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) {
+    }
+}
+
+impl NAOptionHandler for BMVVideoDecoder {
+    fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
+    fn set_options(&mut self, _options: &[NAOption]) { }
+    fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
 }
 
 
-pub fn get_decoder_video() -> Box<NADecoder> {
+pub fn get_decoder_video() -> Box<dyn NADecoder + Send> {
     Box::new(BMVVideoDecoder::new())
 }
 
@@ -247,7 +248,7 @@ impl BMVAudioDecoder {
 }
 
 fn scale_sample(samp: u8, scale: i32) -> i16 {
-    let val = (((samp as i8) as i32) * scale) >> 5;
+    let val = (i32::from(samp as i8) * scale) >> 5;
     if val < -32768 {
         -32768
     } else if val > 32767 {
@@ -258,7 +259,7 @@ fn scale_sample(samp: u8, scale: i32) -> i16 {
 }
 
 impl NADecoder for BMVAudioDecoder {
-    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() {
             self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), ainfo.get_channels(), formats::SND_S16P_FORMAT, 32);
             self.chmap = NAChannelMap::from_str("L,R").unwrap();
@@ -267,7 +268,7 @@ impl NADecoder for BMVAudioDecoder {
             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();
@@ -275,10 +276,10 @@ impl NADecoder for BMVAudioDecoder {
             let nblocks = pktbuf[0] as usize;
             validate!(pktbuf.len() == 1 + 65 * nblocks);
             let samples = nblocks * 32;
-            let mut abuf = alloc_audio_buffer(self.ainfo, samples, self.chmap.clone())?;
+            let abuf = alloc_audio_buffer(self.ainfo, samples, self.chmap.clone())?;
             let mut adata = abuf.get_abuf_i16().unwrap();
             let off1 = adata.get_offset(1);
-            let mut dst = adata.get_data_mut();
+            let dst = adata.get_data_mut().unwrap();
             let psrc = &pktbuf[1..];
             for (n, src) in psrc.chunks_exact(65).enumerate() {
                 let code = src[0].rotate_right(1);
@@ -295,14 +296,22 @@ impl NADecoder for BMVAudioDecoder {
             let mut frm = NAFrame::new_from_pkt(pkt, info, abuf);
             frm.set_duration(Some(samples as u64));
             frm.set_keyframe(false);
-            Ok(Rc::new(RefCell::new(frm)))
+            Ok(frm.into_ref())
         } else {
             Err(DecoderError::InvalidData)
         }
     }
+    fn flush(&mut self) {
+    }
+}
+
+impl NAOptionHandler for BMVAudioDecoder {
+    fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
+    fn set_options(&mut self, _options: &[NAOption]) { }
+    fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
 }
 
-pub fn get_decoder_audio() -> Box<NADecoder> {
+pub fn get_decoder_audio() -> Box<dyn NADecoder + Send> {
     Box::new(BMVAudioDecoder::new())
 }
 
@@ -310,31 +319,27 @@ 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_decoders;
+    use crate::game_register_all_demuxers;
     #[test]
     fn test_bmv_video() {
         let mut dmx_reg = RegisteredDemuxers::new();
         game_register_all_demuxers(&mut dmx_reg);
         let mut dec_reg = RegisteredDecoders::new();
-        game_register_all_codecs(&mut dec_reg);
+        game_register_all_decoders(&mut dec_reg);
 
-//        let file = "assets/PERFECT.BMV";
-//        let file = "assets/DW2-MOUSE.BMV";
-        let file = "assets/WILDCAT.BMV";
-        test_file_decoding("bmv", file, Some(40), true, false, None, &dmx_reg, &dec_reg);
+        test_decoding("bmv", "bmv-video", "assets/Game/WILDCAT.BMV", Some(40), &dmx_reg, &dec_reg,
+                      ExpectedTestResult::MD5([0x9e91bb16, 0xc1edafc9, 0x4ef3171f, 0x0f3f6181]));
     }
     #[test]
     fn test_bmv_audio() {
         let mut dmx_reg = RegisteredDemuxers::new();
         game_register_all_demuxers(&mut dmx_reg);
         let mut dec_reg = RegisteredDecoders::new();
-        game_register_all_codecs(&mut dec_reg);
+        game_register_all_decoders(&mut dec_reg);
 
-        let file = "assets/PERFECT.BMV";
-//        let file = "assets/DW2-MOUSE.BMV";
-//        let file = "assets/WILDCAT.BMV";
-        test_decode_audio("bmv", file, None, "bmv", &dmx_reg, &dec_reg);
+        test_decoding("bmv", "bmv-audio", "assets/Game/PERFECT.BMV", None, &dmx_reg, &dec_reg,
+                      ExpectedTestResult::MD5([0x90b9ace4, 0x5fc19938, 0x7f534560, 0x32589cdf]));
     }
 }