game: fix or silence clippy warnings
[nihav.git] / nihav-game / src / codecs / lhst500f22.rs
1 use nihav_core::codecs::*;
2 use nihav_core::io::bitreader::*;
3 use std::str::FromStr;
4 use std::sync::Arc;
5
6 const CODEC_SAMPLES: usize = 1152;
7
8 struct QMF {
9 hist: [f32; 1024],
10 pos: usize,
11 }
12
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;
17 };
18 (rev; $a: expr, $b: expr) => {
19 butterfly!(rev; $a, $b, std::f32::consts::FRAC_1_SQRT_2);
20 };
21 (rev; $a: expr, $b: expr, $scale: expr) => {
22 let tmp = $a + $b;
23 $b = ($a - $b) * $scale;
24 $a = tmp;
25 };
26 (scal; $a: expr, $b: expr) => {
27 butterfly!(scal; $a, $b, std::f32::consts::FRAC_1_SQRT_2);
28 };
29 (scal; $a: expr, $b: expr, $scale: expr) => {
30 let tmp = $a + $b;
31 $b = ($b - $a) * $scale;
32 $a = tmp;
33 };
34 }
35
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];
43 }
44 }
45
46 fn dct32(src: &[f32; 32], dst: &mut [f32]) {
47 let mut tmp = [0.0f32; 32];
48
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]);
129
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);
134
135 dst[ 0] = tmp[0];
136 dst[16] = tmp[1];
137 dst[ 8] = tmp[2];
138 dst[24] = tmp[3];
139 dst[ 4] = tmp[4];
140 dst[20] = tmp[5];
141 dst[12] = tmp[6];
142 dst[28] = tmp[7];
143
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];
148
149 dst[ 6] = tmp[12] + tmp[10];
150 dst[22] = tmp[13] + tmp[11];
151
152 dst[14] = tmp[14] + tmp[ 9];
153
154 dst[30] = tmp[15];
155
156 tmp[24] += tmp[28];
157 tmp[28] += tmp[26];
158 tmp[26] += tmp[30];
159 tmp[30] += tmp[25];
160 tmp[25] += tmp[29];
161 tmp[29] += tmp[27];
162 tmp[27] += tmp[31];
163
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];
172
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];
177
178 dst[ 7] = tmp[28] + tmp[18];
179 dst[23] = tmp[29] + tmp[19];
180
181 dst[15] = tmp[30] + tmp[17];
182
183 dst[31] = tmp[31];
184 }
185
186 impl QMF {
187 fn new() -> Self {
188 Self {
189 hist: [0.0; 1024],
190 pos: 0,
191 }
192 }
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]);
196
197 for i in 0..16 {
198 let mut acc = 0.0;
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];
202 }
203 dst[i] = acc;
204 }
205 let mut acc = 0.0;
206 for j in (0..512).step_by(64) {
207 acc -= QMF_WINDOW[j + 32 + 16] * self.hist[(j + 32 + self.pos) & 0x1FF];
208 }
209 dst[16] = acc;
210 for i in 17..32 {
211 let mut acc = 0.0;
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];
215 }
216 dst[i] = acc;
217 }
218 }
219 }
220
221 struct LHDecoder {
222 ainfo: NAAudioInfo,
223 info: Arc<NACodecInfo>,
224 chmap: NAChannelMap,
225
226 bitalloc: [[u8; 32]; 3],
227 scf_select: [u8; 32],
228 scales: [[u8; 32]; 3],
229 samples: [[f32; 32]; 36],
230
231 bitpos: u32,
232
233 qmf: QMF,
234 }
235
236 impl LHDecoder {
237 fn new() -> Self {
238 Self {
239 ainfo: NAAudioInfo::new(22050, 1, SND_F32P_FORMAT, CODEC_SAMPLES),
240 info: NACodecInfo::new_dummy(),
241 chmap: NAChannelMap::new(),
242
243 bitalloc: [[0; 32]; 3],
244 scf_select: [0; 32],
245 scales: [[0; 32]; 3],
246 samples: [[0.0; 32]; 36],
247
248 bitpos: 0,
249
250 qmf: QMF::new(),
251 }
252 }
253 fn unpack_bitalloc(&mut self, br: &mut BitReader) -> DecoderResult<()> {
254 for i in 0..3 {
255 for sb in 0..32 {
256 self.bitalloc[i][sb] = br.read(BITALLOC_INFO[sb])? as u8;
257 }
258 }
259 Ok(())
260 }
261 fn unpack_scales(&mut self, br: &mut BitReader) -> DecoderResult<()> {
262 for sb in 0..32 {
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;
265 } else {
266 self.scf_select[sb] = 0;
267 }
268 }
269
270 self.scales = [[0; 32]; 3];
271 for sb in 0..32 {
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 {
276 continue;
277 }
278 match self.scf_select[sb] {
279 0 => {
280 for j in 0..3 {
281 if self.bitalloc[j][sb] != 0 {
282 self.scales[j][sb] = br.read(6)? as u8;
283 }
284 }
285 },
286 1 => {
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;
291 }
292 if ba2 != 0 {
293 self.scales[2][sb] = br.read(6)? as u8;
294 }
295 },
296 2 => {
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;
301 },
302 _ => {
303 if ba0 != 0 {
304 self.scales[0][sb] = br.read(6)? as u8;
305 }
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;
310 }
311 },
312 };
313 }
314 Ok(())
315 }
316 #[allow(clippy::identity_op)]
317 fn unpack_samples(&mut self, br: &mut BitReader) -> DecoderResult<()> {
318 for grp in 0..3 {
319 for gr in 0..4 {
320 for sb in 0..32 {
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;
326 continue;
327 }
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;
339 } else {
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;
348 }
349 }
350 }
351 }
352 Ok(())
353 }
354 fn dequant(val: usize, idx: usize, radix: usize) -> f32 {
355 let qval = match radix {
356 3 => QUANTS3[val],
357 5 => QUANTS5[val],
358 7 => QUANTS7[val],
359 15 => QUANTS15[val],
360 63 => QUANTS63[val],
361 _ => unreachable!(),
362 };
363 let bias_idx = QUANT_BIAS_MAP[idx] as usize;
364 (qval + QUANT_BIAS[bias_idx]) / QUANT_RANGE[bias_idx]
365 }
366 }
367
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();
374 Ok(())
375 } else {
376 Err(DecoderError::InvalidData)
377 }
378 }
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();
383
384 let mut daudio = Vec::with_capacity(CODEC_SAMPLES);
385
386 let mut br = BitReader::new(pktbuf.as_slice(), BitReaderMode::BE);
387 br.skip(self.bitpos)?;
388
389 while br.left() >= 8 {
390 self.unpack_bitalloc(&mut br)?;
391 self.unpack_scales(&mut br)?;
392 self.unpack_samples(&mut br)?;
393
394 let mut samp_buf = [0.0f32; 32];
395 for set in 0..36 {
396 self.qmf.synth(&self.samples[set], &mut samp_buf);
397 daudio.extend_from_slice(&samp_buf);
398 }
399 }
400
401 self.bitpos = (br.tell() as u32) & 7;
402
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());
407
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);
411 Ok(frm.into_ref())
412 } else {
413 Err(DecoderError::Bug)
414 }
415 }
416 fn flush(&mut self) {
417 self.qmf = QMF::new();
418 self.bitpos = 0;
419 }
420 }
421
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 }
426 }
427
428 pub fn get_decoder() -> Box<dyn NADecoder + Send> {
429 Box::new(LHDecoder::new())
430 }
431
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
435 ];
436
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
446 ];
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
456 ];
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
466 ];
467
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
477 ];
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
482 ];
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
487 ];
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
502 ];
503
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 ];
519
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,
649 ];