vp3: fix fourmv restoration loop bug
[nihav.git] / nihav-duck / src / codecs / vp3.rs
CommitLineData
5b24175d
KS
1use std::mem;
2use std::ptr;
3use nihav_core::codecs::*;
4use nihav_core::codecs::blockdsp::*;
5use nihav_core::io::bitreader::*;
6use nihav_core::io::codebook::*;
7use nihav_core::io::intcode::*;
8use super::vpcommon::*;
9
10#[derive(Clone,Copy,Debug,PartialEq)]
11enum SBState {
12 Coded,
13 Partial,
14 Uncoded,
15}
16
6543b6f8
KS
17fn map_idx(idx: usize) -> u8 {
18 idx as u8
19}
20
21struct VP31Codes {
5b24175d
KS
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],
27}
28
6543b6f8 29impl VP31Codes {
5b24175d
KS
30 fn new() -> Self {
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];
36 unsafe {
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();
42 for i in 0..16 {
6543b6f8 43 let mut cr = TableCodebookDescReader::new(&VP31_DC_CODES[i], &VP31_DC_BITS[i], map_idx);
5b24175d
KS
44 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
45 ptr::write(&mut dc_cb[i], cb);
46
6543b6f8 47 let mut cr = TableCodebookDescReader::new(&VP31_AC_CAT0_CODES[i], &VP31_AC_CAT0_BITS[i], map_idx);
5b24175d
KS
48 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
49 ptr::write(&mut ac0_cb[i], cb);
6543b6f8 50 let mut cr = TableCodebookDescReader::new(&VP31_AC_CAT1_CODES[i], &VP31_AC_CAT1_BITS[i], map_idx);
5b24175d
KS
51 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
52 ptr::write(&mut ac1_cb[i], cb);
6543b6f8 53 let mut cr = TableCodebookDescReader::new(&VP31_AC_CAT2_CODES[i], &VP31_AC_CAT2_BITS[i], map_idx);
5b24175d
KS
54 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
55 ptr::write(&mut ac2_cb[i], cb);
6543b6f8 56 let mut cr = TableCodebookDescReader::new(&VP31_AC_CAT3_CODES[i], &VP31_AC_CAT3_BITS[i], map_idx);
5b24175d
KS
57 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
58 ptr::write(&mut ac3_cb[i], cb);
59 }
60 }
61 Self { dc_cb, ac0_cb, ac1_cb, ac2_cb, ac3_cb }
62 }
63}
64
347108c9
KS
65enum Codes {
66 None,
67// VP30(VP30Codes),
68 VP31(VP31Codes),
69}
70
5b24175d
KS
71#[derive(Clone)]
72struct Block {
73 btype: VPMBType,
74 coeffs: [i16; 64],
75 has_ac: bool,
76 idx: usize,
77 mv: MV,
78 coded: bool,
79}
80
81impl Block {
82 fn new() -> Self {
83 Self {
84 btype: VPMBType::Intra,
85 coeffs: [0; 64],
86 has_ac: false,
87 idx: 0,
88 mv: ZERO_MV,
89 coded: false,
90 }
91 }
92}
93
94type ReadRunFunc = fn (&mut BitReader) -> DecoderResult<usize>;
95
6543b6f8
KS
96const VP31_LONG_RUN_BASE: [usize; 7] = [ 1, 2, 4, 6, 10, 18, 34 ];
97const VP31_LONG_RUN_BITS: [u8; 7] = [ 0, 1, 1, 2, 3, 4, 12 ];
5b24175d
KS
98fn 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); }
6543b6f8 101 Ok(VP31_LONG_RUN_BASE[pfx] + (br.read(VP31_LONG_RUN_BITS[pfx])? as usize))
5b24175d
KS
102}
103
6543b6f8
KS
104const VP31_SHORT_RUN_BASE: [usize; 6] = [ 1, 3, 5, 7, 11, 15 ];
105const VP31_SHORT_RUN_BITS: [u8; 6] = [ 1, 1, 1, 2, 2, 4 ];
5b24175d
KS
106fn read_short_run(br: &mut BitReader) -> DecoderResult<usize> {
107 let pfx = br.read_code(UintCodeType::LimitedUnary(5, 0))? as usize;
6543b6f8 108 Ok(VP31_SHORT_RUN_BASE[pfx] + (br.read(VP31_SHORT_RUN_BITS[pfx])? as usize))
5b24175d
KS
109}
110
111struct BitRunDecoder {
112 value: bool,
113 run: usize,
114 read_run: ReadRunFunc,
115}
116
117impl BitRunDecoder {
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 })
121 }
122 fn get_val(&mut self, br: &mut BitReader) -> DecoderResult<bool> {
123 if self.run == 0 {
124 self.value = !self.value;
125 self.run = (self.read_run)(br)?;
126 }
127 self.run -= 1;
128 Ok(self.value)
129 }
130}
131
132struct VP34Decoder {
133 info: NACodecInfoRef,
134 width: usize,
135 height: usize,
136 mb_w: usize,
137 mb_h: usize,
138 version: u8,
139 is_intra: bool,
140 quant: usize,
141 shuf: VPShuffler,
347108c9 142 codes: Codes,
5b24175d
KS
143 loop_str: i16,
144
145 blocks: Vec<Block>,
146 y_blocks: usize,
147 y_sbs: usize,
148 qmat_y: [i16; 64],
149 qmat_c: [i16; 64],
150 qmat_inter: [i16; 64],
151
152 eob_run: usize,
153 last_dc: [i16; 3],
154
155 blk_addr: Vec<usize>,
156 sb_info: Vec<SBState>,
157 sb_blocks: Vec<u8>,
158}
159
160fn read_mv_comp_packed(br: &mut BitReader) -> DecoderResult<i16> {
161 let code = br.read(3)?;
162 match code {
163 0 => Ok(0),
164 1 => Ok(1),
165 2 => Ok(-1),
166 3 => if br.read_bool()? { Ok(-2) } else { Ok(2) },
167 4 => if br.read_bool()? { Ok(-3) } else { Ok(3) },
168 5 => {
169 let val = (br.read(2)? as i16) + 4;
170 if br.read_bool()? {
171 Ok(-val)
172 } else {
173 Ok(val)
174 }
175 },
176 6 => {
177 let val = (br.read(3)? as i16) + 8;
178 if br.read_bool()? {
179 Ok(-val)
180 } else {
181 Ok(val)
182 }
183 },
184 _ => {
185 let val = (br.read(4)? as i16) + 16;
186 if br.read_bool()? {
187 Ok(-val)
188 } else {
189 Ok(val)
190 }
191 },
192 }
193}
194
195fn read_mv_packed(br: &mut BitReader) -> DecoderResult<MV> {
196 let x = read_mv_comp_packed(br)?;
197 let y = read_mv_comp_packed(br)?;
198 Ok(MV{ x, y })
199}
200
201fn read_mv_comp_raw(br: &mut BitReader) -> DecoderResult<i16> {
202 let val = br.read(5)? as i16;
203 if br.read_bool()? {
204 Ok(-val)
205 } else {
206 Ok(val)
207 }
208}
209
210fn read_mv_raw(br: &mut BitReader) -> DecoderResult<MV> {
211 let x = read_mv_comp_raw(br)?;
212 let y = read_mv_comp_raw(br)?;
213 Ok(MV{ x, y })
214}
215
216fn 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;
219 }
220 dst_qmat[0] = (base_qmat[0] * dc_quant / 100).max(4) << 2;
221}
222
6543b6f8
KS
223fn expand_token(blk: &mut Block, br: &mut BitReader, eob_run: &mut usize, coef_no: usize, token: u8) -> DecoderResult<()> {
224 match token {
225 // EOBs
226 0 | 1 | 2 => { *eob_run = (token as usize) + 1; },
227 3 | 4 | 5 => {
228 let bits = token - 1;
229 *eob_run = (br.read(bits)? as usize) + (1 << bits);
230 },
231 6 => { *eob_run = br.read(12)? as usize; },
232 // zero runs
233 7 | 8 => {
234 let bits = if token == 7 { 3 } else { 6 };
235 let run = (br.read(bits)? as usize) + 1;
236 blk.idx += run;
237 validate!(blk.idx <= 64);
238 },
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;
244 } else {
245 blk.coeffs[ZIGZAG[blk.idx]] = -val;
246 }
247 blk.idx += 1;
248 },
249 13 | 14 | 15 | 16 => {
250 let val = i16::from(token) - 10;
251 if !br.read_bool()? {
252 blk.coeffs[ZIGZAG[blk.idx]] = val;
253 } else {
254 blk.coeffs[ZIGZAG[blk.idx]] = -val;
255 }
256 blk.idx += 1;
257 },
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];
262 if !sign {
263 blk.coeffs[ZIGZAG[blk.idx]] = val;
264 } else {
265 blk.coeffs[ZIGZAG[blk.idx]] = -val;
266 }
267 blk.idx += 1;
268 }
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;
275 } else {
276 blk.coeffs[ZIGZAG[blk.idx]] = -1;
277 }
278 blk.idx += 1;
279 },
280 28 | 29 => {
281 let run_bits = token - 26;
282 if token == 28 {
283 blk.idx += 6;
284 } else {
285 blk.idx += 10;
286 }
287 let sign = br.read_bool()?;
288 blk.idx += br.read(run_bits)? as usize;
289 validate!(blk.idx < 64);
290 if !sign {
291 blk.coeffs[ZIGZAG[blk.idx]] = 1;
292 } else {
293 blk.coeffs[ZIGZAG[blk.idx]] = -1;
294 }
295 blk.idx += 1;
296 },
297 30 => {
298 blk.idx += 1;
299 validate!(blk.idx < 64);
300 let sign = br.read_bool()?;
301 let val = (br.read(1)? as i16) + 2;
302 if !sign {
303 blk.coeffs[ZIGZAG[blk.idx]] = val;
304 } else {
305 blk.coeffs[ZIGZAG[blk.idx]] = -val;
306 }
307 blk.idx += 1;
308 },
309 _ => {
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);
314 if !sign {
315 blk.coeffs[ZIGZAG[blk.idx]] = val;
316 } else {
317 blk.coeffs[ZIGZAG[blk.idx]] = -val;
318 }
319 blk.idx += 1;
320 },
321 };
322 if *eob_run > 0 {
323 blk.idx = 64;
324 *eob_run -= 1;
325 } else if coef_no > 0 {
326 blk.has_ac = true;
327 }
328 Ok(())
329}
5b24175d
KS
330macro_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;
334 $pp |= 1 << $bit;
335 }
336 };
337}
338
339fn vp3_interp00(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
340{
341 let mut didx = 0;
342 let mut sidx = 0;
343 for _ in 0..bh {
344 for x in 0..bw { dst[didx + x] = src[sidx + x]; }
345 didx += dstride;
346 sidx += sstride;
347 }
348}
349
350fn vp3_interp01(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
351{
352 let mut didx = 0;
353 let mut sidx = 0;
354 for _ in 0..bh {
355 for x in 0..bw { dst[didx + x] = (((src[sidx + x] as u16) + (src[sidx + x + 1] as u16)) >> 1) as u8; }
356 didx += dstride;
357 sidx += sstride;
358 }
359}
360
361fn vp3_interp10(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
362{
363 let mut didx = 0;
364 let mut sidx = 0;
365 for _ in 0..bh {
366 for x in 0..bw { dst[didx + x] = (((src[sidx + x] as u16) + (src[sidx + x + sstride] as u16)) >> 1) as u8; }
367 didx += dstride;
368 sidx += sstride;
369 }
370}
371
372fn vp3_interp11(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
373{
374 let mut didx = 0;
375 let mut sidx = 0;
376 for _ in 0..bh {
377 for x in 0..bw {
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;
382 }
383 didx += dstride;
384 sidx += sstride;
385 }
386}
387
6543b6f8 388fn vp31_loop_filter(data: &mut [u8], mut off: usize, step: usize, stride: usize, loop_str: i16) {
5b24175d
KS
389 for _ in 0..8 {
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 {
396 diff = 0;
397 } else if diff.abs() >= loop_str {
398 if diff < 0 {
399 diff = -diff - 2 * loop_str;
400 } else {
401 diff = -diff + 2 * loop_str;
402 }
403 }
404 if diff != 0 {
405 data[off - step] = (b + diff).max(0).min(255) as u8;
406 data[off] = (c - diff).max(0).min(255) as u8;
407 }
408
409 off += stride;
410 }
411}
412
6543b6f8 413fn vp31_loop_filter_v(frm: &mut NASimpleVideoFrame<u8>, x: usize, y: usize, plane: usize, loop_str: i16) {
5b24175d 414 let off = frm.offset[plane] + x + y * frm.stride[plane];
6543b6f8 415 vp31_loop_filter(frm.data, off, 1, frm.stride[plane], loop_str);
5b24175d
KS
416}
417
6543b6f8 418fn vp31_loop_filter_h(frm: &mut NASimpleVideoFrame<u8>, x: usize, y: usize, plane: usize, loop_str: i16) {
5b24175d 419 let off = frm.offset[plane] + x + y * frm.stride[plane];
6543b6f8 420 vp31_loop_filter(frm.data, off, frm.stride[plane], 1, loop_str);
5b24175d
KS
421}
422
423pub const VP3_INTERP_FUNCS: &[blockdsp::BlkInterpFunc] = &[ vp3_interp00, vp3_interp01, vp3_interp10, vp3_interp11 ];
424
425impl VP34Decoder {
426 fn new(version: u8) -> Self {
427 Self {
428 info: NACodecInfoRef::default(),
429 width: 0,
430 height: 0,
431 mb_w: 0,
432 mb_h: 0,
433 version,
434 is_intra: true,
435 quant: 0,
436 shuf: VPShuffler::new(),
347108c9 437 codes: Codes::None,
5b24175d
KS
438 loop_str: 0,
439
440 blocks: Vec::new(),
441 y_blocks: 0,
442 y_sbs: 0,
443
444 qmat_y: [0; 64],
445 qmat_c: [0; 64],
446 qmat_inter: [0; 64],
447
448 eob_run: 0,
449 last_dc: [0; 3],
450
451 blk_addr: Vec::new(),
452 sb_info: Vec::new(),
453 sb_blocks: Vec::new(),
454 }
455 }
456 fn parse_header(&mut self, br: &mut BitReader) -> DecoderResult<()> {
457 self.is_intra = !br.read_bool()?;
458 br.skip(1)?;
459 self.quant = br.read(6)? as usize;
6543b6f8 460 self.loop_str = VP31_LOOP_STRENGTH[self.quant];
5b24175d
KS
461println!("quant = {}", self.quant);
462 if self.is_intra {
463 if br.peek(8) != 0 {
464 unimplemented!();
465 }
466 let version = br.read(13)?;
467println!("intra, ver {} (self {})", version, self.version);
5b24175d
KS
468 let coding_type = br.read(1)?;
469 validate!(coding_type == 0);
470 br.skip(2)?;
347108c9
KS
471 if version == 1 {
472 validate!(self.version == 3 || self.version == 31);
473 if self.version == 3 {
474 self.version = 31;
475 self.codes = Codes::VP31(VP31Codes::new());
476 }
477 } else if version == 2 {
478 validate!(self.version == 4);
479 unimplemented!();
480 } else {
481 return Err(DecoderError::InvalidData);
482 }
5b24175d
KS
483 }
484 Ok(())
485 }
6543b6f8 486 fn vp31_unpack_sb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
5b24175d
KS
487 let mut has_uncoded = false;
488 let mut has_partial = false;
489 {
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;
494 has_partial = true;
495 } else {
496 *sb = SBState::Uncoded;
497 has_uncoded = true;
498 }
499 }
500 }
501 if has_uncoded {
502 let mut brun = BitRunDecoder::new(br, read_long_run)?;
503 let mut cur_blk = 0;
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;
508 for _ in 0..nblks {
509 let blk_idx = self.blk_addr[cur_blk] >> 2;
510 self.blocks[blk_idx].coded = true;
511 cur_blk += 1;
512 }
513 } else {
514 for _ in 0..nblks {
515 let blk_idx = self.blk_addr[cur_blk] >> 2;
516 self.blocks[blk_idx].coded = false;
517 cur_blk += 1;
518 }
519 }
520 }
521 }
522 if has_partial {
523 let mut brun = BitRunDecoder::new(br, read_short_run)?;
524 let mut cur_blk = 0;
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 {
528 for _ in 0..nblks {
529 let blk_idx = self.blk_addr[cur_blk] >> 2;
530 self.blocks[blk_idx].coded = brun.get_val(br)?;
531 cur_blk += 1;
532 }
533 } else {
534 cur_blk += nblks;
535 }
536 }
537 }
538 Ok(())
539 }
6543b6f8 540 fn vp31_unpack_mb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
5b24175d
KS
541 let mut modes = [VPMBType::InterNoMV; 8];
542 let alphabet = br.read(3)? as usize;
543 let raw_modes = alphabet >= 7;
544 if alphabet == 0 {
6543b6f8 545 for mode in VP31_DEFAULT_MB_MODES.iter() {
5b24175d
KS
546 modes[br.read(3)? as usize] = *mode;
547 }
548 } else if alphabet < 7 {
6543b6f8 549 modes.copy_from_slice(&VP31_MB_MODES[alphabet - 1]);
5b24175d
KS
550 }
551
552 let mut cur_blk = 0;
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 {
556 for _ in 0..nblks {
557 self.blocks[self.blk_addr[cur_blk] >> 2].btype = VPMBType::InterNoMV;
558 cur_blk += 1;
559 }
560 } else {
561 for _ in 0..nblks/4 {
562 let mut coded = *sb == SBState::Coded;
563 if !coded {
564 for blk in 0..4 {
565 if self.blocks[self.blk_addr[cur_blk + blk] >> 2].coded {
566 coded = true;
567 break;
568 }
569 }
570 }
571 let mode = if !coded {
572 VPMBType::InterNoMV
573 } else if !raw_modes {
574 let code = br.read_code(UintCodeType::LimitedUnary(7, 0))?;
575 modes[code as usize]
576 } else {
6543b6f8 577 VP31_DEFAULT_MB_MODES[br.read(3)? as usize]
5b24175d
KS
578 };
579 for _ in 0..4 {
580 self.blocks[self.blk_addr[cur_blk] >> 2].btype = mode;
581 cur_blk += 1;
582 }
583 }
584 }
585 }
586 // replicate types for chroma
587 let mut off_y = 0;
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;
595 }
596 off_y += self.mb_w * 2 * 2;
597 off_u += self.mb_w;
598 off_v += self.mb_w;
599 }
600 Ok(())
601 }
6543b6f8 602 fn vp31_unpack_mv_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
5b24175d
KS
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 };
606
607 let mut cur_blk = 0;
608 for _ in 0..self.y_blocks/4 {
609 if self.blocks[self.blk_addr[cur_blk] >> 2].btype == VPMBType::InterFourMV {
610 for _ in 0..4 {
611 let blk = &mut self.blocks[self.blk_addr[cur_blk] >> 2];
612 if blk.coded {
613 blk.mv = (read_mv)(br)?;
614 last2_mv = last_mv;
615 last_mv = blk.mv;
616 }
617 cur_blk += 1;
618 }
619 } else {
620 let cur_mv;
621 match self.blocks[self.blk_addr[cur_blk] >> 2].btype {
622 VPMBType::Intra | VPMBType::InterNoMV | VPMBType::GoldenNoMV => {
623 cur_mv = ZERO_MV;
624 },
625 VPMBType::InterMV => {
626 cur_mv = (read_mv)(br)?;
627 last2_mv = last_mv;
628 last_mv = cur_mv;
629 },
630 VPMBType::InterNearest => {
631 cur_mv = last_mv;
632 },
633 VPMBType::InterNear => {
634 cur_mv = last2_mv;
635 std::mem::swap(&mut last_mv, &mut last2_mv);
636 },
637 _ => { // GoldenMV
638 cur_mv = (read_mv)(br)?;
639 },
640 };
641 for _ in 0..4 {
642 self.blocks[self.blk_addr[cur_blk] >> 2].mv = cur_mv;
643 cur_blk += 1;
644 }
645 }
646 }
647 Ok(())
648 }
6543b6f8 649 fn vp31_unpack_coeffs(&mut self, br: &mut BitReader, coef_no: usize, table_y: usize, table_c: usize) -> DecoderResult<()> {
347108c9
KS
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]]
659 } else {
660 [&codes.ac3_cb[table_y], &codes.ac3_cb[table_c]]
661 };
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 {
666 blk.idx = 64;
667 self.eob_run -= 1;
668 continue;
669 }
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)?;
5b24175d 673 }
347108c9
KS
674 Ok(())
675 } else {
676 Err(DecoderError::Bug)
5b24175d 677 }
5b24175d 678 }
6543b6f8 679 fn decode_vp31(&mut self, br: &mut BitReader, frm: &mut NASimpleVideoFrame<u8>) -> DecoderResult<()> {
5b24175d
KS
680 for blk in self.blocks.iter_mut() {
681 blk.coeffs = [0; 64];
682 blk.idx = 0;
683 blk.coded = false;
684 blk.has_ac = false;
685 }
686 if self.is_intra {
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;
690 blk.coded = true;
691 }
692 } else {
693 if self.shuf.get_last().is_none() || self.shuf.get_golden().is_none() {
694 return Err(DecoderError::MissingReference);
695 }
6543b6f8
KS
696 self.vp31_unpack_sb_info(br)?;
697 self.vp31_unpack_mb_info(br)?;
698 self.vp31_unpack_mv_info(br)?;
5b24175d 699 }
6543b6f8
KS
700 let dc_quant = VP31_DC_SCALES[self.quant];
701 let ac_quant = VP31_AC_SCALES[self.quant];
5b24175d
KS
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);
705
706 self.eob_run = 0;
707 let dc_table_y = br.read(4)? as usize;
708 let dc_table_c = br.read(4)? as usize;
6543b6f8 709 self.vp31_unpack_coeffs(br, 0, dc_table_y, dc_table_c)?;
5b24175d
KS
710 self.restore_dcs();
711
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 {
6543b6f8 715 self.vp31_unpack_coeffs(br, coef_no, ac_table_y, ac_table_c)?;
5b24175d
KS
716 }
717
718 if self.is_intra {
719 self.output_blocks_intra(frm);
720 } else {
721 self.output_blocks_inter(frm);
722 }
723 if self.loop_str > 0 {
6543b6f8 724 self.vp31_loop_filter(frm);
5b24175d
KS
725 }
726
727 Ok(())
728 }
729 fn decode_vp4(&mut self) -> DecoderResult<()> {
730unimplemented!();
731 }
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;
737 if bx > 0 {
738 fill_dc_pred!(self, ref_id, preds, pp, 0, blk_idx - 1);
739 if by > 0 {
740 fill_dc_pred!(self, ref_id, preds, pp, 1, blk_idx - 1 - bw);
741 }
742 }
743 if by > 0 {
744 fill_dc_pred!(self, ref_id, preds, pp, 2, blk_idx - bw);
745 if !is_right {
746 fill_dc_pred!(self, ref_id, preds, pp, 3, blk_idx + 1 - bw);
747 }
748 }
749 if pp == 0 { return self.last_dc[ref_id as usize]; }
750 let mut pred = 0i32;
751 for i in 0..4 {
752 if (pp & (1 << i)) != 0 {
6543b6f8 753 pred += (preds[i] as i32) * (VP31_DC_WEIGHTS[pp][i] as i32);
5b24175d
KS
754 }
755 }
6543b6f8 756 pred /= VP31_DC_WEIGHTS[pp][4] as i32;
5b24175d
KS
757 if (pp & 7) == 7 {
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; }
761 }
762 pred as i16
763 }
764 fn restore_dcs(&mut self) {
765 let blk_stride = self.mb_w * 2;
766 let mut blk_idx = 0;
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];
774 }
775 blk_idx += blk_stride;
776 }
777 let blk_stride = self.mb_w;
778 for _plane in 1..3 {
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];
786 }
787 blk_idx += blk_stride;
788 }
789 }
790 }
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];
798 if blk.has_ac {
799 unquant(&mut blk.coeffs, qmat);
800 vp_put_block(&mut blk.coeffs, bx, by, 0, frm);
801 } else {
802 vp_put_block_dc(&mut blk.coeffs, bx, by, 0, frm);
803 }
804 }
805 }
806 for plane in 1..3 {
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];
812 if blk.has_ac {
813 unquant(&mut blk.coeffs, qmat);
814 vp_put_block(&mut blk.coeffs, bx, by, plane, frm);
815 } else {
816 vp_put_block_dc(&mut blk.coeffs, bx, by, plane, frm);
817 }
818 }
819 }
820 }
821 }
822 fn output_blocks_inter(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
823 let mut blk_idx = 0;
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 {
828 continue;
829 }
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;
837
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);
847
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);
853 }
96f8649d 854 blk_idx += bstride * 2;
5b24175d
KS
855 }
856
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()
865 } else {
866 self.shuf.get_golden().unwrap()
867 };
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);
875 }
876 let qmat = if blk.btype.is_intra() { &self.qmat_y } else { &self.qmat_inter };
877 blk.coeffs[0] *= qmat[0];
878 if blk.has_ac {
879 unquant(&mut blk.coeffs, qmat);
880 }
881 if blk.btype.is_intra() {
882 if !blk.coded {
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);
886 } else {
887 vp_put_block_dc(&mut blk.coeffs, bx, by, 0, frm);
888 }
889 } else if blk.coded {
890 if blk.has_ac {
891 vp_add_block(&mut blk.coeffs, bx, by, 0, frm);
892 } else {
893 vp_add_block_dc(&mut blk.coeffs, bx, by, 0, frm);
894 }
895 }
896 }
897 }
898 for plane in 1..3 {
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];
904 if blk.has_ac {
905 unquant(&mut blk.coeffs, qmat);
906 }
907 if blk.btype.is_intra() {
908 if !blk.coded {
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);
912 } else {
913 vp_put_block_dc(&mut blk.coeffs, bx, by, plane, frm);
914 }
915 } else if blk.coded {
916 if blk.has_ac {
917 vp_add_block(&mut blk.coeffs, bx, by, plane, frm);
918 } else {
919 vp_add_block_dc(&mut blk.coeffs, bx, by, plane, frm);
920 }
921 }
922 }
923 }
924 }
925 }
6543b6f8 926 fn vp31_loop_filter(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
5b24175d
KS
927 let mut blk_idx = 0;
928 let blk_w = self.mb_w * 2;
929 for by in 0..self.mb_h*2 {
930 for bx in 0..blk_w {
931 let blk = &self.blocks[blk_idx + bx];
932 if (bx > 0) && blk.coded {
6543b6f8 933 vp31_loop_filter_v(frm, bx * 8, by * 8, 0, self.loop_str);
5b24175d
KS
934 }
935 if (by > 0) && blk.coded {
6543b6f8 936 vp31_loop_filter_h(frm, bx * 8, by * 8, 0, self.loop_str);
5b24175d
KS
937 }
938 if (bx < blk_w - 1) && !self.blocks[blk_idx + bx + 1].coded {
6543b6f8 939 vp31_loop_filter_v(frm, bx * 8 + 8, by * 8, 0, self.loop_str);
5b24175d
KS
940 }
941 if (by < self.mb_h * 2 - 1) && !self.blocks[blk_idx + bx + blk_w].coded {
6543b6f8 942 vp31_loop_filter_h(frm, bx * 8, by * 8 + 8, 0, self.loop_str);
5b24175d
KS
943 }
944 }
945 blk_idx += blk_w;
946 }
947/* for plane in 1..3 {
948 for by in 0..self.mb_h {
949 for bx in 0..self.mb_w {
950 }
951 }
952 }*/
953 }
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;
969 for plane in 0..3 {
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;
974 let blk_w = w >> 3;
975 let blk_h = h >> 3;
976 for y in 0..sb_h {
977 for x in 0..sb_w {
978 let mut nblocks = 0;
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);
985 nblocks += 1;
986 }
987 self.sb_blocks.push(nblocks);
988 }
989 }
990 base_idx += blk_w * blk_h;
991 }
992 self.blocks.resize(tot_blk, Block::new());
993 }
994}
995
996impl 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)?;
1009
1010 if self.version == 3 {
1011 self.generate_block_addr();
1012 }
1013 Ok(())
1014 } else {
1015 Err(DecoderError::InvalidData)
1016 }
1017 }
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);
1022
1023 self.parse_header(&mut br)?;
1024 if self.is_intra {
1025 self.shuf.clear();
1026 }
1027
1028 let ret = supp.pool_u8.get_free();
1029 if ret.is_none() {
1030 return Err(DecoderError::AllocError);
1031 }
1032 let mut buf = ret.unwrap();
1033 let mut dframe = NASimpleVideoFrame::from_video_buf(&mut buf).unwrap();
347108c9
KS
1034 match self.version {
1035 31 => self.decode_vp31(&mut br, &mut dframe)?,
1036 4 => self.decode_vp4()?,
1037 _ => return Err(DecoderError::Bug),
5b24175d
KS
1038 }
1039
1040 if self.is_intra {
1041 self.shuf.add_golden_frame(buf.clone());
1042 }
1043 self.shuf.add_frame(buf.clone());
1044
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 });
1048 Ok(frm.into_ref())
1049 }
1050}
1051
1052pub fn get_decoder_vp3() -> Box<NADecoder> {
1053 Box::new(VP34Decoder::new(3))
1054}
1055
1056/*pub fn get_decoder_vp4() -> Box<NADecoder> {
1057 Box::new(VP34Decoder::new(4))
1058}*/
1059
1060#[cfg(test)]
1061mod test {
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;
1067
1068 #[test]
1069 fn test_vp3() {
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);
1074
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);
1080//panic!("end");
1081 }
1082
1083 #[test]
1084 fn test_vp4() {
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);
1089
1090 let file = "assets/Duck/ot171_vp40.avi";
1091 test_file_decoding("avi", file, Some(16), true, false, Some("vp4"), &dmx_reg, &dec_reg);
1092 }
1093}
1094
1095const 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 ]
1100];
1101
6543b6f8 1102const VP31_LOOP_STRENGTH: [i16; 64] = [
5b24175d
KS
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
1111];
1112
6543b6f8 1113const VP31_DEFAULT_MB_MODES: [VPMBType; 8] = [
5b24175d
KS
1114 VPMBType::InterNoMV, VPMBType::Intra, VPMBType::InterMV, VPMBType::InterNearest,
1115 VPMBType::InterNear, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1116];
1117
6543b6f8 1118const VP31_MB_MODES: [[VPMBType; 8]; 6] = [
5b24175d
KS
1119 [
1120 VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterMV, VPMBType::InterNoMV,
1121 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1122 ], [
1123 VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterNoMV, VPMBType::InterMV,
1124 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1125 ], [
1126 VPMBType::InterNearest, VPMBType::InterMV, VPMBType::InterNear, VPMBType::InterNoMV,
1127 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1128 ], [
1129 VPMBType::InterNearest, VPMBType::InterMV, VPMBType::InterNoMV, VPMBType::InterNear,
1130 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1131 ], [
1132 VPMBType::InterNoMV, VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterMV,
1133 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1134 ], [
1135 VPMBType::InterNoMV, VPMBType::GoldenNoMV, VPMBType::InterNearest, VPMBType::InterNear,
1136 VPMBType::InterMV, VPMBType::Intra, VPMBType::GoldenMV, VPMBType::InterFourMV
1137 ]
1138];
1139
1140const VP3_LITERAL_BASE: [i16; 6] = [ 7, 9, 13, 21, 37, 69 ];
1141
6543b6f8 1142const VP31_AC_SCALES: [i16; 64] = [
5b24175d
KS
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
1151];
1152
6543b6f8 1153const VP31_DC_SCALES: [i16; 64] = [
5b24175d
KS
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
1162];
1163
1164const 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
1173];
1174
1175const 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
1184];
1185
1186const 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
1195];
1196
1197const 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
1206];
1207
6543b6f8 1208const VP31_DC_CODES: [[u16; 32]; 16] = [
5b24175d
KS
1209 [
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,
1214 ], [
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,
1219 ], [
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,
1224 ], [
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,
1229 ], [
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,
1234 ], [
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,
1239 ], [
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,
1244 ], [
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,
1249 ], [
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,
1254 ], [
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,
1259 ], [
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,
1264 ], [
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,
1269 ], [
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,
1274 ], [
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,
1279 ], [
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,
1284 ], [
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,
1289 ]
1290];
1291
6543b6f8 1292const VP31_DC_BITS: [[u8; 32]; 16] = [
5b24175d
KS
1293 [
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,
1296 ], [
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,
1299 ], [
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,
1302 ], [
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,
1305 ], [
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,
1308 ], [
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,
1311 ], [
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,
1314 ], [
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,
1317 ], [
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,
1320 ], [
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,
1323 ], [
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,
1326 ], [
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,
1329 ], [
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,
1332 ], [
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,
1335 ], [
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,
1338 ], [
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,
1341 ]
1342];
1343
6543b6f8 1344const VP31_AC_CAT0_CODES: [[u16; 32]; 16] = [
5b24175d
KS
1345 [
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,
1350 ], [
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,
1355 ], [
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,
1360 ], [
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,
1365 ], [
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,
1370 ], [
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,
1375 ], [
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,
1380 ], [
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,
1385 ], [
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,
1390 ], [
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,
1395 ], [
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,
1400 ], [
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,
1405 ], [
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,
1410 ], [
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,
1415 ], [
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,
1420 ], [
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,
1425 ]
1426];
1427
6543b6f8 1428const VP31_AC_CAT0_BITS: [[u8; 32]; 16] = [
5b24175d
KS
1429 [
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,
1432 ], [
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,
1435 ], [
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,
1438 ], [
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,
1441 ], [
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,
1444 ], [
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,
1447 ], [
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,
1450 ], [
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,
1453 ], [
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,
1456 ], [
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,
1459 ], [
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,
1462 ], [
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,
1465 ], [
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,
1468 ], [
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,
1471 ], [
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,
1474 ], [
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,
1477 ]
1478];
1479
6543b6f8 1480const VP31_AC_CAT1_CODES: [[u16; 32]; 16] = [
5b24175d
KS
1481 [
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,
1486 ], [
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,
1491 ], [
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,
1496 ], [
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,
1501 ], [
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,
1506 ], [
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,
1511 ], [
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,
1516 ], [
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,
1521 ], [
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,
1526 ], [
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,
1531 ], [
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,
1536 ], [
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,
1541 ], [
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,
1546 ], [
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,
1551 ], [
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,
1556 ], [
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,
1561 ]
1562];
1563
6543b6f8 1564const VP31_AC_CAT1_BITS: [[u8; 32]; 16] = [
5b24175d
KS
1565 [
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,
1568 ], [
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,
1571 ], [
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,
1574 ], [
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,
1577 ], [
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,
1580 ], [
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,
1583 ], [
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,
1586 ], [
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,
1589 ], [
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,
1592 ], [
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,
1595 ], [
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,
1598 ], [
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,
1601 ], [
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,
1604 ], [
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,
1607 ], [
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,
1610 ], [
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,
1613 ]
1614];
1615
6543b6f8 1616const VP31_AC_CAT2_CODES: [[u16; 32]; 16] = [
5b24175d
KS
1617 [
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,
1622 ], [
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,
1627 ], [
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,
1632 ], [
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,
1637 ], [
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,
1642 ], [
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,
1647 ], [
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,
1652 ], [
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,
1657 ], [
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,
1662 ], [
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,
1667 ], [
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,
1672 ], [
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,
1677 ], [
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,
1682 ], [
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,
1687 ], [
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,
1692 ], [
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,
1697 ]
1698];
1699
6543b6f8 1700const VP31_AC_CAT2_BITS: [[u8; 32]; 16] = [
5b24175d
KS
1701 [
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,
1704 ], [
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,
1707 ], [
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,
1710 ], [
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,
1713 ], [
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,
1716 ], [
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,
1719 ], [
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,
1722 ], [
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,
1725 ], [
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,
1728 ], [
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,
1731 ], [
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,
1734 ], [
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,
1737 ], [
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,
1740 ], [
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,
1743 ], [
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,
1746 ], [
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,
1749 ]
1750];
1751
6543b6f8 1752const VP31_AC_CAT3_CODES: [[u16; 32]; 16] = [
5b24175d
KS
1753 [
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,
1758 ], [
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,
1763 ], [
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,
1768 ], [
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,
1773 ], [
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,
1778 ], [
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,
1783 ], [
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,
1788 ], [
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,
1793 ], [
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,
1798 ], [
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,
1803 ], [
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,
1808 ], [
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,
1813 ], [
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,
1818 ], [
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,
1823 ], [
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,
1828 ], [
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,
1833 ]
1834];
1835
6543b6f8 1836const VP31_AC_CAT3_BITS: [[u8; 32]; 16] = [
5b24175d
KS
1837 [
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,
1840 ], [
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,
1843 ], [
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,
1846 ], [
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,
1849 ], [
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,
1852 ], [
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,
1855 ], [
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,
1858 ], [
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,
1861 ], [
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,
1864 ], [
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,
1867 ], [
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,
1870 ], [
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,
1873 ], [
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,
1876 ], [
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,
1879 ], [
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,
1882 ], [
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,
1885 ]
1886];
1887
6543b6f8 1888const VP31_DC_WEIGHTS: [[i16; 5]; 16] = [
5b24175d
KS
1889 [ 0, 0, 0, 0, 0 ],
1890 [ 1, 0, 0, 0, 1 ],
1891 [ 0, 1, 0, 0, 1 ],
1892 [ 1, 0, 0, 0, 1 ],
1893
1894 [ 0, 0, 1, 0, 1 ],
1895 [ 1, 0, 1, 0, 2 ],
1896 [ 0, 0, 1, 0, 1 ],
1897 [ 29, -26, 29, 0, 32 ],
1898
1899 [ 0, 0, 0, 1, 1 ],
1900 [ 75, 0, 0, 53, 128 ],
1901 [ 0, 1, 0, 1, 2 ],
1902 [ 75, 0, 0, 53, 128 ],
1903
1904 [ 0, 0, 1, 0, 1 ],
1905 [ 75, 0, 0, 53, 128 ],
1906 [ 0, 3, 10, 3, 16 ],
1907 [ 29, -26, 29, 0, 32 ],
1908];