rename register_all_codecs to register_all_decoders
[nihav.git] / nihav-realmedia / src / codecs / cook.rs
index de7ac54069da3be4453318deddb5a0b1d60f9f5a..c3e82767a34c3263044f78197a3b97dd2d529cea 100644 (file)
@@ -1,10 +1,7 @@
-use std::rc::Rc;
-use std::cell::RefCell;
 use nihav_core::formats::*;
 use nihav_core::frame::*;
 use nihav_core::codecs::*;
-use nihav_core::dsp::fft::FFTMode;
-use nihav_core::dsp::mdct::IMDCT;
+use nihav_codec_support::dsp::mdct::IMDCT;
 use nihav_core::io::bitreader::*;
 use nihav_core::io::byteio::{ByteReader, MemoryReader};
 use nihav_core::io::codebook::*;
@@ -20,8 +17,8 @@ enum Mode {
 }
 
 impl Mode {
-    fn get_channels(&self) -> usize {
-        match *self {
+    fn get_channels(self) -> usize {
+        match self {
             Mode::Mono  => 1,
             _           => 2,
         }
@@ -77,9 +74,9 @@ impl Codebooks {
                      Codebook::new(&mut vq5, CodebookMode::MSB).unwrap(),
                      Codebook::new(&mut vq6, CodebookMode::MSB).unwrap()];
         Codebooks {
-            cpl_cb:     cpl_cb,
-            quant_cb:   quant_cb,
-            vq_cb:      vq_cb,
+            cpl_cb,
+            quant_cb,
+            vq_cb,
         }
     }
 }
@@ -114,7 +111,7 @@ impl CookDSP {
             gain_tab[i] = pow_tab[i + 53].powf(8.0 / fsamples);
         }
         let size = samples;
-        CookDSP { imdct: IMDCT::new(FFTMode::SplitRadix, samples*2, false), window: window, out: [0.0; 2048], size, pow_tab, hpow_tab, gain_tab }
+        CookDSP { imdct: IMDCT::new(samples*2, false), window, out: [0.0; 2048], size, pow_tab, hpow_tab, gain_tab }
     }
 }
 
@@ -305,7 +302,7 @@ impl CookChannelPair {
         for (i, b) in src.iter().enumerate() {
             buf[i] = b ^ COOK_XOR_KEY[i & 3];
         }
-        let mut br = BitReader::new(buf, src.len(), BitReaderMode::BE);
+        let mut br = BitReader::new(&buf[..src.len()], BitReaderMode::BE);
 
         let num_gains                                   = br.read_code(UintCodeType::UnaryOnes)? as usize;
         validate!(num_gains <= 8);
@@ -340,11 +337,11 @@ impl CookChannelPair {
             let cend   = COOK_CPL_BAND[self.subbands - 1] as usize;
             if br.read_bool()? {
                 let cb = &codebooks.cpl_cb[(self.js_bits - 2) as usize];
-                for i in cstart..cend+1 {
+                for i in cstart..=cend {
                     self.decouple[i]                    = br.read_cb(cb)? as u8;
                 }
             } else {
-                for i in cstart..cend+1 {
+                for i in cstart..=cend {
                     self.decouple[i]                    = br.read(self.js_bits)? as u8;
                 }
             }
@@ -433,7 +430,7 @@ impl CookChannelPair {
         for ch in 0..self.mode.get_channels() {
             let off = abuf.get_offset(ch + self.start_ch);
             let mut adata = abuf.get_abuf_f32().unwrap();
-            let mut output = adata.get_data_mut();
+            let output = adata.get_data_mut().unwrap();
             let dst = &mut output[off..];
 
             dsp.imdct.imdct(&self.block[ch], &mut dsp.out);
@@ -459,7 +456,7 @@ impl CookChannelPair {
                 *out *= cur_gain;
                 cur_gain *= cur_gain2;
             }
-            for i in 0..self.samples { self.delay[ch][i] = dsp.out[i]; }
+            self.delay[ch][..self.samples].copy_from_slice(&dsp.out[..self.samples]);
         }
         Ok(())
     }
@@ -523,7 +520,7 @@ impl RND {
 }
 
 struct CookDecoder {
-    info:       Rc<NACodecInfo>,
+    info:       NACodecInfoRef,
     chmap:      NAChannelMap,
     src:        [u8; 65536],
     num_pairs:  usize,
@@ -553,7 +550,7 @@ impl CookDecoder {
 }
 
 impl NADecoder for CookDecoder {
-    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 edata = info.get_extradata().unwrap();
             validate!(edata.len() >= 4);
@@ -634,7 +631,7 @@ impl NADecoder for CookDecoder {
             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();
         validate!(info.get_properties().is_audio());
         let pktbuf = pkt.get_buffer();
@@ -670,22 +667,42 @@ impl NADecoder for CookDecoder {
 
         let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf);
         frm.set_keyframe(true);
-        Ok(Rc::new(RefCell::new(frm)))
+        Ok(frm.into_ref())
+    }
+    fn flush(&mut self) {
+        for pair in self.pairs.iter_mut() {
+            pair.delay = [[0.0; MAX_SAMPLES]; 2];
+        }
     }
 }
 
-pub fn get_decoder() -> Box<NADecoder> {
+impl NAOptionHandler for CookDecoder {
+    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() -> Box<dyn NADecoder + Send> {
     Box::new(CookDecoder::new())
 }
 
 #[cfg(test)]
 mod test {
-    use crate::test::dec_video::*;
+    use nihav_core::codecs::RegisteredDecoders;
+    use nihav_core::demuxers::RegisteredDemuxers;
+    use nihav_codec_support::test::dec_video::*;
+    use crate::realmedia_register_all_decoders;
+    use crate::realmedia_register_all_demuxers;
     #[test]
     fn test_cook() {
+        let mut dmx_reg = RegisteredDemuxers::new();
+        realmedia_register_all_demuxers(&mut dmx_reg);
+        let mut dec_reg = RegisteredDecoders::new();
+        realmedia_register_all_decoders(&mut dec_reg);
+
 //        let file = "assets/RV/rv30_weighted_mc.rm";
         let file = "assets/RV/multichannel.rma";
-        test_decode_audio("realmedia", file, Some(2000), "cook");
+        test_decode_audio("realmedia", file, Some(2000), None/*Some("cook")*/, &dmx_reg, &dec_reg);
     }
 }
 
@@ -1112,6 +1129,7 @@ const COOK_CPL_BAND: [u8; MAX_SUBBANDS - 1] = [
     19, 19, 19
 ];
 
+#[allow(clippy::approx_constant)]
 const COOK_DITHER_TAB: [f32; 9] = [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.176777, 0.25, 0.707107, 1.0 ];
 
 const COOK_QUANT_CENTROID: [[f32; 14]; 7] = [