introduce option handling for decoders
[nihav.git] / nihav-game / src / codecs / lhst500f22.rs
CommitLineData
3e52414f
KS
1use nihav_core::codecs::*;
2use nihav_core::io::bitreader::*;
3use std::str::FromStr;
4use std::sync::Arc;
5
6const CODEC_SAMPLES: usize = 1152;
7
8struct QMF {
9 hist: [f32; 1024],
10 pos: usize,
11}
12
13macro_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
36macro_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
46fn 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
186impl 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
221struct 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
236impl 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 fn unpack_samples(&mut self, br: &mut BitReader) -> DecoderResult<()> {
317 for grp in 0..3 {
318 for gr in 0..4 {
319 for sb in 0..32 {
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;
325 continue;
326 }
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;
338 } else {
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;
347 }
348 }
349 }
350 }
351 Ok(())
352 }
353 fn dequant(val: usize, idx: usize, radix: usize) -> f32 {
354 let qval = match radix {
355 3 => QUANTS3[val],
356 5 => QUANTS5[val],
357 7 => QUANTS7[val],
358 15 => QUANTS15[val],
359 63 => QUANTS63[val],
360 _ => unreachable!(),
361 };
362 let bias_idx = QUANT_BIAS_MAP[idx] as usize;
363 (qval + QUANT_BIAS[bias_idx]) / QUANT_RANGE[bias_idx]
364 }
365}
366
367impl 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();
373 Ok(())
374 } else {
375 Err(DecoderError::InvalidData)
376 }
377 }
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();
382
383 let mut daudio = Vec::with_capacity(CODEC_SAMPLES);
384
385 let mut br = BitReader::new(pktbuf.as_slice(), BitReaderMode::BE);
386 br.skip(self.bitpos)?;
387
388 while br.left() >= 8 {
389 self.unpack_bitalloc(&mut br)?;
390 self.unpack_scales(&mut br)?;
391 self.unpack_samples(&mut br)?;
392
393 let mut samp_buf = [0.0f32; 32];
394 for set in 0..36 {
395 self.qmf.synth(&self.samples[set], &mut samp_buf);
396 daudio.extend_from_slice(&samp_buf);
397 }
398 }
399
400 self.bitpos = (br.tell() as u32) & 7;
401
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());
406
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);
410 Ok(frm.into_ref())
411 } else {
412 Err(DecoderError::Bug)
413 }
414 }
415 fn flush(&mut self) {
416 self.qmf = QMF::new();
417 self.bitpos = 0;
418 }
419}
420
7d57ae2f
KS
421impl 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 }
425}
426
3e52414f
KS
427pub fn get_decoder() -> Box<dyn NADecoder + Send> {
428 Box::new(LHDecoder::new())
429}
430
431const 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
434];
435
436const 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
445];
446const 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
455];
456const 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
465];
466
467const 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
476];
477const 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
481];
482const 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
486];
487const 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
501];
502
503const QUANTS3: [f32; 4] = [ -1.0, -0.5, 0.0, 0.5 ];
504const QUANTS5: [f32; 6] = [ -1.0, -0.75, -0.5, -0.25, 0.0, 0.25 ];
505const QUANTS7: [f32; 8] = [ -1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75 ];
506const 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 ];
509const 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 ];
518
519const 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,
648];