]> git.nihav.org Git - nihav.git/blame - nihav-vivo/src/codecs/siren.rs
avimux: do not record palette change chunks in OpenDML index
[nihav.git] / nihav-vivo / src / codecs / siren.rs
CommitLineData
31cf33ac
KS
1use nihav_core::formats::SND_F32P_FORMAT;
2use nihav_core::frame::*;
3use nihav_core::codecs::*;
4use nihav_core::io::bitreader::*;
5use nihav_core::io::codebook::*;
6use nihav_codec_support::dsp::mdct::IMDCT;
7use nihav_codec_support::dsp::window::{generate_window, WindowType};
8use std::str::FromStr;
9
10const SAMPLES: usize = 320;
11const NUM_REGIONS: usize = 14;
12const REGION_SIZE: usize = 20;
13const NUM_DIFF_CB: usize = NUM_REGIONS - 1;
14
15struct PRNG {
16 dw: [u16; 4],
17}
18
19impl PRNG {
20 fn new() -> Self { Self{ dw: [1; 4] } }
21 fn get_dw(&mut self) -> u16 {
22 let mut ret = self.dw[0].wrapping_add(self.dw[3]);
23 if (ret & 0x8000) != 0 {
24 ret = ret.wrapping_add(1);
25 }
26
27 self.dw[0] = self.dw[1];
28 self.dw[1] = self.dw[2];
29 self.dw[2] = self.dw[3];
30 self.dw[3] = ret;
31
32 ret
33 }
34}
35
36struct SirenDecoder {
37 chmap: NAChannelMap,
38 ainfo: NAAudioInfo,
39 info: NACodecInfoRef,
40 diff_cb: Vec<Codebook<i8>>,
41 vec_cb: [Codebook<u16>; 7],
42 imdct: IMDCT,
43
44 coeffs: [f32; SAMPLES],
45 delay: [f32; SAMPLES],
46 synth_buf: [f32; SAMPLES * 2],
47 last_good_frame: [f32; SAMPLES],
48 window: [f32; SAMPLES],
49 quant_tab: [f32; 64],
50
51 pow_index: [i32; NUM_REGIONS],
52 region_quant: [f32; NUM_REGIONS],
53 power_cat: [usize; NUM_REGIONS],
54 cat_balance: [usize; 16],
55
56 rng: PRNG,
57}
58
59fn map_idx_diff(idx: usize) -> i8 { (idx as i8) - 12 }
31cf33ac
KS
60impl SirenDecoder {
61 fn new() -> Self {
62 let mut diff_cb = Vec::with_capacity(NUM_DIFF_CB);
63 for i in 0..NUM_DIFF_CB {
64 let mut cr = TableCodebookDescReader::new(&DIFF_CODE_BITS[i], &DIFF_CODE_LENS[i], map_idx_diff);
65 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
66 diff_cb.push(cb);
67 }
635e4170 68 let mut cr = TableCodebookDescReader::new(&VEC_CB0_BITS, &VEC_CB0_LENS, |idx| VEC_CB0_SYMS[idx]);
31cf33ac 69 let vec_cb0 = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
635e4170 70 let mut cr = TableCodebookDescReader::new(&VEC_CB1_BITS, &VEC_CB1_LENS, |idx| VEC_CB1_SYMS[idx]);
31cf33ac 71 let vec_cb1 = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
635e4170 72 let mut cr = TableCodebookDescReader::new(&VEC_CB2_BITS, &VEC_CB2_LENS, |idx| VEC_CB2_SYMS[idx]);
31cf33ac 73 let vec_cb2 = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
635e4170 74 let mut cr = TableCodebookDescReader::new(&VEC_CB3_BITS, &VEC_CB3_LENS, |idx| VEC_CB3_SYMS[idx]);
31cf33ac 75 let vec_cb3 = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
635e4170 76 let mut cr = TableCodebookDescReader::new(&VEC_CB4_BITS, &VEC_CB4_LENS, |idx| VEC_CB4_SYMS[idx]);
31cf33ac 77 let vec_cb4 = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
635e4170 78 let mut cr = TableCodebookDescReader::new(&VEC_CB5_BITS, &VEC_CB5_LENS, |idx| VEC_CB5_SYMS[idx]);
31cf33ac 79 let vec_cb5 = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
635e4170 80 let mut cr = TableCodebookDescReader::new(&VEC_CB6_BITS, &VEC_CB6_LENS, |idx| VEC_CB6_SYMS[idx]);
31cf33ac
KS
81 let vec_cb6 = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
82 let vec_cb = [vec_cb0, vec_cb1, vec_cb2, vec_cb3, vec_cb4, vec_cb5, vec_cb6];
83
84 let mut window = [0.0f32; SAMPLES];
e4be7a34 85 generate_window(WindowType::Sine, 1.0 / 320.0 / 64.0, SAMPLES, true, &mut window);
31cf33ac
KS
86
87 let mut quant_tab = [0.0; 64];
8dc6faae
KS
88 for (i, quant) in quant_tab.iter_mut().enumerate() {
89 *quant = 2.0f32.powf((((i as i32) - 24) as f32) / 2.0);
31cf33ac
KS
90 }
91
92 SirenDecoder {
93 chmap: NAChannelMap::from_str("C").unwrap(),
94 ainfo: NAAudioInfo::new(16000, 1, SND_F32P_FORMAT, SAMPLES),
95 info: NACodecInfo::new_dummy(),
96 diff_cb, vec_cb,
97
98 coeffs: [0.0; SAMPLES],
99 delay: [0.0; SAMPLES],
100 synth_buf: [0.0; SAMPLES * 2],
101 last_good_frame: [0.0; SAMPLES],
102 imdct: IMDCT::new(SAMPLES * 2, false),
103 window, quant_tab,
104
105 pow_index: [0; NUM_REGIONS],
106 region_quant: [0.0; NUM_REGIONS],
107 power_cat: [0; NUM_REGIONS],
108 cat_balance: [0; 16],
109
110 rng: PRNG::new(),
111 }
112 }
113 fn decode_envelope(&mut self, br: &mut BitReader) -> DecoderResult<()> {
114 self.pow_index[0] = (br.read(5)? as i32) - 7;
115
116 for i in 1..NUM_REGIONS {
117 let diff = br.read_cb(&self.diff_cb[i - 1])?;
118 self.pow_index[i] = (self.pow_index[i - 1] + i32::from(diff)).max(-24).min(39);
119 }
120 for i in 0..NUM_REGIONS {
121 self.region_quant[i] = self.quant_tab[(self.pow_index[i] + 24) as usize];
122 }
123
124 Ok(())
125 }
126 fn allocate_bits(&mut self, tot_bits: u32, rate_ctl: usize) -> DecoderResult<()> {
127 const CATEGORY_BITS: [u32; 8] = [ 52, 47, 43, 37, 29, 22, 16, 0 ];
128 const MAX_RC: usize = 15;
129
130 let mut offset = -32;
131 let mut delta = 32;
132 while delta > 0 {
133 let mut bitpool = 0;
134 for reg in 0..NUM_REGIONS {
135 let cat = ((delta + offset - self.pow_index[reg]) >> 1).max(0).min(7) as usize;
136 //self.power_cat[reg] = cat;
137 bitpool += CATEGORY_BITS[cat];
138 }
139 if bitpool >= tot_bits - 32 {
140 offset += delta;
141 }
142 delta >>= 1;
143 }
144
145 let mut bitpool = 0;
146 let mut max_rate_cat = [0; NUM_REGIONS];
147 let mut min_rate_cat = [0; NUM_REGIONS];
148 for reg in 0..NUM_REGIONS {
149 let cat = ((offset - self.pow_index[reg]) >> 1).max(0).min(7) as usize;
150 max_rate_cat[reg] = cat;
151 min_rate_cat[reg] = cat;
152 self.power_cat[reg] = cat;
153 bitpool += CATEGORY_BITS[cat];
154 }
155
156 let mut min_bitpool = bitpool;
157 let mut max_bitpool = bitpool;
158 let mut min_offset = MAX_RC + 1;
159 let mut max_offset = MAX_RC + 1;
160 let mut temp_cat = [0; 64];
161 for _ in 0..MAX_RC {
162 if min_bitpool + max_bitpool > tot_bits * 2 {
163 let mut max_value = -99;
164 let mut min_idx = 0;
165 for reg in (0..NUM_REGIONS).rev() {
166 if min_rate_cat[reg] >= 7 { continue; }
167 let val = offset - self.pow_index[reg] - 2 * (min_rate_cat[reg] as i32);
168 if max_value < val {
169 max_value = val;
170 min_idx = reg;
171 }
172 }
173 validate!(max_value != -99);
174 temp_cat[min_offset] = min_idx;
175 min_offset += 1;
176 min_bitpool = min_bitpool + CATEGORY_BITS[min_rate_cat[min_idx] + 1] - CATEGORY_BITS[min_rate_cat[min_idx]];
177 min_rate_cat[min_idx] += 1;
178 } else {
179 let mut min_value = 99;
180 let mut max_idx = 0;
8dc6faae
KS
181 for (reg, (&max_rate, &pow_index)) in max_rate_cat.iter()
182 .zip(self.pow_index.iter()).enumerate() {
183 if max_rate == 0 { continue; }
184 let val = offset - pow_index - 2 * (max_rate as i32);
31cf33ac
KS
185 if min_value > val {
186 min_value = val;
187 max_idx = reg;
188 }
189 }
190 validate!(min_value != 99);
191 max_offset -= 1;
192 temp_cat[max_offset] = max_idx;
193 max_bitpool = max_bitpool + CATEGORY_BITS[max_rate_cat[max_idx] - 1] - CATEGORY_BITS[max_rate_cat[max_idx]];
194 max_rate_cat[max_idx] -= 1;
195 }
196 }
197
198 self.power_cat = max_rate_cat;
199
494ad253 200 self.cat_balance[..MAX_RC].copy_from_slice(&temp_cat[max_offset..][..MAX_RC]);
31cf33ac
KS
201
202 for cat in self.cat_balance.iter().take(rate_ctl) {
203 self.power_cat[*cat] += 1;
204 }
205 Ok(())
206 }
207 fn decode_coefficients(&mut self, br: &mut BitReader) -> DecoderResult<bool> {
208 const NUM_VECTORS: [u8; 8] = [ 10, 10, 10, 5, 5, 4, 4, 20 ];
209 const VECTOR_SIZE: [u8; 8] = [ 2, 2, 2, 4, 4, 5, 5, 1 ];
210 const INDEX_BITS: [u8; 8] = [ 4, 4, 3, 3, 2, 2, 1, 0 ];
211
212 let mut error = false;
213 self.coeffs = [0.0; SAMPLES];
214 for (reg, coeffs) in self.coeffs.chunks_exact_mut(REGION_SIZE).take(NUM_REGIONS).enumerate() {
215 let mut cat = self.power_cat[reg];
216 if cat < 7 {
217 let cb = &self.vec_cb[cat];
218 let num_vecs = NUM_VECTORS[cat] as usize;
219 let vec_len = VECTOR_SIZE[cat] as usize;
220
221 'vec_loop: for i in 0..num_vecs {
222 let ret = br.read_cb(cb);
494ad253 223 if ret.is_err() {
31cf33ac
KS
224 error = true;
225 break 'vec_loop;
226 }
227 let mut idx = ret.ok().unwrap_or(0) as usize;
228 let mask = (1 << INDEX_BITS[cat]) - 1;
229 for j in 0..vec_len {
230 let coef = QUANT_LEVELS[cat][idx & mask] * self.region_quant[reg];
231 idx >>= INDEX_BITS[cat];
232 if coef != 0.0 {
233 if br.left() == 0 {
234 break 'vec_loop;
235 }
236 coeffs[i * vec_len + j] = if br.read_bool()? { -coef } else { coef };
237 }
238 }
239 }
240 if error {
241 cat = 7;
242 for i in reg..NUM_REGIONS {
243 self.power_cat[i] = 7;
244 }
245 }
246 }
247 let noise_val = match cat {
248 5 => {
249 let mut nz_count = 0;
250 for el in coeffs.iter() {
251 if *el != 0.0 {
252 if *el > 2.0 * self.region_quant[reg] {
253 nz_count += 4;
254 }
255 nz_count += 1;
256 }
257 }
258 if nz_count < REGION_SIZE {
259 self.region_quant[reg] * CAT5_NOISE_FACTOR[nz_count]
260 } else {
261 0.0
262 }
263 },
264 6 => {
265 let mut nz_count = 0;
266 for el in coeffs.iter() {
267 if *el != 0.0 {
268 nz_count += 1;
269 }
270 }
271 self.region_quant[reg] * CAT6_NOISE_FACTOR[nz_count]
272 },
273 7 => {
274 self.region_quant[reg] * 0.70711
275 },
276 _ => 0.0,
277 };
278 if cat >= 5 {
279 let mut dw1 = self.rng.get_dw();
280 let mut dw2 = self.rng.get_dw();
281 for pair in coeffs.chunks_exact_mut(2) {
282 if (cat == 7) || pair[0] == 0.0 {
283 pair[0] = if (dw1 & 1) != 0 { noise_val } else { -noise_val };
284 }
285 if (cat == 7) || pair[1] == 0.0 {
286 pair[1] = if (dw2 & 1) != 0 { noise_val } else { -noise_val };
287 }
288 dw1 >>= 1;
289 dw2 >>= 1;
290 }
291 }
292 }
293 Ok(error)
294 }
295}
296
297impl NADecoder for SirenDecoder {
298 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
299 if let NACodecTypeInfo::Audio(_ainfo) = info.get_properties() {
300 self.info = info.replace_info(NACodecTypeInfo::Audio(self.ainfo));
301 Ok(())
302 } else {
303 Err(DecoderError::InvalidData)
304 }
305 }
306 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
307 let info = pkt.get_stream().get_info();
308 validate!(info.get_properties().is_audio());
309 let src = pkt.get_buffer();
310
311 let mut br = BitReader::new(src.as_slice(), BitReaderMode::BE);
312 self.decode_envelope(&mut br)?;
313 let rate_ctl = br.read(4)? as usize;
314 self.allocate_bits(br.left() as u32, rate_ctl)?;
315 self.decode_coefficients(&mut br)?;
316
317 let mut bad_frame = false;
318 while br.left() > 0 {
319 bad_frame |= !br.read_bool().ok().unwrap_or(true);
320 }
321 for el in self.pow_index.iter() {
322 if *el > 33 {
323 bad_frame = true;
324 }
325 }
326
327 if bad_frame {
328 self.coeffs.copy_from_slice(&self.last_good_frame);
329 self.last_good_frame = [0.0; SAMPLES];
330 } else {
331 self.last_good_frame.copy_from_slice(&self.coeffs);
332 }
333
334 let abuf = alloc_audio_buffer(self.ainfo, SAMPLES, self.chmap.clone())?;
335 let mut adata = abuf.get_abuf_f32().unwrap();
336 let asamples = adata.get_data_mut().unwrap();
337
338 self.imdct.imdct_half(&self.coeffs, &mut self.synth_buf);
339 for i in (0..SAMPLES/2).step_by(2) {
340 let idx0 = i;
341 let idx1 = SAMPLES / 2 - 1 - i;
342 let idx2 = SAMPLES / 2 + i;
343 let idx3 = SAMPLES - 1 - i;
344 // samples are actually in reverse order
345 let c3 = self.synth_buf[idx0];
346 let c2 = self.synth_buf[idx1];
347 let c1 = self.synth_buf[idx2];
348 let c0 = self.synth_buf[idx3];
349
350 let d0 = self.delay[idx0];
351 let d1 = self.delay[idx1];
352
353 let w0 = self.window[idx0];
354 let w1 = self.window[idx1];
355 let w2 = self.window[idx2];
356 let w3 = self.window[idx3];
357
358 asamples[idx3] = c1 * w3 - d0 * w0;
359 asamples[idx2] = c0 * w2 - d1 * w1;
360 asamples[idx1] = d1 * w2 + c0 * w1;
361 asamples[idx0] = d0 * w3 + c1 * w0;
362
363 self.delay[idx0] = c2;
364 self.delay[idx1] = c3;
365 }
366
367 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), abuf);
368 frm.set_keyframe(true);
369 Ok(frm.into_ref())
370 }
371 fn flush(&mut self) {
372 self.delay = [0.0; SAMPLES];
373 self.last_good_frame = [0.0; SAMPLES];
374 }
375}
376
7d57ae2f
KS
377impl NAOptionHandler for SirenDecoder {
378 fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
379 fn set_options(&mut self, _options: &[NAOption]) { }
380 fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
381}
382
31cf33ac
KS
383pub fn get_decoder() -> Box<dyn NADecoder + Send> {
384 Box::new(SirenDecoder::new())
385}
386
387#[cfg(test)]
388mod test {
389 use nihav_core::codecs::RegisteredDecoders;
390 use nihav_core::demuxers::RegisteredDemuxers;
391 use nihav_codec_support::test::dec_video::*;
78fb6560 392 use crate::vivo_register_all_decoders;
31cf33ac
KS
393 use crate::vivo_register_all_demuxers;
394 #[test]
395 fn test_siren() {
396 let mut dmx_reg = RegisteredDemuxers::new();
397 vivo_register_all_demuxers(&mut dmx_reg);
398 let mut dec_reg = RegisteredDecoders::new();
78fb6560 399 vivo_register_all_decoders(&mut dec_reg);
31cf33ac 400
886cde48 401 // sample: https://samples.mplayerhq.hu/vivo/vivo2/favmovie.viv
31cf33ac
KS
402 let file = "assets/Misc/favmovie.viv";
403 //let file = "assets/Misc/gr_al.viv";
404 test_decode_audio("vivo", file, None, None/*Some("siren")*/, &dmx_reg, &dec_reg);
405 }
406}
407
408const DIFF_CODE_BITS: [[u16; 24]; NUM_DIFF_CB] = [
409 [
410 0x0008, 0x0026, 0x0012, 0x000A, 0x0007, 0x0006, 0x0003, 0x0002,
411 0x0000, 0x0001, 0x0007, 0x0006, 0x0005, 0x0004, 0x000B, 0x004E,
412 0x009E, 0x013E, 0x04FE, 0x04FF, 0x09F8, 0x09F9, 0x09FA, 0x09FB
413 ], [
414 0x0024, 0x0008, 0x0003, 0x0005, 0x0000, 0x0001, 0x0007, 0x0006,
415 0x0004, 0x0003, 0x0002, 0x0005, 0x0003, 0x0004, 0x0005, 0x0013,
416 0x004A, 0x0096, 0x012E, 0x04BD, 0x04BE, 0x04BF, 0x0978, 0x0979
417 ], [
418 0x0A16, 0x0284, 0x00A0, 0x0029, 0x0005, 0x000B, 0x0007, 0x0005,
419 0x0004, 0x0001, 0x0000, 0x0006, 0x0004, 0x0007, 0x0003, 0x0006,
420 0x0004, 0x0015, 0x0051, 0x0143, 0x050A, 0x142F, 0x285C, 0x285D
421 ], [
422 0x0B7C, 0x016E, 0x00B5, 0x00B4, 0x002F, 0x002E, 0x001B, 0x000A,
423 0x0008, 0x0005, 0x0001, 0x0000, 0x0003, 0x0007, 0x0004, 0x0009,
424 0x000C, 0x001A, 0x002C, 0x00B6, 0x02DE, 0x0B7D, 0x0B7E, 0x0B7F
425 ], [
426 0x0F8E, 0x1F1F, 0x03E2, 0x00F9, 0x003F, 0x001A, 0x0013, 0x0012,
427 0x000E, 0x0008, 0x0006, 0x0001, 0x0000, 0x0002, 0x0005, 0x0007,
428 0x000C, 0x001E, 0x001B, 0x007D, 0x01F0, 0x07C6, 0x3E3C, 0x3E3D
429 ], [
430 0x0CB6, 0x065A, 0x0197, 0x00CE, 0x00CA, 0x0064, 0x001E, 0x000E,
431 0x0003, 0x0005, 0x0003, 0x0000, 0x0002, 0x0004, 0x0002, 0x000D,
432 0x0018, 0x001F, 0x0066, 0x00CF, 0x032C, 0x196F, 0x32DC, 0x32DD
433 ], [
434 0x0456, 0x08A8, 0x0457, 0x008B, 0x0023, 0x0009, 0x0003, 0x0014,
435 0x000B, 0x0004, 0x0002, 0x0001, 0x0003, 0x0003, 0x0001, 0x0000,
436 0x0015, 0x0005, 0x0010, 0x0044, 0x0114, 0x08A9, 0x08AA, 0x08AB
437 ], [
438 0x03F5, 0x03F6, 0x007F, 0x003E, 0x001D, 0x0006, 0x0004, 0x0010,
439 0x0000, 0x0001, 0x0003, 0x0002, 0x0003, 0x0001, 0x0005, 0x0009,
440 0x0011, 0x0005, 0x001C, 0x001E, 0x00FC, 0x03F7, 0x07E8, 0x07E9
441 ], [
442 0x017D, 0x017C, 0x0174, 0x00BF, 0x005E, 0x002C, 0x0010, 0x000A,
443 0x0007, 0x0003, 0x0001, 0x0000, 0x0002, 0x0006, 0x0009, 0x0011,
444 0x002D, 0x005C, 0x00BB, 0x02EA, 0x05D6, 0x0BAF, 0x175C, 0x175D
445 ], [
446 0x0BDC, 0x02F6, 0x00BC, 0x002D, 0x002B, 0x000A, 0x0004, 0x0003,
447 0x0006, 0x0004, 0x0002, 0x0000, 0x0003, 0x0007, 0x000B, 0x0014,
448 0x002A, 0x002C, 0x002E, 0x005F, 0x017A, 0x0BDD, 0x0BDE, 0x0BDF
449 ], [
450 0x02EF, 0x005C, 0x002D, 0x0014, 0x001A, 0x0004, 0x000C, 0x0007,
451 0x0004, 0x0000, 0x0004, 0x0001, 0x0003, 0x0005, 0x0005, 0x0003,
452 0x001B, 0x0015, 0x002C, 0x002F, 0x00BA, 0x0176, 0x05DC, 0x05DD
453 ], [
454 0xB204, 0x1641, 0x0B21, 0x0591, 0x0165, 0x002D, 0x0017, 0x0006,
455 0x000A, 0x0007, 0x0002, 0x0002, 0x0003, 0x0000, 0x0004, 0x0006,
456 0x0007, 0x0058, 0x00B3, 0x02C9, 0x2C80, 0xB205, 0xB206, 0xB207
457 ], [
458 0x09CF, 0x1398, 0x139A, 0x1399, 0x0138, 0x004F, 0x0026, 0x0024,
459 0x001E, 0x000E, 0x0006, 0x0000, 0x0002, 0x0001, 0x0003, 0x0005,
460 0x0008, 0x001F, 0x0025, 0x009D, 0x0272, 0x139B, 0x139C, 0x139D
461 ]
462];
463const DIFF_CODE_LENS: [[u8; 24]; 13/*27*/] = [
464 [ 4, 6, 5, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 5, 7, 8, 9, 11, 11, 12, 12, 12, 12 ],
465 [ 10, 8, 6, 5, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 7, 9, 11, 12, 13, 15, 15, 15, 16, 16 ],
466 [ 12, 10, 8, 6, 5, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4, 5, 5, 7, 9, 11, 13, 14, 14 ],
467 [ 13, 10, 9, 9, 7, 7, 5, 5, 4, 3, 3, 3, 3, 3, 4, 4, 4, 5, 7, 9, 11, 13, 13, 13 ],
468 [ 12, 13, 10, 8, 6, 6, 5, 5, 4, 4, 3, 3, 3, 3, 3, 4, 5, 5, 6, 7, 9, 11, 14, 14 ],
469 [ 12, 11, 9, 8, 8, 7, 5, 4, 4, 3, 3, 3, 3, 3, 4, 4, 5, 5, 7, 8, 10, 13, 14, 14 ],
470 [ 15, 16, 15, 12, 10, 8, 6, 5, 4, 3, 3, 3, 2, 3, 4, 5, 5, 7, 9, 11, 13, 16, 16, 16 ],
471 [ 14, 14, 11, 10, 9, 7, 7, 5, 5, 4, 3, 3, 2, 3, 3, 4, 5, 7, 9, 9, 12, 14, 15, 15 ],
472 [ 9, 9, 9, 8, 7, 6, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 13 ],
473 [ 14, 12, 10, 8, 6, 6, 5, 4, 3, 3, 3, 3, 3, 3, 4, 5, 6, 8, 8, 9, 11, 14, 14, 14 ],
474 [ 13, 10, 9, 8, 6, 6, 5, 4, 4, 4, 3, 3, 2, 3, 4, 5, 6, 8, 9, 9, 11, 12, 14, 14 ],
475 [ 16, 13, 12, 11, 9, 6, 5, 5, 4, 4, 4, 3, 2, 3, 3, 4, 5, 7, 8, 10, 14, 16, 16, 16 ],
476 [ 13, 14, 14, 14, 10, 8, 7, 7, 5, 4, 3, 3, 2, 3, 3, 4, 5, 5, 7, 9, 11, 14, 14, 14 ]
477];
478
479const VEC_CB0_BITS: [u16; 181] = [
480 0x0000, 0x0001, 0x0001, 0x0010, 0x0044, 0x0114, 0x0115, 0x008B,
481 0x0023, 0x0009, 0x0005, 0x0018, 0x0019, 0x000D, 0x0007, 0x0001,
482 0x0010, 0x0044, 0x0114, 0x0115, 0x022C, 0x045A, 0x045B, 0x0117,
483 0x0046, 0x0047, 0x0009, 0x0014, 0x0015, 0x0016, 0x002E, 0x005E,
484 0x005F, 0x000C, 0x001A, 0x0036, 0x0037, 0x000E, 0x001E, 0x003E,
485 0x00FC, 0x00FD, 0x01FC, 0x01FD, 0x01FE, 0x01FF, 0x0008, 0x0090,
486 0x0091, 0x0049, 0x004A, 0x004B, 0x004C, 0x009A, 0x0136, 0x09B8,
487 0x1372, 0x1373, 0x1374, 0x1375, 0x1376, 0x1377, 0x026F, 0x004E,
488 0x004F, 0x000A, 0x0016, 0x0017, 0x0018, 0x0032, 0x0033, 0x00D0,
489 0x01A2, 0x0346, 0x0347, 0x0069, 0x00D4, 0x00D5, 0x01AC, 0x06B4,
490 0x06B5, 0x06B6, 0x1ADC, 0x1ADD, 0x0D6F, 0x00D7, 0x0036, 0x0037,
491 0x000E, 0x0078, 0x0079, 0x003D, 0x003E, 0x003F, 0x0002, 0x0003,
492 0x0020, 0x0420, 0x0421, 0x0422, 0x0423, 0x0212, 0x0426, 0x0427,
493 0x0085, 0x010C, 0x010D, 0x010E, 0x010F, 0x0044, 0x0114, 0x022A,
494 0x022B, 0x0116, 0x08B8, 0x08B9, 0x045D, 0x1178, 0x1179, 0x08BD,
495 0x045F, 0x008C, 0x008D, 0x0047, 0x0012, 0x0098, 0x0099, 0x0134,
496 0x0135, 0x0136, 0x0137, 0x004E, 0x0278, 0x0279, 0x013D, 0x013E,
497 0x09F8, 0x27E4, 0x27E5, 0x13F3, 0x04FD, 0x027F, 0x000A, 0x0016,
498 0x005C, 0x00BA, 0x00BB, 0x005E, 0x02F8, 0x02F9, 0x017D, 0x00BF,
499 0x0018, 0x0032, 0x0033, 0x0034, 0x0350, 0x0351, 0x0352, 0x0353,
500 0x00D5, 0x006B, 0x006C, 0x00DA, 0x00DB, 0x006E, 0x01BC, 0x01BD,
501 0x00DF, 0x001C, 0x003A, 0x03B0, 0x0762, 0x0763, 0x01D9, 0x01DA,
502 0x01DB, 0x00EE, 0x00EF, 0x000F, 0x0001
503];
504const VEC_CB0_LENS: [u8; 181] = [
505 9, 9, 8, 11, 13, 15, 15, 14, 12, 10, 9, 11, 11, 10, 9, 6,
506 9, 11, 13, 13, 14, 15, 15, 13, 11, 11, 8, 9, 9, 9, 10, 11,
507 11, 8, 9, 10, 10, 8, 9, 10, 12, 12, 13, 13, 13, 13, 7, 11,
508 11, 10, 10, 10, 10, 11, 12, 15, 16, 16, 16, 16, 16, 16, 13, 10,
509 10, 7, 8, 8, 8, 9, 9, 11, 12, 13, 13, 10, 11, 11, 12, 14,
510 14, 14, 16, 16, 15, 11, 9, 9, 7, 10, 10, 9, 9, 9, 4, 4,
511 7, 12, 12, 12, 12, 11, 12, 12, 9, 10, 10, 10, 10, 8, 10, 11,
512 11, 10, 13, 13, 12, 14, 14, 13, 12, 9, 9, 8, 6, 9, 9, 10,
513 10, 10, 10, 8, 11, 11, 10, 10, 13, 15, 15, 14, 12, 11, 5, 6,
514 8, 9, 9, 8, 11, 11, 10, 9, 6, 7, 7, 7, 11, 11, 11, 11,
515 9, 8, 8, 9, 9, 8, 10, 10, 9, 6, 7, 11, 12, 12, 10, 10,
516 10, 9, 9, 5, 1
517];
518const VEC_CB0_SYMS: [u16; 181] = [
519 37, 51, 5, 102, 76, 139, 155, 169, 151, 41, 82, 103,
520 118, 100, 8, 32, 113, 134, 211, 182, 213, 214, 124, 183,
521 28, 29, 96, 52, 24, 67, 146, 193, 104, 35, 144, 176,
522 115, 21, 129, 70, 210, 45, 123, 197, 92, 61, 49, 74,
523 164, 56, 11, 177, 42, 192, 195, 109, 185, 156, 140, 216,
524 171, 201, 212, 27, 57, 19, 81, 50, 6, 145, 38, 12,
525 60, 122, 77, 131, 119, 59, 166, 153, 199, 93, 125, 141,
526 215, 13, 98, 53, 64, 101, 85, 9, 25, 114, 16, 1,
527 4, 137, 106, 150, 121, 149, 91, 167, 83, 116, 117, 71,
528 178, 112, 162, 179, 44, 147, 152, 198, 181, 154, 170, 138,
529 107, 10, 39, 97, 18, 40, 54, 86, 72, 88, 43, 22,
530 209, 90, 163, 133, 108, 186, 200, 184, 196, 165, 17, 33,
531 7, 26, 68, 36, 135, 208, 87, 99, 48, 20, 80, 34,
532 105, 180, 75, 194, 161, 66, 23, 160, 84, 128, 58, 148,
533 55, 3, 65, 120, 136, 168, 132, 73, 89, 69, 130, 2, 0
534];
535
536const VEC_CB1_BITS: [u16; 94] = [
537 0x0000, 0x0010, 0x0044, 0x0045, 0x0023, 0x0009, 0x0005, 0x000C,
538 0x000D, 0x000E, 0x001E, 0x001F, 0x0001, 0x0002, 0x000C, 0x0034,
539 0x01A8, 0x0352, 0x0353, 0x00D5, 0x006B, 0x0036, 0x006E, 0x006F,
540 0x01C0, 0x01C1, 0x00E1, 0x0071, 0x0072, 0x0073, 0x01D0, 0x03A2,
541 0x03A3, 0x00E9, 0x0075, 0x003B, 0x0078, 0x00F2, 0x01E6, 0x01E7,
542 0x003D, 0x001F, 0x0020, 0x0021, 0x0088, 0x0112, 0x0113, 0x0045,
543 0x0023, 0x0024, 0x0094, 0x0095, 0x004B, 0x004C, 0x009A, 0x0136,
544 0x04DC, 0x4DD0, 0x4DD1, 0x26E9, 0x1375, 0x09BB, 0x026F, 0x0027,
545 0x000A, 0x000B, 0x0018, 0x0064, 0x00CA, 0x0196, 0x0197, 0x0066,
546 0x0067, 0x001A, 0x001B, 0x000E, 0x0078, 0x0790, 0x0F22, 0x1E46,
547 0x1E47, 0x03C9, 0x01E5, 0x00F3, 0x007A, 0x00F6, 0x03DC, 0x07BA,
548 0x1EEC, 0x1EED, 0x0F77, 0x01EF, 0x001F, 0x0001
549];
550const VEC_CB1_LENS: [u8; 94] = [
551 5, 9, 11, 11, 10, 8, 7, 8, 8, 8, 9, 9, 4, 4, 6, 8,
552 11, 12, 12, 10, 9, 8, 9, 9, 11, 11, 10, 9, 9, 9, 11, 12,
553 12, 10, 9, 8, 9, 10, 11, 11, 8, 7, 7, 7, 9, 10, 10, 8,
554 7, 7, 9, 9, 8, 8, 9, 10, 12, 16, 16, 15, 14, 13, 11, 7,
555 5, 5, 6, 8, 9, 10, 10, 8, 8, 6, 6, 5, 8, 12, 13, 14,
556 14, 11, 10, 9, 8, 9, 11, 12, 14, 14, 13, 10, 6, 1
557];
558const VEC_CB1_SYMS: [u16; 94] = [
559 17, 23, 86, 131, 85, 80, 49, 21, 5, 36, 83, 112,
560 1, 16, 33, 51, 71, 87, 88, 70, 39, 81, 53, 113,
561 145, 117, 55, 68, 98, 7, 41, 118, 57, 100, 84, 66,
562 99, 115, 116, 132, 52, 64, 20, 65, 54, 25, 128, 37,
563 4, 35, 8, 69, 22, 6, 24, 144, 147, 120, 105, 150,
564 135, 148, 102, 50, 2, 32, 3, 82, 114, 9, 56, 97,
565 67, 19, 48, 18, 96, 103, 73, 104, 149, 146, 130, 40,
566 38, 129, 72, 133, 119, 89, 134, 101, 34, 0
567];
568
569const VEC_CB2_BITS: [u16; 48] = [
570 0x0000, 0x0008, 0x0024, 0x004A, 0x004B, 0x0013, 0x000A, 0x000B,
571 0x0018, 0x0019, 0x0034, 0x0035, 0x006C, 0x00DA, 0x01B6, 0x01B7,
572 0x0037, 0x001C, 0x001D, 0x001E, 0x003E, 0x003F, 0x0002, 0x0018,
573 0x0019, 0x000D, 0x0007, 0x0008, 0x0009, 0x000A, 0x0160, 0x0161,
574 0x0162, 0x0163, 0x0059, 0x00B4, 0x2D40, 0x5A82, 0x5A83, 0x16A1,
575 0x0B51, 0x05A9, 0x02D5, 0x016B, 0x005B, 0x0017, 0x0003, 0x0001
576];
577const VEC_CB2_LENS: [u8; 48] = [
578 4, 7, 9, 10, 10, 8, 7, 7, 8, 8, 9, 9, 10, 11, 12, 12,
579 9, 8, 8, 8, 9, 9, 4, 7, 7, 6, 5, 5, 5, 5, 10, 10,
580 10, 10, 8, 9, 15, 16, 16, 14, 13, 12, 11, 10, 8, 6, 3, 1
581];
582const VEC_CB2_SYMS: [u16; 48] = [
583 8, 25, 13, 42, 14, 12, 3, 24, 33, 4, 28, 41,
584 36, 22, 44, 30, 35, 32, 27, 20, 40, 21, 9, 19,
585 26, 18, 2, 10, 17, 16, 49, 29, 43, 50, 34, 6,
586 45, 53, 46, 52, 38, 51, 37, 48, 5, 11, 1, 0
587];
588
589const VEC_CB3_BITS: [u16; 520] = [
590 0x0000, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086,
591 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E,
592 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096,
593 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E,
594 0x013E, 0x013F, 0x0005, 0x0003, 0x0002, 0x000C, 0x001A, 0x001B,
595 0x0038, 0x0039, 0x003A, 0x003B, 0x000F, 0x0008, 0x0090, 0x0091,
596 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099,
597 0x009A, 0x009B, 0x0027, 0x0005, 0x000C, 0x000D, 0x000E, 0x001E,
598 0x001F, 0x0040, 0x0041, 0x0042, 0x0860, 0x0861, 0x0862, 0x0863,
599 0x0864, 0x0865, 0x0866, 0x0867, 0x0868, 0x0869, 0x086A, 0x086B,
600 0x086C, 0x086D, 0x086E, 0x086F, 0x0870, 0x0871, 0x0872, 0x0873,
601 0x0874, 0x0875, 0x0876, 0x0877, 0x0878, 0x0879, 0x087A, 0x087B,
602 0x087C, 0x087D, 0x087E, 0x087F, 0x0880, 0x0881, 0x0882, 0x0883,
603 0x0884, 0x0885, 0x0886, 0x0887, 0x0888, 0x0889, 0x088A, 0x088B,
604 0x088C, 0x088D, 0x088E, 0x088F, 0x0890, 0x0891, 0x0892, 0x0893,
605 0x0894, 0x0895, 0x0896, 0x0897, 0x0898, 0x0899, 0x089A, 0x089B,
606 0x089C, 0x089D, 0x089E, 0x089F, 0x08A0, 0x08A1, 0x08A2, 0x08A3,
607 0x08A4, 0x08A5, 0x08A6, 0x08A7, 0x08A8, 0x08A9, 0x08AA, 0x08AB,
608 0x08AC, 0x08AD, 0x08AE, 0x08AF, 0x08B0, 0x08B1, 0x08B2, 0x08B3,
609 0x08B4, 0x08B5, 0x08B6, 0x08B7, 0x08B8, 0x08B9, 0x08BA, 0x08BB,
610 0x08BC, 0x08BD, 0x08BE, 0x08BF, 0x08C0, 0x08C1, 0x08C2, 0x08C3,
611 0x08C4, 0x08C5, 0x08C6, 0x08C7, 0x08C8, 0x08C9, 0x08CA, 0x08CB,
612 0x08CC, 0x08CD, 0x08CE, 0x08CF, 0x08D0, 0x08D1, 0x08D2, 0x08D3,
613 0x08D4, 0x08D5, 0x08D6, 0x08D7, 0x08D8, 0x08D9, 0x08DA, 0x08DB,
614 0x08DC, 0x08DD, 0x08DE, 0x08DF, 0x08E0, 0x08E1, 0x08E2, 0x08E3,
615 0x08E4, 0x08E5, 0x08E6, 0x08E7, 0x08E8, 0x08E9, 0x08EA, 0x08EB,
616 0x08EC, 0x08ED, 0x08EE, 0x08EF, 0x08F0, 0x08F1, 0x08F2, 0x08F3,
617 0x08F4, 0x08F5, 0x08F6, 0x08F7, 0x08F8, 0x08F9, 0x08FA, 0x08FB,
618 0x08FC, 0x08FD, 0x08FE, 0x08FF, 0x0009, 0x0A00, 0x0A01, 0x0A02,
619 0x0A03, 0x0A04, 0x0A05, 0x0A06, 0x0A07, 0x0A08, 0x0A09, 0x0A0A,
620 0x0A0B, 0x0A0C, 0x0A0D, 0x0A0E, 0x0A0F, 0x0A10, 0x0A11, 0x0A12,
621 0x0A13, 0x0A14, 0x0A15, 0x0A16, 0x0A17, 0x0A18, 0x0A19, 0x0A1A,
622 0x0A1B, 0x0A1C, 0x0A1D, 0x0A1E, 0x0A1F, 0x0A20, 0x0A21, 0x0A22,
623 0x0A23, 0x0A24, 0x0A25, 0x0A26, 0x0A27, 0x0A28, 0x0A29, 0x0A2A,
624 0x0A2B, 0x0A2C, 0x0A2D, 0x0A2E, 0x0A2F, 0x00A3, 0x0029, 0x002A,
625 0x0056, 0x0057, 0x000B, 0x0003, 0x0004, 0x0005, 0x0030, 0x0062,
626 0x18C0, 0x18C1, 0x18C2, 0x18C3, 0x18C4, 0x18C5, 0x18C6, 0x18C7,
627 0x0319, 0x018D, 0x00C7, 0x0032, 0x0198, 0x0199, 0x019A, 0x019B,
628 0x0067, 0x001A, 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365,
629 0x0366, 0x0367, 0x0368, 0x0369, 0x036A, 0x036B, 0x00DB, 0x006E,
630 0x006F, 0x001C, 0x00E8, 0x00E9, 0x0075, 0x0076, 0x0077, 0x0780,
631 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0786, 0x0787, 0x0788,
632 0x0789, 0x078A, 0x078B, 0x078C, 0x078D, 0x078E, 0x078F, 0x0079,
633 0x003D, 0x007C, 0x07D0, 0x07D1, 0x07D2, 0x07D3, 0x01F5, 0x00FB,
634 0x00FC, 0x00FD, 0x00FE, 0x01FE, 0x01FF, 0x0004, 0x0005, 0x000C,
635 0x0068, 0x00D2, 0x00D3, 0x0035, 0x0036, 0x0037, 0x0038, 0x00E4,
636 0x00E5, 0x0073, 0x003A, 0x0076, 0x01DC, 0x01DD, 0x00EF, 0x000F,
637 0x0008, 0x0009, 0x0050, 0x0144, 0x0145, 0x0146, 0x028E, 0x051E,
638 0x051F, 0x0052, 0x0530, 0x0531, 0x0532, 0x0533, 0x0534, 0x0535,
639 0x0536, 0x0537, 0x014E, 0x0A78, 0x0A79, 0x0A7A, 0x0A7B, 0x0A7C,
640 0x0A7D, 0x0A7E, 0x0A7F, 0x0015, 0x0016, 0x0017, 0x0006, 0x0070,
641 0x00E2, 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x038D, 0x01C7, 0x0039,
642 0x01D0, 0x03A2, 0x0E8C, 0x0E8D, 0x0747, 0x00E9, 0x0075, 0x003B,
643 0x001E, 0x007C, 0x00FA, 0x03EC, 0x03ED, 0x03EE, 0x07DE, 0x07DF,
644 0x07E0, 0x07E1, 0x07E2, 0x07E3, 0x01F9, 0x00FD, 0x007F, 0x0008,
645 0x0090, 0x0091, 0x0092, 0x0093, 0x0128, 0x0129, 0x012A, 0x0958,
646 0x9590, 0x9591, 0x4AC9, 0x2565, 0x12B3, 0x04AD, 0x0257, 0x004B,
647 0x0098, 0x0264, 0x0265, 0x0266, 0x04CE, 0x04CF, 0x004D, 0x009C,
648 0x013A, 0x0276, 0x0277, 0x004F, 0x00A0, 0x0284, 0x050A, 0x050B,
649 0x050C, 0x0A1A, 0x0A1B, 0x0A1C, 0x0A1D, 0x0A1E, 0x0A1F, 0x00A2,
650 0x0A30, 0x0A31, 0x0A32, 0x0A33, 0x028D, 0x028E, 0x1478, 0x1479,
651 0x147A, 0x147B, 0x147C, 0x147D, 0x147E, 0x147F, 0x0029, 0x0015,
652 0x0058, 0x0059, 0x00B4, 0x16A0, 0x16A1, 0x16A2, 0x16A3, 0x16A4,
653 0x16A5, 0x16A6, 0x2D4E, 0x2D4F, 0x02D5, 0x016B, 0x02D8, 0x02D9,
654 0x016D, 0x016E, 0x05BC, 0x05BD, 0x02DF, 0x002E, 0x002F, 0x0003
655];
656const VEC_CB3_LENS: [u8; 520] = [
657 8, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
658 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
659 16, 16, 10, 9, 8, 10, 11, 11, 12, 12, 12, 12, 10, 9, 13, 13,
660 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 8, 9, 9, 9, 10,
661 10, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
662 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
663 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
664 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
665 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
666 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
667 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
668 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
669 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
670 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
671 16, 16, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
672 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
673 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
674 16, 16, 16, 16, 16, 12, 10, 10, 11, 11, 8, 6, 6, 6, 9, 10,
675 16, 16, 16, 16, 16, 16, 16, 16, 13, 12, 11, 9, 12, 12, 12, 12,
676 10, 8, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 11, 10,
677 10, 8, 11, 11, 10, 10, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14,
678 14, 14, 14, 14, 14, 14, 14, 10, 9, 10, 14, 14, 14, 14, 12, 11,
679 11, 11, 11, 12, 12, 5, 5, 6, 9, 10, 10, 8, 8, 8, 8, 10,
680 10, 9, 8, 9, 11, 11, 10, 6, 5, 5, 8, 10, 10, 10, 11, 12,
681 12, 8, 12, 12, 12, 12, 12, 12, 12, 12, 10, 13, 13, 13, 13, 13,
682 13, 13, 13, 6, 6, 6, 4, 8, 9, 13, 13, 13, 13, 11, 10, 7,
683 10, 11, 13, 13, 12, 9, 8, 7, 6, 8, 9, 11, 11, 11, 12, 12,
684 12, 12, 12, 12, 10, 9, 8, 4, 8, 8, 8, 8, 9, 9, 9, 12,
685 16, 16, 15, 14, 13, 11, 10, 7, 8, 10, 10, 10, 11, 11, 7, 8,
686 9, 10, 10, 7, 8, 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 8,
687 12, 12, 12, 12, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 6, 5,
688 7, 7, 8, 13, 13, 13, 13, 13, 13, 13, 14, 14, 10, 9, 10, 10,
689 9, 9, 11, 11, 10, 6, 6, 2
690];
691const VEC_CB3_SYMS: [u16; 520] = [
692 74, 1120, 1682, 1745, 1801, 274, 1050, 730, 546, 1058, 1729, 1539,
693 2240, 1547, 1163, 1730, 2064, 1624, 723, 1235, 1115, 35, 2248, 1304,
694 644, 196, 1625, 1036, 1548, 1185, 652, 1044, 2136, 1753, 1664, 129,
695 640, 83, 665, 130, 1225, 1232, 602, 76, 587, 1161, 1049, 545,
696 265, 1218, 2113, 202, 98, 131, 643, 1288, 524, 785, 720, 1096,
697 704, 528, 657, 601, 67, 537, 33, 579, 1746, 2258, 1248, 786,
698 1298, 1810, 2265, 2313, 1761, 1562, 2074, 2264, 1569, 2257, 225, 2138,
699 1056, 2081, 2249, 1690, 2202, 736, 2186, 1242, 1754, 282, 794, 1306,
700 1792, 1561, 2201, 1570, 2073, 281, 1122, 1634, 2178, 674, 1186, 1698,
701 226, 738, 1250, 1240, 289, 800, 1738, 2051, 1632, 1121, 793, 1603,
702 2115, 1633, 2250, 737, 1667, 2179, 195, 707, 1219, 1731, 2243, 259,
703 771, 1283, 1795, 2304, 2144, 2305, 1249, 2059, 2192, 2072, 2200, 1611,
704 2123, 1689, 288, 1696, 1675, 2187, 203, 792, 1227, 1739, 2251, 267,
705 779, 1291, 1803, 1802, 2256, 2242, 1555, 2067, 1560, 258, 1688, 1619,
706 2131, 770, 2145, 2114, 1683, 2195, 211, 1057, 2065, 1747, 275, 787,
707 1299, 1817, 1697, 1051, 1563, 2075, 1794, 2050, 801, 1627, 2139, 1800,
708 667, 1179, 1691, 219, 731, 1243, 1755, 283, 795, 2066, 547, 1059,
709 1571, 1184, 611, 1123, 1635, 163, 675, 1187, 227, 739, 1568, 1760,
710 1028, 1540, 2052, 2193, 1752, 1092, 1604, 2116, 1793, 2177, 1156, 1668,
711 649, 1618, 708, 1220, 1732, 260, 772, 1808, 1816, 280, 2312, 2060,
712 1305, 1241, 1297, 1612, 2124, 140, 2122, 1164, 1676, 204, 716, 1228,
713 1740, 268, 780, 2241, 1809, 2194, 1556, 2137, 2058, 1108, 1620, 148,
714 660, 1172, 1684, 212, 724, 1236, 28, 540, 1052, 1564, 92, 604,
715 1116, 666, 1105, 1153, 1673, 1162, 522, 584, 513, 73, 712, 650,
716 1628, 156, 668, 1180, 220, 732, 36, 548, 672, 777, 32, 656,
717 1233, 1113, 1602, 1665, 523, 586, 609, 1538, 728, 1112, 1289, 257,
718 1280, 1234, 216, 610, 1091, 2121, 1026, 1224, 1608, 1600, 96, 536,
719 713, 1104, 26, 1296, 1282, 2130, 1626, 218, 162, 1744, 1155, 2129,
720 715, 1043, 1281, 147, 1171, 224, 99, 1169, 144, 1672, 132, 1100,
721 2185, 596, 264, 768, 664, 1168, 1106, 154, 651, 64, 8, 585,
722 594, 201, 90, 1097, 593, 11, 1089, 2048, 1098, 89, 3, 75,
723 208, 91, 1090, 65, 576, 9, 137, 642, 658, 515, 20, 1736,
724 1728, 1025, 194, 784, 722, 538, 34, 1099, 769, 2176, 1544, 608,
725 1666, 1546, 217, 160, 2184, 544, 1027, 577, 521, 520, 1, 1032,
726 145, 2049, 1680, 659, 273, 97, 2112, 16, 138, 1217, 580, 588,
727 729, 4, 514, 81, 2, 592, 192, 1042, 531, 595, 2120, 1610,
728 714, 1170, 139, 1737, 1034, 88, 578, 512, 18, 1536, 1033, 66,
729 24, 200, 530, 84, 100, 612, 2080, 266, 1177, 209, 1601, 80,
730 1160, 146, 600, 152, 1035, 776, 17, 82, 25, 1609, 153, 648,
731 529, 1216, 1545, 27, 68, 272, 1552, 161, 1176, 1048, 1617, 641,
732 210, 1114, 1553, 1616, 1040, 705, 2057, 706, 2128, 1674, 1226, 1554,
733 1178, 1107, 10, 72, 136, 128, 1152, 1681, 539, 603, 155, 516,
734 673, 532, 778, 1290, 1537, 12, 721, 256, 1041, 19, 1154, 2056,
735 193, 1024, 1088, 0
736];
737
738const VEC_CB4_BITS: [u16; 209] = [
739 0x0000, 0x0004, 0x000A, 0x0016, 0x002E, 0x0178, 0x0179, 0x00BD,
740 0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x05F5, 0x05F6, 0x05F7,
741 0x05F8, 0x05F9, 0x05FA, 0x05FB, 0x05FC, 0x05FD, 0x05FE, 0x05FF,
742 0x0018, 0x0019, 0x000D, 0x001C, 0x001D, 0x000F, 0x0001, 0x0002,
743 0x0018, 0x0064, 0x0328, 0x0CA4, 0x0CA5, 0x0CA6, 0x0CA7, 0x0CA8,
744 0x0CA9, 0x0655, 0x032B, 0x00CB, 0x0066, 0x0067, 0x000D, 0x000E,
745 0x000F, 0x0001, 0x0010, 0x0440, 0x1104, 0x220A, 0x220B, 0x0883,
746 0x0221, 0x0111, 0x0089, 0x0045, 0x0118, 0x0119, 0x0468, 0x08D2,
747 0x08D3, 0x08D4, 0x08D5, 0x046B, 0x011B, 0x008E, 0x023C, 0x047A,
748 0x08F6, 0x23DC, 0x23DD, 0x23DE, 0x23DF, 0x011F, 0x0009, 0x000A,
749 0x0058, 0x02C8, 0x0592, 0x164C, 0x164D, 0x164E, 0x164F, 0x0B28,
750 0x0B29, 0x0595, 0x0596, 0x0597, 0x02CC, 0x059A, 0x0B36, 0x0B37,
751 0x0B38, 0x2CE4, 0x59CA, 0x59CB, 0x1673, 0x059D, 0x02CF, 0x00B4,
752 0x00B5, 0x005B, 0x0017, 0x0018, 0x0019, 0x001A, 0x0036, 0x01B8,
753 0x06E4, 0x1B94, 0x1B95, 0x0DCB, 0x0373, 0x06E8, 0x06E9, 0x0375,
754 0x01BB, 0x006F, 0x001C, 0x0074, 0x00EA, 0x01D6, 0x0EB8, 0x1D72,
755 0x75CC, 0x75CD, 0x75CE, 0x75CF, 0x75D0, 0x75D1, 0x75D2, 0x75D3,
756 0x75D4, 0x75D5, 0x75D6, 0x75D7, 0x75D8, 0x75D9, 0x75DA, 0x75DB,
757 0x75DC, 0x75DD, 0x75DE, 0x75DF, 0x75E0, 0x75E1, 0x75E2, 0x75E3,
758 0x75E4, 0x75E5, 0x75E6, 0x75E7, 0x75E8, 0x75E9, 0x75EA, 0x75EB,
759 0x75EC, 0x75ED, 0x75EE, 0x75EF, 0x75F0, 0x75F1, 0x75F2, 0x75F3,
760 0x75F4, 0x75F5, 0x75F6, 0x75F7, 0x75F8, 0x75F9, 0x75FA, 0x75FB,
761 0x75FC, 0x75FD, 0x75FE, 0x75FF, 0x00EC, 0x01DA, 0x76C0, 0x76C1,
762 0x76C2, 0x76C3, 0x76C4, 0x76C5, 0x76C6, 0x76C7, 0x76C8, 0x76C9,
763 0x76CA, 0x76CB, 0x76CC, 0x76CD, 0x76CE, 0x76CF, 0x76D0, 0x76D1,
764 0x76D2, 0x76D3, 0x76D4, 0x76D5, 0x3B6B, 0x0EDB, 0x03B7, 0x0077, 0x000F
765];
766const VEC_CB4_LENS: [u8; 209] = [
767 5, 7, 8, 9, 10, 13, 13, 12, 15, 15, 15, 15, 15, 15, 15, 15,
768 15, 15, 15, 15, 15, 15, 15, 15, 9, 9, 8, 9, 9, 8, 4, 4,
769 7, 9, 12, 14, 14, 14, 14, 14, 14, 13, 12, 10, 9, 9, 6, 6,
770 6, 2, 5, 11, 13, 14, 14, 12, 10, 9, 8, 7, 9, 9, 11, 12,
771 12, 12, 12, 11, 9, 8, 10, 11, 12, 14, 14, 14, 14, 9, 4, 4,
772 7, 10, 11, 13, 13, 13, 13, 12, 12, 11, 11, 11, 10, 11, 12, 12,
773 12, 14, 15, 15, 13, 11, 10, 8, 8, 7, 5, 5, 5, 5, 6, 9,
774 11, 13, 13, 12, 10, 11, 11, 10, 9, 7, 5, 7, 8, 9, 12, 13,
775 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
776 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
777 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
778 15, 15, 15, 15, 8, 9, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
779 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 12, 10, 7, 4
780];
781const VEC_CB4_SYMS: [u16; 209] = [
782 80, 128, 96, 132, 160, 134, 92, 23, 180, 228, 232, 214,
783 225, 166, 54, 138, 121, 131, 147, 99, 141, 75, 27, 91,
784 37, 66, 24, 129, 145, 36, 1, 64, 6, 73, 34, 57,
785 49, 42, 106, 14, 56, 130, 98, 7, 33, 97, 69, 81,
786 85, 0, 20, 12, 76, 11, 44, 212, 40, 70, 22, 144,
787 86, 149, 165, 196, 102, 137, 146, 52, 72, 148, 192, 28,
788 19, 120, 30, 224, 169, 82, 4, 16, 8, 208, 48, 93,
789 168, 193, 53, 152, 67, 161, 112, 29, 41, 74, 77, 150,
790 71, 87, 114, 178, 213, 116, 164, 18, 101, 32, 65, 21,
791 84, 17, 2, 3, 153, 113, 83, 117, 105, 38, 90, 13,
792 10, 100, 68, 9, 89, 133, 197, 209, 181, 61, 245, 198,
793 205, 125, 156, 220, 233, 172, 216, 230, 109, 118, 182, 217,
794 176, 173, 202, 204, 108, 154, 218, 184, 185, 170, 58, 122,
795 124, 78, 142, 201, 94, 158, 46, 110, 157, 200, 240, 195,
796 244, 60, 210, 211, 35, 241, 163, 51, 115, 221, 229, 135,
797 88, 26, 199, 177, 45, 151, 215, 39, 103, 167, 55, 119,
798 140, 162, 139, 226, 50, 155, 43, 107, 15, 79, 31, 95,
799 194, 136, 104, 25, 5
800];
801
802const VEC_CB5_BITS: [u16; 192] = [
803 0x0000, 0x0004, 0x0005, 0x0060, 0x0184, 0x030A, 0x0616, 0x0617,
804 0x030C, 0x061A, 0x061B, 0x0187, 0x0031, 0x0019, 0x001A, 0x001B,
805 0x000E, 0x003C, 0x003D, 0x003E, 0x007E, 0x01FC, 0x03FA, 0x1FD8,
806 0x1FD9, 0x0FED, 0x0FEE, 0x0FEF, 0x00FF, 0x0010, 0x0044, 0x008A,
807 0x008B, 0x0023, 0x0009, 0x000A, 0x000B, 0x0060, 0x1840, 0x1841,
808 0x1842, 0x1843, 0x0C22, 0x0C23, 0x0612, 0x184C, 0x309A, 0x309B,
809 0x0C27, 0x030A, 0x0616, 0x0617, 0x0186, 0x1870, 0x1871, 0x0C39,
810 0x0C3A, 0x0C3B, 0x061E, 0x0C3E, 0x0C3F, 0x0031, 0x0019, 0x001A,
811 0x0036, 0x00DC, 0x0DD0, 0x0DD1, 0x06E9, 0x0375, 0x01BB, 0x01BC,
812 0x0DE8, 0x37A4, 0x6F4A, 0x6F4B, 0x1BD3, 0x06F5, 0x06F6, 0x1BDC,
813 0x1BDD, 0x0DEF, 0x0DF0, 0x0DF1, 0x6F90, 0x6F91, 0x6F92, 0x6F93,
814 0x6F94, 0x6F95, 0x6F96, 0x6F97, 0x6F98, 0x6F99, 0x6F9A, 0x6F9B,
815 0x6F9C, 0x6F9D, 0x6F9E, 0x6F9F, 0x6FA0, 0x6FA1, 0x6FA2, 0x6FA3,
816 0x6FA4, 0x6FA5, 0x6FA6, 0x6FA7, 0x6FA8, 0x6FA9, 0x6FAA, 0x6FAB,
817 0x6FAC, 0x6FAD, 0x6FAE, 0x6FAF, 0x6FB0, 0x6FB1, 0x6FB2, 0x6FB3,
818 0x6FB4, 0x6FB5, 0x6FB6, 0x6FB7, 0x6FB8, 0x6FB9, 0x6FBA, 0x6FBB,
819 0x6FBC, 0x6FBD, 0x6FBE, 0x6FBF, 0x6FC0, 0x6FC1, 0x6FC2, 0x6FC3,
820 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, 0x6FC9, 0x6FCA, 0x6FCB,
821 0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD1, 0x6FD2, 0x6FD3,
822 0x6FD4, 0x6FD5, 0x6FD6, 0x6FD7, 0x6FD8, 0x6FD9, 0x6FDA, 0x6FDB,
823 0x6FDC, 0x6FDD, 0x37EF, 0x0DFC, 0x0DFD, 0x0DFE, 0x37FC, 0x37FD,
824 0x37FE, 0x37FF, 0x001C, 0x003A, 0x0076, 0x0077, 0x00F0, 0x00F1,
825 0x03C8, 0x0792, 0x1E4C, 0x1E4D, 0x1E4E, 0x1E4F, 0x1E50, 0x1E51,
826 0x1E52, 0x1E53, 0x0F2A, 0x0F2B, 0x03CB, 0x00F3, 0x003D, 0x001F
827];
828const VEC_CB5_LENS: [u8; 192] = [
829 2, 4, 4, 8, 10, 11, 12, 12, 11, 12, 12, 10, 7, 6, 6, 6,
830 5, 7, 7, 7, 8, 10, 11, 14, 14, 13, 13, 13, 9, 5, 7, 8,
831 8, 6, 4, 4, 4, 7, 13, 13, 13, 13, 12, 12, 11, 13, 14, 14,
832 12, 10, 11, 11, 9, 13, 13, 12, 12, 12, 11, 12, 12, 6, 5, 5,
833 6, 8, 12, 12, 11, 10, 9, 9, 12, 14, 15, 15, 13, 11, 11, 13,
834 13, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
835 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
836 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
837 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
838 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
839 15, 15, 14, 12, 12, 12, 14, 14, 14, 14, 5, 6, 7, 7, 8, 8,
840 10, 11, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 10, 8, 6, 5
841];
842const VEC_CB5_SYMS: [u16; 192] = [
843 0, 1, 256, 277, 24, 25, 262, 88, 100, 132, 70, 384,
844 81, 17, 272, 68, 5, 321, 69, 276, 337, 144, 72, 10,
845 389, 289, 532, 517, 32, 320, 324, 325, 2, 260, 4, 64,
846 16, 273, 352, 265, 264, 329, 97, 148, 66, 86, 533, 149,
847 37, 36, 400, 22, 128, 280, 326, 516, 101, 292, 528, 577,
848 592, 21, 20, 80, 336, 512, 133, 580, 33, 96, 576, 9,
849 274, 593, 597, 581, 356, 513, 288, 338, 278, 328, 388, 73,
850 405, 661, 344, 660, 549, 152, 417, 613, 165, 421, 392, 296,
851 521, 645, 641, 585, 137, 393, 608, 416, 537, 656, 609, 601,
852 153, 409, 420, 297, 105, 361, 360, 408, 514, 164, 40, 578,
853 130, 386, 548, 544, 530, 584, 545, 594, 146, 402, 600, 290,
854 98, 354, 644, 136, 518, 657, 520, 582, 134, 390, 104, 536,
855 534, 161, 342, 598, 150, 406, 38, 294, 102, 358, 612, 266,
856 74, 330, 26, 282, 90, 346, 41, 293, 322, 82, 34, 640,
857 401, 160, 257, 84, 340, 85, 341, 6, 258, 129, 353, 529,
858 404, 357, 281, 89, 345, 596, 385, 145, 18, 8, 261, 65
859];
860
861const VEC_CB6_BITS: [u16; 32] = [
862 0x0000, 0x0004, 0x0005, 0x0003, 0x0001, 0x0002, 0x0003, 0x0001,
863 0x0002, 0x0003, 0x0004, 0x0005, 0x0018, 0x00C8, 0x0192, 0x0326,
864 0x0327, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x01A8, 0x01A9,
865 0x00D5, 0x006B, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, 0x0001
866];
867const VEC_CB6_LENS: [u8; 32] = [
868 7, 9, 9, 8, 6, 6, 6, 4, 4, 4, 4, 4, 6, 9, 10, 11,
869 11, 8, 8, 8, 8, 8, 10, 10, 9, 8, 6, 6, 6, 6, 6, 1
870];
871const VEC_CB6_SYMS: [u16; 32] = [
872 9, 19, 22, 7, 3, 24, 6, 1, 16, 2, 8, 4,
873 12, 21, 27, 29, 31, 28, 14, 13, 11, 26, 30, 23,
874 15, 25, 5, 10, 20, 17, 18, 0
875];
876
877const QUANT_LEVELS: [[f32; 14]; 7] = [
878 [ 0.0, 0.392, 0.761, 1.120, 1.477, 1.832, 2.183, 2.541, 2.893, 3.245, 3.598, 3.942, 4.288, 4.724 ],
879 [ 0.0, 0.544, 1.060, 1.563, 2.068, 2.571, 3.072, 3.562, 4.070, 4.620, 0.0, 0.0, 0.0, 0.0 ],
880 [ 0.0, 0.746, 1.464, 2.180, 2.882, 3.584, 4.316, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ],
881 [ 0.0, 1.006, 2.000, 2.993, 3.985, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ],
882 [ 0.0, 1.321, 2.703, 3.983, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ],
883 [ 0.0, 1.657, 3.491, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ],
884 [ 0.0, 1.964, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ]
885];
886
887const CAT5_NOISE_FACTOR: [f32; REGION_SIZE + 1] = [
888 0.70711, 0.6179, 0.5005, 0.3220, 0.17678, 0.17678, 0.17678, 0.17678, 0.17678, 0.17678,
889 0.17678, 0.17678, 0.17678, 0.17678, 0.17678, 0.17678, 0.17678, 0.17678, 0.17678, 0.17678, 0.0
890];
891const CAT6_NOISE_FACTOR: [f32; REGION_SIZE + 1] = [
892 0.70711, 0.5686, 0.3563, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25,
893 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.0
894];