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