]> git.nihav.org Git - nihav.git/blame_incremental - nihav-indeo/src/codecs/imc.rs
avimux: do not record palette change chunks in OpenDML index
[nihav.git] / nihav-indeo / src / codecs / imc.rs
... / ...
CommitLineData
1use std::mem;
2use std::ptr;
3use std::f32::consts;
4
5use nihav_core::formats::*;
6use nihav_core::frame::*;
7use nihav_core::codecs::*;
8use nihav_core::io::bitreader::*;
9use nihav_core::io::codebook::*;
10use nihav_codec_support::dsp::fft::*;
11use nihav_codec_support::dsp::window::*;
12
13const BANDS: usize = 32;
14const COEFFS: usize = 256;
15const BLOCK_SIZE: usize = 64;
16
17struct IMDCTContext {
18 pretwiddle1: [f32; COEFFS/2],
19 pretwiddle2: [f32; COEFFS/2],
20 posttwiddle: [FFTComplex; COEFFS/2],
21 tmp: [FFTComplex; COEFFS/2],
22 fft: FFT,
23 window: [f32; COEFFS],
24}
25
26struct IMCChannel {
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],
34 cw: [f32; COEFFS],
35 last_im: [f32; COEFFS/2],
36}
37
38struct BitAlloc {
39 band_width: [usize; BANDS],
40 band_present: [bool; BANDS],
41 band_skip: [bool; BANDS],
42 band_bits: [u8; BANDS],
43 cw_len: [u8; COEFFS],
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],
49 coeff: [u8; COEFFS],
50}
51
52impl IMCChannel {
53 fn new() -> Self {
54 IMCChannel {
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],
62 cw: [0.0; COEFFS],
63 last_im: [0.0; COEFFS/2],
64 }
65 }
66 fn reset(&mut self) {
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; }
69 }
70}
71
72const BITALLOC_LIMIT: f32 = -1.0e20;
73const BITALLOC_TOP_LIMIT: f32 = 1.0e20;
74impl BitAlloc {
75 fn new() -> Self {
76 BitAlloc {
77 band_width: [0; BANDS],
78 band_present: [false; BANDS],
79 band_skip: [false; BANDS],
80 band_bits: [0; BANDS],
81 cw_len: [0; COEFFS],
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],
87 coeff: [0; COEFFS],
88 }
89 }
90 fn reset(&mut self) {
91 for i in 0..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;
100 }
101 for i in 0..COEFFS {
102 self.cw_len[i] = 0;
103 self.skip_flag[i] = false;
104 }
105 }
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<()> {
108
109 let mut peak = 0.0;
110 for coef in ch_data.new_floor.iter() { if *coef > peak { peak = *coef; } }
111 peak *= 0.25;
112
113 for band in 0..BANDS-1 {
114 ch_data.bit_est[band] = ch_data.log_floor2[band] - ch_data.mask_wght[band].log2();
115 }
116 ch_data.bit_est[BANDS - 1] = BITALLOC_LIMIT;
117
118 for band in 0..BANDS {
119 let mut idx = 42;
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; }
124 validate!(idx <= 2);
125 idx *= 2;
126 if ch_data.new_floor[band] < peak { idx += 1; }
127 ch_data.bit_est[band] += IMC_BITALLOC_ADJ[adj_idx][idx];
128 }
129
130 if fixed_head {
131 for i in 0..4 {
132 ch_data.bit_est[i] = BITALLOC_LIMIT;
133 }
134 }
135
136 let start = if fixed_head { 4 } else { 0 };
137
138 let mut a_width = 0;
139 let mut pool = 0.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];
143 }
144 validate!(a_width > 0);
145
146 self.band_width[BANDS - 1] = 0;
147 pool = (pool * 0.5 - (bits as f32)) / (a_width as f32);
148
149 let free_bits = bits as i32;
150 let mut cur_bits: i32 = 0;
151 let mut flag = 1;
152 let mut mmcount = 0;
153 for i in 0..BANDS/2 {
154 let diff = cur_bits - free_bits;
155 if diff.abs() <= 8 { break; }
156
157 cur_bits = 0;
158 let mut acc = 0;
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;
165 if len > 0 {
166 acc += self.band_width[band] as i32;
167 }
168 }
169
170 let mut lflag = flag;
171 flag = 1;
172 if free_bits < cur_bits { flag = -1; }
173 if i == 0 { lflag = flag; }
174 if flag != lflag {
175 mmcount += 1;
176 }
177 pool += ((cur_bits - free_bits) as f32) / (((mmcount + 1) * acc) as f32);
178 }
179
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];
183 }
184 }
185
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())) {
190 if band_bits != 6 {
191 *dst = f32::from(band_bits) * -2.0 + bit_est - 0.415;
192 }
193 }
194 let mut peak = 0.0;
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() {
199 if level > peak {
200 peak = level;
201 idx = Some(band);
202 }
203 }
204 if let Some(band) = idx {
205 tmp[band] -= 2.0;
206 self.band_bits[band] += 1;
207 if self.band_bits[band] == 6 {
208 tmp[band] = BITALLOC_LIMIT;
209 }
210 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
211 self.cw_len[i] += 1;
212 cur_bits += 1;
213 if cur_bits >= free_bits {
214 break;
215 }
216 }
217 }
218 }
219 }
220
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) {
225 if band_bits != 0 {
226 *dst = f32::from(band_bits) * -2.0 + bit_est - 0.415 + 2.0;
227 }
228 }
229 while free_bits < cur_bits {
230 let mut low = BITALLOC_TOP_LIMIT;
231 let mut idx = 0;
232 for (band, &level) in tmp.iter().enumerate() {
233 if level < low {
234 low = level;
235 idx = band;
236 }
237 }
238 tmp[idx] += 2.0;
239 self.band_bits[idx] -= 1;
240 if self.band_bits[idx] == 0 {
241 tmp[idx] = BITALLOC_TOP_LIMIT;
242 }
243 for i in IMC_BANDS[idx]..IMC_BANDS[idx + 1] {
244 if self.cw_len[i] > 0 {
245 self.cw_len[i] -= 1;
246 cur_bits -= 1;
247 if cur_bits <= free_bits {
248 break;
249 }
250 }
251 }
252 }
253 }
254
255 Ok(())
256 }
257
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())) {
262 if band_bits != 6 {
263 *dst = f32::from(band_bits) * -2.0 + bit_est - 0.415;
264 }
265 }
266 let mut used_bits: i32 = 0;
267 let mut peak = 0.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() {
272 if level > peak {
273 peak = level;
274 idx = Some(band);
275 }
276 }
277 if let Some(band) = idx {
278 tmp[band] -= 2.0;
279 self.band_bits[band] += 1;
280 if self.band_bits[band] == 6 {
281 tmp[band] = BITALLOC_LIMIT;
282 }
283 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
284 if self.cw_len[i] >= 6 { continue; }
285 self.cw_len[i] += 1;
286 used_bits += 1;
287 if used_bits >= free_bits {
288 break;
289 }
290 }
291 }
292 }
293 }
294}
295
296struct LUTs {
297 exp_lev: [f32; 16],
298 exp_10: [f32; 32],
299 sqrt_tab: [f32; 32],
300}
301
302impl LUTs {
303 fn new() -> Self {
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);
307 }
308
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);
312 }
313
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();
317 }
318
319 LUTs { exp_lev, exp_10, sqrt_tab }
320 }
321}
322
323struct IMCDecoder {
324 is_imc: bool,
325
326 chmap: NAChannelMap,
327 ainfo: NAAudioInfo,
328 info: NACodecInfoRef,
329
330 codes: [[Codebook<u8>; 4]; 4],
331 ch_data: [IMCChannel; 2],
332 ba: BitAlloc,
333 imdct: IMDCTContext,
334
335 cycle1: [usize; BANDS],
336 cycle2: [usize; BANDS],
337 weights1: [f32; BANDS-1],
338 weights2: [f32; BANDS-1],
339
340 luts: LUTs,
341}
342
343fn freq2bark(freq: f32) -> f32 {
344 3.5 * ((freq / 7500.0) * (freq / 7500.0)).atan() + 13.0 * (freq * 0.00076).atan()
345}
346
347fn calc_maxcoef(coef: f32) -> (f32, f32) {
348 let c1 = 20000.0 / 10.0f32.powf(coef * 0.057031251);
349 (c1, c1.log2())
350}
351
352impl IMCDecoder {
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];
358 if is_imc {
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);
363 }
364 let codes = unsafe {
365 let mut ucodes: mem::MaybeUninit::<[[Codebook<u8>; 4]; 4]> = mem::MaybeUninit::uninit();
366 for i in 0..4 {
367 for j in 0..4 {
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());
370 }
371 }
372 ucodes.assume_init()
373 };
374 IMCDecoder {
375 is_imc,
376 chmap: NAChannelMap::new(),
377 ainfo: NAAudioInfo::new(0, 0, SND_F32P_FORMAT, 0),
378 info: NACodecInfo::new_dummy(),
379
380 codes,
381 ch_data: [IMCChannel::new(), IMCChannel::new()],
382 ba: BitAlloc::new(),
383 imdct: IMDCTContext::new(),
384 luts: LUTs::new(),
385
386 cycle1,
387 cycle2,
388 weights1,
389 weights2,
390 }
391 }
392
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);
403 if band > 0 {
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);
407 }
408 last_bark = bark;
409 freq_mid[band] = freq;
410
411 let mut tmp_freq = freq;
412 while tmp_freq < nyq_freq {
413 tmp_freq += 0.5;
414 if freq2bark(tmp_freq) > bark + 0.5 { break; }
415 }
416 freq_max[band] = tmp_freq;
417
418 let mut tmp_freq = freq;
419 while tmp_freq > 0.0 {
420 tmp_freq -= 0.5;
421 if freq2bark(tmp_freq) < bark - 0.5 { break; }
422 }
423 freq_min[band] = tmp_freq;
424 }
425
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; }
429 *dst = s_band + 1;
430 }
431
432 self.cycle2[0] = 0;
433 for (dst, &freq_min) in self.cycle2.iter_mut().zip(freq_min.iter()).skip(1) {
434 let mut s_band = 0;
435 while s_band < BANDS-1 && freq_min >= freq_mid[s_band] { s_band += 1; }
436 *dst = s_band - 1;
437 }
438 }
439
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;
444
445 let (c1, c2) = calc_maxcoef(f32::from(max_coef));
446 for i in 0..BANDS {
447 if i != maxc_pos {
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);
451 } else {
452 ch_data.new_floor[i] = c1;
453 ch_data.log_floor[i] = c2;
454 }
455 self.ba.band_width[i] = IMC_BANDS[i + 1] - IMC_BANDS[i];
456
457 ch_data.log_floor2[i] = ch_data.log_floor[i] * 2.0;
458 ch_data.mask_wght[i] = 1.0;
459 }
460
461 Ok(())
462 }
463
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];
468
469 for (band, dst) in tmp3.iter_mut().enumerate() {
470 ch_data.mask_wght[band] = 0.0;
471 let val;
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];
475 } else {
476 val = 0.0;
477 ch_data.log_floor2[band] = -30000.0;
478 }
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 };
481 }
482
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() {
485 *el += add_val;
486 }
487 tmp2[next_band] += add_val;
488 }
489
490 let mut accum = 0.0;
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;
495 }
496
497 let mut tmp2: [f32; BANDS] = [0.0; BANDS];
498 tmp2[0] = tmp3[0];
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];
502 }
503 tmp2[prev_band + 1] += tmp3[band];
504 }
505
506 let mut accum = 0.0;
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;
511 }
512 }
513
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];
516 let start;
517 if reset {
518 start = 1;
519 level[0] = br.read(7)? as i8;
520 } else {
521 start = 0;
522 }
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;
526 if *level == 17 {
527 *level += br.read(4)? as i8;
528 }
529 self.ba.keep_flag[i] = *level == 16;
530 }
531 if reset {
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) {
537 if level == 16 {
538 ch_data.new_floor[i] = 1.0;
539 ch_data.log_floor[i] = 0.0;
540 } else {
541 let lval = if level < 17 {
542 level - 7
543 } else if level < 25 {
544 level - 32
545 } else {
546 level - 16
547 };
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;
552 }
553 }
554 } else {
555 let ch_data = &mut self.ch_data[ch];
556 for (i, &level) in level.iter().enumerate() {
557 if level < 16 {
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;
561 } else {
562 ch_data.new_floor[i] = ch_data.old_floor[i];
563 }
564 }
565 }
566
567 self.ba.band_width[0] = IMC_BANDS[1] - IMC_BANDS[0];
568 for i in 1..BANDS {
569 if level[i] != 16 {
570 self.ba.band_width[i] = IMC_BANDS[i + 1] - IMC_BANDS[i];
571 } else {
572 self.ba.band_width[i] = 0;
573 }
574 }
575
576 for i in 0..BANDS-1 {
577 if self.ba.band_width[i] > 0 {
578 self.ba.band_present[i] = br.read_bool()?;
579 }
580 }
581 self.calculate_channel_values(ch);
582
583 Ok(())
584 }
585
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; }
590
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()?;
595 if ba.skip_flag[i] {
596 ba.skips_per_band[band] += 1;
597 }
598 }
599 } else {
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;
612 } else {
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;
617 } else {
618 ba.skip_flag[i] = false;
619 }
620 ba.skip_flag[i + 1] = false;
621 }
622 i += 2;
623 }
624 if i != IMC_BANDS[band + 1] {
625 ba.skip_flag_bits[band] += 1;
626 ba.skip_flag[i] = br.read_bool()?;
627 if ba.skip_flag[i] {
628 ba.skips_per_band[band] += 1;
629 }
630 }
631 }
632 }
633 Ok(())
634 }
635
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;
642 }
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;
648 }
649 }
650 }
651
652 self.read_skip_flags(br)?;
653
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];
661 }
662 }
663
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;
671 }
672 }
673 bits_freed -= i32::from(self.ba.skip_flag_bits[band]);
674 }
675
676 if bits_freed < 0 { return Err(DecoderError::Bug); }
677 self.ba.adjust_bit_allocation(ch_data, bits_freed);
678
679 Ok(())
680 }
681
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;
690 } else {
691 self.ba.coeff[i] = 0;
692 }
693 }
694 }
695 Ok(())
696 }
697
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] {
703 ch_data.cw[i] = 0.0;
704 let cw_len = self.ba.cw_len[i];
705 if cw_len == 0 || self.ba.skip_flag[i] { continue; }
706
707 let val = self.ba.coeff[i] as usize;
708 let mid = 1 << (cw_len - 1);
709 let max = (1 << cw_len) - 1;
710 if cw_len >= 4 {
711 let quant = &IMC_QUANT_LARGE[qidx];
712 if val >= mid {
713 ch_data.cw[i] = quant[val - 8] * ch_data.adj_floor[band];
714 } else {
715 ch_data.cw[i] = -quant[max - val - 8] * ch_data.adj_floor[band];
716 }
717 } else {
718 let idx = qidx + (if self.ba.band_present[band] { 2 } else { 0 });
719 let quant = &IMC_QUANT_SMALL[idx];
720 if val >= mid {
721 ch_data.cw[i] = quant[val - 1] * ch_data.adj_floor[band];
722 } else {
723 ch_data.cw[i] = -quant[max - val - 1] * ch_data.adj_floor[band];
724 }
725 }
726 }
727 }
728 }
729
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);
735
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;
740
741 if reset {
742 self.ch_data[ch].reset();
743 }
744
745 self.ba.reset();
746
747 if raw_coeffs {
748 self.read_level_coeffs_raw(&mut br, ch)?;
749 } else {
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)?;
752 }
753
754 self.ch_data[ch].old_floor.copy_from_slice(&self.ch_data[ch].new_floor);
755
756 let mut bitcount: usize = 0;
757 if fixed_head {
758 bitcount += 15;
759 self.ba.band_bits[0] = 5;
760 for i in 0..3 {
761 self.ba.cw_len[i] = 5;
762 }
763 for band in 1..4 {
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;
769 }
770 }
771 }
772
773 if !self.is_imc {
774 if self.ba.band_width[BANDS - 1] != 0 {
775 bitcount += 1;
776 }
777 bitcount += 16;
778 } else {
779 if self.ba.band_width[BANDS - 1] != 0 {
780 bitcount += 1;
781 }
782 }
783
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)?;
786
787 if !raw_coeffs {
788 self.read_bitalloc_delta(&mut br, ch)?;
789 }
790
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;
796 }
797 }
798 }
799
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);
803
804 Ok(())
805 }
806}
807
808impl IMDCTContext {
809 fn new() -> Self {
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 {
816 let n = i as f32;
817 let base = (n * 4.0 + 1.0) / 1024.0 * consts::PI;
818 let r1 = base.sin();
819 let r2 = base.cos();
820 if (i & 1) == 0 {
821 pretwiddle1[i] = -(r1 + r2) * consts::SQRT_2;
822 pretwiddle2[i] = (r1 - r2) * consts::SQRT_2;
823 } else {
824 pretwiddle1[i] = (r1 + r2) * consts::SQRT_2;
825 pretwiddle2[i] = -(r1 - r2) * consts::SQRT_2;
826 }
827 posttwiddle[i] = FFTComplex::exp(consts::PI / 256.0 * n).scale(1.0/32768.0);
828 }
829 IMDCTContext {
830 pretwiddle1,
831 pretwiddle2,
832 posttwiddle,
833 tmp: [FFTC_ZERO; COEFFS/2],
834 fft: FFTBuilder::new_fft(COEFFS/2, false),
835 window,
836 }
837 }
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;
846 }
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];
852 let im = last_im[i];
853 dst[i * 2] = c2 * im + c1 * tmp.re;
854 dst[COEFFS - 1 - i * 2] = c1 * im - c2 * tmp.re;
855 last_im[i] = tmp.im;
856 }
857 }
858}
859
860const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C];
861const CHMAP_STEREO: [NAChannelType; 2] = [NAChannelType::L, NAChannelType::R];
862
863impl 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); },
871 };
872 self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(),
873 ainfo.get_channels(),
874 SND_F32P_FORMAT, 0);
875 self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo));
876
877 if !self.is_imc {
878 self.generate_iac_tables(ainfo.get_sample_rate() as f32);
879 }
880 Ok(())
881 } else {
882 Err(DecoderError::InvalidData)
883 }
884 }
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();
889
890 let nblocks = pktbuf.len() / BLOCK_SIZE / (self.ainfo.get_channels() as usize);
891 let duration = COEFFS * nblocks;
892
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();
896
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])?;
903 }
904 if (channels == 2) && ((chunk[1] & 0x20) != 0) {
905 let off1 = abuf.get_offset(0) + start;
906 let off2 = abuf.get_offset(1) + start;
907 for i in 0..COEFFS {
908 let l = dst[off1 + i];
909 let r = dst[off2 + i];
910 dst[off1 + i] = l + r;
911 dst[off2 + i] = l - r;
912 }
913 }
914 start += COEFFS;
915 }
916
917 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
918 frm.set_keyframe(true);
919 Ok(frm.into_ref())
920 }
921 fn flush(&mut self) {
922 }
923}
924
925impl 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 }
929}
930
931pub fn get_decoder_imc() -> Box<dyn NADecoder + Send> {
932 Box::new(IMCDecoder::new(true))
933}
934
935pub fn get_decoder_iac() -> Box<dyn NADecoder + Send> {
936 Box::new(IMCDecoder::new(false))
937}
938
939struct IMCCodeReader { sel1: usize, sel2: usize }
940
941impl IMCCodeReader {
942 fn new(sel1: usize, sel2: usize) -> Self { IMCCodeReader { sel1, sel2 } }
943}
944
945impl 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() }
950}
951
952static 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,
955 256,
956];
957
958const 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 ]
967];
968
969const 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 ]
998];
999
1000static 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,
1003];
1004
1005static 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
1008];
1009
1010static 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
1019];
1020
1021static 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
1030];
1031
1032static 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 ]
1035];
1036
1037static IMC_CODE_LENGTHS: &[[[u8; 18]; 4]; 4] = &[
1038 [
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 ],
1043 ], [
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 ],
1048 ], [
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 ],
1053 ], [
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 ]
1058 ]
1059];
1060
1061static IMC_CODE_CODES: &[[[u16; 18]; 4]; 4] = &[
1062 [
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 ]
1071 ], [
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 ]
1080 ], [
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 ]
1089 ], [
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 ]
1098 ]
1099];
1100
1101const 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 ]
1110];
1111
1112#[cfg(test)]
1113mod test {
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;
1119 #[test]
1120 fn test_imc() {
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);
1125
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);
1134 }
1135}