3 use nihav_core::codecs::*;
4 use nihav_core::codecs::blockdsp::*;
5 use nihav_core::io::bitreader::*;
6 use nihav_core::io::codebook::*;
7 use nihav_core::io::intcode::*;
8 use super::vpcommon::*;
10 #[derive(Clone,Copy,Debug,PartialEq)]
17 fn map_idx(idx: usize) -> u8 {
22 dc_cb: [Codebook<u8>; 16],
23 ac0_cb: [Codebook<u8>; 16],
24 ac1_cb: [Codebook<u8>; 16],
25 ac2_cb: [Codebook<u8>; 16],
26 ac3_cb: [Codebook<u8>; 16],
31 let mut dc_cb: [Codebook<u8>; 16];
32 let mut ac0_cb: [Codebook<u8>; 16];
33 let mut ac1_cb: [Codebook<u8>; 16];
34 let mut ac2_cb: [Codebook<u8>; 16];
35 let mut ac3_cb: [Codebook<u8>; 16];
37 dc_cb = mem::uninitialized();
38 ac0_cb = mem::uninitialized();
39 ac1_cb = mem::uninitialized();
40 ac2_cb = mem::uninitialized();
41 ac3_cb = mem::uninitialized();
43 let mut cr = TableCodebookDescReader::new(&VP31_DC_CODES[i], &VP31_DC_BITS[i], map_idx);
44 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
45 ptr::write(&mut dc_cb[i], cb);
47 let mut cr = TableCodebookDescReader::new(&VP31_AC_CAT0_CODES[i], &VP31_AC_CAT0_BITS[i], map_idx);
48 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
49 ptr::write(&mut ac0_cb[i], cb);
50 let mut cr = TableCodebookDescReader::new(&VP31_AC_CAT1_CODES[i], &VP31_AC_CAT1_BITS[i], map_idx);
51 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
52 ptr::write(&mut ac1_cb[i], cb);
53 let mut cr = TableCodebookDescReader::new(&VP31_AC_CAT2_CODES[i], &VP31_AC_CAT2_BITS[i], map_idx);
54 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
55 ptr::write(&mut ac2_cb[i], cb);
56 let mut cr = TableCodebookDescReader::new(&VP31_AC_CAT3_CODES[i], &VP31_AC_CAT3_BITS[i], map_idx);
57 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
58 ptr::write(&mut ac3_cb[i], cb);
61 Self { dc_cb, ac0_cb, ac1_cb, ac2_cb, ac3_cb }
84 btype: VPMBType::Intra,
94 type ReadRunFunc = fn (&mut BitReader) -> DecoderResult<usize>;
96 const VP31_LONG_RUN_BASE: [usize; 7] = [ 1, 2, 4, 6, 10, 18, 34 ];
97 const VP31_LONG_RUN_BITS: [u8; 7] = [ 0, 1, 1, 2, 3, 4, 12 ];
98 fn read_long_run(br: &mut BitReader) -> DecoderResult<usize> {
99 let pfx = br.read_code(UintCodeType::LimitedUnary(6, 0))? as usize;
100 if pfx == 0 { return Ok(1); }
101 Ok(VP31_LONG_RUN_BASE[pfx] + (br.read(VP31_LONG_RUN_BITS[pfx])? as usize))
104 const VP31_SHORT_RUN_BASE: [usize; 6] = [ 1, 3, 5, 7, 11, 15 ];
105 const VP31_SHORT_RUN_BITS: [u8; 6] = [ 1, 1, 1, 2, 2, 4 ];
106 fn read_short_run(br: &mut BitReader) -> DecoderResult<usize> {
107 let pfx = br.read_code(UintCodeType::LimitedUnary(5, 0))? as usize;
108 Ok(VP31_SHORT_RUN_BASE[pfx] + (br.read(VP31_SHORT_RUN_BITS[pfx])? as usize))
111 struct BitRunDecoder {
114 read_run: ReadRunFunc,
118 fn new(br: &mut BitReader, read_run: ReadRunFunc) -> DecoderResult<Self> {
119 let value = !br.read_bool()?; // it will be flipped before run decoding
120 Ok(Self { value, run: 0, read_run })
122 fn get_val(&mut self, br: &mut BitReader) -> DecoderResult<bool> {
124 self.value = !self.value;
125 self.run = (self.read_run)(br)?;
133 info: NACodecInfoRef,
150 qmat_inter: [i16; 64],
155 blk_addr: Vec<usize>,
156 sb_info: Vec<SBState>,
160 fn read_mv_comp_packed(br: &mut BitReader) -> DecoderResult<i16> {
161 let code = br.read(3)?;
166 3 => if br.read_bool()? { Ok(-2) } else { Ok(2) },
167 4 => if br.read_bool()? { Ok(-3) } else { Ok(3) },
169 let val = (br.read(2)? as i16) + 4;
177 let val = (br.read(3)? as i16) + 8;
185 let val = (br.read(4)? as i16) + 16;
195 fn read_mv_packed(br: &mut BitReader) -> DecoderResult<MV> {
196 let x = read_mv_comp_packed(br)?;
197 let y = read_mv_comp_packed(br)?;
201 fn read_mv_comp_raw(br: &mut BitReader) -> DecoderResult<i16> {
202 let val = br.read(5)? as i16;
210 fn read_mv_raw(br: &mut BitReader) -> DecoderResult<MV> {
211 let x = read_mv_comp_raw(br)?;
212 let y = read_mv_comp_raw(br)?;
216 fn rescale_qmat(dst_qmat: &mut [i16; 64], base_qmat: &[i16; 64], dc_quant: i16, ac_quant: i16) {
217 for (dst, src) in dst_qmat.iter_mut().zip(base_qmat.iter()) {
218 *dst = (src.wrapping_mul(ac_quant) / 100).max(2) << 2;
220 dst_qmat[0] = (base_qmat[0] * dc_quant / 100).max(4) << 2;
223 fn expand_token(blk: &mut Block, br: &mut BitReader, eob_run: &mut usize, coef_no: usize, token: u8) -> DecoderResult<()> {
226 0 | 1 | 2 => { *eob_run = (token as usize) + 1; },
228 let bits = token - 1;
229 *eob_run = (br.read(bits)? as usize) + (1 << bits);
231 6 => { *eob_run = br.read(12)? as usize; },
234 let bits = if token == 7 { 3 } else { 6 };
235 let run = (br.read(bits)? as usize) + 1;
237 validate!(blk.idx <= 64);
239 // single coefficients
240 9 | 10 | 11 | 12 => {
241 let val = (i16::from(token) - 7) >> 1;
242 if (token & 1) == 1 {
243 blk.coeffs[ZIGZAG[blk.idx]] = val;
245 blk.coeffs[ZIGZAG[blk.idx]] = -val;
249 13 | 14 | 15 | 16 => {
250 let val = i16::from(token) - 10;
251 if !br.read_bool()? {
252 blk.coeffs[ZIGZAG[blk.idx]] = val;
254 blk.coeffs[ZIGZAG[blk.idx]] = -val;
258 17 | 18 | 19 | 20 | 21 | 22 => {
259 let add_bits = if token == 22 { 9 } else { token - 16 };
260 let sign = br.read_bool()?;
261 let val = (br.read(add_bits)? as i16) + VP3_LITERAL_BASE[(token - 17) as usize];
263 blk.coeffs[ZIGZAG[blk.idx]] = val;
265 blk.coeffs[ZIGZAG[blk.idx]] = -val;
269 // zero run plus coefficient
270 23 | 24 | 25 | 26 | 27 => {
271 blk.idx += (token - 22) as usize;
272 validate!(blk.idx < 64);
273 if !br.read_bool()? {
274 blk.coeffs[ZIGZAG[blk.idx]] = 1;
276 blk.coeffs[ZIGZAG[blk.idx]] = -1;
281 let run_bits = token - 26;
287 let sign = br.read_bool()?;
288 blk.idx += br.read(run_bits)? as usize;
289 validate!(blk.idx < 64);
291 blk.coeffs[ZIGZAG[blk.idx]] = 1;
293 blk.coeffs[ZIGZAG[blk.idx]] = -1;
299 validate!(blk.idx < 64);
300 let sign = br.read_bool()?;
301 let val = (br.read(1)? as i16) + 2;
303 blk.coeffs[ZIGZAG[blk.idx]] = val;
305 blk.coeffs[ZIGZAG[blk.idx]] = -val;
310 let sign = br.read_bool()?;
311 let val = (br.read(1)? as i16) + 2;
312 blk.idx += (br.read(1)? as usize) + 2;
313 validate!(blk.idx < 64);
315 blk.coeffs[ZIGZAG[blk.idx]] = val;
317 blk.coeffs[ZIGZAG[blk.idx]] = -val;
325 } else if coef_no > 0 {
330 macro_rules! fill_dc_pred {
331 ($self: expr, $ref_id: expr, $pred: expr, $pp: expr, $bit: expr, $idx: expr) => {
332 if $self.blocks[$idx].coded && $self.blocks[$idx].btype.get_ref_id() == $ref_id {
333 $pred[$bit] = $self.blocks[$idx].coeffs[0] as i32;
339 fn vp3_interp00(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
344 for x in 0..bw { dst[didx + x] = src[sidx + x]; }
350 fn vp3_interp01(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
355 for x in 0..bw { dst[didx + x] = (((src[sidx + x] as u16) + (src[sidx + x + 1] as u16)) >> 1) as u8; }
361 fn vp3_interp10(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
366 for x in 0..bw { dst[didx + x] = (((src[sidx + x] as u16) + (src[sidx + x + sstride] as u16)) >> 1) as u8; }
372 fn vp3_interp11(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
378 dst[didx + x] = (((src[sidx + x] as u16) +
379 (src[sidx + x + 1] as u16) +
380 (src[sidx + x + sstride] as u16) +
381 (src[sidx + x + sstride + 1] as u16)) >> 2) as u8;
388 fn vp31_loop_filter(data: &mut [u8], mut off: usize, step: usize, stride: usize, loop_str: i16) {
390 let a = data[off - step * 2] as i16;
391 let b = data[off - step] as i16;
392 let c = data[off] as i16;
393 let d = data[off + step] as i16;
394 let mut diff = ((a - d) + 3 * (c - b) + 4) >> 3;
395 if diff.abs() >= 2 * loop_str {
397 } else if diff.abs() >= loop_str {
399 diff = -diff - 2 * loop_str;
401 diff = -diff + 2 * loop_str;
405 data[off - step] = (b + diff).max(0).min(255) as u8;
406 data[off] = (c - diff).max(0).min(255) as u8;
413 fn vp31_loop_filter_v(frm: &mut NASimpleVideoFrame<u8>, x: usize, y: usize, plane: usize, loop_str: i16) {
414 let off = frm.offset[plane] + x + y * frm.stride[plane];
415 vp31_loop_filter(frm.data, off, 1, frm.stride[plane], loop_str);
418 fn vp31_loop_filter_h(frm: &mut NASimpleVideoFrame<u8>, x: usize, y: usize, plane: usize, loop_str: i16) {
419 let off = frm.offset[plane] + x + y * frm.stride[plane];
420 vp31_loop_filter(frm.data, off, frm.stride[plane], 1, loop_str);
423 pub const VP3_INTERP_FUNCS: &[blockdsp::BlkInterpFunc] = &[ vp3_interp00, vp3_interp01, vp3_interp10, vp3_interp11 ];
426 fn new(version: u8) -> Self {
428 info: NACodecInfoRef::default(),
436 shuf: VPShuffler::new(),
451 blk_addr: Vec::new(),
453 sb_blocks: Vec::new(),
456 fn parse_header(&mut self, br: &mut BitReader) -> DecoderResult<()> {
457 self.is_intra = !br.read_bool()?;
459 self.quant = br.read(6)? as usize;
460 self.loop_str = VP31_LOOP_STRENGTH[self.quant];
461 println!("quant = {}", self.quant);
466 let version = br.read(13)?;
467 println!("intra, ver {} (self {})", version, self.version);
468 let coding_type = br.read(1)?;
469 validate!(coding_type == 0);
472 validate!(self.version == 3 || self.version == 31);
473 if self.version == 3 {
475 self.codes = Codes::VP31(VP31Codes::new());
477 } else if version == 2 {
478 validate!(self.version == 4);
481 return Err(DecoderError::InvalidData);
486 fn vp31_unpack_sb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
487 let mut has_uncoded = false;
488 let mut has_partial = false;
490 let mut brun = BitRunDecoder::new(br, read_long_run)?;
491 for sb in self.sb_info.iter_mut() {
492 if brun.get_val(br)? {
493 *sb = SBState::Partial;
496 *sb = SBState::Uncoded;
502 let mut brun = BitRunDecoder::new(br, read_long_run)?;
504 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()) {
505 let nblks = *nblk as usize;
506 if *sb != SBState::Partial && brun.get_val(br)? {
507 *sb = SBState::Coded;
509 let blk_idx = self.blk_addr[cur_blk] >> 2;
510 self.blocks[blk_idx].coded = true;
515 let blk_idx = self.blk_addr[cur_blk] >> 2;
516 self.blocks[blk_idx].coded = false;
523 let mut brun = BitRunDecoder::new(br, read_short_run)?;
525 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()) {
526 let nblks = *nblk as usize;
527 if *sb == SBState::Partial {
529 let blk_idx = self.blk_addr[cur_blk] >> 2;
530 self.blocks[blk_idx].coded = brun.get_val(br)?;
540 fn vp31_unpack_mb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
541 let mut modes = [VPMBType::InterNoMV; 8];
542 let alphabet = br.read(3)? as usize;
543 let raw_modes = alphabet >= 7;
545 for mode in VP31_DEFAULT_MB_MODES.iter() {
546 modes[br.read(3)? as usize] = *mode;
548 } else if alphabet < 7 {
549 modes.copy_from_slice(&VP31_MB_MODES[alphabet - 1]);
553 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()).take(self.y_sbs) {
554 let nblks = *nblk as usize;
555 if *sb == SBState::Uncoded {
557 self.blocks[self.blk_addr[cur_blk] >> 2].btype = VPMBType::InterNoMV;
561 for _ in 0..nblks/4 {
562 let mut coded = *sb == SBState::Coded;
565 if self.blocks[self.blk_addr[cur_blk + blk] >> 2].coded {
571 let mode = if !coded {
573 } else if !raw_modes {
574 let code = br.read_code(UintCodeType::LimitedUnary(7, 0))?;
577 VP31_DEFAULT_MB_MODES[br.read(3)? as usize]
580 self.blocks[self.blk_addr[cur_blk] >> 2].btype = mode;
586 // replicate types for chroma
588 let mut off_u = self.y_blocks;
589 let mut off_v = off_u + self.mb_w * self.mb_h;
590 for _blk_y in 0..self.mb_h {
591 for blk_x in 0..self.mb_w {
592 let btype = self.blocks[off_y + blk_x * 2].btype;
593 self.blocks[off_u + blk_x].btype = btype;
594 self.blocks[off_v + blk_x].btype = btype;
596 off_y += self.mb_w * 2 * 2;
602 fn vp31_unpack_mv_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
603 let mut last_mv = ZERO_MV;
604 let mut last2_mv = ZERO_MV;
605 let read_mv = if br.read_bool()? { read_mv_raw } else { read_mv_packed };
608 for _ in 0..self.y_blocks/4 {
609 if self.blocks[self.blk_addr[cur_blk] >> 2].btype == VPMBType::InterFourMV {
611 let blk = &mut self.blocks[self.blk_addr[cur_blk] >> 2];
613 blk.mv = (read_mv)(br)?;
621 match self.blocks[self.blk_addr[cur_blk] >> 2].btype {
622 VPMBType::Intra | VPMBType::InterNoMV | VPMBType::GoldenNoMV => {
625 VPMBType::InterMV => {
626 cur_mv = (read_mv)(br)?;
630 VPMBType::InterNearest => {
633 VPMBType::InterNear => {
635 std::mem::swap(&mut last_mv, &mut last2_mv);
638 cur_mv = (read_mv)(br)?;
642 self.blocks[self.blk_addr[cur_blk] >> 2].mv = cur_mv;
649 fn vp31_unpack_coeffs(&mut self, br: &mut BitReader, coef_no: usize, table_y: usize, table_c: usize) -> DecoderResult<()> {
650 if let Codes::VP31(ref codes) = self.codes {
651 let cbs = if coef_no == 0 {
652 [&codes.dc_cb[table_y], &codes.dc_cb[table_c]]
653 } else if coef_no < 6 {
654 [&codes.ac0_cb[table_y], &codes.ac0_cb[table_c]]
655 } else if coef_no < 15 {
656 [&codes.ac1_cb[table_y], &codes.ac1_cb[table_c]]
657 } else if coef_no < 28 {
658 [&codes.ac2_cb[table_y], &codes.ac2_cb[table_c]]
660 [&codes.ac3_cb[table_y], &codes.ac3_cb[table_c]]
662 for blkaddr in self.blk_addr.iter() {
663 let blk: &mut Block = &mut self.blocks[blkaddr >> 2];
664 if !blk.coded || blk.idx != coef_no { continue; }
665 if self.eob_run > 0 {
670 let cb = if (blkaddr & 3) == 0 { cbs[0] } else { cbs[1] };
671 let token = br.read_cb(cb)?;
672 expand_token(blk, br, &mut self.eob_run, coef_no, token)?;
676 Err(DecoderError::Bug)
679 fn decode_vp31(&mut self, br: &mut BitReader, frm: &mut NASimpleVideoFrame<u8>) -> DecoderResult<()> {
680 for blk in self.blocks.iter_mut() {
681 blk.coeffs = [0; 64];
687 for sb in self.sb_info.iter_mut() { *sb = SBState::Coded; }
688 for blk in self.blocks.iter_mut() {
689 blk.btype = VPMBType::Intra;
693 if self.shuf.get_last().is_none() || self.shuf.get_golden().is_none() {
694 return Err(DecoderError::MissingReference);
696 self.vp31_unpack_sb_info(br)?;
697 self.vp31_unpack_mb_info(br)?;
698 self.vp31_unpack_mv_info(br)?;
700 let dc_quant = VP31_DC_SCALES[self.quant];
701 let ac_quant = VP31_AC_SCALES[self.quant];
702 rescale_qmat(&mut self.qmat_y, VP3_QMAT_Y, dc_quant, ac_quant);
703 rescale_qmat(&mut self.qmat_c, VP3_QMAT_C, dc_quant, ac_quant);
704 rescale_qmat(&mut self.qmat_inter, VP3_QMAT_INTER, dc_quant, ac_quant);
707 let dc_table_y = br.read(4)? as usize;
708 let dc_table_c = br.read(4)? as usize;
709 self.vp31_unpack_coeffs(br, 0, dc_table_y, dc_table_c)?;
712 let ac_table_y = br.read(4)? as usize;
713 let ac_table_c = br.read(4)? as usize;
714 for coef_no in 1..64 {
715 self.vp31_unpack_coeffs(br, coef_no, ac_table_y, ac_table_c)?;
719 self.output_blocks_intra(frm);
721 self.output_blocks_inter(frm);
723 if self.loop_str > 0 {
724 self.vp31_loop_filter(frm);
729 fn decode_vp4(&mut self) -> DecoderResult<()> {
732 fn predict_dc(&self, bx: usize, by: usize, bw: usize, blk_idx: usize) -> i16 {
733 let mut preds = [0i32; 4];
734 let mut pp: usize = 0;
735 let ref_id = self.blocks[blk_idx].btype.get_ref_id();
736 let is_right = bx == bw - 1;
738 fill_dc_pred!(self, ref_id, preds, pp, 0, blk_idx - 1);
740 fill_dc_pred!(self, ref_id, preds, pp, 1, blk_idx - 1 - bw);
744 fill_dc_pred!(self, ref_id, preds, pp, 2, blk_idx - bw);
746 fill_dc_pred!(self, ref_id, preds, pp, 3, blk_idx + 1 - bw);
749 if pp == 0 { return self.last_dc[ref_id as usize]; }
752 if (pp & (1 << i)) != 0 {
753 pred += (preds[i] as i32) * (VP31_DC_WEIGHTS[pp][i] as i32);
756 pred /= VP31_DC_WEIGHTS[pp][4] as i32;
758 if (pred - preds[2]).abs() > 128 { return preds[2] as i16; }
759 if (pred - preds[0]).abs() > 128 { return preds[0] as i16; }
760 if (pred - preds[1]).abs() > 128 { return preds[1] as i16; }
764 fn restore_dcs(&mut self) {
765 let blk_stride = self.mb_w * 2;
767 self.last_dc = [0; 3];
768 for by in 0..self.mb_h*2 {
769 for bx in 0..self.mb_w*2 {
770 if !self.blocks[blk_idx + bx].coded { continue; }
771 let dc = self.predict_dc(bx, by, self.mb_w*2, blk_idx + bx);
772 self.blocks[blk_idx + bx].coeffs[0] += dc;
773 self.last_dc[self.blocks[blk_idx + bx].btype.get_ref_id() as usize] = self.blocks[blk_idx + bx].coeffs[0];
775 blk_idx += blk_stride;
777 let blk_stride = self.mb_w;
779 self.last_dc = [0; 3];
780 for by in 0..self.mb_h {
781 for bx in 0..self.mb_w {
782 if !self.blocks[blk_idx + bx].coded { continue; }
783 let dc = self.predict_dc(bx, by, self.mb_w, blk_idx + bx);
784 self.blocks[blk_idx + bx].coeffs[0] += dc;
785 self.last_dc[self.blocks[blk_idx + bx].btype.get_ref_id() as usize] = self.blocks[blk_idx + bx].coeffs[0];
787 blk_idx += blk_stride;
791 fn output_blocks_intra(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
792 let mut biter = self.blocks.iter_mut();
793 for by in 0..self.mb_h*2 {
794 for bx in 0..self.mb_w*2 {
795 let mut blk = biter.next().unwrap();
796 let qmat = if blk.btype == VPMBType::Intra { &self.qmat_y } else { &self.qmat_inter };
797 blk.coeffs[0] *= qmat[0];
799 unquant(&mut blk.coeffs, qmat);
800 vp_put_block(&mut blk.coeffs, bx, by, 0, frm);
802 vp_put_block_dc(&mut blk.coeffs, bx, by, 0, frm);
807 for by in 0..self.mb_h {
808 for bx in 0..self.mb_w {
809 let mut blk = biter.next().unwrap();
810 let qmat = if blk.btype == VPMBType::Intra { &self.qmat_c } else { &self.qmat_inter };
811 blk.coeffs[0] *= qmat[0];
813 unquant(&mut blk.coeffs, qmat);
814 vp_put_block(&mut blk.coeffs, bx, by, plane, frm);
816 vp_put_block_dc(&mut blk.coeffs, bx, by, plane, frm);
822 fn output_blocks_inter(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
824 let bstride = self.mb_w * 2;
825 for by in (0..self.mb_h*2).step_by(2) {
826 for bx in (0..self.mb_w*2).step_by(2) {
827 if self.blocks[blk_idx + bx].btype != VPMBType::InterFourMV {
830 let mv_a = self.blocks[blk_idx + bx].mv;
831 let mv_b = self.blocks[blk_idx + bx + 1].mv;
832 let mv_c = self.blocks[blk_idx + bx + bstride].mv;
833 let mv_d = self.blocks[blk_idx + bx + 1 + bstride].mv;
834 let mut mv_sum = mv_a + mv_b + mv_c + mv_d;
835 mv_sum.x = (mv_sum.x + 2) >> 2;
836 mv_sum.y = (mv_sum.y + 2) >> 2;
838 let src = self.shuf.get_last().unwrap();
839 let mode = ((mv_a.x & 1) + (mv_a.y & 1) * 2) as usize;
840 copy_block(frm, src.clone(), 0, bx * 8, by * 8, mv_a.x >> 1, mv_a.y >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
841 let mode = ((mv_b.x & 1) + (mv_b.y & 1) * 2) as usize;
842 copy_block(frm, src.clone(), 0, bx * 8 + 8, by * 8, mv_b.x >> 1, mv_b.y >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
843 let mode = ((mv_c.x & 1) + (mv_c.y & 1) * 2) as usize;
844 copy_block(frm, src.clone(), 0, bx * 8, by * 8 + 8, mv_c.x >> 1, mv_c.y >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
845 let mode = ((mv_d.x & 1) + (mv_d.y & 1) * 2) as usize;
846 copy_block(frm, src.clone(), 0, bx * 8 + 8, by * 8 + 8, mv_d.x >> 1, mv_d.y >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
848 let mx = (mv_sum.x >> 1) | (mv_sum.x & 1);
849 let my = (mv_sum.y >> 1) | (mv_sum.y & 1);
850 let mode = ((mx & 1) + (my & 1) * 2) as usize;
851 copy_block(frm, src.clone(), 1, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
852 copy_block(frm, src.clone(), 2, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
854 blk_idx += bstride * 2;
857 let mut biter = self.blocks.iter_mut();
858 for by in 0..self.mb_h*2 {
859 for bx in 0..self.mb_w*2 {
860 let mut blk = biter.next().unwrap();
861 // do MC for whole macroblock
862 if !blk.btype.is_intra() && (((bx | by) & 1) == 0) && (blk.btype != VPMBType::InterFourMV) {
863 let src = if blk.btype.get_ref_id() == 1 {
864 self.shuf.get_last().unwrap()
866 self.shuf.get_golden().unwrap()
868 let mode = ((blk.mv.x & 1) + (blk.mv.y & 1) * 2) as usize;
869 copy_block(frm, src.clone(), 0, bx * 8, by * 8, blk.mv.x >> 1, blk.mv.y >> 1, 16, 16, 0, 1, mode, VP3_INTERP_FUNCS);
870 let mx = (blk.mv.x >> 1) | (blk.mv.x & 1);
871 let my = (blk.mv.y >> 1) | (blk.mv.y & 1);
872 let mode = ((mx & 1) + (my & 1) * 2) as usize;
873 copy_block(frm, src.clone(), 1, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
874 copy_block(frm, src.clone(), 2, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
876 let qmat = if blk.btype.is_intra() { &self.qmat_y } else { &self.qmat_inter };
877 blk.coeffs[0] *= qmat[0];
879 unquant(&mut blk.coeffs, qmat);
881 if blk.btype.is_intra() {
883 copy_block(frm, self.shuf.get_last().unwrap(), 0, bx * 8, by * 8, 0, 0, 8, 8, 0, 1, 0, VP3_INTERP_FUNCS);
884 } else if blk.has_ac {
885 vp_put_block(&mut blk.coeffs, bx, by, 0, frm);
887 vp_put_block_dc(&mut blk.coeffs, bx, by, 0, frm);
889 } else if blk.coded {
891 vp_add_block(&mut blk.coeffs, bx, by, 0, frm);
893 vp_add_block_dc(&mut blk.coeffs, bx, by, 0, frm);
899 for by in 0..self.mb_h {
900 for bx in 0..self.mb_w {
901 let mut blk = biter.next().unwrap();
902 let qmat = if blk.btype.is_intra() { &self.qmat_c } else { &self.qmat_inter };
903 blk.coeffs[0] *= qmat[0];
905 unquant(&mut blk.coeffs, qmat);
907 if blk.btype.is_intra() {
909 copy_block(frm, self.shuf.get_last().unwrap(), plane, bx * 8, by * 8, 0, 0, 8, 8, 0, 1, 0, VP3_INTERP_FUNCS);
910 } else if blk.has_ac {
911 vp_put_block(&mut blk.coeffs, bx, by, plane, frm);
913 vp_put_block_dc(&mut blk.coeffs, bx, by, plane, frm);
915 } else if blk.coded {
917 vp_add_block(&mut blk.coeffs, bx, by, plane, frm);
919 vp_add_block_dc(&mut blk.coeffs, bx, by, plane, frm);
926 fn vp31_loop_filter(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
928 let blk_w = self.mb_w * 2;
929 for by in 0..self.mb_h*2 {
931 let blk = &self.blocks[blk_idx + bx];
932 if (bx > 0) && blk.coded {
933 vp31_loop_filter_v(frm, bx * 8, by * 8, 0, self.loop_str);
935 if (by > 0) && blk.coded {
936 vp31_loop_filter_h(frm, bx * 8, by * 8, 0, self.loop_str);
938 if (bx < blk_w - 1) && !self.blocks[blk_idx + bx + 1].coded {
939 vp31_loop_filter_v(frm, bx * 8 + 8, by * 8, 0, self.loop_str);
941 if (by < self.mb_h * 2 - 1) && !self.blocks[blk_idx + bx + blk_w].coded {
942 vp31_loop_filter_h(frm, bx * 8, by * 8 + 8, 0, self.loop_str);
947 /* for plane in 1..3 {
948 for by in 0..self.mb_h {
949 for bx in 0..self.mb_w {
954 fn generate_block_addr(&mut self) {
955 let sb_w_y = (self.width + 31) >> 5;
956 let sb_h_y = (self.height + 31) >> 5;
957 let sb_w_c = ((self.width >> 1) + 31) >> 5;
958 let sb_h_c = ((self.height >> 1) + 31) >> 5;
959 self.y_sbs = sb_w_y * sb_h_y;
960 let tot_sb = sb_w_y * sb_h_y + 2 * sb_w_c * sb_h_c;
961 let bw = self.width >> 3;
962 let bh = self.height >> 3;
963 let tot_blk = bw * bh * 3 / 2;
964 self.sb_info.resize(tot_sb, SBState::Uncoded);
965 self.sb_blocks = Vec::with_capacity(tot_sb);
966 self.blk_addr = Vec::with_capacity(tot_blk);
967 self.y_blocks = bw * bh;
968 let mut base_idx = 0;
970 let w = if plane > 0 { self.width >> 1 } else { self.width };
971 let h = if plane > 0 { self.height >> 1 } else { self.height };
972 let sb_w = (w + 31) >> 5;
973 let sb_h = (h + 31) >> 5;
979 for blk_no in 0..16 {
980 let bx = x * 4 + HILBERT_ORDER[blk_no][0];
981 let by = y * 4 + HILBERT_ORDER[blk_no][1];
982 if (bx >= blk_w) || (by >= blk_h) { continue; }
983 let idx = base_idx + bx + by * blk_w;
984 self.blk_addr.push(idx * 4 + plane);
987 self.sb_blocks.push(nblocks);
990 base_idx += blk_w * blk_h;
992 self.blocks.resize(tot_blk, Block::new());
996 impl NADecoder for VP34Decoder {
997 fn init(&mut self, supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
998 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
999 let fmt = YUV420_FORMAT;
1000 self.width = vinfo.get_width();
1001 self.height = vinfo.get_height();
1002 validate!(((self.width | self.height) & 15) == 0);
1003 self.mb_w = self.width >> 4;
1004 self.mb_h = self.height >> 4;
1005 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(vinfo.get_width(), vinfo.get_height(), true, fmt));
1006 self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
1007 supp.pool_u8.set_dec_bufs(3);
1008 supp.pool_u8.prealloc_video(NAVideoInfo::new(vinfo.get_width(), vinfo.get_height(), false, fmt), 4)?;
1010 if self.version == 3 {
1011 self.generate_block_addr();
1015 Err(DecoderError::InvalidData)
1018 fn decode(&mut self, supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
1019 let src = pkt.get_buffer();
1020 validate!(src.len() > 0);
1021 let mut br = BitReader::new(&src, src.len(), BitReaderMode::BE);
1023 self.parse_header(&mut br)?;
1028 let ret = supp.pool_u8.get_free();
1030 return Err(DecoderError::AllocError);
1032 let mut buf = ret.unwrap();
1033 let mut dframe = NASimpleVideoFrame::from_video_buf(&mut buf).unwrap();
1034 match self.version {
1035 31 => self.decode_vp31(&mut br, &mut dframe)?,
1036 4 => self.decode_vp4()?,
1037 _ => return Err(DecoderError::Bug),
1041 self.shuf.add_golden_frame(buf.clone());
1043 self.shuf.add_frame(buf.clone());
1045 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::Video(buf));
1046 frm.set_keyframe(self.is_intra);
1047 frm.set_frame_type(if self.is_intra { FrameType::I } else { FrameType::P });
1052 pub fn get_decoder_vp3() -> Box<NADecoder> {
1053 Box::new(VP34Decoder::new(3))
1056 /*pub fn get_decoder_vp4() -> Box<NADecoder> {
1057 Box::new(VP34Decoder::new(4))
1062 use nihav_core::codecs::RegisteredDecoders;
1063 use nihav_core::demuxers::RegisteredDemuxers;
1064 use nihav_core::test::dec_video::*;
1065 use crate::codecs::duck_register_all_codecs;
1066 use nihav_commonfmt::demuxers::generic_register_all_demuxers;
1070 let mut dmx_reg = RegisteredDemuxers::new();
1071 generic_register_all_demuxers(&mut dmx_reg);
1072 let mut dec_reg = RegisteredDecoders::new();
1073 duck_register_all_codecs(&mut dec_reg);
1075 // let file = "assets/Duck/vp30-logo.avi";
1076 let file = "assets/Duck/vp31.avi";
1077 // let file = "assets/Duck/vp31_crash.avi";
1078 // let file = "assets/Duck/01-vp31-0500.avi";
1079 test_file_decoding("avi", file, Some(3), true, false, Some("vp3"), &dmx_reg, &dec_reg);
1085 let mut dmx_reg = RegisteredDemuxers::new();
1086 generic_register_all_demuxers(&mut dmx_reg);
1087 let mut dec_reg = RegisteredDecoders::new();
1088 duck_register_all_codecs(&mut dec_reg);
1090 let file = "assets/Duck/ot171_vp40.avi";
1091 test_file_decoding("avi", file, Some(16), true, false, Some("vp4"), &dmx_reg, &dec_reg);
1095 const HILBERT_ORDER: [[usize; 2]; 16] = [
1096 [ 0, 0 ], [ 1, 0 ], [ 1, 1 ], [ 0, 1 ],
1097 [ 0, 2 ], [ 0, 3 ], [ 1, 3 ], [ 1, 2 ],
1098 [ 2, 2 ], [ 2, 3 ], [ 3, 3 ], [ 3, 2 ],
1099 [ 3, 1 ], [ 2, 1 ], [ 2, 0 ], [ 3, 0 ]
1102 const VP31_LOOP_STRENGTH: [i16; 64] = [
1103 30, 25, 20, 20, 15, 15, 14, 14,
1104 13, 13, 12, 12, 11, 11, 10, 10,
1105 9, 9, 8, 8, 7, 7, 7, 7,
1106 6, 6, 6, 6, 5, 5, 5, 5,
1107 4, 4, 4, 4, 3, 3, 3, 3,
1108 2, 2, 2, 2, 2, 2, 2, 2,
1109 0, 0, 0, 0, 0, 0, 0, 0,
1110 0, 0, 0, 0, 0, 0, 0, 0
1113 const VP31_DEFAULT_MB_MODES: [VPMBType; 8] = [
1114 VPMBType::InterNoMV, VPMBType::Intra, VPMBType::InterMV, VPMBType::InterNearest,
1115 VPMBType::InterNear, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1118 const VP31_MB_MODES: [[VPMBType; 8]; 6] = [
1120 VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterMV, VPMBType::InterNoMV,
1121 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1123 VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterNoMV, VPMBType::InterMV,
1124 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1126 VPMBType::InterNearest, VPMBType::InterMV, VPMBType::InterNear, VPMBType::InterNoMV,
1127 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1129 VPMBType::InterNearest, VPMBType::InterMV, VPMBType::InterNoMV, VPMBType::InterNear,
1130 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1132 VPMBType::InterNoMV, VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterMV,
1133 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1135 VPMBType::InterNoMV, VPMBType::GoldenNoMV, VPMBType::InterNearest, VPMBType::InterNear,
1136 VPMBType::InterMV, VPMBType::Intra, VPMBType::GoldenMV, VPMBType::InterFourMV
1140 const VP3_LITERAL_BASE: [i16; 6] = [ 7, 9, 13, 21, 37, 69 ];
1142 const VP31_AC_SCALES: [i16; 64] = [
1143 500, 450, 400, 370, 340, 310, 285, 265,
1144 245, 225, 210, 195, 185, 180, 170, 160,
1145 150, 145, 135, 130, 125, 115, 110, 107,
1146 100, 96, 93, 89, 85, 82, 75, 74,
1147 70, 68, 64, 60, 57, 56, 52, 50,
1148 49, 45, 44, 43, 40, 38, 37, 35,
1149 33, 32, 30, 29, 28, 25, 24, 22,
1150 21, 19, 18, 17, 15, 13, 12, 10
1153 const VP31_DC_SCALES: [i16; 64] = [
1154 220, 200, 190, 180, 170, 170, 160, 160,
1155 150, 150, 140, 140, 130, 130, 120, 120,
1156 110, 110, 100, 100, 90, 90, 90, 80,
1157 80, 80, 70, 70, 70, 60, 60, 60,
1158 60, 50, 50, 50, 50, 40, 40, 40,
1159 40, 40, 30, 30, 30, 30, 30, 30,
1160 30, 20, 20, 20, 20, 20, 20, 20,
1161 20, 10, 10, 10, 10, 10, 10, 10
1164 const VP3_QMAT_Y: &[i16; 64] = &[
1165 16, 11, 10, 16, 24, 40, 51, 61,
1166 12, 12, 14, 19, 26, 58, 60, 55,
1167 14, 13, 16, 24, 40, 57, 69, 56,
1168 14, 17, 22, 29, 51, 87, 80, 62,
1169 18, 22, 37, 58, 68, 109, 103, 77,
1170 24, 35, 55, 64, 81, 104, 113, 92,
1171 49, 64, 78, 87, 103, 121, 120, 101,
1172 72, 92, 95, 98, 112, 100, 103, 99
1175 const VP3_QMAT_C: &[i16; 64] = &[
1176 17, 18, 24, 47, 99, 99, 99, 99,
1177 18, 21, 26, 66, 99, 99, 99, 99,
1178 24, 26, 56, 99, 99, 99, 99, 99,
1179 47, 66, 99, 99, 99, 99, 99, 99,
1180 99, 99, 99, 99, 99, 99, 99, 99,
1181 99, 99, 99, 99, 99, 99, 99, 99,
1182 99, 99, 99, 99, 99, 99, 99, 99,
1183 99, 99, 99, 99, 99, 99, 99, 99
1186 const VP3_QMAT_INTER: &[i16; 64] = &[
1187 16, 16, 16, 20, 24, 28, 32, 40,
1188 16, 16, 20, 24, 28, 32, 40, 48,
1189 16, 20, 24, 28, 32, 40, 48, 64,
1190 20, 24, 28, 32, 40, 48, 64, 64,
1191 24, 28, 32, 40, 48, 64, 64, 64,
1192 28, 32, 40, 48, 64, 64, 64, 96,
1193 32, 40, 48, 64, 64, 64, 96, 128,
1194 40, 48, 64, 64, 64, 96, 128, 128
1197 const ZIGZAG: [usize; 64] = [
1198 0, 1, 8, 16, 9, 2, 3, 10,
1199 17, 24, 32, 25, 18, 11, 4, 5,
1200 12, 19, 26, 33, 40, 48, 41, 34,
1201 27, 20, 13, 6, 7, 14, 21, 28,
1202 35, 42, 49, 56, 57, 50, 43, 36,
1203 29, 22, 15, 23, 30, 37, 44, 51,
1204 58, 59, 52, 45, 38, 31, 39, 46,
1205 53, 60, 61, 54, 47, 55, 62, 63
1208 const VP31_DC_CODES: [[u16; 32]; 16] = [
1210 0x002D, 0x0026, 0x0166, 0x004E, 0x02CE, 0x059E, 0x027D, 0x0008,
1211 0x04F9, 0x000F, 0x000E, 0x001B, 0x0006, 0x0008, 0x0005, 0x001A,
1212 0x0015, 0x0007, 0x000C, 0x0001, 0x0000, 0x0009, 0x0017, 0x0029,
1213 0x0028, 0x00B2, 0x04F8, 0x059F, 0x009E, 0x013F, 0x0012, 0x0058,
1215 0x0010, 0x0047, 0x01FF, 0x008C, 0x03FC, 0x046A, 0x0469, 0x0022,
1216 0x11A1, 0x000E, 0x000D, 0x0004, 0x0005, 0x0009, 0x0006, 0x001E,
1217 0x0016, 0x0007, 0x000C, 0x0001, 0x0000, 0x000A, 0x0017, 0x007D,
1218 0x007E, 0x011B, 0x08D1, 0x03FD, 0x046B, 0x11A0, 0x007C, 0x00FE,
1220 0x0016, 0x0020, 0x0086, 0x0087, 0x0367, 0x06CC, 0x06CB, 0x006E,
1221 0x366D, 0x000F, 0x000E, 0x0004, 0x0005, 0x000A, 0x0006, 0x001A,
1222 0x0011, 0x0007, 0x000C, 0x0001, 0x0000, 0x0009, 0x0017, 0x006F,
1223 0x006D, 0x0364, 0x0D9A, 0x06CA, 0x1B37, 0x366C, 0x0042, 0x00D8,
1225 0x0000, 0x002D, 0x00F7, 0x0058, 0x0167, 0x02CB, 0x02CA, 0x000E,
1226 0x1661, 0x0003, 0x0002, 0x0008, 0x0009, 0x000D, 0x0002, 0x001F,
1227 0x0017, 0x0001, 0x000C, 0x000E, 0x000A, 0x0006, 0x0078, 0x000F,
1228 0x007A, 0x0164, 0x0599, 0x02CD, 0x0B31, 0x1660, 0x0079, 0x00F6,
1230 0x0003, 0x003C, 0x000F, 0x007A, 0x001D, 0x0020, 0x0072, 0x0006,
1231 0x0399, 0x0004, 0x0005, 0x0005, 0x0006, 0x000E, 0x0004, 0x0000,
1232 0x0019, 0x0002, 0x000D, 0x0007, 0x001F, 0x0030, 0x0011, 0x0031,
1233 0x0005, 0x0021, 0x00E7, 0x0038, 0x01CD, 0x0398, 0x007B, 0x0009,
1235 0x0009, 0x0002, 0x0074, 0x0007, 0x00EC, 0x00D1, 0x01A6, 0x0006,
1236 0x0D21, 0x0005, 0x0006, 0x0008, 0x0007, 0x000F, 0x0004, 0x0000,
1237 0x001C, 0x0002, 0x0005, 0x0003, 0x000C, 0x0035, 0x01A7, 0x001B,
1238 0x0077, 0x01A5, 0x0349, 0x00D0, 0x0691, 0x0D20, 0x0075, 0x00ED,
1240 0x000A, 0x000C, 0x0012, 0x001B, 0x00B7, 0x016C, 0x0099, 0x005A,
1241 0x16D8, 0x0007, 0x0006, 0x0009, 0x0008, 0x0000, 0x0005, 0x0017,
1242 0x000E, 0x0002, 0x0003, 0x000F, 0x001A, 0x004D, 0x2DB3, 0x002C,
1243 0x0011, 0x02DA, 0x05B7, 0x0098, 0x0B6D, 0x2DB2, 0x0010, 0x0027,
1245 0x000D, 0x000F, 0x001D, 0x0008, 0x0051, 0x0056, 0x00AF, 0x002A,
1246 0x148A, 0x0007, 0x0000, 0x0008, 0x0009, 0x000C, 0x0006, 0x0017,
1247 0x000B, 0x0016, 0x0015, 0x0009, 0x0050, 0x00AE, 0x2917, 0x001C,
1248 0x0014, 0x0290, 0x0523, 0x0149, 0x0A44, 0x2916, 0x0053, 0x00A5,
1250 0x0001, 0x001D, 0x00F5, 0x00F4, 0x024D, 0x0499, 0x0498, 0x0001,
1251 0x0021, 0x0006, 0x0005, 0x0006, 0x0005, 0x0002, 0x0007, 0x0025,
1252 0x007B, 0x001C, 0x0020, 0x000D, 0x0048, 0x0092, 0x0127, 0x000E,
1253 0x0004, 0x0011, 0x000C, 0x003C, 0x000F, 0x0000, 0x001F, 0x0013,
1255 0x0005, 0x003C, 0x0040, 0x000D, 0x0031, 0x0061, 0x0060, 0x0002,
1256 0x00F5, 0x0006, 0x0005, 0x0007, 0x0006, 0x0002, 0x0009, 0x0025,
1257 0x0007, 0x0021, 0x0024, 0x0010, 0x0041, 0x00F4, 0x0019, 0x000E,
1258 0x0003, 0x0011, 0x0011, 0x003F, 0x003E, 0x007B, 0x0000, 0x0013,
1260 0x000A, 0x0007, 0x0001, 0x0009, 0x0131, 0x0261, 0x0260, 0x0015,
1261 0x0001, 0x0007, 0x0006, 0x0008, 0x0007, 0x0006, 0x0012, 0x002F,
1262 0x0014, 0x0027, 0x002D, 0x0016, 0x004D, 0x0099, 0x0000, 0x0004,
1263 0x0001, 0x0005, 0x0017, 0x002E, 0x002C, 0x0008, 0x0006, 0x0001,
1265 0x0000, 0x000E, 0x0017, 0x002A, 0x0010, 0x00F9, 0x00F8, 0x001E,
1266 0x003F, 0x0007, 0x0006, 0x0009, 0x0008, 0x0006, 0x000F, 0x0005,
1267 0x0016, 0x0029, 0x002B, 0x0015, 0x0050, 0x0011, 0x007D, 0x0004,
1268 0x0017, 0x0006, 0x0014, 0x002C, 0x002D, 0x000E, 0x0009, 0x0051,
1270 0x0002, 0x0018, 0x002F, 0x000D, 0x0053, 0x0295, 0x0294, 0x00A4,
1271 0x007C, 0x0000, 0x0007, 0x0009, 0x0008, 0x001B, 0x000C, 0x0028,
1272 0x006A, 0x001E, 0x001D, 0x0069, 0x00D7, 0x007D, 0x014B, 0x0019,
1273 0x0016, 0x002E, 0x001C, 0x002B, 0x002A, 0x0068, 0x003F, 0x00D6,
1275 0x0002, 0x001B, 0x000C, 0x0018, 0x0029, 0x007F, 0x02F0, 0x0198,
1276 0x0179, 0x0000, 0x0007, 0x0009, 0x0008, 0x001A, 0x000D, 0x002A,
1277 0x0064, 0x001E, 0x0067, 0x005F, 0x00CD, 0x007E, 0x02F1, 0x0016,
1278 0x000E, 0x002E, 0x0065, 0x002B, 0x0028, 0x003E, 0x00BD, 0x0199,
1280 0x0002, 0x0007, 0x0016, 0x0006, 0x0036, 0x005C, 0x015D, 0x015C,
1281 0x02BF, 0x0000, 0x0007, 0x0009, 0x0008, 0x0018, 0x0034, 0x002A,
1282 0x005E, 0x006A, 0x0064, 0x005D, 0x00CB, 0x00AD, 0x02BE, 0x0014,
1283 0x0033, 0x006E, 0x005F, 0x006F, 0x006B, 0x00CA, 0x00AC, 0x015E,
1285 0x000F, 0x001D, 0x0018, 0x000B, 0x0019, 0x0029, 0x00D6, 0x0551,
1286 0x0AA1, 0x0001, 0x0000, 0x0009, 0x0008, 0x001B, 0x0038, 0x0028,
1287 0x0057, 0x006A, 0x0068, 0x0056, 0x00E5, 0x0155, 0x0AA0, 0x0073,
1288 0x0069, 0x00D7, 0x00AB, 0x00E4, 0x00A9, 0x0151, 0x0150, 0x02A9,
1292 const VP31_DC_BITS: [[u8; 32]; 16] = [
1294 6, 7, 9, 8, 10, 11, 11, 5, 12, 4, 4, 5, 4, 4, 4, 5,
1295 5, 4, 4, 3, 3, 4, 5, 6, 6, 8, 12, 11, 9, 10, 6, 7,
1297 5, 7, 9, 8, 10, 11, 11, 6, 13, 4, 4, 4, 4, 4, 4, 5,
1298 5, 4, 4, 3, 3, 4, 5, 7, 7, 9, 12, 10, 11, 13, 7, 8,
1300 5, 6, 8, 8, 10, 11, 11, 7, 14, 4, 4, 4, 4, 4, 4, 5,
1301 5, 4, 4, 3, 3, 4, 5, 7, 7, 10, 12, 11, 13, 14, 7, 8,
1303 4, 6, 8, 7, 9, 10, 10, 6, 13, 3, 3, 4, 4, 4, 4, 5,
1304 5, 4, 4, 4, 4, 5, 7, 6, 7, 9, 11, 10, 12, 13, 7, 8,
1306 4, 6, 7, 7, 8, 9, 10, 6, 13, 3, 3, 4, 4, 4, 4, 4,
1307 5, 4, 4, 4, 5, 6, 8, 6, 6, 9, 11, 9, 12, 13, 7, 7,
1309 4, 5, 7, 6, 8, 9, 10, 6, 13, 3, 3, 4, 4, 4, 4, 4,
1310 5, 4, 4, 4, 5, 7, 10, 6, 7, 10, 11, 9, 12, 13, 7, 8,
1312 4, 5, 6, 6, 8, 9, 9, 7, 13, 3, 3, 4, 4, 3, 4, 5,
1313 5, 4, 4, 5, 6, 8, 14, 6, 6, 10, 11, 9, 12, 14, 6, 7,
1315 4, 5, 6, 5, 7, 8, 9, 7, 13, 3, 2, 4, 4, 4, 4, 5,
1316 5, 5, 5, 5, 7, 9, 14, 6, 6, 10, 11, 9, 12, 14, 7, 8,
1318 4, 6, 8, 8, 10, 11, 11, 5, 6, 3, 3, 4, 4, 4, 5, 6,
1319 7, 6, 6, 6, 7, 8, 9, 4, 4, 5, 6, 6, 5, 5, 5, 5,
1321 4, 6, 7, 7, 9, 10, 10, 5, 8, 3, 3, 4, 4, 4, 5, 6,
1322 6, 6, 6, 6, 7, 8, 8, 4, 4, 5, 6, 6, 6, 7, 4, 5,
1324 4, 5, 6, 6, 9, 10, 10, 6, 7, 3, 3, 4, 4, 4, 5, 6,
1325 6, 6, 6, 6, 7, 8, 7, 4, 4, 5, 6, 6, 6, 6, 5, 5,
1327 3, 5, 6, 6, 7, 10, 10, 7, 8, 3, 3, 4, 4, 4, 5, 5,
1328 6, 6, 6, 6, 7, 7, 9, 4, 5, 5, 6, 6, 6, 6, 6, 7,
1330 3, 5, 6, 5, 7, 10, 10, 8, 8, 2, 3, 4, 4, 5, 5, 6,
1331 7, 6, 6, 7, 8, 8, 9, 5, 5, 6, 6, 6, 6, 7, 7, 8,
1333 3, 5, 5, 5, 6, 8, 10, 9, 9, 2, 3, 4, 4, 5, 5, 6,
1334 7, 6, 7, 7, 8, 8, 10, 5, 5, 6, 7, 6, 6, 7, 8, 9,
1336 3, 4, 5, 4, 6, 7, 9, 9, 10, 2, 3, 4, 4, 5, 6, 6,
1337 7, 7, 7, 7, 8, 8, 10, 5, 6, 7, 7, 7, 7, 8, 8, 9,
1339 4, 5, 5, 4, 5, 6, 8, 11, 12, 2, 2, 4, 4, 5, 6, 6,
1340 7, 7, 7, 7, 8, 9, 12, 7, 7, 8, 8, 8, 8, 9, 9, 10,
1344 const VP31_AC_CAT0_CODES: [[u16; 32]; 16] = [
1346 0x0008, 0x0025, 0x017A, 0x02F7, 0x0BDB, 0x17B4, 0x2F6B, 0x001D,
1347 0x2F6A, 0x0008, 0x0007, 0x0001, 0x0002, 0x000A, 0x0006, 0x0000,
1348 0x001C, 0x0009, 0x000D, 0x000F, 0x000C, 0x0003, 0x000A, 0x0016,
1349 0x0013, 0x005D, 0x0024, 0x00BC, 0x005C, 0x05EC, 0x000B, 0x005F,
1351 0x000F, 0x0010, 0x004B, 0x00C6, 0x031D, 0x0C71, 0x0C70, 0x0001,
1352 0x0C73, 0x0008, 0x0009, 0x0002, 0x0003, 0x000B, 0x0006, 0x0000,
1353 0x001C, 0x0005, 0x000D, 0x000F, 0x000A, 0x0019, 0x0013, 0x001D,
1354 0x0030, 0x0062, 0x0024, 0x004A, 0x018F, 0x0C72, 0x000E, 0x0011,
1356 0x001B, 0x0003, 0x008D, 0x0040, 0x0239, 0x0471, 0x08E0, 0x0003,
1357 0x11C3, 0x000A, 0x0009, 0x0004, 0x0005, 0x000E, 0x0007, 0x0001,
1358 0x001E, 0x0006, 0x000C, 0x000B, 0x0002, 0x0000, 0x0041, 0x001F,
1359 0x0022, 0x0002, 0x008F, 0x008C, 0x011D, 0x11C2, 0x001A, 0x0021,
1361 0x001F, 0x0003, 0x0003, 0x0043, 0x000B, 0x0015, 0x0051, 0x0003,
1362 0x0050, 0x000D, 0x000C, 0x0004, 0x0006, 0x000E, 0x000A, 0x0001,
1363 0x001E, 0x0005, 0x0009, 0x0007, 0x0011, 0x0002, 0x0004, 0x0002,
1364 0x002D, 0x0020, 0x0042, 0x0001, 0x0000, 0x0029, 0x0017, 0x002C,
1366 0x0003, 0x001F, 0x003A, 0x005D, 0x0173, 0x02E4, 0x172D, 0x0004,
1367 0x172C, 0x000F, 0x000E, 0x0009, 0x0008, 0x000C, 0x000A, 0x0001,
1368 0x0016, 0x0002, 0x0005, 0x001A, 0x002F, 0x0038, 0x05CA, 0x0006,
1369 0x0037, 0x001E, 0x003B, 0x0039, 0x00B8, 0x0B97, 0x0000, 0x0036,
1371 0x0006, 0x0037, 0x005D, 0x000C, 0x00B9, 0x02E3, 0x05C4, 0x0004,
1372 0x1715, 0x0000, 0x000F, 0x0008, 0x0007, 0x000C, 0x0009, 0x001D,
1373 0x0016, 0x001C, 0x001A, 0x000B, 0x005E, 0x0170, 0x1714, 0x000A,
1374 0x000A, 0x0036, 0x005F, 0x001B, 0x001A, 0x0B8B, 0x0002, 0x0007,
1376 0x000C, 0x000B, 0x0079, 0x0022, 0x00F0, 0x0119, 0x0230, 0x001D,
1377 0x08C4, 0x0001, 0x0000, 0x000A, 0x0009, 0x000B, 0x0007, 0x001C,
1378 0x003D, 0x000D, 0x0008, 0x0015, 0x008D, 0x118B, 0x118A, 0x000D,
1379 0x0010, 0x0009, 0x0014, 0x0047, 0x00F1, 0x0463, 0x001F, 0x000C,
1381 0x0000, 0x001A, 0x0033, 0x000C, 0x0046, 0x01E3, 0x03C5, 0x0017,
1382 0x1E21, 0x0002, 0x0001, 0x0009, 0x000A, 0x0007, 0x001B, 0x003D,
1383 0x001B, 0x0022, 0x0079, 0x00F0, 0x1E20, 0x1E23, 0x1E22, 0x000E,
1384 0x0016, 0x0018, 0x0032, 0x001A, 0x0047, 0x0789, 0x001F, 0x0010,
1386 0x001D, 0x0061, 0x004E, 0x009E, 0x027C, 0x09F5, 0x09F4, 0x0003,
1387 0x0060, 0x0000, 0x000F, 0x000B, 0x000A, 0x0009, 0x0005, 0x000D,
1388 0x0031, 0x0008, 0x0038, 0x0012, 0x0026, 0x013F, 0x04FB, 0x000D,
1389 0x0002, 0x000C, 0x0039, 0x001C, 0x000F, 0x001D, 0x0008, 0x0019,
1391 0x0007, 0x0019, 0x00AB, 0x00AA, 0x0119, 0x0461, 0x0460, 0x001B,
1392 0x0047, 0x0001, 0x0000, 0x000C, 0x000B, 0x0009, 0x0005, 0x000D,
1393 0x0035, 0x003D, 0x003C, 0x0018, 0x0022, 0x008D, 0x0231, 0x000E,
1394 0x001F, 0x0009, 0x002B, 0x0010, 0x0034, 0x0054, 0x0008, 0x0014,
1396 0x000C, 0x0005, 0x0008, 0x005B, 0x004D, 0x0131, 0x0261, 0x001A,
1397 0x0012, 0x0000, 0x000F, 0x000A, 0x0009, 0x0006, 0x001B, 0x0006,
1398 0x001C, 0x002C, 0x0015, 0x005A, 0x0027, 0x0099, 0x0260, 0x000E,
1399 0x0004, 0x000F, 0x0007, 0x001D, 0x000B, 0x0014, 0x0008, 0x0017,
1401 0x000F, 0x0013, 0x0075, 0x0024, 0x0095, 0x0251, 0x04A0, 0x0010,
1402 0x00C8, 0x0002, 0x0001, 0x0001, 0x0000, 0x001A, 0x0011, 0x002C,
1403 0x0065, 0x0074, 0x004B, 0x00C9, 0x0129, 0x0943, 0x0942, 0x0003,
1404 0x000A, 0x001C, 0x0018, 0x0033, 0x0017, 0x002D, 0x001B, 0x003B,
1406 0x0003, 0x001A, 0x002D, 0x0038, 0x0028, 0x0395, 0x0E51, 0x0037,
1407 0x00E4, 0x0001, 0x0000, 0x001F, 0x001E, 0x0017, 0x003A, 0x0073,
1408 0x002A, 0x002B, 0x0029, 0x01CB, 0x0729, 0x1CA1, 0x1CA0, 0x0004,
1409 0x000A, 0x0004, 0x0018, 0x0036, 0x000B, 0x002C, 0x0019, 0x003B,
1411 0x0004, 0x0004, 0x003F, 0x0017, 0x0075, 0x01F5, 0x07D1, 0x0017,
1412 0x01F6, 0x0001, 0x0000, 0x001B, 0x001A, 0x000A, 0x0032, 0x0074,
1413 0x00F8, 0x00F9, 0x01F7, 0x03E9, 0x0FA0, 0x1F43, 0x1F42, 0x0003,
1414 0x000A, 0x001E, 0x001C, 0x003B, 0x0018, 0x0016, 0x0016, 0x0033,
1416 0x0004, 0x0007, 0x0018, 0x001E, 0x0036, 0x0031, 0x0177, 0x0077,
1417 0x0176, 0x0001, 0x0000, 0x001A, 0x0019, 0x003A, 0x0019, 0x005C,
1418 0x00BA, 0x0061, 0x00C1, 0x0180, 0x0302, 0x0607, 0x0606, 0x0002,
1419 0x000A, 0x001F, 0x001C, 0x0037, 0x0016, 0x0076, 0x000D, 0x002F,
1421 0x0000, 0x000A, 0x001A, 0x000C, 0x001D, 0x0039, 0x0078, 0x005E,
1422 0x0393, 0x0002, 0x0001, 0x0016, 0x000F, 0x002E, 0x005F, 0x0073,
1423 0x00E5, 0x01C8, 0x0E4A, 0x1C97, 0x1C96, 0x0E49, 0x0E48, 0x0004,
1424 0x0006, 0x001F, 0x001B, 0x001D, 0x0038, 0x0038, 0x003D, 0x0079,
1428 const VP31_AC_CAT0_BITS: [[u8; 32]; 16] = [
1430 5, 7, 9, 10, 12, 13, 14, 5, 14, 4, 4, 4, 4, 4, 4, 4,
1431 5, 4, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 7, 11, 5, 7,
1433 5, 6, 8, 8, 10, 12, 12, 4, 12, 4, 4, 4, 4, 4, 4, 4,
1434 5, 4, 4, 4, 4, 5, 6, 5, 6, 7, 7, 8, 9, 12, 5, 6,
1436 5, 6, 8, 7, 10, 11, 12, 4, 13, 4, 4, 4, 4, 4, 4, 4,
1437 5, 4, 4, 4, 4, 5, 7, 5, 6, 6, 8, 8, 9, 13, 5, 6,
1439 5, 6, 7, 7, 9, 10, 12, 4, 12, 4, 4, 4, 4, 4, 4, 4,
1440 5, 4, 4, 4, 5, 6, 8, 4, 6, 6, 7, 7, 7, 11, 5, 6,
1442 4, 6, 7, 7, 9, 10, 13, 4, 13, 4, 4, 4, 4, 4, 4, 4,
1443 5, 4, 4, 5, 6, 7, 11, 4, 6, 6, 7, 7, 8, 12, 4, 6,
1445 4, 6, 7, 6, 8, 10, 11, 4, 13, 3, 4, 4, 4, 4, 4, 5,
1446 5, 5, 5, 5, 7, 9, 13, 4, 5, 6, 7, 7, 7, 12, 4, 5,
1448 4, 5, 7, 6, 8, 9, 10, 5, 12, 3, 3, 4, 4, 4, 4, 5,
1449 6, 5, 5, 6, 8, 13, 13, 4, 5, 5, 6, 7, 8, 11, 5, 5,
1451 3, 5, 6, 5, 7, 9, 10, 5, 13, 3, 3, 4, 4, 4, 5, 6,
1452 6, 6, 7, 8, 13, 13, 13, 4, 5, 5, 6, 6, 7, 11, 5, 5,
1454 5, 7, 8, 9, 11, 13, 13, 4, 7, 3, 4, 4, 4, 4, 4, 5,
1455 6, 5, 6, 6, 7, 10, 12, 4, 4, 5, 6, 6, 5, 6, 4, 5,
1457 4, 6, 8, 8, 10, 12, 12, 5, 8, 3, 3, 4, 4, 4, 4, 5,
1458 6, 6, 6, 6, 7, 9, 11, 4, 5, 5, 6, 6, 6, 7, 4, 5,
1460 4, 5, 6, 7, 9, 11, 12, 5, 7, 3, 4, 4, 4, 4, 5, 5,
1461 6, 6, 6, 7, 8, 10, 12, 4, 4, 5, 5, 6, 5, 6, 4, 5,
1463 4, 5, 7, 6, 8, 10, 11, 5, 8, 3, 3, 4, 4, 5, 5, 6,
1464 7, 7, 7, 8, 9, 12, 12, 3, 4, 5, 5, 6, 5, 6, 5, 6,
1466 3, 5, 6, 6, 7, 10, 12, 6, 8, 3, 3, 5, 5, 5, 6, 7,
1467 7, 7, 7, 9, 11, 13, 13, 3, 4, 4, 5, 6, 5, 6, 5, 6,
1469 3, 4, 6, 5, 7, 9, 11, 6, 9, 3, 3, 5, 5, 5, 6, 7,
1470 8, 8, 9, 10, 12, 13, 13, 3, 4, 5, 5, 6, 5, 6, 5, 6,
1472 3, 4, 5, 5, 6, 7, 9, 7, 9, 3, 3, 5, 5, 6, 6, 7,
1473 8, 8, 9, 10, 11, 12, 12, 3, 4, 5, 5, 6, 5, 7, 5, 6,
1475 3, 4, 5, 4, 5, 6, 7, 7, 11, 3, 3, 5, 5, 6, 7, 8,
1476 9, 10, 13, 14, 14, 13, 13, 3, 4, 5, 5, 6, 6, 7, 6, 7,
1480 const VP31_AC_CAT1_CODES: [[u16; 32]; 16] = [
1482 0x000B, 0x002B, 0x0054, 0x01B7, 0x06D9, 0x0DB1, 0x0DB0, 0x0002,
1483 0x00AB, 0x0009, 0x000A, 0x0007, 0x0008, 0x000F, 0x000C, 0x0003,
1484 0x001D, 0x0004, 0x000B, 0x0006, 0x001A, 0x0003, 0x00AA, 0x0001,
1485 0x0000, 0x0014, 0x006C, 0x00DA, 0x0002, 0x036D, 0x001C, 0x0037,
1487 0x001D, 0x0004, 0x00B6, 0x006A, 0x05B9, 0x16E1, 0x16E0, 0x0007,
1488 0x016F, 0x000C, 0x000D, 0x0009, 0x0008, 0x000F, 0x000A, 0x0003,
1489 0x0017, 0x0002, 0x0004, 0x001C, 0x002C, 0x006B, 0x0B71, 0x0005,
1490 0x0003, 0x001B, 0x005A, 0x0034, 0x0005, 0x02DD, 0x0000, 0x000C,
1492 0x0003, 0x007F, 0x00A1, 0x00A0, 0x020C, 0x0834, 0x106B, 0x0007,
1493 0x0082, 0x000E, 0x000D, 0x000B, 0x000C, 0x0000, 0x0009, 0x0002,
1494 0x0011, 0x001E, 0x0015, 0x003E, 0x0040, 0x041B, 0x106A, 0x0006,
1495 0x000A, 0x0029, 0x007E, 0x0051, 0x0021, 0x0107, 0x0004, 0x000B,
1497 0x0007, 0x001B, 0x00F6, 0x00E9, 0x03A1, 0x0740, 0x0E82, 0x001F,
1498 0x01EF, 0x0001, 0x0002, 0x000B, 0x000C, 0x000D, 0x0008, 0x001C,
1499 0x0003, 0x0012, 0x0002, 0x0075, 0x01D1, 0x1D07, 0x1D06, 0x000A,
1500 0x0013, 0x003B, 0x001A, 0x007A, 0x003C, 0x01EE, 0x0000, 0x000C,
1502 0x000D, 0x003D, 0x0042, 0x0037, 0x00D9, 0x0362, 0x06C6, 0x001F,
1503 0x0086, 0x0001, 0x0002, 0x000C, 0x000B, 0x000A, 0x0001, 0x000F,
1504 0x0025, 0x003C, 0x001A, 0x0087, 0x01B0, 0x0D8F, 0x0D8E, 0x000E,
1505 0x0013, 0x000C, 0x0024, 0x0020, 0x0011, 0x006D, 0x0000, 0x000E,
1507 0x0000, 0x0012, 0x0076, 0x0077, 0x014D, 0x0533, 0x14C9, 0x0013,
1508 0x00A5, 0x0002, 0x0003, 0x000B, 0x000C, 0x0008, 0x001A, 0x002B,
1509 0x0075, 0x0074, 0x00A7, 0x0298, 0x14C8, 0x14CB, 0x14CA, 0x000F,
1510 0x001C, 0x0007, 0x002A, 0x0028, 0x001B, 0x00A4, 0x0002, 0x0006,
1512 0x0002, 0x001A, 0x002B, 0x003A, 0x00ED, 0x0283, 0x0A0A, 0x0004,
1513 0x00A1, 0x0004, 0x0003, 0x000B, 0x000C, 0x001F, 0x0006, 0x0077,
1514 0x00A3, 0x00A2, 0x0140, 0x1417, 0x1416, 0x0A09, 0x0A08, 0x0000,
1515 0x001E, 0x0007, 0x002A, 0x0029, 0x001C, 0x00EC, 0x001B, 0x0005,
1517 0x0002, 0x0002, 0x0018, 0x001D, 0x0035, 0x00E4, 0x01CF, 0x001D,
1518 0x0072, 0x0004, 0x0005, 0x0006, 0x0007, 0x0006, 0x0073, 0x0038,
1519 0x01CE, 0x039B, 0x0398, 0x0733, 0x0732, 0x0735, 0x0734, 0x0000,
1520 0x001F, 0x001B, 0x0034, 0x000F, 0x001E, 0x00E5, 0x0019, 0x0038,
1522 0x0016, 0x0050, 0x0172, 0x02E7, 0x1732, 0x2E67, 0x2E66, 0x0006,
1523 0x0051, 0x0001, 0x0000, 0x000D, 0x000C, 0x0009, 0x001C, 0x0009,
1524 0x001C, 0x001D, 0x005D, 0x00B8, 0x05CD, 0x1731, 0x1730, 0x000F,
1525 0x0005, 0x000F, 0x0008, 0x0029, 0x001D, 0x002F, 0x0008, 0x0015,
1527 0x0009, 0x0021, 0x0040, 0x00AD, 0x02B0, 0x1589, 0x1588, 0x001C,
1528 0x005F, 0x0000, 0x000F, 0x000D, 0x000C, 0x0006, 0x0011, 0x002A,
1529 0x0057, 0x005E, 0x0041, 0x0159, 0x0563, 0x158B, 0x158A, 0x0001,
1530 0x0005, 0x0014, 0x003B, 0x002E, 0x0004, 0x003A, 0x0007, 0x0016,
1532 0x000E, 0x0007, 0x0046, 0x0045, 0x0064, 0x032A, 0x0657, 0x0018,
1533 0x000D, 0x0000, 0x000F, 0x000A, 0x000B, 0x001A, 0x0036, 0x0047,
1534 0x0044, 0x0018, 0x0033, 0x00CB, 0x0656, 0x0329, 0x0328, 0x0002,
1535 0x0006, 0x0019, 0x000E, 0x0037, 0x0009, 0x000F, 0x0002, 0x0010,
1537 0x0003, 0x0018, 0x0023, 0x0077, 0x0194, 0x1956, 0x32AF, 0x003A,
1538 0x0076, 0x0002, 0x0001, 0x001F, 0x001E, 0x0014, 0x0022, 0x0064,
1539 0x0197, 0x0196, 0x032B, 0x0654, 0x32AE, 0x1955, 0x1954, 0x0000,
1540 0x0009, 0x001C, 0x0015, 0x0010, 0x000D, 0x0017, 0x0016, 0x0033,
1542 0x0005, 0x0006, 0x003E, 0x0010, 0x0048, 0x093F, 0x24FA, 0x0032,
1543 0x0067, 0x0002, 0x0001, 0x001B, 0x001E, 0x0034, 0x0066, 0x0092,
1544 0x0126, 0x024E, 0x049E, 0x49F7, 0x49F6, 0x24F9, 0x24F8, 0x0000,
1545 0x0007, 0x0018, 0x0011, 0x003F, 0x000E, 0x0013, 0x0035, 0x0025,
1547 0x0005, 0x0008, 0x0012, 0x001C, 0x001C, 0x00EA, 0x1D75, 0x001E,
1548 0x0066, 0x0001, 0x0002, 0x001B, 0x001A, 0x001F, 0x003B, 0x0074,
1549 0x01D6, 0x03AF, 0x1D74, 0x1D77, 0x1D76, 0x0EB9, 0x0EB8, 0x000F,
1550 0x0006, 0x0013, 0x003B, 0x003A, 0x0000, 0x0018, 0x0032, 0x0067,
1552 0x0004, 0x000A, 0x001B, 0x000C, 0x000D, 0x00E6, 0x0684, 0x0072,
1553 0x00E7, 0x0002, 0x0001, 0x0017, 0x0016, 0x0018, 0x00D1, 0x01A0,
1554 0x0686, 0x0D0F, 0x0D0A, 0x1A17, 0x1A16, 0x1A1D, 0x1A1C, 0x000F,
1555 0x001D, 0x000E, 0x0035, 0x0038, 0x0000, 0x000F, 0x0019, 0x0069,
1557 0x0003, 0x000C, 0x001B, 0x0000, 0x0003, 0x002E, 0x0051, 0x00BC,
1558 0x0053, 0x0004, 0x0002, 0x0016, 0x0015, 0x0015, 0x0050, 0x00A4,
1559 0x0294, 0x052B, 0x052A, 0x052D, 0x052C, 0x052F, 0x052E, 0x000E,
1560 0x001A, 0x0004, 0x0028, 0x0029, 0x000F, 0x000B, 0x005F, 0x00BD,
1564 const VP31_AC_CAT1_BITS: [[u8; 32]; 16] = [
1566 5, 7, 8, 9, 11, 12, 12, 4, 9, 4, 4, 4, 4, 4, 4, 4,
1567 5, 4, 4, 4, 5, 6, 9, 4, 5, 6, 7, 8, 6, 10, 5, 6,
1569 5, 6, 8, 8, 11, 13, 13, 4, 9, 4, 4, 4, 4, 4, 4, 4,
1570 5, 4, 4, 5, 6, 8, 12, 4, 5, 6, 7, 7, 6, 10, 4, 5,
1572 4, 7, 8, 8, 10, 12, 13, 4, 8, 4, 4, 4, 4, 3, 4, 4,
1573 5, 5, 5, 6, 7, 11, 13, 4, 5, 6, 7, 7, 6, 9, 4, 5,
1575 4, 6, 8, 8, 10, 11, 12, 5, 9, 3, 3, 4, 4, 4, 4, 5,
1576 5, 5, 5, 7, 9, 13, 13, 4, 5, 6, 6, 7, 6, 9, 4, 5,
1578 4, 6, 7, 7, 9, 11, 12, 5, 8, 3, 3, 4, 4, 4, 4, 5,
1579 6, 6, 6, 8, 10, 13, 13, 4, 5, 5, 6, 6, 5, 8, 4, 5,
1581 3, 5, 7, 7, 9, 11, 13, 5, 8, 3, 3, 4, 4, 4, 5, 6,
1582 7, 7, 8, 10, 13, 13, 13, 4, 5, 5, 6, 6, 5, 8, 4, 5,
1584 3, 5, 6, 6, 8, 10, 12, 5, 8, 3, 3, 4, 4, 5, 5, 7,
1585 8, 8, 9, 13, 13, 12, 12, 3, 5, 5, 6, 6, 5, 8, 5, 5,
1587 3, 4, 5, 5, 6, 8, 11, 7, 9, 3, 3, 4, 4, 5, 7, 8,
1588 11, 12, 12, 13, 13, 13, 13, 3, 5, 5, 6, 6, 5, 8, 5, 6,
1590 5, 7, 9, 10, 13, 14, 14, 4, 7, 3, 3, 4, 4, 4, 5, 5,
1591 6, 6, 7, 8, 11, 13, 13, 4, 4, 5, 5, 6, 5, 6, 4, 5,
1593 4, 6, 7, 8, 10, 13, 13, 5, 7, 3, 4, 4, 4, 4, 5, 6,
1594 7, 7, 7, 9, 11, 13, 13, 3, 4, 5, 6, 6, 4, 6, 4, 5,
1596 4, 5, 7, 7, 9, 12, 13, 5, 6, 3, 4, 4, 4, 5, 6, 7,
1597 7, 7, 8, 10, 13, 12, 12, 3, 4, 5, 5, 6, 4, 5, 4, 5,
1599 3, 5, 6, 7, 9, 13, 14, 6, 7, 3, 3, 5, 5, 5, 6, 7,
1600 9, 9, 10, 11, 14, 13, 13, 3, 4, 5, 5, 5, 4, 5, 5, 6,
1602 3, 4, 6, 5, 7, 12, 14, 6, 7, 3, 3, 5, 5, 6, 7, 8,
1603 9, 10, 11, 15, 15, 14, 14, 3, 4, 5, 5, 6, 4, 5, 6, 6,
1605 3, 4, 5, 5, 6, 9, 14, 6, 7, 3, 3, 5, 5, 6, 7, 8,
1606 10, 11, 14, 14, 14, 13, 13, 4, 4, 5, 6, 6, 3, 5, 6, 7,
1608 3, 4, 5, 4, 5, 8, 11, 7, 8, 3, 3, 5, 5, 6, 8, 9,
1609 11, 12, 12, 13, 13, 13, 13, 4, 5, 5, 6, 6, 3, 5, 6, 7,
1611 3, 4, 5, 3, 4, 6, 9, 8, 9, 3, 3, 5, 5, 7, 9, 10,
1612 12, 13, 13, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 6, 7, 8,
1616 const VP31_AC_CAT2_CODES: [[u16; 32]; 16] = [
1618 0x0003, 0x0009, 0x00D0, 0x01A3, 0x0344, 0x0D14, 0x1A2B, 0x0004,
1619 0x0015, 0x0000, 0x000F, 0x000B, 0x000C, 0x000E, 0x0009, 0x001B,
1620 0x000A, 0x0014, 0x000D, 0x002A, 0x0014, 0x068B, 0x1A2A, 0x0008,
1621 0x000B, 0x002B, 0x000B, 0x0069, 0x0035, 0x0008, 0x0007, 0x000C,
1623 0x000A, 0x003C, 0x0032, 0x0030, 0x00C5, 0x0621, 0x0620, 0x001F,
1624 0x0033, 0x0001, 0x0000, 0x000E, 0x000D, 0x000C, 0x0004, 0x000D,
1625 0x0026, 0x0027, 0x0014, 0x0063, 0x0189, 0x0623, 0x0622, 0x000B,
1626 0x0012, 0x003D, 0x0022, 0x0015, 0x000B, 0x0023, 0x0007, 0x0010,
1628 0x000F, 0x000C, 0x0043, 0x0010, 0x0044, 0x0114, 0x0455, 0x0018,
1629 0x0023, 0x0001, 0x0000, 0x000E, 0x000D, 0x0009, 0x0019, 0x0009,
1630 0x0017, 0x0016, 0x0042, 0x008B, 0x0454, 0x0457, 0x0456, 0x000B,
1631 0x0015, 0x000A, 0x0029, 0x0020, 0x000D, 0x0028, 0x0007, 0x0011,
1633 0x0001, 0x001A, 0x0029, 0x002A, 0x00A0, 0x0285, 0x1425, 0x0002,
1634 0x0000, 0x0002, 0x0003, 0x000C, 0x000B, 0x0008, 0x0012, 0x0001,
1635 0x0051, 0x0001, 0x0143, 0x0508, 0x1424, 0x1427, 0x1426, 0x000F,
1636 0x001C, 0x0003, 0x0037, 0x002B, 0x0013, 0x0036, 0x001D, 0x0001,
1638 0x0004, 0x001F, 0x003D, 0x0006, 0x0016, 0x0053, 0x014A, 0x0034,
1639 0x002A, 0x0002, 0x0003, 0x000B, 0x000C, 0x001C, 0x0037, 0x0017,
1640 0x002B, 0x0028, 0x00A4, 0x052D, 0x052C, 0x052F, 0x052E, 0x0000,
1641 0x001D, 0x0007, 0x0004, 0x0035, 0x0014, 0x0036, 0x0015, 0x003C,
1643 0x0004, 0x000A, 0x0007, 0x001D, 0x0009, 0x01F3, 0x07C7, 0x0008,
1644 0x01F0, 0x0003, 0x0002, 0x000D, 0x000C, 0x0017, 0x007D, 0x01F2,
1645 0x07C6, 0x07C5, 0x1F12, 0x3E27, 0x3E26, 0x1F11, 0x1F10, 0x0000,
1646 0x001E, 0x0006, 0x0039, 0x0038, 0x003F, 0x002C, 0x0005, 0x002D,
1648 0x0002, 0x0007, 0x0018, 0x0003, 0x0005, 0x0035, 0x004F, 0x0012,
1649 0x04E5, 0x0005, 0x0004, 0x000D, 0x000E, 0x0033, 0x0026, 0x009D,
1650 0x04E4, 0x04E7, 0x04E6, 0x04E1, 0x04E0, 0x04E3, 0x04E2, 0x0000,
1651 0x001F, 0x000C, 0x003D, 0x003C, 0x0032, 0x0034, 0x001B, 0x0008,
1653 0x0000, 0x0004, 0x001C, 0x000F, 0x0002, 0x0007, 0x0075, 0x00E8,
1654 0x1D2A, 0x0005, 0x0004, 0x000D, 0x000C, 0x0077, 0x0E96, 0x3A57,
1655 0x3A56, 0x3A5D, 0x3A5C, 0x3A5F, 0x3A5E, 0x1D29, 0x1D28, 0x0003,
1656 0x0006, 0x000A, 0x002C, 0x0017, 0x0076, 0x01D3, 0x03A4, 0x002D,
1658 0x000A, 0x0024, 0x00BF, 0x0085, 0x0211, 0x0842, 0x1087, 0x0018,
1659 0x0020, 0x0001, 0x0002, 0x000E, 0x000D, 0x0007, 0x0013, 0x0025,
1660 0x005E, 0x0043, 0x00BE, 0x0109, 0x1086, 0x0841, 0x0840, 0x000F,
1661 0x0001, 0x0011, 0x0000, 0x002E, 0x0019, 0x0001, 0x0006, 0x0016,
1663 0x0002, 0x000F, 0x006F, 0x0061, 0x0374, 0x1BA8, 0x3753, 0x0012,
1664 0x0036, 0x0000, 0x0001, 0x000A, 0x000B, 0x001A, 0x0031, 0x0060,
1665 0x00DC, 0x01BB, 0x06EB, 0x1BAB, 0x3752, 0x3755, 0x3754, 0x000E,
1666 0x0006, 0x0013, 0x000E, 0x003E, 0x0008, 0x001E, 0x0019, 0x003F,
1668 0x0003, 0x001C, 0x0025, 0x0024, 0x01DA, 0x1DBD, 0x3B7C, 0x003C,
1669 0x003D, 0x0000, 0x0001, 0x000B, 0x000A, 0x000B, 0x0077, 0x00EC,
1670 0x03B6, 0x076E, 0x1DBF, 0x76FB, 0x76FA, 0x3B79, 0x3B78, 0x000D,
1671 0x001F, 0x0013, 0x000A, 0x0008, 0x000C, 0x0008, 0x0009, 0x003A,
1673 0x0005, 0x0003, 0x0004, 0x0010, 0x008F, 0x0475, 0x11D1, 0x0079,
1674 0x0027, 0x0002, 0x0003, 0x0001, 0x0000, 0x0026, 0x0046, 0x011C,
1675 0x0477, 0x08ED, 0x11D0, 0x11D3, 0x11D2, 0x11D9, 0x11D8, 0x000D,
1676 0x001F, 0x0012, 0x0005, 0x003D, 0x000C, 0x000E, 0x0022, 0x0078,
1678 0x0005, 0x000C, 0x001B, 0x0000, 0x0006, 0x03E2, 0x3E3D, 0x000F,
1679 0x0034, 0x0003, 0x0002, 0x001E, 0x001D, 0x007D, 0x01F0, 0x07C6,
1680 0x3E3C, 0x3E3F, 0x3E3E, 0x3E39, 0x3E38, 0x3E3B, 0x3E3A, 0x0008,
1681 0x001C, 0x0002, 0x003F, 0x0035, 0x0009, 0x0001, 0x000E, 0x00F9,
1683 0x0004, 0x000B, 0x0001, 0x000A, 0x001E, 0x00E0, 0x0E1E, 0x0071,
1684 0x0039, 0x0007, 0x0006, 0x000D, 0x000C, 0x0020, 0x01C2, 0x1C3F,
1685 0x1C3E, 0x0E19, 0x0E18, 0x0E1B, 0x0E1A, 0x0E1D, 0x0E1C, 0x0000,
1686 0x0009, 0x001D, 0x001F, 0x0011, 0x0005, 0x0001, 0x0043, 0x0042,
1688 0x0004, 0x000D, 0x0007, 0x0002, 0x0014, 0x016C, 0x16D1, 0x02DF,
1689 0x016E, 0x0000, 0x0007, 0x002C, 0x002B, 0x02DE, 0x16D0, 0x16D3,
1690 0x16D2, 0x2DB5, 0x2DB4, 0x2DB7, 0x2DB6, 0x16D9, 0x16D8, 0x000C,
1691 0x002A, 0x005A, 0x001B, 0x001A, 0x0017, 0x000C, 0x05B7, 0x05B5,
1693 0x0002, 0x000F, 0x001C, 0x000C, 0x003B, 0x01AC, 0x1AD8, 0x35B3,
1694 0x35B2, 0x0001, 0x0000, 0x0069, 0x0068, 0x35BD, 0x35BC, 0x35BF,
1695 0x35BE, 0x35B9, 0x35B8, 0x35BB, 0x35BA, 0x35B5, 0x35B4, 0x01A9,
1696 0x01A8, 0x035A, 0x00D7, 0x00D5, 0x003A, 0x001B, 0x35B7, 0x35B6,
1700 const VP31_AC_CAT2_BITS: [[u8; 32]; 16] = [
1702 4, 6, 8, 9, 10, 12, 13, 4, 7, 3, 4, 4, 4, 4, 4, 5,
1703 5, 5, 5, 6, 7, 11, 13, 4, 5, 6, 6, 7, 6, 6, 4, 5,
1705 4, 6, 7, 7, 9, 12, 12, 5, 7, 3, 3, 4, 4, 4, 4, 5,
1706 6, 6, 6, 8, 10, 12, 12, 4, 5, 6, 6, 6, 5, 6, 4, 5,
1708 4, 5, 7, 6, 8, 10, 12, 5, 7, 3, 3, 4, 4, 4, 5, 5,
1709 6, 6, 7, 9, 12, 12, 12, 4, 5, 5, 6, 6, 5, 6, 4, 5,
1711 3, 5, 6, 6, 8, 10, 13, 5, 7, 3, 3, 4, 4, 4, 5, 6,
1712 7, 7, 9, 11, 13, 13, 13, 4, 5, 5, 6, 6, 5, 6, 5, 5,
1714 3, 5, 6, 5, 7, 9, 11, 6, 8, 3, 3, 4, 4, 5, 6, 7,
1715 8, 8, 10, 13, 13, 13, 13, 3, 5, 5, 5, 6, 5, 6, 5, 6,
1717 3, 4, 5, 5, 6, 9, 11, 6, 9, 3, 3, 4, 4, 5, 7, 9,
1718 11, 11, 13, 14, 14, 13, 13, 3, 5, 5, 6, 6, 6, 6, 5, 6,
1720 3, 4, 5, 4, 5, 7, 9, 7, 13, 3, 3, 4, 4, 6, 8, 10,
1721 13, 13, 13, 13, 13, 13, 13, 3, 5, 5, 6, 6, 6, 7, 6, 6,
1723 3, 4, 5, 4, 4, 5, 7, 8, 13, 3, 3, 4, 4, 7, 12, 14,
1724 14, 14, 14, 14, 14, 13, 13, 3, 5, 5, 7, 6, 7, 9, 10, 7,
1726 4, 6, 8, 8, 10, 12, 13, 5, 6, 3, 3, 4, 4, 4, 5, 6,
1727 7, 7, 8, 9, 13, 12, 12, 4, 4, 5, 5, 6, 5, 5, 4, 5,
1729 3, 5, 7, 7, 10, 13, 14, 5, 6, 3, 3, 4, 4, 5, 6, 7,
1730 8, 9, 11, 13, 14, 14, 14, 4, 4, 5, 5, 6, 4, 5, 5, 6,
1732 3, 5, 6, 6, 9, 13, 14, 6, 6, 3, 3, 4, 4, 5, 7, 8,
1733 10, 11, 13, 15, 15, 14, 14, 4, 5, 5, 5, 5, 4, 4, 5, 6,
1735 3, 4, 5, 5, 8, 11, 13, 7, 6, 3, 3, 4, 4, 6, 7, 9,
1736 11, 12, 13, 13, 13, 13, 13, 4, 5, 5, 5, 6, 4, 4, 6, 7,
1738 3, 4, 5, 4, 6, 10, 14, 7, 6, 3, 3, 5, 5, 7, 9, 11,
1739 14, 14, 14, 14, 14, 14, 14, 4, 5, 5, 6, 6, 4, 3, 7, 8,
1741 3, 4, 4, 4, 6, 9, 13, 8, 7, 3, 3, 5, 5, 7, 10, 14,
1742 14, 13, 13, 13, 13, 13, 13, 4, 5, 6, 6, 6, 4, 3, 8, 8,
1744 3, 4, 4, 3, 5, 9, 13, 10, 9, 2, 3, 6, 6, 10, 13, 13,
1745 13, 14, 14, 14, 14, 13, 13, 5, 6, 7, 6, 6, 5, 4, 11, 11,
1747 2, 4, 5, 4, 6, 9, 13, 14, 14, 2, 2, 7, 7, 14, 14, 14,
1748 14, 14, 14, 14, 14, 14, 14, 9, 9, 10, 8, 8, 6, 5, 14, 14,
1752 const VP31_AC_CAT3_CODES: [[u16; 32]; 16] = [
1754 0x0000, 0x0010, 0x0072, 0x0071, 0x0154, 0x0AAB, 0x0AA8, 0x0014,
1755 0x0070, 0x0002, 0x0003, 0x000C, 0x000B, 0x0003, 0x0011, 0x0073,
1756 0x0054, 0x00AB, 0x02AB, 0x1553, 0x1552, 0x1555, 0x1554, 0x000D,
1757 0x001E, 0x0012, 0x003E, 0x002B, 0x0002, 0x003F, 0x001D, 0x0013,
1759 0x0003, 0x001F, 0x0029, 0x003D, 0x000C, 0x0069, 0x0345, 0x0002,
1760 0x0028, 0x0002, 0x0001, 0x000E, 0x000C, 0x0015, 0x0007, 0x001B,
1761 0x006B, 0x006A, 0x0344, 0x0347, 0x0346, 0x01A1, 0x01A0, 0x000B,
1762 0x001A, 0x0012, 0x0000, 0x003C, 0x0008, 0x001B, 0x0013, 0x0001,
1764 0x0004, 0x0004, 0x003F, 0x0014, 0x0056, 0x015C, 0x15D5, 0x003C,
1765 0x002A, 0x0000, 0x0001, 0x000E, 0x000D, 0x000C, 0x00AF, 0x02BB,
1766 0x15D4, 0x15D7, 0x15D6, 0x15D1, 0x15D0, 0x15D3, 0x15D2, 0x000B,
1767 0x0019, 0x000D, 0x003E, 0x0031, 0x0007, 0x0005, 0x003D, 0x0030,
1769 0x0005, 0x0008, 0x001A, 0x0000, 0x0036, 0x0011, 0x0106, 0x000A,
1770 0x006E, 0x0002, 0x0003, 0x0003, 0x0002, 0x006F, 0x0021, 0x020F,
1771 0x020E, 0x0101, 0x0100, 0x0103, 0x0102, 0x0105, 0x0104, 0x000C,
1772 0x001E, 0x0003, 0x003E, 0x003F, 0x0009, 0x000E, 0x000B, 0x0009,
1774 0x0002, 0x000E, 0x001E, 0x000C, 0x001F, 0x006E, 0x00AD, 0x00AF,
1775 0x0014, 0x0004, 0x0003, 0x001A, 0x0017, 0x002A, 0x0576, 0x0AEF,
1776 0x0AEE, 0x0571, 0x0570, 0x0573, 0x0572, 0x0575, 0x0574, 0x0003,
1777 0x0016, 0x0004, 0x0036, 0x000B, 0x000A, 0x0000, 0x006F, 0x00AC,
1779 0x0004, 0x0005, 0x0003, 0x0001, 0x0004, 0x002F, 0x0526, 0x1495,
1780 0x00A6, 0x0007, 0x0006, 0x002D, 0x002C, 0x1494, 0x1497, 0x1496,
1781 0x1491, 0x1490, 0x1493, 0x1492, 0x293D, 0x293C, 0x293F, 0x0000,
1782 0x0028, 0x00A5, 0x0148, 0x00A7, 0x002E, 0x0015, 0x0A4E, 0x293E,
1784 0x0004, 0x0005, 0x0003, 0x0001, 0x0004, 0x002F, 0x0526, 0x1495,
1785 0x00A6, 0x0007, 0x0006, 0x002D, 0x002C, 0x1494, 0x1497, 0x1496,
1786 0x1491, 0x1490, 0x1493, 0x1492, 0x293D, 0x293C, 0x293F, 0x0000,
1787 0x0028, 0x00A5, 0x0148, 0x00A7, 0x002E, 0x0015, 0x0A4E, 0x293E,
1789 0x0004, 0x0005, 0x0003, 0x0001, 0x0004, 0x002F, 0x0526, 0x1495,
1790 0x00A6, 0x0007, 0x0006, 0x002D, 0x002C, 0x1494, 0x1497, 0x1496,
1791 0x1491, 0x1490, 0x1493, 0x1492, 0x293D, 0x293C, 0x293F, 0x0000,
1792 0x0028, 0x00A5, 0x0148, 0x00A7, 0x002E, 0x0015, 0x0A4E, 0x293E,
1794 0x0003, 0x0011, 0x0020, 0x0074, 0x010D, 0x0863, 0x0860, 0x000A,
1795 0x0075, 0x0001, 0x0000, 0x000B, 0x000A, 0x0018, 0x0038, 0x0042,
1796 0x010F, 0x010E, 0x0219, 0x10C3, 0x10C2, 0x10C5, 0x10C4, 0x000F,
1797 0x0004, 0x0019, 0x000B, 0x0039, 0x0009, 0x001B, 0x001A, 0x003B,
1799 0x0005, 0x0001, 0x003E, 0x0001, 0x00E2, 0x1C6F, 0x38D9, 0x0039,
1800 0x001F, 0x0002, 0x0001, 0x0009, 0x0008, 0x0000, 0x0070, 0x01C7,
1801 0x038C, 0x071A, 0x38D8, 0x38DB, 0x38DA, 0x38DD, 0x38DC, 0x000D,
1802 0x001D, 0x000E, 0x003F, 0x003C, 0x000C, 0x0006, 0x003D, 0x001E,
1804 0x0006, 0x000B, 0x0011, 0x001E, 0x0074, 0x03AA, 0x1D5C, 0x0001,
1805 0x0021, 0x0001, 0x0002, 0x0007, 0x0006, 0x003E, 0x00EB, 0x01D4,
1806 0x0EAF, 0x3ABB, 0x3ABA, 0x1D59, 0x1D58, 0x1D5B, 0x1D5A, 0x000A,
1807 0x001C, 0x0001, 0x003F, 0x003B, 0x0001, 0x0009, 0x0020, 0x0000,
1809 0x0004, 0x000A, 0x0017, 0x0004, 0x0016, 0x016A, 0x16B1, 0x0017,
1810 0x005B, 0x0006, 0x0007, 0x0001, 0x0000, 0x000A, 0x02D7, 0x0B5A,
1811 0x16B0, 0x16B3, 0x16B2, 0x2D6D, 0x2D6C, 0x2D6F, 0x2D6E, 0x0006,
1812 0x000A, 0x0004, 0x002C, 0x0017, 0x0003, 0x0007, 0x0016, 0x00B4,
1814 0x0005, 0x000D, 0x0005, 0x0009, 0x0033, 0x0193, 0x192C, 0x0061,
1815 0x0031, 0x0000, 0x0007, 0x0010, 0x0011, 0x00C8, 0x192F, 0x325B,
1816 0x325A, 0x1929, 0x1928, 0x192B, 0x192A, 0x325D, 0x325C, 0x0018,
1817 0x001A, 0x001B, 0x0065, 0x0019, 0x0004, 0x0007, 0x0060, 0x0324,
1819 0x0006, 0x0000, 0x0002, 0x000F, 0x0039, 0x01D9, 0x1D82, 0x0761,
1820 0x03BE, 0x0001, 0x0002, 0x000F, 0x000E, 0x0762, 0x3B07, 0x3B06,
1821 0x3B1D, 0x3B1C, 0x3B1F, 0x3B1E, 0x3B19, 0x3B18, 0x3B1B, 0x0038,
1822 0x01DE, 0x00ED, 0x03BF, 0x00EE, 0x003A, 0x0006, 0x0EC0, 0x3B1A,
1824 0x0000, 0x0002, 0x000F, 0x0006, 0x001C, 0x01D0, 0x0E8C, 0x1D1B,
1825 0x1D1A, 0x0003, 0x0002, 0x00EA, 0x00E9, 0x0E89, 0x0E88, 0x0E8B,
1826 0x0E8A, 0x1D65, 0x1D64, 0x1D67, 0x1D66, 0x1D61, 0x1D60, 0x03AD,
1827 0x1D63, 0x1D62, 0x1D1D, 0x1D1C, 0x003B, 0x01D7, 0x1D1F, 0x1D1E,
1829 0x0002, 0x000F, 0x001C, 0x000C, 0x003B, 0x01AC, 0x1AD8, 0x35B3,
1830 0x35B2, 0x0001, 0x0000, 0x0069, 0x0068, 0x35BD, 0x35BC, 0x35BF,
1831 0x35BE, 0x35B9, 0x35B8, 0x35BB, 0x35BA, 0x35B5, 0x35B4, 0x01A9,
1832 0x01A8, 0x035A, 0x00D7, 0x00D5, 0x003A, 0x001B, 0x35B7, 0x35B6,
1836 const VP31_AC_CAT3_BITS: [[u8; 32]; 16] = [
1838 3, 5, 7, 7, 9, 12, 12, 5, 7, 3, 3, 4, 4, 4, 5, 7,
1839 7, 8, 10, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 6, 5, 5,
1841 3, 5, 6, 6, 7, 10, 13, 5, 6, 3, 3, 4, 4, 5, 6, 8,
1842 10, 10, 13, 13, 13, 12, 12, 4, 5, 5, 5, 6, 4, 5, 5, 5,
1844 3, 4, 6, 5, 7, 9, 13, 6, 6, 3, 3, 4, 4, 5, 8, 10,
1845 13, 13, 13, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 4, 6, 6,
1847 3, 4, 5, 4, 6, 8, 12, 7, 7, 3, 3, 4, 4, 7, 9, 13,
1848 13, 12, 12, 12, 12, 12, 12, 4, 5, 5, 6, 6, 4, 4, 7, 7,
1850 3, 4, 5, 4, 5, 7, 10, 10, 7, 3, 3, 5, 5, 8, 13, 14,
1851 14, 13, 13, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 3, 7, 10,
1853 3, 4, 3, 3, 4, 6, 11, 13, 8, 3, 3, 6, 6, 13, 13, 13,
1854 13, 13, 13, 13, 14, 14, 14, 3, 6, 8, 9, 8, 6, 5, 12, 14,
1856 3, 4, 3, 3, 4, 6, 11, 13, 8, 3, 3, 6, 6, 13, 13, 13,
1857 13, 13, 13, 13, 14, 14, 14, 3, 6, 8, 9, 8, 6, 5, 12, 14,
1859 3, 4, 3, 3, 4, 6, 11, 13, 8, 3, 3, 6, 6, 13, 13, 13,
1860 13, 13, 13, 13, 14, 14, 14, 3, 6, 8, 9, 8, 6, 5, 12, 14,
1862 3, 5, 6, 7, 9, 12, 12, 5, 7, 3, 3, 4, 4, 5, 6, 7,
1863 9, 9, 10, 13, 13, 13, 13, 4, 4, 5, 5, 6, 4, 5, 5, 6,
1865 3, 4, 6, 5, 8, 13, 14, 6, 6, 3, 3, 4, 4, 5, 7, 9,
1866 10, 11, 14, 14, 14, 14, 14, 4, 5, 5, 6, 6, 4, 4, 6, 6,
1868 3, 4, 5, 5, 7, 10, 13, 6, 6, 3, 3, 4, 4, 6, 8, 9,
1869 12, 14, 14, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 4, 6, 6,
1871 3, 4, 5, 4, 6, 9, 13, 7, 7, 3, 3, 4, 4, 6, 10, 12,
1872 13, 13, 13, 14, 14, 14, 14, 4, 5, 5, 6, 6, 4, 4, 7, 8,
1874 3, 4, 4, 4, 6, 9, 13, 8, 7, 2, 3, 5, 5, 8, 13, 14,
1875 14, 13, 13, 13, 13, 14, 14, 5, 6, 6, 7, 6, 4, 4, 8, 10,
1877 3, 3, 4, 4, 6, 9, 13, 11, 10, 2, 2, 6, 6, 11, 14, 14,
1878 14, 14, 14, 14, 14, 14, 14, 6, 9, 8, 10, 8, 6, 5, 12, 14,
1880 2, 3, 5, 4, 6, 10, 13, 14, 14, 2, 2, 9, 9, 13, 13, 13,
1881 13, 14, 14, 14, 14, 14, 14, 11, 14, 14, 14, 14, 7, 10, 14, 14,
1883 2, 4, 5, 4, 6, 9, 13, 14, 14, 2, 2, 7, 7, 14, 14, 14,
1884 14, 14, 14, 14, 14, 14, 14, 9, 9, 10, 8, 8, 6, 5, 14, 14,
1888 const VP31_DC_WEIGHTS: [[i16; 5]; 16] = [
1897 [ 29, -26, 29, 0, 32 ],
1900 [ 75, 0, 0, 53, 128 ],
1902 [ 75, 0, 0, 53, 128 ],
1905 [ 75, 0, 0, 53, 128 ],
1906 [ 0, 3, 10, 3, 16 ],
1907 [ 29, -26, 29, 0, 32 ],