1 use nihav_core::codecs::*;
2 use nihav_core::io::bitreader::*;
6 const CODEC_SAMPLES: usize = 1152;
13 macro_rules! butterfly {
14 (in; $src0: expr, $src1: expr, $dst0: expr, $dst1: expr, $scale: expr) => {
15 $dst0 = $src0 + $src1;
16 $dst1 = ($src0 - $src1) * $scale;
18 (rev; $a: expr, $b: expr) => {
19 butterfly!(rev; $a, $b, std::f32::consts::FRAC_1_SQRT_2);
21 (rev; $a: expr, $b: expr, $scale: expr) => {
23 $b = ($a - $b) * $scale;
26 (scal; $a: expr, $b: expr) => {
27 butterfly!(scal; $a, $b, std::f32::consts::FRAC_1_SQRT_2);
29 (scal; $a: expr, $b: expr, $scale: expr) => {
31 $b = ($b - $a) * $scale;
36 macro_rules! postadd {
37 ($tmp: expr, $a0: expr, $b0: expr, $c0: expr, $d0: expr, $a1: expr, $b1: expr, $c1: expr, $d1: expr) => {
38 $tmp[$c0] += $tmp[$d0];
39 $tmp[$c1] += $tmp[$d1];
40 $tmp[$a1] += $tmp[$c1];
41 $tmp[$c1] += $tmp[$b1];
42 $tmp[$b1] += $tmp[$d1];
46 fn dct32(src: &[f32; 32], dst: &mut [f32]) {
47 let mut tmp = [0.0f32; 32];
49 butterfly!(in; src[ 0], src[31], tmp[ 0], tmp[31], 0.50060299823519627);
50 butterfly!(in; src[ 1], src[30], tmp[ 1], tmp[30], 0.50547095989754365);
51 butterfly!(in; src[ 2], src[29], tmp[ 2], tmp[29], 0.51544730992262455);
52 butterfly!(in; src[ 3], src[28], tmp[ 3], tmp[28], 0.53104259108978413);
53 butterfly!(in; src[ 4], src[27], tmp[ 4], tmp[27], 0.55310389603444454);
54 butterfly!(in; src[ 5], src[26], tmp[ 5], tmp[26], 0.58293496820613389);
55 butterfly!(in; src[ 6], src[25], tmp[ 6], tmp[25], 0.62250412303566482);
56 butterfly!(in; src[ 7], src[24], tmp[ 7], tmp[24], 0.67480834145500568);
57 butterfly!(in; src[ 8], src[23], tmp[ 8], tmp[23], 0.74453627100229858);
58 butterfly!(in; src[ 9], src[22], tmp[ 9], tmp[22], 0.83934964541552681);
59 butterfly!(in; src[10], src[21], tmp[10], tmp[21], 0.97256823786196078);
60 butterfly!(in; src[11], src[20], tmp[11], tmp[20], 1.1694399334328847);
61 butterfly!(in; src[12], src[19], tmp[12], tmp[19], 1.4841646163141662);
62 butterfly!(in; src[13], src[18], tmp[13], tmp[18], 2.0577810099534108);
63 butterfly!(in; src[14], src[17], tmp[14], tmp[17], 3.407608418468719);
64 butterfly!(in; src[15], src[16], tmp[15], tmp[16], 10.190008123548033);
65 butterfly!(rev; tmp[ 0], tmp[15], 0.50241928618815568);
66 butterfly!(rev; tmp[ 1], tmp[14], 0.52249861493968885);
67 butterfly!(rev; tmp[ 2], tmp[13], 0.56694403481635769);
68 butterfly!(rev; tmp[ 3], tmp[12], 0.64682178335999008);
69 butterfly!(rev; tmp[ 4], tmp[11], 0.7881546234512502);
70 butterfly!(rev; tmp[ 5], tmp[10], 1.0606776859903471);
71 butterfly!(rev; tmp[ 6], tmp[ 9], 1.7224470982383342);
72 butterfly!(rev; tmp[ 7], tmp[ 8], 5.1011486186891553);
73 butterfly!(scal; tmp[16], tmp[31], 0.50241928618815568);
74 butterfly!(scal; tmp[17], tmp[30], 0.52249861493968885);
75 butterfly!(scal; tmp[18], tmp[29], 0.56694403481635769);
76 butterfly!(scal; tmp[19], tmp[28], 0.64682178335999008);
77 butterfly!(scal; tmp[20], tmp[27], 0.7881546234512502);
78 butterfly!(scal; tmp[21], tmp[26], 1.0606776859903471);
79 butterfly!(scal; tmp[22], tmp[25], 1.7224470982383342);
80 butterfly!(scal; tmp[23], tmp[24], 5.1011486186891553);
81 butterfly!(rev; tmp[ 0], tmp[ 7], 0.50979557910415918);
82 butterfly!(rev; tmp[ 1], tmp[ 6], 0.60134488693504529);
83 butterfly!(rev; tmp[ 2], tmp[ 5], 0.89997622313641557);
84 butterfly!(rev; tmp[ 3], tmp[ 4], 2.5629154477415055);
85 butterfly!(rev; tmp[16], tmp[23], 0.50979557910415918);
86 butterfly!(rev; tmp[17], tmp[22], 0.60134488693504529);
87 butterfly!(rev; tmp[18], tmp[21], 0.89997622313641557);
88 butterfly!(rev; tmp[19], tmp[20], 2.5629154477415055);
89 butterfly!(scal; tmp[ 8], tmp[15], 0.50979557910415918);
90 butterfly!(scal; tmp[ 9], tmp[14], 0.60134488693504529);
91 butterfly!(scal; tmp[10], tmp[13], 0.89997622313641557);
92 butterfly!(scal; tmp[11], tmp[12], 2.5629154477415055);
93 butterfly!(scal; tmp[24], tmp[31], 0.50979557910415918);
94 butterfly!(scal; tmp[25], tmp[30], 0.60134488693504529);
95 butterfly!(scal; tmp[26], tmp[29], 0.89997622313641557);
96 butterfly!(scal; tmp[27], tmp[28], 2.5629154477415055);
97 butterfly!(rev; tmp[ 0], tmp[ 3], 0.54119610014619701);
98 butterfly!(rev; tmp[ 1], tmp[ 2], 1.3065629648763764);
99 butterfly!(rev; tmp[ 8], tmp[11], 0.54119610014619701);
100 butterfly!(rev; tmp[ 9], tmp[10], 1.3065629648763764);
101 butterfly!(rev; tmp[16], tmp[19], 0.54119610014619701);
102 butterfly!(rev; tmp[17], tmp[18], 1.3065629648763764);
103 butterfly!(rev; tmp[24], tmp[27], 0.54119610014619701);
104 butterfly!(rev; tmp[25], tmp[26], 1.3065629648763764);
105 butterfly!(scal; tmp[ 4], tmp[ 7], 0.54119610014619701);
106 butterfly!(scal; tmp[ 5], tmp[ 6], 1.3065629648763764);
107 butterfly!(scal; tmp[12], tmp[15], 0.54119610014619701);
108 butterfly!(scal; tmp[13], tmp[14], 1.3065629648763764);
109 butterfly!(scal; tmp[20], tmp[23], 0.54119610014619701);
110 butterfly!(scal; tmp[21], tmp[22], 1.3065629648763764);
111 butterfly!(scal; tmp[28], tmp[31], 0.54119610014619701);
112 butterfly!(scal; tmp[29], tmp[30], 1.3065629648763764);
113 butterfly!(rev; tmp[ 0], tmp[ 1]);
114 butterfly!(rev; tmp[ 4], tmp[ 5]);
115 butterfly!(rev; tmp[ 8], tmp[ 9]);
116 butterfly!(rev; tmp[12], tmp[13]);
117 butterfly!(rev; tmp[16], tmp[17]);
118 butterfly!(rev; tmp[20], tmp[21]);
119 butterfly!(rev; tmp[24], tmp[25]);
120 butterfly!(rev; tmp[28], tmp[29]);
121 butterfly!(scal; tmp[ 2], tmp[ 3]);
122 butterfly!(scal; tmp[ 6], tmp[ 7]);
123 butterfly!(scal; tmp[10], tmp[11]);
124 butterfly!(scal; tmp[14], tmp[15]);
125 butterfly!(scal; tmp[18], tmp[19]);
126 butterfly!(scal; tmp[22], tmp[23]);
127 butterfly!(scal; tmp[26], tmp[27]);
128 butterfly!(scal; tmp[30], tmp[31]);
130 postadd!(tmp, 0, 1, 2, 3, 4, 5, 6, 7);
131 postadd!(tmp, 8, 9, 10, 11, 12, 13, 14, 15);
132 postadd!(tmp,16, 17, 18, 19, 20, 21, 22, 23);
133 postadd!(tmp,24, 25, 26, 27, 28, 29, 30, 31);
144 dst[ 2] = tmp[ 8] + tmp[12];
145 dst[18] = tmp[ 9] + tmp[13];
146 dst[10] = tmp[10] + tmp[14];
147 dst[26] = tmp[11] + tmp[15];
149 dst[ 6] = tmp[12] + tmp[10];
150 dst[22] = tmp[13] + tmp[11];
152 dst[14] = tmp[14] + tmp[ 9];
164 dst[ 1] = tmp[16] + tmp[24];
165 dst[17] = tmp[17] + tmp[25];
166 dst[ 9] = tmp[18] + tmp[26];
167 dst[25] = tmp[19] + tmp[27];
168 dst[ 5] = tmp[20] + tmp[28];
169 dst[21] = tmp[21] + tmp[29];
170 dst[13] = tmp[22] + tmp[30];
171 dst[29] = tmp[23] + tmp[31];
173 dst[ 3] = tmp[24] + tmp[20];
174 dst[19] = tmp[25] + tmp[21];
175 dst[11] = tmp[26] + tmp[22];
176 dst[27] = tmp[27] + tmp[23];
178 dst[ 7] = tmp[28] + tmp[18];
179 dst[23] = tmp[29] + tmp[19];
181 dst[15] = tmp[30] + tmp[17];
193 fn synth(&mut self, src: &[f32; 32], dst: &mut [f32]) {
194 self.pos = self.pos.wrapping_sub(32) & 0x1FF;
195 dct32(src, &mut self.hist[self.pos..][..32]);
199 for j in (0..512).step_by(64) {
200 acc += QMF_WINDOW[i + j] * self.hist[(j + 16 + i + self.pos) & 0x1FF];
201 acc -= QMF_WINDOW[i + j + 32] * self.hist[(j + 16 + 32 - i + self.pos) & 0x1FF];
206 for j in (0..512).step_by(64) {
207 acc -= QMF_WINDOW[j + 32 + 16] * self.hist[(j + 32 + self.pos) & 0x1FF];
212 for j in (0..512).step_by(64) {
213 acc -= QMF_WINDOW[i + j] * self.hist[(j + 32 + 16 - i + self.pos) & 0x1FF];
214 acc -= QMF_WINDOW[i + j + 32] * self.hist[(j + 32 - 16 + i + self.pos) & 0x1FF];
223 info: Arc<NACodecInfo>,
226 bitalloc: [[u8; 32]; 3],
227 scf_select: [u8; 32],
228 scales: [[u8; 32]; 3],
229 samples: [[f32; 32]; 36],
239 ainfo: NAAudioInfo::new(22050, 1, SND_F32P_FORMAT, CODEC_SAMPLES),
240 info: NACodecInfo::new_dummy(),
241 chmap: NAChannelMap::new(),
243 bitalloc: [[0; 32]; 3],
245 scales: [[0; 32]; 3],
246 samples: [[0.0; 32]; 36],
253 fn unpack_bitalloc(&mut self, br: &mut BitReader) -> DecoderResult<()> {
256 self.bitalloc[i][sb] = br.read(BITALLOC_INFO[sb])? as u8;
261 fn unpack_scales(&mut self, br: &mut BitReader) -> DecoderResult<()> {
263 if (self.bitalloc[0][sb] | self.bitalloc[1][sb] | self.bitalloc[2][sb]) != 0 {
264 self.scf_select[sb] = br.read(2)? as u8;
266 self.scf_select[sb] = 0;
270 self.scales = [[0; 32]; 3];
272 let ba0 = self.bitalloc[0][sb];
273 let ba1 = self.bitalloc[1][sb];
274 let ba2 = self.bitalloc[2][sb];
275 if (ba0 | ba1 | ba2) == 0 {
278 match self.scf_select[sb] {
281 if self.bitalloc[j][sb] != 0 {
282 self.scales[j][sb] = br.read(6)? as u8;
287 if (ba0 | ba1) != 0 {
288 let scale = br.read(6)? as u8;
289 self.scales[0][sb] = scale;
290 self.scales[1][sb] = scale;
293 self.scales[2][sb] = br.read(6)? as u8;
297 let scale = br.read(6)? as u8;
298 self.scales[0][sb] = scale;
299 self.scales[1][sb] = scale;
300 self.scales[2][sb] = scale;
304 self.scales[0][sb] = br.read(6)? as u8;
306 if (ba1 | ba2) != 0 {
307 let scale = br.read(6)? as u8;
308 self.scales[1][sb] = scale;
309 self.scales[2][sb] = scale;
316 fn unpack_samples(&mut self, br: &mut BitReader) -> DecoderResult<()> {
320 let set = (grp * 4 + gr) * 3;
321 if self.bitalloc[grp][sb] == 0 {
322 self.samples[set + 0][sb] = 0.0;
323 self.samples[set + 1][sb] = 0.0;
324 self.samples[set + 2][sb] = 0.0;
327 let idx = sb * 4 + (self.bitalloc[grp][sb] as usize);
328 let bits = GROUP_BITS[idx];
329 let sf = SCALEFACTORS[self.scales[grp][sb] as usize];
330 if GROUP_INFO[idx] == 1 {
331 let radix = (1 << bits) - 1;
332 let val0 = br.read(bits)? as usize;
333 let val1 = br.read(bits)? as usize;
334 let val2 = br.read(bits)? as usize;
335 self.samples[set + 0][sb] = Self::dequant(val0, idx, radix) * sf;
336 self.samples[set + 1][sb] = Self::dequant(val1, idx, radix) * sf;
337 self.samples[set + 2][sb] = Self::dequant(val2, idx, radix) * sf;
339 let radix = GROUP_RADIX[idx] as usize;
340 let val = br.read(bits)? as usize;
341 let val0 = val % radix;
342 let val1 = (val / radix) % radix;
343 let val2 = val / radix / radix;
344 self.samples[set + 0][sb] = Self::dequant(val0, idx, radix) * sf;
345 self.samples[set + 1][sb] = Self::dequant(val1, idx, radix) * sf;
346 self.samples[set + 2][sb] = Self::dequant(val2, idx, radix) * sf;
353 fn dequant(val: usize, idx: usize, radix: usize) -> f32 {
354 let qval = match radix {
362 let bias_idx = QUANT_BIAS_MAP[idx] as usize;
363 (qval + QUANT_BIAS[bias_idx]) / QUANT_RANGE[bias_idx]
367 impl NADecoder for LHDecoder {
368 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
369 if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
370 self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), 1, SND_F32P_FORMAT, CODEC_SAMPLES);
371 self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo.clone()));
372 self.chmap = NAChannelMap::from_str("C").unwrap();
375 Err(DecoderError::InvalidData)
378 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
379 let info = pkt.get_stream().get_info();
380 if let NACodecTypeInfo::Audio(_) = info.get_properties() {
381 let pktbuf = pkt.get_buffer();
383 let mut daudio = Vec::with_capacity(CODEC_SAMPLES);
385 let mut br = BitReader::new(pktbuf.as_slice(), BitReaderMode::BE);
386 br.skip(self.bitpos)?;
388 while br.left() >= 8 {
389 self.unpack_bitalloc(&mut br)?;
390 self.unpack_scales(&mut br)?;
391 self.unpack_samples(&mut br)?;
393 let mut samp_buf = [0.0f32; 32];
395 self.qmf.synth(&self.samples[set], &mut samp_buf);
396 daudio.extend_from_slice(&samp_buf);
400 self.bitpos = (br.tell() as u32) & 7;
402 let abuf = alloc_audio_buffer(self.ainfo, daudio.len(), self.chmap.clone())?;
403 let mut adata = abuf.get_abuf_f32().unwrap();
404 let buf = adata.get_data_mut().unwrap();
405 (&mut buf[..daudio.len()]).copy_from_slice(daudio.as_slice());
407 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
408 frm.set_duration(Some(CODEC_SAMPLES as u64));
409 frm.set_keyframe(true);
412 Err(DecoderError::Bug)
415 fn flush(&mut self) {
416 self.qmf = QMF::new();
421 impl NAOptionHandler for LHDecoder {
422 fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
423 fn set_options(&mut self, _options: &[NAOption]) { }
424 fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
427 pub fn get_decoder() -> Box<dyn NADecoder + Send> {
428 Box::new(LHDecoder::new())
431 const BITALLOC_INFO: [u8; 32] = [
432 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1,
433 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
436 const GROUP_BITS: [u8; 128] = [
437 0, 3, 4, 6, 0, 3, 4, 6, 0, 3, 4, 6, 0, 3, 4, 6,
438 0, 3, 4, 6, 0, 3, 4, 6, 0, 5, 7, 4, 0, 5, 7, 4,
439 0, 5, 7, 4, 0, 5, 7, 4, 0, 5, 7, 4, 0, 5, 7, 4,
440 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0,
441 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0,
442 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0,
443 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0,
444 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0
446 const GROUP_INFO: [u8; 128] = [
447 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1,
448 0, 1, 1, 1, 0, 1, 1, 1, 0, 3, 3, 1, 0, 3, 3, 1,
449 0, 3, 3, 1, 0, 3, 3, 1, 0, 3, 3, 1, 0, 3, 3, 1,
450 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0,
451 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0,
452 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0,
453 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0,
454 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0
456 const GROUP_RADIX: [u8; 128] = [
457 0, 7, 15, 63, 0, 7, 15, 63, 0, 7, 15, 63, 0, 7, 15, 63,
458 0, 7, 15, 63, 0, 7, 15, 63, 0, 3, 5, 15, 0, 3, 5, 15,
459 0, 3, 5, 15, 0, 3, 5, 15, 0, 3, 5, 15, 0, 3, 5, 15,
460 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0,
461 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0,
462 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0,
463 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0,
464 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0
467 const QUANT_BIAS_MAP: [u8; 128] = [
468 0, 2, 4, 6, 0, 2, 4, 6, 0, 2, 4, 6, 0, 2, 4, 6,
469 0, 2, 4, 6, 0, 2, 4, 6, 0, 0, 1, 4, 0, 0, 1, 4,
470 0, 0, 1, 4, 0, 0, 1, 4, 0, 0, 1, 4, 0, 0, 1, 4,
471 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
472 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
473 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
474 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
475 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
477 const QUANT_BIAS: [f32; 17] = [
478 0.5, 0.5, 0.25, 0.5, 0.125, 0.0625, 0.03125, 0.015625,
479 0.0078125, 0.00390625, 0.001953125, 0.0009765625, 0.00048828125,
480 0.00024414062, 0.00012207031, 0.000061035164, 0.000030517582
482 const QUANT_RANGE: [f32; 17] = [
483 0.75, 0.625, 0.875, 0.5625, 0.9375, 0.96875, 0.984375,
484 0.9921875, 0.99609375, 0.99804688, 0.99902344, 0.99951172,
485 0.99975586, 0.99987793, 0.99993896, 0.99996948, 0.99998474
487 const SCALEFACTORS: [f32; 64] = [
488 2.0, 1.587401, 1.2599211, 1.0, 0.79370052, 0.62996054,
489 0.5, 0.39685026, 0.31498027, 0.25, 0.19842513, 0.15749013,
490 0.125, 0.099212565, 0.078745067, 0.0625, 0.049606282, 0.039372534,
491 0.03125, 0.024803141, 0.019686267, 0.015625, 0.012401571, 0.0098431334,
492 0.0078125, 0.0062007853, 0.0049215667, 0.00390625, 0.0031003926, 0.0024607833,
493 0.001953125, 0.0015501963, 0.0012303917, 0.0009765625, 0.00077509816, 0.00061519584,
494 0.00048828125, 0.00038754908, 0.00030759792, 0.00024414062, 0.00019377454, 0.00015379896,
495 0.00012207031, 0.00009688727, 0.00007689948, 0.000061035156,
496 0.000048443635, 0.00003844974, 0.000030517578, 0.000024221818,
497 0.00001922487, 0.000015258789, 0.000012110909, 0.000009612435,
498 0.0000076293945, 0.0000060554544, 0.0000048062175, 0.0000038146973,
499 0.0000030277272, 0.0000024031087, 0.0000019073486, 0.0000015138636,
500 0.0000012015544, 9.9999997e-21
503 const QUANTS3: [f32; 4] = [ -1.0, -0.5, 0.0, 0.5 ];
504 const QUANTS5: [f32; 6] = [ -1.0, -0.75, -0.5, -0.25, 0.0, 0.25 ];
505 const QUANTS7: [f32; 8] = [ -1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75 ];
506 const QUANTS15: [f32; 16] = [
507 -1.0, -0.875, -0.75, -0.625, -0.5, -0.375, -0.25, -0.125,
508 0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875 ];
509 const QUANTS63: [f32; 64] = [
510 -1.0, -0.96875, -0.9375, -0.90625, -0.875, -0.84375, -0.8125, -0.78125,
511 -0.75, -0.71875, -0.6875, -0.65625, -0.625, -0.59375, -0.5625, -0.53125,
512 -0.5, -0.46875, -0.4375, -0.40625, -0.375, -0.34375, -0.3125, -0.28125,
513 -0.25, -0.21875, -0.1875, -0.15625, -0.125, -0.09375, -0.0625, -0.03125,
514 0.0, 0.03125, 0.0625, 0.09375, 0.125, 0.15625, 0.1875, 0.21875,
515 0.25, 0.28125, 0.3125, 0.34375, 0.375, 0.40625, 0.4375, 0.46875,
516 0.5, 0.53125, 0.5625, 0.59375, 0.625, 0.65625, 0.6875, 0.71875,
517 0.75, 0.78125, 0.8125, 0.84375, 0.875, 0.90625, 0.9375, 0.96875 ];
519 const QMF_WINDOW: [f32; 512] = [
520 0.000000000, -0.000015259, -0.000015259, -0.000015259,
521 -0.000015259, -0.000015259, -0.000015259, -0.000030518,
522 -0.000030518, -0.000030518, -0.000030518, -0.000045776,
523 -0.000045776, -0.000061035, -0.000061035, -0.000076294,
524 -0.000076294, -0.000091553, -0.000106812, -0.000106812,
525 -0.000122070, -0.000137329, -0.000152588, -0.000167847,
526 -0.000198364, -0.000213623, -0.000244141, -0.000259399,
527 -0.000289917, -0.000320435, -0.000366211, -0.000396729,
528 -0.000442505, -0.000473022, -0.000534058, -0.000579834,
529 -0.000625610, -0.000686646, -0.000747681, -0.000808716,
530 -0.000885010, -0.000961304, -0.001037598, -0.001113892,
531 -0.001205444, -0.001296997, -0.001388550, -0.001480103,
532 -0.001586914, -0.001693726, -0.001785278, -0.001907349,
533 -0.002014160, -0.002120972, -0.002243042, -0.002349854,
534 -0.002456665, -0.002578735, -0.002685547, -0.002792358,
535 -0.002899170, -0.002990723, -0.003082275, -0.003173828,
536 0.003250122, 0.003326416, 0.003387451, 0.003433228,
537 0.003463745, 0.003479004, 0.003479004, 0.003463745,
538 0.003417969, 0.003372192, 0.003280640, 0.003173828,
539 0.003051758, 0.002883911, 0.002700806, 0.002487183,
540 0.002227783, 0.001937866, 0.001617432, 0.001266479,
541 0.000869751, 0.000442505, -0.000030518, -0.000549316,
542 -0.001098633, -0.001693726, -0.002334595, -0.003005981,
543 -0.003723145, -0.004486084, -0.005294800, -0.006118774,
544 -0.007003784, -0.007919312, -0.008865356, -0.009841919,
545 -0.010848999, -0.011886597, -0.012939453, -0.014022827,
546 -0.015121460, -0.016235352, -0.017349243, -0.018463135,
547 -0.019577026, -0.020690918, -0.021789551, -0.022857666,
548 -0.023910522, -0.024932861, -0.025909424, -0.026840210,
549 -0.027725220, -0.028533936, -0.029281616, -0.029937744,
550 -0.030532837, -0.031005859, -0.031387329, -0.031661987,
551 -0.031814575, -0.031845093, -0.031738281, -0.031478882,
552 0.031082153, 0.030517578, 0.029785156, 0.028884888,
553 0.027801514, 0.026535034, 0.025085449, 0.023422241,
554 0.021575928, 0.019531250, 0.017257690, 0.014801025,
555 0.012115479, 0.009231567, 0.006134033, 0.002822876,
556 -0.000686646, -0.004394531, -0.008316040, -0.012420654,
557 -0.016708374, -0.021179199, -0.025817871, -0.030609131,
558 -0.035552979, -0.040634155, -0.045837402, -0.051132202,
559 -0.056533813, -0.061996460, -0.067520142, -0.073059082,
560 -0.078628540, -0.084182739, -0.089706421, -0.095169067,
561 -0.100540161, -0.105819702, -0.110946655, -0.115921021,
562 -0.120697021, -0.125259399, -0.129562378, -0.133590698,
563 -0.137298584, -0.140670776, -0.143676758, -0.146255493,
564 -0.148422241, -0.150115967, -0.151306152, -0.151962280,
565 -0.152069092, -0.151596069, -0.150497437, -0.148773193,
566 -0.146362305, -0.143264771, -0.139450073, -0.134887695,
567 -0.129577637, -0.123474121, -0.116577148, -0.108856201,
568 0.100311279, 0.090927124, 0.080688477, 0.069595337,
569 0.057617187, 0.044784546, 0.031082153, 0.016510010,
570 0.001068115, -0.015228271, -0.032379150, -0.050354004,
571 -0.069168091, -0.088775635, -0.109161377, -0.130310059,
572 -0.152206421, -0.174789429, -0.198059082, -0.221984863,
573 -0.246505737, -0.271591187, -0.297210693, -0.323318481,
574 -0.349868774, -0.376800537, -0.404083252, -0.431655884,
575 -0.459472656, -0.487472534, -0.515609741, -0.543823242,
576 -0.572036743, -0.600219727, -0.628295898, -0.656219482,
577 -0.683914185, -0.711318970, -0.738372803, -0.765029907,
578 -0.791213989, -0.816864014, -0.841949463, -0.866363525,
579 -0.890090942, -0.913055420, -0.935195923, -0.956481934,
580 -0.976852417, -0.996246338, -1.014617920, -1.031936646,
581 -1.048156738, -1.063217163, -1.077117920, -1.089782715,
582 -1.101211548, -1.111373901, -1.120223999, -1.127746582,
583 -1.133926392, -1.138763428, -1.142211914, -1.144287109,
584 1.144989014, 1.144287109, 1.142211914, 1.138763428,
585 1.133926392, 1.127746582, 1.120223999, 1.111373901,
586 1.101211548, 1.089782715, 1.077117920, 1.063217163,
587 1.048156738, 1.031936646, 1.014617920, 0.996246338,
588 0.976852417, 0.956481934, 0.935195923, 0.913055420,
589 0.890090942, 0.866363525, 0.841949463, 0.816864014,
590 0.791213989, 0.765029907, 0.738372803, 0.711318970,
591 0.683914185, 0.656219482, 0.628295898, 0.600219727,
592 0.572036743, 0.543823242, 0.515609741, 0.487472534,
593 0.459472656, 0.431655884, 0.404083252, 0.376800537,
594 0.349868774, 0.323318481, 0.297210693, 0.271591187,
595 0.246505737, 0.221984863, 0.198059082, 0.174789429,
596 0.152206421, 0.130310059, 0.109161377, 0.088775635,
597 0.069168091, 0.050354004, 0.032379150, 0.015228271,
598 -0.001068115, -0.016510010, -0.031082153, -0.044784546,
599 -0.057617187, -0.069595337, -0.080688477, -0.090927124,
600 0.100311279, 0.108856201, 0.116577148, 0.123474121,
601 0.129577637, 0.134887695, 0.139450073, 0.143264771,
602 0.146362305, 0.148773193, 0.150497437, 0.151596069,
603 0.152069092, 0.151962280, 0.151306152, 0.150115967,
604 0.148422241, 0.146255493, 0.143676758, 0.140670776,
605 0.137298584, 0.133590698, 0.129562378, 0.125259399,
606 0.120697021, 0.115921021, 0.110946655, 0.105819702,
607 0.100540161, 0.095169067, 0.089706421, 0.084182739,
608 0.078628540, 0.073059082, 0.067520142, 0.061996460,
609 0.056533813, 0.051132202, 0.045837402, 0.040634155,
610 0.035552979, 0.030609131, 0.025817871, 0.021179199,
611 0.016708374, 0.012420654, 0.008316040, 0.004394531,
612 0.000686646, -0.002822876, -0.006134033, -0.009231567,
613 -0.012115479, -0.014801025, -0.017257690, -0.019531250,
614 -0.021575928, -0.023422241, -0.025085449, -0.026535034,
615 -0.027801514, -0.028884888, -0.029785156, -0.030517578,
616 0.031082153, 0.031478882, 0.031738281, 0.031845093,
617 0.031814575, 0.031661987, 0.031387329, 0.031005859,
618 0.030532837, 0.029937744, 0.029281616, 0.028533936,
619 0.027725220, 0.026840210, 0.025909424, 0.024932861,
620 0.023910522, 0.022857666, 0.021789551, 0.020690918,
621 0.019577026, 0.018463135, 0.017349243, 0.016235352,
622 0.015121460, 0.014022827, 0.012939453, 0.011886597,
623 0.010848999, 0.009841919, 0.008865356, 0.007919312,
624 0.007003784, 0.006118774, 0.005294800, 0.004486084,
625 0.003723145, 0.003005981, 0.002334595, 0.001693726,
626 0.001098633, 0.000549316, 0.000030518, -0.000442505,
627 -0.000869751, -0.001266479, -0.001617432, -0.001937866,
628 -0.002227783, -0.002487183, -0.002700806, -0.002883911,
629 -0.003051758, -0.003173828, -0.003280640, -0.003372192,
630 -0.003417969, -0.003463745, -0.003479004, -0.003479004,
631 -0.003463745, -0.003433228, -0.003387451, -0.003326416,
632 0.003250122, 0.003173828, 0.003082275, 0.002990723,
633 0.002899170, 0.002792358, 0.002685547, 0.002578735,
634 0.002456665, 0.002349854, 0.002243042, 0.002120972,
635 0.002014160, 0.001907349, 0.001785278, 0.001693726,
636 0.001586914, 0.001480103, 0.001388550, 0.001296997,
637 0.001205444, 0.001113892, 0.001037598, 0.000961304,
638 0.000885010, 0.000808716, 0.000747681, 0.000686646,
639 0.000625610, 0.000579834, 0.000534058, 0.000473022,
640 0.000442505, 0.000396729, 0.000366211, 0.000320435,
641 0.000289917, 0.000259399, 0.000244141, 0.000213623,
642 0.000198364, 0.000167847, 0.000152588, 0.000137329,
643 0.000122070, 0.000106812, 0.000106812, 0.000091553,
644 0.000076294, 0.000076294, 0.000061035, 0.000061035,
645 0.000045776, 0.000045776, 0.000030518, 0.000030518,
646 0.000030518, 0.000030518, 0.000015259, 0.000015259,
647 0.000015259, 0.000015259, 0.000015259, 0.000015259,