5 use nihav_core::formats::*;
6 use nihav_core::frame::*;
7 use nihav_core::codecs::*;
8 use nihav_core::io::bitreader::*;
9 use nihav_core::io::codebook::*;
10 use nihav_codec_support::dsp::fft::*;
11 use nihav_codec_support::dsp::window::*;
13 const BANDS: usize = 32;
14 const COEFFS: usize = 256;
15 const BLOCK_SIZE: usize = 64;
18 pretwiddle1: [f32; COEFFS/2],
19 pretwiddle2: [f32; COEFFS/2],
20 posttwiddle: [FFTComplex; COEFFS/2],
21 tmp: [FFTComplex; COEFFS/2],
23 window: [f32; COEFFS],
27 old_floor: [f32; BANDS],
28 new_floor: [f32; BANDS],
29 log_floor: [f32; BANDS],
30 log_floor2: [f32; BANDS],
31 bit_est: [f32; BANDS],
32 mask_wght: [f32; BANDS],
33 adj_floor: [f32; BANDS],
35 last_im: [f32; COEFFS/2],
39 band_width: [usize; BANDS],
40 band_present: [bool; BANDS],
41 band_skip: [bool; BANDS],
42 band_bits: [u8; BANDS],
44 band_bitsum: [usize; BANDS],
45 skip_flag: [bool; COEFFS],
46 skip_flag_bits: [u8; BANDS],
47 skips_per_band: [usize; BANDS],
48 keep_flag: [bool; BANDS],
55 old_floor: [0.0; BANDS],
56 new_floor: [0.0; BANDS],
57 log_floor: [0.0; BANDS],
58 log_floor2: [0.0; BANDS],
59 bit_est: [0.0; BANDS],
60 mask_wght: [0.0; BANDS],
61 adj_floor: [0.0; BANDS],
63 last_im: [0.0; COEFFS/2],
67 for i in 0..self.old_floor.len() { self.old_floor[i] = 1.0; }
68 for i in 0..self.cw.len() { self.cw[i] = 0.0; }
72 const BITALLOC_LIMIT: f32 = -1.0e20;
73 const BITALLOC_TOP_LIMIT: f32 = 1.0e20;
77 band_width: [0; BANDS],
78 band_present: [false; BANDS],
79 band_skip: [false; BANDS],
80 band_bits: [0; BANDS],
82 band_bitsum: [0; BANDS],
83 skip_flag: [false; COEFFS],
84 skip_flag_bits: [0; BANDS],
85 skips_per_band: [0; BANDS],
86 keep_flag: [false; BANDS],
92 self.band_width[i] = 0;
93 self.band_present[i] = false;
94 self.band_skip[i] = false;
95 self.band_bits[i] = 0;
96 self.keep_flag[i] = false;
97 self.band_bitsum[i] = 0;
98 self.skips_per_band[i] = 0;
99 self.skip_flag_bits[i] = 0;
103 self.skip_flag[i] = false;
106 #[allow(clippy::cognitive_complexity)]
107 fn calculate_bit_allocation(&mut self, ch_data: &mut IMCChannel, bits: usize, fixed_head: bool, adj_idx: usize) -> DecoderResult<()> {
110 for coef in ch_data.new_floor.iter() { if *coef > peak { peak = *coef; } }
113 for band in 0..BANDS-1 {
114 ch_data.bit_est[band] = ch_data.log_floor2[band] - ch_data.mask_wght[band].log2();
116 ch_data.bit_est[BANDS - 1] = BITALLOC_LIMIT;
118 for band in 0..BANDS {
120 let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band];
121 if band_w == self.band_width[band] { idx = 0; }
122 if band_w > self.band_width[band] { idx = 1; }
123 if band_w/2 >= self.band_width[band] { idx = 2; }
126 if ch_data.new_floor[band] < peak { idx += 1; }
127 ch_data.bit_est[band] += IMC_BITALLOC_ADJ[adj_idx][idx];
132 ch_data.bit_est[i] = BITALLOC_LIMIT;
136 let start = if fixed_head { 4 } else { 0 };
140 for band in start..BANDS-1 {
141 a_width += self.band_width[band];
142 pool += (self.band_width[band] as f32) * ch_data.bit_est[band];
144 validate!(a_width > 0);
146 self.band_width[BANDS - 1] = 0;
147 pool = (pool * 0.5 - (bits as f32)) / (a_width as f32);
149 let free_bits = bits as i32;
150 let mut cur_bits: i32 = 0;
153 for i in 0..BANDS/2 {
154 let diff = cur_bits - free_bits;
155 if diff.abs() <= 8 { break; }
159 for band in start..BANDS {
160 let mut len = (ch_data.bit_est[band] * 0.5 - pool + 0.5) as i32;
161 if len < 0 { len = 0; }
162 if len > 6 { len = 6; }
163 self.band_bits[band] = len as u8;
164 cur_bits += (self.band_width[band] as i32) * len;
166 acc += self.band_width[band] as i32;
170 let mut lflag = flag;
172 if free_bits < cur_bits { flag = -1; }
173 if i == 0 { lflag = flag; }
177 pool += ((cur_bits - free_bits) as f32) / (((mmcount + 1) * acc) as f32);
180 for band in start..BANDS {
181 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
182 self.cw_len[i] = self.band_bits[band];
186 if free_bits > cur_bits {
187 let mut tmp: [f32; BANDS] = [BITALLOC_LIMIT; BANDS];
188 for (dst, (&band_bits, &bit_est)) in tmp.iter_mut()
189 .zip(self.band_bits.iter().zip(ch_data.bit_est.iter())) {
191 *dst = f32::from(band_bits) * -2.0 + bit_est - 0.415;
195 while (peak > BITALLOC_LIMIT) && (cur_bits < free_bits) {
196 peak = BITALLOC_LIMIT;
197 let mut idx: Option<usize> = None;
198 for (band, &level) in tmp.iter().enumerate() {
204 if let Some(band) = idx {
206 self.band_bits[band] += 1;
207 if self.band_bits[band] == 6 {
208 tmp[band] = BITALLOC_LIMIT;
210 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
213 if cur_bits >= free_bits {
221 if cur_bits > free_bits {
222 let mut tmp: [f32; BANDS] = [BITALLOC_TOP_LIMIT; BANDS];
223 for (dst, (&band_bits, &bit_est)) in tmp.iter_mut()
224 .zip(self.band_bits.iter().zip(ch_data.bit_est.iter())).skip(start) {
226 *dst = f32::from(band_bits) * -2.0 + bit_est - 0.415 + 2.0;
229 while free_bits < cur_bits {
230 let mut low = BITALLOC_TOP_LIMIT;
232 for (band, &level) in tmp.iter().enumerate() {
239 self.band_bits[idx] -= 1;
240 if self.band_bits[idx] == 0 {
241 tmp[idx] = BITALLOC_TOP_LIMIT;
243 for i in IMC_BANDS[idx]..IMC_BANDS[idx + 1] {
244 if self.cw_len[i] > 0 {
247 if cur_bits <= free_bits {
258 fn adjust_bit_allocation(&mut self, ch_data: &mut IMCChannel, free_bits: i32) {
259 let mut tmp: [f32; BANDS] = [BITALLOC_LIMIT; BANDS];
260 for (dst, (&band_bits, &bit_est)) in tmp.iter_mut()
261 .zip(self.band_bits.iter().zip(ch_data.bit_est.iter())) {
263 *dst = f32::from(band_bits) * -2.0 + bit_est - 0.415;
266 let mut used_bits: i32 = 0;
268 while (peak > BITALLOC_LIMIT) && (used_bits < free_bits) {
269 peak = BITALLOC_LIMIT;
270 let mut idx: Option<usize> = None;
271 for (band, &level) in tmp.iter().enumerate() {
277 if let Some(band) = idx {
279 self.band_bits[band] += 1;
280 if self.band_bits[band] == 6 {
281 tmp[band] = BITALLOC_LIMIT;
283 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
284 if self.cw_len[i] >= 6 { continue; }
287 if used_bits >= free_bits {
304 let mut exp_lev: [f32; 16] = [0.0; 16];
305 for (lev, el) in exp_lev.iter_mut().enumerate() {
306 *el = 10.0f32.powf(-(lev as f32) * 0.4375);
309 let mut exp_10: [f32; 32] = [0.0; 32];
310 for (i, el) in exp_10.iter_mut().enumerate() {
311 *el = 10.0f32.powf(((i as f32) - 16.0) * 0.25);
314 let mut sqrt_tab: [f32; 32] = [0.0; 32];
315 for (i, el) in sqrt_tab.iter_mut().enumerate() {
316 *el = (i as f32).sqrt();
319 LUTs { exp_lev, exp_10, sqrt_tab }
328 info: NACodecInfoRef,
330 codes: [[Codebook<u8>; 4]; 4],
331 ch_data: [IMCChannel; 2],
335 cycle1: [usize; BANDS],
336 cycle2: [usize; BANDS],
337 weights1: [f32; BANDS-1],
338 weights2: [f32; BANDS-1],
343 fn freq2bark(freq: f32) -> f32 {
344 3.5 * ((freq / 7500.0) * (freq / 7500.0)).atan() + 13.0 * (freq * 0.00076).atan()
347 fn calc_maxcoef(coef: f32) -> (f32, f32) {
348 let c1 = 20000.0 / 10.0f32.powf(coef * 0.057031251);
353 fn new(is_imc: bool) -> Self {
354 let mut cycle1: [usize; BANDS] = [0; BANDS];
355 let mut cycle2: [usize; BANDS] = [0; BANDS];
356 let mut weights1: [f32; BANDS-1] = [0.0; BANDS-1];
357 let mut weights2: [f32; BANDS-1] = [0.0; BANDS-1];
359 cycle1.copy_from_slice(&IMC_CYCLE1);
360 cycle2.copy_from_slice(&IMC_CYCLE2);
361 weights1.copy_from_slice(&IMC_WEIGHTS1);
362 weights2.copy_from_slice(&IMC_WEIGHTS2);
365 let mut ucodes: mem::MaybeUninit::<[[Codebook<u8>; 4]; 4]> = mem::MaybeUninit::uninit();
368 let mut cr = IMCCodeReader::new(i, j);
369 ptr::write(&mut (*ucodes.as_mut_ptr())[i][j], Codebook::new(&mut cr, CodebookMode::MSB).unwrap());
376 chmap: NAChannelMap::new(),
377 ainfo: NAAudioInfo::new(0, 0, SND_F32P_FORMAT, 0),
378 info: NACodecInfo::new_dummy(),
381 ch_data: [IMCChannel::new(), IMCChannel::new()],
383 imdct: IMDCTContext::new(),
393 fn generate_iac_tables(&mut self, sample_rate: f32) {
394 let scale = sample_rate / 256.0 / 2.0 * 0.5;
395 let nyq_freq = sample_rate / 2.0;
396 let mut last_bark = 0.0;
397 let mut freq_max: [f32; BANDS] = [0.0; BANDS];
398 let mut freq_mid: [f32; BANDS] = [0.0; BANDS];
399 let mut freq_min: [f32; BANDS] = [0.0; BANDS];
400 for band in 0..BANDS {
401 let freq = ((IMC_BANDS[band] + IMC_BANDS[band + 1] - 1) as f32) * scale;
402 let bark = freq2bark(freq);
404 let bark_diff = bark - last_bark;
405 self.weights1[band - 1] = 10.0f32.powf(-1.0 * bark_diff);
406 self.weights2[band - 1] = 10.0f32.powf(-2.7 * bark_diff);
409 freq_mid[band] = freq;
411 let mut tmp_freq = freq;
412 while tmp_freq < nyq_freq {
414 if freq2bark(tmp_freq) > bark + 0.5 { break; }
416 freq_max[band] = tmp_freq;
418 let mut tmp_freq = freq;
419 while tmp_freq > 0.0 {
421 if freq2bark(tmp_freq) < bark - 0.5 { break; }
423 freq_min[band] = tmp_freq;
426 for (dst, &freq_max) in self.cycle1.iter_mut().zip(freq_max.iter()) {
427 let mut s_band = BANDS - 1;
428 while s_band > 0 && freq_max <= freq_mid[s_band] { s_band -= 1; }
433 for (dst, &freq_min) in self.cycle2.iter_mut().zip(freq_min.iter()).skip(1) {
435 while s_band < BANDS-1 && freq_min >= freq_mid[s_band] { s_band += 1; }
440 fn read_level_coeffs_raw(&mut self, br: &mut BitReader, ch: usize) -> DecoderResult<()> {
441 let ch_data = &mut self.ch_data[ch];
442 let maxc_pos = br.read(5)? as usize;
443 let max_coef = br.read(7)? as u8;
445 let (c1, c2) = calc_maxcoef(f32::from(max_coef));
448 let level = br.read(4)?;
449 ch_data.new_floor[i] = c1 * self.luts.exp_lev[level as usize];
450 ch_data.log_floor[i] = c2 - 1.4533435415 * (level as f32);
452 ch_data.new_floor[i] = c1;
453 ch_data.log_floor[i] = c2;
455 self.ba.band_width[i] = IMC_BANDS[i + 1] - IMC_BANDS[i];
457 ch_data.log_floor2[i] = ch_data.log_floor[i] * 2.0;
458 ch_data.mask_wght[i] = 1.0;
464 fn calculate_channel_values(&mut self, ch: usize) {
465 let ch_data = &mut self.ch_data[ch];
466 let mut tmp2: [f32; BANDS+1] = [0.0; BANDS+1];
467 let mut tmp3: [f32; BANDS] = [0.0; BANDS];
469 for (band, dst) in tmp3.iter_mut().enumerate() {
470 ch_data.mask_wght[band] = 0.0;
472 if self.ba.band_width[band] > 0 {
473 val = f64::from(ch_data.new_floor[band]).powi(2);
474 ch_data.log_floor2[band] = 2.0 * ch_data.log_floor[band];
477 ch_data.log_floor2[band] = -30000.0;
479 let tmp = val * (self.ba.band_width[band] as f64) * 0.01;
480 *dst = if val <= 1.0e-30 { 0.0 } else { tmp as f32 };
483 for (band, (&next_band, &add_val)) in self.cycle1.iter().zip(tmp3.iter()).enumerate() {
484 for el in ch_data.mask_wght[band..next_band].iter_mut() {
487 tmp2[next_band] += add_val;
491 for (mask_weight, (&val, &weight)) in ch_data.mask_wght[1..].iter_mut()
492 .zip(tmp2[1..].iter().zip(self.weights1.iter())) {
493 accum = (accum + val) * weight;
494 *mask_weight += accum;
497 let mut tmp2: [f32; BANDS] = [0.0; BANDS];
499 for (band, &prev_band) in self.cycle2.iter().enumerate().skip(1) {
500 for band2 in prev_band+1..band {
501 ch_data.mask_wght[band2] += tmp3[band];
503 tmp2[prev_band + 1] += tmp3[band];
507 for i in 0..BANDS-1 {
508 let band = BANDS - 2 - i;
509 accum = (tmp2[band + 1] + accum) * self.weights2[band];
510 ch_data.mask_wght[band] += accum;
514 fn read_level_coeffs(&mut self, br: &mut BitReader, reset: bool, sel_idx: usize, ch: usize) -> DecoderResult<()> {
515 let mut level: [i8; BANDS] = [0; BANDS];
519 level[0] = br.read(7)? as i8;
523 for (i, (level, &code_idx)) in level.iter_mut()
524 .zip(IMC_CB_SELECTOR[sel_idx].iter()).enumerate().skip(start) {
525 *level = br.read_cb(&self.codes[sel_idx][code_idx])? as i8;
527 *level += br.read(4)? as i8;
529 self.ba.keep_flag[i] = *level == 16;
532 let ch_data = &mut self.ch_data[ch];
533 let (mut c1, mut c2) = calc_maxcoef(f32::from(level[0]));
534 ch_data.new_floor[0] = c1;
535 ch_data.log_floor[0] = c2;
536 for (i, &level) in level.iter().enumerate().skip(1) {
538 ch_data.new_floor[i] = 1.0;
539 ch_data.log_floor[i] = 0.0;
541 let lval = if level < 17 {
543 } else if level < 25 {
548 c1 *= self.luts.exp_10[(lval + 16) as usize];
549 c2 += 0.83048 * f32::from(lval);
550 ch_data.new_floor[i] = c1;
551 ch_data.log_floor[i] = c2;
555 let ch_data = &mut self.ch_data[ch];
556 for (i, &level) in level.iter().enumerate() {
558 let lval = level - 7;
559 ch_data.new_floor[i] = self.luts.exp_10[(lval + 16) as usize] * ch_data.old_floor[i];
560 ch_data.log_floor[i] += f32::from(lval) * 0.83048;
562 ch_data.new_floor[i] = ch_data.old_floor[i];
567 self.ba.band_width[0] = IMC_BANDS[1] - IMC_BANDS[0];
570 self.ba.band_width[i] = IMC_BANDS[i + 1] - IMC_BANDS[i];
572 self.ba.band_width[i] = 0;
576 for i in 0..BANDS-1 {
577 if self.ba.band_width[i] > 0 {
578 self.ba.band_present[i] = br.read_bool()?;
581 self.calculate_channel_values(ch);
586 fn read_skip_flags(&mut self, br: &mut BitReader) -> DecoderResult<()> {
587 let ba = &mut self.ba;
588 for band in 0..BANDS {
589 if !ba.band_present[band] || ba.band_width[band] == 0 { continue; }
591 if !ba.band_skip[band] {
592 ba.skip_flag_bits[band] = (IMC_BANDS[band + 1] - IMC_BANDS[band]) as u8;
593 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
594 ba.skip_flag[i] = br.read_bool()?;
596 ba.skips_per_band[band] += 1;
600 let mut i = IMC_BANDS[band];
601 while i < IMC_BANDS[band + 1] - 1 {
602 if !br.read_bool()? {
603 ba.skip_flag_bits[band] += 1;
604 ba.skip_flag[i] = true;
605 ba.skip_flag[i + 1] = true;
606 ba.skips_per_band[band] += 2;
607 } else if br.read_bool()? {
608 ba.skip_flag_bits[band] += 2;
609 ba.skip_flag[i] = false;
610 ba.skip_flag[i + 1] = true;
611 ba.skips_per_band[band] += 1;
613 ba.skip_flag_bits[band] += 3;
614 if !br.read_bool()? {
615 ba.skip_flag[i] = true;
616 ba.skips_per_band[band] += 1;
618 ba.skip_flag[i] = false;
620 ba.skip_flag[i + 1] = false;
624 if i != IMC_BANDS[band + 1] {
625 ba.skip_flag_bits[band] += 1;
626 ba.skip_flag[i] = br.read_bool()?;
628 ba.skips_per_band[band] += 1;
636 fn read_bitalloc_delta(&mut self, br: &mut BitReader, ch: usize) -> DecoderResult<()> {
637 for band in 0..BANDS {
638 self.ba.band_bitsum[band] = 0;
639 self.ba.band_skip[band] = false;
640 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
641 self.ba.band_bitsum[band] += self.ba.cw_len[i] as usize;
643 if self.ba.band_present[band] {
644 let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band];
645 let bitsum = self.ba.band_bitsum[band];
646 if (bitsum > 0) && (((band_w * 3) >> 1) > bitsum) {
647 self.ba.band_skip[band] = true;
652 self.read_skip_flags(br)?;
654 let ch_data = &mut self.ch_data[ch];
655 for band in 0..BANDS {
656 ch_data.adj_floor[band] = ch_data.new_floor[band];
657 let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band];
658 let nonskip = band_w - self.ba.skips_per_band[band];
659 if self.ba.band_present[band] && nonskip > 0 {
660 ch_data.adj_floor[band] *= self.luts.sqrt_tab[band_w] / self.luts.sqrt_tab[nonskip];
664 let mut bits_freed: i32 = 0;
665 for band in 0..BANDS {
666 if !self.ba.band_present[band] { continue; }
667 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
668 if self.ba.skip_flag[i] {
669 bits_freed += i32::from(self.ba.cw_len[i]);
670 self.ba.cw_len[i] = 0;
673 bits_freed -= i32::from(self.ba.skip_flag_bits[band]);
676 if bits_freed < 0 { return Err(DecoderError::Bug); }
677 self.ba.adjust_bit_allocation(ch_data, bits_freed);
682 fn read_coeffs(&mut self, br: &mut BitReader) -> DecoderResult<()> {
683 for band in 0..BANDS {
684 if self.ba.band_bitsum[band] == 0 { continue; }
685 if !self.ba.band_present[band] && (self.ba.band_width[band] == 0) { continue; }
686 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
687 let len = self.ba.cw_len[i];
688 if len > 0 && (!self.ba.band_present[band] || !self.ba.skip_flag[i]) {
689 self.ba.coeff[i] = br.read(len)? as u8;
691 self.ba.coeff[i] = 0;
698 fn inv_quant(&mut self, ch: usize, raw_coeffs: bool) {
699 let qidx: usize = if raw_coeffs { 1 } else { 0 };
700 let ch_data = &mut self.ch_data[ch];
701 for band in 0..BANDS {
702 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
704 let cw_len = self.ba.cw_len[i];
705 if cw_len == 0 || self.ba.skip_flag[i] { continue; }
707 let val = self.ba.coeff[i] as usize;
708 let mid = 1 << (cw_len - 1);
709 let max = (1 << cw_len) - 1;
711 let quant = &IMC_QUANT_LARGE[qidx];
713 ch_data.cw[i] = quant[val - 8] * ch_data.adj_floor[band];
715 ch_data.cw[i] = -quant[max - val - 8] * ch_data.adj_floor[band];
718 let idx = qidx + (if self.ba.band_present[band] { 2 } else { 0 });
719 let quant = &IMC_QUANT_SMALL[idx];
721 ch_data.cw[i] = quant[val - 1] * ch_data.adj_floor[band];
723 ch_data.cw[i] = -quant[max - val - 1] * ch_data.adj_floor[band];
730 #[allow(clippy::collapsible_else_if)]
731 fn decode_block(&mut self, data: &[u8], ch: usize, dst: &mut [f32]) -> DecoderResult<()> {
732 let mut br = BitReader::new(&data[BLOCK_SIZE*ch..][..BLOCK_SIZE], BitReaderMode::LE16MSB);
733 let hdr = br.read(9)?;
734 validate!((hdr & 0x18) == 0);
736 let reset = br.read_bool()?;
737 let fixed_head = br.read_bool()?;
738 let raw_coeffs = br.read_bool()?;
739 let weight_idx = br.read(1)? as usize;
742 self.ch_data[ch].reset();
748 self.read_level_coeffs_raw(&mut br, ch)?;
750 let cb_idx = (if reset { 2 } else { 0 }) + (if fixed_head { 1 } else { 0 });
751 self.read_level_coeffs(&mut br, reset, cb_idx, ch)?;
754 self.ch_data[ch].old_floor.copy_from_slice(&self.ch_data[ch].new_floor);
756 let mut bitcount: usize = 0;
759 self.ba.band_bits[0] = 5;
761 self.ba.cw_len[i] = 5;
764 let bits = if raw_coeffs || !self.ba.keep_flag[band] { 5 } else { 0 };
765 self.ba.band_bits[band] = bits;
766 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
767 self.ba.cw_len[i] = bits;
768 bitcount += bits as usize;
774 if self.ba.band_width[BANDS - 1] != 0 {
779 if self.ba.band_width[BANDS - 1] != 0 {
784 validate!(br.tell() + bitcount < BLOCK_SIZE * 8);
785 self.ba.calculate_bit_allocation(&mut self.ch_data[ch], 512 - bitcount - br.tell(), fixed_head, weight_idx)?;
788 self.read_bitalloc_delta(&mut br, ch)?;
791 for band in 0..BANDS {
792 self.ba.band_bitsum[band] = 0;
793 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
794 if !self.ba.skip_flag[i] {
795 self.ba.band_bitsum[band] += self.ba.cw_len[i] as usize;
800 self.read_coeffs(&mut br)?;
801 self.inv_quant(ch, raw_coeffs);
802 self.imdct.imdct(&self.ch_data[ch].cw, dst, &mut self.ch_data[ch].last_im);
810 let mut window: [f32; COEFFS] = [0.0; COEFFS];
811 generate_window(WindowType::Sine, 1.0, COEFFS, true, &mut window);
812 let mut pretwiddle1: [f32; COEFFS/2] = [0.0; COEFFS/2];
813 let mut pretwiddle2: [f32; COEFFS/2] = [0.0; COEFFS/2];
814 let mut posttwiddle: [FFTComplex; COEFFS/2] = [FFTC_ZERO; COEFFS/2];
815 for i in 0..COEFFS/2 {
817 let base = (n * 4.0 + 1.0) / 1024.0 * consts::PI;
821 pretwiddle1[i] = -(r1 + r2) * consts::SQRT_2;
822 pretwiddle2[i] = (r1 - r2) * consts::SQRT_2;
824 pretwiddle1[i] = (r1 + r2) * consts::SQRT_2;
825 pretwiddle2[i] = -(r1 - r2) * consts::SQRT_2;
827 posttwiddle[i] = FFTComplex::exp(consts::PI / 256.0 * n).scale(1.0/32768.0);
833 tmp: [FFTC_ZERO; COEFFS/2],
834 fft: FFTBuilder::new_fft(COEFFS/2, false),
838 fn imdct(&mut self, coeffs: &[f32; COEFFS], dst: &mut [f32], last_im: &mut [f32; COEFFS/2]) {
839 for i in 0..COEFFS/2 {
840 let in2 = coeffs[i * 2];
841 let in1 = coeffs[COEFFS - 1 - i * 2];
842 let c2 = self.pretwiddle1[i];
843 let c1 = self.pretwiddle2[i];
844 self.tmp[i].re = -(c2 * in1 + c1 * in2);
845 self.tmp[i].im = c1 * in1 - c2 * in2;
847 self.fft.do_ifft_inplace(&mut self.tmp);
848 for i in 0..COEFFS/2 {
849 let tmp = !(self.tmp[i] * self.posttwiddle[i]);
850 let c1 = self.window[i * 2];
851 let c2 = self.window[COEFFS - 1 - i * 2];
853 dst[i * 2] = c2 * im + c1 * tmp.re;
854 dst[COEFFS - 1 - i * 2] = c1 * im - c2 * tmp.re;
860 const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C];
861 const CHMAP_STEREO: [NAChannelType; 2] = [NAChannelType::L, NAChannelType::R];
863 impl NADecoder for IMCDecoder {
864 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
865 if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
866 self.chmap = NAChannelMap::new();
867 match ainfo.get_channels() {
868 1 => { self.chmap.add_channels(&CHMAP_MONO); },
869 2 => { self.chmap.add_channels(&CHMAP_STEREO); },
870 _ => { return Err(DecoderError::InvalidData); },
872 self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(),
873 ainfo.get_channels(),
875 self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo));
878 self.generate_iac_tables(ainfo.get_sample_rate() as f32);
882 Err(DecoderError::InvalidData)
885 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
886 let info = pkt.get_stream().get_info();
887 validate!(info.get_properties().is_audio());
888 let pktbuf = pkt.get_buffer();
890 let nblocks = pktbuf.len() / BLOCK_SIZE / (self.ainfo.get_channels() as usize);
891 let duration = COEFFS * nblocks;
893 let abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?;
894 let mut adata = abuf.get_abuf_f32().unwrap();
895 let dst = adata.get_data_mut().unwrap();
897 let mut start: usize = 0;
898 let channels = self.ainfo.get_channels() as usize;
899 for chunk in pktbuf.chunks(BLOCK_SIZE * channels) {
900 for ch in 0..channels {
901 let off = abuf.get_offset(ch) + start;
902 self.decode_block(chunk, ch, &mut dst[off..off+COEFFS])?;
904 if (channels == 2) && ((chunk[1] & 0x20) != 0) {
905 let off1 = abuf.get_offset(0) + start;
906 let off2 = abuf.get_offset(1) + start;
908 let l = dst[off1 + i];
909 let r = dst[off2 + i];
910 dst[off1 + i] = l + r;
911 dst[off2 + i] = l - r;
917 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
918 frm.set_keyframe(true);
921 fn flush(&mut self) {
925 impl NAOptionHandler for IMCDecoder {
926 fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
927 fn set_options(&mut self, _options: &[NAOption]) { }
928 fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
931 pub fn get_decoder_imc() -> Box<dyn NADecoder + Send> {
932 Box::new(IMCDecoder::new(true))
935 pub fn get_decoder_iac() -> Box<dyn NADecoder + Send> {
936 Box::new(IMCDecoder::new(false))
939 struct IMCCodeReader { sel1: usize, sel2: usize }
942 fn new(sel1: usize, sel2: usize) -> Self { IMCCodeReader { sel1, sel2 } }
945 impl CodebookDescReader<u8> for IMCCodeReader {
946 fn bits(&mut self, idx: usize) -> u8 { IMC_CODE_LENGTHS[self.sel1][self.sel2][idx] }
947 fn code(&mut self, idx: usize) -> u32 { u32::from(IMC_CODE_CODES[self.sel1][self.sel2][idx]) }
948 fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
949 fn len(&mut self) -> usize { IMC_CODE_LENGTHS[0][0].len() }
952 static IMC_BANDS: [usize; 33] = [
953 0, 3, 6, 9, 12, 16, 20, 24, 29, 34, 40, 46, 53, 60, 68, 76,
954 84, 93, 102, 111, 121, 131, 141, 151, 162, 173, 184, 195, 207, 219, 231, 243,
958 const IMC_QUANT_SMALL: &[[f32; 8]; 4] = &[
959 [ 8.4431201e-1, 4.7358301e-1, 1.448354, 2.7073899e-1,
960 7.4449003e-1, 1.241991, 1.845484, 0.0 ],
961 [ 8.6876702e-1, 4.7659001e-1, 1.478224, 2.5672799e-1,
962 7.55777e-1, 1.3229851, 2.03438, 0.0 ],
963 [ 7.5891501e-1, 6.2272799e-1, 1.271322, 3.47904e-1,
964 7.5317699e-1, 1.150767, 1.628476, 0.0 ],
965 [ 7.65257e-1, 6.44647e-1, 1.263824, 3.4548101e-1,
966 7.6384902e-1, 1.214466, 1.7638789, 0.0 ]
969 const IMC_QUANT_LARGE: &[[f32; 56]; 2] = &[
970 [ 1.39236e-1, 3.50548e-1, 5.9547901e-1, 8.5772401e-1,
971 1.121545, 1.3882281, 1.695882, 2.1270809,
972 7.2221003e-2, 1.85177e-1, 2.9521701e-1, 4.12568e-1,
973 5.4068601e-1, 6.7679501e-1, 8.1196898e-1, 9.4765198e-1,
974 1.0779999, 1.203415, 1.337265, 1.481871,
975 1.639982, 1.814766, 2.0701399, 2.449862,
976 3.7533998e-2, 1.02722e-1, 1.6021401e-1, 2.16043e-1,
977 2.7231601e-1, 3.3025399e-1, 3.9022601e-1, 4.52849e-1,
978 5.1794899e-1, 5.8529502e-1, 6.53956e-1, 7.2312802e-1,
979 7.9150802e-1, 8.5891002e-1, 9.28141e-1, 9.9706203e-1,
980 1.062153, 1.12564, 1.189834, 1.256122,
981 1.324469, 1.3955311, 1.468906, 1.545084,
982 1.6264729, 1.711524, 1.802705, 1.91023,
983 2.0533991, 2.22333, 2.4830019, 3.253329 ],
984 [ 1.11654e-1, 3.54469e-1, 6.4232099e-1, 9.6128798e-1,
985 1.295053, 1.61777, 1.989839, 2.51107,
986 5.7721999e-2, 1.69879e-1, 2.97589e-1, 4.3858799e-1,
987 5.9039903e-1, 7.4934798e-1, 9.1628098e-1, 1.087297,
988 1.262751, 1.4288321, 1.6040879, 1.79067,
989 2.000668, 2.2394669, 2.649332, 5.2760072,
990 2.9722e-2, 8.7316997e-2, 1.4445201e-1, 2.04247e-1,
991 2.6879501e-1, 3.3716801e-1, 4.08811e-1, 4.8306999e-1,
992 5.6049401e-1, 6.3955498e-1, 7.2044599e-1, 8.0427998e-1,
993 8.8933599e-1, 9.7537601e-1, 1.062461, 1.1510431,
994 1.240236, 1.326715, 1.412513, 1.500502,
995 1.591749, 1.686413, 1.785239, 1.891233,
996 2.0051291, 2.127681, 2.2709141, 2.475826,
997 2.7219379, 3.101985, 4.686213, 6.2287788 ]
1000 static IMC_CYCLE1: [usize; BANDS] = [
1001 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
1002 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32,
1005 static IMC_CYCLE2: [usize; BANDS] = [
1006 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
1007 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
1010 static IMC_WEIGHTS1: [f32; BANDS-1] = [
1011 0.119595, 0.123124, 0.129192, 9.97377e-2,
1012 8.1923e-2, 9.61153e-2, 8.77885e-2, 8.61174e-2,
1013 9.00882e-2, 9.91658e-2, 0.112991, 0.131126,
1014 0.152886, 0.177292, 0.221782, 0.244917,
1015 0.267386, 0.306816, 0.323046, 0.33729,
1016 0.366773, 0.392557, 0.398076, 0.403302,
1017 0.42451, 0.444777, 0.449188, 0.455445,
1018 0.477853, 0.500669, 0.510395
1021 static IMC_WEIGHTS2: [f32; BANDS-1] = [
1022 3.23466e-3, 3.49886e-3, 3.98413e-3, 1.98116e-3,
1023 1.16465e-3, 1.79283e-3, 1.40372e-3, 1.33274e-3,
1024 1.50523e-3, 1.95064e-3, 2.77472e-3, 4.14725e-3,
1025 6.2776e-3, 9.36401e-3, 1.71397e-2, 2.24052e-2,
1026 2.83971e-2, 4.11689e-2, 4.73165e-2, 5.31631e-2,
1027 6.66614e-2, 8.00824e-2, 8.31588e-2, 8.61397e-2,
1028 9.89229e-2, 0.112197, 0.115227, 0.119613,
1029 0.136174, 0.15445, 0.162685
1032 static IMC_BITALLOC_ADJ: [[f32; 7]; 2] = [
1033 [ 7.6, 4.4, 6.1, 2.3, 6.2, 1.8, 0.0 ],
1034 [ 3.6, 3.7, 5.1, 1.6, 1.5, 1.2, 0.0 ]
1037 static IMC_CODE_LENGTHS: &[[[u8; 18]; 4]; 4] = &[
1039 [ 16, 15, 13, 11, 8, 5, 3, 1, 2, 4, 6, 9, 10, 12, 14, 16, 7, 0 ],
1040 [ 10, 8, 7, 6, 4, 4, 3, 2, 2, 3, 4, 6, 7, 9, 11, 11, 7, 0 ],
1041 [ 15, 15, 14, 11, 8, 6, 4, 2, 1, 4, 5, 7, 9, 10, 12, 13, 4, 0 ],
1042 [ 13, 11, 10, 8, 6, 4, 2, 2, 2, 3, 5, 7, 9, 12, 15, 15, 14, 0 ],
1044 [ 14, 12, 10, 8, 7, 4, 2, 2, 2, 3, 5, 7, 9, 11, 13, 14, 7, 0 ],
1045 [ 14, 13, 11, 8, 6, 4, 3, 2, 2, 3, 5, 7, 9, 10, 12, 14, 3, 0 ],
1046 [ 13, 12, 10, 7, 5, 4, 3, 2, 2, 3, 4, 6, 8, 9, 11, 13, 4, 0 ],
1047 [ 13, 12, 10, 7, 5, 4, 3, 2, 2, 3, 4, 6, 8, 9, 11, 13, 4, 0 ],
1049 [ 16, 14, 12, 10, 8, 5, 3, 1, 2, 4, 7, 9, 11, 13, 15, 17, 6, 17 ],
1050 [ 15, 13, 11, 8, 6, 4, 2, 2, 2, 3, 5, 7, 10, 12, 14, 16, 9, 16 ],
1051 [ 14, 12, 11, 9, 8, 6, 3, 1, 2, 5, 7, 10, 13, 15, 16, 17, 4, 17 ],
1052 [ 16, 14, 12, 9, 7, 5, 2, 2, 2, 3, 4, 6, 8, 11, 13, 15, 10, 16 ],
1054 [ 13, 11, 10, 8, 7, 5, 2, 2, 2, 4, 6, 9, 12, 14, 15, 16, 3, 16 ],
1055 [ 11, 11, 10, 9, 8, 7, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 5 ],
1056 [ 9, 9, 7, 6, 5, 4, 3, 3, 2, 3, 4, 5, 4, 5, 5, 6, 8, 6 ],
1057 [ 13, 12, 10, 8, 5, 3, 3, 2, 2, 3, 4, 7, 9, 11, 14, 15, 6, 15 ]
1061 static IMC_CODE_CODES: &[[[u16; 18]; 4]; 4] = &[
1063 [ 0xCC32, 0x6618, 0x1987, 0x0660, 0x00CD, 0x0018, 0x0007, 0x0000, 0x0002,
1064 0x000D, 0x0032, 0x0199, 0x0331, 0x0CC2, 0x330D, 0xCC33, 0x0067, 0x0000 ],
1065 [ 0x02FE, 0x00BE, 0x005E, 0x002D, 0x000A, 0x0009, 0x0003, 0x0003, 0x0000,
1066 0x0002, 0x0008, 0x002C, 0x005D, 0x017E, 0x05FE, 0x05FF, 0x005C, 0x0000 ],
1067 [ 0x5169, 0x5168, 0x28B5, 0x0517, 0x00A3, 0x0029, 0x0008, 0x0003, 0x0000,
1068 0x0009, 0x0015, 0x0050, 0x0144, 0x028A, 0x0A2C, 0x145B, 0x000B, 0x0000 ],
1069 [ 0x1231, 0x048D, 0x0247, 0x0090, 0x0025, 0x0008, 0x0001, 0x0003, 0x0000,
1070 0x0005, 0x0013, 0x0049, 0x0122, 0x0919, 0x48C3, 0x48C2, 0x2460, 0x0000 ]
1072 [ 0x2D1D, 0x0B46, 0x02D0, 0x00B5, 0x0059, 0x000A, 0x0003, 0x0001, 0x0000,
1073 0x0004, 0x0017, 0x005B, 0x0169, 0x05A2, 0x168F, 0x2D1C, 0x0058, 0x0000 ],
1074 [ 0x1800, 0x0C01, 0x0301, 0x0061, 0x0019, 0x0007, 0x0004, 0x0003, 0x0000,
1075 0x0005, 0x000D, 0x0031, 0x00C1, 0x0181, 0x0601, 0x1801, 0x0002, 0x0000 ],
1076 [ 0x1556, 0x0AAA, 0x02AB, 0x0054, 0x0014, 0x000B, 0x0002, 0x0003, 0x0000,
1077 0x0003, 0x0008, 0x002B, 0x00AB, 0x0154, 0x0554, 0x1557, 0x0009, 0x0000 ],
1078 [ 0x1556, 0x0AAA, 0x02AB, 0x0054, 0x0014, 0x000B, 0x0002, 0x0003, 0x0000,
1079 0x0003, 0x0008, 0x002B, 0x00AB, 0x0154, 0x0554, 0x1557, 0x0009, 0x0000 ]
1081 [ 0x2993, 0x0A65, 0x0298, 0x00A7, 0x0028, 0x0004, 0x0000, 0x0001, 0x0001,
1082 0x0003, 0x0015, 0x0052, 0x014D, 0x0533, 0x14C8, 0x5324, 0x000B, 0x5325 ],
1083 [ 0x09B8, 0x026F, 0x009A, 0x0012, 0x0005, 0x0000, 0x0001, 0x0002, 0x0003,
1084 0x0001, 0x0003, 0x0008, 0x004C, 0x0136, 0x04DD, 0x1373, 0x0027, 0x1372 ],
1085 [ 0x0787, 0x01E0, 0x00F1, 0x003D, 0x001F, 0x0006, 0x0001, 0x0001, 0x0001,
1086 0x0002, 0x000E, 0x0079, 0x03C2, 0x0F0D, 0x1E19, 0x3C30, 0x0000, 0x3C31 ],
1087 [ 0x4B06, 0x12C0, 0x04B1, 0x0097, 0x0024, 0x0008, 0x0002, 0x0003, 0x0000,
1088 0x0003, 0x0005, 0x0013, 0x004A, 0x0259, 0x0961, 0x2582, 0x012D, 0x4B07 ]
1090 [ 0x0A5A, 0x0297, 0x014A, 0x0053, 0x0028, 0x000B, 0x0003, 0x0000, 0x0002,
1091 0x0004, 0x0015, 0x00A4, 0x052C, 0x14B7, 0x296C, 0x52DB, 0x0003, 0x52DA ],
1092 [ 0x0193, 0x0192, 0x00C8, 0x0065, 0x0033, 0x0018, 0x0007, 0x0004, 0x0000,
1093 0x0004, 0x0005, 0x0007, 0x0006, 0x0003, 0x0005, 0x0005, 0x000D, 0x0004 ],
1094 [ 0x0012, 0x0013, 0x0005, 0x0003, 0x0000, 0x0003, 0x0005, 0x0004, 0x0003,
1095 0x0003, 0x0005, 0x0005, 0x0004, 0x0004, 0x0003, 0x0005, 0x0008, 0x0004 ],
1096 [ 0x0D66, 0x06B2, 0x01AD, 0x006A, 0x000C, 0x0005, 0x0004, 0x0000, 0x0003,
1097 0x0002, 0x0007, 0x0034, 0x00D7, 0x0358, 0x1ACF, 0x359C, 0x001B, 0x359D ]
1101 const IMC_CB_SELECTOR: [[usize; BANDS]; 4] = [
1102 [ 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0,
1103 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2 ],
1104 [ 0, 2, 0, 3, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1105 0, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
1106 [ 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1107 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2 ],
1108 [ 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1109 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
1114 use nihav_core::codecs::RegisteredDecoders;
1115 use nihav_core::demuxers::RegisteredDemuxers;
1116 use nihav_codec_support::test::dec_video::*;
1117 use crate::indeo_register_all_decoders;
1118 use nihav_commonfmt::generic_register_all_demuxers;
1121 let mut dmx_reg = RegisteredDemuxers::new();
1122 generic_register_all_demuxers(&mut dmx_reg);
1123 let mut dec_reg = RegisteredDecoders::new();
1124 indeo_register_all_decoders(&mut dec_reg);
1126 // let file = "assets/Indeo/neal73_saber.avi";
1127 // let file = "assets/Indeo/IMC/hvalen.avi";
1128 // sample from a private collection
1129 let file = "assets/Indeo/IMC/8khz.avi";
1130 // let file = "assets/Indeo/STsKlassFist-1a.avi";
1131 // let file = "assets/Indeo/IMC/Angel Bday.avi";
1132 test_decode_audio("avi", file, None, None/*Some("imc")*/, &dmx_reg, &dec_reg);
1133 //test_file_decoding("avi", file, None, false, true, None);