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::*;
let start = w * 128 + self.get_band_start(tns_max_bands.min(bottom));
let end = w * 128 + self.get_band_start(tns_max_bands.min(top));
let lpc = &tns_data.coeffs[w][f].coef;
+ let mut state = [0.0f32; 64];
+ let mut sidx = 32;
if !tns_data.coeffs[w][f].direction {
for m in start..end {
- for i in 0..order.min(m) {
- self.coeffs[m] -= self.coeffs[m - i - 1] * lpc[i];
+ for i in 0..order {
+ self.coeffs[m] -= state[(sidx + i) & 63] * lpc[i];
}
+ sidx = (sidx + 63) & 63;
+ state[sidx] = self.coeffs[m];
}
} else {
for m in (start..end).rev() {
- for i in 0..order.min(m) {
- self.coeffs[m] -= self.coeffs[m + i - 1] * lpc[i];
+ for i in 0..order {
+ self.coeffs[m] -= state[(sidx + i) & 63] * lpc[i];
}
+ sidx = (sidx + 63) & 63;
+ state[sidx] = self.coeffs[m];
}
}
}
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 {
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 {
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) {
use nihav_core::codecs::RegisteredDecoders;
use nihav_core::demuxers::RegisteredDemuxers;
use nihav_codec_support::test::dec_video::test_decode_audio;
- use crate::generic_register_all_codecs;
+ use crate::generic_register_all_decoders;
use nihav_realmedia::realmedia_register_all_demuxers;
#[test]
fn test_aac() {
let mut dmx_reg = RegisteredDemuxers::new();
realmedia_register_all_demuxers(&mut dmx_reg);
let mut dec_reg = RegisteredDecoders::new();
- generic_register_all_codecs(&mut dec_reg);
+ generic_register_all_decoders(&mut dec_reg);
// let file = "assets/RV/rv40_weighted_mc.rmvb";
let file = "assets/RV/rv40_weighted_mc_2.rmvb";