rename register_all_codecs to register_all_decoders
[nihav.git] / nihav-realmedia / src / codecs / cook.rs
index ba3b27689b25954cad634f998eda1cad4303590b..c3e82767a34c3263044f78197a3b97dd2d529cea 100644 (file)
@@ -1,8 +1,7 @@
 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::*;
@@ -18,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,
         }
@@ -75,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,
         }
     }
 }
@@ -112,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 }
     }
 }
 
@@ -303,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);
@@ -338,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;
                 }
             }
@@ -457,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(())
     }
@@ -670,9 +669,20 @@ impl NADecoder for CookDecoder {
         frm.set_keyframe(true);
         Ok(frm.into_ref())
     }
+    fn flush(&mut self) {
+        for pair in self.pairs.iter_mut() {
+            pair.delay = [[0.0; MAX_SAMPLES]; 2];
+        }
+    }
+}
+
+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<NADecoder> {
+pub fn get_decoder() -> Box<dyn NADecoder + Send> {
     Box::new(CookDecoder::new())
 }
 
@@ -680,19 +690,19 @@ pub fn get_decoder() -> Box<NADecoder> {
 mod test {
     use nihav_core::codecs::RegisteredDecoders;
     use nihav_core::demuxers::RegisteredDemuxers;
-    use nihav_core::test::dec_video::*;
-    use crate::codecs::realmedia_register_all_codecs;
-    use crate::demuxers::realmedia_register_all_demuxers;
+    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_codecs(&mut dec_reg);
+        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", &dmx_reg, &dec_reg);
+        test_decode_audio("realmedia", file, Some(2000), None/*Some("cook")*/, &dmx_reg, &dec_reg);
     }
 }
 
@@ -1119,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] = [