]> git.nihav.org Git - nihav.git/blame - nihav-commonfmt/src/codecs/atrac3.rs
avimux: do not record palette change chunks in OpenDML index
[nihav.git] / nihav-commonfmt / src / codecs / atrac3.rs
CommitLineData
38953fb5
KS
1use nihav_core::formats::*;
2use nihav_core::frame::*;
3use nihav_core::codecs::*;
4use nihav_core::io::bitreader::*;
5use nihav_core::io::byteio::*;
6use nihav_core::io::codebook::*;
b4d5b851 7use nihav_codec_support::dsp::mdct::IMDCT;
aab478c1
KS
8use std::f32::consts;
9
10#[derive(Clone,Copy,PartialEq)]
11enum Mode {
12 Mono,
13 Stereo,
14 JointStereo,
15}
16
17const ATRAC3_FRAME_SIZE: usize = 1024;
18
19#[derive(Clone,Copy)]
20struct Tone {
21 pos: usize,
22 ncoeffs: usize,
23 coeffs: [f32; 8],
24}
25
26struct GainData {
27 ngains: [usize; 4],
28 gain_lev: [[usize; 8]; 4],
29 gain_loc: [[usize; 8]; 4],
30}
31
32impl GainData {
33 fn new() -> Self {
34 Self {
35 ngains: [0; 4],
36 gain_lev: [[0; 8]; 4],
37 gain_loc: [[0; 8]; 4],
38 }
39 }
40 fn read(&mut self, br: &mut BitReader, bands: usize) -> DecoderResult<()> {
41 self.ngains = [0; 4];
42 for band in 0..bands {
43 self.ngains[band] = br.read(3)? as usize;
44 for i in 0..self.ngains[band] {
45 self.gain_lev[band][i] = br.read(4)? as usize;
46 self.gain_loc[band][i] = br.read(5)? as usize;
47 }
48 }
49 Ok(())
50 }
51}
52
53struct Channel {
54 data: [f32; ATRAC3_FRAME_SIZE],
55 delay: [f32; ATRAC3_FRAME_SIZE],
56 qmf_delay: [f32; 64 * 3],
57
58 bands: usize,
59 block_no: usize,
60
61 gain_data: [GainData; 2],
62
63 subbands: usize,
64 components: usize,
65 ntones: usize,
66 tones: [Tone; 64],
67}
68
69impl Channel {
70 fn new() -> Self {
71 Self {
72 data: [0.0; ATRAC3_FRAME_SIZE],
73 delay: [0.0; ATRAC3_FRAME_SIZE],
74 qmf_delay: [0.0; 64 * 3],
75
76 bands: 0,
77 block_no: 0,
78
79 gain_data: [GainData::new(), GainData::new()],
80
81 subbands: 0,
82 components: 0,
83 ntones: 0,
84 tones: [Tone {pos: 0, ncoeffs: 0, coeffs: [0.0; 8]}; 64],
85 }
86 }
87 fn decode_unit(&mut self, br: &mut BitReader, codebooks: &[Codebook<u8>; 7], scalefactors: &[f32; 64]) -> DecoderResult<()> {
88 self.bands = (br.read(2)? as usize) + 1;
89 self.gain_data[self.block_no].read(br, self.bands)?;
90 self.data = [0.0; ATRAC3_FRAME_SIZE];
91
92 self.ntones = 0;
93 self.components = br.read(5)? as usize;
94 if self.components > 0 {
95 let selector = br.read(2)?;
96 validate!(selector != 2);
97 let mut mode0 = (selector & 1) != 0;
98
99 for _ in 0..self.components {
100 let mut flags: [bool; 4] = [false; 4];
ba8718ff
KS
101 for flag in flags[..self.bands].iter_mut() {
102 *flag = br.read_bool()?;
aab478c1
KS
103 }
104 let nvals = br.read(3)? as usize;
105 let quant = br.read(3)? as usize;
106 validate!(quant > 1);
107 if selector == 3 {
108 mode0 = br.read_bool()?;
109 }
110 for j in 0..self.bands*4 {
111 if !flags[j >> 2] { continue; }
112 let count = br.read(3)? as usize;
113 validate!(self.ntones + count < 64);
114 for _ in 0..count {
115 let scale_idx = br.read(6)? as usize;
116 let tone = &mut self.tones[self.ntones];
117 tone.pos = (br.read(6)? as usize) + j * 64;
118 tone.ncoeffs = (ATRAC3_FRAME_SIZE - tone.pos).min(nvals + 1);
119 let scale = scalefactors[scale_idx] * ATRAC3_MAX_QUANT[quant];
120 read_coeffs(br, codebooks, &mut tone.coeffs[..tone.ncoeffs], quant, scale, mode0)?;
121 self.ntones += 1;
122 }
123 }
124 }
125 }
126
127 // spectrum
128 let mut quants: [usize; 32] = [0; 32];
129 let mut scf: [usize; 32] = [0; 32];
130 self.subbands = (br.read(5)? as usize) + 1;
131 let mode0 = br.read_bool()?;
ba8718ff
KS
132 for quant in quants[..self.subbands].iter_mut() {
133 *quant = br.read(3)? as usize;
aab478c1
KS
134 }
135 for i in 0..self.subbands {
136 if quants[i] == 0 { continue; }
137 scf[i] = br.read(6)? as usize;
138 }
139
140 self.data = [0.0; ATRAC3_FRAME_SIZE];
141 for i in 0..self.subbands {
142 if quants[i] == 0 { continue; }
143 let start = ATRAC3_SUBBANDS[i];
144 let end = ATRAC3_SUBBANDS[i + 1];
145 let scale = scalefactors[scf[i]] * ATRAC3_MAX_QUANT[quants[i]];
146 read_coeffs(br, codebooks, &mut self.data[start..end], quants[i], scale, mode0)?;
147 }
148
149 for i in 0..self.ntones {
150 let tone = &self.tones[i];
151 for j in 0..tone.ncoeffs {
152 self.data[tone.pos + j] += tone.coeffs[j];
153 }
154 }
155 Ok(())
156 }
157 fn synth(&mut self, dsp: &mut DSP) {
158 let mut flag = 0;
c83013a1 159 for (band, (data, delay)) in self.data.chunks_mut(256).zip(self.delay.chunks_mut(256)).enumerate() {
aab478c1
KS
160 if (flag & 1) != 0 {
161 for i in 0..128 {
162 let t0 = data[i];
163 let t1 = data[255 - i];
164 data[i] = t1;
165 data[255 - i] = t0;
166 }
167 }
168 dsp.synth_band(data);
169 dsp.apply_gains(data, delay, &mut self.gain_data, self.block_no, band);
170 delay.copy_from_slice(&dsp.tmp[256..512]);
171 flag ^= 1;
aab478c1
KS
172 }
173 self.block_no ^= 1;
174 }
175 fn do_qmf(&mut self, dsp: &mut DSP, dst: &mut [f32]) {
176 let mut qchunks = self.qmf_delay.chunks_mut(64);
177 let qmf0 = qchunks.next().unwrap();
178 let qmf1 = qchunks.next().unwrap();
179 let qmf2 = qchunks.next().unwrap();
180 {
181 let mut tchunks = self.data.chunks_mut(512);
182 let tmp0 = tchunks.next().unwrap();
183 let tmp1 = tchunks.next().unwrap();
184 dsp.do_qmf(tmp0, qmf0, false);
185 dsp.do_qmf(tmp1, qmf1, true);
186 }
187 dsp.do_qmf_out(dst, &self.data, qmf2);
188 }
189}
190
191const ATRAC3_DEFAULT_DELAY: usize = 2190;
192const ATRAC3_WEIGHTING_DELAYS: [u8; 6] = [ 0, 7, 0, 7, 0, 7 ];
193
194fn read_coeffs(br: &mut BitReader, cb: &[Codebook<u8>; 7], dst: &mut [f32], quant: usize, scale: f32, mode0: bool) -> DecoderResult<()> {
195 if mode0 {
196 read_coeffs_mode0(br, dst, quant, scale)
197 } else if quant == 1 {
198 read_coeffs_mode1(br, &cb[0], dst, scale)
199 } else {
200 read_coeffs_other(br, &cb[quant - 1], dst, scale)
201 }
202}
203
204const ATRAC3_MODE0_CB: [f32; 4] = [ 0.0, 1.0, -2.0, -1.0 ];
205const ATRAC3_MODE0_BITS: [u8; 8] = [ 0, 4, 3, 3, 4, 4, 5, 6 ];
206
207fn read_coeffs_mode0(br: &mut BitReader, dst: &mut [f32], quant: usize, scale: f32) -> DecoderResult<()> {
208 let bits = ATRAC3_MODE0_BITS[quant];
209 if bits > 0 {
c83013a1 210 for el in dst.iter_mut() {
aab478c1 211 let val = br.read_s(bits)? as f32;
c83013a1 212 *el = val * scale;
aab478c1
KS
213 }
214 } else {
c83013a1 215 for out in dst.chunks_mut(2) {
aab478c1 216 let val = br.read(4)? as usize;
c83013a1
KS
217 out[0] = ATRAC3_MODE0_CB[val >> 2] * scale;
218 out[1] = ATRAC3_MODE0_CB[val & 3] * scale;
aab478c1
KS
219 }
220 }
221 Ok(())
222}
223
224const ATRAC3_MODE1_CB: [f32; 9 * 2] = [
225 0.0, 0.0,
226 0.0, 1.0,
227 0.0, -1.0,
228 1.0, 0.0,
229 -1.0, 0.0,
230 1.0, 1.0,
231 1.0, -1.0,
232 -1.0, 1.0,
233 -1.0, -1.0
234];
235
236fn read_coeffs_mode1(br: &mut BitReader, cb: &Codebook<u8>, dst: &mut [f32], scale: f32) -> DecoderResult<()> {
c83013a1 237 for out in dst.chunks_mut(2) {
aab478c1 238 let val = br.read_cb(cb)? as usize;
c83013a1
KS
239 out[0] = ATRAC3_MODE1_CB[val * 2 + 0] * scale;
240 out[1] = ATRAC3_MODE1_CB[val * 2 + 1] * scale;
aab478c1
KS
241 }
242 Ok(())
243}
244
245fn read_coeffs_other(br: &mut BitReader, cb: &Codebook<u8>, dst: &mut [f32], scale: f32) -> DecoderResult<()> {
c83013a1 246 for el in dst.iter_mut() {
aab478c1
KS
247 let val = (br.read_cb(cb)? as i8) + 1;
248 let sign = (val & 1) != 0;
c83013a1
KS
249 let coef = f32::from(if sign { -(val >> 1) } else { val >> 1 });
250 *el = coef * scale;
aab478c1
KS
251 }
252 Ok(())
253}
254
255struct DSP {
256 imdct: IMDCT,
257 window: [f32; 512],
258 gain_tab: [f32; 16],
259 gain_tab2: [f32; 32],
260 tmp: [f32; ATRAC3_FRAME_SIZE + 64],
261}
262
263impl DSP {
264 fn new() -> Self {
265 let mut gain_tab: [f32; 16] = [0.0; 16];
266 let mut gain_tab2: [f32; 32] = [0.0; 32];
267
ba8718ff
KS
268 for (i, el) in gain_tab.iter_mut().enumerate() {
269 *el = 2.0f32.powf(4.0 - (i as f32));
aab478c1 270 }
ba8718ff
KS
271 for (i, el) in gain_tab2.iter_mut().enumerate() {
272 *el = 2.0f32.powf(((i as f32) - 15.0) * -0.125);
aab478c1
KS
273 }
274
275 let mut tmpw: [f32; 256] = [0.0; 256];
ba8718ff
KS
276 for (i, el) in tmpw.iter_mut().enumerate() {
277 *el = (((((i as f32) + 0.5) / 256.0 - 0.5) * consts::PI).sin() + 1.0) * 0.5;
aab478c1
KS
278 }
279
280 let mut window: [f32; 512] = [0.0; 512];
281 for i in 0..tmpw.len() {
282 let w = tmpw[i] / (tmpw[i] * tmpw[i] + tmpw[255 - i] * tmpw[255 - i]);
283 window[i] = w;
284 window[512 - 1 - i] = w;
285 }
1a151e53 286
aab478c1 287 Self {
9e78289c 288 imdct: IMDCT::new(512, false),
aab478c1
KS
289 tmp: [0.0; ATRAC3_FRAME_SIZE + 64],
290 gain_tab, gain_tab2, window,
291 }
292 }
293 fn synth_band(&mut self, src: &[f32]) {
294 let dst = &mut self.tmp;
295 self.imdct.imdct(src, dst);
ba8718ff
KS
296 for (sample, &win) in dst.iter_mut().zip(self.window.iter()) {
297 *sample *= win;
aab478c1
KS
298 }
299 }
300 fn apply_gains(&mut self, dst: &mut [f32], delay: &[f32], gain_data: &mut [GainData; 2], block_no: usize, band: usize) {
301 let prev_ngains = gain_data[block_no ^ 1].ngains[band];
302 let gain1 = if gain_data[block_no].ngains[band] > 0 {
303 self.gain_tab[gain_data[block_no].gain_lev[band][0]]
304 } else { 1.0 };
305
306 if prev_ngains == 0 {
307 for i in 0..256 {
308 dst[i] = self.tmp[i] * gain1 + delay[i];
309 }
310 return;
311 }
312
313 gain_data[block_no ^ 1].gain_lev[band][prev_ngains] = 4;
314 gain_data[block_no ^ 1].gain_loc[band][prev_ngains] = 32;
315
316 let mut off = 0;
317 for i in 0..prev_ngains {
318 let start = gain_data[block_no ^ 1].gain_loc[band][i] * 8;
319 let end = start + 8;
320
321 let mut gain2 = self.gain_tab [gain_data[block_no ^ 1].gain_lev[band][i]];
322 let gain_inc = self.gain_tab2[gain_data[block_no ^ 1].gain_lev[band][i + 1] + 15 -
323 gain_data[block_no ^ 1].gain_lev[band][i]];
324
325 while off < start {
326 dst[off] = (self.tmp[off] * gain1 + delay[off]) * gain2;
327 off += 1;
328 }
329 while off < end {
330 dst[off] = (self.tmp[off] * gain1 + delay[off]) * gain2;
331 gain2 *= gain_inc;
332 off += 1;
333 }
334 }
335 for i in off..256 {
336 dst[i] = self.tmp[i] * gain1 + delay[i];
337 }
338 }
339 fn qmf_prepare(&mut self, src: &[f32], delay: &[f32], size: usize, swap: bool) {
ba8718ff 340 self.tmp[..46].copy_from_slice(&delay[..46]);
aab478c1
KS
341 let (s0, s1) = if !swap {
342 (&src[0..], &src[size/2..])
343 } else {
344 (&src[size/2..], &src[0..])
345 };
346 for i in (0..size).step_by(4) {
347 self.tmp[46 + i + 0] = s0[i / 2 + 0] + s1[i / 2 + 0];
348 self.tmp[46 + i + 1] = s0[i / 2 + 0] - s1[i / 2 + 0];
349 self.tmp[46 + i + 2] = s0[i / 2 + 1] + s1[i / 2 + 1];
350 self.tmp[46 + i + 3] = s0[i / 2 + 1] - s1[i / 2 + 1];
351 }
352 }
353 fn qmf_synth(&mut self, dst: &mut [f32], size: usize) {
354 for i in (0..size).step_by(2) {
355 let mut acc0 = 0.0;
356 let mut acc1 = 0.0;
357
358 for j in (0..ATRAC3_QMF_FILTER.len()).step_by(2) {
359 acc0 += self.tmp[i + j + 0] * ATRAC3_QMF_FILTER[j + 0];
360 acc1 += self.tmp[i + j + 1] * ATRAC3_QMF_FILTER[j + 1];
361 }
362 dst[i + 0] = acc1 * consts::SQRT_2 / 256.0;
363 dst[i + 1] = acc0 * consts::SQRT_2 / 256.0;
364 }
365 }
366 fn do_qmf(&mut self, dst: &mut [f32], delay: &mut [f32], swap: bool) {
367 self.qmf_prepare(dst, delay, 512, swap);
368 self.qmf_synth(dst, 512);
ba8718ff 369 delay[..46].copy_from_slice(&self.tmp[512..][..46]);
aab478c1
KS
370 }
371 fn do_qmf_out(&mut self, dst: &mut [f32], src: &[f32], delay: &mut [f32]) {
372 self.qmf_prepare(src, delay, 1024, false);
373 self.qmf_synth(dst, 1024);
ba8718ff 374 delay[..46].copy_from_slice(&self.tmp[1024..][..46]);
aab478c1
KS
375 }
376}
377
378struct Atrac3Decoder {
2422d969 379 info: NACodecInfoRef,
aab478c1
KS
380 channels: usize,
381 chmap: NAChannelMap,
382 samples: usize,
383 mode: Mode,
384 scrambled: bool,
385
386 codebooks: [Codebook<u8>; 7],
387 dsp: DSP,
388 ch_data: [Channel; 2],
389 scalefactors: [f32; 64],
390
391 mci_prev: [usize; 4],
392 mci_cur: [usize; 4],
393 mci_next: [usize; 4],
394
395 weighting_delay: [u8; 6],
396
397 pkt_buf: Vec<u8>,
398}
399
400struct Atrac3CodebookReader {
401 bits: &'static [u8],
402 codes: &'static [u8],
403}
404impl CodebookDescReader<u8> for Atrac3CodebookReader {
405 fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
61cab15b 406 fn code(&mut self, idx: usize) -> u32 { u32::from(self.codes[idx]) }
aab478c1
KS
407 fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
408 fn len(&mut self) -> usize { self.bits.len() }
409}
410
411impl Atrac3Decoder {
412 fn new() -> Self {
413 let mut scalefactors: [f32; 64] = [0.0; 64];
ba8718ff
KS
414 for (i, scf) in scalefactors.iter_mut().enumerate() {
415 *scf = 2.0f32.powf(((i as f32) - 15.0) / 3.0);
aab478c1
KS
416 }
417
418 let mut cb0 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[0], bits: ATRAC3_HUFF_BITS[0] };
419 let mut cb1 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[1], bits: ATRAC3_HUFF_BITS[1] };
420 let mut cb2 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[2], bits: ATRAC3_HUFF_BITS[2] };
421 let mut cb3 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[3], bits: ATRAC3_HUFF_BITS[3] };
422 let mut cb4 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[4], bits: ATRAC3_HUFF_BITS[4] };
423 let mut cb5 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[5], bits: ATRAC3_HUFF_BITS[5] };
424 let mut cb6 = Atrac3CodebookReader { codes: ATRAC3_HUFF_CODES[6], bits: ATRAC3_HUFF_BITS[6] };
425 Self {
426 info: NACodecInfo::new_dummy(),
427 chmap: NAChannelMap::new(),
428 channels: 0,
429 samples: 0,
430 mode: Mode::Mono,
431 scrambled: false,
432
433 dsp: DSP::new(),
434 ch_data: [Channel::new(), Channel::new()],
435 codebooks: [Codebook::new(&mut cb0, CodebookMode::MSB).unwrap(),
436 Codebook::new(&mut cb1, CodebookMode::MSB).unwrap(),
437 Codebook::new(&mut cb2, CodebookMode::MSB).unwrap(),
438 Codebook::new(&mut cb3, CodebookMode::MSB).unwrap(),
439 Codebook::new(&mut cb4, CodebookMode::MSB).unwrap(),
440 Codebook::new(&mut cb5, CodebookMode::MSB).unwrap(),
441 Codebook::new(&mut cb6, CodebookMode::MSB).unwrap() ],
442
443 mci_prev: [3; 4],
444 mci_cur: [3; 4],
445 mci_next: [3; 4],
446
447 weighting_delay: ATRAC3_WEIGHTING_DELAYS,
448 pkt_buf: Vec::with_capacity(65536),
449 scalefactors,
450 }
451 }
61cab15b 452 #[allow(clippy::identity_op)]
aab478c1
KS
453 fn rev_matrix(&mut self) {
454 for i in 0..4 {
455 let c0 = self.mci_prev[i];
456 let c1 = self.mci_cur[i];
457 let off;
458 if c0 != c1 {
459 let l0 = ATRAC3_MATRIX_COEFFS[c0 * 2 + 0];
460 let r0 = ATRAC3_MATRIX_COEFFS[c1 * 2 + 0];
461 let l1 = ATRAC3_MATRIX_COEFFS[c0 * 2 + 1];
462 let r1 = ATRAC3_MATRIX_COEFFS[c1 * 2 + 1];
463 for idx in 0..8 {
464 let t0 = self.ch_data[0].data[idx + i * 256];
465 let t1 = self.ch_data[1].data[idx + i * 256];
466 let n1 = t0 * interp(l0, r0, idx) + t1 * interp(l1, r1, idx);
467 self.ch_data[0].data[idx + i * 256] = n1;
468 self.ch_data[1].data[idx + i * 256] = t0 * 2.0 - n1;
469 }
470 off = i * 256 + 8;
471 } else {
472 off = i * 256;
473 }
474 match c1 {
475 0 => {
476 for i in off..256 {
477 let t0 = self.ch_data[0].data[i];
478 let t1 = self.ch_data[1].data[i];
479 self.ch_data[0].data[i] = t1 * 2.0;
480 self.ch_data[1].data[i] = (t0 - t1) * 2.0;
481 }
482 },
483 1 => {
484 for i in off..256 {
485 let t0 = self.ch_data[0].data[i];
486 let t1 = self.ch_data[1].data[i];
487 self.ch_data[0].data[i] = (t0 + t1) * 2.0;
488 self.ch_data[1].data[i] = t1 * -2.0;
489 }
490 },
491 _ => {
492 for i in off..256 {
493 let t0 = self.ch_data[0].data[i];
494 let t1 = self.ch_data[1].data[i];
495 self.ch_data[0].data[i] = t0 + t1;
496 self.ch_data[1].data[i] = t0 - t1;
497 }
498 },
499 };
500 }
501 }
502 fn weigh_channels(&mut self) {
503 if (self.weighting_delay[1] == 7) && (self.weighting_delay[3] == 7) { return; }
504 let pw: [f32; 2];
505 if self.weighting_delay[1] == 7 {
506 pw = [1.0; 2];
507 } else {
c83013a1 508 let w = f32::from(self.weighting_delay[1]) / 7.0;
aab478c1
KS
509 let iw = (2.0 - w * w).sqrt();
510 if self.weighting_delay[0] == 0 {
511 pw = [w, iw];
512 } else {
513 pw = [iw, w];
514 }
515 }
516 let cw: [f32; 2];
517 if self.weighting_delay[3] == 7 {
518 cw = [1.0; 2];
519 } else {
c83013a1 520 let w = f32::from(self.weighting_delay[3]) / 7.0;
aab478c1
KS
521 let iw = (2.0 - w * w).sqrt();
522 if self.weighting_delay[2] == 0 {
523 cw = [w, iw];
524 } else {
525 cw = [iw, w];
526 }
527 }
528
529 for i in 0..4 {
530 let off = i * 256;
531 for j in 0..8 {
532 self.ch_data[0].data[off + j] *= interp(pw[0], pw[1], j);
533 self.ch_data[1].data[off + j] *= interp(pw[0], pw[1], j);
534 }
535 for j in 8..256 {
536 self.ch_data[0].data[off + j] *= cw[0];
537 self.ch_data[1].data[off + j] *= cw[1];
538 }
539 }
540 }
541}
542
543fn interp(a: f32, b: f32, pos: usize) -> f32 {
544 a + ((pos as f32) / 8.0) * (b - a)
545}
546
547impl NADecoder for Atrac3Decoder {
01613464 548 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
aab478c1
KS
549 if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
550 self.info = info.clone();
551 let edata = info.get_extradata().unwrap();
552 validate!(edata.len() >= 4);
553
554 let mut mr = MemoryReader::new_read(&edata);
555 let mut br = ByteReader::new(&mut mr);
556
557 match edata.len() {
558 10 => {
559 let version = br.read_u32be()?;
560 validate!(version == 4);
561 self.samples = br.read_u16be()? as usize;
562 let delay = br.read_u16be()? as usize;
563 validate!(delay == ATRAC3_DEFAULT_DELAY);
564 let mode = br.read_u16be()?;
565 self.mode = match mode {
566 0 => Mode::Mono,
567 2 => Mode::Stereo,
568 0x12 => Mode::JointStereo,
569 _ => return Err(DecoderError::InvalidData),
570 };
571 self.channels = if self.mode == Mode::Mono { 1 } else { 2 };
572 self.scrambled = true;
573 },
574 14 | 16 => {
575 if edata.len() == 16 { br.read_skip(2)?; }
576 self.samples = br.read_u32be()? as usize;
577 let mode = br.read_u16be()?;
578 self.mode = if mode != 0 { Mode::JointStereo } else { Mode::Stereo };
579 self.channels = 2;
580 br.read_skip(2)?;
581 let ffactor = br.read_u16be()? as usize;
582 validate!((ffactor > 0) && (ffactor <= 16));
583 // calculate block_align / channels / ffactor, validate it's 96/152/192
584 },
585 _ => { return Err(DecoderError::InvalidData) }
586 };
587 validate!(self.samples == ATRAC3_FRAME_SIZE * self.channels);
588 if self.mode == Mode::Mono {
589 self.chmap.add_channel(NAChannelType::C);
590 } else {
591 self.chmap.add_channel(NAChannelType::L);
592 self.chmap.add_channel(NAChannelType::R);
593 }
594 let ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), self.channels as u8,
595 SND_F32P_FORMAT, self.samples);
596 self.info = info.replace_info(NACodecTypeInfo::Audio(ainfo));
597 Ok(())
598 } else {
599 Err(DecoderError::InvalidData)
600 }
601 }
01613464 602 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
aab478c1
KS
603 let info = pkt.get_stream().get_info();
604 validate!(info.get_properties().is_audio());
605 let pktbuf = pkt.get_buffer();
606 validate!(pktbuf.len() > 5);
607
608 let frame_size = pktbuf.len();
609 self.pkt_buf.resize(frame_size, 0);
610 if self.scrambled {
611 for (i, s) in pktbuf.iter().enumerate() {
612 self.pkt_buf[i] = s ^ ATRAC3_XOR_KEY[i & 3];
613 }
614 } else {
615 let dst = &mut self.pkt_buf[0..frame_size];
616 dst.copy_from_slice(pktbuf.as_slice());
617 }
618
619 {
fa90ccfb 620 let mut br = BitReader::new(&self.pkt_buf[0..frame_size], BitReaderMode::BE);
aab478c1
KS
621 let id = br.read(6)?;
622 validate!(id == 0x28);
623 self.ch_data[0].decode_unit(&mut br, &self.codebooks, &self.scalefactors)?;
624 self.ch_data[0].synth(&mut self.dsp);
625 }
626 if self.channels == 2 {
627 let off;
628 if self.mode == Mode::JointStereo {
629 for i in 0..frame_size / 2 {
630 let b0 = self.pkt_buf[i];
631 let b1 = self.pkt_buf[frame_size - i - 1];
632 self.pkt_buf[i] = b1;
633 self.pkt_buf[frame_size - i - 1] = b0;
634 }
635 let mut i = 0;
636 while (i < frame_size) && (self.pkt_buf[i] == 0xF8) { i += 1; }
637 validate!(frame_size - i > 4);
638 off = i;
639 } else {
640 off = frame_size / 2;
641 }
fa90ccfb 642 let mut br = BitReader::new(&self.pkt_buf[off..frame_size], BitReaderMode::BE);
aab478c1
KS
643 if self.mode == Mode::JointStereo {
644 let id = br.read(2)?;
645 validate!(id == 0x3);
646 } else {
647 let id = br.read(6)?;
648 validate!(id == 0x28);
649 }
650 if self.mode == Mode::JointStereo {
651 for i in 0..self.weighting_delay.len() - 2 {
652 self.weighting_delay[i] = self.weighting_delay[i + 2];
653 }
654 self.weighting_delay[4] = br.read(1)? as u8;
655 self.weighting_delay[5] = br.read(3)? as u8;
656 self.mci_prev = self.mci_cur;
657 self.mci_cur = self.mci_next;
658 for i in 0..4 {
659 self.mci_next[i] = br.read(2)? as usize;
660 }
661 }
662 self.ch_data[1].decode_unit(&mut br, &self.codebooks, &self.scalefactors)?;
663 self.ch_data[1].synth(&mut self.dsp);
664 }
665 if self.mode == Mode::JointStereo {
666 self.rev_matrix();
667 self.weigh_channels();
668 }
669
670 let ainfo = self.info.get_properties().get_audio_info().unwrap();
671
b70cc006 672 let abuf = alloc_audio_buffer(ainfo, ATRAC3_FRAME_SIZE, self.chmap.clone())?;
aab478c1 673 let mut adata = abuf.get_abuf_f32().unwrap();
1a967e6b 674 let output = adata.get_data_mut().unwrap();
aab478c1
KS
675
676 for ch in 0..self.channels {
677 let dpos = abuf.get_offset(ch);
678 self.ch_data[ch].do_qmf(&mut self.dsp, &mut output[dpos..][..ATRAC3_FRAME_SIZE]);
679 }
680
681 let mut frm = NAFrame::new_from_pkt(pkt, self.info.replace_info(NACodecTypeInfo::Audio(ainfo)), abuf);
682 frm.set_keyframe(true);
171860fc 683 Ok(frm.into_ref())
aab478c1 684 }
f9be4e75
KS
685 fn flush(&mut self) {
686 for ch_data in self.ch_data.iter_mut() {
687 ch_data.delay = [0.0; 1024];
688 ch_data.qmf_delay = [0.0; 64 * 3];
689 }
690 }
aab478c1
KS
691}
692
7d57ae2f
KS
693impl NAOptionHandler for Atrac3Decoder {
694 fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
695 fn set_options(&mut self, _options: &[NAOption]) { }
696 fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
697}
698
08a1fab7 699pub fn get_decoder() -> Box<dyn NADecoder + Send> {
aab478c1
KS
700 Box::new(Atrac3Decoder::new())
701}
702
703#[cfg(test)]
704mod test {
4f6124ac
KS
705 use nihav_core::codecs::RegisteredDecoders;
706 use nihav_core::demuxers::RegisteredDemuxers;
ce742854 707 use nihav_codec_support::test::dec_video::test_decode_audio;
78fb6560 708 use crate::generic_register_all_decoders;
e64739f8 709 use nihav_realmedia::realmedia_register_all_demuxers;
aab478c1
KS
710 #[test]
711 fn test_atrac3() {
4f6124ac
KS
712 let mut dmx_reg = RegisteredDemuxers::new();
713 realmedia_register_all_demuxers(&mut dmx_reg);
714 let mut dec_reg = RegisteredDecoders::new();
78fb6560 715 generic_register_all_decoders(&mut dec_reg);
4f6124ac 716
886cde48 717 // samples from private collection
aab478c1
KS
718 let file = "assets/RV/rv30_atrc_384x208_realproducer_plus_8.51.rm";
719// let file = "assets/RV/rv20_svt_atrc_640x352_realproducer_plus_8.51.rm";
5580b11b 720 test_decode_audio("realmedia", file, Some(12000), None/*Some("atrac3")*/, &dmx_reg, &dec_reg);
aab478c1
KS
721 }
722}
723
724const ATRAC3_XOR_KEY: [u8; 4] = [ 0x53, 0x7F, 0x61, 0x03 ];
725
726const ATRAC3_HUFF_CODES: [&[u8]; 7] = [
727 &[ 0x00, 0x04, 0x05, 0x0C, 0x0D, 0x1C, 0x1D, 0x1E, 0x1F ],
728 &[ 0x00, 0x04, 0x05, 0x06, 0x07 ],
729 &[ 0x00, 0x04, 0x05, 0x0C, 0x0D, 0x0E, 0x0F ],
730 &[ 0x00, 0x04, 0x05, 0x0C, 0x0D, 0x1C, 0x1D, 0x1E, 0x1F ], // same as 0
731 &[ 0x00, 0x02, 0x03, 0x08, 0x09, 0x0A, 0x0B, 0x1C, 0x1D, 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x0D ],
732 &[ 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x14,
733 0x15, 0x16, 0x17, 0x18, 0x19, 0x34, 0x35, 0x36,
734 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x78, 0x79, 0x7A,
735 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x08, 0x09 ],
736 &[ 0x00, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
737 0x0F, 0x10, 0x11, 0x24, 0x25, 0x26, 0x27, 0x28,
738 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,
739 0x31, 0x32, 0x33, 0x68, 0x69, 0x6A, 0x6B, 0x6C,
740 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74,
741 0x75, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2,
742 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA,
743 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, 0x02, 0x03 ]
744];
745const ATRAC3_HUFF_BITS: [&[u8]; 7] = [
746 &[ 1, 3, 3, 4, 4, 5, 5, 5, 5 ],
747 &[ 1, 3, 3, 3, 3 ],
748 &[ 1, 3, 3, 4, 4, 4, 4 ],
749 &[ 1, 3, 3, 4, 4, 5, 5, 5, 5 ],
750 &[ 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 4, 4 ],
751 &[ 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4 ],
752 &[ 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7,
753 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4 ],
754];
755
756const ATRAC3_MAX_QUANT: [f32; 8] = [ 0.0, 1.0/1.5, 1.0/2.5, 1.0/3.5, 1.0/4.5, 1.0/7.5, 1.0/15.5, 1.0/31.5 ];
757
758const ATRAC3_SUBBANDS: [usize; 32 + 1] = [
759 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176,
760 192, 224, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 896,
761 1024
762];
763
764const ATRAC3_MATRIX_COEFFS: [f32; 8] = [ 0.0, 2.0, 2.0, 2.0, 0.0, 0.0, 1.0, 1.0 ];
765
766const ATRAC3_QMF_FILTER: [f32; 48] = [
767 -0.000029238139, -0.000184109580, -0.000112315138, 0.000602345390,
768 0.000484503806, -0.001705877949, -0.001041114796, 0.004068033770,
769 0.001566677820, -0.008430772461, -0.001512299757, 0.015680588782,
770 -0.000122339843, -0.026883240789, 0.004925364163, 0.043472178280,
771 -0.015603342094, -0.068180441856, 0.037618979812, 0.108652018011,
772 -0.087192758918, -0.198768734932, 0.264158189297, 0.928483188152,
773 0.928483188152, 0.264158189297, -0.198768734932, -0.087192758918,
774 0.108652018011, 0.037618979812, -0.068180441856, -0.015603342094,
775 0.043472178280, 0.004925364163, -0.026883240789, -0.000122339843,
776 0.015680588782, -0.001512299757, -0.008430772461, 0.001566677820,
777 0.004068033770, -0.001041114796, -0.001705877949, 0.000484503806,
778 0.000602345390, -0.000112315138, -0.000184109580, -0.000029238139
779];