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) {
}
},
_ => {},
- };
+ };*/
self.window_shape = br.read_bool()?;
self.window_groups = 1;
if self.window_sequence == EIGHT_SHORT_SEQUENCE {
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)
}
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] {
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];
}
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];
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
},
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);