vp3: switch VP30 test to MD5 hash
[nihav.git] / nihav-duck / src / codecs / vp3.rs
1 use std::mem;
2 use std::ptr;
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::*;
9
10 #[derive(Clone,Copy,Debug,PartialEq)]
11 enum SBState {
12 Coded,
13 Partial,
14 Uncoded,
15 }
16
17 fn map_idx(idx: usize) -> u8 {
18 idx as u8
19 }
20
21 struct VP30Codes {
22 dc_cb: [Codebook<u8>; 5],
23 ac_i_cb: [Codebook<u8>; 5],
24 ac_p_cb: [Codebook<u8>; 5],
25 mbtype_cb: Codebook<VPMBType>,
26 }
27
28 fn map_mbt(idx: usize) -> VPMBType {
29 VP30_MBTYPE_SYMS[idx]
30 }
31
32 impl VP30Codes {
33 fn new() -> Self {
34 let mut dc_cb: [Codebook<u8>; 5];
35 let mut ac_i_cb: [Codebook<u8>; 5];
36 let mut ac_p_cb: [Codebook<u8>; 5];
37 let mut cr = TableCodebookDescReader::new(&VP30_MBTYPE_CODES, &VP30_MBTYPE_BITS, map_mbt);
38 let mbtype_cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
39 unsafe {
40 dc_cb = mem::uninitialized();
41 ac_i_cb = mem::uninitialized();
42 ac_p_cb = mem::uninitialized();
43 for i in 0..5 {
44 let mut cr = TableCodebookDescReader::new(&VP30_DC_CODES[i], &VP30_DC_BITS[i], map_idx);
45 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
46 ptr::write(&mut dc_cb[i], cb);
47 let mut cr = TableCodebookDescReader::new(&VP30_AC_INTRA_CODES[i], &VP30_AC_INTRA_BITS[i], map_idx);
48 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
49 ptr::write(&mut ac_i_cb[i], cb);
50 let mut cr = TableCodebookDescReader::new(&VP30_AC_INTER_CODES[i], &VP30_AC_INTER_BITS[i], map_idx);
51 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
52 ptr::write(&mut ac_p_cb[i], cb);
53 }
54 }
55 Self { dc_cb, ac_i_cb, ac_p_cb, mbtype_cb }
56 }
57 }
58
59 struct VP31Codes {
60 dc_cb: [Codebook<u8>; 16],
61 ac0_cb: [Codebook<u8>; 16],
62 ac1_cb: [Codebook<u8>; 16],
63 ac2_cb: [Codebook<u8>; 16],
64 ac3_cb: [Codebook<u8>; 16],
65 }
66
67 impl VP31Codes {
68 fn new() -> Self {
69 let mut dc_cb: [Codebook<u8>; 16];
70 let mut ac0_cb: [Codebook<u8>; 16];
71 let mut ac1_cb: [Codebook<u8>; 16];
72 let mut ac2_cb: [Codebook<u8>; 16];
73 let mut ac3_cb: [Codebook<u8>; 16];
74 unsafe {
75 dc_cb = mem::uninitialized();
76 ac0_cb = mem::uninitialized();
77 ac1_cb = mem::uninitialized();
78 ac2_cb = mem::uninitialized();
79 ac3_cb = mem::uninitialized();
80 for i in 0..16 {
81 let mut cr = TableCodebookDescReader::new(&VP31_DC_CODES[i], &VP31_DC_BITS[i], map_idx);
82 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
83 ptr::write(&mut dc_cb[i], cb);
84
85 let mut cr = TableCodebookDescReader::new(&VP31_AC_CAT0_CODES[i], &VP31_AC_CAT0_BITS[i], map_idx);
86 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
87 ptr::write(&mut ac0_cb[i], cb);
88 let mut cr = TableCodebookDescReader::new(&VP31_AC_CAT1_CODES[i], &VP31_AC_CAT1_BITS[i], map_idx);
89 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
90 ptr::write(&mut ac1_cb[i], cb);
91 let mut cr = TableCodebookDescReader::new(&VP31_AC_CAT2_CODES[i], &VP31_AC_CAT2_BITS[i], map_idx);
92 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
93 ptr::write(&mut ac2_cb[i], cb);
94 let mut cr = TableCodebookDescReader::new(&VP31_AC_CAT3_CODES[i], &VP31_AC_CAT3_BITS[i], map_idx);
95 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
96 ptr::write(&mut ac3_cb[i], cb);
97 }
98 }
99 Self { dc_cb, ac0_cb, ac1_cb, ac2_cb, ac3_cb }
100 }
101 fn new_vp4() -> VP31Codes {
102 let mut dc_cb: [Codebook<u8>; 16];
103 let mut ac0_cb: [Codebook<u8>; 16];
104 let mut ac1_cb: [Codebook<u8>; 16];
105 let mut ac2_cb: [Codebook<u8>; 16];
106 let mut ac3_cb: [Codebook<u8>; 16];
107 unsafe {
108 dc_cb = mem::uninitialized();
109 ac0_cb = mem::uninitialized();
110 ac1_cb = mem::uninitialized();
111 ac2_cb = mem::uninitialized();
112 ac3_cb = mem::uninitialized();
113 for i in 0..16 {
114 let mut cr = TableCodebookDescReader::new(&VP40_DC_CODES[i], &VP40_DC_BITS[i], map_idx);
115 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
116 ptr::write(&mut dc_cb[i], cb);
117
118 let mut cr = TableCodebookDescReader::new(&VP40_AC_CAT0_CODES[i], &VP40_AC_CAT0_BITS[i], map_idx);
119 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
120 ptr::write(&mut ac0_cb[i], cb);
121 let mut cr = TableCodebookDescReader::new(&VP40_AC_CAT1_CODES[i], &VP40_AC_CAT1_BITS[i], map_idx);
122 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
123 ptr::write(&mut ac1_cb[i], cb);
124 let mut cr = TableCodebookDescReader::new(&VP40_AC_CAT2_CODES[i], &VP40_AC_CAT2_BITS[i], map_idx);
125 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
126 ptr::write(&mut ac2_cb[i], cb);
127 let mut cr = TableCodebookDescReader::new(&VP40_AC_CAT3_CODES[i], &VP40_AC_CAT3_BITS[i], map_idx);
128 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
129 ptr::write(&mut ac3_cb[i], cb);
130 }
131 }
132 VP31Codes { dc_cb, ac0_cb, ac1_cb, ac2_cb, ac3_cb }
133 }
134 }
135
136 struct VP40AuxCodes {
137 mv_x_cb: [Codebook<i8>; 7],
138 mv_y_cb: [Codebook<i8>; 7],
139 mbpat_cb: [Codebook<u8>; 2],
140 }
141
142 fn map_mv(idx: usize) -> i8 {
143 (idx as i8) - 31
144 }
145
146 impl VP40AuxCodes {
147 fn new() -> Self {
148 let mut mv_x_cb: [Codebook<i8>; 7];
149 let mut mv_y_cb: [Codebook<i8>; 7];
150 unsafe {
151 mv_x_cb = mem::uninitialized();
152 mv_y_cb = mem::uninitialized();
153 for i in 0..7 {
154 let mut cr = TableCodebookDescReader::new(&VP40_MV_X_CODES[i], &VP40_MV_X_BITS[i], map_mv);
155 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
156 ptr::write(&mut mv_x_cb[i], cb);
157 let mut cr = TableCodebookDescReader::new(&VP40_MV_Y_CODES[i], &VP40_MV_Y_BITS[i], map_mv);
158 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
159 ptr::write(&mut mv_y_cb[i], cb);
160 }
161 }
162 let mut cr0 = TableCodebookDescReader::new(&VP40_MBPAT_CODES[0], &VP40_MBPAT_BITS[0], map_idx);
163 let mut cr1 = TableCodebookDescReader::new(&VP40_MBPAT_CODES[1], &VP40_MBPAT_BITS[1], map_idx);
164 let mbpat_cb = [Codebook::new(&mut cr0, CodebookMode::MSB).unwrap(),
165 Codebook::new(&mut cr1, CodebookMode::MSB).unwrap()];
166 Self { mv_x_cb, mv_y_cb, mbpat_cb }
167 }
168 }
169
170 enum Codes {
171 None,
172 VP30(VP30Codes),
173 VP31(VP31Codes),
174 }
175
176 #[derive(Clone)]
177 struct Block {
178 btype: VPMBType,
179 coeffs: [i16; 64],
180 has_ac: bool,
181 idx: usize,
182 mv: MV,
183 coded: bool,
184 }
185
186 impl Block {
187 fn new() -> Self {
188 Self {
189 btype: VPMBType::Intra,
190 coeffs: [0; 64],
191 has_ac: false,
192 idx: 0,
193 mv: ZERO_MV,
194 coded: false,
195 }
196 }
197 }
198
199 type ReadRunFunc = fn (&mut BitReader) -> DecoderResult<usize>;
200
201 const VP31_LONG_RUN_BASE: [usize; 7] = [ 1, 2, 4, 6, 10, 18, 34 ];
202 const VP31_LONG_RUN_BITS: [u8; 7] = [ 0, 1, 1, 2, 3, 4, 12 ];
203 fn read_long_run(br: &mut BitReader) -> DecoderResult<usize> {
204 let pfx = br.read_code(UintCodeType::LimitedUnary(6, 0))? as usize;
205 if pfx == 0 { return Ok(1); }
206 Ok(VP31_LONG_RUN_BASE[pfx] + (br.read(VP31_LONG_RUN_BITS[pfx])? as usize))
207 }
208
209 const VP31_SHORT_RUN_BASE: [usize; 6] = [ 1, 3, 5, 7, 11, 15 ];
210 const VP31_SHORT_RUN_BITS: [u8; 6] = [ 1, 1, 1, 2, 2, 4 ];
211 fn read_short_run(br: &mut BitReader) -> DecoderResult<usize> {
212 let pfx = br.read_code(UintCodeType::LimitedUnary(5, 0))? as usize;
213 Ok(VP31_SHORT_RUN_BASE[pfx] + (br.read(VP31_SHORT_RUN_BITS[pfx])? as usize))
214 }
215
216 fn read_mb_run(br: &mut BitReader) -> DecoderResult<usize> {
217 let pfx = br.read_code(UintCodeType::LimitedUnary(10, 0))? as usize;
218 if pfx == 10 { unimplemented!(); }
219 if pfx < 2 {
220 Ok(pfx + 1)
221 } else {
222 let base = (1 << (pfx - 1)) + 1;
223 let bits = (pfx - 1) as u8;
224 let add_bits = br.read(bits)? as usize;
225 Ok(base + add_bits)
226 }
227 }
228
229 struct BitRunDecoder {
230 value: bool,
231 run: usize,
232 read_run: ReadRunFunc,
233 }
234
235 impl BitRunDecoder {
236 fn new(br: &mut BitReader, read_run: ReadRunFunc) -> DecoderResult<Self> {
237 let value = !br.read_bool()?; // it will be flipped before run decoding
238 Ok(Self { value, run: 0, read_run })
239 }
240 fn get_val(&mut self, br: &mut BitReader) -> DecoderResult<bool> {
241 if self.run == 0 {
242 self.value = !self.value;
243 self.run = (self.read_run)(br)?;
244 }
245 self.run -= 1;
246 Ok(self.value)
247 }
248 }
249
250 const VP30_NE0_BITS: [u8; 5] = [ 2, 2, 3, 4, 8 ];
251 const VP30_NE0_BASE: [usize; 5] = [ 1, 5, 9, 17, 33 ];
252 fn vp30_read_ne_run0(br: &mut BitReader) -> DecoderResult<usize> {
253 let len = br.read_code(UintCodeType::LimitedUnary(4, 0))? as usize;
254 Ok(VP30_NE0_BASE[len] + (br.read(VP30_NE0_BITS[len])? as usize))
255 }
256 fn vp30_read_ne_run1(br: &mut BitReader) -> DecoderResult<usize> {
257 let len = br.read_code(UintCodeType::LimitedUnary(6, 0))? as usize;
258 if len == 0 {
259 Ok((br.read(1)? as usize) + 1)
260 } else if len < 6 {
261 Ok(len + 2)
262 } else {
263 Ok((br.read(8)? as usize) + 8)
264 }
265 }
266 fn vp30_read_coded_run0(br: &mut BitReader) -> DecoderResult<usize> {
267 let len = br.read_code(UintCodeType::LimitedUnary(5, 0))? as usize;
268 Ok(len + 1)
269 }
270 /*
271 0 - 1
272 11 - 2
273 1000 - 3
274 1010 - 4
275 10011 - 5
276 10111 - 6
277 10010 - 7 + get_bits(3)
278 101100 - 15 + get_bits(5)
279 1011010 - 47 + get_bits(8)
280 1011011 - 303 + get_bits(16)
281 */
282 const VP30_CRUN1_LUT: [u8; 32] = [
283 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
284 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
285 0x34, 0x34, 0x75, 0x55, 0x44, 0x44, 0x85, 0x65,
286 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22
287 ];
288 fn vp30_read_coded_run1(br: &mut BitReader) -> DecoderResult<usize> {
289 let idx = br.peek(5) as usize;
290 let sym = (VP30_CRUN1_LUT[idx] >> 4) as usize;
291 let bits = VP30_CRUN1_LUT[idx] & 0xF;
292 br.skip(bits as u32)?;
293 if sym < 7 {
294 Ok(sym)
295 } else if sym == 7 {
296 Ok(7 + (br.read(3)? as usize))
297 } else {
298 let len = br.read_code(UintCodeType::Unary012)?;
299 match len {
300 0 => Ok(15 + (br.read(5)? as usize)),
301 1 => Ok(47 + (br.read(8)? as usize)),
302 _ => Ok(303 + (br.read(16)? as usize)),
303 }
304 }
305 }
306
307 struct VP34Decoder {
308 info: NACodecInfoRef,
309 width: usize,
310 height: usize,
311 mb_w: usize,
312 mb_h: usize,
313 version: u8,
314 is_intra: bool,
315 update_gf: bool,
316 quant: usize,
317 shuf: VPShuffler,
318 codes: Codes,
319 aux_codes: Option<VP40AuxCodes>,
320 loop_str: i16,
321 mc_buf: NAVideoBufferRef<u8>,
322
323 blocks: Vec<Block>,
324 mb_coded: Vec<bool>,
325 mb_partial: Vec<bool>,
326 y_blocks: usize,
327 y_sbs: usize,
328 qmat_y: [i16; 64],
329 qmat_c: [i16; 64],
330 qmat_y_p: [i16; 64],
331 qmat_c_p: [i16; 64],
332
333 eob_run: usize,
334 last_dc: [i16; 3],
335
336 blk_addr: Vec<usize>,
337 blk_sub: Vec<u8>,
338 sb_info: Vec<SBState>,
339 sb_blocks: Vec<u8>,
340 sb_mbs: Vec<u8>,
341 mb_blocks: Vec<u8>,
342 }
343
344 fn vp30_read_mv_comp(br: &mut BitReader) -> DecoderResult<i16> {
345 let mode = br.read(2)?;
346 if mode == 0 { return Ok(0); }
347 let sign = br.read_bool()?;
348 let val = match mode - 1 {
349 0 => 1,
350 1 => 2 + (br.read(2)? as i16),
351 _ => br.read(5)? as i16,
352 };
353 if !sign {
354 Ok(val)
355 } else {
356 Ok(-val)
357 }
358 }
359
360 fn vp30_read_mv(br: &mut BitReader) -> DecoderResult<MV> {
361 let x = vp30_read_mv_comp(br)?;
362 let y = vp30_read_mv_comp(br)?;
363 Ok(MV{ x, y })
364 }
365
366 fn read_mv_comp_packed(br: &mut BitReader) -> DecoderResult<i16> {
367 let code = br.read(3)?;
368 match code {
369 0 => Ok(0),
370 1 => Ok(1),
371 2 => Ok(-1),
372 3 => if br.read_bool()? { Ok(-2) } else { Ok(2) },
373 4 => if br.read_bool()? { Ok(-3) } else { Ok(3) },
374 5 => {
375 let val = (br.read(2)? as i16) + 4;
376 if br.read_bool()? {
377 Ok(-val)
378 } else {
379 Ok(val)
380 }
381 },
382 6 => {
383 let val = (br.read(3)? as i16) + 8;
384 if br.read_bool()? {
385 Ok(-val)
386 } else {
387 Ok(val)
388 }
389 },
390 _ => {
391 let val = (br.read(4)? as i16) + 16;
392 if br.read_bool()? {
393 Ok(-val)
394 } else {
395 Ok(val)
396 }
397 },
398 }
399 }
400
401 fn read_mv_packed(br: &mut BitReader) -> DecoderResult<MV> {
402 let x = read_mv_comp_packed(br)?;
403 let y = read_mv_comp_packed(br)?;
404 Ok(MV{ x, y })
405 }
406
407 fn read_mv_comp_raw(br: &mut BitReader) -> DecoderResult<i16> {
408 let val = br.read(5)? as i16;
409 if br.read_bool()? {
410 Ok(-val)
411 } else {
412 Ok(val)
413 }
414 }
415
416 fn read_mv_raw(br: &mut BitReader) -> DecoderResult<MV> {
417 let x = read_mv_comp_raw(br)?;
418 let y = read_mv_comp_raw(br)?;
419 Ok(MV{ x, y })
420 }
421
422 fn rescale_qmat(dst_qmat: &mut [i16; 64], base_qmat: &[i16; 64], dc_quant: i16, ac_quant: i16, minval: i16) {
423 for (dst, src) in dst_qmat.iter_mut().zip(base_qmat.iter()) {
424 *dst = (src.wrapping_mul(ac_quant) / 100).max(minval) << 2;
425 }
426 dst_qmat[0] = (base_qmat[0] * dc_quant / 100).max(minval * 2) << 2;
427 }
428
429 fn expand_token(blk: &mut Block, br: &mut BitReader, eob_run: &mut usize, token: u8) -> DecoderResult<()> {
430 match token {
431 // EOBs
432 0 | 1 | 2 => { *eob_run = (token as usize) + 1; },
433 3 | 4 | 5 => {
434 let bits = token - 1;
435 *eob_run = (br.read(bits)? as usize) + (1 << bits);
436 },
437 6 => { *eob_run = br.read(12)? as usize; },
438 // zero runs
439 7 | 8 => {
440 let bits = if token == 7 { 3 } else { 6 };
441 let run = (br.read(bits)? as usize) + 1;
442 blk.idx += run;
443 validate!(blk.idx <= 64);
444 },
445 // single coefficients
446 9 | 10 | 11 | 12 => {
447 let val = (i16::from(token) - 7) >> 1;
448 if (token & 1) == 1 {
449 blk.coeffs[ZIGZAG[blk.idx]] = val;
450 } else {
451 blk.coeffs[ZIGZAG[blk.idx]] = -val;
452 }
453 blk.idx += 1;
454 },
455 13 | 14 | 15 | 16 => {
456 let val = i16::from(token) - 10;
457 if !br.read_bool()? {
458 blk.coeffs[ZIGZAG[blk.idx]] = val;
459 } else {
460 blk.coeffs[ZIGZAG[blk.idx]] = -val;
461 }
462 blk.idx += 1;
463 },
464 17 | 18 | 19 | 20 | 21 | 22 => {
465 let add_bits = if token == 22 { 9 } else { token - 16 };
466 let sign = br.read_bool()?;
467 let val = (br.read(add_bits)? as i16) + VP3_LITERAL_BASE[(token - 17) as usize];
468 if !sign {
469 blk.coeffs[ZIGZAG[blk.idx]] = val;
470 } else {
471 blk.coeffs[ZIGZAG[blk.idx]] = -val;
472 }
473 blk.idx += 1;
474 }
475 // zero run plus coefficient
476 23 | 24 | 25 | 26 | 27 => {
477 blk.idx += (token - 22) as usize;
478 validate!(blk.idx < 64);
479 if !br.read_bool()? {
480 blk.coeffs[ZIGZAG[blk.idx]] = 1;
481 } else {
482 blk.coeffs[ZIGZAG[blk.idx]] = -1;
483 }
484 blk.idx += 1;
485 },
486 28 | 29 => {
487 let run_bits = token - 26;
488 if token == 28 {
489 blk.idx += 6;
490 } else {
491 blk.idx += 10;
492 }
493 let sign = br.read_bool()?;
494 blk.idx += br.read(run_bits)? as usize;
495 validate!(blk.idx < 64);
496 if !sign {
497 blk.coeffs[ZIGZAG[blk.idx]] = 1;
498 } else {
499 blk.coeffs[ZIGZAG[blk.idx]] = -1;
500 }
501 blk.idx += 1;
502 },
503 30 => {
504 blk.idx += 1;
505 validate!(blk.idx < 64);
506 let sign = br.read_bool()?;
507 let val = (br.read(1)? as i16) + 2;
508 if !sign {
509 blk.coeffs[ZIGZAG[blk.idx]] = val;
510 } else {
511 blk.coeffs[ZIGZAG[blk.idx]] = -val;
512 }
513 blk.idx += 1;
514 },
515 _ => {
516 let sign = br.read_bool()?;
517 let val = (br.read(1)? as i16) + 2;
518 blk.idx += (br.read(1)? as usize) + 2;
519 validate!(blk.idx < 64);
520 if !sign {
521 blk.coeffs[ZIGZAG[blk.idx]] = val;
522 } else {
523 blk.coeffs[ZIGZAG[blk.idx]] = -val;
524 }
525 blk.idx += 1;
526 },
527 };
528 if *eob_run > 0 {
529 blk.idx = 64;
530 *eob_run -= 1;
531 } else if (token > 8) && (blk.idx > 1) {
532 blk.has_ac = true;
533 }
534 Ok(())
535 }
536
537 macro_rules! fill_dc_pred {
538 ($self: expr, $ref_id: expr, $pred: expr, $pp: expr, $bit: expr, $idx: expr) => {
539 if $self.blocks[$idx].coded && $self.blocks[$idx].btype.get_ref_id() == $ref_id {
540 $pred[$bit] = $self.blocks[$idx].coeffs[0] as i32;
541 $pp |= 1 << $bit;
542 }
543 };
544 }
545
546 fn vp31_loop_filter_v(frm: &mut NASimpleVideoFrame<u8>, x: usize, y: usize, plane: usize, loop_str: i16) {
547 let off = frm.offset[plane] + x + y * frm.stride[plane];
548 vp31_loop_filter(frm.data, off, 1, frm.stride[plane], 8, loop_str);
549 }
550
551 fn vp31_loop_filter_h(frm: &mut NASimpleVideoFrame<u8>, x: usize, y: usize, plane: usize, loop_str: i16) {
552 let off = frm.offset[plane] + x + y * frm.stride[plane];
553 vp31_loop_filter(frm.data, off, frm.stride[plane], 1, 8, loop_str);
554 }
555
556 fn vp3_mv_mode(mvx: i16, mvy: i16) -> usize {
557 let mode = ((mvx & 1) + (mvy & 1) * 2) as usize;
558 if (mode == 3) && (mvx ^ mvy < 0) {
559 4
560 } else {
561 mode
562 }
563 }
564
565 impl VP34Decoder {
566 fn new(version: u8) -> Self {
567 let vt = alloc_video_buffer(NAVideoInfo::new(24, 24, false, YUV420_FORMAT), 4).unwrap();
568 let mc_buf = vt.get_vbuf().unwrap();
569 Self {
570 info: NACodecInfoRef::default(),
571 width: 0,
572 height: 0,
573 mb_w: 0,
574 mb_h: 0,
575 version,
576 is_intra: true,
577 update_gf: false,
578 quant: 0,
579 shuf: VPShuffler::new(),
580 codes: Codes::None,
581 aux_codes: None,
582 loop_str: 0,
583 mc_buf,
584
585 blocks: Vec::new(),
586 mb_coded: Vec::new(),
587 mb_partial: Vec::new(),
588 y_blocks: 0,
589 y_sbs: 0,
590
591 qmat_y: [0; 64],
592 qmat_c: [0; 64],
593 qmat_y_p: [0; 64],
594 qmat_c_p: [0; 64],
595
596 eob_run: 0,
597 last_dc: [0; 3],
598
599 blk_addr: Vec::new(),
600 blk_sub: Vec::new(),
601 sb_info: Vec::new(),
602 sb_blocks: Vec::new(),
603 sb_mbs: Vec::new(),
604 mb_blocks: Vec::new(),
605 }
606 }
607 fn parse_header(&mut self, br: &mut BitReader) -> DecoderResult<()> {
608 self.is_intra = !br.read_bool()?;
609 br.skip(1)?;
610 self.quant = br.read(6)? as usize;
611 if self.is_intra {
612 if br.peek(8) != 0 {
613 validate!(self.version == 3 || self.version == 30);
614 let mb_w = br.read(8)? as usize;
615 let mb_h = br.read(8)? as usize;
616 validate!(mb_w == self.mb_w && mb_h == self.mb_h);
617 if self.version == 3 {
618 self.version = 30;
619 self.codes = Codes::VP30(VP30Codes::new());
620 }
621 } else {
622 let version = br.read(13)?;
623 let coding_type = br.read(1)?;
624 validate!(coding_type == 0);
625 br.skip(2)?;
626 if version == 1 {
627 validate!(self.version == 3 || self.version == 31);
628 if self.version == 3 {
629 self.version = 31;
630 self.codes = Codes::VP31(VP31Codes::new());
631 }
632 } else if version == 3 {
633 validate!(self.version == 4);
634 let mb_h = br.read(8)? as usize;
635 let mb_w = br.read(8)? as usize;
636 validate!(mb_w == self.mb_w && mb_h == self.mb_h);
637 let fact1 = br.read(5)?;
638 let fact2 = br.read(3)?;
639 validate!(fact1 == 1 && fact2 == 1);
640 let fact1 = br.read(5)?;
641 let fact2 = br.read(3)?;
642 validate!(fact1 == 1 && fact2 == 1);
643 br.skip(2)?;
644 } else {
645 return Err(DecoderError::InvalidData);
646 }
647 }
648 }
649 self.loop_str = if self.version != 4 {
650 VP31_LOOP_STRENGTH[self.quant]
651 } else {
652 VP40_LOOP_STRENGTH[self.quant]
653 };
654 Ok(())
655 }
656 fn vp30_unpack_sb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
657 let mut has_nonempty = false;
658 {
659 let mut bit = !br.read_bool()?;
660 let mut run = 0;
661 for sb in self.sb_info.iter_mut() {
662 if run == 0 {
663 bit = !bit;
664 run = if bit { vp30_read_ne_run1(br)? } else { vp30_read_ne_run0(br)? };
665 }
666 *sb = if bit { has_nonempty = true; SBState::Partial } else { SBState::Uncoded };
667 run -= 1;
668 }
669 validate!(run == 0);
670 }
671 if has_nonempty {
672 for el in self.mb_coded.iter_mut() { *el = false; }
673 let mut bit = !br.read_bool()?;
674 let mut run = 0;
675 let mut mbiter = self.mb_coded.iter_mut();
676 for (sb, nmb) in self.sb_info.iter_mut().zip(self.sb_mbs.iter()) {
677 let nmbs = *nmb as usize;
678 if *sb == SBState::Partial {
679 for _ in 0..nmbs {
680 if run == 0 {
681 bit = !bit;
682 run = if bit { vp30_read_coded_run1(br)? } else { vp30_read_coded_run0(br)? };
683 }
684 run -= 1;
685 *mbiter.next().unwrap() = bit;
686 }
687 } else {
688 for _ in 0..nmbs {
689 mbiter.next().unwrap();
690 }
691 }
692 }
693 validate!(run == 0);
694 let mut bit = !br.read_bool()?;
695 let mut run = 0;
696 let mut cur_blk = 0;
697 for (coded, nblk) in self.mb_coded.iter().zip(self.mb_blocks.iter()) {
698 let nblks = *nblk as usize;
699 if *coded {
700 let mut cb = [false; 4];
701 for j in 0..nblks {
702 if run == 0 {
703 bit = !bit;
704 run = if bit { vp30_read_coded_run1(br)? } else { vp30_read_coded_run0(br)? };
705 }
706 run -= 1;
707 cb[j] = bit;
708 }
709 for j in 0..nblks {
710 let addr = self.blk_addr[cur_blk + j] >> 2;
711 self.blocks[addr].coded = cb[j];
712 }
713 }
714 cur_blk += nblks;
715 }
716 validate!(run == 0);
717 }
718 Ok(())
719 }
720 fn vp30_unpack_mb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
721 let mut cur_blk = 0;
722 if let Codes::VP30(ref codes) = self.codes {
723 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()).take(self.y_sbs) {
724 let nblks = *nblk as usize;
725 if *sb == SBState::Uncoded {
726 for _ in 0..nblks {
727 self.blocks[self.blk_addr[cur_blk] >> 2].btype = VPMBType::InterNoMV;
728 cur_blk += 1;
729 }
730 } else {
731 for _ in 0..nblks/4 {
732 let mut coded = *sb == SBState::Coded;
733 if !coded {
734 for blk in 0..4 {
735 if self.blocks[self.blk_addr[cur_blk + blk] >> 2].coded {
736 coded = true;
737 break;
738 }
739 }
740 }
741 let mode = if !coded {
742 VPMBType::InterNoMV
743 } else {
744 br.read_cb(&codes.mbtype_cb)?
745 };
746 for _ in 0..4 {
747 self.blocks[self.blk_addr[cur_blk] >> 2].btype = mode;
748 cur_blk += 1;
749 }
750 }
751 }
752 }
753 } else {
754 return Err(DecoderError::Bug);
755 }
756 // replicate types for chroma
757 let mut off_y = 0;
758 let mut off_u = self.y_blocks;
759 let mut off_v = off_u + self.mb_w * self.mb_h;
760 for _blk_y in 0..self.mb_h {
761 for blk_x in 0..self.mb_w {
762 let btype = self.blocks[off_y + blk_x * 2].btype;
763 self.blocks[off_u + blk_x].btype = btype;
764 self.blocks[off_v + blk_x].btype = btype;
765 }
766 off_y += self.mb_w * 2 * 2;
767 off_u += self.mb_w;
768 off_v += self.mb_w;
769 }
770 Ok(())
771 }
772 fn vp30_unpack_mv_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
773 let mut last_mv = ZERO_MV;
774
775 let mut cur_blk = 0;
776 for _ in 0..self.y_blocks/4 {
777 let baddr = self.blk_addr[cur_blk] >> 2;
778 if self.blocks[baddr].btype == VPMBType::InterFourMV {
779 let saddr = baddr.min(self.blk_addr[cur_blk + 1] >> 2).min(self.blk_addr[cur_blk + 2] >> 2).min(self.blk_addr[cur_blk + 3] >> 2);
780 for i in 0..4 {
781 let blk = &mut self.blocks[saddr + (i & 1) + (i & 2) * self.mb_w];
782 if blk.coded {
783 blk.mv = vp30_read_mv(br)?;
784 }
785 cur_blk += 1;
786 }
787 } else {
788 let cur_mv;
789 match self.blocks[baddr].btype {
790 VPMBType::Intra | VPMBType::InterNoMV | VPMBType::GoldenNoMV => {
791 cur_mv = ZERO_MV;
792 },
793 VPMBType::InterMV => {
794 cur_mv = vp30_read_mv(br)?;
795 last_mv = cur_mv;
796 },
797 VPMBType::InterNearest => {
798 cur_mv = last_mv;
799 },
800 _ => { // GoldenMV
801 cur_mv = vp30_read_mv(br)?;
802 },
803 };
804 for _ in 0..4 {
805 self.blocks[self.blk_addr[cur_blk] >> 2].mv = cur_mv;
806 cur_blk += 1;
807 }
808 }
809 }
810 Ok(())
811 }
812 fn vp30_unpack_coeffs(&mut self, br: &mut BitReader, coef_no: usize, table: usize) -> DecoderResult<()> {
813 if let Codes::VP30(ref codes) = self.codes {
814 for blkaddr in self.blk_addr.iter() {
815 let blk: &mut Block = &mut self.blocks[blkaddr >> 2];
816 if !blk.coded || blk.idx != coef_no { continue; }
817 if self.eob_run > 0 {
818 blk.idx = 64;
819 self.eob_run -= 1;
820 continue;
821 }
822 let cb = if coef_no == 0 {
823 &codes.dc_cb[table]
824 } else if blk.btype.is_intra() {
825 &codes.ac_i_cb[table]
826 } else {
827 &codes.ac_p_cb[table]
828 };
829 let token = br.read_cb(cb)?;
830 expand_token(blk, br, &mut self.eob_run, token)?;
831 }
832 Ok(())
833 } else {
834 Err(DecoderError::Bug)
835 }
836 }
837 fn vp31_unpack_sb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
838 let mut has_uncoded = false;
839 let mut has_partial = false;
840 {
841 let mut brun = BitRunDecoder::new(br, read_long_run)?;
842 for sb in self.sb_info.iter_mut() {
843 if brun.get_val(br)? {
844 *sb = SBState::Partial;
845 has_partial = true;
846 } else {
847 *sb = SBState::Uncoded;
848 has_uncoded = true;
849 }
850 }
851 }
852 if has_uncoded {
853 let mut brun = BitRunDecoder::new(br, read_long_run)?;
854 let mut cur_blk = 0;
855 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()) {
856 let nblks = *nblk as usize;
857 if *sb != SBState::Partial && brun.get_val(br)? {
858 *sb = SBState::Coded;
859 for _ in 0..nblks {
860 let blk_idx = self.blk_addr[cur_blk] >> 2;
861 self.blocks[blk_idx].coded = true;
862 cur_blk += 1;
863 }
864 } else {
865 for _ in 0..nblks {
866 let blk_idx = self.blk_addr[cur_blk] >> 2;
867 self.blocks[blk_idx].coded = false;
868 cur_blk += 1;
869 }
870 }
871 }
872 }
873 if has_partial {
874 let mut brun = BitRunDecoder::new(br, read_short_run)?;
875 let mut cur_blk = 0;
876 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()) {
877 let nblks = *nblk as usize;
878 if *sb == SBState::Partial {
879 for _ in 0..nblks {
880 let blk_idx = self.blk_addr[cur_blk] >> 2;
881 self.blocks[blk_idx].coded = brun.get_val(br)?;
882 cur_blk += 1;
883 }
884 } else {
885 cur_blk += nblks;
886 }
887 }
888 }
889 Ok(())
890 }
891 fn vp31_unpack_mb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
892 let mut modes = [VPMBType::InterNoMV; 8];
893 let alphabet = br.read(3)? as usize;
894 let raw_modes = alphabet >= 7;
895 if alphabet == 0 {
896 for mode in VP31_DEFAULT_MB_MODES.iter() {
897 modes[br.read(3)? as usize] = *mode;
898 }
899 } else if alphabet < 7 {
900 modes.copy_from_slice(&VP31_MB_MODES[alphabet - 1]);
901 }
902
903 let mut cur_blk = 0;
904 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()).take(self.y_sbs) {
905 let nblks = *nblk as usize;
906 if *sb == SBState::Uncoded {
907 for _ in 0..nblks {
908 self.blocks[self.blk_addr[cur_blk] >> 2].btype = VPMBType::InterNoMV;
909 cur_blk += 1;
910 }
911 } else {
912 for _ in 0..nblks/4 {
913 let mut coded = *sb == SBState::Coded;
914 if !coded {
915 for blk in 0..4 {
916 if self.blocks[self.blk_addr[cur_blk + blk] >> 2].coded {
917 coded = true;
918 break;
919 }
920 }
921 }
922 let mode = if !coded {
923 VPMBType::InterNoMV
924 } else if !raw_modes {
925 let code = br.read_code(UintCodeType::LimitedUnary(7, 0))?;
926 modes[code as usize]
927 } else {
928 VP31_DEFAULT_MB_MODES[br.read(3)? as usize]
929 };
930 for _ in 0..4 {
931 self.blocks[self.blk_addr[cur_blk] >> 2].btype = mode;
932 cur_blk += 1;
933 }
934 }
935 }
936 }
937 // replicate types for chroma
938 let mut off_y = 0;
939 let mut off_u = self.y_blocks;
940 let mut off_v = off_u + self.mb_w * self.mb_h;
941 for _blk_y in 0..self.mb_h {
942 for blk_x in 0..self.mb_w {
943 let btype = self.blocks[off_y + blk_x * 2].btype;
944 self.blocks[off_u + blk_x].btype = btype;
945 self.blocks[off_v + blk_x].btype = btype;
946 }
947 off_y += self.mb_w * 2 * 2;
948 off_u += self.mb_w;
949 off_v += self.mb_w;
950 }
951 Ok(())
952 }
953 fn vp31_unpack_mv_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
954 let mut last_mv = ZERO_MV;
955 let mut last2_mv = ZERO_MV;
956 let read_mv = if br.read_bool()? { read_mv_raw } else { read_mv_packed };
957
958 let mut cur_blk = 0;
959 for _ in 0..self.y_blocks/4 {
960 if self.blocks[self.blk_addr[cur_blk] >> 2].btype == VPMBType::InterFourMV {
961 let a0 = self.blk_addr[cur_blk + 0] >> 2;
962 let a1 = self.blk_addr[cur_blk + 1] >> 2;
963 let a2 = self.blk_addr[cur_blk + 2] >> 2;
964 let a3 = self.blk_addr[cur_blk + 3] >> 2;
965 let first = a0.min(a1).min(a2).min(a3);
966 let last = a0.max(a1).max(a2).max(a3);
967 self.blocks[first + 0].mv = (read_mv)(br)?;
968 self.blocks[first + 1].mv = (read_mv)(br)?;
969 self.blocks[last - 1].mv = (read_mv)(br)?;
970 self.blocks[last + 0].mv = (read_mv)(br)?;
971 last2_mv = last_mv;
972 last_mv = self.blocks[last].mv;
973 cur_blk += 4;
974 } else {
975 let cur_mv;
976 match self.blocks[self.blk_addr[cur_blk] >> 2].btype {
977 VPMBType::Intra | VPMBType::InterNoMV | VPMBType::GoldenNoMV => {
978 cur_mv = ZERO_MV;
979 },
980 VPMBType::InterMV => {
981 cur_mv = (read_mv)(br)?;
982 last2_mv = last_mv;
983 last_mv = cur_mv;
984 },
985 VPMBType::InterNearest => {
986 cur_mv = last_mv;
987 },
988 VPMBType::InterNear => {
989 cur_mv = last2_mv;
990 std::mem::swap(&mut last_mv, &mut last2_mv);
991 },
992 _ => { // GoldenMV
993 cur_mv = (read_mv)(br)?;
994 },
995 };
996 for _ in 0..4 {
997 self.blocks[self.blk_addr[cur_blk] >> 2].mv = cur_mv;
998 cur_blk += 1;
999 }
1000 }
1001 }
1002 Ok(())
1003 }
1004 fn vp31_unpack_coeffs(&mut self, br: &mut BitReader, coef_no: usize, table_y: usize, table_c: usize) -> DecoderResult<()> {
1005 if let Codes::VP31(ref codes) = self.codes {
1006 let cbs = if coef_no == 0 {
1007 [&codes.dc_cb[table_y], &codes.dc_cb[table_c]]
1008 } else if coef_no < 6 {
1009 [&codes.ac0_cb[table_y], &codes.ac0_cb[table_c]]
1010 } else if coef_no < 15 {
1011 [&codes.ac1_cb[table_y], &codes.ac1_cb[table_c]]
1012 } else if coef_no < 28 {
1013 [&codes.ac2_cb[table_y], &codes.ac2_cb[table_c]]
1014 } else {
1015 [&codes.ac3_cb[table_y], &codes.ac3_cb[table_c]]
1016 };
1017 for blkaddr in self.blk_addr.iter() {
1018 let blk: &mut Block = &mut self.blocks[blkaddr >> 2];
1019 if !blk.coded || blk.idx != coef_no { continue; }
1020 if self.eob_run > 0 {
1021 blk.idx = 64;
1022 self.eob_run -= 1;
1023 continue;
1024 }
1025 let cb = if (blkaddr & 3) == 0 { cbs[0] } else { cbs[1] };
1026 let token = br.read_cb(cb)?;
1027 expand_token(blk, br, &mut self.eob_run, token)?;
1028 }
1029 Ok(())
1030 } else {
1031 Err(DecoderError::Bug)
1032 }
1033 }
1034 fn vp40_unpack_sb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
1035 let mut has_uncoded = false;
1036
1037 if let Some(ref aux_codes) = self.aux_codes {
1038 for el in self.sb_info.iter_mut() {
1039 *el = SBState::Partial;
1040 }
1041 {
1042 let mut mbiter = self.mb_coded.iter_mut();
1043 let mut brun = BitRunDecoder::new(br, read_mb_run)?;
1044 for nmb in self.sb_mbs.iter() {
1045 let nmbs = *nmb as usize;
1046 for _ in 0..nmbs {
1047 let coded = brun.get_val(br)?;
1048 *mbiter.next().unwrap() = coded;
1049 has_uncoded |= !coded;
1050 }
1051 }
1052 }
1053 if has_uncoded {
1054 let mut mbiter = self.mb_coded.iter().zip(self.mb_partial.iter_mut());
1055 let mut brun = BitRunDecoder::new(br, read_mb_run)?;
1056 for nmb in self.sb_mbs.iter() {
1057 let nmbs = *nmb as usize;
1058 for _ in 0..nmbs {
1059 let (coded, partial) = mbiter.next().unwrap();
1060 if *coded {
1061 *partial = false;
1062 } else {
1063 *partial = brun.get_val(br)?;
1064 }
1065 }
1066 }
1067
1068 let mut bpmode = 0;
1069 let mut cur_blk = 0;
1070 for ((coded, partial), nblk) in self.mb_coded.iter().zip(self.mb_partial.iter()).zip(self.mb_blocks.iter()) {
1071 let nblks = *nblk as usize;
1072 if *coded {
1073 for _ in 0..nblks {
1074 let addr = self.blk_addr[cur_blk] >> 2;
1075 self.blocks[addr].coded = true;
1076 cur_blk += 1;
1077 }
1078 } else if !*partial {
1079 for _ in 0..nblks {
1080 let addr = self.blk_addr[cur_blk] >> 2;
1081 self.blocks[addr].coded = false;
1082 cur_blk += 1;
1083 }
1084 } else {
1085 let mut pat = br.read_cb(&aux_codes.mbpat_cb[bpmode])? + 1;
1086 bpmode = VP40_BP_PREDICTOR[pat as usize] as usize;
1087
1088 let mut addrs = [0; 4];
1089 for i in 0..nblks {
1090 addrs[i] = self.blk_addr[cur_blk + i] >> 2;
1091 for j in (0..i).rev() {
1092 if addrs[j] > addrs[j + 1] {
1093 addrs.swap(j, j + 1);
1094 }
1095 }
1096 }
1097 for i in 0..nblks {
1098 self.blocks[addrs[i]].coded = (pat & 8) != 0;
1099 pat <<= 1;
1100 cur_blk += 1;
1101 }
1102 }
1103 }
1104 }
1105 Ok(())
1106 } else {
1107 Err(DecoderError::Bug)
1108 }
1109 }
1110 fn vp40_unpack_mv_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
1111 let mut last_mv = ZERO_MV;
1112 let mut last2_mv = ZERO_MV;
1113 let mut last_mv_g = ZERO_MV;
1114
1115 let mut cur_blk = 0;
1116 if let Some(ref codes) = self.aux_codes {
1117 for _ in 0..self.y_blocks/4 {
1118 if self.blocks[self.blk_addr[cur_blk] >> 2].btype == VPMBType::InterFourMV {
1119 let x_cb = &codes.mv_x_cb[VP40_MV_LUT_INDEX[last_mv.x.abs() as usize]];
1120 let y_cb = &codes.mv_y_cb[VP40_MV_LUT_INDEX[last_mv.y.abs() as usize]];
1121 let x_sign = last_mv.x < 0;
1122 let y_sign = last_mv.y < 0;
1123 last2_mv = last_mv;
1124 let saddr = (self.blk_addr[cur_blk] >> 2).min(self.blk_addr[cur_blk + 1] >> 2).min(self.blk_addr[cur_blk + 2] >> 2).min(self.blk_addr[cur_blk + 3] >> 2);
1125 for i in 0..4 {
1126 let blk = &mut self.blocks[saddr + (i & 1) + (i >> 1) * self.mb_w];
1127 blk.mv.x = br.read_cb(x_cb)? as i16;
1128 if x_sign {
1129 blk.mv.x = -blk.mv.x;
1130 }
1131 blk.mv.y = br.read_cb(y_cb)? as i16;
1132 if y_sign {
1133 blk.mv.y = -blk.mv.y;
1134 }
1135 last_mv = blk.mv;
1136 cur_blk += 1;
1137 }
1138 } else {
1139 let cur_mv;
1140 match self.blocks[self.blk_addr[cur_blk] >> 2].btype {
1141 VPMBType::Intra | VPMBType::InterNoMV | VPMBType::GoldenNoMV => {
1142 cur_mv = ZERO_MV;
1143 },
1144 VPMBType::InterMV => {
1145 let x_cb = &codes.mv_x_cb[VP40_MV_LUT_INDEX[last_mv.x.abs() as usize]];
1146 let y_cb = &codes.mv_y_cb[VP40_MV_LUT_INDEX[last_mv.y.abs() as usize]];
1147 let x_sign = last_mv.x < 0;
1148 let y_sign = last_mv.y < 0;
1149 let x = br.read_cb(x_cb)? as i16;
1150 let y = br.read_cb(y_cb)? as i16;
1151 cur_mv = MV { x: if !x_sign { x } else { -x }, y: if !y_sign { y } else { -y } };
1152 last2_mv = last_mv;
1153 last_mv = cur_mv;
1154 },
1155 VPMBType::InterNearest => {
1156 cur_mv = last_mv;
1157 },
1158 VPMBType::InterNear => {
1159 cur_mv = last2_mv;
1160 std::mem::swap(&mut last_mv, &mut last2_mv);
1161 },
1162 _ => { // GoldenMV
1163 let x_cb = &codes.mv_x_cb[VP40_MV_LUT_INDEX[last_mv_g.x.abs() as usize]];
1164 let y_cb = &codes.mv_y_cb[VP40_MV_LUT_INDEX[last_mv_g.y.abs() as usize]];
1165 let x_sign = last_mv_g.x < 0;
1166 let y_sign = last_mv_g.y < 0;
1167 let x = br.read_cb(x_cb)? as i16;
1168 let y = br.read_cb(y_cb)? as i16;
1169 cur_mv = MV { x: if !x_sign { x } else { -x }, y: if !y_sign { y } else { -y } };
1170 last_mv_g = cur_mv;
1171 },
1172 };
1173 for _ in 0..4 {
1174 self.blocks[self.blk_addr[cur_blk] >> 2].mv = cur_mv;
1175 cur_blk += 1;
1176 }
1177 }
1178 }
1179 Ok(())
1180 } else {
1181 Err(DecoderError::Bug)
1182 }
1183 }
1184 fn vp40_unpack_coeffs(&mut self, br: &mut BitReader, dc_table_y: usize, dc_table_c: usize, ac_table_y: usize, ac_table_c: usize) -> DecoderResult<()> {
1185 const VP40_PRED_MASKS: [usize; 16] = [ // top, bottom, left, right
1186 0b1010, 0b1010, 0b1000, 0b1011,
1187 0b1010, 0b1010, 0b0010, 0b1111,
1188 0b0010, 0b1010, 0b0010, 0b0110,
1189 0b0100, 0b0111, 0b1110, 0b1110
1190 ];
1191 self.last_dc = [0; 3];
1192 if let Codes::VP31(ref codes) = self.codes {
1193 let mut coef_eob: [usize; 64] = [0; 64];
1194 for (blkaddr, bsub) in self.blk_addr.iter().zip(self.blk_sub.iter()) {
1195 let blk: &mut Block = &mut self.blocks[blkaddr >> 2];
1196 if !blk.coded { continue; }
1197 let mut idx = blkaddr >> 2;
1198 let (bx, by) = if (blkaddr & 3) == 0 {
1199 (idx % (self.mb_w * 2), idx / (self.mb_w * 2))
1200 } else {
1201 idx -= self.mb_w * self.mb_h * 4;
1202 if idx >= self.mb_w * self.mb_h {
1203 idx -= self.mb_w * self.mb_h;
1204 }
1205 (idx % self.mb_w, idx / self.mb_w)
1206 };
1207 while blk.idx < 64 {
1208 if coef_eob[blk.idx] > 0 {
1209 coef_eob[blk.idx] -= 1;
1210 blk.idx = 64;
1211 continue;
1212 }
1213 let cbs = if blk.idx == 0 {
1214 [&codes.dc_cb[dc_table_y], &codes.dc_cb[dc_table_c]]
1215 } else if blk.idx < 6 {
1216 [&codes.ac0_cb[ac_table_y], &codes.ac0_cb[ac_table_c]]
1217 } else if blk.idx < 15 {
1218 [&codes.ac1_cb[ac_table_y], &codes.ac1_cb[ac_table_c]]
1219 } else if blk.idx < 28 {
1220 [&codes.ac2_cb[ac_table_y], &codes.ac2_cb[ac_table_c]]
1221 } else {
1222 [&codes.ac3_cb[ac_table_y], &codes.ac3_cb[ac_table_c]]
1223 };
1224 let cb = if (blkaddr & 3) == 0 { cbs[0] } else { cbs[1] };
1225 let token = br.read_cb(cb)?;
1226 expand_token(blk, br, &mut coef_eob[blk.idx], token)?;
1227 if blk.idx == 64 { break; }
1228 }
1229 let idx = blkaddr >> 2;
1230 let mask = VP40_PRED_MASKS[*bsub as usize];
1231 if (blkaddr & 3) == 0 {
1232 let pred_dc = self.vp40_predict_dc(bx, by, self.mb_w * 2, self.mb_h * 2, idx, mask, true);
1233 let blk: &mut Block = &mut self.blocks[blkaddr >> 2];
1234 blk.coeffs[0] += pred_dc;
1235 self.last_dc[blk.btype.get_ref_id() as usize] = blk.coeffs[0];
1236 } else {
1237 let pred_dc = self.vp40_predict_dc(bx, by, self.mb_w, self.mb_h, idx, mask, false);
1238 let blk: &mut Block = &mut self.blocks[blkaddr >> 2];
1239 blk.coeffs[0] += pred_dc;
1240 self.last_dc[blk.btype.get_ref_id() as usize] = blk.coeffs[0];
1241 }
1242 }
1243 Ok(())
1244 } else {
1245 Err(DecoderError::Bug)
1246 }
1247 }
1248 fn decode_vp30(&mut self, br: &mut BitReader, frm: &mut NASimpleVideoFrame<u8>) -> DecoderResult<()> {
1249 for blk in self.blocks.iter_mut() {
1250 blk.coeffs = [0; 64];
1251 blk.idx = 0;
1252 blk.coded = false;
1253 blk.has_ac = false;
1254 }
1255 if self.is_intra {
1256 for sb in self.sb_info.iter_mut() { *sb = SBState::Coded; }
1257 for blk in self.blocks.iter_mut() {
1258 blk.btype = VPMBType::Intra;
1259 blk.coded = true;
1260 }
1261 } else {
1262 if self.shuf.get_last().is_none() || self.shuf.get_golden().is_none() {
1263 return Err(DecoderError::MissingReference);
1264 }
1265 self.vp30_unpack_sb_info(br)?;
1266 self.vp30_unpack_mb_info(br)?;
1267 self.vp30_unpack_mv_info(br)?;
1268 }
1269 let dc_quant = VP30_DC_SCALES[self.quant] * 10;
1270 let ac_quant = VP30_AC_SCALES[self.quant];
1271
1272 self.update_gf = ac_quant <= 50;
1273
1274 rescale_qmat(&mut self.qmat_y, VP3_QMAT_Y, dc_quant, ac_quant, 2);
1275 rescale_qmat(&mut self.qmat_c, VP3_QMAT_C, dc_quant, ac_quant, 2);
1276 rescale_qmat(&mut self.qmat_y_p, VP3_QMAT_INTER, dc_quant, ac_quant, 4);
1277 if self.quant == 10 {
1278 self.qmat_y[29] = 980;
1279 self.qmat_y[58] = 1636;
1280 self.qmat_y[59] = 1964;
1281 } else if self.quant == 31 {
1282 self.qmat_y[58] = 456;
1283 } else if self.quant == 44 {
1284 self.qmat_y[58] = 224;
1285 }
1286 self.qmat_c_p.copy_from_slice(&self.qmat_y_p);
1287
1288 let table = if ac_quant <= 50 {
1289 0
1290 } else if ac_quant <= 150 {
1291 1
1292 } else if ac_quant <= 300 {
1293 2
1294 } else if ac_quant <= 600 {
1295 3
1296 } else {
1297 4
1298 };
1299
1300 self.eob_run = 0;
1301 self.vp30_unpack_coeffs(br, 0, table)?;
1302 let mut last_dc_i = 0;
1303 let mut last_dc_p = 0;
1304 for blkaddr in self.blk_addr.iter() {
1305 let blk: &mut Block = &mut self.blocks[blkaddr >> 2];
1306 if !blk.coded { continue; }
1307 if blk.btype.is_intra() {
1308 blk.coeffs[0] += last_dc_i;
1309 last_dc_i = blk.coeffs[0];
1310 } else {
1311 blk.coeffs[0] += last_dc_p;
1312 last_dc_p = blk.coeffs[0];
1313 }
1314 }
1315
1316 for coef_no in 1..64 {
1317 self.vp30_unpack_coeffs(br, coef_no, table)?;
1318 }
1319
1320 if self.is_intra {
1321 self.output_blocks_intra(frm);
1322 } else {
1323 self.output_blocks_inter(frm);
1324 }
1325
1326 Ok(())
1327 }
1328 fn decode_vp31(&mut self, br: &mut BitReader, frm: &mut NASimpleVideoFrame<u8>) -> DecoderResult<()> {
1329 for blk in self.blocks.iter_mut() {
1330 blk.coeffs = [0; 64];
1331 blk.idx = 0;
1332 blk.coded = false;
1333 blk.has_ac = false;
1334 }
1335 if self.is_intra {
1336 for sb in self.sb_info.iter_mut() { *sb = SBState::Coded; }
1337 for blk in self.blocks.iter_mut() {
1338 blk.btype = VPMBType::Intra;
1339 blk.coded = true;
1340 }
1341 } else {
1342 if self.shuf.get_last().is_none() || self.shuf.get_golden().is_none() {
1343 return Err(DecoderError::MissingReference);
1344 }
1345 self.vp31_unpack_sb_info(br)?;
1346 self.vp31_unpack_mb_info(br)?;
1347 self.vp31_unpack_mv_info(br)?;
1348 }
1349 let dc_quant = VP31_DC_SCALES[self.quant];
1350 let ac_quant = VP31_AC_SCALES[self.quant];
1351 rescale_qmat(&mut self.qmat_y, VP3_QMAT_Y, dc_quant, ac_quant, 2);
1352 rescale_qmat(&mut self.qmat_c, VP3_QMAT_C, dc_quant, ac_quant, 2);
1353 rescale_qmat(&mut self.qmat_y_p, VP3_QMAT_INTER, dc_quant, ac_quant, 4);
1354 rescale_qmat(&mut self.qmat_c_p, VP3_QMAT_INTER, dc_quant, ac_quant, 4);
1355
1356 self.eob_run = 0;
1357 let dc_table_y = br.read(4)? as usize;
1358 let dc_table_c = br.read(4)? as usize;
1359 self.vp31_unpack_coeffs(br, 0, dc_table_y, dc_table_c)?;
1360 self.restore_dcs();
1361
1362 let ac_table_y = br.read(4)? as usize;
1363 let ac_table_c = br.read(4)? as usize;
1364 for coef_no in 1..64 {
1365 self.vp31_unpack_coeffs(br, coef_no, ac_table_y, ac_table_c)?;
1366 }
1367
1368 if self.is_intra {
1369 self.output_blocks_intra(frm);
1370 } else {
1371 self.output_blocks_inter(frm);
1372 }
1373 if self.loop_str > 0 {
1374 self.vp31_loop_filter(frm);
1375 }
1376
1377 Ok(())
1378 }
1379 fn decode_vp4(&mut self, br: &mut BitReader, frm: &mut NASimpleVideoFrame<u8>) -> DecoderResult<()> {
1380 for blk in self.blocks.iter_mut() {
1381 blk.coeffs = [0; 64];
1382 blk.idx = 0;
1383 blk.coded = false;
1384 blk.has_ac = false;
1385 }
1386 if self.is_intra {
1387 for sb in self.sb_info.iter_mut() { *sb = SBState::Coded; }
1388 for blk in self.blocks.iter_mut() {
1389 blk.btype = VPMBType::Intra;
1390 blk.coded = true;
1391 }
1392 } else {
1393 if self.shuf.get_last().is_none() || self.shuf.get_golden().is_none() {
1394 return Err(DecoderError::MissingReference);
1395 }
1396 self.vp40_unpack_sb_info(br)?;
1397 self.vp31_unpack_mb_info(br)?;
1398 self.vp40_unpack_mv_info(br)?;
1399 }
1400 let dc_y_quant = VP40_DC_Y_SCALES[self.quant];
1401 let dc_c_quant = VP40_DC_C_SCALES[self.quant];
1402 let ac_quant = VP40_AC_SCALES[self.quant];
1403 rescale_qmat(&mut self.qmat_y, VP40_QMAT, dc_y_quant, ac_quant, 2);
1404 rescale_qmat(&mut self.qmat_c, VP40_QMAT, dc_c_quant, ac_quant, 2);
1405 self.qmat_y_p.copy_from_slice(&self.qmat_y);
1406 self.qmat_c_p.copy_from_slice(&self.qmat_c);
1407
1408 self.eob_run = 0;
1409 let dc_table_y = br.read(4)? as usize;
1410 let dc_table_c = br.read(4)? as usize;
1411 let ac_table_y = br.read(4)? as usize;
1412 let ac_table_c = br.read(4)? as usize;
1413 self.vp40_unpack_coeffs(br, dc_table_y, dc_table_c, ac_table_y, ac_table_c)?;
1414
1415 if self.is_intra {
1416 self.output_blocks_intra(frm);
1417 } else {
1418 self.output_blocks_inter(frm);
1419 }
1420
1421 Ok(())
1422 }
1423 fn vp31_predict_dc(&self, bx: usize, by: usize, bw: usize, blk_idx: usize) -> i16 {
1424 let mut preds = [0i32; 4];
1425 let mut pp: usize = 0;
1426 let ref_id = self.blocks[blk_idx].btype.get_ref_id();
1427 let is_right = bx == bw - 1;
1428 if bx > 0 {
1429 fill_dc_pred!(self, ref_id, preds, pp, 0, blk_idx - 1);
1430 if by > 0 {
1431 fill_dc_pred!(self, ref_id, preds, pp, 1, blk_idx - 1 - bw);
1432 }
1433 }
1434 if by > 0 {
1435 fill_dc_pred!(self, ref_id, preds, pp, 2, blk_idx - bw);
1436 if !is_right {
1437 fill_dc_pred!(self, ref_id, preds, pp, 3, blk_idx + 1 - bw);
1438 }
1439 }
1440 if pp == 0 { return self.last_dc[ref_id as usize]; }
1441 let mut pred = 0i32;
1442 for i in 0..4 {
1443 if (pp & (1 << i)) != 0 {
1444 pred += (preds[i] as i32) * (VP31_DC_WEIGHTS[pp][i] as i32);
1445 }
1446 }
1447 pred /= VP31_DC_WEIGHTS[pp][4] as i32;
1448 if (pp & 7) == 7 {
1449 if (pred - preds[2]).abs() > 128 { return preds[2] as i16; }
1450 if (pred - preds[0]).abs() > 128 { return preds[0] as i16; }
1451 if (pred - preds[1]).abs() > 128 { return preds[1] as i16; }
1452 }
1453 pred as i16
1454 }
1455 fn vp40_predict_dc(&self, bx: usize, by: usize, bw: usize, bh: usize, blk_idx: usize, mask: usize, is_luma: bool) -> i16 {
1456 let mut preds = [0i32; 4];
1457 let mut pp: usize = 0;
1458 let ref_id = self.blocks[blk_idx].btype.get_ref_id();
1459 if (by > 0) && (((mask >> 3) & 1) == 1) { //top
1460 fill_dc_pred!(self, ref_id, preds, pp, 0, blk_idx - bw);
1461 }
1462 if (by < bh - 1) && (((mask >> 2) & 1) == 1) { //bottom
1463 fill_dc_pred!(self, ref_id, preds, pp, 1, blk_idx + bw);
1464 }
1465 if (bx > 0) && (((mask >> 1) & 1) == 1) { //left
1466 fill_dc_pred!(self, ref_id, preds, pp, 2, blk_idx - 1);
1467 }
1468 if (is_luma && bx == 0 && (by >= 4)) && (((mask >> 1) & 1) == 1) { //left wrap
1469 fill_dc_pred!(self, ref_id, preds, pp, 2, blk_idx - 1 - 3 * bw);
1470 }
1471 if (bx < bw - 1) && (((mask >> 0) & 1) == 1) { //right
1472 fill_dc_pred!(self, ref_id, preds, pp, 3, blk_idx + 1);
1473 }
1474 if pp == 0 { return self.last_dc[ref_id as usize]; }
1475 let mut pred = 0i32;
1476 let mut npred = 0;
1477 for i in 0..4 {
1478 if (pp & (1 << i)) != 0 {
1479 pred += preds[i] as i32;
1480 npred += 1;
1481 if npred == 2 {
1482 return (pred / 2) as i16;
1483 }
1484 }
1485 }
1486 self.last_dc[ref_id as usize]
1487 }
1488 fn restore_dcs(&mut self) {
1489 let blk_stride = self.mb_w * 2;
1490 let mut blk_idx = 0;
1491 self.last_dc = [0; 3];
1492 for by in 0..self.mb_h*2 {
1493 for bx in 0..self.mb_w*2 {
1494 if !self.blocks[blk_idx + bx].coded { continue; }
1495 let dc = self.vp31_predict_dc(bx, by, self.mb_w*2, blk_idx + bx);
1496 self.blocks[blk_idx + bx].coeffs[0] += dc;
1497 self.last_dc[self.blocks[blk_idx + bx].btype.get_ref_id() as usize] = self.blocks[blk_idx + bx].coeffs[0];
1498 }
1499 blk_idx += blk_stride;
1500 }
1501 let blk_stride = self.mb_w;
1502 for _plane in 1..3 {
1503 self.last_dc = [0; 3];
1504 for by in 0..self.mb_h {
1505 for bx in 0..self.mb_w {
1506 if !self.blocks[blk_idx + bx].coded { continue; }
1507 let dc = self.vp31_predict_dc(bx, by, self.mb_w, blk_idx + bx);
1508 self.blocks[blk_idx + bx].coeffs[0] += dc;
1509 self.last_dc[self.blocks[blk_idx + bx].btype.get_ref_id() as usize] = self.blocks[blk_idx + bx].coeffs[0];
1510 }
1511 blk_idx += blk_stride;
1512 }
1513 }
1514 }
1515 fn output_blocks_intra(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
1516 let mut biter = self.blocks.iter_mut();
1517 for by in 0..self.mb_h*2 {
1518 for bx in 0..self.mb_w*2 {
1519 let mut blk = biter.next().unwrap();
1520 let qmat = &self.qmat_y;
1521 blk.coeffs[0] *= qmat[0];
1522 if blk.has_ac {
1523 unquant(&mut blk.coeffs, qmat);
1524 vp_put_block(&mut blk.coeffs, bx, by, 0, frm);
1525 } else {
1526 vp_put_block_dc(&mut blk.coeffs, bx, by, 0, frm);
1527 }
1528 }
1529 }
1530 for plane in 1..3 {
1531 for by in 0..self.mb_h {
1532 for bx in 0..self.mb_w {
1533 let mut blk = biter.next().unwrap();
1534 let qmat = &self.qmat_c;
1535 blk.coeffs[0] *= qmat[0];
1536 if blk.has_ac {
1537 unquant(&mut blk.coeffs, qmat);
1538 vp_put_block(&mut blk.coeffs, bx, by, plane, frm);
1539 } else {
1540 vp_put_block_dc(&mut blk.coeffs, bx, by, plane, frm);
1541 }
1542 }
1543 }
1544 }
1545 }
1546 fn output_blocks_inter(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
1547 let mut blk_idx = 0;
1548 let bstride = self.mb_w * 2;
1549 for by in (0..self.mb_h*2).step_by(2) {
1550 for bx in (0..self.mb_w*2).step_by(2) {
1551 if self.blocks[blk_idx + bx].btype != VPMBType::InterFourMV {
1552 continue;
1553 }
1554 let mvs = [ self.blocks[blk_idx + bx].mv,
1555 self.blocks[blk_idx + bx + 1].mv,
1556 self.blocks[blk_idx + bx + bstride].mv,
1557 self.blocks[blk_idx + bx + 1 + bstride].mv ];
1558 let mut mv_sum = mvs[0] + mvs[1] + mvs[2] + mvs[3];
1559 mv_sum.x = (mv_sum.x + 2) >> 2;
1560 mv_sum.y = (mv_sum.y + 2) >> 2;
1561
1562 let src = self.shuf.get_last().unwrap();
1563 for i in 0..4 {
1564 let xoff = (i & 1) * 8;
1565 let yoff = (i >> 1) * 8;
1566
1567 let mode = vp3_mv_mode(mvs[i].x, mvs[i].y);
1568 if self.version != 4 {
1569 copy_block(frm, src.clone(), 0, bx * 8 + xoff, by * 8 + yoff,
1570 mvs[i].x >> 1, mvs[i].y >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1571 } else {
1572 vp_copy_block(frm, src.clone(), 0, bx * 8 + xoff, by * 8 + yoff,
1573 mvs[i].x >> 1, mvs[i].y >> 1, 0, 1, self.loop_str,
1574 mode, VP3_INTERP_FUNCS, self.mc_buf.clone());
1575 }
1576 }
1577
1578 let mx = (mv_sum.x >> 1) | (mv_sum.x & 1);
1579 let my = (mv_sum.y >> 1) | (mv_sum.y & 1);
1580 let mode = vp3_mv_mode(mx, my);
1581 copy_block(frm, src.clone(), 1, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1582 copy_block(frm, src.clone(), 2, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1583 }
1584 blk_idx += bstride * 2;
1585 }
1586
1587 let mut biter = self.blocks.iter_mut();
1588 for by in 0..self.mb_h*2 {
1589 for bx in 0..self.mb_w*2 {
1590 let mut blk = biter.next().unwrap();
1591 // do MC for whole macroblock
1592 if !blk.btype.is_intra() && (((bx | by) & 1) == 0) && (blk.btype != VPMBType::InterFourMV) {
1593 let src = if blk.btype.get_ref_id() == 1 {
1594 self.shuf.get_last().unwrap()
1595 } else {
1596 self.shuf.get_golden().unwrap()
1597 };
1598 let mode = vp3_mv_mode(blk.mv.x, blk.mv.y);
1599 if self.version != 4 {
1600 copy_block(frm, src.clone(), 0, bx * 8, by * 8,
1601 blk.mv.x >> 1, blk.mv.y >> 1, 16, 16, 0, 1, mode, VP3_INTERP_FUNCS);
1602 } else {
1603 vp_copy_block(frm, src.clone(), 0, bx * 8, by * 8,
1604 blk.mv.x >> 1, blk.mv.y >> 1, 0, 1, self.loop_str,
1605 mode, VP3_INTERP_FUNCS, self.mc_buf.clone());
1606 vp_copy_block(frm, src.clone(), 0, bx * 8 + 8, by * 8,
1607 blk.mv.x >> 1, blk.mv.y >> 1, 0, 1, self.loop_str,
1608 mode, VP3_INTERP_FUNCS, self.mc_buf.clone());
1609 vp_copy_block(frm, src.clone(), 0, bx * 8, by * 8 + 8,
1610 blk.mv.x >> 1, blk.mv.y >> 1, 0, 1, self.loop_str,
1611 mode, VP3_INTERP_FUNCS, self.mc_buf.clone());
1612 vp_copy_block(frm, src.clone(), 0, bx * 8 + 8, by * 8 + 8,
1613 blk.mv.x >> 1, blk.mv.y >> 1, 0, 1, self.loop_str,
1614 mode, VP3_INTERP_FUNCS, self.mc_buf.clone());
1615 }
1616 let mx = (blk.mv.x >> 1) | (blk.mv.x & 1);
1617 let my = (blk.mv.y >> 1) | (blk.mv.y & 1);
1618 let mode = vp3_mv_mode(mx, my);
1619 if self.version != 4 {
1620 copy_block(frm, src.clone(), 1, bx * 4, by * 4,
1621 mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1622 copy_block(frm, src.clone(), 2, bx * 4, by * 4,
1623 mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1624 } else {
1625 vp_copy_block(frm, src.clone(), 1, bx * 4, by * 4,
1626 mx >> 1, my >> 1, 0, 1, self.loop_str,
1627 mode, VP3_INTERP_FUNCS, self.mc_buf.clone());
1628 vp_copy_block(frm, src.clone(), 2, bx * 4, by * 4,
1629 mx >> 1, my >> 1, 0, 1, self.loop_str,
1630 mode, VP3_INTERP_FUNCS, self.mc_buf.clone());
1631 }
1632 }
1633 let qmat = if blk.btype.is_intra() { &self.qmat_y } else { &self.qmat_y_p };
1634 blk.coeffs[0] *= qmat[0];
1635 if blk.has_ac {
1636 unquant(&mut blk.coeffs, qmat);
1637 }
1638 if !blk.coded {
1639 copy_block(frm, self.shuf.get_last().unwrap(), 0, bx * 8, by * 8, 0, 0, 8, 8, 0, 1, 0, VP3_INTERP_FUNCS);
1640 } else if blk.btype.is_intra() {
1641 if blk.has_ac {
1642 vp_put_block(&mut blk.coeffs, bx, by, 0, frm);
1643 } else {
1644 vp_put_block_dc(&mut blk.coeffs, bx, by, 0, frm);
1645 }
1646 } else {
1647 if blk.has_ac {
1648 vp_add_block(&mut blk.coeffs, bx, by, 0, frm);
1649 } else {
1650 vp_add_block_dc(&mut blk.coeffs, bx, by, 0, frm);
1651 }
1652 }
1653 }
1654 }
1655 for plane in 1..3 {
1656 for by in 0..self.mb_h {
1657 for bx in 0..self.mb_w {
1658 let mut blk = biter.next().unwrap();
1659 let qmat = if blk.btype.is_intra() { &self.qmat_c } else { &self.qmat_c_p };
1660 blk.coeffs[0] *= qmat[0];
1661 if blk.has_ac {
1662 unquant(&mut blk.coeffs, qmat);
1663 }
1664 if !blk.coded {
1665 copy_block(frm, self.shuf.get_last().unwrap(), plane, bx * 8, by * 8, 0, 0, 8, 8, 0, 1, 0, VP3_INTERP_FUNCS);
1666 } else if blk.btype.is_intra() {
1667 if blk.has_ac {
1668 vp_put_block(&mut blk.coeffs, bx, by, plane, frm);
1669 } else {
1670 vp_put_block_dc(&mut blk.coeffs, bx, by, plane, frm);
1671 }
1672 } else {
1673 if blk.has_ac {
1674 vp_add_block(&mut blk.coeffs, bx, by, plane, frm);
1675 } else {
1676 vp_add_block_dc(&mut blk.coeffs, bx, by, plane, frm);
1677 }
1678 }
1679 }
1680 }
1681 }
1682 }
1683 fn vp31_loop_filter(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
1684 let mut blk_idx = 0;
1685 let blk_w = self.mb_w * 2;
1686 for by in 0..self.mb_h*2 {
1687 for bx in 0..blk_w {
1688 let blk = &self.blocks[blk_idx + bx];
1689 if (bx > 0) && blk.coded {
1690 vp31_loop_filter_v(frm, bx * 8, by * 8, 0, self.loop_str);
1691 }
1692 if (by > 0) && blk.coded {
1693 vp31_loop_filter_h(frm, bx * 8, by * 8, 0, self.loop_str);
1694 }
1695 if (bx < blk_w - 1) && !self.blocks[blk_idx + bx + 1].coded {
1696 vp31_loop_filter_v(frm, bx * 8 + 8, by * 8, 0, self.loop_str);
1697 }
1698 if (by < self.mb_h * 2 - 1) && !self.blocks[blk_idx + bx + blk_w].coded {
1699 vp31_loop_filter_h(frm, bx * 8, by * 8 + 8, 0, self.loop_str);
1700 }
1701 }
1702 blk_idx += blk_w;
1703 }
1704 let blk_w = self.mb_w;
1705 for plane in 1..3 {
1706 for by in 0..self.mb_h {
1707 for bx in 0..self.mb_w {
1708 let blk = &self.blocks[blk_idx + bx];
1709 if (bx > 0) && blk.coded {
1710 vp31_loop_filter_v(frm, bx * 8, by * 8, plane, self.loop_str);
1711 }
1712 if (by > 0) && blk.coded {
1713 vp31_loop_filter_h(frm, bx * 8, by * 8, plane, self.loop_str);
1714 }
1715 if (bx < blk_w - 1) && !self.blocks[blk_idx + bx + 1].coded {
1716 vp31_loop_filter_v(frm, bx * 8 + 8, by * 8, plane, self.loop_str);
1717 }
1718 if (by < self.mb_h - 1) && !self.blocks[blk_idx + bx + blk_w].coded {
1719 vp31_loop_filter_h(frm, bx * 8, by * 8 + 8, plane, self.loop_str);
1720 }
1721 }
1722 blk_idx += blk_w;
1723 }
1724 }
1725 }
1726 fn generate_block_addr(&mut self) {
1727 let sb_w_y = (self.width + 31) >> 5;
1728 let sb_h_y = (self.height + 31) >> 5;
1729 let sb_w_c = ((self.width >> 1) + 31) >> 5;
1730 let sb_h_c = ((self.height >> 1) + 31) >> 5;
1731 self.y_sbs = sb_w_y * sb_h_y;
1732 let tot_sb = sb_w_y * sb_h_y + 2 * sb_w_c * sb_h_c;
1733 let tot_mb = self.mb_w * self.mb_h * 2 + ((self.mb_w + 1) & !1) * ((self.mb_h + 1) & !1) * 2;
1734 let bw = self.width >> 3;
1735 let bh = self.height >> 3;
1736 let tot_blk = bw * bh * 3 / 2;
1737 self.sb_info.resize(tot_sb, SBState::Uncoded);
1738 self.sb_blocks = Vec::with_capacity(tot_sb);
1739 self.mb_blocks = Vec::with_capacity(tot_mb);
1740 self.sb_mbs = Vec::with_capacity(tot_sb);
1741 self.blk_addr = Vec::with_capacity(tot_blk);
1742 self.blk_sub = Vec::with_capacity(tot_blk);
1743 self.y_blocks = bw * bh;
1744 let mut base_idx = 0;
1745 for plane in 0..3 {
1746 let w = if plane > 0 { self.width >> 1 } else { self.width };
1747 let h = if plane > 0 { self.height >> 1 } else { self.height };
1748 let sb_w = (w + 31) >> 5;
1749 let sb_h = (h + 31) >> 5;
1750 let blk_w = w >> 3;
1751 let blk_h = h >> 3;
1752 for y in 0..sb_h {
1753 for x in 0..sb_w {
1754 let mut nmbs = 0;
1755 for mb_no in 0..4 {
1756 let bx = x * 4 + HILBERT_ORDER[mb_no * 4][0];
1757 let by = y * 4 + HILBERT_ORDER[mb_no * 4][1];
1758 if (bx >= blk_w) || (by >= blk_h) { continue; }
1759 let mut nblocks = 0;
1760 for blk_no in 0..4 {
1761 let bx = x * 4 + HILBERT_ORDER[mb_no * 4 + blk_no][0];
1762 let by = y * 4 + HILBERT_ORDER[mb_no * 4 + blk_no][1];
1763 if (bx >= blk_w) || (by >= blk_h) { continue; }
1764 nblocks += 1;
1765 }
1766 self.mb_blocks.push(nblocks);
1767 nmbs += 1;
1768 }
1769 self.sb_mbs.push(nmbs);
1770
1771 let mut nblocks = 0;
1772 for blk_no in 0..16 {
1773 let bx = x * 4 + HILBERT_ORDER[blk_no][0];
1774 let by = y * 4 + HILBERT_ORDER[blk_no][1];
1775 if (bx >= blk_w) || (by >= blk_h) { continue; }
1776 let idx = base_idx + bx + by * blk_w;
1777 self.blk_addr.push(idx * 4 + plane);
1778 self.blk_sub.push(blk_no as u8);
1779 nblocks += 1;
1780 }
1781 self.sb_blocks.push(nblocks);
1782 }
1783 }
1784 base_idx += blk_w * blk_h;
1785 }
1786 self.blocks.resize(tot_blk, Block::new());
1787 self.mb_coded.resize(tot_mb, false);
1788 self.mb_partial.resize(tot_mb, false);
1789 }
1790 }
1791
1792 impl NADecoder for VP34Decoder {
1793 fn init(&mut self, supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
1794 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
1795 let fmt = YUV420_FORMAT;
1796 self.width = vinfo.get_width();
1797 self.height = vinfo.get_height();
1798 validate!(((self.width | self.height) & 15) == 0);
1799 self.mb_w = self.width >> 4;
1800 self.mb_h = self.height >> 4;
1801 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(vinfo.get_width(), vinfo.get_height(), true, fmt));
1802 self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
1803 supp.pool_u8.set_dec_bufs(3);
1804 supp.pool_u8.prealloc_video(NAVideoInfo::new(vinfo.get_width(), vinfo.get_height(), true, fmt), 4)?;
1805
1806 self.generate_block_addr();
1807 if self.version == 4 {
1808 self.codes = Codes::VP31(VP31Codes::new_vp4());
1809 self.aux_codes = Some(VP40AuxCodes::new());
1810 }
1811 Ok(())
1812 } else {
1813 Err(DecoderError::InvalidData)
1814 }
1815 }
1816 fn decode(&mut self, supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
1817 let src = pkt.get_buffer();
1818 validate!(src.len() > 0);
1819 let mut br = BitReader::new(&src, src.len(), BitReaderMode::BE);
1820
1821 self.parse_header(&mut br)?;
1822 if self.is_intra {
1823 self.shuf.clear();
1824 } else {
1825 if !self.shuf.has_refs() {
1826 return Err(DecoderError::MissingReference);
1827 }
1828 }
1829
1830 let ret = supp.pool_u8.get_free();
1831 if ret.is_none() {
1832 return Err(DecoderError::AllocError);
1833 }
1834 let mut buf = ret.unwrap();
1835 let mut dframe = NASimpleVideoFrame::from_video_buf(&mut buf).unwrap();
1836 match self.version {
1837 30 => self.decode_vp30(&mut br, &mut dframe)?,
1838 31 => self.decode_vp31(&mut br, &mut dframe)?,
1839 4 => self.decode_vp4(&mut br, &mut dframe)?,
1840 _ => return Err(DecoderError::Bug),
1841 }
1842
1843 if self.is_intra || self.update_gf {
1844 self.shuf.add_golden_frame(buf.clone());
1845 }
1846 self.shuf.add_frame(buf.clone());
1847
1848 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::Video(buf));
1849 frm.set_keyframe(self.is_intra);
1850 frm.set_frame_type(if self.is_intra { FrameType::I } else { FrameType::P });
1851 Ok(frm.into_ref())
1852 }
1853 fn flush(&mut self) {
1854 self.shuf.clear();
1855 }
1856 }
1857
1858 pub fn get_decoder_vp3() -> Box<NADecoder + Send> {
1859 Box::new(VP34Decoder::new(3))
1860 }
1861
1862 pub fn get_decoder_vp4() -> Box<NADecoder + Send> {
1863 Box::new(VP34Decoder::new(4))
1864 }
1865
1866 #[cfg(test)]
1867 mod test {
1868 use nihav_core::codecs::RegisteredDecoders;
1869 use nihav_core::demuxers::RegisteredDemuxers;
1870 use nihav_core::test::dec_video::*;
1871 use crate::codecs::duck_register_all_codecs;
1872 use nihav_commonfmt::demuxers::generic_register_all_demuxers;
1873
1874 #[test]
1875 fn test_vp30() {
1876 let mut dmx_reg = RegisteredDemuxers::new();
1877 generic_register_all_demuxers(&mut dmx_reg);
1878 let mut dec_reg = RegisteredDecoders::new();
1879 duck_register_all_codecs(&mut dec_reg);
1880
1881 test_decoding("avi", "vp3", "assets/Duck/vp30-logo.avi", Some(23), &dmx_reg, &dec_reg,
1882 ExpectedTestResult::MD5([0x51aba7df, 0x6e42534d, 0xef6c5b13, 0x26c38d1f]));
1883 }
1884
1885 #[test]
1886 fn test_vp31() {
1887 let mut dmx_reg = RegisteredDemuxers::new();
1888 generic_register_all_demuxers(&mut dmx_reg);
1889 let mut dec_reg = RegisteredDecoders::new();
1890 duck_register_all_codecs(&mut dec_reg);
1891
1892 // let file = "assets/Duck/vp31.avi";
1893 // let file = "assets/Duck/vp31_crash.avi";
1894 // let file = "assets/Duck/01-vp31-0500.avi";
1895 // test_file_decoding("avi", file, Some(3), true, false, None/*Some("vp31")*/, &dmx_reg, &dec_reg);
1896 //panic!("end");
1897 test_decoding("avi", "vp3", "assets/Duck/01-vp31-0500.avi", Some(16), &dmx_reg, &dec_reg,
1898 ExpectedTestResult::MD5([0x65112f7e, 0x2914f29b, 0x2908ed2f, 0xce5fc8c5]));
1899 }
1900
1901 #[test]
1902 fn test_vp4() {
1903 let mut dmx_reg = RegisteredDemuxers::new();
1904 generic_register_all_demuxers(&mut dmx_reg);
1905 let mut dec_reg = RegisteredDecoders::new();
1906 duck_register_all_codecs(&mut dec_reg);
1907
1908 let file = "assets/Duck/ot171_vp40.avi";
1909 test_file_decoding("avi", file, Some(16), true, false, None/*Some("vp4")*/, &dmx_reg, &dec_reg);
1910 //panic!("end");
1911 }
1912 }
1913
1914 const HILBERT_ORDER: [[usize; 2]; 16] = [
1915 [ 0, 0 ], [ 1, 0 ], [ 1, 1 ], [ 0, 1 ],
1916 [ 0, 2 ], [ 0, 3 ], [ 1, 3 ], [ 1, 2 ],
1917 [ 2, 2 ], [ 2, 3 ], [ 3, 3 ], [ 3, 2 ],
1918 [ 3, 1 ], [ 2, 1 ], [ 2, 0 ], [ 3, 0 ]
1919 ];
1920
1921 const VP31_LOOP_STRENGTH: [i16; 64] = [
1922 30, 25, 20, 20, 15, 15, 14, 14,
1923 13, 13, 12, 12, 11, 11, 10, 10,
1924 9, 9, 8, 8, 7, 7, 7, 7,
1925 6, 6, 6, 6, 5, 5, 5, 5,
1926 4, 4, 4, 4, 3, 3, 3, 3,
1927 2, 2, 2, 2, 2, 2, 2, 2,
1928 0, 0, 0, 0, 0, 0, 0, 0,
1929 0, 0, 0, 0, 0, 0, 0, 0
1930 ];
1931
1932 const VP31_DEFAULT_MB_MODES: [VPMBType; 8] = [
1933 VPMBType::InterNoMV, VPMBType::Intra, VPMBType::InterMV, VPMBType::InterNearest,
1934 VPMBType::InterNear, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1935 ];
1936
1937 const VP31_MB_MODES: [[VPMBType; 8]; 6] = [
1938 [
1939 VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterMV, VPMBType::InterNoMV,
1940 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1941 ], [
1942 VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterNoMV, VPMBType::InterMV,
1943 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1944 ], [
1945 VPMBType::InterNearest, VPMBType::InterMV, VPMBType::InterNear, VPMBType::InterNoMV,
1946 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1947 ], [
1948 VPMBType::InterNearest, VPMBType::InterMV, VPMBType::InterNoMV, VPMBType::InterNear,
1949 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1950 ], [
1951 VPMBType::InterNoMV, VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterMV,
1952 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1953 ], [
1954 VPMBType::InterNoMV, VPMBType::GoldenNoMV, VPMBType::InterNearest, VPMBType::InterNear,
1955 VPMBType::InterMV, VPMBType::Intra, VPMBType::GoldenMV, VPMBType::InterFourMV
1956 ]
1957 ];
1958
1959 const VP3_LITERAL_BASE: [i16; 6] = [ 7, 9, 13, 21, 37, 69 ];
1960
1961 const VP31_AC_SCALES: [i16; 64] = [
1962 500, 450, 400, 370, 340, 310, 285, 265,
1963 245, 225, 210, 195, 185, 180, 170, 160,
1964 150, 145, 135, 130, 125, 115, 110, 107,
1965 100, 96, 93, 89, 85, 82, 75, 74,
1966 70, 68, 64, 60, 57, 56, 52, 50,
1967 49, 45, 44, 43, 40, 38, 37, 35,
1968 33, 32, 30, 29, 28, 25, 24, 22,
1969 21, 19, 18, 17, 15, 13, 12, 10
1970 ];
1971
1972 const VP31_DC_SCALES: [i16; 64] = [
1973 220, 200, 190, 180, 170, 170, 160, 160,
1974 150, 150, 140, 140, 130, 130, 120, 120,
1975 110, 110, 100, 100, 90, 90, 90, 80,
1976 80, 80, 70, 70, 70, 60, 60, 60,
1977 60, 50, 50, 50, 50, 40, 40, 40,
1978 40, 40, 30, 30, 30, 30, 30, 30,
1979 30, 20, 20, 20, 20, 20, 20, 20,
1980 20, 10, 10, 10, 10, 10, 10, 10
1981 ];
1982
1983 const VP3_QMAT_Y: &[i16; 64] = &[
1984 16, 11, 10, 16, 24, 40, 51, 61,
1985 12, 12, 14, 19, 26, 58, 60, 55,
1986 14, 13, 16, 24, 40, 57, 69, 56,
1987 14, 17, 22, 29, 51, 87, 80, 62,
1988 18, 22, 37, 58, 68, 109, 103, 77,
1989 24, 35, 55, 64, 81, 104, 113, 92,
1990 49, 64, 78, 87, 103, 121, 120, 101,
1991 72, 92, 95, 98, 112, 100, 103, 99
1992 ];
1993
1994 const VP3_QMAT_C: &[i16; 64] = &[
1995 17, 18, 24, 47, 99, 99, 99, 99,
1996 18, 21, 26, 66, 99, 99, 99, 99,
1997 24, 26, 56, 99, 99, 99, 99, 99,
1998 47, 66, 99, 99, 99, 99, 99, 99,
1999 99, 99, 99, 99, 99, 99, 99, 99,
2000 99, 99, 99, 99, 99, 99, 99, 99,
2001 99, 99, 99, 99, 99, 99, 99, 99,
2002 99, 99, 99, 99, 99, 99, 99, 99
2003 ];
2004
2005 const VP3_QMAT_INTER: &[i16; 64] = &[
2006 16, 16, 16, 20, 24, 28, 32, 40,
2007 16, 16, 20, 24, 28, 32, 40, 48,
2008 16, 20, 24, 28, 32, 40, 48, 64,
2009 20, 24, 28, 32, 40, 48, 64, 64,
2010 24, 28, 32, 40, 48, 64, 64, 64,
2011 28, 32, 40, 48, 64, 64, 64, 96,
2012 32, 40, 48, 64, 64, 64, 96, 128,
2013 40, 48, 64, 64, 64, 96, 128, 128
2014 ];
2015
2016 const VP31_DC_CODES: [[u16; 32]; 16] = [
2017 [
2018 0x002D, 0x0026, 0x0166, 0x004E, 0x02CE, 0x059E, 0x027D, 0x0008,
2019 0x04F9, 0x000F, 0x000E, 0x001B, 0x0006, 0x0008, 0x0005, 0x001A,
2020 0x0015, 0x0007, 0x000C, 0x0001, 0x0000, 0x0009, 0x0017, 0x0029,
2021 0x0028, 0x00B2, 0x04F8, 0x059F, 0x009E, 0x013F, 0x0012, 0x0058,
2022 ], [
2023 0x0010, 0x0047, 0x01FF, 0x008C, 0x03FC, 0x046A, 0x0469, 0x0022,
2024 0x11A1, 0x000E, 0x000D, 0x0004, 0x0005, 0x0009, 0x0006, 0x001E,
2025 0x0016, 0x0007, 0x000C, 0x0001, 0x0000, 0x000A, 0x0017, 0x007D,
2026 0x007E, 0x011B, 0x08D1, 0x03FD, 0x046B, 0x11A0, 0x007C, 0x00FE,
2027 ], [
2028 0x0016, 0x0020, 0x0086, 0x0087, 0x0367, 0x06CC, 0x06CB, 0x006E,
2029 0x366D, 0x000F, 0x000E, 0x0004, 0x0005, 0x000A, 0x0006, 0x001A,
2030 0x0011, 0x0007, 0x000C, 0x0001, 0x0000, 0x0009, 0x0017, 0x006F,
2031 0x006D, 0x0364, 0x0D9A, 0x06CA, 0x1B37, 0x366C, 0x0042, 0x00D8,
2032 ], [
2033 0x0000, 0x002D, 0x00F7, 0x0058, 0x0167, 0x02CB, 0x02CA, 0x000E,
2034 0x1661, 0x0003, 0x0002, 0x0008, 0x0009, 0x000D, 0x0002, 0x001F,
2035 0x0017, 0x0001, 0x000C, 0x000E, 0x000A, 0x0006, 0x0078, 0x000F,
2036 0x007A, 0x0164, 0x0599, 0x02CD, 0x0B31, 0x1660, 0x0079, 0x00F6,
2037 ], [
2038 0x0003, 0x003C, 0x000F, 0x007A, 0x001D, 0x0020, 0x0072, 0x0006,
2039 0x0399, 0x0004, 0x0005, 0x0005, 0x0006, 0x000E, 0x0004, 0x0000,
2040 0x0019, 0x0002, 0x000D, 0x0007, 0x001F, 0x0030, 0x0011, 0x0031,
2041 0x0005, 0x0021, 0x00E7, 0x0038, 0x01CD, 0x0398, 0x007B, 0x0009,
2042 ], [
2043 0x0009, 0x0002, 0x0074, 0x0007, 0x00EC, 0x00D1, 0x01A6, 0x0006,
2044 0x0D21, 0x0005, 0x0006, 0x0008, 0x0007, 0x000F, 0x0004, 0x0000,
2045 0x001C, 0x0002, 0x0005, 0x0003, 0x000C, 0x0035, 0x01A7, 0x001B,
2046 0x0077, 0x01A5, 0x0349, 0x00D0, 0x0691, 0x0D20, 0x0075, 0x00ED,
2047 ], [
2048 0x000A, 0x000C, 0x0012, 0x001B, 0x00B7, 0x016C, 0x0099, 0x005A,
2049 0x16D8, 0x0007, 0x0006, 0x0009, 0x0008, 0x0000, 0x0005, 0x0017,
2050 0x000E, 0x0002, 0x0003, 0x000F, 0x001A, 0x004D, 0x2DB3, 0x002C,
2051 0x0011, 0x02DA, 0x05B7, 0x0098, 0x0B6D, 0x2DB2, 0x0010, 0x0027,
2052 ], [
2053 0x000D, 0x000F, 0x001D, 0x0008, 0x0051, 0x0056, 0x00AF, 0x002A,
2054 0x148A, 0x0007, 0x0000, 0x0008, 0x0009, 0x000C, 0x0006, 0x0017,
2055 0x000B, 0x0016, 0x0015, 0x0009, 0x0050, 0x00AE, 0x2917, 0x001C,
2056 0x0014, 0x0290, 0x0523, 0x0149, 0x0A44, 0x2916, 0x0053, 0x00A5,
2057 ], [
2058 0x0001, 0x001D, 0x00F5, 0x00F4, 0x024D, 0x0499, 0x0498, 0x0001,
2059 0x0021, 0x0006, 0x0005, 0x0006, 0x0005, 0x0002, 0x0007, 0x0025,
2060 0x007B, 0x001C, 0x0020, 0x000D, 0x0048, 0x0092, 0x0127, 0x000E,
2061 0x0004, 0x0011, 0x000C, 0x003C, 0x000F, 0x0000, 0x001F, 0x0013,
2062 ], [
2063 0x0005, 0x003C, 0x0040, 0x000D, 0x0031, 0x0061, 0x0060, 0x0002,
2064 0x00F5, 0x0006, 0x0005, 0x0007, 0x0006, 0x0002, 0x0009, 0x0025,
2065 0x0007, 0x0021, 0x0024, 0x0010, 0x0041, 0x00F4, 0x0019, 0x000E,
2066 0x0003, 0x0011, 0x0011, 0x003F, 0x003E, 0x007B, 0x0000, 0x0013,
2067 ], [
2068 0x000A, 0x0007, 0x0001, 0x0009, 0x0131, 0x0261, 0x0260, 0x0015,
2069 0x0001, 0x0007, 0x0006, 0x0008, 0x0007, 0x0006, 0x0012, 0x002F,
2070 0x0014, 0x0027, 0x002D, 0x0016, 0x004D, 0x0099, 0x0000, 0x0004,
2071 0x0001, 0x0005, 0x0017, 0x002E, 0x002C, 0x0008, 0x0006, 0x0001,
2072 ], [
2073 0x0000, 0x000E, 0x0017, 0x002A, 0x0010, 0x00F9, 0x00F8, 0x001E,
2074 0x003F, 0x0007, 0x0006, 0x0009, 0x0008, 0x0006, 0x000F, 0x0005,
2075 0x0016, 0x0029, 0x002B, 0x0015, 0x0050, 0x0011, 0x007D, 0x0004,
2076 0x0017, 0x0006, 0x0014, 0x002C, 0x002D, 0x000E, 0x0009, 0x0051,
2077 ], [
2078 0x0002, 0x0018, 0x002F, 0x000D, 0x0053, 0x0295, 0x0294, 0x00A4,
2079 0x007C, 0x0000, 0x0007, 0x0009, 0x0008, 0x001B, 0x000C, 0x0028,
2080 0x006A, 0x001E, 0x001D, 0x0069, 0x00D7, 0x007D, 0x014B, 0x0019,
2081 0x0016, 0x002E, 0x001C, 0x002B, 0x002A, 0x0068, 0x003F, 0x00D6,
2082 ], [
2083 0x0002, 0x001B, 0x000C, 0x0018, 0x0029, 0x007F, 0x02F0, 0x0198,
2084 0x0179, 0x0000, 0x0007, 0x0009, 0x0008, 0x001A, 0x000D, 0x002A,
2085 0x0064, 0x001E, 0x0067, 0x005F, 0x00CD, 0x007E, 0x02F1, 0x0016,
2086 0x000E, 0x002E, 0x0065, 0x002B, 0x0028, 0x003E, 0x00BD, 0x0199,
2087 ], [
2088 0x0002, 0x0007, 0x0016, 0x0006, 0x0036, 0x005C, 0x015D, 0x015C,
2089 0x02BF, 0x0000, 0x0007, 0x0009, 0x0008, 0x0018, 0x0034, 0x002A,
2090 0x005E, 0x006A, 0x0064, 0x005D, 0x00CB, 0x00AD, 0x02BE, 0x0014,
2091 0x0033, 0x006E, 0x005F, 0x006F, 0x006B, 0x00CA, 0x00AC, 0x015E,
2092 ], [
2093 0x000F, 0x001D, 0x0018, 0x000B, 0x0019, 0x0029, 0x00D6, 0x0551,
2094 0x0AA1, 0x0001, 0x0000, 0x0009, 0x0008, 0x001B, 0x0038, 0x0028,
2095 0x0057, 0x006A, 0x0068, 0x0056, 0x00E5, 0x0155, 0x0AA0, 0x0073,
2096 0x0069, 0x00D7, 0x00AB, 0x00E4, 0x00A9, 0x0151, 0x0150, 0x02A9,
2097 ]
2098 ];
2099
2100 const VP31_DC_BITS: [[u8; 32]; 16] = [
2101 [
2102 6, 7, 9, 8, 10, 11, 11, 5, 12, 4, 4, 5, 4, 4, 4, 5,
2103 5, 4, 4, 3, 3, 4, 5, 6, 6, 8, 12, 11, 9, 10, 6, 7,
2104 ], [
2105 5, 7, 9, 8, 10, 11, 11, 6, 13, 4, 4, 4, 4, 4, 4, 5,
2106 5, 4, 4, 3, 3, 4, 5, 7, 7, 9, 12, 10, 11, 13, 7, 8,
2107 ], [
2108 5, 6, 8, 8, 10, 11, 11, 7, 14, 4, 4, 4, 4, 4, 4, 5,
2109 5, 4, 4, 3, 3, 4, 5, 7, 7, 10, 12, 11, 13, 14, 7, 8,
2110 ], [
2111 4, 6, 8, 7, 9, 10, 10, 6, 13, 3, 3, 4, 4, 4, 4, 5,
2112 5, 4, 4, 4, 4, 5, 7, 6, 7, 9, 11, 10, 12, 13, 7, 8,
2113 ], [
2114 4, 6, 7, 7, 8, 9, 10, 6, 13, 3, 3, 4, 4, 4, 4, 4,
2115 5, 4, 4, 4, 5, 6, 8, 6, 6, 9, 11, 9, 12, 13, 7, 7,
2116 ], [
2117 4, 5, 7, 6, 8, 9, 10, 6, 13, 3, 3, 4, 4, 4, 4, 4,
2118 5, 4, 4, 4, 5, 7, 10, 6, 7, 10, 11, 9, 12, 13, 7, 8,
2119 ], [
2120 4, 5, 6, 6, 8, 9, 9, 7, 13, 3, 3, 4, 4, 3, 4, 5,
2121 5, 4, 4, 5, 6, 8, 14, 6, 6, 10, 11, 9, 12, 14, 6, 7,
2122 ], [
2123 4, 5, 6, 5, 7, 8, 9, 7, 13, 3, 2, 4, 4, 4, 4, 5,
2124 5, 5, 5, 5, 7, 9, 14, 6, 6, 10, 11, 9, 12, 14, 7, 8,
2125 ], [
2126 4, 6, 8, 8, 10, 11, 11, 5, 6, 3, 3, 4, 4, 4, 5, 6,
2127 7, 6, 6, 6, 7, 8, 9, 4, 4, 5, 6, 6, 5, 5, 5, 5,
2128 ], [
2129 4, 6, 7, 7, 9, 10, 10, 5, 8, 3, 3, 4, 4, 4, 5, 6,
2130 6, 6, 6, 6, 7, 8, 8, 4, 4, 5, 6, 6, 6, 7, 4, 5,
2131 ], [
2132 4, 5, 6, 6, 9, 10, 10, 6, 7, 3, 3, 4, 4, 4, 5, 6,
2133 6, 6, 6, 6, 7, 8, 7, 4, 4, 5, 6, 6, 6, 6, 5, 5,
2134 ], [
2135 3, 5, 6, 6, 7, 10, 10, 7, 8, 3, 3, 4, 4, 4, 5, 5,
2136 6, 6, 6, 6, 7, 7, 9, 4, 5, 5, 6, 6, 6, 6, 6, 7,
2137 ], [
2138 3, 5, 6, 5, 7, 10, 10, 8, 8, 2, 3, 4, 4, 5, 5, 6,
2139 7, 6, 6, 7, 8, 8, 9, 5, 5, 6, 6, 6, 6, 7, 7, 8,
2140 ], [
2141 3, 5, 5, 5, 6, 8, 10, 9, 9, 2, 3, 4, 4, 5, 5, 6,
2142 7, 6, 7, 7, 8, 8, 10, 5, 5, 6, 7, 6, 6, 7, 8, 9,
2143 ], [
2144 3, 4, 5, 4, 6, 7, 9, 9, 10, 2, 3, 4, 4, 5, 6, 6,
2145 7, 7, 7, 7, 8, 8, 10, 5, 6, 7, 7, 7, 7, 8, 8, 9,
2146 ], [
2147 4, 5, 5, 4, 5, 6, 8, 11, 12, 2, 2, 4, 4, 5, 6, 6,
2148 7, 7, 7, 7, 8, 9, 12, 7, 7, 8, 8, 8, 8, 9, 9, 10,
2149 ]
2150 ];
2151
2152 const VP31_AC_CAT0_CODES: [[u16; 32]; 16] = [
2153 [
2154 0x0008, 0x0025, 0x017A, 0x02F7, 0x0BDB, 0x17B4, 0x2F6B, 0x001D,
2155 0x2F6A, 0x0008, 0x0007, 0x0001, 0x0002, 0x000A, 0x0006, 0x0000,
2156 0x001C, 0x0009, 0x000D, 0x000F, 0x000C, 0x0003, 0x000A, 0x0016,
2157 0x0013, 0x005D, 0x0024, 0x00BC, 0x005C, 0x05EC, 0x000B, 0x005F,
2158 ], [
2159 0x000F, 0x0010, 0x004B, 0x00C6, 0x031D, 0x0C71, 0x0C70, 0x0001,
2160 0x0C73, 0x0008, 0x0009, 0x0002, 0x0003, 0x000B, 0x0006, 0x0000,
2161 0x001C, 0x0005, 0x000D, 0x000F, 0x000A, 0x0019, 0x0013, 0x001D,
2162 0x0030, 0x0062, 0x0024, 0x004A, 0x018F, 0x0C72, 0x000E, 0x0011,
2163 ], [
2164 0x001B, 0x0003, 0x008D, 0x0040, 0x0239, 0x0471, 0x08E0, 0x0003,
2165 0x11C3, 0x000A, 0x0009, 0x0004, 0x0005, 0x000E, 0x0007, 0x0001,
2166 0x001E, 0x0006, 0x000C, 0x000B, 0x0002, 0x0000, 0x0041, 0x001F,
2167 0x0022, 0x0002, 0x008F, 0x008C, 0x011D, 0x11C2, 0x001A, 0x0021,
2168 ], [
2169 0x001F, 0x0003, 0x0003, 0x0043, 0x000B, 0x0015, 0x0051, 0x0003,
2170 0x0050, 0x000D, 0x000C, 0x0004, 0x0006, 0x000E, 0x000A, 0x0001,
2171 0x001E, 0x0005, 0x0009, 0x0007, 0x0011, 0x0002, 0x0004, 0x0002,
2172 0x002D, 0x0020, 0x0042, 0x0001, 0x0000, 0x0029, 0x0017, 0x002C,
2173 ], [
2174 0x0003, 0x001F, 0x003A, 0x005D, 0x0173, 0x02E4, 0x172D, 0x0004,
2175 0x172C, 0x000F, 0x000E, 0x0009, 0x0008, 0x000C, 0x000A, 0x0001,
2176 0x0016, 0x0002, 0x0005, 0x001A, 0x002F, 0x0038, 0x05CA, 0x0006,
2177 0x0037, 0x001E, 0x003B, 0x0039, 0x00B8, 0x0B97, 0x0000, 0x0036,
2178 ], [
2179 0x0006, 0x0037, 0x005D, 0x000C, 0x00B9, 0x02E3, 0x05C4, 0x0004,
2180 0x1715, 0x0000, 0x000F, 0x0008, 0x0007, 0x000C, 0x0009, 0x001D,
2181 0x0016, 0x001C, 0x001A, 0x000B, 0x005E, 0x0170, 0x1714, 0x000A,
2182 0x000A, 0x0036, 0x005F, 0x001B, 0x001A, 0x0B8B, 0x0002, 0x0007,
2183 ], [
2184 0x000C, 0x000B, 0x0079, 0x0022, 0x00F0, 0x0119, 0x0230, 0x001D,
2185 0x08C4, 0x0001, 0x0000, 0x000A, 0x0009, 0x000B, 0x0007, 0x001C,
2186 0x003D, 0x000D, 0x0008, 0x0015, 0x008D, 0x118B, 0x118A, 0x000D,
2187 0x0010, 0x0009, 0x0014, 0x0047, 0x00F1, 0x0463, 0x001F, 0x000C,
2188 ], [
2189 0x0000, 0x001A, 0x0033, 0x000C, 0x0046, 0x01E3, 0x03C5, 0x0017,
2190 0x1E21, 0x0002, 0x0001, 0x0009, 0x000A, 0x0007, 0x001B, 0x003D,
2191 0x001B, 0x0022, 0x0079, 0x00F0, 0x1E20, 0x1E23, 0x1E22, 0x000E,
2192 0x0016, 0x0018, 0x0032, 0x001A, 0x0047, 0x0789, 0x001F, 0x0010,
2193 ], [
2194 0x001D, 0x0061, 0x004E, 0x009E, 0x027C, 0x09F5, 0x09F4, 0x0003,
2195 0x0060, 0x0000, 0x000F, 0x000B, 0x000A, 0x0009, 0x0005, 0x000D,
2196 0x0031, 0x0008, 0x0038, 0x0012, 0x0026, 0x013F, 0x04FB, 0x000D,
2197 0x0002, 0x000C, 0x0039, 0x001C, 0x000F, 0x001D, 0x0008, 0x0019,
2198 ], [
2199 0x0007, 0x0019, 0x00AB, 0x00AA, 0x0119, 0x0461, 0x0460, 0x001B,
2200 0x0047, 0x0001, 0x0000, 0x000C, 0x000B, 0x0009, 0x0005, 0x000D,
2201 0x0035, 0x003D, 0x003C, 0x0018, 0x0022, 0x008D, 0x0231, 0x000E,
2202 0x001F, 0x0009, 0x002B, 0x0010, 0x0034, 0x0054, 0x0008, 0x0014,
2203 ], [
2204 0x000C, 0x0005, 0x0008, 0x005B, 0x004D, 0x0131, 0x0261, 0x001A,
2205 0x0012, 0x0000, 0x000F, 0x000A, 0x0009, 0x0006, 0x001B, 0x0006,
2206 0x001C, 0x002C, 0x0015, 0x005A, 0x0027, 0x0099, 0x0260, 0x000E,
2207 0x0004, 0x000F, 0x0007, 0x001D, 0x000B, 0x0014, 0x0008, 0x0017,
2208 ], [
2209 0x000F, 0x0013, 0x0075, 0x0024, 0x0095, 0x0251, 0x04A0, 0x0010,
2210 0x00C8, 0x0002, 0x0001, 0x0001, 0x0000, 0x001A, 0x0011, 0x002C,
2211 0x0065, 0x0074, 0x004B, 0x00C9, 0x0129, 0x0943, 0x0942, 0x0003,
2212 0x000A, 0x001C, 0x0018, 0x0033, 0x0017, 0x002D, 0x001B, 0x003B,
2213 ], [
2214 0x0003, 0x001A, 0x002D, 0x0038, 0x0028, 0x0395, 0x0E51, 0x0037,
2215 0x00E4, 0x0001, 0x0000, 0x001F, 0x001E, 0x0017, 0x003A, 0x0073,
2216 0x002A, 0x002B, 0x0029, 0x01CB, 0x0729, 0x1CA1, 0x1CA0, 0x0004,
2217 0x000A, 0x0004, 0x0018, 0x0036, 0x000B, 0x002C, 0x0019, 0x003B,
2218 ], [
2219 0x0004, 0x0004, 0x003F, 0x0017, 0x0075, 0x01F5, 0x07D1, 0x0017,
2220 0x01F6, 0x0001, 0x0000, 0x001B, 0x001A, 0x000A, 0x0032, 0x0074,
2221 0x00F8, 0x00F9, 0x01F7, 0x03E9, 0x0FA0, 0x1F43, 0x1F42, 0x0003,
2222 0x000A, 0x001E, 0x001C, 0x003B, 0x0018, 0x0016, 0x0016, 0x0033,
2223 ], [
2224 0x0004, 0x0007, 0x0018, 0x001E, 0x0036, 0x0031, 0x0177, 0x0077,
2225 0x0176, 0x0001, 0x0000, 0x001A, 0x0019, 0x003A, 0x0019, 0x005C,
2226 0x00BA, 0x0061, 0x00C1, 0x0180, 0x0302, 0x0607, 0x0606, 0x0002,
2227 0x000A, 0x001F, 0x001C, 0x0037, 0x0016, 0x0076, 0x000D, 0x002F,
2228 ], [
2229 0x0000, 0x000A, 0x001A, 0x000C, 0x001D, 0x0039, 0x0078, 0x005E,
2230 0x0393, 0x0002, 0x0001, 0x0016, 0x000F, 0x002E, 0x005F, 0x0073,
2231 0x00E5, 0x01C8, 0x0E4A, 0x1C97, 0x1C96, 0x0E49, 0x0E48, 0x0004,
2232 0x0006, 0x001F, 0x001B, 0x001D, 0x0038, 0x0038, 0x003D, 0x0079,
2233 ]
2234 ];
2235
2236 const VP31_AC_CAT0_BITS: [[u8; 32]; 16] = [
2237 [
2238 5, 7, 9, 10, 12, 13, 14, 5, 14, 4, 4, 4, 4, 4, 4, 4,
2239 5, 4, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 7, 11, 5, 7,
2240 ], [
2241 5, 6, 8, 8, 10, 12, 12, 4, 12, 4, 4, 4, 4, 4, 4, 4,
2242 5, 4, 4, 4, 4, 5, 6, 5, 6, 7, 7, 8, 9, 12, 5, 6,
2243 ], [
2244 5, 6, 8, 7, 10, 11, 12, 4, 13, 4, 4, 4, 4, 4, 4, 4,
2245 5, 4, 4, 4, 4, 5, 7, 5, 6, 6, 8, 8, 9, 13, 5, 6,
2246 ], [
2247 5, 6, 7, 7, 9, 10, 12, 4, 12, 4, 4, 4, 4, 4, 4, 4,
2248 5, 4, 4, 4, 5, 6, 8, 4, 6, 6, 7, 7, 7, 11, 5, 6,
2249 ], [
2250 4, 6, 7, 7, 9, 10, 13, 4, 13, 4, 4, 4, 4, 4, 4, 4,
2251 5, 4, 4, 5, 6, 7, 11, 4, 6, 6, 7, 7, 8, 12, 4, 6,
2252 ], [
2253 4, 6, 7, 6, 8, 10, 11, 4, 13, 3, 4, 4, 4, 4, 4, 5,
2254 5, 5, 5, 5, 7, 9, 13, 4, 5, 6, 7, 7, 7, 12, 4, 5,
2255 ], [
2256 4, 5, 7, 6, 8, 9, 10, 5, 12, 3, 3, 4, 4, 4, 4, 5,
2257 6, 5, 5, 6, 8, 13, 13, 4, 5, 5, 6, 7, 8, 11, 5, 5,
2258 ], [
2259 3, 5, 6, 5, 7, 9, 10, 5, 13, 3, 3, 4, 4, 4, 5, 6,
2260 6, 6, 7, 8, 13, 13, 13, 4, 5, 5, 6, 6, 7, 11, 5, 5,
2261 ], [
2262 5, 7, 8, 9, 11, 13, 13, 4, 7, 3, 4, 4, 4, 4, 4, 5,
2263 6, 5, 6, 6, 7, 10, 12, 4, 4, 5, 6, 6, 5, 6, 4, 5,
2264 ], [
2265 4, 6, 8, 8, 10, 12, 12, 5, 8, 3, 3, 4, 4, 4, 4, 5,
2266 6, 6, 6, 6, 7, 9, 11, 4, 5, 5, 6, 6, 6, 7, 4, 5,
2267 ], [
2268 4, 5, 6, 7, 9, 11, 12, 5, 7, 3, 4, 4, 4, 4, 5, 5,
2269 6, 6, 6, 7, 8, 10, 12, 4, 4, 5, 5, 6, 5, 6, 4, 5,
2270 ], [
2271 4, 5, 7, 6, 8, 10, 11, 5, 8, 3, 3, 4, 4, 5, 5, 6,
2272 7, 7, 7, 8, 9, 12, 12, 3, 4, 5, 5, 6, 5, 6, 5, 6,
2273 ], [
2274 3, 5, 6, 6, 7, 10, 12, 6, 8, 3, 3, 5, 5, 5, 6, 7,
2275 7, 7, 7, 9, 11, 13, 13, 3, 4, 4, 5, 6, 5, 6, 5, 6,
2276 ], [
2277 3, 4, 6, 5, 7, 9, 11, 6, 9, 3, 3, 5, 5, 5, 6, 7,
2278 8, 8, 9, 10, 12, 13, 13, 3, 4, 5, 5, 6, 5, 6, 5, 6,
2279 ], [
2280 3, 4, 5, 5, 6, 7, 9, 7, 9, 3, 3, 5, 5, 6, 6, 7,
2281 8, 8, 9, 10, 11, 12, 12, 3, 4, 5, 5, 6, 5, 7, 5, 6,
2282 ], [
2283 3, 4, 5, 4, 5, 6, 7, 7, 11, 3, 3, 5, 5, 6, 7, 8,
2284 9, 10, 13, 14, 14, 13, 13, 3, 4, 5, 5, 6, 6, 7, 6, 7,
2285 ]
2286 ];
2287
2288 const VP31_AC_CAT1_CODES: [[u16; 32]; 16] = [
2289 [
2290 0x000B, 0x002B, 0x0054, 0x01B7, 0x06D9, 0x0DB1, 0x0DB0, 0x0002,
2291 0x00AB, 0x0009, 0x000A, 0x0007, 0x0008, 0x000F, 0x000C, 0x0003,
2292 0x001D, 0x0004, 0x000B, 0x0006, 0x001A, 0x0003, 0x00AA, 0x0001,
2293 0x0000, 0x0014, 0x006C, 0x00DA, 0x0002, 0x036D, 0x001C, 0x0037,
2294 ], [
2295 0x001D, 0x0004, 0x00B6, 0x006A, 0x05B9, 0x16E1, 0x16E0, 0x0007,
2296 0x016F, 0x000C, 0x000D, 0x0009, 0x0008, 0x000F, 0x000A, 0x0003,
2297 0x0017, 0x0002, 0x0004, 0x001C, 0x002C, 0x006B, 0x0B71, 0x0005,
2298 0x0003, 0x001B, 0x005A, 0x0034, 0x0005, 0x02DD, 0x0000, 0x000C,
2299 ], [
2300 0x0003, 0x007F, 0x00A1, 0x00A0, 0x020C, 0x0834, 0x106B, 0x0007,
2301 0x0082, 0x000E, 0x000D, 0x000B, 0x000C, 0x0000, 0x0009, 0x0002,
2302 0x0011, 0x001E, 0x0015, 0x003E, 0x0040, 0x041B, 0x106A, 0x0006,
2303 0x000A, 0x0029, 0x007E, 0x0051, 0x0021, 0x0107, 0x0004, 0x000B,
2304 ], [
2305 0x0007, 0x001B, 0x00F6, 0x00E9, 0x03A1, 0x0740, 0x0E82, 0x001F,
2306 0x01EF, 0x0001, 0x0002, 0x000B, 0x000C, 0x000D, 0x0008, 0x001C,
2307 0x0003, 0x0012, 0x0002, 0x0075, 0x01D1, 0x1D07, 0x1D06, 0x000A,
2308 0x0013, 0x003B, 0x001A, 0x007A, 0x003C, 0x01EE, 0x0000, 0x000C,
2309 ], [
2310 0x000D, 0x003D, 0x0042, 0x0037, 0x00D9, 0x0362, 0x06C6, 0x001F,
2311 0x0086, 0x0001, 0x0002, 0x000C, 0x000B, 0x000A, 0x0001, 0x000F,
2312 0x0025, 0x003C, 0x001A, 0x0087, 0x01B0, 0x0D8F, 0x0D8E, 0x000E,
2313 0x0013, 0x000C, 0x0024, 0x0020, 0x0011, 0x006D, 0x0000, 0x000E,
2314 ], [
2315 0x0000, 0x0012, 0x0076, 0x0077, 0x014D, 0x0533, 0x14C9, 0x0013,
2316 0x00A5, 0x0002, 0x0003, 0x000B, 0x000C, 0x0008, 0x001A, 0x002B,
2317 0x0075, 0x0074, 0x00A7, 0x0298, 0x14C8, 0x14CB, 0x14CA, 0x000F,
2318 0x001C, 0x0007, 0x002A, 0x0028, 0x001B, 0x00A4, 0x0002, 0x0006,
2319 ], [
2320 0x0002, 0x001A, 0x002B, 0x003A, 0x00ED, 0x0283, 0x0A0A, 0x0004,
2321 0x00A1, 0x0004, 0x0003, 0x000B, 0x000C, 0x001F, 0x0006, 0x0077,
2322 0x00A3, 0x00A2, 0x0140, 0x1417, 0x1416, 0x0A09, 0x0A08, 0x0000,
2323 0x001E, 0x0007, 0x002A, 0x0029, 0x001C, 0x00EC, 0x001B, 0x0005,
2324 ], [
2325 0x0002, 0x0002, 0x0018, 0x001D, 0x0035, 0x00E4, 0x01CF, 0x001D,
2326 0x0072, 0x0004, 0x0005, 0x0006, 0x0007, 0x0006, 0x0073, 0x0038,
2327 0x01CE, 0x039B, 0x0398, 0x0733, 0x0732, 0x0735, 0x0734, 0x0000,
2328 0x001F, 0x001B, 0x0034, 0x000F, 0x001E, 0x00E5, 0x0019, 0x0038,
2329 ], [
2330 0x0016, 0x0050, 0x0172, 0x02E7, 0x1732, 0x2E67, 0x2E66, 0x0006,
2331 0x0051, 0x0001, 0x0000, 0x000D, 0x000C, 0x0009, 0x001C, 0x0009,
2332 0x001C, 0x001D, 0x005D, 0x00B8, 0x05CD, 0x1731, 0x1730, 0x000F,
2333 0x0005, 0x000F, 0x0008, 0x0029, 0x001D, 0x002F, 0x0008, 0x0015,
2334 ], [
2335 0x0009, 0x0021, 0x0040, 0x00AD, 0x02B0, 0x1589, 0x1588, 0x001C,
2336 0x005F, 0x0000, 0x000F, 0x000D, 0x000C, 0x0006, 0x0011, 0x002A,
2337 0x0057, 0x005E, 0x0041, 0x0159, 0x0563, 0x158B, 0x158A, 0x0001,
2338 0x0005, 0x0014, 0x003B, 0x002E, 0x0004, 0x003A, 0x0007, 0x0016,
2339 ], [
2340 0x000E, 0x0007, 0x0046, 0x0045, 0x0064, 0x032A, 0x0657, 0x0018,
2341 0x000D, 0x0000, 0x000F, 0x000A, 0x000B, 0x001A, 0x0036, 0x0047,
2342 0x0044, 0x0018, 0x0033, 0x00CB, 0x0656, 0x0329, 0x0328, 0x0002,
2343 0x0006, 0x0019, 0x000E, 0x0037, 0x0009, 0x000F, 0x0002, 0x0010,
2344 ], [
2345 0x0003, 0x0018, 0x0023, 0x0077, 0x0194, 0x1956, 0x32AF, 0x003A,
2346 0x0076, 0x0002, 0x0001, 0x001F, 0x001E, 0x0014, 0x0022, 0x0064,
2347 0x0197, 0x0196, 0x032B, 0x0654, 0x32AE, 0x1955, 0x1954, 0x0000,
2348 0x0009, 0x001C, 0x0015, 0x0010, 0x000D, 0x0017, 0x0016, 0x0033,
2349 ], [
2350 0x0005, 0x0006, 0x003E, 0x0010, 0x0048, 0x093F, 0x24FA, 0x0032,
2351 0x0067, 0x0002, 0x0001, 0x001B, 0x001E, 0x0034, 0x0066, 0x0092,
2352 0x0126, 0x024E, 0x049E, 0x49F7, 0x49F6, 0x24F9, 0x24F8, 0x0000,
2353 0x0007, 0x0018, 0x0011, 0x003F, 0x000E, 0x0013, 0x0035, 0x0025,
2354 ], [
2355 0x0005, 0x0008, 0x0012, 0x001C, 0x001C, 0x00EA, 0x1D75, 0x001E,
2356 0x0066, 0x0001, 0x0002, 0x001B, 0x001A, 0x001F, 0x003B, 0x0074,
2357 0x01D6, 0x03AF, 0x1D74, 0x1D77, 0x1D76, 0x0EB9, 0x0EB8, 0x000F,
2358 0x0006, 0x0013, 0x003B, 0x003A, 0x0000, 0x0018, 0x0032, 0x0067,
2359 ], [
2360 0x0004, 0x000A, 0x001B, 0x000C, 0x000D, 0x00E6, 0x0684, 0x0072,
2361 0x00E7, 0x0002, 0x0001, 0x0017, 0x0016, 0x0018, 0x00D1, 0x01A0,
2362 0x0686, 0x0D0F, 0x0D0A, 0x1A17, 0x1A16, 0x1A1D, 0x1A1C, 0x000F,
2363 0x001D, 0x000E, 0x0035, 0x0038, 0x0000, 0x000F, 0x0019, 0x0069,
2364 ], [
2365 0x0003, 0x000C, 0x001B, 0x0000, 0x0003, 0x002E, 0x0051, 0x00BC,
2366 0x0053, 0x0004, 0x0002, 0x0016, 0x0015, 0x0015, 0x0050, 0x00A4,
2367 0x0294, 0x052B, 0x052A, 0x052D, 0x052C, 0x052F, 0x052E, 0x000E,
2368 0x001A, 0x0004, 0x0028, 0x0029, 0x000F, 0x000B, 0x005F, 0x00BD,
2369 ]
2370 ];
2371
2372 const VP31_AC_CAT1_BITS: [[u8; 32]; 16] = [
2373 [
2374 5, 7, 8, 9, 11, 12, 12, 4, 9, 4, 4, 4, 4, 4, 4, 4,
2375 5, 4, 4, 4, 5, 6, 9, 4, 5, 6, 7, 8, 6, 10, 5, 6,
2376 ], [
2377 5, 6, 8, 8, 11, 13, 13, 4, 9, 4, 4, 4, 4, 4, 4, 4,
2378 5, 4, 4, 5, 6, 8, 12, 4, 5, 6, 7, 7, 6, 10, 4, 5,
2379 ], [
2380 4, 7, 8, 8, 10, 12, 13, 4, 8, 4, 4, 4, 4, 3, 4, 4,
2381 5, 5, 5, 6, 7, 11, 13, 4, 5, 6, 7, 7, 6, 9, 4, 5,
2382 ], [
2383 4, 6, 8, 8, 10, 11, 12, 5, 9, 3, 3, 4, 4, 4, 4, 5,
2384 5, 5, 5, 7, 9, 13, 13, 4, 5, 6, 6, 7, 6, 9, 4, 5,
2385 ], [
2386 4, 6, 7, 7, 9, 11, 12, 5, 8, 3, 3, 4, 4, 4, 4, 5,
2387 6, 6, 6, 8, 10, 13, 13, 4, 5, 5, 6, 6, 5, 8, 4, 5,
2388 ], [
2389 3, 5, 7, 7, 9, 11, 13, 5, 8, 3, 3, 4, 4, 4, 5, 6,
2390 7, 7, 8, 10, 13, 13, 13, 4, 5, 5, 6, 6, 5, 8, 4, 5,
2391 ], [
2392 3, 5, 6, 6, 8, 10, 12, 5, 8, 3, 3, 4, 4, 5, 5, 7,
2393 8, 8, 9, 13, 13, 12, 12, 3, 5, 5, 6, 6, 5, 8, 5, 5,
2394 ], [
2395 3, 4, 5, 5, 6, 8, 11, 7, 9, 3, 3, 4, 4, 5, 7, 8,
2396 11, 12, 12, 13, 13, 13, 13, 3, 5, 5, 6, 6, 5, 8, 5, 6,
2397 ], [
2398 5, 7, 9, 10, 13, 14, 14, 4, 7, 3, 3, 4, 4, 4, 5, 5,
2399 6, 6, 7, 8, 11, 13, 13, 4, 4, 5, 5, 6, 5, 6, 4, 5,
2400 ], [
2401 4, 6, 7, 8, 10, 13, 13, 5, 7, 3, 4, 4, 4, 4, 5, 6,
2402 7, 7, 7, 9, 11, 13, 13, 3, 4, 5, 6, 6, 4, 6, 4, 5,
2403 ], [
2404 4, 5, 7, 7, 9, 12, 13, 5, 6, 3, 4, 4, 4, 5, 6, 7,
2405 7, 7, 8, 10, 13, 12, 12, 3, 4, 5, 5, 6, 4, 5, 4, 5,
2406 ], [
2407 3, 5, 6, 7, 9, 13, 14, 6, 7, 3, 3, 5, 5, 5, 6, 7,
2408 9, 9, 10, 11, 14, 13, 13, 3, 4, 5, 5, 5, 4, 5, 5, 6,
2409 ], [
2410 3, 4, 6, 5, 7, 12, 14, 6, 7, 3, 3, 5, 5, 6, 7, 8,
2411 9, 10, 11, 15, 15, 14, 14, 3, 4, 5, 5, 6, 4, 5, 6, 6,
2412 ], [
2413 3, 4, 5, 5, 6, 9, 14, 6, 7, 3, 3, 5, 5, 6, 7, 8,
2414 10, 11, 14, 14, 14, 13, 13, 4, 4, 5, 6, 6, 3, 5, 6, 7,
2415 ], [
2416 3, 4, 5, 4, 5, 8, 11, 7, 8, 3, 3, 5, 5, 6, 8, 9,
2417 11, 12, 12, 13, 13, 13, 13, 4, 5, 5, 6, 6, 3, 5, 6, 7,
2418 ], [
2419 3, 4, 5, 3, 4, 6, 9, 8, 9, 3, 3, 5, 5, 7, 9, 10,
2420 12, 13, 13, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 6, 7, 8,
2421 ]
2422 ];
2423
2424 const VP31_AC_CAT2_CODES: [[u16; 32]; 16] = [
2425 [
2426 0x0003, 0x0009, 0x00D0, 0x01A3, 0x0344, 0x0D14, 0x1A2B, 0x0004,
2427 0x0015, 0x0000, 0x000F, 0x000B, 0x000C, 0x000E, 0x0009, 0x001B,
2428 0x000A, 0x0014, 0x000D, 0x002A, 0x0014, 0x068B, 0x1A2A, 0x0008,
2429 0x000B, 0x002B, 0x000B, 0x0069, 0x0035, 0x0008, 0x0007, 0x000C,
2430 ], [
2431 0x000A, 0x003C, 0x0032, 0x0030, 0x00C5, 0x0621, 0x0620, 0x001F,
2432 0x0033, 0x0001, 0x0000, 0x000E, 0x000D, 0x000C, 0x0004, 0x000D,
2433 0x0026, 0x0027, 0x0014, 0x0063, 0x0189, 0x0623, 0x0622, 0x000B,
2434 0x0012, 0x003D, 0x0022, 0x0015, 0x000B, 0x0023, 0x0007, 0x0010,
2435 ], [
2436 0x000F, 0x000C, 0x0043, 0x0010, 0x0044, 0x0114, 0x0455, 0x0018,
2437 0x0023, 0x0001, 0x0000, 0x000E, 0x000D, 0x0009, 0x0019, 0x0009,
2438 0x0017, 0x0016, 0x0042, 0x008B, 0x0454, 0x0457, 0x0456, 0x000B,
2439 0x0015, 0x000A, 0x0029, 0x0020, 0x000D, 0x0028, 0x0007, 0x0011,
2440 ], [
2441 0x0001, 0x001A, 0x0029, 0x002A, 0x00A0, 0x0285, 0x1425, 0x0002,
2442 0x0000, 0x0002, 0x0003, 0x000C, 0x000B, 0x0008, 0x0012, 0x0001,
2443 0x0051, 0x0001, 0x0143, 0x0508, 0x1424, 0x1427, 0x1426, 0x000F,
2444 0x001C, 0x0003, 0x0037, 0x002B, 0x0013, 0x0036, 0x001D, 0x0001,
2445 ], [
2446 0x0004, 0x001F, 0x003D, 0x0006, 0x0016, 0x0053, 0x014A, 0x0034,
2447 0x002A, 0x0002, 0x0003, 0x000B, 0x000C, 0x001C, 0x0037, 0x0017,
2448 0x002B, 0x0028, 0x00A4, 0x052D, 0x052C, 0x052F, 0x052E, 0x0000,
2449 0x001D, 0x0007, 0x0004, 0x0035, 0x0014, 0x0036, 0x0015, 0x003C,
2450 ], [
2451 0x0004, 0x000A, 0x0007, 0x001D, 0x0009, 0x01F3, 0x07C7, 0x0008,
2452 0x01F0, 0x0003, 0x0002, 0x000D, 0x000C, 0x0017, 0x007D, 0x01F2,
2453 0x07C6, 0x07C5, 0x1F12, 0x3E27, 0x3E26, 0x1F11, 0x1F10, 0x0000,
2454 0x001E, 0x0006, 0x0039, 0x0038, 0x003F, 0x002C, 0x0005, 0x002D,
2455 ], [
2456 0x0002, 0x0007, 0x0018, 0x0003, 0x0005, 0x0035, 0x004F, 0x0012,
2457 0x04E5, 0x0005, 0x0004, 0x000D, 0x000E, 0x0033, 0x0026, 0x009D,
2458 0x04E4, 0x04E7, 0x04E6, 0x04E1, 0x04E0, 0x04E3, 0x04E2, 0x0000,
2459 0x001F, 0x000C, 0x003D, 0x003C, 0x0032, 0x0034, 0x001B, 0x0008,
2460 ], [
2461 0x0000, 0x0004, 0x001C, 0x000F, 0x0002, 0x0007, 0x0075, 0x00E8,
2462 0x1D2A, 0x0005, 0x0004, 0x000D, 0x000C, 0x0077, 0x0E96, 0x3A57,
2463 0x3A56, 0x3A5D, 0x3A5C, 0x3A5F, 0x3A5E, 0x1D29, 0x1D28, 0x0003,
2464 0x0006, 0x000A, 0x002C, 0x0017, 0x0076, 0x01D3, 0x03A4, 0x002D,
2465 ], [
2466 0x000A, 0x0024, 0x00BF, 0x0085, 0x0211, 0x0842, 0x1087, 0x0018,
2467 0x0020, 0x0001, 0x0002, 0x000E, 0x000D, 0x0007, 0x0013, 0x0025,
2468 0x005E, 0x0043, 0x00BE, 0x0109, 0x1086, 0x0841, 0x0840, 0x000F,
2469 0x0001, 0x0011, 0x0000, 0x002E, 0x0019, 0x0001, 0x0006, 0x0016,
2470 ], [
2471 0x0002, 0x000F, 0x006F, 0x0061, 0x0374, 0x1BA8, 0x3753, 0x0012,
2472 0x0036, 0x0000, 0x0001, 0x000A, 0x000B, 0x001A, 0x0031, 0x0060,
2473 0x00DC, 0x01BB, 0x06EB, 0x1BAB, 0x3752, 0x3755, 0x3754, 0x000E,
2474 0x0006, 0x0013, 0x000E, 0x003E, 0x0008, 0x001E, 0x0019, 0x003F,
2475 ], [
2476 0x0003, 0x001C, 0x0025, 0x0024, 0x01DA, 0x1DBD, 0x3B7C, 0x003C,
2477 0x003D, 0x0000, 0x0001, 0x000B, 0x000A, 0x000B, 0x0077, 0x00EC,
2478 0x03B6, 0x076E, 0x1DBF, 0x76FB, 0x76FA, 0x3B79, 0x3B78, 0x000D,
2479 0x001F, 0x0013, 0x000A, 0x0008, 0x000C, 0x0008, 0x0009, 0x003A,
2480 ], [
2481 0x0005, 0x0003, 0x0004, 0x0010, 0x008F, 0x0475, 0x11D1, 0x0079,
2482 0x0027, 0x0002, 0x0003, 0x0001, 0x0000, 0x0026, 0x0046, 0x011C,
2483 0x0477, 0x08ED, 0x11D0, 0x11D3, 0x11D2, 0x11D9, 0x11D8, 0x000D,
2484 0x001F, 0x0012, 0x0005, 0x003D, 0x000C, 0x000E, 0x0022, 0x0078,
2485 ], [
2486 0x0005, 0x000C, 0x001B, 0x0000, 0x0006, 0x03E2, 0x3E3D, 0x000F,
2487 0x0034, 0x0003, 0x0002, 0x001E, 0x001D, 0x007D, 0x01F0, 0x07C6,
2488 0x3E3C, 0x3E3F, 0x3E3E, 0x3E39, 0x3E38, 0x3E3B, 0x3E3A, 0x0008,
2489 0x001C, 0x0002, 0x003F, 0x0035, 0x0009, 0x0001, 0x000E, 0x00F9,
2490 ], [
2491 0x0004, 0x000B, 0x0001, 0x000A, 0x001E, 0x00E0, 0x0E1E, 0x0071,
2492 0x0039, 0x0007, 0x0006, 0x000D, 0x000C, 0x0020, 0x01C2, 0x1C3F,
2493 0x1C3E, 0x0E19, 0x0E18, 0x0E1B, 0x0E1A, 0x0E1D, 0x0E1C, 0x0000,
2494 0x0009, 0x001D, 0x001F, 0x0011, 0x0005, 0x0001, 0x0043, 0x0042,
2495 ], [
2496 0x0004, 0x000D, 0x0007, 0x0002, 0x0014, 0x016C, 0x16D1, 0x02DF,
2497 0x016E, 0x0000, 0x0007, 0x002C, 0x002B, 0x02DE, 0x16D0, 0x16D3,
2498 0x16D2, 0x2DB5, 0x2DB4, 0x2DB7, 0x2DB6, 0x16D9, 0x16D8, 0x000C,
2499 0x002A, 0x005A, 0x001B, 0x001A, 0x0017, 0x000C, 0x05B7, 0x05B5,
2500 ], [
2501 0x0002, 0x000F, 0x001C, 0x000C, 0x003B, 0x01AC, 0x1AD8, 0x35B3,
2502 0x35B2, 0x0001, 0x0000, 0x0069, 0x0068, 0x35BD, 0x35BC, 0x35BF,
2503 0x35BE, 0x35B9, 0x35B8, 0x35BB, 0x35BA, 0x35B5, 0x35B4, 0x01A9,
2504 0x01A8, 0x035A, 0x00D7, 0x00D5, 0x003A, 0x001B, 0x35B7, 0x35B6,
2505 ]
2506 ];
2507
2508 const VP31_AC_CAT2_BITS: [[u8; 32]; 16] = [
2509 [
2510 4, 6, 8, 9, 10, 12, 13, 4, 7, 3, 4, 4, 4, 4, 4, 5,
2511 5, 5, 5, 6, 7, 11, 13, 4, 5, 6, 6, 7, 6, 6, 4, 5,
2512 ], [
2513 4, 6, 7, 7, 9, 12, 12, 5, 7, 3, 3, 4, 4, 4, 4, 5,
2514 6, 6, 6, 8, 10, 12, 12, 4, 5, 6, 6, 6, 5, 6, 4, 5,
2515 ], [
2516 4, 5, 7, 6, 8, 10, 12, 5, 7, 3, 3, 4, 4, 4, 5, 5,
2517 6, 6, 7, 9, 12, 12, 12, 4, 5, 5, 6, 6, 5, 6, 4, 5,
2518 ], [
2519 3, 5, 6, 6, 8, 10, 13, 5, 7, 3, 3, 4, 4, 4, 5, 6,
2520 7, 7, 9, 11, 13, 13, 13, 4, 5, 5, 6, 6, 5, 6, 5, 5,
2521 ], [
2522 3, 5, 6, 5, 7, 9, 11, 6, 8, 3, 3, 4, 4, 5, 6, 7,
2523 8, 8, 10, 13, 13, 13, 13, 3, 5, 5, 5, 6, 5, 6, 5, 6,
2524 ], [
2525 3, 4, 5, 5, 6, 9, 11, 6, 9, 3, 3, 4, 4, 5, 7, 9,
2526 11, 11, 13, 14, 14, 13, 13, 3, 5, 5, 6, 6, 6, 6, 5, 6,
2527 ], [
2528 3, 4, 5, 4, 5, 7, 9, 7, 13, 3, 3, 4, 4, 6, 8, 10,
2529 13, 13, 13, 13, 13, 13, 13, 3, 5, 5, 6, 6, 6, 7, 6, 6,
2530 ], [
2531 3, 4, 5, 4, 4, 5, 7, 8, 13, 3, 3, 4, 4, 7, 12, 14,
2532 14, 14, 14, 14, 14, 13, 13, 3, 5, 5, 7, 6, 7, 9, 10, 7,
2533 ], [
2534 4, 6, 8, 8, 10, 12, 13, 5, 6, 3, 3, 4, 4, 4, 5, 6,
2535 7, 7, 8, 9, 13, 12, 12, 4, 4, 5, 5, 6, 5, 5, 4, 5,
2536 ], [
2537 3, 5, 7, 7, 10, 13, 14, 5, 6, 3, 3, 4, 4, 5, 6, 7,
2538 8, 9, 11, 13, 14, 14, 14, 4, 4, 5, 5, 6, 4, 5, 5, 6,
2539 ], [
2540 3, 5, 6, 6, 9, 13, 14, 6, 6, 3, 3, 4, 4, 5, 7, 8,
2541 10, 11, 13, 15, 15, 14, 14, 4, 5, 5, 5, 5, 4, 4, 5, 6,
2542 ], [
2543 3, 4, 5, 5, 8, 11, 13, 7, 6, 3, 3, 4, 4, 6, 7, 9,
2544 11, 12, 13, 13, 13, 13, 13, 4, 5, 5, 5, 6, 4, 4, 6, 7,
2545 ], [
2546 3, 4, 5, 4, 6, 10, 14, 7, 6, 3, 3, 5, 5, 7, 9, 11,
2547 14, 14, 14, 14, 14, 14, 14, 4, 5, 5, 6, 6, 4, 3, 7, 8,
2548 ], [
2549 3, 4, 4, 4, 6, 9, 13, 8, 7, 3, 3, 5, 5, 7, 10, 14,
2550 14, 13, 13, 13, 13, 13, 13, 4, 5, 6, 6, 6, 4, 3, 8, 8,
2551 ], [
2552 3, 4, 4, 3, 5, 9, 13, 10, 9, 2, 3, 6, 6, 10, 13, 13,
2553 13, 14, 14, 14, 14, 13, 13, 5, 6, 7, 6, 6, 5, 4, 11, 11,
2554 ], [
2555 2, 4, 5, 4, 6, 9, 13, 14, 14, 2, 2, 7, 7, 14, 14, 14,
2556 14, 14, 14, 14, 14, 14, 14, 9, 9, 10, 8, 8, 6, 5, 14, 14,
2557 ]
2558 ];
2559
2560 const VP31_AC_CAT3_CODES: [[u16; 32]; 16] = [
2561 [
2562 0x0000, 0x0010, 0x0072, 0x0071, 0x0154, 0x0AAB, 0x0AA8, 0x0014,
2563 0x0070, 0x0002, 0x0003, 0x000C, 0x000B, 0x0003, 0x0011, 0x0073,
2564 0x0054, 0x00AB, 0x02AB, 0x1553, 0x1552, 0x1555, 0x1554, 0x000D,
2565 0x001E, 0x0012, 0x003E, 0x002B, 0x0002, 0x003F, 0x001D, 0x0013,
2566 ], [
2567 0x0003, 0x001F, 0x0029, 0x003D, 0x000C, 0x0069, 0x0345, 0x0002,
2568 0x0028, 0x0002, 0x0001, 0x000E, 0x000C, 0x0015, 0x0007, 0x001B,
2569 0x006B, 0x006A, 0x0344, 0x0347, 0x0346, 0x01A1, 0x01A0, 0x000B,
2570 0x001A, 0x0012, 0x0000, 0x003C, 0x0008, 0x001B, 0x0013, 0x0001,
2571 ], [
2572 0x0004, 0x0004, 0x003F, 0x0014, 0x0056, 0x015C, 0x15D5, 0x003C,
2573 0x002A, 0x0000, 0x0001, 0x000E, 0x000D, 0x000C, 0x00AF, 0x02BB,
2574 0x15D4, 0x15D7, 0x15D6, 0x15D1, 0x15D0, 0x15D3, 0x15D2, 0x000B,
2575 0x0019, 0x000D, 0x003E, 0x0031, 0x0007, 0x0005, 0x003D, 0x0030,
2576 ], [
2577 0x0005, 0x0008, 0x001A, 0x0000, 0x0036, 0x0011, 0x0106, 0x000A,
2578 0x006E, 0x0002, 0x0003, 0x0003, 0x0002, 0x006F, 0x0021, 0x020F,
2579 0x020E, 0x0101, 0x0100, 0x0103, 0x0102, 0x0105, 0x0104, 0x000C,
2580 0x001E, 0x0003, 0x003E, 0x003F, 0x0009, 0x000E, 0x000B, 0x0009,
2581 ], [
2582 0x0002, 0x000E, 0x001E, 0x000C, 0x001F, 0x006E, 0x00AD, 0x00AF,
2583 0x0014, 0x0004, 0x0003, 0x001A, 0x0017, 0x002A, 0x0576, 0x0AEF,
2584 0x0AEE, 0x0571, 0x0570, 0x0573, 0x0572, 0x0575, 0x0574, 0x0003,
2585 0x0016, 0x0004, 0x0036, 0x000B, 0x000A, 0x0000, 0x006F, 0x00AC,
2586 ], [
2587 0x0004, 0x0005, 0x0003, 0x0001, 0x0004, 0x002F, 0x0526, 0x1495,
2588 0x00A6, 0x0007, 0x0006, 0x002D, 0x002C, 0x1494, 0x1497, 0x1496,
2589 0x1491, 0x1490, 0x1493, 0x1492, 0x293D, 0x293C, 0x293F, 0x0000,
2590 0x0028, 0x00A5, 0x0148, 0x00A7, 0x002E, 0x0015, 0x0A4E, 0x293E,
2591 ], [
2592 0x0004, 0x0005, 0x0003, 0x0001, 0x0004, 0x002F, 0x0526, 0x1495,
2593 0x00A6, 0x0007, 0x0006, 0x002D, 0x002C, 0x1494, 0x1497, 0x1496,
2594 0x1491, 0x1490, 0x1493, 0x1492, 0x293D, 0x293C, 0x293F, 0x0000,
2595 0x0028, 0x00A5, 0x0148, 0x00A7, 0x002E, 0x0015, 0x0A4E, 0x293E,
2596 ], [
2597 0x0004, 0x0005, 0x0003, 0x0001, 0x0004, 0x002F, 0x0526, 0x1495,
2598 0x00A6, 0x0007, 0x0006, 0x002D, 0x002C, 0x1494, 0x1497, 0x1496,
2599 0x1491, 0x1490, 0x1493, 0x1492, 0x293D, 0x293C, 0x293F, 0x0000,
2600 0x0028, 0x00A5, 0x0148, 0x00A7, 0x002E, 0x0015, 0x0A4E, 0x293E,
2601 ], [
2602 0x0003, 0x0011, 0x0020, 0x0074, 0x010D, 0x0863, 0x0860, 0x000A,
2603 0x0075, 0x0001, 0x0000, 0x000B, 0x000A, 0x0018, 0x0038, 0x0042,
2604 0x010F, 0x010E, 0x0219, 0x10C3, 0x10C2, 0x10C5, 0x10C4, 0x000F,
2605 0x0004, 0x0019, 0x000B, 0x0039, 0x0009, 0x001B, 0x001A, 0x003B,
2606 ], [
2607 0x0005, 0x0001, 0x003E, 0x0001, 0x00E2, 0x1C6F, 0x38D9, 0x0039,
2608 0x001F, 0x0002, 0x0001, 0x0009, 0x0008, 0x0000, 0x0070, 0x01C7,
2609 0x038C, 0x071A, 0x38D8, 0x38DB, 0x38DA, 0x38DD, 0x38DC, 0x000D,
2610 0x001D, 0x000E, 0x003F, 0x003C, 0x000C, 0x0006, 0x003D, 0x001E,
2611 ], [
2612 0x0006, 0x000B, 0x0011, 0x001E, 0x0074, 0x03AA, 0x1D5C, 0x0001,
2613 0x0021, 0x0001, 0x0002, 0x0007, 0x0006, 0x003E, 0x00EB, 0x01D4,
2614 0x0EAF, 0x3ABB, 0x3ABA, 0x1D59, 0x1D58, 0x1D5B, 0x1D5A, 0x000A,
2615 0x001C, 0x0001, 0x003F, 0x003B, 0x0001, 0x0009, 0x0020, 0x0000,
2616 ], [
2617 0x0004, 0x000A, 0x0017, 0x0004, 0x0016, 0x016A, 0x16B1, 0x0017,
2618 0x005B, 0x0006, 0x0007, 0x0001, 0x0000, 0x000A, 0x02D7, 0x0B5A,
2619 0x16B0, 0x16B3, 0x16B2, 0x2D6D, 0x2D6C, 0x2D6F, 0x2D6E, 0x0006,
2620 0x000A, 0x0004, 0x002C, 0x0017, 0x0003, 0x0007, 0x0016, 0x00B4,
2621 ], [
2622 0x0005, 0x000D, 0x0005, 0x0009, 0x0033, 0x0193, 0x192C, 0x0061,
2623 0x0031, 0x0000, 0x0007, 0x0010, 0x0011, 0x00C8, 0x192F, 0x325B,
2624 0x325A, 0x1929, 0x1928, 0x192B, 0x192A, 0x325D, 0x325C, 0x0018,
2625 0x001A, 0x001B, 0x0065, 0x0019, 0x0004, 0x0007, 0x0060, 0x0324,
2626 ], [
2627 0x0006, 0x0000, 0x0002, 0x000F, 0x0039, 0x01D9, 0x1D82, 0x0761,
2628 0x03BE, 0x0001, 0x0002, 0x000F, 0x000E, 0x0762, 0x3B07, 0x3B06,
2629 0x3B1D, 0x3B1C, 0x3B1F, 0x3B1E, 0x3B19, 0x3B18, 0x3B1B, 0x0038,
2630 0x01DE, 0x00ED, 0x03BF, 0x00EE, 0x003A, 0x0006, 0x0EC0, 0x3B1A,
2631 ], [
2632 0x0000, 0x0002, 0x000F, 0x0006, 0x001C, 0x01D0, 0x0E8C, 0x1D1B,
2633 0x1D1A, 0x0003, 0x0002, 0x00EA, 0x00E9, 0x0E89, 0x0E88, 0x0E8B,
2634 0x0E8A, 0x1D65, 0x1D64, 0x1D67, 0x1D66, 0x1D61, 0x1D60, 0x03AD,
2635 0x1D63, 0x1D62, 0x1D1D, 0x1D1C, 0x003B, 0x01D7, 0x1D1F, 0x1D1E,
2636 ], [
2637 0x0002, 0x000F, 0x001C, 0x000C, 0x003B, 0x01AC, 0x1AD8, 0x35B3,
2638 0x35B2, 0x0001, 0x0000, 0x0069, 0x0068, 0x35BD, 0x35BC, 0x35BF,
2639 0x35BE, 0x35B9, 0x35B8, 0x35BB, 0x35BA, 0x35B5, 0x35B4, 0x01A9,
2640 0x01A8, 0x035A, 0x00D7, 0x00D5, 0x003A, 0x001B, 0x35B7, 0x35B6,
2641 ]
2642 ];
2643
2644 const VP31_AC_CAT3_BITS: [[u8; 32]; 16] = [
2645 [
2646 3, 5, 7, 7, 9, 12, 12, 5, 7, 3, 3, 4, 4, 4, 5, 7,
2647 7, 8, 10, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 6, 5, 5,
2648 ], [
2649 3, 5, 6, 6, 7, 10, 13, 5, 6, 3, 3, 4, 4, 5, 6, 8,
2650 10, 10, 13, 13, 13, 12, 12, 4, 5, 5, 5, 6, 4, 5, 5, 5,
2651 ], [
2652 3, 4, 6, 5, 7, 9, 13, 6, 6, 3, 3, 4, 4, 5, 8, 10,
2653 13, 13, 13, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 4, 6, 6,
2654 ], [
2655 3, 4, 5, 4, 6, 8, 12, 7, 7, 3, 3, 4, 4, 7, 9, 13,
2656 13, 12, 12, 12, 12, 12, 12, 4, 5, 5, 6, 6, 4, 4, 7, 7,
2657 ], [
2658 3, 4, 5, 4, 5, 7, 10, 10, 7, 3, 3, 5, 5, 8, 13, 14,
2659 14, 13, 13, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 3, 7, 10,
2660 ], [
2661 3, 4, 3, 3, 4, 6, 11, 13, 8, 3, 3, 6, 6, 13, 13, 13,
2662 13, 13, 13, 13, 14, 14, 14, 3, 6, 8, 9, 8, 6, 5, 12, 14,
2663 ], [
2664 3, 4, 3, 3, 4, 6, 11, 13, 8, 3, 3, 6, 6, 13, 13, 13,
2665 13, 13, 13, 13, 14, 14, 14, 3, 6, 8, 9, 8, 6, 5, 12, 14,
2666 ], [
2667 3, 4, 3, 3, 4, 6, 11, 13, 8, 3, 3, 6, 6, 13, 13, 13,
2668 13, 13, 13, 13, 14, 14, 14, 3, 6, 8, 9, 8, 6, 5, 12, 14,
2669 ], [
2670 3, 5, 6, 7, 9, 12, 12, 5, 7, 3, 3, 4, 4, 5, 6, 7,
2671 9, 9, 10, 13, 13, 13, 13, 4, 4, 5, 5, 6, 4, 5, 5, 6,
2672 ], [
2673 3, 4, 6, 5, 8, 13, 14, 6, 6, 3, 3, 4, 4, 5, 7, 9,
2674 10, 11, 14, 14, 14, 14, 14, 4, 5, 5, 6, 6, 4, 4, 6, 6,
2675 ], [
2676 3, 4, 5, 5, 7, 10, 13, 6, 6, 3, 3, 4, 4, 6, 8, 9,
2677 12, 14, 14, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 4, 6, 6,
2678 ], [
2679 3, 4, 5, 4, 6, 9, 13, 7, 7, 3, 3, 4, 4, 6, 10, 12,
2680 13, 13, 13, 14, 14, 14, 14, 4, 5, 5, 6, 6, 4, 4, 7, 8,
2681 ], [
2682 3, 4, 4, 4, 6, 9, 13, 8, 7, 2, 3, 5, 5, 8, 13, 14,
2683 14, 13, 13, 13, 13, 14, 14, 5, 6, 6, 7, 6, 4, 4, 8, 10,
2684 ], [
2685 3, 3, 4, 4, 6, 9, 13, 11, 10, 2, 2, 6, 6, 11, 14, 14,
2686 14, 14, 14, 14, 14, 14, 14, 6, 9, 8, 10, 8, 6, 5, 12, 14,
2687 ], [
2688 2, 3, 5, 4, 6, 10, 13, 14, 14, 2, 2, 9, 9, 13, 13, 13,
2689 13, 14, 14, 14, 14, 14, 14, 11, 14, 14, 14, 14, 7, 10, 14, 14,
2690 ], [
2691 2, 4, 5, 4, 6, 9, 13, 14, 14, 2, 2, 7, 7, 14, 14, 14,
2692 14, 14, 14, 14, 14, 14, 14, 9, 9, 10, 8, 8, 6, 5, 14, 14,
2693 ]
2694 ];
2695
2696 const VP31_DC_WEIGHTS: [[i16; 5]; 16] = [
2697 [ 0, 0, 0, 0, 0 ],
2698 [ 1, 0, 0, 0, 1 ],
2699 [ 0, 1, 0, 0, 1 ],
2700 [ 1, 0, 0, 0, 1 ],
2701
2702 [ 0, 0, 1, 0, 1 ],
2703 [ 1, 0, 1, 0, 2 ],
2704 [ 0, 0, 1, 0, 1 ],
2705 [ 29, -26, 29, 0, 32 ],
2706
2707 [ 0, 0, 0, 1, 1 ],
2708 [ 75, 0, 0, 53, 128 ],
2709 [ 0, 1, 0, 1, 2 ],
2710 [ 75, 0, 0, 53, 128 ],
2711
2712 [ 0, 0, 1, 0, 1 ],
2713 [ 75, 0, 0, 53, 128 ],
2714 [ 0, 3, 10, 3, 16 ],
2715 [ 29, -26, 29, 0, 32 ],
2716 ];
2717
2718 const VP30_DC_SCALES: [i16; 64] = [
2719 24, 20, 20, 20, 20, 20, 20, 20,
2720 19, 19, 19, 19, 18, 18, 18, 18,
2721 17, 17, 17, 17, 16, 16, 15, 15,
2722 14, 14, 13, 13, 12, 12, 11, 11,
2723 10, 10, 9, 9, 8, 8, 7, 7,
2724 6, 6, 6, 6, 5, 5, 5, 5,
2725 4, 4, 4, 4, 3, 3, 3, 3,
2726 2, 2, 2, 2, 1, 1, 1, 1
2727 ];
2728
2729 const VP30_AC_SCALES: [i16; 64] = [
2730 3000, 2500, 2000, 1500, 1200, 1000, 900, 800,
2731 750, 700, 650, 630, 600, 550, 500, 450,
2732 410, 380, 350, 320, 290, 260, 240, 220,
2733 200, 180, 165, 150, 140, 130, 120, 115,
2734 110, 100, 95, 90, 85, 80, 75, 70,
2735 67, 65, 63, 61, 57, 55, 53, 50,
2736 49, 46, 44, 42, 39, 36, 33, 30,
2737 27, 24, 21, 19, 17, 15, 12, 10
2738 ];
2739
2740 const VP30_DC_CODES: [[u16; 32]; 5] = [
2741 [
2742 0x0005, 0x002D, 0x0004, 0x0009, 0x0088, 0x0225, 0x0224, 0x0005,
2743 0x0011, 0x0007, 0x0006, 0x0009, 0x000A, 0x0007, 0x0017, 0x000C,
2744 0x002C, 0x0005, 0x0008, 0x0003, 0x0012, 0x0010, 0x0113, 0x0003,
2745 0x0010, 0x0000, 0x0013, 0x001A, 0x0023, 0x0045, 0x0001, 0x001B
2746 ], [
2747 0x000B, 0x0012, 0x0029, 0x0010, 0x000D, 0x00A2, 0x0020, 0x0009,
2748 0x0050, 0x0007, 0x0006, 0x0006, 0x0005, 0x0002, 0x0008, 0x0027,
2749 0x0005, 0x0022, 0x0023, 0x0057, 0x00A3, 0x0011, 0x0021, 0x0007,
2750 0x0000, 0x0009, 0x002A, 0x0003, 0x0007, 0x0026, 0x000C, 0x0056
2751 ], [
2752 0x000D, 0x0018, 0x0009, 0x0017, 0x0033, 0x0056, 0x00F7, 0x00F1,
2753 0x007A, 0x0000, 0x0007, 0x0009, 0x0008, 0x0005, 0x000D, 0x002D,
2754 0x0010, 0x001D, 0x001C, 0x0057, 0x00CB, 0x00F6, 0x00F0, 0x0014,
2755 0x000C, 0x002C, 0x0011, 0x001F, 0x002A, 0x0064, 0x00CA, 0x0079
2756 ], [
2757 0x000F, 0x001A, 0x0013, 0x001B, 0x003B, 0x0072, 0x01D3, 0x0707,
2758 0x0E0D, 0x0001, 0x0000, 0x000C, 0x000B, 0x0008, 0x0012, 0x002A,
2759 0x0073, 0x0028, 0x0075, 0x0056, 0x0052, 0x01C0, 0x0E0C, 0x0071,
2760 0x0057, 0x00E1, 0x00A6, 0x00E8, 0x00A7, 0x03A5, 0x03A4, 0x0382
2761 ], [
2762 0x000F, 0x001B, 0x0014, 0x001D, 0x0010, 0x0073, 0x00E2, 0x023C,
2763 0x11C9, 0x0001, 0x0000, 0x000C, 0x000B, 0x0009, 0x0015, 0x0035,
2764 0x0072, 0x0034, 0x0022, 0x0070, 0x0046, 0x011D, 0x11C8, 0x01C7,
2765 0x01C6, 0x0238, 0x047E, 0x023E, 0x0473, 0x08E5, 0x023D, 0x047F
2766 ]
2767 ];
2768 const VP30_DC_BITS: [[u8; 32]; 5] = [
2769 [
2770 4, 6, 6, 6, 8, 10, 10, 6, 7, 3, 3, 4, 4, 4, 5, 5,
2771 6, 5, 5, 5, 6, 7, 9, 4, 5, 5, 6, 6, 6, 7, 5, 6
2772 ], [
2773 4, 5, 6, 5, 6, 8, 9, 7, 7, 3, 3, 4, 4, 4, 5, 6,
2774 6, 6, 6, 7, 8, 8, 9, 4, 4, 5, 6, 5, 5, 6, 6, 7
2775 ], [
2776 4, 5, 5, 5, 6, 7, 9, 9, 8, 2, 3, 4, 4, 4, 5, 6,
2777 6, 6, 6, 7, 8, 9, 9, 5, 5, 6, 6, 6, 6, 7, 8, 8
2778 ], [
2779 4, 5, 5, 5, 6, 7, 9, 11, 12, 2, 2, 4, 4, 4, 5, 6,
2780 7, 6, 7, 7, 7, 9, 12, 7, 7, 8, 8, 8, 8, 10, 10, 10
2781 ], [
2782 4, 5, 5, 5, 5, 7, 8, 10, 13, 2, 2, 4, 4, 4, 5, 6,
2783 7, 6, 6, 7, 7, 9, 13, 9, 9, 10, 11, 10, 11, 12, 10, 11
2784 ]
2785 ];
2786 const VP30_AC_INTRA_CODES: [[u16; 32]; 5] = [
2787 [
2788 0x0008, 0x0033, 0x0008, 0x004B, 0x0089, 0x0221, 0x0220, 0x001F,
2789 0x0045, 0x0000, 0x000E, 0x000B, 0x000A, 0x000D, 0x0006, 0x001E,
2790 0x000A, 0x0018, 0x0013, 0x0005, 0x0009, 0x0046, 0x0111, 0x0007,
2791 0x000B, 0x0032, 0x0010, 0x004A, 0x0024, 0x0047, 0x0003, 0x0009
2792 ], [
2793 0x000E, 0x000E, 0x007B, 0x001E, 0x007E, 0x03EF, 0x07DD, 0x0018,
2794 0x00FA, 0x0002, 0x0000, 0x000A, 0x0008, 0x000B, 0x0003, 0x0012,
2795 0x0033, 0x000C, 0x003C, 0x001A, 0x007F, 0x01F6, 0x07DC, 0x000D,
2796 0x0013, 0x0004, 0x001B, 0x007A, 0x0032, 0x007C, 0x001F, 0x0005
2797 ], [
2798 0x0000, 0x0018, 0x0034, 0x000C, 0x006A, 0x01F9, 0x07EA, 0x0016,
2799 0x0FD7, 0x0002, 0x0001, 0x000A, 0x0009, 0x0007, 0x001B, 0x003E,
2800 0x0020, 0x0021, 0x006B, 0x01FB, 0x03F4, 0x1FAD, 0x1FAC, 0x000E,
2801 0x0019, 0x0011, 0x002F, 0x007F, 0x002E, 0x01F8, 0x001E, 0x000D
2802 ], [
2803 0x000E, 0x0016, 0x002E, 0x0003, 0x006E, 0x008B, 0x0113, 0x0018,
2804 0x0221, 0x0001, 0x0002, 0x000A, 0x0009, 0x0007, 0x001A, 0x0002,
2805 0x001B, 0x0023, 0x006F, 0x008A, 0x0111, 0x0441, 0x0440, 0x000F,
2806 0x0019, 0x0010, 0x0036, 0x001A, 0x002F, 0x0112, 0x0000, 0x000C
2807 ], [
2808 0x000E, 0x000F, 0x001B, 0x0033, 0x005A, 0x00B6, 0x0008, 0x001A,
2809 0x004D, 0x0001, 0x0002, 0x000A, 0x0009, 0x0008, 0x001B, 0x0003,
2810 0x002C, 0x002E, 0x0005, 0x00B7, 0x0027, 0x0099, 0x0098, 0x000F,
2811 0x0018, 0x000E, 0x002F, 0x001A, 0x0032, 0x0012, 0x0000, 0x000C
2812 ]
2813 ];
2814 const VP30_AC_INTRA_BITS: [[u8; 32]; 5] = [
2815 [
2816 4, 6, 6, 7, 9, 11, 11, 5, 8, 3, 4, 4, 4, 4, 4, 5,
2817 5, 5, 5, 5, 6, 8, 10, 4, 5, 6, 6, 7, 6, 8, 4, 5
2818 ], [
2819 4, 5, 7, 6, 8, 11, 12, 5, 9, 3, 3, 4, 4, 4, 4, 5,
2820 6, 5, 6, 6, 8, 10, 12, 4, 5, 5, 6, 7, 6, 8, 5, 5
2821 ], [
2822 3, 5, 6, 5, 7, 9, 11, 5, 12, 3, 3, 4, 4, 4, 5, 6,
2823 6, 6, 7, 9, 10, 13, 13, 4, 5, 5, 6, 7, 6, 9, 5, 5
2824 ], [
2825 4, 5, 6, 5, 7, 8, 9, 5, 10, 3, 3, 4, 4, 4, 5, 5,
2826 6, 6, 7, 8, 9, 11, 11, 4, 5, 5, 6, 6, 6, 9, 4, 5
2827 ], [
2828 4, 5, 6, 6, 7, 8, 7, 5, 10, 3, 3, 4, 4, 4, 5, 5,
2829 6, 6, 6, 8, 9, 11, 11, 4, 5, 5, 6, 6, 6, 8, 4, 5
2830 ]
2831 ];
2832 const VP30_AC_INTER_CODES: [[u16; 32]; 5] = [
2833 [
2834 0x000D, 0x0038, 0x0061, 0x0060, 0x0393, 0x1C95, 0x1C94, 0x0014,
2835 0x0073, 0x0001, 0x0000, 0x000B, 0x0009, 0x001D, 0x000E, 0x0022,
2836 0x0046, 0x0047, 0x00E5, 0x01C8, 0x0724, 0x1C97, 0x1C96, 0x000F,
2837 0x0006, 0x0019, 0x000F, 0x0031, 0x0004, 0x0010, 0x0005, 0x0015
2838 ], [
2839 0x0004, 0x001B, 0x0030, 0x0034, 0x00D5, 0x06B3, 0x3595, 0x0031,
2840 0x001A, 0x0002, 0x0001, 0x001F, 0x001E, 0x000C, 0x001B, 0x00D7,
2841 0x00D4, 0x01AD, 0x0358, 0x0D64, 0x3594, 0x3597, 0x3596, 0x0000,
2842 0x000A, 0x001D, 0x0017, 0x0039, 0x0007, 0x0019, 0x0016, 0x0038
2843 ], [
2844 0x0005, 0x0009, 0x001A, 0x001E, 0x001F, 0x00E2, 0x038E, 0x0070,
2845 0x003B, 0x0001, 0x0000, 0x0019, 0x0018, 0x001E, 0x003A, 0x01C6,
2846 0x071E, 0x0E3E, 0x1C7E, 0x71FD, 0x71FC, 0x71FF, 0x71FE, 0x0002,
2847 0x0008, 0x001D, 0x001B, 0x0039, 0x001F, 0x000D, 0x000C, 0x001C
2848 ], [
2849 0x0003, 0x000B, 0x001C, 0x000D, 0x0004, 0x000A, 0x0076, 0x00E8,
2850 0x01DC, 0x0001, 0x0000, 0x0033, 0x0032, 0x00E9, 0x03BB, 0x0774,
2851 0x1DD5, 0x3BAD, 0x3BAC, 0x3BAF, 0x3BAE, 0x3BA9, 0x3BA8, 0x0004,
2852 0x000A, 0x001F, 0x001E, 0x0030, 0x000B, 0x0075, 0x0031, 0x00EF
2853 ], [
2854 0x0009, 0x001E, 0x000F, 0x000E, 0x000C, 0x0008, 0x0001, 0x00E3,
2855 0x00E2, 0x0002, 0x0000, 0x003A, 0x0039, 0x0070, 0x01DC, 0x0776,
2856 0x0775, 0x0EEF, 0x0EE8, 0x1DD3, 0x1DD2, 0x1DDD, 0x1DDC, 0x0005,
2857 0x001F, 0x001B, 0x0006, 0x006A, 0x0034, 0x0076, 0x006B, 0x00EF
2858 ]
2859 ];
2860 const VP30_AC_INTER_BITS: [[u8; 32]; 5] = [
2861 [
2862 4, 6, 7, 7, 10, 13, 13, 5, 7, 3, 3, 4, 4, 5, 5, 6,
2863 7, 7, 8, 9, 11, 13, 13, 4, 4, 5, 5, 6, 4, 5, 4, 5
2864 ], [
2865 3, 5, 6, 6, 8, 11, 14, 6, 6, 3, 3, 5, 5, 5, 6, 8,
2866 8, 9, 10, 12, 14, 14, 14, 3, 4, 5, 5, 6, 4, 5, 5, 6
2867 ], [
2868 3, 4, 5, 5, 6, 8, 10, 7, 7, 3, 3, 5, 5, 6, 7, 9,
2869 11, 12, 13, 15, 15, 15, 15, 3, 4, 5, 5, 6, 5, 5, 5, 6
2870 ], [
2871 3, 4, 5, 4, 4, 5, 7, 8, 9, 3, 3, 6, 6, 8, 10, 11,
2872 13, 14, 14, 14, 14, 14, 14, 3, 4, 5, 5, 6, 5, 7, 6, 8
2873 ], [
2874 4, 5, 5, 4, 4, 4, 3, 9, 9, 3, 3, 7, 7, 8, 10, 12,
2875 12, 13, 13, 14, 14, 14, 14, 3, 5, 5, 4, 7, 6, 8, 7, 9
2876 ]
2877 ];
2878 const VP30_MBTYPE_CODES: [u8; 7] = [ 0x00, 0x08, 0x0A, 0x03, 0x0B, 0x13, 0x12 ];
2879 const VP30_MBTYPE_BITS: [u8; 7] = [ 1, 4, 4, 2, 4, 5, 5 ];
2880 const VP30_MBTYPE_SYMS: [VPMBType; 7] = [
2881 VPMBType::InterNoMV, VPMBType::Intra, VPMBType::InterMV, VPMBType::InterNearest,
2882 VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
2883 ];
2884
2885 const VP40_DC_CODES: [[u32; 32]; 16] = [
2886 [
2887 0x000C, 0x0070, 0x01CA, 0x01CB, 0x0391, 0x1C9B, 0x3935, 0x0071,
2888 0x3934, 0x000B, 0x000F, 0x0019, 0x0002, 0x0009, 0x0003, 0x001D,
2889 0x0018, 0x0007, 0x000D, 0x0002, 0x0000, 0x000A, 0x0008, 0x001A,
2890 0x0073, 0x006F, 0x0E4C, 0x0727, 0x0392, 0x0390, 0x0036, 0x006E
2891 ], [
2892 0x0011, 0x007A, 0x0083, 0x0040, 0x0105, 0x0413, 0x0410, 0x007B,
2893 0x0822, 0x000E, 0x0002, 0x0002, 0x0006, 0x000A, 0x0007, 0x001F,
2894 0x0017, 0x0009, 0x000D, 0x0000, 0x000C, 0x0003, 0x003C, 0x002C,
2895 0x0021, 0x0169, 0x0412, 0x02D0, 0x02D1, 0x0823, 0x005B, 0x00B5
2896 ], [
2897 0x0017, 0x0010, 0x00B6, 0x0022, 0x016A, 0x02D0, 0x0B48, 0x0077,
2898 0x1692, 0x0000, 0x0003, 0x0003, 0x0009, 0x000C, 0x0005, 0x0002,
2899 0x001C, 0x0008, 0x000D, 0x000F, 0x000A, 0x0009, 0x0023, 0x003A,
2900 0x002C, 0x016B, 0x05A5, 0x02D3, 0x02D1, 0x1693, 0x0076, 0x00B7
2901 ], [
2902 0x001E, 0x0013, 0x00FB, 0x007C, 0x0046, 0x07D6, 0x0FA9, 0x0012,
2903 0x1F50, 0x0001, 0x0004, 0x0005, 0x000A, 0x000E, 0x0007, 0x0000,
2904 0x0017, 0x0006, 0x000D, 0x000C, 0x0001, 0x002C, 0x008F, 0x003F,
2905 0x002D, 0x01F4, 0x07D5, 0x008E, 0x07D7, 0x1F51, 0x0010, 0x0022
2906 ], [
2907 0x0001, 0x002B, 0x0012, 0x0055, 0x0027, 0x03B0, 0x0762, 0x0077,
2908 0x0261, 0x0002, 0x0006, 0x0007, 0x000B, 0x000F, 0x0008, 0x0000,
2909 0x001C, 0x0003, 0x0009, 0x0006, 0x0014, 0x0054, 0x0131, 0x0005,
2910 0x003A, 0x01D9, 0x0099, 0x004D, 0x0763, 0x0260, 0x0008, 0x00ED
2911 ], [
2912 0x0004, 0x0033, 0x0060, 0x0065, 0x00C2, 0x030D, 0x0619, 0x0064,
2913 0x1862, 0x0004, 0x0007, 0x000A, 0x000B, 0x000D, 0x0006, 0x0000,
2914 0x000F, 0x0003, 0x0005, 0x0002, 0x0002, 0x0077, 0x0C30, 0x0003,
2915 0x0031, 0x0187, 0x01D9, 0x00ED, 0x01D8, 0x1863, 0x001C, 0x003A
2916 ], [
2917 0x0008, 0x000A, 0x006A, 0x0016, 0x001E, 0x034E, 0x069F, 0x0068,
2918 0x0D28, 0x0005, 0x0007, 0x0007, 0x000C, 0x0000, 0x0006, 0x001B,
2919 0x0012, 0x0002, 0x0004, 0x0013, 0x000E, 0x034B, 0x1A53, 0x0006,
2920 0x0017, 0x01A6, 0x069E, 0x01A4, 0x0695, 0x1A52, 0x006B, 0x001F
2921 ], [
2922 0x000E, 0x000F, 0x0017, 0x0025, 0x009F, 0x0138, 0x024B, 0x0093,
2923 0x092A, 0x0005, 0x0000, 0x0008, 0x000D, 0x000F, 0x0006, 0x0004,
2924 0x000E, 0x0019, 0x0018, 0x000A, 0x009E, 0x0494, 0x1256, 0x0026,
2925 0x0016, 0x0124, 0x04E5, 0x0273, 0x04E4, 0x1257, 0x0048, 0x009D
2926 ], [
2927 0x0004, 0x002C, 0x0050, 0x001E, 0x0071, 0x00E1, 0x00E0, 0x001D,
2928 0x0006, 0x0007, 0x0006, 0x0007, 0x0005, 0x0006, 0x0015, 0x0000,
2929 0x0029, 0x0002, 0x0006, 0x0001, 0x0023, 0x001F, 0x0039, 0x0009,
2930 0x0002, 0x0010, 0x0007, 0x002D, 0x002F, 0x002E, 0x0022, 0x0051
2931 ], [
2932 0x0008, 0x002F, 0x0051, 0x0050, 0x02ED, 0x05D9, 0x05D8, 0x00BA,
2933 0x005C, 0x0007, 0x0006, 0x0009, 0x0006, 0x0007, 0x0016, 0x0005,
2934 0x002B, 0x0006, 0x000A, 0x0001, 0x000F, 0x001D, 0x0177, 0x0004,
2935 0x0001, 0x0004, 0x0001, 0x002A, 0x000B, 0x0029, 0x0000, 0x001C
2936 ], [
2937 0x000A, 0x003C, 0x0074, 0x004E, 0x026D, 0x04D9, 0x04D8, 0x009A,
2938 0x004C, 0x0000, 0x0006, 0x0008, 0x0007, 0x0006, 0x0016, 0x0008,
2939 0x002E, 0x000A, 0x000B, 0x003D, 0x0024, 0x00EB, 0x0137, 0x001F,
2940 0x001C, 0x003B, 0x0012, 0x0025, 0x002F, 0x0013, 0x004F, 0x00EA
2941 ], [
2942 0x000A, 0x000A, 0x0003, 0x0016, 0x0009, 0x0021, 0x0020, 0x00B3,
2943 0x0058, 0x0007, 0x0006, 0x0007, 0x0006, 0x0004, 0x0013, 0x0002,
2944 0x0025, 0x0000, 0x0003, 0x002D, 0x005D, 0x00B2, 0x0011, 0x0008,
2945 0x0002, 0x0006, 0x0017, 0x002F, 0x0007, 0x0024, 0x005C, 0x0005
2946 ], [
2947 0x000B, 0x0013, 0x001F, 0x0031, 0x0021, 0x0295, 0x0528, 0x00A4,
2948 0x003C, 0x0000, 0x0007, 0x0006, 0x0005, 0x001B, 0x0012, 0x0032,
2949 0x001D, 0x002B, 0x0030, 0x001C, 0x003D, 0x014B, 0x0529, 0x0008,
2950 0x001A, 0x0033, 0x0011, 0x002A, 0x0009, 0x0028, 0x0053, 0x0020
2951 ], [
2952 0x000E, 0x0015, 0x0029, 0x003F, 0x004D, 0x02F1, 0x05E0, 0x0092,
2953 0x0048, 0x0000, 0x0006, 0x0006, 0x0005, 0x0004, 0x000F, 0x002E,
2954 0x001D, 0x0028, 0x0027, 0x005F, 0x00BD, 0x0179, 0x05E1, 0x0008,
2955 0x001E, 0x002D, 0x001C, 0x002C, 0x003E, 0x0025, 0x004C, 0x0093
2956 ], [
2957 0x000C, 0x0017, 0x0035, 0x0013, 0x0021, 0x00AD, 0x06F1, 0x01BD,
2958 0x00D9, 0x0000, 0x0007, 0x0007, 0x0006, 0x0004, 0x0011, 0x002A,
2959 0x006E, 0x0025, 0x0024, 0x0057, 0x00D8, 0x0379, 0x06F0, 0x0005,
2960 0x0016, 0x0029, 0x006D, 0x0028, 0x0034, 0x0020, 0x00DF, 0x00AC
2961 ], [
2962 0x0000, 0x001A, 0x0006, 0x0019, 0x0030, 0x005A, 0x018A, 0x02DD,
2963 0x018B, 0x0001, 0x0007, 0x000A, 0x0009, 0x0002, 0x0010, 0x002E,
2964 0x006E, 0x002C, 0x000E, 0x005E, 0x00C4, 0x05B9, 0x05B8, 0x0011,
2965 0x0036, 0x005F, 0x001E, 0x0063, 0x006F, 0x001F, 0x00B6, 0x016F
2966 ]
2967 ];
2968 const VP40_DC_BITS: [[u8; 32]; 16] = [
2969 [
2970 5, 7, 9, 9, 10, 13, 14, 7, 14, 4, 4, 5, 4, 4, 4, 5,
2971 5, 4, 4, 3, 3, 4, 4, 6, 7, 8, 12, 11, 10, 10, 7, 8
2972 ], [
2973 5, 7, 8, 7, 9, 11, 11, 7, 12, 4, 3, 4, 4, 4, 4, 5,
2974 5, 4, 4, 3, 4, 4, 6, 6, 6, 9, 11, 10, 10, 12, 7, 8
2975 ], [
2976 5, 6, 8, 7, 9, 10, 12, 7, 13, 3, 3, 4, 4, 4, 4, 4,
2977 5, 4, 4, 4, 4, 5, 7, 6, 6, 9, 11, 10, 10, 13, 7, 8
2978 ], [
2979 5, 6, 8, 7, 8, 11, 12, 6, 13, 3, 3, 4, 4, 4, 4, 4,
2980 5, 4, 4, 4, 4, 6, 9, 6, 6, 9, 11, 9, 11, 13, 6, 7
2981 ], [
2982 4, 6, 7, 7, 8, 10, 11, 7, 12, 3, 3, 4, 4, 4, 4, 4,
2983 5, 4, 4, 4, 5, 7, 11, 5, 6, 9, 10, 9, 11, 12, 6, 8
2984 ], [
2985 4, 6, 7, 7, 8, 10, 11, 7, 13, 3, 3, 4, 4, 4, 4, 4,
2986 5, 4, 4, 4, 5, 8, 12, 5, 6, 9, 10, 9, 10, 13, 6, 7
2987 ], [
2988 4, 5, 7, 6, 7, 10, 11, 7, 12, 3, 3, 4, 4, 3, 4, 5,
2989 5, 4, 4, 5, 6, 10, 13, 5, 6, 9, 11, 9, 11, 13, 7, 7
2990 ], [
2991 4, 5, 6, 6, 8, 9, 10, 8, 12, 3, 2, 4, 4, 4, 4, 4,
2992 5, 5, 5, 5, 8, 11, 13, 6, 6, 9, 11, 10, 11, 13, 7, 8
2993 ], [
2994 4, 6, 7, 7, 9, 10, 10, 7, 6, 3, 3, 4, 4, 4, 5, 5,
2995 6, 5, 5, 5, 6, 7, 8, 4, 4, 5, 6, 6, 6, 6, 6, 7
2996 ], [
2997 4, 6, 7, 7, 10, 11, 11, 8, 7, 3, 3, 4, 4, 4, 5, 5,
2998 6, 5, 5, 5, 6, 7, 9, 4, 4, 5, 6, 6, 5, 6, 6, 7
2999 ], [
3000 4, 6, 7, 7, 10, 11, 11, 8, 7, 2, 3, 4, 4, 4, 5, 5,
3001 6, 5, 5, 6, 6, 8, 9, 5, 5, 6, 6, 6, 6, 6, 7, 8
3002 ], [
3003 4, 5, 6, 6, 8, 10, 10, 8, 7, 3, 3, 4, 4, 4, 5, 5,
3004 6, 5, 5, 6, 7, 8, 9, 4, 4, 5, 6, 6, 5, 6, 7, 7
3005 ], [
3006 4, 5, 6, 6, 7, 10, 11, 8, 7, 2, 3, 4, 4, 5, 5, 6,
3007 6, 6, 6, 6, 7, 9, 11, 4, 5, 6, 6, 6, 5, 6, 7, 7
3008 ], [
3009 4, 5, 6, 6, 7, 10, 11, 8, 7, 2, 3, 4, 4, 4, 5, 6,
3010 6, 6, 6, 7, 8, 9, 11, 4, 5, 6, 6, 6, 6, 6, 7, 8
3011 ], [
3012 4, 5, 6, 5, 6, 8, 11, 9, 8, 2, 3, 4, 4, 4, 5, 6,
3013 7, 6, 6, 7, 8, 10, 11, 4, 5, 6, 7, 6, 6, 6, 8, 8
3014 ], [
3015 3, 5, 5, 5, 6, 7, 9, 10, 9, 2, 3, 4, 4, 4, 5, 6,
3016 7, 6, 6, 7, 8, 11, 11, 5, 6, 7, 7, 7, 7, 7, 8, 9
3017 ]
3018 ];
3019 const VP40_AC_CAT0_CODES: [[u32; 32]; 16] = [
3020 [
3021 0x0006, 0x001E, 0x01CC, 0x01CE, 0x0734, 0x1CD5, 0x1CD4, 0x0018,
3022 0x0E6B, 0x0000, 0x000F, 0x0006, 0x0007, 0x000D, 0x0008, 0x0002,
3023 0x0019, 0x0005, 0x000B, 0x000A, 0x001D, 0x0027, 0x01CF, 0x0004,
3024 0x0038, 0x000E, 0x004C, 0x001F, 0x004D, 0x039B, 0x0012, 0x0072
3025 ], [
3026 0x0009, 0x004B, 0x0090, 0x0091, 0x0745, 0x1D11, 0x1D10, 0x0019,
3027 0x0E89, 0x0000, 0x000F, 0x0008, 0x0007, 0x000D, 0x000B, 0x0002,
3028 0x001C, 0x0003, 0x000A, 0x0005, 0x0018, 0x0010, 0x01D0, 0x0006,
3029 0x003B, 0x0011, 0x004A, 0x0049, 0x00E9, 0x03A3, 0x0013, 0x0075
3030 ], [
3031 0x0019, 0x0074, 0x001D, 0x00EA, 0x0073, 0x01CA, 0x0396, 0x001C,
3032 0x00E4, 0x0002, 0x0001, 0x0007, 0x0008, 0x000D, 0x0009, 0x001F,
3033 0x0018, 0x0000, 0x0006, 0x001E, 0x003B, 0x00EB, 0x0397, 0x000A,
3034 0x0002, 0x002C, 0x005B, 0x005A, 0x000F, 0x0038, 0x0017, 0x0006
3035 ], [
3036 0x001E, 0x006F, 0x00AE, 0x00AF, 0x0187, 0x061B, 0x0C35, 0x001A,
3037 0x030C, 0x0002, 0x0001, 0x0007, 0x0008, 0x000E, 0x0009, 0x001F,
3038 0x0014, 0x0000, 0x0001, 0x0019, 0x002A, 0x0060, 0x0C34, 0x000B,
3039 0x000D, 0x0036, 0x006E, 0x0056, 0x0031, 0x00C2, 0x0018, 0x0019
3040 ], [
3041 0x0001, 0x002C, 0x0005, 0x0015, 0x0008, 0x0097, 0x012D, 0x0017,
3042 0x004A, 0x0003, 0x0002, 0x0009, 0x000A, 0x000E, 0x0008, 0x001F,
3043 0x0007, 0x001E, 0x001B, 0x0004, 0x005A, 0x0024, 0x012C, 0x000C,
3044 0x0006, 0x0000, 0x0003, 0x005B, 0x0014, 0x0013, 0x001A, 0x000B
3045 ], [
3046 0x0004, 0x0000, 0x0017, 0x0063, 0x018B, 0x0310, 0x0C44, 0x0019,
3047 0x0623, 0x0004, 0x0003, 0x000A, 0x000B, 0x000D, 0x0003, 0x001C,
3048 0x0003, 0x000A, 0x0004, 0x0003, 0x018A, 0x188B, 0x188A, 0x000F,
3049 0x000B, 0x0002, 0x000A, 0x0002, 0x0016, 0x0189, 0x001D, 0x0030
3050 ], [
3051 0x000D, 0x0003, 0x0077, 0x000D, 0x0082, 0x020D, 0x0830, 0x0019,
3052 0x0419, 0x0003, 0x0002, 0x000A, 0x0009, 0x000B, 0x0002, 0x0011,
3053 0x0039, 0x0002, 0x0021, 0x0040, 0x1063, 0x20C5, 0x20C4, 0x000F,
3054 0x0018, 0x0007, 0x0038, 0x000C, 0x0076, 0x0107, 0x0000, 0x003A
3055 ], [
3056 0x000F, 0x001C, 0x0036, 0x0008, 0x0061, 0x0091, 0x0243, 0x0009,
3057 0x0120, 0x0005, 0x0003, 0x0008, 0x0005, 0x0001, 0x0013, 0x0031,
3058 0x0076, 0x0060, 0x0093, 0x0909, 0x0908, 0x090B, 0x090A, 0x0001,
3059 0x001A, 0x0019, 0x003A, 0x0025, 0x0077, 0x0092, 0x0000, 0x0037
3060 ], [
3061 0x001F, 0x0079, 0x00F1, 0x00F0, 0x011B, 0x0469, 0x0468, 0x003B,
3062 0x0022, 0x0005, 0x0004, 0x0007, 0x0005, 0x0006, 0x001C, 0x0001,
3063 0x0035, 0x003D, 0x003A, 0x0010, 0x0047, 0x008C, 0x0235, 0x0001,
3064 0x0001, 0x0019, 0x0000, 0x0030, 0x0009, 0x0031, 0x001B, 0x0034
3065 ], [
3066 0x0003, 0x001B, 0x00F3, 0x00FD, 0x03C9, 0x0F20, 0x1E42, 0x003D,
3067 0x00FC, 0x0006, 0x0004, 0x0002, 0x0000, 0x0001, 0x0017, 0x003E,
3068 0x001A, 0x0039, 0x002B, 0x0078, 0x01E5, 0x0791, 0x1E43, 0x0002,
3069 0x0007, 0x001D, 0x000C, 0x0038, 0x0014, 0x007F, 0x0016, 0x002A
3070 ], [
3071 0x0007, 0x0039, 0x0051, 0x0078, 0x03CB, 0x0F29, 0x1E51, 0x003D,
3072 0x00F3, 0x0006, 0x0004, 0x0002, 0x0000, 0x0001, 0x0017, 0x003E,
3073 0x007F, 0x002B, 0x007E, 0x0050, 0x01E4, 0x0795, 0x1E50, 0x0002,
3074 0x0006, 0x001D, 0x0006, 0x0038, 0x0007, 0x0029, 0x0016, 0x002A
3075 ], [
3076 0x0008, 0x003B, 0x001D, 0x0072, 0x01CC, 0x0734, 0x1CD5, 0x003A,
3077 0x001C, 0x0006, 0x0005, 0x0002, 0x0001, 0x0000, 0x0012, 0x003E,
3078 0x007F, 0x001E, 0x007E, 0x00E7, 0x039B, 0x0E6B, 0x1CD4, 0x0002,
3079 0x0006, 0x001E, 0x000E, 0x0038, 0x0006, 0x000F, 0x0013, 0x001F
3080 ], [
3081 0x000D, 0x003F, 0x0073, 0x000C, 0x00E4, 0x072B, 0x0E54, 0x003A,
3082 0x001A, 0x0005, 0x0004, 0x0002, 0x0001, 0x0000, 0x0007, 0x0038,
3083 0x0076, 0x0077, 0x001B, 0x01CB, 0x0394, 0x1CAB, 0x1CAA, 0x0002,
3084 0x0006, 0x001E, 0x000E, 0x003E, 0x0019, 0x001F, 0x0018, 0x001E
3085 ], [
3086 0x000E, 0x0007, 0x000C, 0x001C, 0x00BD, 0x02F3, 0x0BC9, 0x001F,
3087 0x00BF, 0x0006, 0x0004, 0x0002, 0x0001, 0x001E, 0x0001, 0x000D,
3088 0x003A, 0x003B, 0x00BE, 0x0178, 0x05E5, 0x1791, 0x1790, 0x0002,
3089 0x0006, 0x001F, 0x0016, 0x0000, 0x0015, 0x002E, 0x0014, 0x001E
3090 ], [
3091 0x0000, 0x001B, 0x0031, 0x003A, 0x0060, 0x006F, 0x01B9, 0x000E,
3092 0x001A, 0x0005, 0x0003, 0x0002, 0x001F, 0x001A, 0x0039, 0x000C,
3093 0x00C3, 0x00C2, 0x0036, 0x00DD, 0x0370, 0x06E3, 0x06E2, 0x0002,
3094 0x0008, 0x001E, 0x0019, 0x003B, 0x0012, 0x000F, 0x0013, 0x0038
3095 ], [
3096 0x0002, 0x0000, 0x0003, 0x001C, 0x0032, 0x001C, 0x0199, 0x0004,
3097 0x00CD, 0x0004, 0x0003, 0x001B, 0x001A, 0x003D, 0x0067, 0x003B,
3098 0x0198, 0x0075, 0x00E9, 0x03A1, 0x03A0, 0x03A3, 0x03A2, 0x0005,
3099 0x0002, 0x001F, 0x001D, 0x003C, 0x0018, 0x000F, 0x0006, 0x0005
3100 ]
3101 ];
3102 const VP40_AC_CAT0_BITS: [[u8; 32]; 16] = [
3103 [
3104 5, 7, 9, 9, 11, 13, 13, 5, 12, 3, 4, 4, 4, 4, 4, 4,
3105 5, 4, 4, 4, 5, 6, 9, 4, 6, 6, 7, 7, 7, 10, 5, 7
3106 ], [
3107 5, 7, 8, 8, 11, 13, 13, 5, 12, 3, 4, 4, 4, 4, 4, 4,
3108 5, 4, 4, 4, 5, 6, 9, 4, 6, 6, 7, 7, 8, 10, 5, 7
3109 ], [
3110 5, 7, 8, 8, 10, 12, 13, 5, 11, 3, 3, 4, 4, 4, 4, 5,
3111 5, 4, 4, 5, 6, 8, 13, 4, 5, 6, 7, 7, 7, 9, 5, 6
3112 ], [
3113 5, 7, 8, 8, 10, 12, 13, 5, 11, 3, 3, 4, 4, 4, 4, 5,
3114 5, 4, 4, 5, 6, 8, 13, 4, 5, 6, 7, 7, 7, 9, 5, 6
3115 ], [
3116 4, 6, 7, 7, 8, 12, 13, 5, 11, 3, 3, 4, 4, 4, 4, 5,
3117 5, 5, 5, 5, 7, 10, 13, 4, 5, 5, 6, 7, 7, 9, 5, 6
3118 ], [
3119 4, 5, 7, 7, 9, 10, 12, 5, 11, 3, 3, 4, 4, 4, 4, 5,
3120 5, 5, 5, 6, 9, 13, 13, 4, 5, 5, 6, 6, 7, 9, 5, 6
3121 ], [
3122 4, 5, 7, 6, 8, 10, 12, 5, 11, 3, 3, 4, 4, 4, 4, 5,
3123 6, 5, 6, 7, 13, 14, 14, 4, 5, 5, 6, 6, 7, 9, 4, 6
3124 ], [
3125 4, 5, 6, 5, 7, 8, 10, 5, 9, 3, 3, 4, 4, 4, 5, 6,
3126 7, 7, 8, 12, 12, 12, 12, 3, 5, 5, 6, 6, 7, 8, 4, 6
3127 ], [
3128 5, 7, 8, 8, 10, 12, 12, 6, 7, 3, 3, 4, 4, 4, 5, 5,
3129 6, 6, 6, 6, 8, 9, 11, 3, 4, 5, 5, 6, 5, 6, 5, 6
3130 ], [
3131 4, 6, 8, 8, 10, 12, 13, 6, 8, 3, 3, 4, 4, 4, 5, 6,
3132 6, 6, 6, 7, 9, 11, 13, 3, 4, 5, 5, 6, 5, 7, 5, 6
3133 ], [
3134 4, 6, 7, 7, 10, 12, 13, 6, 8, 3, 3, 4, 4, 4, 5, 6,
3135 7, 6, 7, 7, 9, 11, 13, 3, 4, 5, 5, 6, 5, 6, 5, 6
3136 ], [
3137 4, 6, 7, 7, 9, 11, 13, 6, 7, 3, 3, 4, 4, 4, 5, 6,
3138 7, 6, 7, 8, 10, 12, 13, 3, 4, 5, 5, 6, 5, 6, 5, 6
3139 ], [
3140 4, 6, 7, 6, 8, 11, 12, 6, 7, 3, 3, 4, 4, 4, 5, 6,
3141 7, 7, 7, 9, 10, 13, 13, 3, 4, 5, 5, 6, 5, 6, 5, 6
3142 ], [
3143 4, 5, 6, 6, 8, 10, 12, 6, 8, 3, 3, 4, 4, 5, 5, 6,
3144 7, 7, 8, 9, 11, 13, 13, 3, 4, 5, 5, 5, 5, 6, 5, 6
3145 ], [
3146 3, 5, 6, 6, 7, 9, 11, 6, 7, 3, 3, 4, 5, 5, 6, 6,
3147 8, 8, 8, 10, 12, 13, 13, 3, 4, 5, 5, 6, 5, 6, 5, 6
3148 ], [
3149 3, 4, 5, 5, 6, 7, 9, 6, 8, 3, 3, 5, 5, 6, 7, 8,
3150 9, 9, 10, 12, 12, 12, 12, 3, 4, 5, 5, 6, 5, 6, 5, 6
3151 ]
3152 ];
3153 const VP40_AC_CAT1_CODES: [[u32; 32]; 16] = [
3154 [
3155 0x0004, 0x00F5, 0x0182, 0x060F, 0x1839, 0x1838, 0x183B, 0x0013,
3156 0x00C0, 0x0003, 0x0002, 0x000B, 0x000A, 0x000E, 0x0008, 0x0001,
3157 0x0012, 0x001F, 0x0000, 0x0006, 0x007B, 0x0306, 0x183A, 0x000D,
3158 0x0007, 0x0031, 0x000A, 0x0061, 0x003C, 0x00F4, 0x0019, 0x000B
3159 ], [
3160 0x000A, 0x001A, 0x01D8, 0x03B3, 0x0ECA, 0x1D96, 0x3B2F, 0x0014,
3161 0x0036, 0x0004, 0x0003, 0x000C, 0x000B, 0x0000, 0x0004, 0x001C,
3162 0x0005, 0x0015, 0x0007, 0x0017, 0x0037, 0x0764, 0x3B2E, 0x000F,
3163 0x001A, 0x003A, 0x000C, 0x0077, 0x0004, 0x00ED, 0x001B, 0x0016
3164 ], [
3165 0x001A, 0x002D, 0x0058, 0x01F4, 0x07D4, 0x1F55, 0x1F54, 0x0014,
3166 0x0059, 0x0004, 0x0003, 0x000B, 0x000C, 0x000E, 0x0004, 0x0015,
3167 0x0005, 0x0007, 0x0004, 0x007C, 0x03EB, 0x1F57, 0x1F56, 0x0000,
3168 0x001B, 0x003F, 0x000D, 0x000C, 0x000A, 0x00FB, 0x001E, 0x0017
3169 ], [
3170 0x0000, 0x0075, 0x004A, 0x0097, 0x025B, 0x0969, 0x0968, 0x000B,
3171 0x00E8, 0x0005, 0x0004, 0x0007, 0x000C, 0x000D, 0x0001, 0x000A,
3172 0x0039, 0x003B, 0x0018, 0x00E9, 0x012C, 0x096B, 0x096A, 0x0001,
3173 0x001F, 0x0008, 0x0019, 0x0013, 0x000D, 0x0024, 0x001E, 0x0038
3174 ], [
3175 0x0004, 0x0014, 0x006E, 0x0057, 0x0159, 0x0562, 0x0AC7, 0x000B,
3176 0x006F, 0x0006, 0x0005, 0x0008, 0x0009, 0x0007, 0x001E, 0x0002,
3177 0x0007, 0x0006, 0x002A, 0x00AD, 0x0AC6, 0x0561, 0x0560, 0x0001,
3178 0x001F, 0x000C, 0x0039, 0x001A, 0x0000, 0x0036, 0x001D, 0x0038
3179 ], [
3180 0x0007, 0x001B, 0x000E, 0x000D, 0x03E1, 0x1F06, 0x3E0F, 0x0002,
3181 0x00F9, 0x0005, 0x0006, 0x0008, 0x0009, 0x0004, 0x000C, 0x001A,
3182 0x000F, 0x000C, 0x01F1, 0x07C0, 0x3E0E, 0x1F05, 0x1F04, 0x0001,
3183 0x0000, 0x001C, 0x003F, 0x003D, 0x0005, 0x007D, 0x001D, 0x003C
3184 ], [
3185 0x000F, 0x000A, 0x0071, 0x0006, 0x01C2, 0x0702, 0x1C0E, 0x0002,
3186 0x000E, 0x0005, 0x0004, 0x0006, 0x0007, 0x001D, 0x0017, 0x000F,
3187 0x01C3, 0x01C1, 0x0380, 0x381F, 0x381E, 0x1C0D, 0x1C0C, 0x0001,
3188 0x0004, 0x0018, 0x0001, 0x0000, 0x000D, 0x0016, 0x0019, 0x0039
3189 ], [
3190 0x0002, 0x001E, 0x003B, 0x000D, 0x0061, 0x01FA, 0x1FB5, 0x0031,
3191 0x00FC, 0x0004, 0x0005, 0x0001, 0x0007, 0x003A, 0x0060, 0x03F7,
3192 0x07EC, 0x1FB7, 0x3F6C, 0x7EDB, 0x7EDA, 0x3F69, 0x3F68, 0x0001,
3193 0x0000, 0x0019, 0x003E, 0x0039, 0x000D, 0x0038, 0x000C, 0x007F
3194 ], [
3195 0x001E, 0x0070, 0x0127, 0x0126, 0x0492, 0x124D, 0x124C, 0x0001,
3196 0x007F, 0x0006, 0x0005, 0x0005, 0x0004, 0x0001, 0x0007, 0x0025,
3197 0x0071, 0x007E, 0x0048, 0x0125, 0x0248, 0x124F, 0x124E, 0x0003,
3198 0x0008, 0x001D, 0x0006, 0x003E, 0x0002, 0x0000, 0x0013, 0x0039
3199 ], [
3200 0x0001, 0x0001, 0x00E7, 0x0091, 0x0240, 0x120D, 0x120C, 0x003C,
3201 0x0000, 0x0006, 0x0005, 0x0005, 0x0004, 0x001F, 0x0004, 0x0025,
3202 0x0072, 0x0049, 0x00E6, 0x0121, 0x0482, 0x120F, 0x120E, 0x0003,
3203 0x0008, 0x001D, 0x0005, 0x003D, 0x0003, 0x0001, 0x0013, 0x0038
3204 ], [
3205 0x0004, 0x000F, 0x00F4, 0x005B, 0x02D3, 0x0B4A, 0x1697, 0x003C,
3206 0x000E, 0x0006, 0x0005, 0x0002, 0x0001, 0x001D, 0x0000, 0x007B,
3207 0x002C, 0x00F5, 0x00B5, 0x0168, 0x1696, 0x0B49, 0x0B48, 0x0003,
3208 0x0009, 0x001F, 0x000A, 0x0001, 0x0008, 0x0006, 0x001C, 0x0017
3209 ], [
3210 0x0008, 0x0039, 0x001A, 0x0003, 0x00DB, 0x06D6, 0x0DAF, 0x003C,
3211 0x000C, 0x0006, 0x0005, 0x0002, 0x0001, 0x001D, 0x003D, 0x0000,
3212 0x0002, 0x0037, 0x006C, 0x01B4, 0x0DAE, 0x06D5, 0x06D4, 0x0002,
3213 0x0007, 0x001F, 0x0007, 0x0001, 0x0009, 0x000D, 0x000C, 0x0038
3214 ], [
3215 0x000F, 0x0004, 0x002F, 0x002E, 0x0054, 0x0555, 0x0554, 0x0016,
3216 0x000E, 0x0006, 0x0005, 0x0001, 0x0000, 0x0009, 0x000B, 0x0014,
3217 0x0057, 0x0056, 0x00AB, 0x0557, 0x0556, 0x02A9, 0x02A8, 0x0003,
3218 0x0008, 0x0013, 0x000A, 0x0008, 0x000E, 0x0012, 0x0006, 0x000F
3219 ], [
3220 0x0001, 0x000E, 0x0006, 0x0004, 0x00DA, 0x0DBE, 0x1B7E, 0x0007,
3221 0x001A, 0x0005, 0x0004, 0x001C, 0x001B, 0x003A, 0x0037, 0x006C,
3222 0x01B6, 0x036E, 0x0DBD, 0x36FF, 0x36FE, 0x1B79, 0x1B78, 0x0002,
3223 0x000C, 0x0000, 0x000F, 0x000C, 0x000F, 0x001A, 0x003B, 0x0005
3224 ], [
3225 0x0005, 0x001E, 0x003A, 0x003E, 0x00FC, 0x0FD7, 0x3F55, 0x0077,
3226 0x0030, 0x0003, 0x0004, 0x001A, 0x0019, 0x007F, 0x01FB, 0x03F4,
3227 0x0FD6, 0x1FA9, 0x3F54, 0x3F57, 0x3F56, 0x3F51, 0x3F50, 0x0001,
3228 0x0004, 0x001C, 0x000B, 0x000A, 0x0000, 0x001B, 0x0031, 0x0076
3229 ], [
3230 0x0005, 0x000C, 0x001B, 0x0008, 0x0038, 0x0015, 0x00A3, 0x00E6,
3231 0x0004, 0x0001, 0x0002, 0x0012, 0x0003, 0x000B, 0x0029, 0x00A0,
3232 0x0142, 0x0287, 0x0286, 0x0289, 0x0288, 0x028B, 0x028A, 0x000F,
3233 0x001D, 0x0013, 0x0001, 0x0000, 0x0003, 0x001A, 0x0072, 0x00E7
3234 ]
3235 ];
3236 const VP40_AC_CAT1_BITS: [[u8; 32]; 16] = [
3237 [
3238 5, 8, 9, 11, 13, 13, 13, 5, 8, 3, 3, 4, 4, 4, 4, 4,
3239 5, 5, 4, 5, 7, 10, 13, 4, 5, 6, 6, 7, 6, 8, 5, 6
3240 ], [
3241 5, 7, 9, 10, 12, 13, 14, 5, 8, 3, 3, 4, 4, 3, 4, 5,
3242 5, 5, 5, 6, 8, 11, 14, 4, 5, 6, 6, 7, 5, 8, 5, 6
3243 ], [
3244 5, 7, 8, 9, 11, 13, 13, 5, 8, 3, 3, 4, 4, 4, 4, 5,
3245 5, 5, 5, 7, 10, 13, 13, 3, 5, 6, 6, 6, 5, 8, 5, 6
3246 ], [
3247 4, 7, 8, 9, 11, 13, 13, 5, 8, 3, 3, 4, 4, 4, 4, 5,
3248 6, 6, 6, 8, 10, 13, 13, 3, 5, 5, 6, 6, 5, 7, 5, 6
3249 ], [
3250 4, 6, 8, 8, 10, 12, 13, 5, 8, 3, 3, 4, 4, 4, 5, 5,
3251 6, 6, 7, 9, 13, 12, 12, 3, 5, 5, 6, 6, 4, 7, 5, 6
3252 ], [
3253 4, 6, 7, 7, 10, 13, 14, 5, 8, 3, 3, 4, 4, 4, 5, 6,
3254 7, 7, 9, 11, 14, 13, 13, 3, 4, 5, 6, 6, 4, 7, 5, 6
3255 ], [
3256 4, 5, 7, 6, 9, 11, 13, 5, 7, 3, 3, 4, 4, 5, 6, 7,
3257 9, 9, 10, 14, 14, 13, 13, 3, 4, 5, 5, 5, 4, 6, 5, 6
3258 ], [
3259 3, 5, 6, 5, 7, 9, 13, 6, 8, 3, 3, 4, 4, 6, 7, 10,
3260 11, 13, 14, 15, 15, 14, 14, 3, 4, 5, 6, 6, 4, 6, 5, 7
3261 ], [
3262 5, 7, 9, 9, 11, 13, 13, 5, 7, 3, 3, 4, 4, 4, 5, 6,
3263 7, 7, 7, 9, 10, 13, 13, 3, 4, 5, 5, 6, 4, 5, 5, 6
3264 ], [
3265 4, 6, 8, 8, 10, 13, 13, 6, 6, 3, 3, 4, 4, 5, 5, 6,
3266 7, 7, 8, 9, 11, 13, 13, 3, 4, 5, 5, 6, 4, 5, 5, 6
3267 ], [
3268 4, 6, 8, 8, 11, 13, 14, 6, 6, 3, 3, 4, 4, 5, 5, 7,
3269 7, 8, 9, 10, 14, 13, 13, 3, 4, 5, 5, 5, 4, 5, 5, 6
3270 ], [
3271 4, 6, 7, 7, 10, 13, 14, 6, 6, 3, 3, 4, 4, 5, 6, 6,
3272 7, 8, 9, 11, 14, 13, 13, 3, 4, 5, 5, 5, 4, 5, 5, 6
3273 ], [
3274 4, 5, 7, 7, 9, 13, 13, 6, 6, 3, 3, 4, 4, 5, 6, 7,
3275 9, 9, 10, 13, 13, 12, 12, 3, 4, 5, 5, 5, 4, 5, 5, 6
3276 ], [
3277 3, 5, 6, 6, 9, 13, 14, 6, 6, 3, 3, 5, 5, 6, 7, 8,
3278 10, 11, 13, 15, 15, 14, 14, 3, 4, 4, 5, 5, 4, 5, 6, 6
3279 ], [
3280 3, 5, 6, 6, 8, 12, 14, 7, 6, 3, 3, 5, 5, 7, 9, 10,
3281 12, 13, 14, 14, 14, 14, 14, 3, 4, 5, 5, 5, 3, 5, 6, 7
3282 ], [
3283 3, 4, 5, 4, 6, 8, 11, 8, 6, 3, 3, 5, 5, 7, 9, 11,
3284 12, 13, 13, 13, 13, 13, 13, 4, 5, 5, 5, 5, 3, 5, 7, 8
3285 ]
3286 ];
3287 const VP40_AC_CAT2_CODES: [[u32; 32]; 16] = [
3288 [
3289 0x0009, 0x0015, 0x0028, 0x0052, 0x029A, 0x0537, 0x0536, 0x000A,
3290 0x0054, 0x0004, 0x0003, 0x000C, 0x000B, 0x000D, 0x0003, 0x0014,
3291 0x003A, 0x0004, 0x0038, 0x0055, 0x00A7, 0x0299, 0x0298, 0x0000,
3292 0x001E, 0x0008, 0x002B, 0x000B, 0x000B, 0x003B, 0x001F, 0x0039
3293 ], [
3294 0x001D, 0x002F, 0x0002, 0x0007, 0x0019, 0x0035, 0x0034, 0x0009,
3295 0x002E, 0x0006, 0x0005, 0x0009, 0x0008, 0x0007, 0x001F, 0x0008,
3296 0x0018, 0x0019, 0x0001, 0x0000, 0x0018, 0x0037, 0x0036, 0x0001,
3297 0x0001, 0x000A, 0x0039, 0x0016, 0x000D, 0x0001, 0x001E, 0x0038
3298 ], [
3299 0x0001, 0x0071, 0x00E0, 0x01C3, 0x0708, 0x1C26, 0x384F, 0x0001,
3300 0x0031, 0x0006, 0x0005, 0x0009, 0x0008, 0x0005, 0x000F, 0x0039,
3301 0x0077, 0x0076, 0x0030, 0x0385, 0x384E, 0x1C25, 0x1C24, 0x0001,
3302 0x0004, 0x000D, 0x0000, 0x0019, 0x001F, 0x000E, 0x001E, 0x003A
3303 ], [
3304 0x0006, 0x000C, 0x00D6, 0x007B, 0x01E8, 0x07A4, 0x0F4B, 0x0036,
3305 0x006A, 0x0007, 0x0005, 0x0008, 0x0009, 0x0001, 0x0007, 0x000D,
3306 0x003C, 0x00D7, 0x00F5, 0x07A7, 0x0F4A, 0x0F4D, 0x0F4C, 0x0002,
3307 0x0002, 0x000E, 0x0037, 0x0034, 0x0000, 0x0019, 0x0018, 0x001F
3308 ], [
3309 0x000A, 0x0027, 0x00BF, 0x00BE, 0x0224, 0x225D, 0x225C, 0x0026,
3310 0x005E, 0x0007, 0x0006, 0x0006, 0x0007, 0x0016, 0x002E, 0x0045,
3311 0x0088, 0x0113, 0x044A, 0x225F, 0x225E, 0x112D, 0x112C, 0x0002,
3312 0x0002, 0x0012, 0x0003, 0x0002, 0x0003, 0x0000, 0x0010, 0x0023
3313 ], [
3314 0x000F, 0x0006, 0x0075, 0x0074, 0x000A, 0x00BF, 0x00B9, 0x0022,
3315 0x0003, 0x0005, 0x0006, 0x0001, 0x0002, 0x0007, 0x0000, 0x0004,
3316 0x0016, 0x005E, 0x00B8, 0x00BB, 0x00BA, 0x017D, 0x017C, 0x0002,
3317 0x0006, 0x001C, 0x0010, 0x003B, 0x0009, 0x0007, 0x0001, 0x0023
3318 ], [
3319 0x0001, 0x001C, 0x0036, 0x003B, 0x00EA, 0x075B, 0x1D65, 0x0019,
3320 0x0074, 0x0004, 0x0005, 0x0000, 0x0001, 0x0037, 0x01D7, 0x075A,
3321 0x1D64, 0x1D67, 0x1D66, 0x1D61, 0x1D60, 0x1D63, 0x1D62, 0x0002,
3322 0x001F, 0x001A, 0x000D, 0x003D, 0x000C, 0x0007, 0x003C, 0x0018
3323 ], [
3324 0x0002, 0x0001, 0x0014, 0x0000, 0x002F, 0x00BB, 0x02E4, 0x007D,
3325 0x00BA, 0x0003, 0x0004, 0x0016, 0x001A, 0x00B8, 0x172E, 0x2E5F,
3326 0x2E5E, 0x1729, 0x1728, 0x172B, 0x172A, 0x172D, 0x172C, 0x0001,
3327 0x001E, 0x0015, 0x001B, 0x003F, 0x000C, 0x000E, 0x007C, 0x0173
3328 ], [
3329 0x0003, 0x007B, 0x0058, 0x01EA, 0x1EB1, 0x1EB0, 0x1EB3, 0x0013,
3330 0x0012, 0x0005, 0x0006, 0x0002, 0x0001, 0x0013, 0x003C, 0x002D,
3331 0x00F4, 0x0059, 0x03D7, 0x0F5B, 0x1EB2, 0x1EB5, 0x1EB4, 0x0003,
3332 0x000E, 0x001F, 0x0012, 0x0008, 0x0008, 0x0000, 0x000A, 0x0017
3333 ], [
3334 0x0008, 0x003C, 0x00F5, 0x00F4, 0x1EF7, 0x3DE9, 0x3DE8, 0x001C,
3335 0x000D, 0x0005, 0x0006, 0x0001, 0x0000, 0x0007, 0x000C, 0x00F6,
3336 0x01EE, 0x03DF, 0x07BC, 0x3DEB, 0x3DEA, 0x3DED, 0x3DEC, 0x0002,
3337 0x0009, 0x001F, 0x000F, 0x0005, 0x000E, 0x0006, 0x0004, 0x001D
3338 ], [
3339 0x0009, 0x0039, 0x0019, 0x0018, 0x0706, 0x383D, 0x383C, 0x000D,
3340 0x000F, 0x0005, 0x0006, 0x0000, 0x001D, 0x0003, 0x0071, 0x00E1,
3341 0x01C0, 0x0382, 0x1C1D, 0x383F, 0x383E, 0x3839, 0x3838, 0x0002,
3342 0x0008, 0x0002, 0x000D, 0x000C, 0x000F, 0x0007, 0x0002, 0x000E
3343 ], [
3344 0x0000, 0x0006, 0x0035, 0x0034, 0x0777, 0x1DD4, 0x3BAB, 0x000E,
3345 0x000F, 0x0005, 0x0004, 0x001C, 0x0019, 0x003A, 0x00EF, 0x01DC,
3346 0x0776, 0x0774, 0x3BAA, 0x3BAD, 0x3BAC, 0x3BAF, 0x3BAE, 0x0002,
3347 0x0007, 0x0002, 0x0018, 0x000C, 0x000F, 0x000D, 0x001B, 0x0076
3348 ], [
3349 0x0002, 0x0011, 0x0006, 0x004F, 0x0130, 0x1319, 0x1318, 0x004E,
3350 0x0007, 0x0006, 0x0005, 0x0010, 0x000D, 0x0005, 0x0099, 0x0262,
3351 0x098E, 0x131B, 0x131A, 0x263D, 0x263C, 0x263F, 0x263E, 0x0001,
3352 0x0007, 0x0000, 0x0012, 0x000C, 0x000E, 0x000F, 0x0004, 0x004D
3353 ], [
3354 0x0003, 0x0000, 0x0002, 0x0037, 0x01B7, 0x0DB5, 0x36DD, 0x006C,
3355 0x0016, 0x0005, 0x0004, 0x0003, 0x000A, 0x002E, 0x036C, 0x0DB4,
3356 0x36DC, 0x36DF, 0x36DE, 0x36D9, 0x36D8, 0x36DB, 0x36DA, 0x000E,
3357 0x0004, 0x001A, 0x0019, 0x0018, 0x000F, 0x0001, 0x002F, 0x00DA
3358 ], [
3359 0x0006, 0x0006, 0x000F, 0x0000, 0x0075, 0x03B8, 0x1DCA, 0x0074,
3360 0x0076, 0x0004, 0x0005, 0x0003, 0x0002, 0x01DE, 0x0EE6, 0x3B97,
3361 0x3B96, 0x3B9D, 0x3B9C, 0x3B9F, 0x3B9E, 0x1DC9, 0x1DC8, 0x0005,
3362 0x001C, 0x0009, 0x000E, 0x0008, 0x000F, 0x0001, 0x01DF, 0x01DD
3363 ], [
3364 0x0004, 0x000B, 0x001D, 0x000C, 0x0014, 0x00E0, 0x3875, 0x0386,
3365 0x01C2, 0x0000, 0x0001, 0x0071, 0x0072, 0x1C3F, 0x3874, 0x3877,
3366 0x3876, 0x3871, 0x3870, 0x3873, 0x3872, 0x3879, 0x3878, 0x003C,
3367 0x0073, 0x002A, 0x003D, 0x002B, 0x001F, 0x000D, 0x1C3E, 0x1C3D
3368 ]
3369 ];
3370 const VP40_AC_CAT2_BITS: [[u8; 32]; 16] = [
3371 [
3372 5, 7, 8, 9, 12, 13, 13, 5, 7, 3, 3, 4, 4, 4, 4, 5,
3373 6, 5, 6, 7, 10, 12, 12, 3, 5, 5, 6, 6, 5, 6, 5, 6
3374 ], [
3375 5, 7, 8, 9, 11, 12, 12, 5, 7, 3, 3, 4, 4, 4, 5, 5,
3376 6, 6, 6, 7, 11, 12, 12, 3, 4, 5, 6, 6, 5, 5, 5, 6
3377 ], [
3378 4, 7, 8, 9, 11, 13, 14, 5, 7, 3, 3, 4, 4, 4, 5, 6,
3379 7, 7, 7, 10, 14, 13, 13, 3, 4, 5, 5, 6, 5, 5, 5, 6
3380 ], [
3381 4, 6, 8, 8, 10, 12, 13, 6, 7, 3, 3, 4, 4, 4, 5, 6,
3382 7, 8, 9, 12, 13, 13, 13, 3, 4, 5, 6, 6, 4, 5, 5, 6
3383 ], [
3384 4, 6, 8, 8, 10, 14, 14, 6, 7, 3, 3, 4, 4, 5, 6, 7,
3385 8, 9, 11, 14, 14, 13, 13, 3, 4, 5, 5, 5, 4, 4, 5, 6
3386 ], [
3387 4, 5, 7, 7, 9, 13, 13, 6, 7, 3, 3, 4, 4, 5, 6, 8,
3388 10, 12, 13, 13, 13, 14, 14, 3, 4, 5, 5, 6, 4, 4, 5, 6
3389 ], [
3390 3, 5, 6, 6, 8, 11, 13, 6, 7, 3, 3, 4, 4, 6, 9, 11,
3391 13, 13, 13, 13, 13, 13, 13, 3, 5, 5, 5, 6, 4, 4, 6, 6
3392 ], [
3393 3, 4, 5, 4, 6, 8, 10, 7, 8, 3, 3, 5, 5, 8, 13, 14,
3394 14, 13, 13, 13, 13, 13, 13, 3, 5, 5, 5, 6, 4, 4, 7, 9
3395 ], [
3396 4, 7, 8, 9, 13, 13, 13, 6, 6, 3, 3, 4, 4, 5, 6, 7,
3397 8, 8, 10, 12, 13, 13, 13, 3, 4, 5, 5, 5, 4, 4, 5, 6
3398 ], [
3399 4, 6, 8, 8, 13, 14, 14, 6, 6, 3, 3, 4, 4, 5, 6, 8,
3400 9, 10, 11, 14, 14, 14, 14, 3, 4, 5, 5, 5, 4, 4, 5, 6
3401 ], [
3402 4, 6, 7, 7, 11, 14, 14, 6, 6, 3, 3, 4, 5, 5, 7, 8,
3403 9, 10, 13, 14, 14, 14, 14, 3, 4, 4, 5, 5, 4, 4, 5, 6
3404 ], [
3405 3, 5, 7, 7, 11, 13, 14, 6, 6, 3, 3, 5, 5, 6, 8, 9,
3406 11, 11, 14, 14, 14, 14, 14, 3, 4, 4, 5, 5, 4, 4, 6, 7
3407 ], [
3408 3, 5, 6, 7, 9, 13, 13, 7, 6, 3, 3, 5, 5, 6, 8, 10,
3409 12, 13, 13, 14, 14, 14, 14, 3, 4, 4, 5, 5, 4, 4, 6, 7
3410 ], [
3411 3, 4, 5, 6, 9, 12, 14, 7, 6, 3, 3, 5, 5, 7, 10, 12,
3412 14, 14, 14, 14, 14, 14, 14, 4, 4, 5, 5, 5, 4, 3, 7, 8
3413 ], [
3414 3, 4, 5, 4, 7, 10, 13, 7, 7, 3, 3, 5, 5, 9, 12, 14,
3415 14, 14, 14, 14, 14, 13, 13, 4, 5, 5, 5, 5, 4, 3, 9, 9
3416 ], [
3417 3, 4, 5, 4, 5, 8, 14, 10, 9, 2, 2, 7, 7, 13, 14, 14,
3418 14, 14, 14, 14, 14, 14, 14, 6, 7, 6, 6, 6, 5, 4, 13, 13
3419 ]
3420 ];
3421 const VP40_AC_CAT3_CODES: [[u32; 32]; 16] = [
3422 [
3423 0x0007, 0x000F, 0x00BB, 0x00BA, 0x05CF, 0x173A, 0x2E77, 0x0029,
3424 0x0172, 0x0007, 0x0006, 0x0009, 0x0008, 0x0001, 0x0005, 0x000D,
3425 0x001D, 0x001C, 0x00B8, 0x02E6, 0x2E76, 0x1739, 0x1738, 0x0002,
3426 0x0006, 0x0016, 0x0004, 0x0028, 0x0015, 0x000C, 0x0000, 0x002F
3427 ], [
3428 0x000B, 0x0002, 0x0054, 0x002F, 0x02AC, 0x156B, 0x1568, 0x0016,
3429 0x0154, 0x0007, 0x0006, 0x0004, 0x0003, 0x0013, 0x0028, 0x002E,
3430 0x0157, 0x0155, 0x055B, 0x2AD3, 0x2AD2, 0x2AD5, 0x2AD4, 0x0003,
3431 0x0008, 0x0000, 0x000A, 0x0003, 0x0002, 0x002B, 0x0012, 0x0029
3432 ], [
3433 0x000F, 0x0007, 0x0001, 0x0000, 0x01C4, 0x0703, 0x0E02, 0x0011,
3434 0x00E1, 0x0005, 0x0006, 0x0002, 0x0001, 0x0009, 0x0010, 0x00E3,
3435 0x01C5, 0x01C1, 0x0702, 0x1C07, 0x1C06, 0x0E01, 0x0E00, 0x0004,
3436 0x0007, 0x001D, 0x000D, 0x0001, 0x0005, 0x0006, 0x000C, 0x0039
3437 ], [
3438 0x0001, 0x001C, 0x0011, 0x0013, 0x0042, 0x0207, 0x0815, 0x0075,
3439 0x0041, 0x0005, 0x0006, 0x0000, 0x001F, 0x003B, 0x0074, 0x0043,
3440 0x0080, 0x0206, 0x0814, 0x0817, 0x0816, 0x0409, 0x0408, 0x0003,
3441 0x0009, 0x001E, 0x0011, 0x0003, 0x0005, 0x0010, 0x0002, 0x0012
3442 ], [
3443 0x0001, 0x001F, 0x0027, 0x0001, 0x004B, 0x0123, 0x0915, 0x0000,
3444 0x0049, 0x0005, 0x0006, 0x001D, 0x001C, 0x0013, 0x004A, 0x0090,
3445 0x0914, 0x0917, 0x0916, 0x0911, 0x0910, 0x0913, 0x0912, 0x0003,
3446 0x0005, 0x0001, 0x0012, 0x0008, 0x0008, 0x001E, 0x0026, 0x0001
3447 ], [
3448 0x0003, 0x0001, 0x003F, 0x000B, 0x004E, 0x0132, 0x099A, 0x004F,
3449 0x0098, 0x0006, 0x0005, 0x001D, 0x001C, 0x007C, 0x0267, 0x1331,
3450 0x1330, 0x1333, 0x1332, 0x266D, 0x266C, 0x266F, 0x266E, 0x0001,
3451 0x0004, 0x001E, 0x0012, 0x000A, 0x0008, 0x0000, 0x007D, 0x004D
3452 ], [
3453 0x0002, 0x0007, 0x0015, 0x0003, 0x0004, 0x00A7, 0x0536, 0x0028,
3454 0x029A, 0x0006, 0x0004, 0x001C, 0x0017, 0x00A4, 0x29BE, 0x537F,
3455 0x537E, 0x29B9, 0x29B8, 0x29BB, 0x29BA, 0x29BD, 0x29BC, 0x000F,
3456 0x0000, 0x0005, 0x0016, 0x001D, 0x0006, 0x0001, 0x00A5, 0x014C
3457 ], [
3458 0x0004, 0x0007, 0x001A, 0x000C, 0x0006, 0x0029, 0x01BD, 0x1BE3,
3459 0x1BE0, 0x0000, 0x0007, 0x006E, 0x01BC, 0x37C3, 0x37C2, 0x37CD,
3460 0x37CC, 0x37CF, 0x37CE, 0x37C9, 0x37C8, 0x37CB, 0x37CA, 0x0015,
3461 0x01BF, 0x037D, 0x0036, 0x0002, 0x000B, 0x0028, 0x37C5, 0x37C4
3462 ], [
3463 0x0001, 0x0009, 0x0003, 0x0002, 0x011F, 0x08E9, 0x08E8, 0x002D,
3464 0x0022, 0x0006, 0x0007, 0x0010, 0x0011, 0x0017, 0x002C, 0x0046,
3465 0x011E, 0x011C, 0x0477, 0x08EB, 0x08EA, 0x08ED, 0x08EC, 0x0003,
3466 0x000B, 0x0001, 0x0014, 0x000A, 0x0009, 0x0015, 0x0000, 0x0010
3467 ], [
3468 0x0001, 0x001D, 0x0022, 0x0013, 0x011E, 0x08FC, 0x23F5, 0x0023,
3469 0x0022, 0x0005, 0x0006, 0x0010, 0x000B, 0x0010, 0x008E, 0x023E,
3470 0x08FF, 0x11FD, 0x23F4, 0x23F7, 0x23F6, 0x23F9, 0x23F8, 0x0003,
3471 0x0009, 0x0000, 0x001C, 0x000A, 0x000F, 0x0001, 0x0012, 0x0046
3472 ], [
3473 0x0003, 0x001F, 0x003C, 0x003D, 0x0086, 0x0877, 0x10E8, 0x0041,
3474 0x0040, 0x0005, 0x0006, 0x0007, 0x0006, 0x0004, 0x010F, 0x021C,
3475 0x0875, 0x21D3, 0x21D2, 0x21D9, 0x21D8, 0x21DB, 0x21DA, 0x0002,
3476 0x0009, 0x0000, 0x0011, 0x0003, 0x000E, 0x0002, 0x0005, 0x0042
3477 ], [
3478 0x0004, 0x0001, 0x003D, 0x0009, 0x00F3, 0x0793, 0x1E45, 0x0000,
3479 0x0002, 0x0005, 0x0006, 0x0008, 0x0001, 0x0003, 0x01E5, 0x0792,
3480 0x1E44, 0x1E47, 0x1E46, 0x1E41, 0x1E40, 0x1E43, 0x1E42, 0x0001,
3481 0x0006, 0x001F, 0x000F, 0x000E, 0x000E, 0x0005, 0x0078, 0x0001
3482 ], [
3483 0x0004, 0x0005, 0x000E, 0x0017, 0x003E, 0x00F0, 0x0F1E, 0x007A,
3484 0x007F, 0x0006, 0x0007, 0x0005, 0x0004, 0x007B, 0x01E2, 0x1E3F,
3485 0x1E3E, 0x0F19, 0x0F18, 0x0F1B, 0x0F1A, 0x0F1D, 0x0F1C, 0x0000,
3486 0x0003, 0x0016, 0x0009, 0x0008, 0x000A, 0x0006, 0x007E, 0x0079
3487 ], [
3488 0x0005, 0x000C, 0x001A, 0x0004, 0x001A, 0x00DE, 0x0DF4, 0x00DD,
3489 0x006D, 0x0000, 0x0007, 0x0025, 0x0024, 0x00DC, 0x0DF7, 0x1BEB,
3490 0x1BEA, 0x0DF1, 0x0DF0, 0x0DF3, 0x0DF2, 0x1BED, 0x1BEC, 0x0008,
3491 0x0013, 0x000C, 0x0037, 0x0036, 0x0005, 0x0007, 0x006C, 0x01BF
3492 ], [
3493 0x0005, 0x000D, 0x001F, 0x000C, 0x003B, 0x0040, 0x041A, 0x0104,
3494 0x0107, 0x0001, 0x0000, 0x0024, 0x0021, 0x020B, 0x106E, 0x20DF,
3495 0x20DE, 0x1055, 0x1054, 0x1057, 0x1056, 0x106D, 0x106C, 0x0011,
3496 0x003A, 0x0025, 0x0038, 0x0039, 0x0013, 0x001E, 0x020C, 0x0414
3497 ], [
3498 0x0000, 0x0007, 0x000D, 0x0005, 0x0009, 0x0022, 0x0CD1, 0x0CD0,
3499 0x0CD3, 0x0003, 0x0002, 0x008D, 0x00CC, 0x066B, 0x0CD2, 0x19B5,
3500 0x19B4, 0x19B7, 0x19B6, 0x19B1, 0x19B0, 0x19B3, 0x19B2, 0x0047,
3501 0x008C, 0x0337, 0x0067, 0x0018, 0x0010, 0x0032, 0x0CD5, 0x0CD4
3502 ]
3503 ];
3504 const VP40_AC_CAT3_BITS: [[u8; 32]; 16] = [
3505 [
3506 4, 6, 8, 8, 11, 13, 14, 6, 9, 3, 3, 4, 4, 4, 5, 6,
3507 7, 7, 8, 10, 14, 13, 13, 3, 4, 5, 5, 6, 5, 6, 4, 6
3508 ], [
3509 4, 5, 7, 7, 10, 13, 13, 6, 9, 3, 3, 4, 4, 5, 6, 7,
3510 9, 9, 11, 14, 14, 14, 14, 3, 4, 4, 5, 5, 4, 6, 5, 6
3511 ], [
3512 4, 5, 6, 6, 9, 11, 12, 6, 8, 3, 3, 4, 4, 5, 6, 8,
3513 9, 9, 11, 13, 13, 12, 12, 3, 4, 5, 5, 5, 4, 5, 5, 6
3514 ], [
3515 3, 5, 6, 6, 8, 11, 13, 7, 8, 3, 3, 4, 5, 6, 7, 8,
3516 9, 11, 13, 13, 13, 12, 12, 3, 4, 5, 5, 5, 4, 5, 5, 6
3517 ], [
3518 3, 5, 6, 5, 8, 10, 13, 6, 8, 3, 3, 5, 5, 6, 8, 9,
3519 13, 13, 13, 13, 13, 13, 13, 3, 4, 4, 5, 5, 4, 5, 6, 6
3520 ], [
3521 3, 4, 6, 5, 7, 9, 12, 7, 8, 3, 3, 5, 5, 7, 10, 13,
3522 13, 13, 13, 14, 14, 14, 14, 3, 4, 5, 5, 5, 4, 4, 7, 7
3523 ], [
3524 3, 4, 5, 4, 5, 8, 11, 6, 10, 3, 3, 5, 5, 8, 14, 15,
3525 15, 14, 14, 14, 14, 14, 14, 4, 4, 5, 5, 5, 4, 4, 8, 9
3526 ], [
3527 3, 4, 5, 4, 4, 6, 9, 13, 13, 2, 3, 7, 9, 14, 14, 14,
3528 14, 14, 14, 14, 14, 14, 14, 5, 9, 10, 6, 3, 4, 6, 14, 14
3529 ], [
3530 3, 5, 6, 6, 10, 13, 13, 7, 7, 3, 3, 5, 5, 6, 7, 8,
3531 10, 10, 12, 13, 13, 13, 13, 3, 4, 4, 5, 5, 4, 5, 5, 6
3532 ], [
3533 3, 5, 6, 6, 9, 12, 14, 7, 7, 3, 3, 5, 5, 6, 8, 10,
3534 12, 13, 14, 14, 14, 14, 14, 3, 4, 4, 5, 5, 4, 4, 6, 7
3535 ], [
3536 3, 5, 6, 6, 8, 12, 13, 7, 7, 3, 3, 5, 5, 6, 9, 10,
3537 12, 14, 14, 14, 14, 14, 14, 3, 4, 4, 5, 5, 4, 4, 6, 7
3538 ], [
3539 3, 4, 6, 5, 8, 11, 13, 7, 7, 3, 3, 5, 5, 7, 9, 11,
3540 13, 13, 13, 13, 13, 13, 13, 3, 4, 5, 5, 5, 4, 4, 7, 7
3541 ], [
3542 3, 4, 5, 5, 7, 9, 13, 8, 8, 3, 3, 5, 5, 8, 10, 14,
3543 14, 13, 13, 13, 13, 13, 13, 3, 4, 5, 5, 5, 4, 4, 8, 8
3544 ], [
3545 3, 4, 5, 4, 6, 9, 13, 9, 8, 2, 3, 6, 6, 9, 13, 14,
3546 14, 13, 13, 13, 13, 14, 14, 4, 5, 5, 6, 6, 4, 4, 8, 10
3547 ], [
3548 3, 4, 5, 4, 6, 7, 11, 9, 9, 2, 2, 6, 6, 10, 13, 14,
3549 14, 13, 13, 13, 13, 13, 13, 5, 6, 6, 6, 6, 5, 5, 10, 11
3550 ], [
3551 2, 4, 5, 4, 5, 7, 13, 13, 13, 2, 2, 9, 9, 12, 13, 14,
3552 14, 14, 14, 14, 14, 14, 14, 8, 9, 11, 8, 6, 6, 7, 13, 13
3553 ]
3554 ];
3555
3556 const VP40_QMAT: &[i16; 64] = &[
3557 16, 17, 18, 20, 22, 24, 26, 28,
3558 17, 18, 20, 22, 24, 26, 28, 32,
3559 18, 20, 22, 24, 26, 28, 32, 36,
3560 20, 22, 24, 26, 28, 32, 36, 40,
3561 22, 24, 26, 28, 32, 36, 40, 44,
3562 24, 26, 28, 32, 36, 40, 44, 48,
3563 26, 28, 32, 36, 40, 44, 48, 52,
3564 28, 32, 36, 40, 44, 48, 52, 56
3565 ];
3566 const VP40_DC_Y_SCALES: [i16; 64] = [
3567 180, 180, 180, 180, 180, 180, 175, 170,
3568 165, 160, 157, 155, 152, 150, 147, 145,
3569 142, 140, 137, 135, 132, 130, 127, 125,
3570 122, 120, 117, 115, 112, 110, 107, 105,
3571 102, 100, 97, 95, 92, 90, 87, 85,
3572 82, 80, 77, 75, 72, 70, 67, 65,
3573 62, 60, 57, 55, 52, 50, 47, 45,
3574 42, 40, 37, 35, 32, 30, 27, 25
3575 ];
3576 const VP40_DC_C_SCALES: [i16; 64] = [
3577 150, 150, 150, 150, 150, 150, 150, 150,
3578 150, 150, 150, 150, 150, 150, 147, 145,
3579 142, 140, 137, 135, 132, 130, 127, 125,
3580 122, 120, 117, 115, 112, 110, 107, 105,
3581 102, 100, 97, 95, 92, 90, 87, 85,
3582 82, 80, 77, 75, 72, 70, 67, 65,
3583 62, 60, 57, 55, 52, 50, 47, 45,
3584 42, 40, 37, 35, 32, 30, 27, 25
3585 ];
3586 const VP40_AC_SCALES: [i16; 64] = [
3587 500, 475, 450, 430, 410, 390, 370, 350,
3588 330, 315, 300, 285, 270, 260, 250, 240,
3589 230, 220, 210, 200, 190, 185, 180, 170,
3590 160, 150, 143, 135, 128, 120, 113, 106,
3591 100, 94, 90, 85, 80, 75, 70, 66,
3592 62, 57, 52, 49, 45, 41, 38, 35,
3593 33, 30, 27, 24, 22, 20, 18, 16,
3594 14, 12, 10, 9, 7, 6, 4, 1
3595 ];
3596
3597 const VP40_MBPAT_CODES: [[u8; 14]; 2] = [
3598 [ 0b000, 0b1111, 0b1001, 0b010, 0b1101, 0b01110, 0b1011, 0b001, 0b01111, 0b1000, 0b0110, 0b1110, 0b1100, 0b1010 ],
3599 [ 0b0111, 0b1010, 0b1001, 0b1100, 0b1000, 0b01101, 0b000, 0b1110, 0b01100, 0b1101, 0b001, 0b1011, 0b1111, 0b010 ]
3600 ];
3601 const VP40_MBPAT_BITS: [[u8; 14]; 2] = [
3602 [ 3, 4, 4, 3, 4, 5, 4, 3, 5, 4, 4, 4, 4, 4 ],
3603 [ 4, 4, 4, 4, 4, 5, 3, 4, 5, 4, 3, 4, 4, 3 ]
3604 ];
3605 const VP40_BP_PREDICTOR: [u8; 15] = [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1 ];
3606 const VP40_MV_X_CODES: [[u32; 63]; 7] = [
3607 [
3608 0x06A, 0x11A, 0x18E, 0x237, 0x04A, 0x236, 0x07A, 0x0D6,
3609 0x07E, 0x1FD, 0x08C, 0x0D7, 0x087, 0x183, 0x03C, 0x061,
3610 0x047, 0x069, 0x040, 0x048, 0x049, 0x086, 0x013, 0x0D2,
3611 0x01C, 0x042, 0x025, 0x01B, 0x013, 0x005, 0x000, 0x007,
3612 0x005, 0x01B, 0x019, 0x019, 0x008, 0x045, 0x01D, 0x0C6,
3613 0x068, 0x090, 0x041, 0x04B, 0x031, 0x18F, 0x062, 0x03E,
3614 0x044, 0x068, 0x030, 0x182, 0x0C0, 0x1A7, 0x091, 0x092,
3615 0x07B, 0x0FF, 0x1A6, 0x1FC, 0x06A, 0x093, 0x06B
3616 ], [
3617 0x039, 0x259, 0x01B, 0x1D1, 0x137, 0x1D0, 0x01A, 0x1B5,
3618 0x01D, 0x4BC, 0x06C, 0x038, 0x071, 0x02D, 0x07D, 0x075,
3619 0x019, 0x0E9, 0x037, 0x015, 0x01E, 0x0DB, 0x04C, 0x070,
3620 0x00D, 0x00C, 0x027, 0x004, 0x002, 0x000, 0x005, 0x007,
3621 0x006, 0x002, 0x008, 0x024, 0x00C, 0x03B, 0x01E, 0x09A,
3622 0x00E, 0x069, 0x04A, 0x12D, 0x035, 0x0F9, 0x018, 0x07F,
3623 0x00F, 0x0F8, 0x07E, 0x25F, 0x068, 0x02C, 0x014, 0x258,
3624 0x136, 0x4BD, 0x12E, 0x1B4, 0x017, 0x039, 0x01F
3625 ], [
3626 0x029, 0x3CB, 0x1F5, 0x263, 0x1F4, 0x3DA, 0x050, 0x260,
3627 0x1EC, 0x3D3, 0x109, 0x3D2, 0x051, 0x792, 0x0F3, 0x09A,
3628 0x0F7, 0x132, 0x0C1, 0x1E8, 0x02A, 0x085, 0x061, 0x1F7,
3629 0x078, 0x0C7, 0x023, 0x07C, 0x012, 0x00B, 0x00E, 0x00D,
3630 0x000, 0x005, 0x003, 0x004, 0x019, 0x020, 0x03F, 0x043,
3631 0x062, 0x09F, 0x04E, 0x181, 0x02B, 0x137, 0x0F5, 0x089,
3632 0x0C6, 0x262, 0x088, 0x3C8, 0x1F6, 0x3CA, 0x09E, 0x261,
3633 0x136, 0x108, 0x133, 0x793, 0x180, 0x3DB, 0x045
3634 ], [
3635 0x001, 0x1C7, 0x067, 0x0B5, 0x066, 0x139, 0x099, 0x0B4,
3636 0x0C3, 0x130, 0x000, 0x131, 0x09E, 0x0B7, 0x02C, 0x001,
3637 0x028, 0x138, 0x04B, 0x031, 0x060, 0x091, 0x003, 0x09D,
3638 0x017, 0x04D, 0x031, 0x070, 0x007, 0x03A, 0x007, 0x002,
3639 0x00B, 0x001, 0x00F, 0x008, 0x00D, 0x004, 0x00A, 0x00D,
3640 0x019, 0x002, 0x03B, 0x04A, 0x015, 0x0C2, 0x018, 0x032,
3641 0x072, 0x1C6, 0x029, 0x1C5, 0x049, 0x121, 0x01B, 0x030,
3642 0x01A, 0x1C4, 0x09F, 0x0B6, 0x019, 0x120, 0x073
3643 ], [
3644 0x023, 0x1C8, 0x043, 0x110, 0x00C, 0x153, 0x022, 0x111,
3645 0x00F, 0x042, 0x023, 0x1C9, 0x02A, 0x01B, 0x073, 0x045,
3646 0x06E, 0x089, 0x06C, 0x01A, 0x06F, 0x0B6, 0x00B, 0x0E5,
3647 0x025, 0x020, 0x029, 0x04D, 0x002, 0x014, 0x01A, 0x017,
3648 0x01E, 0x027, 0x018, 0x028, 0x01F, 0x000, 0x006, 0x010,
3649 0x007, 0x00B, 0x003, 0x004, 0x01D, 0x02C, 0x019, 0x02B,
3650 0x009, 0x055, 0x038, 0x00E, 0x024, 0x0A8, 0x00A, 0x099,
3651 0x05A, 0x098, 0x06D, 0x152, 0x02B, 0x0B7, 0x001
3652 ], [
3653 0x03D, 0x0B1, 0x0DD, 0x1F6, 0x0C5, 0x188, 0x037, 0x03F,
3654 0x01E, 0x189, 0x00F, 0x03E, 0x06A, 0x1F7, 0x061, 0x079,
3655 0x018, 0x0B0, 0x00E, 0x0B3, 0x00C, 0x0DF, 0x006, 0x0DC,
3656 0x019, 0x0DE, 0x027, 0x00E, 0x01A, 0x063, 0x00F, 0x00E,
3657 0x014, 0x07C, 0x036, 0x06B, 0x03F, 0x060, 0x008, 0x074,
3658 0x009, 0x078, 0x012, 0x00D, 0x015, 0x02D, 0x002, 0x01C,
3659 0x005, 0x03B, 0x000, 0x034, 0x019, 0x026, 0x010, 0x075,
3660 0x002, 0x036, 0x023, 0x0B2, 0x022, 0x0FA, 0x017
3661 ], [
3662 0x015, 0x0DD, 0x03E, 0x16E, 0x04C, 0x012, 0x05D, 0x0B6,
3663 0x06F, 0x1F1, 0x069, 0x1F0, 0x01D, 0x16F, 0x002, 0x06B,
3664 0x00C, 0x0DC, 0x068, 0x09B, 0x07D, 0x09A, 0x00D, 0x013,
3665 0x008, 0x0F9, 0x02C, 0x012, 0x033, 0x04F, 0x00D, 0x005,
3666 0x012, 0x03F, 0x032, 0x013, 0x03B, 0x005, 0x02F, 0x05A,
3667 0x03F, 0x01C, 0x03A, 0x008, 0x036, 0x05C, 0x010, 0x000,
3668 0x00C, 0x04E, 0x003, 0x06A, 0x00E, 0x003, 0x014, 0x01E,
3669 0x01C, 0x00F, 0x018, 0x023, 0x01E, 0x022, 0x002
3670 ]
3671 ];
3672 const VP40_MV_X_BITS: [[u8; 63]; 7] = [
3673 [
3674 7, 9, 9, 10, 8, 10, 8, 9, 8, 10, 8, 9, 8, 9, 7, 7,
3675 7, 8, 7, 8, 7, 8, 6, 8, 6, 7, 6, 6, 5, 4, 2, 3,
3676 3, 5, 5, 6, 5, 7, 6, 8, 7, 8, 7, 8, 7, 9, 7, 7,
3677 7, 8, 7, 9, 8, 9, 8, 9, 8, 9, 9, 10, 8, 9, 7
3678 ], [
3679 7, 10, 8, 10, 9, 10, 8, 10, 8, 11, 8, 9, 8, 9, 8, 8,
3680 7, 9, 7, 8, 7, 9, 7, 8, 6, 7, 6, 6, 4, 4, 3, 3,
3681 3, 3, 4, 6, 5, 7, 6, 8, 6, 8, 7, 9, 7, 9, 7, 8,
3682 7, 9, 8, 10, 8, 9, 8, 10, 9, 11, 9, 10, 8, 9, 7
3683 ], [
3684 7, 10, 9, 10, 9, 10, 8, 10, 9, 10, 9, 10, 8, 11, 8, 8,
3685 8, 9, 8, 9, 7, 8, 7, 9, 7, 8, 6, 7, 5, 5, 4, 4,
3686 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 7, 9, 7, 9, 8, 8,
3687 8, 10, 8, 10, 9, 10, 8, 10, 9, 9, 9, 11, 9, 10, 7
3688 ], [
3689 6, 9, 8, 9, 8, 9, 8, 9, 8, 9, 7, 9, 8, 9, 7, 7,
3690 7, 9, 7, 8, 7, 8, 6, 8, 6, 7, 6, 7, 5, 6, 4, 4,
3691 4, 4, 4, 4, 4, 4, 4, 5, 5, 6, 6, 7, 6, 8, 6, 7,
3692 7, 9, 7, 9, 7, 9, 7, 8, 7, 9, 8, 9, 7, 9, 7
3693 ], [
3694 6, 9, 8, 9, 7, 9, 7, 9, 7, 8, 7, 9, 7, 8, 7, 7,
3695 7, 8, 7, 8, 7, 8, 6, 8, 6, 7, 6, 7, 5, 6, 5, 5,
3696 5, 6, 5, 6, 5, 5, 4, 5, 4, 5, 4, 5, 5, 6, 5, 6,
3697 5, 7, 6, 7, 6, 8, 6, 8, 7, 8, 7, 9, 7, 8, 5
3698 ], [
3699 6, 8, 8, 9, 8, 9, 7, 8, 7, 9, 7, 8, 7, 9, 7, 7,
3700 6, 8, 6, 8, 6, 8, 6, 8, 6, 8, 6, 7, 6, 7, 5, 5,
3701 5, 7, 6, 7, 6, 7, 5, 7, 5, 7, 5, 6, 5, 6, 4, 5,
3702 4, 6, 4, 6, 5, 6, 5, 7, 5, 7, 6, 8, 6, 8, 5
3703 ], [
3704 5, 8, 7, 9, 7, 8, 7, 8, 7, 9, 7, 9, 7, 9, 6, 7,
3705 6, 8, 7, 8, 7, 8, 6, 8, 6, 8, 6, 7, 6, 7, 5, 5,
3706 5, 7, 6, 7, 6, 6, 6, 7, 6, 7, 6, 7, 6, 7, 5, 5,
3707 5, 7, 5, 7, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 3
3708 ]
3709 ];
3710 const VP40_MV_Y_CODES: [[u32; 63]; 7] = [
3711 [
3712 0x052, 0x14C, 0x1FA, 0x124, 0x082, 0x29E, 0x08E, 0x24B,
3713 0x09C, 0x3F7, 0x086, 0x114, 0x083, 0x3A5, 0x0FA, 0x04F,
3714 0x0FB, 0x13B, 0x0FC, 0x172, 0x044, 0x173, 0x051, 0x087,
3715 0x05F, 0x0BA, 0x026, 0x05E, 0x016, 0x015, 0x006, 0x001,
3716 0x000, 0x01C, 0x01E, 0x075, 0x03B, 0x0FF, 0x025, 0x0BB,
3717 0x07C, 0x08B, 0x048, 0x171, 0x042, 0x14E, 0x046, 0x0FE,
3718 0x040, 0x13A, 0x093, 0x115, 0x08F, 0x3F6, 0x170, 0x29F,
3719 0x1D1, 0x24A, 0x1D3, 0x3A4, 0x1D0, 0x14D, 0x050
3720 ], [
3721 0x0DE, 0x223, 0x136, 0x7C5, 0x12F, 0x4A1, 0x3D7, 0x7AC,
3722 0x133, 0x7C4, 0x1B8, 0x222, 0x096, 0x251, 0x095, 0x1F0,
3723 0x0DA, 0x110, 0x09A, 0x360, 0x0DD, 0x12E, 0x048, 0x092,
3724 0x078, 0x098, 0x027, 0x045, 0x01A, 0x010, 0x005, 0x000,
3725 0x001, 0x00E, 0x00C, 0x023, 0x03F, 0x0F4, 0x07D, 0x089,
3726 0x07B, 0x1BE, 0x0F9, 0x3E3, 0x0F3, 0x127, 0x0DB, 0x1EA,
3727 0x0D9, 0x6E7, 0x1BF, 0x4A0, 0x1B1, 0x6E6, 0x137, 0x7AD,
3728 0x126, 0x6C2, 0x132, 0x6C3, 0x129, 0x372, 0x0F2
3729 ], [
3730 0x016, 0x09C, 0x13C, 0x09E, 0x12B, 0x0BA, 0x181, 0x317,
3731 0x084, 0x04E, 0x026, 0x316, 0x180, 0x05C, 0x0C1, 0x02F,
3732 0x010, 0x045, 0x012, 0x189, 0x024, 0x13D, 0x066, 0x023,
3733 0x067, 0x0C6, 0x024, 0x04B, 0x011, 0x032, 0x00D, 0x000,
3734 0x007, 0x005, 0x003, 0x003, 0x005, 0x020, 0x008, 0x025,
3735 0x026, 0x04F, 0x061, 0x02B, 0x04E, 0x18A, 0x043, 0x09F,
3736 0x014, 0x254, 0x094, 0x310, 0x085, 0x311, 0x02A, 0x0BB,
3737 0x18F, 0x255, 0x09D, 0x09F, 0x18E, 0x044, 0x026
3738 ], [
3739 0x061, 0x12A, 0x00D, 0x3BD, 0x089, 0x109, 0x18E, 0x210,
3740 0x1D3, 0x211, 0x088, 0x019, 0x085, 0x018, 0x0E8, 0x0CE,
3741 0x040, 0x119, 0x045, 0x1D2, 0x04B, 0x1DD, 0x062, 0x094,
3742 0x075, 0x00C, 0x027, 0x00D, 0x002, 0x026, 0x006, 0x01E,
3743 0x00D, 0x01F, 0x001, 0x00A, 0x002, 0x007, 0x00B, 0x000,
3744 0x01C, 0x076, 0x032, 0x007, 0x024, 0x0C0, 0x007, 0x041,
3745 0x002, 0x18F, 0x047, 0x1DC, 0x043, 0x12B, 0x0CF, 0x118,
3746 0x0C6, 0x3BC, 0x08D, 0x3BF, 0x0C1, 0x3BE, 0x066
3747 ], [
3748 0x007, 0x14D, 0x0A0, 0x09E, 0x0CF, 0x39C, 0x0A1, 0x39D,
3749 0x0AB, 0x1C5, 0x026, 0x14C, 0x025, 0x19C, 0x03F, 0x0E1,
3750 0x066, 0x1CF, 0x03E, 0x1C4, 0x072, 0x04E, 0x006, 0x0AA,
3751 0x01C, 0x0E6, 0x032, 0x051, 0x03B, 0x005, 0x01F, 0x018,
3752 0x002, 0x03A, 0x000, 0x036, 0x005, 0x008, 0x008, 0x016,
3753 0x009, 0x00D, 0x003, 0x02F, 0x01E, 0x02E, 0x01A, 0x02B,
3754 0x00C, 0x024, 0x01E, 0x0E0, 0x004, 0x0A7, 0x054, 0x1C7,
3755 0x052, 0x19D, 0x03A, 0x09F, 0x03B, 0x1C6, 0x037
3756 ], [
3757 0x02A, 0x039, 0x025, 0x115, 0x024, 0x1FA, 0x02F, 0x114,
3758 0x075, 0x038, 0x0FC, 0x036, 0x01E, 0x1FB, 0x07F, 0x068,
3759 0x016, 0x037, 0x01F, 0x05C, 0x013, 0x08B, 0x001, 0x0FB,
3760 0x021, 0x044, 0x02B, 0x06B, 0x03B, 0x00C, 0x01C, 0x019,
3761 0x001, 0x020, 0x016, 0x07C, 0x00C, 0x074, 0x00A, 0x01C,
3762 0x012, 0x069, 0x00F, 0x06A, 0x014, 0x011, 0x01E, 0x017,
3763 0x002, 0x031, 0x01B, 0x030, 0x00D, 0x000, 0x001, 0x01D,
3764 0x023, 0x01A, 0x01D, 0x05D, 0x010, 0x0FA, 0x013
3765 ], [
3766 0x012, 0x026, 0x041, 0x022, 0x01A, 0x0A9, 0x04C, 0x1B2,
3767 0x05C, 0x0A8, 0x058, 0x1B3, 0x040, 0x079, 0x00C, 0x055,
3768 0x01F, 0x0D8, 0x076, 0x023, 0x05F, 0x078, 0x00B, 0x01B,
3769 0x02D, 0x010, 0x037, 0x06D, 0x032, 0x00A, 0x01A, 0x01E,
3770 0x01F, 0x02B, 0x00D, 0x077, 0x031, 0x05D, 0x038, 0x027,
3771 0x00C, 0x0E9, 0x033, 0x05E, 0x030, 0x04D, 0x00A, 0x021,
3772 0x007, 0x03D, 0x039, 0x0E8, 0x00B, 0x059, 0x014, 0x027,
3773 0x011, 0x075, 0x00E, 0x009, 0x008, 0x012, 0x000
3774 ]
3775 ];
3776 const VP40_MV_Y_BITS: [[u8; 63]; 7] = [
3777 [
3778 7, 9, 9, 9, 8, 10, 8, 10, 8, 10, 8, 9, 8, 10, 8, 7,
3779 8, 9, 8, 9, 7, 9, 7, 8, 7, 8, 6, 7, 5, 5, 3, 2,
3780 2, 5, 5, 7, 6, 8, 6, 8, 7, 8, 7, 9, 7, 9, 7, 8,
3781 7, 9, 8, 9, 8, 10, 9, 10, 9, 10, 9, 10, 9, 9, 7
3782 ], [
3783 8, 10, 9, 11, 9, 11, 10, 11, 9, 11, 9, 10, 8, 10, 8, 9,
3784 8, 9, 8, 10, 8, 9, 7, 8, 7, 8, 6, 7, 5, 5, 3, 2,
3785 2, 4, 4, 6, 6, 8, 7, 8, 7, 9, 8, 10, 8, 9, 8, 9,
3786 8, 11, 9, 11, 9, 11, 9, 11, 9, 11, 9, 11, 9, 10, 8
3787 ], [
3788 7, 9, 9, 10, 9, 10, 9, 10, 8, 9, 8, 10, 9, 9, 8, 8,
3789 7, 9, 7, 9, 7, 9, 7, 8, 7, 8, 6, 7, 5, 6, 4, 3,
3790 3, 3, 3, 4, 4, 6, 5, 7, 6, 8, 7, 8, 7, 9, 7, 8,
3791 7, 10, 8, 10, 8, 10, 8, 10, 9, 10, 9, 10, 9, 9, 7
3792 ], [
3793 7, 9, 8, 10, 8, 9, 9, 10, 9, 10, 8, 9, 8, 9, 8, 8,
3794 7, 9, 7, 9, 7, 9, 7, 8, 7, 7, 6, 7, 5, 6, 4, 5,
3795 4, 5, 3, 4, 3, 4, 4, 5, 5, 7, 6, 7, 6, 8, 6, 7,
3796 6, 9, 7, 9, 7, 9, 8, 9, 8, 10, 8, 10, 8, 10, 7
3797 ], [
3798 6, 9, 8, 9, 8, 10, 8, 10, 8, 9, 7, 9, 7, 9, 7, 8,
3799 7, 9, 7, 9, 7, 8, 6, 8, 6, 8, 6, 7, 6, 6, 5, 5,
3800 4, 6, 4, 6, 4, 5, 4, 5, 4, 5, 4, 6, 5, 6, 5, 6,
3801 5, 7, 6, 8, 6, 8, 7, 9, 7, 9, 7, 9, 7, 9, 6
3802 ], [
3803 6, 8, 7, 9, 7, 9, 7, 9, 7, 8, 8, 8, 7, 9, 7, 7,
3804 6, 8, 7, 8, 6, 8, 6, 8, 6, 7, 6, 7, 6, 6, 5, 5,
3805 4, 6, 5, 7, 5, 7, 5, 6, 5, 7, 5, 7, 5, 6, 5, 5,
3806 4, 6, 5, 6, 5, 6, 5, 7, 6, 7, 6, 8, 6, 8, 5
3807 ], [
3808 5, 7, 7, 8, 7, 8, 7, 9, 7, 8, 7, 9, 7, 8, 6, 7,
3809 6, 8, 7, 8, 7, 8, 6, 7, 6, 7, 6, 7, 6, 6, 5, 5,
3810 5, 6, 5, 7, 6, 7, 6, 7, 5, 8, 6, 7, 6, 7, 5, 6,
3811 5, 7, 6, 8, 5, 7, 5, 6, 5, 7, 5, 6, 5, 6, 3
3812 ]
3813 ];
3814
3815 const VP40_LOOP_STRENGTH: [i16; 64] = [
3816 30, 25, 20, 20, 15, 15, 14, 14,
3817 13, 13, 12, 12, 11, 11, 10, 10,
3818 9, 9, 8, 8, 7, 7, 7, 7,
3819 6, 6, 6, 6, 5, 5, 5, 5,
3820 4, 4, 4, 4, 3, 3, 3, 3,
3821 2, 2, 2, 2, 2, 2, 2, 2,
3822 2, 2, 2, 2, 2, 2, 2, 2,
3823 1, 1, 1, 1, 1, 1, 1, 1
3824 ];
3825 const VP40_MV_LUT_INDEX: [usize; 32] = [
3826 0, 1, 2, 2, 3, 3, 3, 3,
3827 4, 4, 4, 4, 4, 4, 4, 4,
3828 5, 5, 5, 5, 5, 5, 5, 5,
3829 6, 6, 6, 6, 6, 6, 6, 6
3830 ];