aac: clear M/S flags
[nihav.git] / nihav-mpeg / src / codecs / aac / mod.rs
index d4b776872bdd2549dced87725b4e9263bd2ef6fc..e37e812357489f9d39a7eca502e8d32de7909aa0 100644 (file)
@@ -183,6 +183,9 @@ impl ICS {
     fn get_intensity_dir(&self, g: usize, sfb: usize) -> bool {
         self.sfb_cb[g][sfb] == INTENSITY_HCB
     }
+    fn is_noise(&self, g: usize, sfb: usize) -> bool {
+        self.sfb_cb[g][sfb] == NOISE_HCB
+    }
     fn decode_scale_factor_data(&mut self, br: &mut BitReader, codebooks: &Codebooks) -> DecoderResult<()> {
         decode_scale_factor_data(br, &mut self.scales, self.global_gain, &self.info, &self.sfb_cb, codebooks)
     }
@@ -327,12 +330,14 @@ impl ChannelPair {
                         self.ms_used[g][sfb]            = br.read_bool()?;
                     }
                 }
+            } else {
+                self.ms_used = [[false; MAX_SFBS]; MAX_WINDOWS];
             }
             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, true)?;
-        if common_window && self.ms_mask_present != 0 {
+        if common_window {
             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] {
@@ -341,11 +346,11 @@ impl ChannelPair {
                 for sfb in 0..self.ics[0].info.max_sfb {
                     let start = w * 128 + self.ics[0].get_band_start(sfb);
                     let end   = w * 128 + self.ics[0].get_band_start(sfb + 1);
-                    if self.ics[0].is_intensity(g, sfb) {
+                    if self.ics[1].is_intensity(g, sfb) {
                         let invert = (self.ms_mask_present == 1) && self.ms_used[g][sfb];
-                        let dir = self.ics[0].get_intensity_dir(g, sfb) ^ invert;
-                        let scale = 0.5f32.powf(0.25 * (f32::from(self.ics[0].scales[g][sfb]) + f32::from(INTENSITY_SCALE_MIN)));
-                        if !dir {
+                        let dir = self.ics[1].get_intensity_dir(g, sfb) ^ invert;
+                        let scale = 0.5f32.powf(0.25 * (f32::from(self.ics[1].scales[g][sfb]) + f32::from(INTENSITY_SCALE_MIN)));
+                        if dir {
                             for i in start..end {
                                 self.ics[1].coeffs[i] = scale * self.ics[0].coeffs[i];
                             }
@@ -354,7 +359,7 @@ impl ChannelPair {
                                 self.ics[1].coeffs[i] = -scale * self.ics[0].coeffs[i];
                             }
                         }
-                    } else if (self.ms_mask_present == 2) || self.ms_used[g][sfb] {
+                    } else if ((self.ms_mask_present == 2) || self.ms_used[g][sfb]) && !self.ics[0].is_noise(g, sfb) {
                         for i in start..end {
                             let tmp = self.ics[0].coeffs[i] - self.ics[1].coeffs[i];
                             self.ics[0].coeffs[i] += self.ics[1].coeffs[i];
@@ -625,8 +630,8 @@ impl AACDecoder {
                 4 => { // ID_DSE
                         let _id                         = br.read(4)?;
                         let align                       = br.read_bool()?;
-                        let mut count                   = br.read(8)? as u32;
-                        if count == 255 { count        += br.read(8)? as u32; }
+                        let mut count                   = br.read(8)?;
+                        if count == 255 { count        += br.read(8)?; }
                         if align {                        br.align(); }
                                                           br.skip(count * 8)?; // no SBR payload or such
                     },