on2avc: fix scalefactor reading for partially empty band group
[nihav.git] / nihav-duck / src / codecs / on2avc.rs
CommitLineData
6a494288
KS
1use nihav_core::frame::*;
2use nihav_core::codecs::*;
3use nihav_core::io::byteio::read_u16le;
4use nihav_core::io::bitreader::*;
5use nihav_core::io::codebook::*;
6use nihav_core::io::intcode::*;
b4d5b851
KS
7use nihav_codec_support::dsp::fft::*;
8use nihav_codec_support::dsp::mdct::IMDCT;
6a494288
KS
9
10use std::str::FromStr;
11
12use super::on2avcdata::*;
13
14const COEFFS: usize = 1024;
15const MAX_BANDS: usize = 14 * 8;
16const QTAB_SIZE: usize = 10000;
17const SHORT_WIN_POINT0: usize = 512 - 64;
18const SHORT_WIN_POINT1: usize = 512 + 64;
19
20struct WinInfo {
21 is_long: bool,
22 bands: &'static [usize],
23}
24
25impl WinInfo {
26 fn get_tot_bands(&self) -> usize {
27 if self.is_long {
28 self.bands.len()
29 } else {
30 self.bands.len() * 8
31 }
32 }
33}
34
35struct Codebooks {
36 scale_cb: Codebook<i8>,
37 spec_cb: [Codebook<u16>; 15],
38}
39
40fn scale_map(idx: usize) -> i8 { (idx as i8) - 60 }
41fn cb_map1(idx: usize) -> u16 { AVC_SPEC_CB1_SYMS[idx] }
42fn cb_map2(idx: usize) -> u16 { AVC_SPEC_CB2_SYMS[idx] }
43fn cb_map3(idx: usize) -> u16 { AVC_SPEC_CB3_SYMS[idx] }
44fn cb_map4(idx: usize) -> u16 { AVC_SPEC_CB4_SYMS[idx] }
45fn cb_map5(idx: usize) -> u16 { AVC_SPEC_CB5_SYMS[idx] }
46fn cb_map6(idx: usize) -> u16 { AVC_SPEC_CB6_SYMS[idx] }
47fn cb_map7(idx: usize) -> u16 { AVC_SPEC_CB7_SYMS[idx] }
48fn cb_map8(idx: usize) -> u16 { AVC_SPEC_CB8_SYMS[idx] }
49fn cb_map9(idx: usize) -> u16 { AVC_SPEC_CB9_SYMS[idx] }
50fn cb_map10(idx: usize) -> u16 { AVC_SPEC_CB10_SYMS[idx] }
51fn cb_map11(idx: usize) -> u16 { AVC_SPEC_CB11_SYMS[idx] }
52fn cb_map12(idx: usize) -> u16 { AVC_SPEC_CB12_SYMS[idx] }
53fn cb_map13(idx: usize) -> u16 { AVC_SPEC_CB13_SYMS[idx] }
54fn cb_map14(idx: usize) -> u16 { AVC_SPEC_CB14_SYMS[idx] }
55fn cb_map15(idx: usize) -> u16 { AVC_SPEC_CB15_SYMS[idx] }
56
57impl Codebooks {
58 fn new() -> Self {
59 let mut coderead = TableCodebookDescReader::new(AVC_SCF_CODEBOOK_CODES, AVC_SCF_CODEBOOK_BITS, scale_map);
60 let scale_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
61 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB1_CODES, AVC_SPEC_CB1_BITS, cb_map1);
62 let cb1 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
63 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB2_CODES, AVC_SPEC_CB2_BITS, cb_map2);
64 let cb2 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
65 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB3_CODES, AVC_SPEC_CB3_BITS, cb_map3);
66 let cb3 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
67 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB4_CODES, AVC_SPEC_CB4_BITS, cb_map4);
68 let cb4 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
69 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB5_CODES, AVC_SPEC_CB5_BITS, cb_map5);
70 let cb5 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
71 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB6_CODES, AVC_SPEC_CB6_BITS, cb_map6);
72 let cb6 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
73 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB7_CODES, AVC_SPEC_CB7_BITS, cb_map7);
74 let cb7 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
75 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB8_CODES, AVC_SPEC_CB8_BITS, cb_map8);
76 let cb8 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
77 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB9_CODES, AVC_SPEC_CB9_BITS, cb_map9);
78 let cb9 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
79 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB10_CODES, AVC_SPEC_CB10_BITS, cb_map10);
80 let cb10 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
81 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB11_CODES, AVC_SPEC_CB11_BITS, cb_map11);
82 let cb11 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
83 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB12_CODES, AVC_SPEC_CB12_BITS, cb_map12);
84 let cb12 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
85 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB13_CODES, AVC_SPEC_CB13_BITS, cb_map13);
86 let cb13 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
87 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB14_CODES, AVC_SPEC_CB14_BITS, cb_map14);
88 let cb14 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
89 let mut coderead = TableCodebookDescReader::new(AVC_SPEC_CB15_CODES, AVC_SPEC_CB15_BITS, cb_map15);
90 let cb15 = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
91 let spec_cb = [cb1, cb2, cb3, cb4, cb5, cb6, cb7, cb8, cb9, cb10, cb11, cb12, cb13, cb14, cb15];
92 Self { scale_cb, spec_cb }
93 }
94}
95
96struct SynthDSP {
97 rdft512: RDFT,
98 rdft256: RDFT,
99 irdft128: RDFT,
100 irdft64: RDFT,
101 synth_tmp: [FFTComplex; 512],
102 synth_out: [FFTComplex; 512],
103}
104
105impl SynthDSP {
106 fn new() -> Self {
107 let rdft512 = RDFTBuilder::new_rdft(512, true, true);
108 let rdft256 = RDFTBuilder::new_rdft(256, true, true);
109 let irdft128 = RDFTBuilder::new_rdft(128, false, false);
110 let irdft64 = RDFTBuilder::new_rdft(64, false, false);
111 Self {
112 rdft512, rdft256, irdft128, irdft64,
113 synth_tmp: [FFTC_ZERO; 512],
114 synth_out: [FFTC_ZERO; 512],
115 }
116 }
117}
118
119struct AVCDecoder {
120 chmap: NAChannelMap,
121 ainfo: NAAudioInfo,
122 info: NACodecInfoRef,
123 dsp: SynthDSP,
124 version: i32,
125 codebooks: Codebooks,
126 channels: usize,
127 is_40khz: bool,
128 win_long: &'static [f32; 1024],
129
130 prev_win: u8,
131 cur_win: u8,
132 winfo: &'static WinInfo,
133 windows: usize,
134 win_grp: [bool; 8],
135 ms_present: bool,
136 ms_info: [bool; MAX_BANDS],
137 cbs: [u8; MAX_BANDS],
138 scales: [u8; MAX_BANDS],
139
140 imdct_long: IMDCT,
141 imdct_mid: IMDCT,
142 imdct_short: IMDCT,
143 coeffs: [[f32; COEFFS]; 2],
144 delay: [[f32; COEFFS]; 2],
145 tmp: [f32; COEFFS * 2],
146 ew_buf: [f32; 1152],
80aaa7ef 147 use_generic: bool,
6a494288
KS
148
149 qtab: [f32; QTAB_SIZE],
150 scale_tab: [f32; 128],
151}
152
153impl AVCDecoder {
154 fn new(version: i32) -> Self {
155 let mut qtab = [0.0f32; QTAB_SIZE];
156 for (i, el) in qtab.iter_mut().enumerate() {
157 *el = (i as f32) * (i as f32).sqrt();
158 }
159 let mut scale_tab = [0.0f32; 128];
160 for (i, el) in scale_tab.iter_mut().enumerate() {
161 let pow = 10.0f32.powf((i as f32) * 0.1);
162 if i < 20 {
163 *el = (pow * 16.0).ceil() / 32.0;
164 } else {
165 *el = (pow * 0.5).ceil();
166 }
167 *el /= 32768.0;
168 }
169
170 AVCDecoder {
171 chmap: NAChannelMap::new(),
172 ainfo: NAAudioInfo::new(0, 0, SND_F32P_FORMAT, 0),
173 info: NACodecInfo::new_dummy(),
174 dsp: SynthDSP::new(),
175 version,
176 codebooks: Codebooks::new(),
177 channels: 0,
178 is_40khz: false,
179 win_long: AVC_WIN_LONG_32K,
180
181 prev_win: 0,
182 cur_win: 0,
183 winfo: &AVC_WINFO_LONG,
184 windows: 0,
185 win_grp: [false; 8],
186 ms_present: false,
187 ms_info: [false; MAX_BANDS],
188 cbs: [0; MAX_BANDS],
189 scales: [0; MAX_BANDS],
190
191 imdct_long: IMDCT::new(1024 * 2, true),
192 imdct_mid: IMDCT::new(512 * 2, true),
193 imdct_short: IMDCT::new(128 * 2, true),
194 coeffs: [[0.0; COEFFS]; 2],
195 delay: [[0.0; COEFFS]; 2],
196 tmp: [0.0; COEFFS * 2],
197 ew_buf: [0.0; 1152],
80aaa7ef 198 use_generic: true,
6a494288
KS
199
200 qtab,
201 scale_tab,
202 }
203 }
204 fn decode_channel(&mut self, br: &mut BitReader, chno: usize) -> DecoderResult<()> {
205 let coeffs = &mut self.coeffs[chno];
206
207 decode_band_types(br, &mut self.cbs, self.winfo)?;
208 // band scales
209 let bands = self.winfo.bands.len();
210 let mut cur_band = 0;
211 let mut scale = 0;
212 let mut first = true;
c3970892
KS
213 for wg in 0..self.windows {
214 if self.win_grp[wg] {
6a494288
KS
215 for _ in 0..bands {
216 if self.cbs[cur_band] == 0 {
c3970892
KS
217 let mut all_zero = true;
218 let mut band2 = cur_band;
219 for wg2 in wg + 1..self.windows {
220 if self.win_grp[wg2] {
221 break;
222 }
223 band2 += bands;
224 if self.cbs[band2] != 0 {
225 all_zero = false;
226 break;
227 }
228 }
229 if all_zero {
230 self.scales[cur_band] = 0;
231 cur_band += 1;
232 continue;
6a494288 233 }
6a494288 234 }
c3970892
KS
235 if first {
236 scale = br.read(7)? as i16;
237 first = false;
238 } else {
239 scale += i16::from(br.read_cb(&self.codebooks.scale_cb)?);
240 validate!((scale >= 0) && (scale < 128));
241 }
242 self.scales[cur_band] = scale as u8;
6a494288
KS
243 cur_band += 1;
244 }
245 } else {
246 for _ in 0..bands {
247 self.scales[cur_band] = self.scales[cur_band - bands];
248 cur_band += 1;
249 }
250 }
251 }
252 // coefficients
253 let mut cur_band = 0;
254 let mut idx = 0;
255 *coeffs = [0.0; COEFFS];
256 for _ in 0..self.windows {
257 let mut band_start = 0;
258 for band_end in self.winfo.bands.iter() {
259 let band_size = *band_end - band_start;
260 let cb_idx = self.cbs[cur_band];
261 if cb_idx > 0 {
262 let cb = &self.codebooks.spec_cb[(cb_idx - 1) as usize];
263 let scale = self.scale_tab[self.scales[cur_band] as usize];
264 let dst = &mut coeffs[idx..][..band_size];
265 if cb_idx < 9 {
266 decode_quads(br, cb, &self.qtab, scale, dst)?;
267 } else {
268 decode_pairs(br, cb, &self.qtab, scale, dst, cb_idx == 15)?;
269 }
270 }
271
272 band_start = *band_end;
273 idx += band_size;
274 cur_band += 1;
275 }
276 }
277 Ok(())
278 }
279 fn decode_frame(&mut self, br: &mut BitReader, adata: &mut NAAudioBuffer<f32>, offset: usize) -> DecoderResult<()> {
280 let enh_flag = br.read_bool()?;
281 validate!(!enh_flag);
282 self.prev_win = self.cur_win;
283 self.cur_win = br.read(3)? as u8;
284 self.winfo = match self.cur_win {
285 3 => &AVC_WINFO_SHORT,
286 4 => if self.is_40khz { &AVC_WINFO_40K_MODE4 } else { &AVC_WINFO_44K_MODE4 },
287 5 => if self.is_40khz { &AVC_WINFO_40K_MODE5 } else { &AVC_WINFO_44K_MODE5 },
288 6 => if self.is_40khz { &AVC_WINFO_40K_MODE6 } else { &AVC_WINFO_44K_MODE6 },
289 _ => &AVC_WINFO_LONG,
290 };
291 self.windows = if self.winfo.is_long { 1 } else { 8 };
292 let bands = self.winfo.bands.len();
293 self.win_grp[0] = true;
294 for el in self.win_grp.iter_mut().skip(1).take(self.windows - 1) {
295 *el = !br.read_bool()?;
296 }
297
298 self.ms_present = br.read_bool()?;
299 if self.ms_present {
300 validate!(self.channels == 2);
301 let mut cur_band = 0;
302 for wg in self.win_grp.iter().take(self.windows) {
303 if *wg {
304 for _ in 0..bands {
305 self.ms_info[cur_band] = br.read_bool()?;
306 cur_band += 1;
307 }
308 } else {
309 for _ in 0..bands {
310 self.ms_info[cur_band] = self.ms_info[cur_band - bands];
311 cur_band += 1;
312 }
313 }
314 }
315 }
316 for ch in 0..self.channels {
317 self.decode_channel(br, ch)?;
318 }
319
320 if (self.channels == 2) && self.ms_present {
321 let mut idx = 0;
322 let mut cur_band = 0;
323 for _ in 0..self.windows {
324 let mut band_start = 0;
325 for band_end in self.winfo.bands.iter() {
326 let band_size = *band_end - band_start;
327 if self.ms_info[cur_band] {
328 for i in 0..band_size {
329 let l = self.coeffs[0][idx + i];
330 let r = self.coeffs[1][idx + i];
331 self.coeffs[0][idx + i] = l + r;
332 self.coeffs[1][idx + i] = l - r;
333 }
334 }
335 cur_band += 1;
336 idx += band_size;
337 band_start = *band_end;
338 }
339 }
340 }
341
342 for ch in 0..self.channels {
343 let off = adata.get_offset(ch) + offset;
344 let output = adata.get_data_mut().unwrap();
345 self.synth_channel(ch, &mut output[off..][..COEFFS]);
346 }
347 Ok(())
348 }
47933c6d 349 #[allow(clippy::cyclomatic_complexity)]
6a494288
KS
350 fn synth_channel(&mut self, chno: usize, dst: &mut [f32]) {
351 let coeffs = &mut self.coeffs[chno];
352 let delay = &mut self.delay[chno];
353
354 match self.cur_win {
355 0 | 1 => {
80aaa7ef
KS
356 self.imdct_long.imdct_half(coeffs, &mut self.tmp);
357 overlap_half(dst, &self.tmp, delay, self.win_long);
358 (&mut delay[0..COEFFS/2]).copy_from_slice(&self.tmp[COEFFS/2..COEFFS]);
359 for i in COEFFS/2..COEFFS {
360 delay[i] = delay[COEFFS - 1 - i];
361 }
6a494288 362 },
80aaa7ef 363 2 | 7 => {
6a494288
KS
364 self.imdct_long.imdct(coeffs, &mut self.tmp);
365 for i in 0..SHORT_WIN_POINT0 {
366 dst[i] = delay[i];
367 }
368 overlap(&mut dst[SHORT_WIN_POINT0..SHORT_WIN_POINT1],
369 &self.tmp[SHORT_WIN_POINT0..SHORT_WIN_POINT1],
370 &delay[SHORT_WIN_POINT0..SHORT_WIN_POINT1], AVC_WIN_SHORT);
371 for i in SHORT_WIN_POINT1..COEFFS {
80aaa7ef 372 dst[i] = self.tmp[i - SHORT_WIN_POINT1 + 128];
6a494288
KS
373 }
374 delay.copy_from_slice(&self.tmp[COEFFS..]);
375 },
376 3 => {
377 for (ain, aout) in coeffs.chunks(128).zip(self.tmp.chunks_mut(256)) {
378 self.imdct_short.imdct(ain, aout);
379 }
380 self.ew_buf = [0.0; 1152];
381 for i in 0..128 {
382 self.ew_buf[i] = self.tmp[i];
383 }
384 for w in 0..7 {
385 overlap(&mut self.ew_buf[(w + 1) * 128..][..128],
386 &self.tmp[(w + 1) * 256..][..128],
387 &self.tmp[w * 256 + 128..][..128],
388 AVC_WIN_SHORT);
389 }
390 for i in 0..128 {
391 self.ew_buf[1024 + i] = self.tmp[7 * 256 + 128 + i];
392 }
393 for i in 0..SHORT_WIN_POINT0 {
394 dst[i] = delay[i];
395 }
396 overlap(&mut dst[SHORT_WIN_POINT0..SHORT_WIN_POINT1],
397 &self.ew_buf[0..128],
398 &delay[SHORT_WIN_POINT0..SHORT_WIN_POINT1], AVC_WIN_SHORT);
399 for i in SHORT_WIN_POINT1..COEFFS {
400 dst[i] = self.ew_buf[i - SHORT_WIN_POINT1 + 128];
401 }
402 for i in 0..SHORT_WIN_POINT1 {
403 delay[i] = self.ew_buf[SHORT_WIN_POINT1 + i];
404 }
405 for i in SHORT_WIN_POINT1..COEFFS {
406 delay[i] = 0.0;
407 }
408 },
409 4 => {
410 for i in 0..SHORT_WIN_POINT0 {
411 dst[i] = delay[i];
412 }
80aaa7ef
KS
413 if !self.use_generic {
414 synth1024(&mut self.dsp, coeffs, &mut self.ew_buf, &mut self.tmp, self.is_40khz);
415 } else {
416 synth_generic(coeffs, &mut self.ew_buf, &mut self.tmp, self.is_40khz, 1024);
417 }
418 overlap_half(&mut dst[SHORT_WIN_POINT0..SHORT_WIN_POINT1],
419 &self.ew_buf[0..64],
420 &delay[SHORT_WIN_POINT0..SHORT_WIN_POINT1], AVC_WIN_SHORT);
6a494288 421 for i in SHORT_WIN_POINT1..COEFFS {
80aaa7ef 422 dst[i] = self.ew_buf[i - SHORT_WIN_POINT1 + 64];
6a494288 423 }
80aaa7ef
KS
424 for i in 0..COEFFS/2 {
425 delay[i] = self.ew_buf[COEFFS/2 + i];
426 }
427 for i in COEFFS/2..COEFFS {
428 delay[i] = delay[COEFFS - 1 - i];
6a494288
KS
429 }
430 },
431 5 => {
432 for i in 0..SHORT_WIN_POINT0 {
433 dst[i] = delay[i];
434 }
80aaa7ef
KS
435 if !self.use_generic {
436 synth512(&mut self.dsp, coeffs, &mut self.ew_buf, &mut self.tmp, self.is_40khz);
437 } else {
438 synth_generic(coeffs, &mut self.ew_buf, &mut self.tmp, self.is_40khz, 512);
439 }
6a494288 440 self.imdct_mid.imdct(&coeffs[512..], &mut self.ew_buf[512..]);
6a494288
KS
441 overlap(&mut dst[SHORT_WIN_POINT0..SHORT_WIN_POINT1],
442 &self.ew_buf[SHORT_WIN_POINT0..SHORT_WIN_POINT1],
443 &delay[SHORT_WIN_POINT0..SHORT_WIN_POINT1], AVC_WIN_SHORT);
444 for i in SHORT_WIN_POINT1..COEFFS {
445 dst[i] = self.ew_buf[i];
446 }
447 *delay = [0.0; COEFFS];
448 for i in 0..SHORT_WIN_POINT1 {
449 delay[i] = self.ew_buf[i];
450 }
451 },
452 6 => {
453 for i in 0..SHORT_WIN_POINT0 {
454 dst[i] = delay[i];
455 }
456 self.imdct_mid.imdct(coeffs, &mut self.ew_buf);
80aaa7ef
KS
457 if !self.use_generic {
458 synth512(&mut self.dsp, &coeffs[512..], &mut self.ew_buf[512..], &mut self.tmp, self.is_40khz);
459 } else {
460 synth_generic(&coeffs[512..], &mut self.ew_buf[512..], &mut self.tmp, self.is_40khz, 512);
461 }
6a494288
KS
462 overlap(&mut dst[SHORT_WIN_POINT0..SHORT_WIN_POINT1],
463 &self.ew_buf[SHORT_WIN_POINT0..SHORT_WIN_POINT1],
464 &delay[SHORT_WIN_POINT0..SHORT_WIN_POINT1], AVC_WIN_SHORT);
465 for i in SHORT_WIN_POINT1..COEFFS {
466 dst[i] = self.ew_buf[i];
467 }
468 *delay = [0.0; COEFFS];
469 for i in 0..SHORT_WIN_POINT1 {
470 delay[i] = self.ew_buf[i];
471 }
472 },
6a494288
KS
473 _ => unreachable!(),
474 };
475 }
476}
477
478fn overlap(dst: &mut [f32], src: &[f32], delay: &[f32], win: &[f32]) {
479 for (i, ((out, s), d)) in dst.iter_mut().zip(src.iter()).zip(delay.iter()).enumerate() {
480 *out = *s * win[i] + *d * win[win.len() - 1 - i];
481 }
482}
483
80aaa7ef
KS
484fn overlap_half(dst: &mut [f32], src: &[f32], delay: &[f32], win: &[f32]) {
485 let n = win.len();
486 for i in 0..n/2 {
487 let ii = n - 1 - i;
488 let c = src [n/2 - 1 - i];
489 let d = delay[i];
490 let w0 = win[i];
491 let w1 = win[ii];
492 dst[i] = d * w1 - c * w0;
493 dst[ii] = d * w0 + c * w1;
494 }
495}
496
6a494288
KS
497#[derive(Clone,Copy)]
498struct SynthParams {
499 p0: usize,
500 p1: usize,
501 idx: usize
502}
503
504macro_rules! synth_step0_template {
505 ($name:ident, $tab: ident, $size: expr) => {
506 fn $name(src: &[f32], dst: &mut [f32], step: usize, off: usize, sp: &SynthParams) {
507 for i in 0..step {
508 for j in 0..sp.p0 {
47933c6d 509 dst[i] += (f64::from(src[j]) * $tab[sp.idx][j][i]) as f32;
6a494288
KS
510 }
511 }
512 for i in 0..step {
513 for j in 0..sp.p1 {
47933c6d 514 dst[$size - step + i] += (f64::from(src[sp.p0 + off + j]) * $tab[sp.idx][sp.p0 + j][i]) as f32;
6a494288
KS
515 }
516 }
517 }
518 }
519}
520
521synth_step0_template!(synth_step0_10, AVC_SYNTH_TABS10, 10);
522synth_step0_template!(synth_step0_20, AVC_SYNTH_TABS20, 20);
523synth_step0_template!(synth_step0_40, AVC_SYNTH_TABS40, 40);
524synth_step0_template!(synth_step0_84, AVC_SYNTH_TABS84, 84);
525
526fn synth_step1(src: &[f32], dst: &mut [f32], size: usize, stride: usize, step: usize, off: usize, mut p0: usize, win: &[f64])
527{
528 let mut pos = step - 1;
529 for _ in 0..off {
47933c6d 530 let scale = f64::from(src[p0]);
6a494288
KS
531 p0 += 1;
532 pos &= size - 1;
533 for i in 0..pos.min(step) {
534 dst[pos - i] += (scale * win[i]) as f32;
535 }
536 pos += stride;
537 }
538}
539
540fn zero_some(buf: &mut [FFTComplex], p0: usize, p1: usize)
541{
542 for el in buf.iter_mut().take(p0/2) {
543 *el = FFTC_ZERO;
544 }
545 if (p0 & 1) != 0 {
546 buf[p0 / 2].re = 0.0;
547 }
548 let len = buf.len();
549 let dst = &mut buf[len - p1/2..];
550 for el in dst.iter_mut() {
551 *el = FFTC_ZERO;
552 }
553 if (p1 & 1) != 0 {
554 buf[len - p1/2 - 1].im = 0.0;
555 }
556}
557
558fn merge_bands(src: &[FFTComplex], dst: &mut [FFTComplex], size: usize) {
559 let step = if size == 512 { 2 } else { 4 };
560 let (s01, s23) = src.split_at(size / 2);
561 let (src0, src1) = s01.split_at(size / 4);
562 let (src2, src3) = s23.split_at(size / 4);
563 let (t00, t01) = AVC_SYNTH_TAB0.split_at(512);
564 let (t10, t11) = AVC_SYNTH_TAB1.split_at(512);
565 let (t20, t21) = AVC_SYNTH_TAB2.split_at(512);
566 let (t30, t31) = AVC_SYNTH_TAB3.split_at(512);
567 let hsize = size / 2;
568 let qsize = size / 4;
569 let osize = size / 8;
570 dst[0].re = src0[0].re * t00[0] + src1[0].re * t10[0] + src2[0].re * t20[0] + src3[0].re * t30[0];
571 dst[0].im = src0[0].re * t00[1] + src1[0].re * t10[1] + src2[0].re * t20[1] + src3[0].re * t30[1];
572 dst[qsize].re = src0[0].im * t00[256] + src1[0].im * t10[256] +
573 src2[0].im * t20[256] + src3[0].im * t30[256];
574 dst[qsize].im = src0[0].im * t00[257] + src1[0].im * t10[257] +
575 src2[0].im * t20[257] + src3[0].im * t30[257];
576 for i in 1..qsize {
577 let s0 = src0[i];
578 let s1 = src1[i];
579 let s2 = src2[i];
580 let s3 = src3[i];
581 let t0 = s0 * FFTComplex { re: t00[i * step + 0], im: t00[i * step + 1] } +
582 s1 * FFTComplex { re: t10[i * step + 0], im: t10[i * step + 1] } +
583 s2 * FFTComplex { re: t20[i * step + 0], im: t20[i * step + 1] } +
584 s3 * FFTComplex { re: t30[i * step + 0], im: t30[i * step + 1] };
585 let t1 = s0 * FFTComplex { re: t01[i * step + 0], im: t01[i * step + 1] } +
586 s1 * FFTComplex { re: t11[i * step + 0], im: t11[i * step + 1] } +
587 s2 * FFTComplex { re: t21[i * step + 0], im: t21[i * step + 1] } +
588 s3 * FFTComplex { re: t31[i * step + 0], im: t31[i * step + 1] };
589 dst[i] = t0;
590 dst[qsize + i] = t1;
591 }
592
593 dst[hsize].re = src0[0].im * t01[256] + src1[0].im * t11[256] +
594 src2[0].im * t21[256] + src3[0].im * t31[256];
595 dst[hsize].im = src0[0].im * t01[257] + src1[0].im * t11[257] +
596 src2[0].im * t21[257] + src3[0].im * t31[257];
597 dst[hsize + qsize].re = src0[0].re * t01[256] + src1[0].re * t11[256] +
598 src2[0].re * t21[256] + src3[0].re * t31[256];
599 dst[hsize + qsize].im = src0[0].re * t01[257] + src1[0].re * t11[257] +
600 src2[0].re * t21[257] + src3[0].re * t31[257];
601 for i in 1..osize {
602 let s0 = !src0[qsize - i];
603 let s1 = !src1[qsize - i];
604 let s2 = !src2[qsize - i];
605 let s3 = !src3[qsize - i];
606 let t0 = s0 * FFTComplex { re: t00[256 + i * step + 0], im: t00[256 + i * step + 1] } +
607 s1 * FFTComplex { re: t10[256 + i * step + 0], im: t10[256 + i * step + 1] } +
608 s2 * FFTComplex { re: t20[256 + i * step + 0], im: t20[256 + i * step + 1] } +
609 s3 * FFTComplex { re: t30[256 + i * step + 0], im: t30[256 + i * step + 1] };
610 let t1 = s0 * FFTComplex { re: t01[256 + i * step + 0], im: t01[256 + i * step + 1] } +
611 s1 * FFTComplex { re: t11[256 + i * step + 0], im: t11[256 + i * step + 1] } +
612 s2 * FFTComplex { re: t21[256 + i * step + 0], im: t21[256 + i * step + 1] } +
613 s3 * FFTComplex { re: t31[256 + i * step + 0], im: t31[256 + i * step + 1] };
614 dst[hsize + i] = !t0;
615 dst[hsize + qsize + i] = !t1;
616 }
617}
618
80aaa7ef
KS
619const SPARAMS10: [SynthParams; 2] = [
620 SynthParams { p0: 1, p1: 3, idx: 0 },
621 SynthParams { p0: 3, p1: 1, idx: 1 } ];
622const SPARAMS20: [SynthParams; 2] = [
623 SynthParams { p0: 5, p1: 4, idx: 0 },
624 SynthParams { p0: 4, p1: 5, idx: 1 } ];
625const SPARAMS40: [SynthParams; 2] = [
626 SynthParams { p0: 11, p1: 8, idx: 0 },
627 SynthParams { p0: 8, p1: 11, idx: 1 } ];
6a494288
KS
628const SPARAMS84: [SynthParams; 4] = [
629 SynthParams { p0: 16, p1: 4, idx: 0 },
630 SynthParams { p0: 16, p1: 4, idx: 1 },
631 SynthParams { p0: 13, p1: 7, idx: 2 },
632 SynthParams { p0: 15, p1: 5, idx: 3 } ];
633
80aaa7ef
KS
634const MERGE_ORDER_44K: &[u8] = &[
635 4, 4, 2, 2, 0, 0, 2, 0, 0, 2, 2, 0, 0, 2, 0, 0, 2, 0, 0,
636 2, 0, 0, 4, 0, 0, 0, 0, 2, 0, 0, 0
637];
638const MERGE_ORDER_40K: &[u8] = &[
639 4, 4, 2, 2, 0, 0, 2, 0, 0, 2, 2, 0, 0, 2, 0, 0, 2, 0, 0,
640 2, 0, 0, 4, 2, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0
641];
642
643fn synth_filter(src: &[f32], dst: &mut [f32], len: usize, step: usize, bands: usize, idx: usize)
644{
645 let off = (len - step) / bands + 1;
646 let params = match step {
647 10 => &SPARAMS10[idx],
648 20 => &SPARAMS20[idx],
649 40 => &SPARAMS40[idx],
650 _ => &SPARAMS84[idx],
651 };
652
653 if step == 10 {
654 synth_step0_10(src, dst, step, off, params);
655 synth_step1(src, dst, len, bands, step, off, params.p0, &AVC_TAB10[idx]);
656 } else if step == 20 {
657 synth_step0_20(src, dst, step, off, params);
658 synth_step1(src, dst, len, bands, step, off, params.p0, &AVC_TAB20[idx]);
659 } else if step == 40 {
660 synth_step0_40(src, dst, step, off, params);
661 synth_step1(src, dst, len, bands, step, off, params.p0, &AVC_TAB40[idx]);
662 } else {
663 synth_step0_84(src, dst, step, off, params);
664 synth_step1(src, dst, len, bands, step, off, params.p0, &AVC_TAB84[idx]);
665 }
666}
667
668fn synth_recursive(dst: &mut [f32], tmp: &mut [f32], size: usize, order: &[u8], order_idx: &mut usize, dir: bool) {
669 let bands = order[*order_idx] as usize;
670 *order_idx += 1;
671 if bands == 0 { return; }
672 let sub_size = size / bands;
673 let mut sub_dir = false;
674 for (dst, tmp) in dst.chunks_mut(sub_size).take(bands).zip(tmp.chunks_mut(sub_size)) {
675 synth_recursive(dst, tmp, sub_size, order, order_idx, sub_dir);
676 sub_dir = !sub_dir;
677 }
678 for el in tmp.iter_mut().take(size) { *el = 0.0; }
679 let step = if bands == 2 {
680 if sub_size <= 20 {
681 10
682 } else if sub_size <= 40 {
683 20
684 } else {
685 40
686 }
687 } else {
688 84
689 };
690 for (i, src) in dst.chunks_mut(sub_size).take(bands).enumerate() {
691 let idx = if !dir { i } else { bands - 1 - i };
692 synth_filter(src, tmp, size, step, bands, idx);
693 }
694 (&mut dst[..size]).copy_from_slice(&tmp[..size]);
695}
696
697fn synth_generic(src: &[f32], dst: &mut [f32], tmpbuf: &mut [f32; COEFFS * 2], is_40khz: bool, size: usize) {
698 let order = if is_40khz { MERGE_ORDER_40K } else { MERGE_ORDER_44K };
699 (&mut dst[..size]).copy_from_slice(&src[..size]);
700 let mut order_idx = 0;
701 synth_recursive(dst, tmpbuf, size, order, &mut order_idx, false);
47933c6d 702 for el in dst.iter_mut().take(COEFFS) { *el *= 0.125; }
80aaa7ef
KS
703}
704
6a494288
KS
705fn synth1024(dsp: &mut SynthDSP, src: &[f32], dst: &mut [f32], tmpbuf: &mut [f32; COEFFS * 2], is_40khz: bool) {
706 for el in tmpbuf.iter_mut() {
707 *el = 0.0;
708 }
709 let (tmp, tmp2) = tmpbuf.split_at_mut(COEFFS);
710 for el in dsp.synth_tmp.iter_mut() { *el = FFTC_ZERO; }
711 for el in dsp.synth_out.iter_mut() { *el = FFTC_ZERO; }
712
713 let (size, step, stride) = (32, 20, 2);
714 let off = (size - step) / stride + 1;
715 let mut sparam0 = SynthParams { p0: 5, p1: 4, idx: 0 };
716 let mut sparam1 = SynthParams { p0: 4, p1: 5, idx: 1 };
717 for (i, dst) in tmp.chunks_mut(size).take(8).enumerate() {
718 let coeffs = &src[i * 32..];
719 synth_step0_20(coeffs, dst, step, off, &sparam0);
720 synth_step1(coeffs, dst, size, stride, step, off, sparam0.p0, &AVC_TAB20[sparam0.idx]);
721 let coeffs = &src[i * 32 + 16..];
722 synth_step0_20(coeffs, dst, step, off, &sparam1);
723 synth_step1(coeffs, dst, size, stride, step, off, sparam0.p0, &AVC_TAB20[sparam1.idx]);
724 std::mem::swap(&mut sparam0, &mut sparam1);
725 }
726
727 let (size, step, stride) = (64, 40, 2);
728 let off = (size - step) / stride + 1;
729 let mut sparam0 = SynthParams { p0: 11, p1: 8, idx: 0 };
730 let mut sparam1 = SynthParams { p0: 8, p1: 11, idx: 1 };
731 let nchunks = if !is_40khz { 8 } else { 12 };
732 for (i, dst) in tmp2.chunks_mut(size).take(nchunks).enumerate() {
733 let coeffs = if i < 4 { &tmp[i * 64..] } else { &src[i * 64 + 32..] };
734 synth_step0_40(coeffs, dst, step, off, &sparam0);
735 synth_step1(coeffs, dst, size, stride, step, off, sparam0.p0, &AVC_TAB40[sparam0.idx]);
736 let coeffs = if i < 4 { &tmp[i * 64 + 32..] } else { &src[i * 64 + 32..] };
737 synth_step0_40(coeffs, dst, step, off, &sparam1);
738 synth_step1(coeffs, dst, size, stride, step, off, sparam0.p0, &AVC_TAB40[sparam1.idx]);
739 std::mem::swap(&mut sparam0, &mut sparam1);
740 }
741
742 for el in tmp.iter_mut().take(128) {
743 *el = 0.0;
744 }
745 let (size, step, stride) = (256, 84, 4);
746 let off = (size - step) / stride + 1;
747 for i in 0..4 {
748 let coeffs = &tmp2[i * 64..];
749 synth_step0_84(coeffs, tmp, step, off, &SPARAMS84[i]);
750 synth_step1(coeffs, tmp, size, stride, step, off, SPARAMS84[i].p0, &AVC_TAB84[i]);
751 }
752 for i in 0..4 {
753 let coeffs = if i < 2 && is_40khz { &tmp2[256 + i * 64..] } else { &src[256 + i * 64..] };
754 let dst = &mut tmp[256..];
755 synth_step0_84(coeffs, dst, step, off, &SPARAMS84[3 - i]);
756 synth_step1(coeffs, dst, size, stride, step, off, SPARAMS84[3 - i].p0, &AVC_TAB84[3 - i]);
757 }
758
759 if !is_40khz {
760 let (size, step, stride) = (256, 40, 2);
761 let off = (size - step) / stride + 1;
762 let sparams = [ SynthParams { p0: 11, p1: 8, idx: 0 },
763 SynthParams { p0: 8, p1: 11, idx: 1 } ];
764 for i in 0..2 {
765 let coeffs = &src[512 + i * 128..];
766 let dst = &mut tmp[512..];
767 synth_step0_40(coeffs, dst, step, off, &sparams[i]);
768 synth_step1(coeffs, dst, size, stride, step, off, sparams[i].p0, &AVC_TAB40[i]);
769 }
770 } else {
771 let (size, step, stride) = (256, 84, 4);
772 let off = (size - step) / stride + 1;
773 for i in 0..4 {
774 let coeffs = &src[512 + i * 64..];
775 let dst = &mut tmp[512..];
776 synth_step0_84(coeffs, dst, step, off, &SPARAMS84[i]);
777 synth_step1(coeffs, dst, size, stride, step, off, SPARAMS84[i].p0, &AVC_TAB84[i]);
778 }
779 }
780
781 for (i, s) in tmp.chunks(2).take(768/2).enumerate() {
782 dsp.synth_tmp[i] = FFTComplex { re: s[0], im: s[1] };
783 }
784 for i in (768..1024).step_by(2) {
785 dsp.synth_tmp[i >> 1] = FFTComplex { re: src[i], im: src[i + 1] };
786 }
787 {
788 let dst = &mut tmp[768..1024];
789 dst.copy_from_slice(&src[768..1024]);
790 }
791 for (i, chunk) in dsp.synth_tmp.chunks_exact_mut(128).enumerate() {
792 zero_some(chunk, SPARAMS84[i].p0, SPARAMS84[i].p1);
793 }
794 for chunk in dsp.synth_tmp.chunks_exact_mut(128) {
795 dsp.irdft128.do_rdft_inplace(chunk);
796 for el in chunk.iter_mut() { *el = el.scale(1.0/128.0f32); }
797 }
798 merge_bands(&dsp.synth_tmp, &mut dsp.synth_out, 512);
799 dsp.rdft512.do_rdft_inplace(&mut dsp.synth_out);
800 for (out, src) in dst.chunks_exact_mut(2).zip(dsp.synth_out.iter()) {
801 out[0] = src.re * (1.0 / 1024.0f32.sqrt());
802 out[1] = src.im * (1.0 / 1024.0f32.sqrt());
803 }
804 let (size, step, stride) = (1024, 84, 4);
805 let off = (size - step) / stride + 1;
806 for i in 0..4 {
807 let src = &tmp[256 * i..];
808 synth_step0_84(src, dst, step, off, &SPARAMS84[i]);
809 }
810}
811fn synth512(dsp: &mut SynthDSP, src: &[f32], dst: &mut [f32], tmpbuf: &mut [f32; COEFFS * 2], is_40khz: bool) {
812 for el in tmpbuf.iter_mut() {
813 *el = 0.0;
814 }
815 let (tmp, tmp2) = tmpbuf.split_at_mut(COEFFS);
816
817 let (size, step, stride) = (16, 10, 2);
818 let off = (size - step) / stride + 1;
819 let mut sparam0 = SynthParams { p0: 1, p1: 3, idx: 0 };
820 let mut sparam1 = SynthParams { p0: 3, p1: 1, idx: 1 };
821 let mut tab_ptr0: &[f64] = AVC_TAB10_0;
822 let mut tab_ptr1: &[f64] = AVC_TAB10_1;
823 for (i, dst) in tmp.chunks_mut(size).take(8).enumerate() {
824 let coeffs = &src[i * 16..];
825 synth_step0_10(coeffs, dst, step, off, &sparam0);
826 synth_step1(coeffs, dst, size, stride, step, off, sparam0.p0, tab_ptr0);
827 let coeffs = &src[i * 16 + 8..];
828 synth_step0_10(coeffs, dst, step, off, &sparam1);
829 synth_step1(coeffs, dst, size, stride, step, off, sparam0.p0, tab_ptr1);
830 std::mem::swap(&mut sparam0, &mut sparam1);
831 std::mem::swap(&mut tab_ptr0, &mut tab_ptr1);
832 }
833
834 let (size, step, stride) = (32, 20, 2);
835 let off = (size - step) / stride + 1;
836 let mut sparam0 = SynthParams { p0: 5, p1: 4, idx: 0 };
837 let mut sparam1 = SynthParams { p0: 4, p1: 5, idx: 1 };
838 let nchunks = if !is_40khz { 8 } else { 12 };
839 for (i, dst) in tmp2.chunks_mut(size).take(nchunks).enumerate() {
840 let coeffs = if i < 4 { &tmp[i * 32..] } else { &src[i * 32..] };
841 synth_step0_20(coeffs, dst, step, off, &sparam0);
842 synth_step1(coeffs, dst, size, stride, step, off, sparam0.p0, &AVC_TAB20[sparam0.idx]);
843 let coeffs = if i < 4 { &tmp[i * 32 + 16..] } else { &src[i * 32 + 16..] };
844 synth_step0_20(coeffs, dst, step, off, &sparam1);
845 synth_step1(coeffs, dst, size, stride, step, off, sparam0.p0, &AVC_TAB20[sparam1.idx]);
846 std::mem::swap(&mut sparam0, &mut sparam1);
847 }
848
849 for el in tmp.iter_mut().take(64) {
850 *el = 0.0;
851 }
852 let (size, step, stride) = (128, 84, 4);
853 let off = (size - step) / stride + 1;
854 for i in 0..4 {
855 let coeffs = &tmp2[i * 32..];
856 synth_step0_84(coeffs, tmp, step, off, &SPARAMS84[i]);
857 synth_step1(coeffs, tmp, size, stride, step, off, SPARAMS84[i].p0, &AVC_TAB84[i]);
858 }
859 for i in 0..4 {
860 let coeffs = if i < 2 && is_40khz { &tmp2[128 + i * 32..] } else { &src[128 + i * 32..] };
861 let dst = &mut tmp[128..];
862 synth_step0_84(coeffs, dst, step, off, &SPARAMS84[3 - i]);
863 synth_step1(coeffs, dst, size, stride, step, off, SPARAMS84[3 - i].p0, &AVC_TAB84[3 - i]);
864 }
865
866 if !is_40khz {
867 let (size, step, stride) = (128, 40, 2);
868 let off = (size - step) / stride + 1;
869 let sparams = [ SynthParams { p0: 11, p1: 8, idx: 0 },
870 SynthParams { p0: 8, p1: 11, idx: 1 } ];
871 for i in 0..2 {
872 let coeffs = &src[256 + i * 64..];
873 let dst = &mut tmp[256..];
874 synth_step0_40(coeffs, dst, step, off, &sparams[i]);
875 synth_step1(coeffs, dst, size, stride, step, off, sparams[i].p0, &AVC_TAB40[i]);
876 }
877 } else {
878 let (size, step, stride) = (128, 84, 4);
879 let off = (size - step) / stride + 1;
880 for i in 0..4 {
881 let coeffs = &src[256 + i * 32..];
882 let dst = &mut tmp[256..];
883 synth_step0_84(coeffs, dst, step, off, &SPARAMS84[i]);
884 synth_step1(coeffs, dst, size, stride, step, off, SPARAMS84[i].p0, &AVC_TAB84[i]);
885 }
886 }
887
888 for (i, s) in tmp.chunks(2).take(384/2).enumerate() {
889 dsp.synth_tmp[i] = FFTComplex { re: s[0], im: s[1] };
890 }
891 for i in (384..512).step_by(2) {
892 dsp.synth_tmp[i >> 1] = FFTComplex { re: src[i], im: src[i + 1] };
893 }
894 {
895 let dst = &mut tmp[384..512];
896 dst.copy_from_slice(&src[384..512]);
897 }
898 for (i, chunk) in dsp.synth_tmp.chunks_exact_mut(128).enumerate() {
899 zero_some(chunk, SPARAMS84[i].p0, SPARAMS84[i].p1);
900 }
901 for chunk in dsp.synth_tmp.chunks_exact_mut(64) {
902 dsp.irdft64.do_rdft_inplace(chunk);
903 }
904 merge_bands(&dsp.synth_tmp, &mut dsp.synth_out, 256);
905 dsp.rdft256.do_rdft_inplace(&mut dsp.synth_out);
906 for (out, src) in dst.chunks_exact_mut(2).zip(dsp.synth_out.iter()).take(256) {
907 out[0] = src.re * (1.0 / 512.0f32 / 1024.0f32);
908 out[1] = src.im * (1.0 / 512.0f32 / 1024.0f32);
909 }
910 let (size, step, stride) = (512, 84, 4);
911 let off = (size - step) / stride + 1;
912 for i in 0..4 {
913 let src = &tmp[128 * i..];
914 synth_step0_84(src, dst, step, off, &SPARAMS84[i]);
915 }
916}
917
918fn decode_band_types(br: &mut BitReader, cbs: &mut [u8; MAX_BANDS], winfo: &WinInfo) -> DecoderResult<()> {
919 let bits_per_sect = if winfo.is_long { 5 } else { 3 };
920 let esc_val = (1 << bits_per_sect) - 1;
921 let tot_bands = winfo.get_tot_bands();
922
923 let mut cur_band = 0;
924 while cur_band < tot_bands {
925 let codebook = br.read(4)? as u8;
926 let mut run = 1;
927 loop {
928 let run_add = br.read(bits_per_sect)? as usize;
929 run += run_add;
930 if run_add != esc_val { break; }
931 }
932 validate!(cur_band + run <= tot_bands);
933 for _ in 0..run {
934 cbs[cur_band] = codebook;
935 cur_band += 1;
936 }
937 }
938 Ok(())
939}
940
941fn dequant(val: i16, qtab: &[f32; QTAB_SIZE], scale: f32) -> f32 {
942 if val >= 0 {
943 qtab[val as usize] * scale
944 } else {
945 -qtab[val.abs() as usize] * scale
946 }
947}
948
949fn decode_quads(br: &mut BitReader, cb: &Codebook<u16>, qtab: &[f32; QTAB_SIZE], scale: f32, dst: &mut [f32]) -> DecoderResult<()> {
950 for quad in dst.chunks_exact_mut(4) {
951 let mut idx = br.read_cb(cb)? as i16;
952 for el in quad.iter_mut() {
953 *el = dequant(idx >> 12, qtab, scale);
954 idx <<= 4;
955 }
956 }
957 Ok(())
958}
959
960fn decode_esc_val(br: &mut BitReader, qtab: &[f32; QTAB_SIZE], scale: f32, sign: bool) -> DecoderResult<f32> {
961 let pfx = br.read_code(UintCodeType::LimitedOnes(24))? + 4;
962 let add = br.read(pfx as u8)? as usize;
963 let val = (1 << pfx) + add;
964 let fval = scale * if val < qtab.len() {
965 qtab[val]
966 } else {
967 (val as f32) * (val as f32).sqrt()
968 };
969 if !sign {
970 Ok(fval)
971 } else {
972 Ok(-fval)
973 }
974}
975
976fn decode_pairs(br: &mut BitReader, cb: &Codebook<u16>, qtab: &[f32; QTAB_SIZE], scale: f32, dst: &mut [f32], is_esc: bool) -> DecoderResult<()> {
977 for pair in dst.chunks_exact_mut(2) {
978 let idx = br.read_cb(cb)? as i16;
979 let idx0 = idx >> 8;
980 let idx1 = (idx << 8) >> 8;
981 if !is_esc || (idx0.abs() < 16) {
982 pair[0] = dequant(idx0, qtab, scale);
983 } else {
984 pair[0] = decode_esc_val(br, qtab, scale, idx0 < 0)?;
985 }
986 if !is_esc || (idx1.abs() < 16) {
987 pair[1] = dequant(idx1, qtab, scale);
988 } else {
989 pair[1] = decode_esc_val(br, qtab, scale, idx1 < 0)?;
990 }
991 }
992 Ok(())
993}
994
995impl NADecoder for AVCDecoder {
996 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
997 if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
998 self.chmap = match ainfo.get_channels() {
999 1 => { NAChannelMap::from_str("C").unwrap() },
1000 2 => { NAChannelMap::from_str("L,R").unwrap() },
1001 _ => { return Err(DecoderError::InvalidData); },
1002 };
1003 let srate = ainfo.get_sample_rate();
1004 self.ainfo = NAAudioInfo::new(srate, ainfo.get_channels(),
1005 SND_F32P_FORMAT, COEFFS);
1006 self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo));
1007 self.channels = ainfo.get_channels() as usize;
1008 self.is_40khz = srate <= 40000;
1009
1010 self.win_long = if (srate > 24000) && ((srate > 32000) || (self.channels == 2)) {
1011 AVC_WIN_LONG_32K
1012 } else {
1013 AVC_WIN_LONG_24K
1014 };
1015
1016 Ok(())
1017 } else {
1018 Err(DecoderError::InvalidData)
1019 }
1020 }
1021 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
1022 let info = pkt.get_stream().get_info();
1023 validate!(info.get_properties().is_audio());
1024 let src = pkt.get_buffer();
1025
1026 let abuf;
1027
1028 if self.version == 500 {
1029 abuf = alloc_audio_buffer(self.ainfo, COEFFS, self.chmap.clone())?;
1030 let mut adata = abuf.get_abuf_f32().unwrap();
fa90ccfb 1031 let mut br = BitReader::new(src.as_slice(), BitReaderMode::BE);
6a494288
KS
1032 self.decode_frame(&mut br, &mut adata, 0)?;
1033 } else {
1034 let mut offsets: Vec<usize> = Vec::new();
1035 let mut sizes: Vec<usize> = Vec::new();
1036
1037 let mut cur_off = 0;
1038 while cur_off + 2 < src.len() {
1039 let sz = read_u16le(&src[cur_off..])? as usize;
1040 validate!(sz > 0);
1041 validate!(cur_off + sz + 2 <= src.len());
1042 offsets.push(cur_off + 2);
1043 sizes.push(sz);
1044 cur_off += sz + 2;
1045 }
1046
1047 validate!(!sizes.is_empty());
1048
1049 abuf = alloc_audio_buffer(self.ainfo, COEFFS * sizes.len(), self.chmap.clone())?;
1050 let mut adata = abuf.get_abuf_f32().unwrap();
1051 let mut aoffset = 0;
1052 for (o, s) in offsets.iter().zip(sizes.iter()) {
fa90ccfb 1053 let mut br = BitReader::new(&src[*o..][..*s], BitReaderMode::BE);
6a494288
KS
1054 self.decode_frame(&mut br, &mut adata, aoffset)?;
1055 aoffset += COEFFS;
1056 }
1057 }
1058
1059 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
1060 frm.set_keyframe(true);
1061 Ok(frm.into_ref())
1062 }
f9be4e75
KS
1063 fn flush(&mut self) {
1064 }
6a494288
KS
1065}
1066
7d57ae2f
KS
1067impl NAOptionHandler for AVCDecoder {
1068 fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
1069 fn set_options(&mut self, _options: &[NAOption]) { }
1070 fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
1071}
1072
08a1fab7 1073pub fn get_decoder_500() -> Box<dyn NADecoder + Send> {
6a494288
KS
1074 Box::new(AVCDecoder::new(500))
1075}
1076
08a1fab7 1077pub fn get_decoder_501() -> Box<dyn NADecoder + Send> {
6a494288
KS
1078 Box::new(AVCDecoder::new(501))
1079}
1080
1081#[cfg(test)]
1082mod test {
1083 use nihav_core::codecs::RegisteredDecoders;
1084 use nihav_core::demuxers::RegisteredDemuxers;
ce742854 1085 use nihav_codec_support::test::dec_video::*;
78fb6560 1086 use crate::duck_register_all_decoders;
e64739f8 1087 use nihav_commonfmt::generic_register_all_demuxers;
6a494288
KS
1088 #[test]
1089 fn test_avc() {
1090 let mut dmx_reg = RegisteredDemuxers::new();
1091 generic_register_all_demuxers(&mut dmx_reg);
1092 let mut dec_reg = RegisteredDecoders::new();
78fb6560 1093 duck_register_all_decoders(&mut dec_reg);
6a494288
KS
1094
1095 //let file = "assets/Duck/Cell-140.vp5";
1096 //let file = "assets/Duck/Chocolat-500.vp5";
1097 let file = "assets/Duck/potter-500.vp7";
5580b11b 1098 test_decode_audio("avi", file, Some(1500), None/*Some("avc")*/, &dmx_reg, &dec_reg);
6a494288
KS
1099 }
1100}
1101
1102const AVC_WINFO_LONG: WinInfo = WinInfo {
1103 is_long: true,
1104 bands: &[
1105 4, 8, 12, 16, 20, 24, 28, 32,
1106 36, 40, 48, 56, 64, 72, 80, 88,
1107 96, 108, 120, 132, 144, 156, 172, 188,
1108 204, 224, 244, 264, 288, 312, 340, 368,
1109 400, 432, 464, 496, 528, 560, 592, 624,
1110 656, 688, 720, 752, 784, 816, 848, 880, 1024
1111 ],
1112};
1113
1114const AVC_WINFO_SHORT: WinInfo = WinInfo {
1115 is_long: false,
1116 bands: &[ 4, 8, 12, 16, 20, 24, 32, 40, 48, 56, 68, 80, 108, 128 ],
1117};
1118
1119const AVC_WINFO_40K_MODE4: WinInfo = WinInfo {
1120 is_long: true,
1121 bands: &[
1122 8, 16, 24, 32, 40, 48, 56, 64,
1123 72, 80, 88, 96, 104, 112, 120, 128,
1124 144, 160, 176, 192, 208, 224, 240, 256,
1125 264, 272, 280, 288, 296, 304, 312, 320,
1126 328, 336, 344, 352, 360, 368, 376, 384,
1127 400, 416, 432, 448, 464, 480, 496, 512,
1128 520, 528, 536, 544, 552, 560, 568, 576,
1129 584, 592, 600, 608, 616, 624, 632, 640,
1130 648, 656, 664, 672, 680, 688, 696, 704,
1131 712, 720, 728, 736, 744, 752, 760, 768,
1132 800, 832, 864, 896, 928, 960, 992, 1024
1133 ],
1134};
1135const AVC_WINFO_40K_MODE5: WinInfo = WinInfo {
1136 is_long: true,
1137 bands: &[
1138 8, 16, 24, 32, 40, 48, 56, 64,
1139 80, 96, 112, 128, 136, 144, 152, 160,
1140 168, 176, 184, 192, 208, 224, 240, 256,
1141 264, 272, 280, 288, 296, 304, 312, 320,
1142 328, 336, 344, 352, 360, 368, 376, 384,
1143 416, 448, 480, 512, 516, 520, 524, 528,
1144 532, 536, 540, 548, 556, 568, 580, 592,
1145 608, 624, 640, 656, 672, 688, 704, 720,
1146 736, 752, 768, 784, 800, 816, 832, 848,
1147 864, 880, 896, 912, 928, 944, 1024
1148 ],
1149};
1150const AVC_WINFO_40K_MODE6: WinInfo = WinInfo {
1151 is_long: true,
1152 bands: &[
1153 4, 8, 12, 16, 20, 24, 28, 36,
1154 44, 56, 68, 80, 96, 112, 128, 144,
1155 160, 176, 192, 208, 224, 240, 256, 272,
1156 288, 304, 320, 336, 352, 368, 384, 400,
1157 416, 432, 512, 520, 528, 536, 544, 552,
1158 560, 568, 576, 592, 608, 624, 640, 648,
1159 656, 664, 672, 680, 688, 696, 704, 720,
1160 736, 752, 768, 776, 784, 792, 800, 808,
1161 816, 824, 832, 840, 848, 856, 864, 872,
1162 880, 888, 896, 928, 960, 992, 1024
1163 ],
1164};
1165
1166const AVC_WINFO_44K_MODE4: WinInfo = WinInfo {
1167 is_long: true,
1168 bands: &[
1169 8, 16, 24, 32, 40, 48, 56, 64,
1170 72, 80, 88, 96, 104, 112, 120, 128,
1171 136, 144, 152, 160, 168, 176, 184, 192,
1172 200, 208, 216, 224, 232, 240, 248, 256,
1173 264, 272, 280, 288, 296, 304, 312, 320,
1174 328, 336, 344, 352, 360, 368, 376, 384,
1175 392, 400, 408, 416, 424, 432, 440, 448,
1176 456, 464, 472, 480, 488, 496, 504, 512,
1177 528, 544, 560, 576, 592, 608, 624, 640,
1178 672, 704, 736, 768, 832, 896, 960, 1024
1179 ],
1180};
1181const AVC_WINFO_44K_MODE5: WinInfo = WinInfo {
1182 is_long: true,
1183 bands: &[
1184 8, 16, 24, 32, 40, 48, 56, 64,
1185 72, 80, 88, 96, 104, 112, 120, 128,
1186 136, 144, 152, 160, 168, 176, 184, 192,
1187 200, 208, 216, 224, 232, 240, 248, 256,
1188 272, 288, 304, 320, 352, 384, 448, 512,
1189 516, 520, 524, 528, 532, 536, 540, 548,
1190 556, 568, 580, 592, 608, 624, 640, 656,
1191 672, 688, 704, 720, 736, 752, 768, 784,
1192 800, 816, 832, 848, 864, 880, 896, 912,
1193 928, 944, 1024
1194 ],
1195};
1196const AVC_WINFO_44K_MODE6: WinInfo = WinInfo {
1197 is_long: true,
1198 bands: &[
1199 4, 8, 12, 16, 20, 24, 28, 36,
1200 44, 56, 68, 80, 96, 112, 128, 144,
1201 160, 176, 192, 208, 224, 240, 256, 272,
1202 288, 304, 320, 336, 352, 368, 384, 400,
1203 416, 432, 512, 520, 528, 536, 544, 552,
1204 560, 568, 576, 584, 592, 600, 608, 616,
1205 624, 632, 640, 648, 656, 664, 672, 680,
1206 688, 696, 704, 712, 720, 728, 736, 744,
1207 752, 760, 768, 784, 800, 816, 832, 864,
1208 896, 960, 1024
1209 ],
1210};