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