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 #[allow(clippy::identity_op)]
317 fn unpack_samples(&mut self, br: &mut BitReader) -> DecoderResult<()> {
321 let set = (grp * 4 + gr) * 3;
322 if self.bitalloc[grp][sb] == 0 {
323 self.samples[set + 0][sb] = 0.0;
324 self.samples[set + 1][sb] = 0.0;
325 self.samples[set + 2][sb] = 0.0;
328 let idx = sb * 4 + (self.bitalloc[grp][sb] as usize);
329 let bits = GROUP_BITS[idx];
330 let sf = SCALEFACTORS[self.scales[grp][sb] as usize];
331 if GROUP_INFO[idx] == 1 {
332 let radix = (1 << bits) - 1;
333 let val0 = br.read(bits)? as usize;
334 let val1 = br.read(bits)? as usize;
335 let val2 = br.read(bits)? as usize;
336 self.samples[set + 0][sb] = Self::dequant(val0, idx, radix) * sf;
337 self.samples[set + 1][sb] = Self::dequant(val1, idx, radix) * sf;
338 self.samples[set + 2][sb] = Self::dequant(val2, idx, radix) * sf;
340 let radix = GROUP_RADIX[idx] as usize;
341 let val = br.read(bits)? as usize;
342 let val0 = val % radix;
343 let val1 = (val / radix) % radix;
344 let val2 = val / radix / radix;
345 self.samples[set + 0][sb] = Self::dequant(val0, idx, radix) * sf;
346 self.samples[set + 1][sb] = Self::dequant(val1, idx, radix) * sf;
347 self.samples[set + 2][sb] = Self::dequant(val2, idx, radix) * sf;
354 fn dequant(val: usize, idx: usize, radix: usize) -> f32 {
355 let qval = match radix {
363 let bias_idx = QUANT_BIAS_MAP[idx] as usize;
364 (qval + QUANT_BIAS[bias_idx]) / QUANT_RANGE[bias_idx]
368 impl NADecoder for LHDecoder {
369 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
370 if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() {
371 self.ainfo = NAAudioInfo::new(ainfo.get_sample_rate(), 1, SND_F32P_FORMAT, CODEC_SAMPLES);
372 self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo));
373 self.chmap = NAChannelMap::from_str("C").unwrap();
376 Err(DecoderError::InvalidData)
379 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
380 let info = pkt.get_stream().get_info();
381 if let NACodecTypeInfo::Audio(_) = info.get_properties() {
382 let pktbuf = pkt.get_buffer();
384 let mut daudio = Vec::with_capacity(CODEC_SAMPLES);
386 let mut br = BitReader::new(pktbuf.as_slice(), BitReaderMode::BE);
387 br.skip(self.bitpos)?;
389 while br.left() >= 8 {
390 self.unpack_bitalloc(&mut br)?;
391 self.unpack_scales(&mut br)?;
392 self.unpack_samples(&mut br)?;
394 let mut samp_buf = [0.0f32; 32];
396 self.qmf.synth(&self.samples[set], &mut samp_buf);
397 daudio.extend_from_slice(&samp_buf);
401 self.bitpos = (br.tell() as u32) & 7;
403 let abuf = alloc_audio_buffer(self.ainfo, daudio.len(), self.chmap.clone())?;
404 let mut adata = abuf.get_abuf_f32().unwrap();
405 let buf = adata.get_data_mut().unwrap();
406 (&mut buf[..daudio.len()]).copy_from_slice(daudio.as_slice());
408 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
409 frm.set_duration(Some(CODEC_SAMPLES as u64));
410 frm.set_keyframe(true);
413 Err(DecoderError::Bug)
416 fn flush(&mut self) {
417 self.qmf = QMF::new();
422 impl NAOptionHandler for LHDecoder {
423 fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
424 fn set_options(&mut self, _options: &[NAOption]) { }
425 fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
428 pub fn get_decoder() -> Box<dyn NADecoder + Send> {
429 Box::new(LHDecoder::new())
432 const BITALLOC_INFO: [u8; 32] = [
433 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1,
434 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
437 const GROUP_BITS: [u8; 128] = [
438 0, 3, 4, 6, 0, 3, 4, 6, 0, 3, 4, 6, 0, 3, 4, 6,
439 0, 3, 4, 6, 0, 3, 4, 6, 0, 5, 7, 4, 0, 5, 7, 4,
440 0, 5, 7, 4, 0, 5, 7, 4, 0, 5, 7, 4, 0, 5, 7, 4,
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,
445 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0
447 const GROUP_INFO: [u8; 128] = [
448 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1,
449 0, 1, 1, 1, 0, 1, 1, 1, 0, 3, 3, 1, 0, 3, 3, 1,
450 0, 3, 3, 1, 0, 3, 3, 1, 0, 3, 3, 1, 0, 3, 3, 1,
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,
455 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0
457 const GROUP_RADIX: [u8; 128] = [
458 0, 7, 15, 63, 0, 7, 15, 63, 0, 7, 15, 63, 0, 7, 15, 63,
459 0, 7, 15, 63, 0, 7, 15, 63, 0, 3, 5, 15, 0, 3, 5, 15,
460 0, 3, 5, 15, 0, 3, 5, 15, 0, 3, 5, 15, 0, 3, 5, 15,
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,
465 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0
468 const QUANT_BIAS_MAP: [u8; 128] = [
469 0, 2, 4, 6, 0, 2, 4, 6, 0, 2, 4, 6, 0, 2, 4, 6,
470 0, 2, 4, 6, 0, 2, 4, 6, 0, 0, 1, 4, 0, 0, 1, 4,
471 0, 0, 1, 4, 0, 0, 1, 4, 0, 0, 1, 4, 0, 0, 1, 4,
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,
476 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
478 const QUANT_BIAS: [f32; 17] = [
479 0.5, 0.5, 0.25, 0.5, 0.125, 0.0625, 0.03125, 0.015625,
480 0.0078125, 0.00390625, 0.001953125, 0.0009765625, 0.00048828125,
481 0.00024414062, 0.00012207031, 0.000061035164, 0.000030517582
483 const QUANT_RANGE: [f32; 17] = [
484 0.75, 0.625, 0.875, 0.5625, 0.9375, 0.96875, 0.984375,
485 0.9921875, 0.99609375, 0.99804688, 0.99902344, 0.99951172,
486 0.99975586, 0.99987793, 0.99993896, 0.99996948, 0.99998474
488 const SCALEFACTORS: [f32; 64] = [
489 2.0, 1.587401, 1.2599211, 1.0, 0.79370052, 0.62996054,
490 0.5, 0.39685026, 0.31498027, 0.25, 0.19842513, 0.15749013,
491 0.125, 0.099212565, 0.078745067, 0.0625, 0.049606282, 0.039372534,
492 0.03125, 0.024803141, 0.019686267, 0.015625, 0.012401571, 0.0098431334,
493 0.0078125, 0.0062007853, 0.0049215667, 0.00390625, 0.0031003926, 0.0024607833,
494 0.001953125, 0.0015501963, 0.0012303917, 0.0009765625, 0.00077509816, 0.00061519584,
495 0.00048828125, 0.00038754908, 0.00030759792, 0.00024414062, 0.00019377454, 0.00015379896,
496 0.00012207031, 0.00009688727, 0.00007689948, 0.000061035156,
497 0.000048443635, 0.00003844974, 0.000030517578, 0.000024221818,
498 0.00001922487, 0.000015258789, 0.000012110909, 0.000009612435,
499 0.0000076293945, 0.0000060554544, 0.0000048062175, 0.0000038146973,
500 0.0000030277272, 0.0000024031087, 0.0000019073486, 0.0000015138636,
501 0.0000012015544, 9.9999997e-21
504 const QUANTS3: [f32; 4] = [ -1.0, -0.5, 0.0, 0.5 ];
505 const QUANTS5: [f32; 6] = [ -1.0, -0.75, -0.5, -0.25, 0.0, 0.25 ];
506 const QUANTS7: [f32; 8] = [ -1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75 ];
507 const QUANTS15: [f32; 16] = [
508 -1.0, -0.875, -0.75, -0.625, -0.5, -0.375, -0.25, -0.125,
509 0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875 ];
510 const QUANTS63: [f32; 64] = [
511 -1.0, -0.96875, -0.9375, -0.90625, -0.875, -0.84375, -0.8125, -0.78125,
512 -0.75, -0.71875, -0.6875, -0.65625, -0.625, -0.59375, -0.5625, -0.53125,
513 -0.5, -0.46875, -0.4375, -0.40625, -0.375, -0.34375, -0.3125, -0.28125,
514 -0.25, -0.21875, -0.1875, -0.15625, -0.125, -0.09375, -0.0625, -0.03125,
515 0.0, 0.03125, 0.0625, 0.09375, 0.125, 0.15625, 0.1875, 0.21875,
516 0.25, 0.28125, 0.3125, 0.34375, 0.375, 0.40625, 0.4375, 0.46875,
517 0.5, 0.53125, 0.5625, 0.59375, 0.625, 0.65625, 0.6875, 0.71875,
518 0.75, 0.78125, 0.8125, 0.84375, 0.875, 0.90625, 0.9375, 0.96875 ];
520 const QMF_WINDOW: [f32; 512] = [
521 0.000000000, -0.000015259, -0.000015259, -0.000015259,
522 -0.000015259, -0.000015259, -0.000015259, -0.000030518,
523 -0.000030518, -0.000030518, -0.000030518, -0.000045776,
524 -0.000045776, -0.000061035, -0.000061035, -0.000076294,
525 -0.000076294, -0.000091553, -0.000106812, -0.000106812,
526 -0.000122070, -0.000137329, -0.000152588, -0.000167847,
527 -0.000198364, -0.000213623, -0.000244141, -0.000259399,
528 -0.000289917, -0.000320435, -0.000366211, -0.000396729,
529 -0.000442505, -0.000473022, -0.000534058, -0.000579834,
530 -0.000625610, -0.000686646, -0.000747681, -0.000808716,
531 -0.000885010, -0.000961304, -0.001037598, -0.001113892,
532 -0.001205444, -0.001296997, -0.001388550, -0.001480103,
533 -0.001586914, -0.001693726, -0.001785278, -0.001907349,
534 -0.002014160, -0.002120972, -0.002243042, -0.002349854,
535 -0.002456665, -0.002578735, -0.002685547, -0.002792358,
536 -0.002899170, -0.002990723, -0.003082275, -0.003173828,
537 0.003250122, 0.003326416, 0.003387451, 0.003433228,
538 0.003463745, 0.003479004, 0.003479004, 0.003463745,
539 0.003417969, 0.003372192, 0.003280640, 0.003173828,
540 0.003051758, 0.002883911, 0.002700806, 0.002487183,
541 0.002227783, 0.001937866, 0.001617432, 0.001266479,
542 0.000869751, 0.000442505, -0.000030518, -0.000549316,
543 -0.001098633, -0.001693726, -0.002334595, -0.003005981,
544 -0.003723145, -0.004486084, -0.005294800, -0.006118774,
545 -0.007003784, -0.007919312, -0.008865356, -0.009841919,
546 -0.010848999, -0.011886597, -0.012939453, -0.014022827,
547 -0.015121460, -0.016235352, -0.017349243, -0.018463135,
548 -0.019577026, -0.020690918, -0.021789551, -0.022857666,
549 -0.023910522, -0.024932861, -0.025909424, -0.026840210,
550 -0.027725220, -0.028533936, -0.029281616, -0.029937744,
551 -0.030532837, -0.031005859, -0.031387329, -0.031661987,
552 -0.031814575, -0.031845093, -0.031738281, -0.031478882,
553 0.031082153, 0.030517578, 0.029785156, 0.028884888,
554 0.027801514, 0.026535034, 0.025085449, 0.023422241,
555 0.021575928, 0.019531250, 0.017257690, 0.014801025,
556 0.012115479, 0.009231567, 0.006134033, 0.002822876,
557 -0.000686646, -0.004394531, -0.008316040, -0.012420654,
558 -0.016708374, -0.021179199, -0.025817871, -0.030609131,
559 -0.035552979, -0.040634155, -0.045837402, -0.051132202,
560 -0.056533813, -0.061996460, -0.067520142, -0.073059082,
561 -0.078628540, -0.084182739, -0.089706421, -0.095169067,
562 -0.100540161, -0.105819702, -0.110946655, -0.115921021,
563 -0.120697021, -0.125259399, -0.129562378, -0.133590698,
564 -0.137298584, -0.140670776, -0.143676758, -0.146255493,
565 -0.148422241, -0.150115967, -0.151306152, -0.151962280,
566 -0.152069092, -0.151596069, -0.150497437, -0.148773193,
567 -0.146362305, -0.143264771, -0.139450073, -0.134887695,
568 -0.129577637, -0.123474121, -0.116577148, -0.108856201,
569 0.100311279, 0.090927124, 0.080688477, 0.069595337,
570 0.057617187, 0.044784546, 0.031082153, 0.016510010,
571 0.001068115, -0.015228271, -0.032379150, -0.050354004,
572 -0.069168091, -0.088775635, -0.109161377, -0.130310059,
573 -0.152206421, -0.174789429, -0.198059082, -0.221984863,
574 -0.246505737, -0.271591187, -0.297210693, -0.323318481,
575 -0.349868774, -0.376800537, -0.404083252, -0.431655884,
576 -0.459472656, -0.487472534, -0.515609741, -0.543823242,
577 -0.572036743, -0.600219727, -0.628295898, -0.656219482,
578 -0.683914185, -0.711318970, -0.738372803, -0.765029907,
579 -0.791213989, -0.816864014, -0.841949463, -0.866363525,
580 -0.890090942, -0.913055420, -0.935195923, -0.956481934,
581 -0.976852417, -0.996246338, -1.014617920, -1.031936646,
582 -1.048156738, -1.063217163, -1.077117920, -1.089782715,
583 -1.101211548, -1.111373901, -1.120223999, -1.127746582,
584 -1.133926392, -1.138763428, -1.142211914, -1.144287109,
585 1.144989014, 1.144287109, 1.142211914, 1.138763428,
586 1.133926392, 1.127746582, 1.120223999, 1.111373901,
587 1.101211548, 1.089782715, 1.077117920, 1.063217163,
588 1.048156738, 1.031936646, 1.014617920, 0.996246338,
589 0.976852417, 0.956481934, 0.935195923, 0.913055420,
590 0.890090942, 0.866363525, 0.841949463, 0.816864014,
591 0.791213989, 0.765029907, 0.738372803, 0.711318970,
592 0.683914185, 0.656219482, 0.628295898, 0.600219727,
593 0.572036743, 0.543823242, 0.515609741, 0.487472534,
594 0.459472656, 0.431655884, 0.404083252, 0.376800537,
595 0.349868774, 0.323318481, 0.297210693, 0.271591187,
596 0.246505737, 0.221984863, 0.198059082, 0.174789429,
597 0.152206421, 0.130310059, 0.109161377, 0.088775635,
598 0.069168091, 0.050354004, 0.032379150, 0.015228271,
599 -0.001068115, -0.016510010, -0.031082153, -0.044784546,
600 -0.057617187, -0.069595337, -0.080688477, -0.090927124,
601 0.100311279, 0.108856201, 0.116577148, 0.123474121,
602 0.129577637, 0.134887695, 0.139450073, 0.143264771,
603 0.146362305, 0.148773193, 0.150497437, 0.151596069,
604 0.152069092, 0.151962280, 0.151306152, 0.150115967,
605 0.148422241, 0.146255493, 0.143676758, 0.140670776,
606 0.137298584, 0.133590698, 0.129562378, 0.125259399,
607 0.120697021, 0.115921021, 0.110946655, 0.105819702,
608 0.100540161, 0.095169067, 0.089706421, 0.084182739,
609 0.078628540, 0.073059082, 0.067520142, 0.061996460,
610 0.056533813, 0.051132202, 0.045837402, 0.040634155,
611 0.035552979, 0.030609131, 0.025817871, 0.021179199,
612 0.016708374, 0.012420654, 0.008316040, 0.004394531,
613 0.000686646, -0.002822876, -0.006134033, -0.009231567,
614 -0.012115479, -0.014801025, -0.017257690, -0.019531250,
615 -0.021575928, -0.023422241, -0.025085449, -0.026535034,
616 -0.027801514, -0.028884888, -0.029785156, -0.030517578,
617 0.031082153, 0.031478882, 0.031738281, 0.031845093,
618 0.031814575, 0.031661987, 0.031387329, 0.031005859,
619 0.030532837, 0.029937744, 0.029281616, 0.028533936,
620 0.027725220, 0.026840210, 0.025909424, 0.024932861,
621 0.023910522, 0.022857666, 0.021789551, 0.020690918,
622 0.019577026, 0.018463135, 0.017349243, 0.016235352,
623 0.015121460, 0.014022827, 0.012939453, 0.011886597,
624 0.010848999, 0.009841919, 0.008865356, 0.007919312,
625 0.007003784, 0.006118774, 0.005294800, 0.004486084,
626 0.003723145, 0.003005981, 0.002334595, 0.001693726,
627 0.001098633, 0.000549316, 0.000030518, -0.000442505,
628 -0.000869751, -0.001266479, -0.001617432, -0.001937866,
629 -0.002227783, -0.002487183, -0.002700806, -0.002883911,
630 -0.003051758, -0.003173828, -0.003280640, -0.003372192,
631 -0.003417969, -0.003463745, -0.003479004, -0.003479004,
632 -0.003463745, -0.003433228, -0.003387451, -0.003326416,
633 0.003250122, 0.003173828, 0.003082275, 0.002990723,
634 0.002899170, 0.002792358, 0.002685547, 0.002578735,
635 0.002456665, 0.002349854, 0.002243042, 0.002120972,
636 0.002014160, 0.001907349, 0.001785278, 0.001693726,
637 0.001586914, 0.001480103, 0.001388550, 0.001296997,
638 0.001205444, 0.001113892, 0.001037598, 0.000961304,
639 0.000885010, 0.000808716, 0.000747681, 0.000686646,
640 0.000625610, 0.000579834, 0.000534058, 0.000473022,
641 0.000442505, 0.000396729, 0.000366211, 0.000320435,
642 0.000289917, 0.000259399, 0.000244141, 0.000213623,
643 0.000198364, 0.000167847, 0.000152588, 0.000137329,
644 0.000122070, 0.000106812, 0.000106812, 0.000091553,
645 0.000076294, 0.000076294, 0.000061035, 0.000061035,
646 0.000045776, 0.000045776, 0.000030518, 0.000030518,
647 0.000030518, 0.000030518, 0.000015259, 0.000015259,
648 0.000015259, 0.000015259, 0.000015259, 0.000015259,