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