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