rename register_all_codecs to register_all_decoders
[nihav.git] / nihav-game / src / codecs / gremlinvideo.rs
index 8c6e58f29988b61eb1b6a2ff2cbf2a97594fdfd4..7e91ea229b44d92593ffd876cff3cbd37568a5e9 100644 (file)
@@ -50,7 +50,7 @@ impl Bits32 {
         self.queue >>= nbits;
         self.fill   -= nbits;
         if self.fill <= 16 {
-            self.queue |= (br.read_u16le()? as u32) << self.fill;
+            self.queue |= u32::from(br.read_u16le()?) << self.fill;
             self.fill  += 16;
         }
         Ok(res)
@@ -143,17 +143,17 @@ impl GremlinVideoDecoder {
         let mut sidx = PREAMBLE_SIZE;
         let mut didx = 0;
 
-        for i in 0..768 { dst[paloff + i] = self.pal[i]; }
+        dst[paloff..][..768].copy_from_slice(&self.pal);
         if !self.scale_v && !self.scale_h {
             for _ in 0..h {
-                for x in 0..w { dst[didx + x] = self.frame[sidx + x]; }
+                dst[didx..][..w].copy_from_slice(&self.frame[sidx..][..w]);
                 sidx += w;
                 didx += stride;
             }
         } else {
             for y in 0..h {
                 if !self.scale_v {
-                    for x in 0..w { dst[didx + x] = self.frame[sidx + x]; }
+                    dst[didx..][..w].copy_from_slice(&self.frame[sidx..][..w]);
                 } else {
                     for x in 0..w { dst[didx + x] = self.frame[sidx + x/2]; }
                 }
@@ -247,6 +247,7 @@ impl GremlinVideoDecoder {
         Ok(())
     }
 
+    #[allow(clippy::identity_op)]
     fn decode_method68(&mut self, br: &mut ByteReader,
                        skip: usize, use8: bool) -> DecoderResult<()> {
         let mut bits = Bits32::new();
@@ -371,7 +372,7 @@ impl GremlinVideoDecoder {
 }
 
 impl NADecoder for GremlinVideoDecoder {
-    fn init(&mut self, info: NACodecInfoRef) -> DecoderResult<()> {
+    fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
         if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
             let w = vinfo.get_width();
             let h = vinfo.get_height();
@@ -401,7 +402,7 @@ impl NADecoder for GremlinVideoDecoder {
             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();
         let mut mr = MemoryReader::new_read(&src);
         let mut br = ByteReader::new(&mut mr);
@@ -447,9 +448,7 @@ impl NADecoder for GremlinVideoDecoder {
             return Err(DecoderError::NotImplemented);
         }
 
-        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.output_frame(&mut bufinfo, w, h);
 
@@ -458,9 +457,17 @@ impl NADecoder for GremlinVideoDecoder {
         frm.set_frame_type(if is_intra { FrameType::I } else { FrameType::P });
         Ok(frm.into_ref())
     }
+    fn flush(&mut self) {
+    }
+}
+
+impl NAOptionHandler for GremlinVideoDecoder {
+    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(GremlinVideoDecoder::new())
 }
 
@@ -510,7 +517,7 @@ fn get_default_chmap(nch: u8) -> NAChannelMap {
 }
 
 impl NADecoder for GremlinAudioDecoder {
-    fn init(&mut self, info: NACodecInfoRef) -> 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, ainfo.get_block_len());
             self.chmap = get_default_chmap(ainfo.get_channels());
@@ -520,7 +527,7 @@ impl NADecoder for GremlinAudioDecoder {
             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();
@@ -550,9 +557,17 @@ impl NADecoder for GremlinAudioDecoder {
             Err(DecoderError::InvalidData)
         }
     }
+    fn flush(&mut self) {
+    }
 }
 
-pub fn get_decoder_audio() -> Box<NADecoder> {
+impl NAOptionHandler for GremlinAudioDecoder {
+    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<dyn NADecoder + Send> {
     Box::new(GremlinAudioDecoder::new())
 }
 
@@ -560,16 +575,28 @@ 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::test_file_decoding;
-    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_gdv_video() {
+        let mut dmx_reg = RegisteredDemuxers::new();
+        game_register_all_demuxers(&mut dmx_reg);
+        let mut dec_reg = RegisteredDecoders::new();
+        game_register_all_decoders(&mut dec_reg);
+
+        test_decoding("gdv", "gdv-video", "assets/Game/intro1.gdv", Some(10), &dmx_reg, &dec_reg,
+                      ExpectedTestResult::MD5([0x7ea302bf, 0xc3e210cf, 0x6e341376, 0x9e976056]));
+    }
     #[test]
-    fn test_gdv() {
+    fn test_gdv_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);
 
-        test_file_decoding("gdv", "assets/Game/intro1.gdv", Some(10), true, false, None, &dmx_reg, &dec_reg);
+        test_decoding("gdv", "gdv-audio", "assets/Game/intro1.gdv", None, &dmx_reg, &dec_reg,
+                      ExpectedTestResult::MD5([0xd41d8cd9, 0x8f00b204, 0xe9800998, 0xecf8427e]));
     }
 }