]> git.nihav.org Git - nihav.git/blame - 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
e35062e7
KS
1use std::mem;
2use std::ptr;
3use std::f32::consts;
4
5641dccf
KS
5use nihav_core::formats::*;
6use nihav_core::frame::*;
7use nihav_core::codecs::*;
8use nihav_core::io::bitreader::*;
9use nihav_core::io::codebook::*;
b4d5b851
KS
10use nihav_codec_support::dsp::fft::*;
11use nihav_codec_support::dsp::window::*;
e35062e7
KS
12
13const BANDS: usize = 32;
14const COEFFS: usize = 256;
15const BLOCK_SIZE: usize = 64;
16
e35062e7
KS
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],
d699da6e
KS
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],
e35062e7
KS
34 cw: [f32; COEFFS],
35 last_im: [f32; COEFFS/2],
36}
37
38struct BitAlloc {
d699da6e
KS
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],
e35062e7
KS
46 skip_flag_bits: [u8; BANDS],
47 skips_per_band: [usize; BANDS],
d699da6e
KS
48 keep_flag: [bool; BANDS],
49 coeff: [u8; COEFFS],
e35062e7
KS
50}
51
52impl IMCChannel {
53 fn new() -> Self {
54 IMCChannel {
55 old_floor: [0.0; BANDS],
d699da6e
KS
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],
e35062e7
KS
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 {
d699da6e
KS
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],
e35062e7
KS
84 skip_flag_bits: [0; BANDS],
85 skips_per_band: [0; BANDS],
d699da6e
KS
86 keep_flag: [false; BANDS],
87 coeff: [0; COEFFS],
e35062e7
KS
88 }
89 }
90 fn reset(&mut self) {
91 for i in 0..BANDS {
d699da6e
KS
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;
e35062e7
KS
100 }
101 for i in 0..COEFFS {
d699da6e
KS
102 self.cw_len[i] = 0;
103 self.skip_flag[i] = false;
e35062e7
KS
104 }
105 }
b7c882c1 106 #[allow(clippy::cognitive_complexity)]
e35062e7
KS
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;
d699da6e 110 for coef in ch_data.new_floor.iter() { if *coef > peak { peak = *coef; } }
e35062e7
KS
111 peak *= 0.25;
112
113 for band in 0..BANDS-1 {
d699da6e 114 ch_data.bit_est[band] = ch_data.log_floor2[band] - ch_data.mask_wght[band].log2();
e35062e7 115 }
d699da6e 116 ch_data.bit_est[BANDS - 1] = BITALLOC_LIMIT;
e35062e7
KS
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;
d699da6e
KS
126 if ch_data.new_floor[band] < peak { idx += 1; }
127 ch_data.bit_est[band] += IMC_BITALLOC_ADJ[adj_idx][idx];
e35062e7
KS
128 }
129
130 if fixed_head {
131 for i in 0..4 {
d699da6e 132 ch_data.bit_est[i] = BITALLOC_LIMIT;
e35062e7
KS
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];
d699da6e 142 pool += (self.band_width[band] as f32) * ch_data.bit_est[band];
e35062e7
KS
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 {
d699da6e 160 let mut len = (ch_data.bit_est[band] * 0.5 - pool + 0.5) as i32;
e35062e7
KS
161 if len < 0 { len = 0; }
162 if len > 6 { len = 6; }
163 self.band_bits[band] = len as u8;
e6aaad5c 164 cur_bits += (self.band_width[band] as i32) * len;
e35062e7
KS
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];
39cd2175
KS
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;
e35062e7
KS
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;
39cd2175
KS
198 for (band, &level) in tmp.iter().enumerate() {
199 if level > peak {
200 peak = level;
e35062e7
KS
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];
39cd2175
KS
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;
e35062e7
KS
227 }
228 }
229 while free_bits < cur_bits {
230 let mut low = BITALLOC_TOP_LIMIT;
231 let mut idx = 0;
39cd2175
KS
232 for (band, &level) in tmp.iter().enumerate() {
233 if level < low {
234 low = level;
e35062e7
KS
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];
39cd2175
KS
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;
e35062e7
KS
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;
39cd2175
KS
271 for (band, &level) in tmp.iter().enumerate() {
272 if level > peak {
273 peak = level;
e35062e7
KS
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] {
c8cfd39d 284 if self.cw_len[i] >= 6 { continue; }
e35062e7
KS
285 self.cw_len[i] += 1;
286 used_bits += 1;
287 if used_bits >= free_bits {
288 break;
289 }
290 }
291 }
292 }
e35062e7
KS
293 }
294}
295
ced9cf70
KS
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];
39cd2175
KS
305 for (lev, el) in exp_lev.iter_mut().enumerate() {
306 *el = 10.0f32.powf(-(lev as f32) * 0.4375);
ced9cf70
KS
307 }
308
309 let mut exp_10: [f32; 32] = [0.0; 32];
39cd2175
KS
310 for (i, el) in exp_10.iter_mut().enumerate() {
311 *el = 10.0f32.powf(((i as f32) - 16.0) * 0.25);
ced9cf70
KS
312 }
313
314 let mut sqrt_tab: [f32; 32] = [0.0; 32];
39cd2175
KS
315 for (i, el) in sqrt_tab.iter_mut().enumerate() {
316 *el = (i as f32).sqrt();
ced9cf70
KS
317 }
318
f2af8eca 319 LUTs { exp_lev, exp_10, sqrt_tab }
ced9cf70
KS
320 }
321}
322
e35062e7
KS
323struct IMCDecoder {
324 is_imc: bool,
325
326 chmap: NAChannelMap,
327 ainfo: NAAudioInfo,
2422d969 328 info: NACodecInfoRef,
e35062e7
KS
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],
ced9cf70
KS
339
340 luts: LUTs,
e35062e7
KS
341}
342
c8cfd39d
KS
343fn freq2bark(freq: f32) -> f32 {
344 3.5 * ((freq / 7500.0) * (freq / 7500.0)).atan() + 13.0 * (freq * 0.00076).atan()
345}
346
e35062e7 347fn calc_maxcoef(coef: f32) -> (f32, f32) {
d699da6e 348 let c1 = 20000.0 / 10.0f32.powf(coef * 0.057031251);
e35062e7
KS
349 (c1, c1.log2())
350}
351
352impl IMCDecoder {
353 fn new(is_imc: bool) -> Self {
e35062e7
KS
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 }
fd8666bc
KS
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 }
e35062e7 371 }
fd8666bc
KS
372 ucodes.assume_init()
373 };
e35062e7 374 IMCDecoder {
f2af8eca 375 is_imc,
e35062e7
KS
376 chmap: NAChannelMap::new(),
377 ainfo: NAAudioInfo::new(0, 0, SND_F32P_FORMAT, 0),
378 info: NACodecInfo::new_dummy(),
379
f2af8eca 380 codes,
e35062e7
KS
381 ch_data: [IMCChannel::new(), IMCChannel::new()],
382 ba: BitAlloc::new(),
383 imdct: IMDCTContext::new(),
ced9cf70 384 luts: LUTs::new(),
e35062e7 385
f2af8eca
KS
386 cycle1,
387 cycle2,
388 weights1,
389 weights2,
e35062e7
KS
390 }
391 }
392
393 fn generate_iac_tables(&mut self, sample_rate: f32) {
c8cfd39d 394 let scale = sample_rate / 256.0 / 2.0 * 0.5;
e35062e7
KS
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);
c8cfd39d 406 self.weights2[band - 1] = 10.0f32.powf(-2.7 * bark_diff);
e35062e7
KS
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
39cd2175 426 for (dst, &freq_max) in self.cycle1.iter_mut().zip(freq_max.iter()) {
e35062e7 427 let mut s_band = BANDS - 1;
39cd2175
KS
428 while s_band > 0 && freq_max <= freq_mid[s_band] { s_band -= 1; }
429 *dst = s_band + 1;
e35062e7
KS
430 }
431
432 self.cycle2[0] = 0;
39cd2175 433 for (dst, &freq_min) in self.cycle2.iter_mut().zip(freq_min.iter()).skip(1) {
e35062e7 434 let mut s_band = 0;
39cd2175
KS
435 while s_band < BANDS-1 && freq_min >= freq_mid[s_band] { s_band += 1; }
436 *dst = s_band - 1;
e35062e7
KS
437 }
438 }
439
440 fn read_level_coeffs_raw(&mut self, br: &mut BitReader, ch: usize) -> DecoderResult<()> {
9037cf6b 441 let ch_data = &mut self.ch_data[ch];
e35062e7
KS
442 let maxc_pos = br.read(5)? as usize;
443 let max_coef = br.read(7)? as u8;
444
f2af8eca 445 let (c1, c2) = calc_maxcoef(f32::from(max_coef));
e35062e7
KS
446 for i in 0..BANDS {
447 if i != maxc_pos {
ced9cf70 448 let level = br.read(4)?;
d699da6e
KS
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);
e35062e7 451 } else {
d699da6e
KS
452 ch_data.new_floor[i] = c1;
453 ch_data.log_floor[i] = c2;
e35062e7
KS
454 }
455 self.ba.band_width[i] = IMC_BANDS[i + 1] - IMC_BANDS[i];
e35062e7 456
d699da6e
KS
457 ch_data.log_floor2[i] = ch_data.log_floor[i] * 2.0;
458 ch_data.mask_wght[i] = 1.0;
e35062e7
KS
459 }
460
461 Ok(())
462 }
463
464 fn calculate_channel_values(&mut self, ch: usize) {
9037cf6b 465 let ch_data = &mut self.ch_data[ch];
c8cfd39d 466 let mut tmp2: [f32; BANDS+1] = [0.0; BANDS+1];
e35062e7
KS
467 let mut tmp3: [f32; BANDS] = [0.0; BANDS];
468
39cd2175 469 for (band, dst) in tmp3.iter_mut().enumerate() {
d699da6e 470 ch_data.mask_wght[band] = 0.0;
e35062e7
KS
471 let val;
472 if self.ba.band_width[band] > 0 {
f2af8eca 473 val = f64::from(ch_data.new_floor[band]).powi(2);
d699da6e 474 ch_data.log_floor2[band] = 2.0 * ch_data.log_floor[band];
e35062e7
KS
475 } else {
476 val = 0.0;
d699da6e 477 ch_data.log_floor2[band] = -30000.0;
e35062e7 478 }
c8cfd39d 479 let tmp = val * (self.ba.band_width[band] as f64) * 0.01;
39cd2175 480 *dst = if val <= 1.0e-30 { 0.0 } else { tmp as f32 };
e35062e7
KS
481 }
482
39cd2175
KS
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;
e35062e7 486 }
39cd2175 487 tmp2[next_band] += add_val;
e35062e7
KS
488 }
489
490 let mut accum = 0.0;
39cd2175
KS
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;
e35062e7
KS
495 }
496
497 let mut tmp2: [f32; BANDS] = [0.0; BANDS];
498 tmp2[0] = tmp3[0];
39cd2175 499 for (band, &prev_band) in self.cycle2.iter().enumerate().skip(1) {
e35062e7 500 for band2 in prev_band+1..band {
d699da6e 501 ch_data.mask_wght[band2] += tmp3[band];
e35062e7
KS
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];
d699da6e 510 ch_data.mask_wght[band] += accum;
e35062e7
KS
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 }
39cd2175
KS
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;
e35062e7 528 }
39cd2175 529 self.ba.keep_flag[i] = *level == 16;
e35062e7
KS
530 }
531 if reset {
9037cf6b 532 let ch_data = &mut self.ch_data[ch];
f2af8eca 533 let (mut c1, mut c2) = calc_maxcoef(f32::from(level[0]));
d699da6e
KS
534 ch_data.new_floor[0] = c1;
535 ch_data.log_floor[0] = c2;
39cd2175
KS
536 for (i, &level) in level.iter().enumerate().skip(1) {
537 if level == 16 {
d699da6e
KS
538 ch_data.new_floor[i] = 1.0;
539 ch_data.log_floor[i] = 0.0;
e35062e7 540 } else {
39cd2175
KS
541 let lval = if level < 17 {
542 level - 7
543 } else if level < 25 {
544 level - 32
545 } else {
546 level - 16
547 };
ced9cf70 548 c1 *= self.luts.exp_10[(lval + 16) as usize];
f2af8eca 549 c2 += 0.83048 * f32::from(lval);
d699da6e
KS
550 ch_data.new_floor[i] = c1;
551 ch_data.log_floor[i] = c2;
e35062e7
KS
552 }
553 }
554 } else {
9037cf6b 555 let ch_data = &mut self.ch_data[ch];
39cd2175
KS
556 for (i, &level) in level.iter().enumerate() {
557 if level < 16 {
558 let lval = level - 7;
d699da6e 559 ch_data.new_floor[i] = self.luts.exp_10[(lval + 16) as usize] * ch_data.old_floor[i];
f2af8eca 560 ch_data.log_floor[i] += f32::from(lval) * 0.83048;
e35062e7 561 } else {
d699da6e 562 ch_data.new_floor[i] = ch_data.old_floor[i];
e35062e7
KS
563 }
564 }
565 }
566
c8cfd39d
KS
567 self.ba.band_width[0] = IMC_BANDS[1] - IMC_BANDS[0];
568 for i in 1..BANDS {
e35062e7
KS
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 }
e35062e7 574 }
1a151e53 575
e35062e7
KS
576 for i in 0..BANDS-1 {
577 if self.ba.band_width[i] > 0 {
d699da6e 578 self.ba.band_present[i] = br.read_bool()?;
e35062e7
KS
579 }
580 }
581 self.calculate_channel_values(ch);
582
583 Ok(())
584 }
585
586 fn read_skip_flags(&mut self, br: &mut BitReader) -> DecoderResult<()> {
9037cf6b 587 let ba = &mut self.ba;
e35062e7 588 for band in 0..BANDS {
d699da6e 589 if !ba.band_present[band] || ba.band_width[band] == 0 { continue; }
e35062e7
KS
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;
39cd2175
KS
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;
e35062e7 612 } else {
39cd2175
KS
613 ba.skip_flag_bits[band] += 3;
614 if !br.read_bool()? {
615 ba.skip_flag[i] = true;
e35062e7
KS
616 ba.skips_per_band[band] += 1;
617 } else {
39cd2175 618 ba.skip_flag[i] = false;
e35062e7 619 }
39cd2175 620 ba.skip_flag[i + 1] = false;
e35062e7
KS
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 }
d699da6e 643 if self.ba.band_present[band] {
e35062e7 644 let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band];
e6aaad5c 645 let bitsum = self.ba.band_bitsum[band];
c8cfd39d 646 if (bitsum > 0) && (((band_w * 3) >> 1) > bitsum) {
e35062e7
KS
647 self.ba.band_skip[band] = true;
648 }
649 }
650 }
651
652 self.read_skip_flags(br)?;
653
6f263099 654 let ch_data = &mut self.ch_data[ch];
e35062e7 655 for band in 0..BANDS {
d699da6e 656 ch_data.adj_floor[band] = ch_data.new_floor[band];
e35062e7
KS
657 let band_w = IMC_BANDS[band + 1] - IMC_BANDS[band];
658 let nonskip = band_w - self.ba.skips_per_band[band];
d699da6e
KS
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];
e35062e7
KS
661 }
662 }
663
664 let mut bits_freed: i32 = 0;
665 for band in 0..BANDS {
d699da6e 666 if !self.ba.band_present[band] { continue; }
e35062e7
KS
667 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
668 if self.ba.skip_flag[i] {
f2af8eca 669 bits_freed += i32::from(self.ba.cw_len[i]);
e35062e7
KS
670 self.ba.cw_len[i] = 0;
671 }
672 }
f2af8eca 673 bits_freed -= i32::from(self.ba.skip_flag_bits[band]);
e35062e7
KS
674 }
675
c8cfd39d 676 if bits_freed < 0 { return Err(DecoderError::Bug); }
6f263099 677 self.ba.adjust_bit_allocation(ch_data, bits_freed);
e35062e7
KS
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; }
d699da6e 685 if !self.ba.band_present[band] && (self.ba.band_width[band] == 0) { continue; }
e35062e7
KS
686 for i in IMC_BANDS[band]..IMC_BANDS[band + 1] {
687 let len = self.ba.cw_len[i];
d699da6e 688 if len > 0 && (!self.ba.band_present[band] || !self.ba.skip_flag[i]) {
e35062e7
KS
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 };
9037cf6b 700 let ch_data = &mut self.ch_data[ch];
e35062e7
KS
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 {
d699da6e 713 ch_data.cw[i] = quant[val - 8] * ch_data.adj_floor[band];
e35062e7 714 } else {
d699da6e 715 ch_data.cw[i] = -quant[max - val - 8] * ch_data.adj_floor[band];
e35062e7
KS
716 }
717 } else {
d699da6e 718 let idx = qidx + (if self.ba.band_present[band] { 2 } else { 0 });
e35062e7
KS
719 let quant = &IMC_QUANT_SMALL[idx];
720 if val >= mid {
d699da6e 721 ch_data.cw[i] = quant[val - 1] * ch_data.adj_floor[band];
e35062e7 722 } else {
d699da6e 723 ch_data.cw[i] = -quant[max - val - 1] * ch_data.adj_floor[band];
1a151e53 724 }
e35062e7
KS
725 }
726 }
727 }
728 }
729
39cd2175 730 #[allow(clippy::collapsible_else_if)]
e35062e7 731 fn decode_block(&mut self, data: &[u8], ch: usize, dst: &mut [f32]) -> DecoderResult<()> {
fa90ccfb 732 let mut br = BitReader::new(&data[BLOCK_SIZE*ch..][..BLOCK_SIZE], BitReaderMode::LE16MSB);
e35062e7
KS
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
d699da6e 754 self.ch_data[ch].old_floor.copy_from_slice(&self.ch_data[ch].new_floor);
e35062e7
KS
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 {
39cd2175 764 let bits = if raw_coeffs || !self.ba.keep_flag[band] { 5 } else { 0 };
e35062e7
KS
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 }
c8cfd39d
KS
777 bitcount += 16;
778 } else {
779 if self.ba.band_width[BANDS - 1] != 0 {
780 bitcount += 1;
e35062e7
KS
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 {
f2af8eca
KS
830 pretwiddle1,
831 pretwiddle2,
832 posttwiddle,
e35062e7 833 tmp: [FFTC_ZERO; COEFFS/2],
9e78289c 834 fft: FFTBuilder::new_fft(COEFFS/2, false),
f2af8eca 835 window,
e35062e7
KS
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 }
9e78289c 847 self.fft.do_ifft_inplace(&mut self.tmp);
e35062e7
KS
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 {
01613464 864 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
e35062e7
KS
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);
f2af8eca 875 self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo));
e35062e7
KS
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 }
01613464 885 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
e35062e7
KS
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
b70cc006 893 let abuf = alloc_audio_buffer(self.ainfo, duration, self.chmap.clone())?;
e35062e7 894 let mut adata = abuf.get_abuf_f32().unwrap();
1a967e6b 895 let dst = adata.get_data_mut().unwrap();
e35062e7
KS
896
897 let mut start: usize = 0;
c8cfd39d
KS
898 let channels = self.ainfo.get_channels() as usize;
899 for chunk in pktbuf.chunks(BLOCK_SIZE * channels) {
900 for ch in 0..channels {
e6aaad5c
KS
901 let off = abuf.get_offset(ch) + start;
902 self.decode_block(chunk, ch, &mut dst[off..off+COEFFS])?;
e35062e7 903 }
c8cfd39d
KS
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 }
e35062e7
KS
914 start += COEFFS;
915 }
916
917 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
918 frm.set_keyframe(true);
171860fc 919 Ok(frm.into_ref())
e35062e7 920 }
f9be4e75
KS
921 fn flush(&mut self) {
922 }
e35062e7
KS
923}
924
7d57ae2f
KS
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
08a1fab7 931pub fn get_decoder_imc() -> Box<dyn NADecoder + Send> {
e35062e7
KS
932 Box::new(IMCDecoder::new(true))
933}
934
08a1fab7 935pub fn get_decoder_iac() -> Box<dyn NADecoder + Send> {
e35062e7
KS
936 Box::new(IMCDecoder::new(false))
937}
938
939struct IMCCodeReader { sel1: usize, sel2: usize }
940
941impl IMCCodeReader {
f2af8eca 942 fn new(sel1: usize, sel2: usize) -> Self { IMCCodeReader { sel1, sel2 } }
e35062e7
KS
943}
944
945impl CodebookDescReader<u8> for IMCCodeReader {
946 fn bits(&mut self, idx: usize) -> u8 { IMC_CODE_LENGTHS[self.sel1][self.sel2][idx] }
f2af8eca 947 fn code(&mut self, idx: usize) -> u32 { u32::from(IMC_CODE_CODES[self.sel1][self.sel2][idx]) }
e35062e7
KS
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 {
3167c45c
KS
1114 use nihav_core::codecs::RegisteredDecoders;
1115 use nihav_core::demuxers::RegisteredDemuxers;
ce742854 1116 use nihav_codec_support::test::dec_video::*;
78fb6560 1117 use crate::indeo_register_all_decoders;
e64739f8 1118 use nihav_commonfmt::generic_register_all_demuxers;
e35062e7
KS
1119 #[test]
1120 fn test_imc() {
3167c45c
KS
1121 let mut dmx_reg = RegisteredDemuxers::new();
1122 generic_register_all_demuxers(&mut dmx_reg);
1123 let mut dec_reg = RegisteredDecoders::new();
78fb6560 1124 indeo_register_all_decoders(&mut dec_reg);
3167c45c 1125
1678d59a
KS
1126// let file = "assets/Indeo/neal73_saber.avi";
1127// let file = "assets/Indeo/IMC/hvalen.avi";
886cde48 1128 // sample from a private collection
1678d59a
KS
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";
5580b11b 1132 test_decode_audio("avi", file, None, None/*Some("imc")*/, &dmx_reg, &dec_reg);
379fd781 1133 //test_file_decoding("avi", file, None, false, true, None);
e35062e7
KS
1134 }
1135}