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