aac: fix TNS filtering
authorKostya Shishkov <kostya.shishkov@gmail.com>
Thu, 27 Aug 2020 08:41:14 +0000 (10:41 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Thu, 27 Aug 2020 08:41:14 +0000 (10:41 +0200)
The specification says it should use initial zero filter state instead of
relying on neighbour coefficients.

Reported by Philip Deljanov

nihav-commonfmt/src/codecs/aac.rs

index d3f991b4da925f1bee1deec2257bd44c29317389..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];
                         }
                     }
                 }