X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-commonfmt%2Fsrc%2Fcodecs%2Faac.rs;h=09a5b6b1dd582e90600e1b6ae16715ccfbf7f9f3;hp=5058a44fde17c7cb7118db34eab99bbd0e83b482;hb=d4547e6a80fe0dcc76b7453c8b85664738a0e466;hpb=b103b7b26e1ceb2a5529960b4f407e55dd51c910 diff --git a/nihav-commonfmt/src/codecs/aac.rs b/nihav-commonfmt/src/codecs/aac.rs index 5058a44..09a5b6b 100644 --- a/nihav-commonfmt/src/codecs/aac.rs +++ b/nihav-commonfmt/src/codecs/aac.rs @@ -4,6 +4,7 @@ use nihav_core::codecs::*; use nihav_codec_support::dsp::mdct::IMDCT; use nihav_codec_support::dsp::window::*; use nihav_core::io::bitreader::*; +use nihav_core::io::byteio::*; use nihav_core::io::codebook::*; use std::fmt; use nihav_core::io::intcode::*; @@ -324,12 +325,16 @@ impl ICSInfo { self.window_sequence = br.read(2)? as u8; match self.prev_window_sequence { ONLY_LONG_SEQUENCE | LONG_STOP_SEQUENCE => { - validate!((self.window_sequence == ONLY_LONG_SEQUENCE) || - (self.window_sequence == LONG_START_SEQUENCE)); + if (self.window_sequence != ONLY_LONG_SEQUENCE) && + (self.window_sequence != LONG_START_SEQUENCE) { + println!("incorrect previous window"); + } }, LONG_START_SEQUENCE | EIGHT_SHORT_SEQUENCE => { - validate!((self.window_sequence == EIGHT_SHORT_SEQUENCE) || - (self.window_sequence == LONG_STOP_SEQUENCE)); + if (self.window_sequence != EIGHT_SHORT_SEQUENCE) && + (self.window_sequence != LONG_STOP_SEQUENCE) { + println!("incorrect previous window"); + } }, _ => {}, }; @@ -882,6 +887,7 @@ fn read_escape(br: &mut BitReader, sign: bool) -> DecoderResult { let prefix = br.read_code(UintCodeType::UnaryOnes)? as u8; validate!(prefix < 9); let bits = br.read(prefix + 4)? as i16; + let bits = bits | (1 << (prefix + 4)); if sign { Ok(bits) } else { @@ -930,11 +936,11 @@ impl ChannelPair { 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, false)?; + self.ics[1].decode_ics(br, codebooks, m4atype, common_window, true)?; if common_window && self.ms_mask_present != 0 { 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] { + if w > 0 && !self.ics[0].info.scale_factor_grouping[w - 1] { g += 1; } for sfb in 0..self.ics[0].info.max_sfb { @@ -1213,7 +1219,60 @@ impl NADecoder for AACDecoder { validate!(edata.len() >= 2); //print!("edata:"); for s in edata.iter() { print!(" {:02X}", *s);}println!(""); - self.m4ainfo.read(&edata)?; + 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); + let esds_size = br.read_u32be()? as usize; + validate!(esds_size <= edata.len()); + br.read_skip(8)?; + let mut info_start = 0; + let mut info_size = 0; + while br.tell() < (esds_size as u64) { + let tag = br.read_byte()?; + let mut size = 0; + loop { + let b = br.read_byte()?; + size = (size << 7) | u64::from(b & 0x7F); + validate!(br.tell() + size <= (esds_size as u64)); + if (b & 0x80) == 0 { + break; + } + } + match tag { + 3 => { + br.read_u16be()?; + let flags = br.read_byte()?; + if (flags & 0x80) != 0 { + br.read_u16be()?; + } + if (flags & 0x40) != 0 { + let len = br.read_byte()?; + br.read_skip(len as usize)?; + } + if (flags & 0x20) != 0 { + br.read_u16be()?; + } + }, + 4 => { + let _otype = br.read_byte()?; + let _stype = br.read_byte()?; + let _flags = br.read_u24be()?; + let _max_br = br.read_u32be()?; + let _min_br = br.read_u32be()?; + }, + 5 => { + info_start = br.tell() as usize; + info_size = size as usize; + break; + }, + _ => br.read_skip(size as usize)?, + } + } + validate!(info_start > 0 && info_size > 0); + self.m4ainfo.read(&edata[info_start..][..info_size])?; + } else { + self.m4ainfo.read(&edata)?; + } //println!("{}", self.m4ainfo); if (self.m4ainfo.otype != M4AType::LC) || (self.m4ainfo.channels > 2) || (self.m4ainfo.samples != 1024) {