aac: allow intensity stereo in right channel
[nihav.git] / nihav-commonfmt / src / codecs / aac.rs
index 54ccef6bc4492c9a31be37bb46e50b5d11f4e4e8..fc0bad259975611aa15b65434b30e9f2850ec472 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];
                         }
                     }
                 }
@@ -876,6 +882,7 @@ fn read_escape(br: &mut BitReader, sign: bool) -> DecoderResult<i16> {
     let prefix                                          = br.read_code(UintCodeType::UnaryOnes)? as u8;
     validate!(prefix < 9);
     let bits                                            = br.read(prefix + 4)? as i16;
+    let bits = bits | (1 << (prefix + 4));
     if sign {
         Ok(bits)
     } else {
@@ -924,11 +931,11 @@ impl ChannelPair {
             self.ics[1].info = self.ics[0].info;
         }
         self.ics[0].decode_ics(br, codebooks, m4atype, common_window, true)?;
-        self.ics[1].decode_ics(br, codebooks, m4atype, common_window, false)?;
+        self.ics[1].decode_ics(br, codebooks, m4atype, common_window, true)?;
         if common_window && self.ms_mask_present != 0 {
             let mut g = 0;
             for w in 0..self.ics[0].info.num_windows {
-                if w > 0 && self.ics[0].info.scale_factor_grouping[w - 1] {
+                if w > 0 && !self.ics[0].info.scale_factor_grouping[w - 1] {
                     g += 1;
                 }
                 for sfb in 0..self.ics[0].info.max_sfb {
@@ -1274,14 +1281,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";