X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-mpeg%2Fsrc%2Fcodecs%2Faac%2Fmod.rs;h=655b45ba5d9823597362d84a304742cbc85fd9a5;hp=d4b776872bdd2549dced87725b4e9263bd2ef6fc;hb=HEAD;hpb=38df3d11b3686cbd6982cc073a7c55c6c1043461 diff --git a/nihav-mpeg/src/codecs/aac/mod.rs b/nihav-mpeg/src/codecs/aac/mod.rs index d4b7768..e37e812 100644 --- a/nihav-mpeg/src/codecs/aac/mod.rs +++ b/nihav-mpeg/src/codecs/aac/mod.rs @@ -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 },