aac: fix TNS filtering
[nihav.git] / nihav-commonfmt / src / codecs / aac.rs
index 6de5a963e0ec2d8fc0269866b0ceac4f5ba17e08..5058a44fde17c7cb7118db34eab99bbd0e83b482 100644 (file)
@@ -782,17 +782,23 @@ impl ICS {
                     let start = w * 128 + self.get_band_start(tns_max_bands.min(bottom));
                     let end   = w * 128 + self.get_band_start(tns_max_bands.min(top));
                     let lpc = &tns_data.coeffs[w][f].coef;
+                    let mut state = [0.0f32; 64];
+                    let mut sidx = 32;
                     if !tns_data.coeffs[w][f].direction {
                         for m in start..end {
-                            for i in 0..order.min(m) {
-                                self.coeffs[m] -= self.coeffs[m - i - 1] * lpc[i];
+                            for i in 0..order {
+                                self.coeffs[m] -= state[(sidx + i) & 63] * lpc[i];
                             }
+                            sidx = (sidx + 63) & 63;
+                            state[sidx] = self.coeffs[m];
                         }
                     } else {
                         for m in (start..end).rev() {
-                            for i in 0..order.min(m) {
-                                self.coeffs[m] -= self.coeffs[m + i - 1] * lpc[i];
+                            for i in 0..order {
+                                self.coeffs[m] -= state[(sidx + i) & 63] * lpc[i];
                             }
+                            sidx = (sidx + 63) & 63;
+                            state[sidx] = self.coeffs[m];
                         }
                     }
                 }
@@ -1003,6 +1009,7 @@ impl DSP {
             tmp: [0.0; 2048], ew_buf: [0.0; 1152],
         }
     }
+    #[allow(clippy::cyclomatic_complexity)]
     fn synth(&mut self, coeffs: &[f32; 1024], delay: &mut [f32; 1024], seq: u8, window_shape: bool, prev_window_shape: bool, dst: &mut [f32]) {
         let long_win  = if window_shape { &self.kbd_long_win  } else { &self.sine_long_win };
         let short_win = if window_shape { &self.kbd_short_win } else { &self.sine_short_win };
@@ -1258,6 +1265,12 @@ impl NADecoder for AACDecoder {
     }
 }
 
+impl NAOptionHandler for AACDecoder {
+    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(AACDecoder::new())
 }
@@ -1267,14 +1280,14 @@ mod test {
     use nihav_core::codecs::RegisteredDecoders;
     use nihav_core::demuxers::RegisteredDemuxers;
     use nihav_codec_support::test::dec_video::test_decode_audio;
-    use crate::generic_register_all_codecs;
+    use crate::generic_register_all_decoders;
     use nihav_realmedia::realmedia_register_all_demuxers;
     #[test]
     fn test_aac() {
         let mut dmx_reg = RegisteredDemuxers::new();
         realmedia_register_all_demuxers(&mut dmx_reg);
         let mut dec_reg = RegisteredDecoders::new();
-        generic_register_all_codecs(&mut dec_reg);
+        generic_register_all_decoders(&mut dec_reg);
 
 //        let file = "assets/RV/rv40_weighted_mc.rmvb";
         let file = "assets/RV/rv40_weighted_mc_2.rmvb";