aac: fix intensity and mid/side stereo reconstruction
[nihav.git] / nihav-mpeg / src / codecs / aac / mod.rs
index 2d37fa7fa897258ccc2cd703808143a041142d3e..65148534a0d929ca517c71cf4650cf9346ad6dcb 100644 (file)
@@ -64,7 +64,7 @@ impl ICSInfo {
         let ics_reserved_bit                            = br.read(1)?;
         validate!(ics_reserved_bit == 0);
         self.window_sequence                            = br.read(2)? as u8;
-        match self.prev_window_sequence {
+        /*match self.prev_window_sequence {
             ONLY_LONG_SEQUENCE | LONG_STOP_SEQUENCE => {
                     if (self.window_sequence != ONLY_LONG_SEQUENCE) &&
                        (self.window_sequence != LONG_START_SEQUENCE) {
@@ -78,7 +78,7 @@ impl ICSInfo {
                     }
                 },
             _ => {},
-        };
+        };*/
         self.window_shape                               = br.read_bool()?;
         self.window_groups = 1;
         if self.window_sequence == EIGHT_SHORT_SEQUENCE {
@@ -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)
     }
@@ -341,10 +344,10 @@ 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)));
+                        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 +357,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];
@@ -683,7 +686,6 @@ impl NADecoder for AACDecoder {
             let edata = info.get_extradata().unwrap();
             validate!(edata.len() >= 2);
 
-//print!("edata:"); for s in edata.iter() { print!(" {:02X}", *s);}println!("");
             if (edata.len() > 12) && (&edata[4..8] == b"esds") {
                 let mut mr = MemoryReader::new_read(edata.as_slice());
                 let mut br = ByteReader::new(&mut mr);