aac: clear M/S flags
[nihav.git] / nihav-mpeg / src / codecs / mpegaudio / mp3code.rs
index 516d687d9616fd6e2af1c96e197ff7bf84858ed2..c00696cb42aec894c9d9088f7d42d45f008bc4b3 100644 (file)
@@ -611,7 +611,7 @@ impl MP3Data {
                     let coef1 = &mut coef1[0][gr_no * SAMPLES/2..];
                     let is_mode = &self.is_mode[gr_no * SAMPLES/2..];
                     let start = band_end[gr_no][bound_band[gr_no]];
-                    let end = grans[0].zero_part;
+                    let end = grans[0].zero_part.max(start);
 
                     if self.mpeg1 {
                         let coef0 = &mut coef0[start..end];
@@ -628,11 +628,13 @@ impl MP3Data {
                         let iscale = (grans[1].scalefac_compress & 1) as u8;
                         for band in 0..num_bands[gr_no] {
                             if (band_flags[gr_no][band] & IS_MODE) != 0 {
+                                let start = band_start[gr_no][band];
+                                let end   = band_end[gr_no][band];
                                 apply_istereo(&mut coef0[start..end], &mut coef1[start..end], is_mode[start], iscale, (band_flags[gr_no][band] & MS_MODE) != 0);
                             }
                         }
                     }
-                    end_freq[gr_no][1] = end_freq[gr_no][1].min(end);
+                    end_freq[gr_no][1] = end_freq[gr_no][1].max(end);
                 }
             }
             if (mode_ext & MS_MODE) != 0 {
@@ -645,7 +647,7 @@ impl MP3Data {
                         if band_start[gr_no][band] >= end {
                             break;
                         }
-                        if (band_flags[gr_no][band] & MS_MODE) != 0 {
+                        if band_flags[gr_no][band] == MS_MODE {
                             let start = band_start[gr_no][band];
                             let end   = band_end[gr_no][band];
                             super::apply_ms(&mut coef0[start..end], &mut coef1[start..end]);
@@ -750,7 +752,7 @@ fn read_region_quad(br: &mut BitReader, br_end: usize, coeffs: &mut [f32], scale
     }
     for (i, (cquad, scquad)) in coeffs[start..SAMPLES/2].chunks_exact_mut(4).zip(scales[start..].chunks_exact(4)).enumerate() {
         zero_part = start + i * 4 + 4;
-        if br.tell() >= br_end {
+        if br.tell() >= br_end || (br.tell() + 3 >= br_end && cb.is_none()) {
             break;
         }
         let val = if let Some(cbook) = cb { br.read_cb(cbook)? } else { (br.read(4)? as u8) ^ 0xF };