make all codec crates export just register_all functions and document them
[nihav.git] / nihav-game / src / codecs / gremlinvideo.rs
index b6929d11a9e7d65714941040dc9d9de75b226007..096c7b614438323a23ec07fa43503b8a187d8594 100644 (file)
@@ -1,5 +1,3 @@
-use std::rc::Rc;
-use std::cell::RefCell;
 use nihav_core::frame::*;
 use nihav_core::formats;
 use nihav_core::formats::{NAChannelType, NAChannelMap};
@@ -7,7 +5,7 @@ use nihav_core::codecs::*;
 use nihav_core::io::byteio::*;
 
 struct GremlinVideoDecoder {
-    info:       Rc<NACodecInfo>,
+    info:       NACodecInfoRef,
     pal:        [u8; 768],
     frame:      Vec<u8>,
     scale_v:    bool,
@@ -52,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)
@@ -61,9 +59,8 @@ impl Bits32 {
 
 impl GremlinVideoDecoder {
     fn new() -> Self {
-        let dummy_info = Rc::new(DUMMY_CODEC_INFO);
         GremlinVideoDecoder {
-            info: dummy_info, pal: [0; 768], frame: Vec::new(),
+            info: NACodecInfoRef::default(), pal: [0; 768], frame: Vec::new(),
             scale_v: false, scale_h: false
         }
     }
@@ -141,7 +138,7 @@ impl GremlinVideoDecoder {
         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 mut sidx = PREAMBLE_SIZE;
         let mut didx = 0;
@@ -374,14 +371,14 @@ impl GremlinVideoDecoder {
 }
 
 impl NADecoder for GremlinVideoDecoder {
-    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 w = vinfo.get_width();
             let h = vinfo.get_height();
             if !vinfo.get_format().is_paletted() { return Err(DecoderError::NotImplemented); }
-            let fmt = formats::PAL8_FORMAT;
+            let fmt = PAL8_FORMAT;
             let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, 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();
 
             self.frame.resize(PREAMBLE_SIZE + w * h, 0);
             for i in 0..2 {
@@ -396,7 +393,7 @@ impl NADecoder for GremlinVideoDecoder {
             for c in 0..256 {
                 for i in 0..3 {
                     let cc = edata[c * 3 + i];
-                    self.pal[c * 3 + (2 - i)] = (cc << 2) | (cc >> 4);
+                    self.pal[c * 3 + i] = (cc << 2) | (cc >> 4);
                 }
             }
             Ok(())
@@ -404,7 +401,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);
@@ -423,7 +420,7 @@ impl NADecoder for GremlinVideoDecoder {
             for c in 0..256 {
                 for i in 0..3 {
                     let b = br.read_byte()?;
-                    self.pal[c * 3 + (2 - i)] = (b << 2) | (b >> 4);
+                    self.pal[c * 3 + i] = (b << 2) | (b >> 4);
                 }
             }
             if cmethod == 1 {
@@ -432,12 +429,12 @@ impl NADecoder for GremlinVideoDecoder {
             let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::None);
             frm.set_keyframe(false);
             frm.set_frame_type(FrameType::Skip);
-            return Ok(Rc::new(RefCell::new(frm)))
+            return Ok(frm.into_ref())
         } else if cmethod == 3 {
             let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::None);
             frm.set_keyframe(false);
             frm.set_frame_type(FrameType::Skip);
-            return Ok(Rc::new(RefCell::new(frm)))
+            return Ok(frm.into_ref())
         } else if cmethod == 2 {
             self.decode_method2(&mut br)?;
         } else if cmethod == 5 {
@@ -450,20 +447,20 @@ 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);
 
         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) {
     }
 }
 
-pub fn get_decoder_video() -> Box<NADecoder> {
+pub fn get_decoder_video() -> Box<dyn NADecoder + Send> {
     Box::new(GremlinVideoDecoder::new())
 }
 
@@ -513,7 +510,7 @@ fn get_default_chmap(nch: u8) -> NAChannelMap {
 }
 
 impl NADecoder for GremlinAudioDecoder {
-    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, ainfo.get_block_len());
             self.chmap = get_default_chmap(ainfo.get_channels());
@@ -523,15 +520,15 @@ 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();
             let samples = pktbuf.len() / self.chmap.num_channels();
-            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 buf = adata.get_data_mut();
+            let buf = adata.get_data_mut().unwrap();
             if self.chmap.num_channels() == 2 {
                 for (i, e) in pktbuf.chunks(2).enumerate() {
                     self.state0 = self.state0.wrapping_add(self.delta_tab[e[0] as usize]);
@@ -548,22 +545,33 @@ impl NADecoder for GremlinAudioDecoder {
             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) {
+    }
 }
 
-pub fn get_decoder_audio() -> Box<NADecoder> {
+pub fn get_decoder_audio() -> Box<dyn NADecoder + Send> {
     Box::new(GremlinAudioDecoder::new())
 }
 
 #[cfg(test)]
 mod test {
-    use crate::test::dec_video::test_file_decoding;
+    use nihav_core::codecs::RegisteredDecoders;
+    use nihav_core::demuxers::RegisteredDemuxers;
+    use nihav_core::test::dec_video::test_file_decoding;
+    use crate::game_register_all_codecs;
+    use crate::game_register_all_demuxers;
     #[test]
     fn test_gdv() {
-         test_file_decoding("gdv", "assets/intro1.gdv", Some(10), true, false, None);
+        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);
+
+        test_file_decoding("gdv", "assets/Game/intro1.gdv", Some(10), true, false, None, &dmx_reg, &dec_reg);
     }
 }