796fbf6f75b1e8973c077b7b4f9e941c0ddc1aa2
[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 }
102
103 enum Codes {
104 None,
105 VP30(VP30Codes),
106 VP31(VP31Codes),
107 }
108
109 #[derive(Clone)]
110 struct Block {
111 btype: VPMBType,
112 coeffs: [i16; 64],
113 has_ac: bool,
114 idx: usize,
115 mv: MV,
116 coded: bool,
117 }
118
119 impl Block {
120 fn new() -> Self {
121 Self {
122 btype: VPMBType::Intra,
123 coeffs: [0; 64],
124 has_ac: false,
125 idx: 0,
126 mv: ZERO_MV,
127 coded: false,
128 }
129 }
130 }
131
132 type ReadRunFunc = fn (&mut BitReader) -> DecoderResult<usize>;
133
134 const VP31_LONG_RUN_BASE: [usize; 7] = [ 1, 2, 4, 6, 10, 18, 34 ];
135 const VP31_LONG_RUN_BITS: [u8; 7] = [ 0, 1, 1, 2, 3, 4, 12 ];
136 fn read_long_run(br: &mut BitReader) -> DecoderResult<usize> {
137 let pfx = br.read_code(UintCodeType::LimitedUnary(6, 0))? as usize;
138 if pfx == 0 { return Ok(1); }
139 Ok(VP31_LONG_RUN_BASE[pfx] + (br.read(VP31_LONG_RUN_BITS[pfx])? as usize))
140 }
141
142 const VP31_SHORT_RUN_BASE: [usize; 6] = [ 1, 3, 5, 7, 11, 15 ];
143 const VP31_SHORT_RUN_BITS: [u8; 6] = [ 1, 1, 1, 2, 2, 4 ];
144 fn read_short_run(br: &mut BitReader) -> DecoderResult<usize> {
145 let pfx = br.read_code(UintCodeType::LimitedUnary(5, 0))? as usize;
146 Ok(VP31_SHORT_RUN_BASE[pfx] + (br.read(VP31_SHORT_RUN_BITS[pfx])? as usize))
147 }
148
149 struct BitRunDecoder {
150 value: bool,
151 run: usize,
152 read_run: ReadRunFunc,
153 }
154
155 impl BitRunDecoder {
156 fn new(br: &mut BitReader, read_run: ReadRunFunc) -> DecoderResult<Self> {
157 let value = !br.read_bool()?; // it will be flipped before run decoding
158 Ok(Self { value, run: 0, read_run })
159 }
160 fn get_val(&mut self, br: &mut BitReader) -> DecoderResult<bool> {
161 if self.run == 0 {
162 self.value = !self.value;
163 self.run = (self.read_run)(br)?;
164 }
165 self.run -= 1;
166 Ok(self.value)
167 }
168 }
169
170 const VP30_NE0_BITS: [u8; 5] = [ 2, 2, 3, 4, 8 ];
171 const VP30_NE0_BASE: [usize; 5] = [ 1, 5, 9, 17, 33 ];
172 fn vp30_read_ne_run0(br: &mut BitReader) -> DecoderResult<usize> {
173 let len = br.read_code(UintCodeType::LimitedUnary(4, 0))? as usize;
174 Ok(VP30_NE0_BASE[len] + (br.read(VP30_NE0_BITS[len])? as usize))
175 }
176 fn vp30_read_ne_run1(br: &mut BitReader) -> DecoderResult<usize> {
177 let len = br.read_code(UintCodeType::LimitedUnary(6, 0))? as usize;
178 if len == 0 {
179 Ok((br.read(1)? as usize) + 1)
180 } else if len < 6 {
181 Ok(len + 2)
182 } else {
183 Ok((br.read(8)? as usize) + 8)
184 }
185 }
186 fn vp30_read_coded_run0(br: &mut BitReader) -> DecoderResult<usize> {
187 let len = br.read_code(UintCodeType::LimitedUnary(5, 0))? as usize;
188 Ok(len + 1)
189 }
190 /*
191 0 - 1
192 11 - 2
193 1000 - 3
194 1010 - 4
195 10011 - 5
196 10111 - 6
197 10010 - 7 + get_bits(3)
198 101100 - 15 + get_bits(5)
199 1011010 - 47 + get_bits(8)
200 1011011 - 303 + get_bits(16)
201 */
202 const VP30_CRUN1_LUT: [u8; 32] = [
203 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
204 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
205 0x34, 0x34, 0x75, 0x55, 0x44, 0x44, 0x85, 0x65,
206 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22
207 ];
208 fn vp30_read_coded_run1(br: &mut BitReader) -> DecoderResult<usize> {
209 let idx = br.peek(5) as usize;
210 let sym = (VP30_CRUN1_LUT[idx] >> 4) as usize;
211 let bits = VP30_CRUN1_LUT[idx] & 0xF;
212 br.skip(bits as u32)?;
213 if sym < 7 {
214 Ok(sym)
215 } else if sym == 7 {
216 Ok(7 + (br.read(3)? as usize))
217 } else {
218 let len = br.read_code(UintCodeType::Unary012)?;
219 match len {
220 0 => Ok(15 + (br.read(5)? as usize)),
221 1 => Ok(47 + (br.read(8)? as usize)),
222 _ => Ok(303 + (br.read(16)? as usize)),
223 }
224 }
225 }
226
227 struct VP34Decoder {
228 info: NACodecInfoRef,
229 width: usize,
230 height: usize,
231 mb_w: usize,
232 mb_h: usize,
233 version: u8,
234 is_intra: bool,
235 quant: usize,
236 shuf: VPShuffler,
237 codes: Codes,
238 loop_str: i16,
239
240 blocks: Vec<Block>,
241 mb_coded: Vec<bool>,
242 y_blocks: usize,
243 y_sbs: usize,
244 qmat_y: [i16; 64],
245 qmat_c: [i16; 64],
246 qmat_inter: [i16; 64],
247
248 eob_run: usize,
249 last_dc: [i16; 3],
250
251 blk_addr: Vec<usize>,
252 sb_info: Vec<SBState>,
253 sb_blocks: Vec<u8>,
254 sb_mbs: Vec<u8>,
255 mb_blocks: Vec<u8>,
256 }
257
258 fn vp30_read_mv_comp(br: &mut BitReader) -> DecoderResult<i16> {
259 let mode = br.read(2)?;
260 if mode == 0 { return Ok(0); }
261 let sign = br.read_bool()?;
262 let val = match mode - 1 {
263 0 => 1,
264 1 => 2 + (br.read(2)? as i16),
265 _ => br.read(5)? as i16,
266 };
267 if !sign {
268 Ok(val)
269 } else {
270 Ok(-val)
271 }
272 }
273
274 fn vp30_read_mv(br: &mut BitReader) -> DecoderResult<MV> {
275 let x = vp30_read_mv_comp(br)?;
276 let y = vp30_read_mv_comp(br)?;
277 Ok(MV{ x, y })
278 }
279
280 fn read_mv_comp_packed(br: &mut BitReader) -> DecoderResult<i16> {
281 let code = br.read(3)?;
282 match code {
283 0 => Ok(0),
284 1 => Ok(1),
285 2 => Ok(-1),
286 3 => if br.read_bool()? { Ok(-2) } else { Ok(2) },
287 4 => if br.read_bool()? { Ok(-3) } else { Ok(3) },
288 5 => {
289 let val = (br.read(2)? as i16) + 4;
290 if br.read_bool()? {
291 Ok(-val)
292 } else {
293 Ok(val)
294 }
295 },
296 6 => {
297 let val = (br.read(3)? as i16) + 8;
298 if br.read_bool()? {
299 Ok(-val)
300 } else {
301 Ok(val)
302 }
303 },
304 _ => {
305 let val = (br.read(4)? as i16) + 16;
306 if br.read_bool()? {
307 Ok(-val)
308 } else {
309 Ok(val)
310 }
311 },
312 }
313 }
314
315 fn read_mv_packed(br: &mut BitReader) -> DecoderResult<MV> {
316 let x = read_mv_comp_packed(br)?;
317 let y = read_mv_comp_packed(br)?;
318 Ok(MV{ x, y })
319 }
320
321 fn read_mv_comp_raw(br: &mut BitReader) -> DecoderResult<i16> {
322 let val = br.read(5)? as i16;
323 if br.read_bool()? {
324 Ok(-val)
325 } else {
326 Ok(val)
327 }
328 }
329
330 fn read_mv_raw(br: &mut BitReader) -> DecoderResult<MV> {
331 let x = read_mv_comp_raw(br)?;
332 let y = read_mv_comp_raw(br)?;
333 Ok(MV{ x, y })
334 }
335
336 fn rescale_qmat(dst_qmat: &mut [i16; 64], base_qmat: &[i16; 64], dc_quant: i16, ac_quant: i16, minval: i16) {
337 for (dst, src) in dst_qmat.iter_mut().zip(base_qmat.iter()) {
338 *dst = (src.wrapping_mul(ac_quant) / 100).max(minval) << 2;
339 }
340 dst_qmat[0] = (base_qmat[0] * dc_quant / 100).max(minval * 2) << 2;
341 }
342
343 fn expand_token(blk: &mut Block, br: &mut BitReader, eob_run: &mut usize, coef_no: usize, token: u8) -> DecoderResult<()> {
344 match token {
345 // EOBs
346 0 | 1 | 2 => { *eob_run = (token as usize) + 1; },
347 3 | 4 | 5 => {
348 let bits = token - 1;
349 *eob_run = (br.read(bits)? as usize) + (1 << bits);
350 },
351 6 => { *eob_run = br.read(12)? as usize; },
352 // zero runs
353 7 | 8 => {
354 let bits = if token == 7 { 3 } else { 6 };
355 let run = (br.read(bits)? as usize) + 1;
356 blk.idx += run;
357 validate!(blk.idx <= 64);
358 },
359 // single coefficients
360 9 | 10 | 11 | 12 => {
361 let val = (i16::from(token) - 7) >> 1;
362 if (token & 1) == 1 {
363 blk.coeffs[ZIGZAG[blk.idx]] = val;
364 } else {
365 blk.coeffs[ZIGZAG[blk.idx]] = -val;
366 }
367 blk.idx += 1;
368 },
369 13 | 14 | 15 | 16 => {
370 let val = i16::from(token) - 10;
371 if !br.read_bool()? {
372 blk.coeffs[ZIGZAG[blk.idx]] = val;
373 } else {
374 blk.coeffs[ZIGZAG[blk.idx]] = -val;
375 }
376 blk.idx += 1;
377 },
378 17 | 18 | 19 | 20 | 21 | 22 => {
379 let add_bits = if token == 22 { 9 } else { token - 16 };
380 let sign = br.read_bool()?;
381 let val = (br.read(add_bits)? as i16) + VP3_LITERAL_BASE[(token - 17) as usize];
382 if !sign {
383 blk.coeffs[ZIGZAG[blk.idx]] = val;
384 } else {
385 blk.coeffs[ZIGZAG[blk.idx]] = -val;
386 }
387 blk.idx += 1;
388 }
389 // zero run plus coefficient
390 23 | 24 | 25 | 26 | 27 => {
391 blk.idx += (token - 22) as usize;
392 validate!(blk.idx < 64);
393 if !br.read_bool()? {
394 blk.coeffs[ZIGZAG[blk.idx]] = 1;
395 } else {
396 blk.coeffs[ZIGZAG[blk.idx]] = -1;
397 }
398 blk.idx += 1;
399 },
400 28 | 29 => {
401 let run_bits = token - 26;
402 if token == 28 {
403 blk.idx += 6;
404 } else {
405 blk.idx += 10;
406 }
407 let sign = br.read_bool()?;
408 blk.idx += br.read(run_bits)? as usize;
409 validate!(blk.idx < 64);
410 if !sign {
411 blk.coeffs[ZIGZAG[blk.idx]] = 1;
412 } else {
413 blk.coeffs[ZIGZAG[blk.idx]] = -1;
414 }
415 blk.idx += 1;
416 },
417 30 => {
418 blk.idx += 1;
419 validate!(blk.idx < 64);
420 let sign = br.read_bool()?;
421 let val = (br.read(1)? as i16) + 2;
422 if !sign {
423 blk.coeffs[ZIGZAG[blk.idx]] = val;
424 } else {
425 blk.coeffs[ZIGZAG[blk.idx]] = -val;
426 }
427 blk.idx += 1;
428 },
429 _ => {
430 let sign = br.read_bool()?;
431 let val = (br.read(1)? as i16) + 2;
432 blk.idx += (br.read(1)? as usize) + 2;
433 validate!(blk.idx < 64);
434 if !sign {
435 blk.coeffs[ZIGZAG[blk.idx]] = val;
436 } else {
437 blk.coeffs[ZIGZAG[blk.idx]] = -val;
438 }
439 blk.idx += 1;
440 },
441 };
442 if *eob_run > 0 {
443 blk.idx = 64;
444 *eob_run -= 1;
445 } else if coef_no > 0 {
446 blk.has_ac = true;
447 }
448 Ok(())
449 }
450
451 macro_rules! fill_dc_pred {
452 ($self: expr, $ref_id: expr, $pred: expr, $pp: expr, $bit: expr, $idx: expr) => {
453 if $self.blocks[$idx].coded && $self.blocks[$idx].btype.get_ref_id() == $ref_id {
454 $pred[$bit] = $self.blocks[$idx].coeffs[0] as i32;
455 $pp |= 1 << $bit;
456 }
457 };
458 }
459
460 fn vp3_interp00(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
461 {
462 let mut didx = 0;
463 let mut sidx = 0;
464 for _ in 0..bh {
465 for x in 0..bw { dst[didx + x] = src[sidx + x]; }
466 didx += dstride;
467 sidx += sstride;
468 }
469 }
470
471 fn vp3_interp01(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
472 {
473 let mut didx = 0;
474 let mut sidx = 0;
475 for _ in 0..bh {
476 for x in 0..bw { dst[didx + x] = (((src[sidx + x] as u16) + (src[sidx + x + 1] as u16)) >> 1) as u8; }
477 didx += dstride;
478 sidx += sstride;
479 }
480 }
481
482 fn vp3_interp10(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
483 {
484 let mut didx = 0;
485 let mut sidx = 0;
486 for _ in 0..bh {
487 for x in 0..bw { dst[didx + x] = (((src[sidx + x] as u16) + (src[sidx + x + sstride] as u16)) >> 1) as u8; }
488 didx += dstride;
489 sidx += sstride;
490 }
491 }
492
493 fn vp3_interp11(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
494 {
495 let mut didx = 0;
496 let mut sidx = 0;
497 for _ in 0..bh {
498 for x in 0..bw {
499 dst[didx + x] = (((src[sidx + x] as u16) +
500 (src[sidx + x + 1] as u16) +
501 (src[sidx + x + sstride] as u16) +
502 (src[sidx + x + sstride + 1] as u16)) >> 2) as u8;
503 }
504 didx += dstride;
505 sidx += sstride;
506 }
507 }
508
509 fn vp31_loop_filter(data: &mut [u8], mut off: usize, step: usize, stride: usize, loop_str: i16) {
510 for _ in 0..8 {
511 let a = data[off - step * 2] as i16;
512 let b = data[off - step] as i16;
513 let c = data[off] as i16;
514 let d = data[off + step] as i16;
515 let mut diff = ((a - d) + 3 * (c - b) + 4) >> 3;
516 if diff.abs() >= 2 * loop_str {
517 diff = 0;
518 } else if diff.abs() >= loop_str {
519 if diff < 0 {
520 diff = -diff - 2 * loop_str;
521 } else {
522 diff = -diff + 2 * loop_str;
523 }
524 }
525 if diff != 0 {
526 data[off - step] = (b + diff).max(0).min(255) as u8;
527 data[off] = (c - diff).max(0).min(255) as u8;
528 }
529
530 off += stride;
531 }
532 }
533
534 fn vp31_loop_filter_v(frm: &mut NASimpleVideoFrame<u8>, x: usize, y: usize, plane: usize, loop_str: i16) {
535 let off = frm.offset[plane] + x + y * frm.stride[plane];
536 vp31_loop_filter(frm.data, off, 1, frm.stride[plane], loop_str);
537 }
538
539 fn vp31_loop_filter_h(frm: &mut NASimpleVideoFrame<u8>, x: usize, y: usize, plane: usize, loop_str: i16) {
540 let off = frm.offset[plane] + x + y * frm.stride[plane];
541 vp31_loop_filter(frm.data, off, frm.stride[plane], 1, loop_str);
542 }
543
544 pub const VP3_INTERP_FUNCS: &[blockdsp::BlkInterpFunc] = &[ vp3_interp00, vp3_interp01, vp3_interp10, vp3_interp11 ];
545
546 impl VP34Decoder {
547 fn new(version: u8) -> Self {
548 Self {
549 info: NACodecInfoRef::default(),
550 width: 0,
551 height: 0,
552 mb_w: 0,
553 mb_h: 0,
554 version,
555 is_intra: true,
556 quant: 0,
557 shuf: VPShuffler::new(),
558 codes: Codes::None,
559 loop_str: 0,
560
561 blocks: Vec::new(),
562 mb_coded: Vec::new(),
563 y_blocks: 0,
564 y_sbs: 0,
565
566 qmat_y: [0; 64],
567 qmat_c: [0; 64],
568 qmat_inter: [0; 64],
569
570 eob_run: 0,
571 last_dc: [0; 3],
572
573 blk_addr: Vec::new(),
574 sb_info: Vec::new(),
575 sb_blocks: Vec::new(),
576 sb_mbs: Vec::new(),
577 mb_blocks: Vec::new(),
578 }
579 }
580 fn parse_header(&mut self, br: &mut BitReader) -> DecoderResult<()> {
581 self.is_intra = !br.read_bool()?;
582 br.skip(1)?;
583 self.quant = br.read(6)? as usize;
584 self.loop_str = VP31_LOOP_STRENGTH[self.quant];
585 if self.is_intra {
586 if br.peek(8) != 0 {
587 validate!(self.version == 3 || self.version == 30);
588 let mb_w = br.read(8)? as usize;
589 let mb_h = br.read(8)? as usize;
590 println!(" VP30 {}x{} ({}x{})", mb_w, mb_h, self.mb_w, self.mb_h);
591 validate!(mb_w == self.mb_w && mb_h == self.mb_h);
592 if self.version == 3 {
593 self.version = 30;
594 self.codes = Codes::VP30(VP30Codes::new());
595 }
596 } else {
597 let version = br.read(13)?;
598 println!("intra, ver {} (self {})", version, self.version);
599 let coding_type = br.read(1)?;
600 validate!(coding_type == 0);
601 br.skip(2)?;
602 if version == 1 {
603 validate!(self.version == 3 || self.version == 31);
604 if self.version == 3 {
605 self.version = 31;
606 self.codes = Codes::VP31(VP31Codes::new());
607 }
608 } else if version == 2 {
609 validate!(self.version == 4);
610 unimplemented!();
611 } else {
612 return Err(DecoderError::InvalidData);
613 }
614 }
615 }
616 //println!("decode frame({},{},{})", self.is_intra as u8, self.is_intra as u8, self.quant);
617 Ok(())
618 }
619 fn vp30_unpack_sb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
620 let mut has_nonempty = false;
621 {
622 let mut bit = !br.read_bool()?;
623 let mut run = 0;
624 for sb in self.sb_info.iter_mut() {
625 if run == 0 {
626 bit = !bit;
627 run = if bit { vp30_read_ne_run1(br)? } else { vp30_read_ne_run0(br)? };
628 }
629 *sb = if bit { has_nonempty = true; SBState::Partial } else { SBState::Uncoded };
630 run -= 1;
631 }
632 validate!(run == 0);
633 }
634 if has_nonempty {
635 for el in self.mb_coded.iter_mut() { *el = false; }
636 let mut bit = !br.read_bool()?;
637 let mut run = 0;
638 let mut mbiter = self.mb_coded.iter_mut();
639 for (sb, nmb) in self.sb_info.iter_mut().zip(self.sb_mbs.iter()) {
640 let nmbs = *nmb as usize;
641 if *sb == SBState::Partial {
642 for _ in 0..nmbs {
643 if run == 0 {
644 bit = !bit;
645 run = if bit { vp30_read_coded_run1(br)? } else { vp30_read_coded_run0(br)? };
646 }
647 run -= 1;
648 *mbiter.next().unwrap() = bit;
649 }
650 } else {
651 for _ in 0..nmbs {
652 mbiter.next().unwrap();
653 }
654 }
655 }
656 validate!(run == 0);
657 let mut bit = !br.read_bool()?;
658 let mut run = 0;
659 let mut cur_blk = 0;
660 for (coded, nblk) in self.mb_coded.iter().zip(self.mb_blocks.iter()) {
661 let nblks = *nblk as usize;
662 if *coded {
663 let mut cb = [false; 4];
664 for j in 0..nblks {
665 if run == 0 {
666 bit = !bit;
667 run = if bit { vp30_read_coded_run1(br)? } else { vp30_read_coded_run0(br)? };
668 }
669 run -= 1;
670 cb[j] = bit;
671 }
672 for j in 0..nblks {
673 let addr = self.blk_addr[cur_blk + j] >> 2;
674 self.blocks[addr].coded = cb[j];
675 }
676 }
677 cur_blk += nblks;
678 }
679 validate!(run == 0);
680 }
681 Ok(())
682 }
683 fn vp30_unpack_mb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
684 let mut cur_blk = 0;
685 if let Codes::VP30(ref codes) = self.codes {
686 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()).take(self.y_sbs) {
687 let nblks = *nblk as usize;
688 if *sb == SBState::Uncoded {
689 for _ in 0..nblks {
690 self.blocks[self.blk_addr[cur_blk] >> 2].btype = VPMBType::InterNoMV;
691 cur_blk += 1;
692 }
693 } else {
694 for _ in 0..nblks/4 {
695 let mut coded = *sb == SBState::Coded;
696 if !coded {
697 for blk in 0..4 {
698 if self.blocks[self.blk_addr[cur_blk + blk] >> 2].coded {
699 coded = true;
700 break;
701 }
702 }
703 }
704 let mode = if !coded {
705 VPMBType::InterNoMV
706 } else {
707 br.read_cb(&codes.mbtype_cb)?
708 };
709 for _ in 0..4 {
710 self.blocks[self.blk_addr[cur_blk] >> 2].btype = mode;
711 cur_blk += 1;
712 }
713 }
714 }
715 }
716 } else {
717 return Err(DecoderError::Bug);
718 }
719 // replicate types for chroma
720 let mut off_y = 0;
721 let mut off_u = self.y_blocks;
722 let mut off_v = off_u + self.mb_w * self.mb_h;
723 for _blk_y in 0..self.mb_h {
724 for blk_x in 0..self.mb_w {
725 let btype = self.blocks[off_y + blk_x * 2].btype;
726 self.blocks[off_u + blk_x].btype = btype;
727 self.blocks[off_v + blk_x].btype = btype;
728 }
729 off_y += self.mb_w * 2 * 2;
730 off_u += self.mb_w;
731 off_v += self.mb_w;
732 }
733 Ok(())
734 }
735 fn vp30_unpack_mv_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
736 let mut last_mv = ZERO_MV;
737
738 let mut cur_blk = 0;
739 for _ in 0..self.y_blocks/4 {
740 let baddr = self.blk_addr[cur_blk] >> 2;
741 if self.blocks[baddr].btype == VPMBType::InterFourMV {
742 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);
743 for i in 0..4 {
744 let blk = &mut self.blocks[saddr + (i & 1) + (i & 2) * self.mb_w];
745 if blk.coded {
746 blk.mv = vp30_read_mv(br)?;
747 }
748 cur_blk += 1;
749 }
750 } else {
751 let cur_mv;
752 match self.blocks[baddr].btype {
753 VPMBType::Intra | VPMBType::InterNoMV | VPMBType::GoldenNoMV => {
754 cur_mv = ZERO_MV;
755 },
756 VPMBType::InterMV => {
757 cur_mv = vp30_read_mv(br)?;
758 last_mv = cur_mv;
759 },
760 VPMBType::InterNearest => {
761 cur_mv = last_mv;
762 },
763 _ => { // GoldenMV
764 cur_mv = vp30_read_mv(br)?;
765 },
766 };
767 for _ in 0..4 {
768 self.blocks[self.blk_addr[cur_blk] >> 2].mv = cur_mv;
769 cur_blk += 1;
770 }
771 }
772 }
773 Ok(())
774 }
775 fn vp30_unpack_coeffs(&mut self, br: &mut BitReader, coef_no: usize, table: usize) -> DecoderResult<()> {
776 if let Codes::VP30(ref codes) = self.codes {
777 for blkaddr in self.blk_addr.iter() {
778 let blk: &mut Block = &mut self.blocks[blkaddr >> 2];
779 if !blk.coded || blk.idx != coef_no { continue; }
780 if self.eob_run > 0 {
781 blk.idx = 64;
782 self.eob_run -= 1;
783 continue;
784 }
785 let cb = if coef_no == 0 {
786 &codes.dc_cb[table]
787 } else if blk.btype.is_intra() {
788 &codes.ac_i_cb[table]
789 } else {
790 &codes.ac_p_cb[table]
791 };
792 let token = br.read_cb(cb)?;
793 expand_token(blk, br, &mut self.eob_run, coef_no, token)?;
794 }
795 Ok(())
796 } else {
797 Err(DecoderError::Bug)
798 }
799 }
800 fn vp31_unpack_sb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
801 let mut has_uncoded = false;
802 let mut has_partial = false;
803 {
804 let mut brun = BitRunDecoder::new(br, read_long_run)?;
805 for sb in self.sb_info.iter_mut() {
806 if brun.get_val(br)? {
807 *sb = SBState::Partial;
808 has_partial = true;
809 } else {
810 *sb = SBState::Uncoded;
811 has_uncoded = true;
812 }
813 }
814 }
815 if has_uncoded {
816 let mut brun = BitRunDecoder::new(br, read_long_run)?;
817 let mut cur_blk = 0;
818 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()) {
819 let nblks = *nblk as usize;
820 if *sb != SBState::Partial && brun.get_val(br)? {
821 *sb = SBState::Coded;
822 for _ in 0..nblks {
823 let blk_idx = self.blk_addr[cur_blk] >> 2;
824 self.blocks[blk_idx].coded = true;
825 cur_blk += 1;
826 }
827 } else {
828 for _ in 0..nblks {
829 let blk_idx = self.blk_addr[cur_blk] >> 2;
830 self.blocks[blk_idx].coded = false;
831 cur_blk += 1;
832 }
833 }
834 }
835 }
836 if has_partial {
837 let mut brun = BitRunDecoder::new(br, read_short_run)?;
838 let mut cur_blk = 0;
839 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()) {
840 let nblks = *nblk as usize;
841 if *sb == SBState::Partial {
842 for _ in 0..nblks {
843 let blk_idx = self.blk_addr[cur_blk] >> 2;
844 self.blocks[blk_idx].coded = brun.get_val(br)?;
845 cur_blk += 1;
846 }
847 } else {
848 cur_blk += nblks;
849 }
850 }
851 }
852 Ok(())
853 }
854 fn vp31_unpack_mb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
855 let mut modes = [VPMBType::InterNoMV; 8];
856 let alphabet = br.read(3)? as usize;
857 let raw_modes = alphabet >= 7;
858 if alphabet == 0 {
859 for mode in VP31_DEFAULT_MB_MODES.iter() {
860 modes[br.read(3)? as usize] = *mode;
861 }
862 } else if alphabet < 7 {
863 modes.copy_from_slice(&VP31_MB_MODES[alphabet - 1]);
864 }
865
866 let mut cur_blk = 0;
867 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()).take(self.y_sbs) {
868 let nblks = *nblk as usize;
869 if *sb == SBState::Uncoded {
870 for _ in 0..nblks {
871 self.blocks[self.blk_addr[cur_blk] >> 2].btype = VPMBType::InterNoMV;
872 cur_blk += 1;
873 }
874 } else {
875 for _ in 0..nblks/4 {
876 let mut coded = *sb == SBState::Coded;
877 if !coded {
878 for blk in 0..4 {
879 if self.blocks[self.blk_addr[cur_blk + blk] >> 2].coded {
880 coded = true;
881 break;
882 }
883 }
884 }
885 let mode = if !coded {
886 VPMBType::InterNoMV
887 } else if !raw_modes {
888 let code = br.read_code(UintCodeType::LimitedUnary(7, 0))?;
889 modes[code as usize]
890 } else {
891 VP31_DEFAULT_MB_MODES[br.read(3)? as usize]
892 };
893 for _ in 0..4 {
894 self.blocks[self.blk_addr[cur_blk] >> 2].btype = mode;
895 cur_blk += 1;
896 }
897 }
898 }
899 }
900 // replicate types for chroma
901 let mut off_y = 0;
902 let mut off_u = self.y_blocks;
903 let mut off_v = off_u + self.mb_w * self.mb_h;
904 for _blk_y in 0..self.mb_h {
905 for blk_x in 0..self.mb_w {
906 let btype = self.blocks[off_y + blk_x * 2].btype;
907 self.blocks[off_u + blk_x].btype = btype;
908 self.blocks[off_v + blk_x].btype = btype;
909 }
910 off_y += self.mb_w * 2 * 2;
911 off_u += self.mb_w;
912 off_v += self.mb_w;
913 }
914 Ok(())
915 }
916 fn vp31_unpack_mv_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
917 let mut last_mv = ZERO_MV;
918 let mut last2_mv = ZERO_MV;
919 let read_mv = if br.read_bool()? { read_mv_raw } else { read_mv_packed };
920
921 let mut cur_blk = 0;
922 for _ in 0..self.y_blocks/4 {
923 if self.blocks[self.blk_addr[cur_blk] >> 2].btype == VPMBType::InterFourMV {
924 for _ in 0..4 {
925 let blk = &mut self.blocks[self.blk_addr[cur_blk] >> 2];
926 if blk.coded {
927 blk.mv = (read_mv)(br)?;
928 last2_mv = last_mv;
929 last_mv = blk.mv;
930 }
931 cur_blk += 1;
932 }
933 } else {
934 let cur_mv;
935 match self.blocks[self.blk_addr[cur_blk] >> 2].btype {
936 VPMBType::Intra | VPMBType::InterNoMV | VPMBType::GoldenNoMV => {
937 cur_mv = ZERO_MV;
938 },
939 VPMBType::InterMV => {
940 cur_mv = (read_mv)(br)?;
941 last2_mv = last_mv;
942 last_mv = cur_mv;
943 },
944 VPMBType::InterNearest => {
945 cur_mv = last_mv;
946 },
947 VPMBType::InterNear => {
948 cur_mv = last2_mv;
949 std::mem::swap(&mut last_mv, &mut last2_mv);
950 },
951 _ => { // GoldenMV
952 cur_mv = (read_mv)(br)?;
953 },
954 };
955 for _ in 0..4 {
956 self.blocks[self.blk_addr[cur_blk] >> 2].mv = cur_mv;
957 cur_blk += 1;
958 }
959 }
960 }
961 Ok(())
962 }
963 fn vp31_unpack_coeffs(&mut self, br: &mut BitReader, coef_no: usize, table_y: usize, table_c: usize) -> DecoderResult<()> {
964 if let Codes::VP31(ref codes) = self.codes {
965 let cbs = if coef_no == 0 {
966 [&codes.dc_cb[table_y], &codes.dc_cb[table_c]]
967 } else if coef_no < 6 {
968 [&codes.ac0_cb[table_y], &codes.ac0_cb[table_c]]
969 } else if coef_no < 15 {
970 [&codes.ac1_cb[table_y], &codes.ac1_cb[table_c]]
971 } else if coef_no < 28 {
972 [&codes.ac2_cb[table_y], &codes.ac2_cb[table_c]]
973 } else {
974 [&codes.ac3_cb[table_y], &codes.ac3_cb[table_c]]
975 };
976 for blkaddr in self.blk_addr.iter() {
977 let blk: &mut Block = &mut self.blocks[blkaddr >> 2];
978 if !blk.coded || blk.idx != coef_no { continue; }
979 if self.eob_run > 0 {
980 blk.idx = 64;
981 self.eob_run -= 1;
982 continue;
983 }
984 let cb = if (blkaddr & 3) == 0 { cbs[0] } else { cbs[1] };
985 let token = br.read_cb(cb)?;
986 expand_token(blk, br, &mut self.eob_run, coef_no, token)?;
987 }
988 Ok(())
989 } else {
990 Err(DecoderError::Bug)
991 }
992 }
993 fn decode_vp30(&mut self, br: &mut BitReader, frm: &mut NASimpleVideoFrame<u8>) -> DecoderResult<()> {
994 for blk in self.blocks.iter_mut() {
995 blk.coeffs = [0; 64];
996 blk.idx = 0;
997 blk.coded = false;
998 blk.has_ac = false;
999 }
1000 if self.is_intra {
1001 for sb in self.sb_info.iter_mut() { *sb = SBState::Coded; }
1002 for blk in self.blocks.iter_mut() {
1003 blk.btype = VPMBType::Intra;
1004 blk.coded = true;
1005 }
1006 } else {
1007 if self.shuf.get_last().is_none() || self.shuf.get_golden().is_none() {
1008 return Err(DecoderError::MissingReference);
1009 }
1010 self.vp30_unpack_sb_info(br)?;
1011 self.vp30_unpack_mb_info(br)?;
1012 self.vp30_unpack_mv_info(br)?;
1013 }
1014 let dc_quant = VP30_DC_SCALES[self.quant] * 10;
1015 let ac_quant = VP30_AC_SCALES[self.quant];
1016 rescale_qmat(&mut self.qmat_y, VP3_QMAT_Y, dc_quant, ac_quant, 2);
1017 rescale_qmat(&mut self.qmat_c, VP3_QMAT_C, dc_quant, ac_quant, 2);
1018 rescale_qmat(&mut self.qmat_inter, VP3_QMAT_INTER, dc_quant, ac_quant, 4);
1019 if self.quant == 10 {
1020 self.qmat_y[29] = 980;
1021 self.qmat_y[58] = 1636;
1022 self.qmat_y[59] = 1964;
1023 } else if self.quant == 31 {
1024 self.qmat_y[58] = 456;
1025 } else if self.quant == 44 {
1026 self.qmat_y[58] = 224;
1027 }
1028
1029 let table = if ac_quant <= 50 {
1030 0
1031 } else if ac_quant <= 150 {
1032 1
1033 } else if ac_quant <= 300 {
1034 2
1035 } else if ac_quant <= 600 {
1036 3
1037 } else {
1038 4
1039 };
1040
1041 self.eob_run = 0;
1042 self.vp30_unpack_coeffs(br, 0, table)?;
1043 let mut last_dc_i = 0;
1044 let mut last_dc_p = 0;
1045 for blkaddr in self.blk_addr.iter() {
1046 let blk: &mut Block = &mut self.blocks[blkaddr >> 2];
1047 if !blk.coded { continue; }
1048 if blk.btype.is_intra() {
1049 blk.coeffs[0] += last_dc_i;
1050 last_dc_i = blk.coeffs[0];
1051 } else {
1052 blk.coeffs[0] += last_dc_p;
1053 last_dc_p = blk.coeffs[0];
1054 }
1055 }
1056
1057 for coef_no in 1..64 {
1058 self.vp30_unpack_coeffs(br, coef_no, table)?;
1059 }
1060
1061 if self.is_intra {
1062 self.output_blocks_intra(frm);
1063 } else {
1064 self.output_blocks_inter(frm);
1065 }
1066
1067 Ok(())
1068 }
1069 fn decode_vp31(&mut self, br: &mut BitReader, frm: &mut NASimpleVideoFrame<u8>) -> DecoderResult<()> {
1070 for blk in self.blocks.iter_mut() {
1071 blk.coeffs = [0; 64];
1072 blk.idx = 0;
1073 blk.coded = false;
1074 blk.has_ac = false;
1075 }
1076 if self.is_intra {
1077 for sb in self.sb_info.iter_mut() { *sb = SBState::Coded; }
1078 for blk in self.blocks.iter_mut() {
1079 blk.btype = VPMBType::Intra;
1080 blk.coded = true;
1081 }
1082 } else {
1083 if self.shuf.get_last().is_none() || self.shuf.get_golden().is_none() {
1084 return Err(DecoderError::MissingReference);
1085 }
1086 self.vp31_unpack_sb_info(br)?;
1087 self.vp31_unpack_mb_info(br)?;
1088 self.vp31_unpack_mv_info(br)?;
1089 }
1090 let dc_quant = VP31_DC_SCALES[self.quant];
1091 let ac_quant = VP31_AC_SCALES[self.quant];
1092 rescale_qmat(&mut self.qmat_y, VP3_QMAT_Y, dc_quant, ac_quant, 2);
1093 rescale_qmat(&mut self.qmat_c, VP3_QMAT_C, dc_quant, ac_quant, 2);
1094 rescale_qmat(&mut self.qmat_inter, VP3_QMAT_INTER, dc_quant, ac_quant, 4);
1095
1096 self.eob_run = 0;
1097 let dc_table_y = br.read(4)? as usize;
1098 let dc_table_c = br.read(4)? as usize;
1099 self.vp31_unpack_coeffs(br, 0, dc_table_y, dc_table_c)?;
1100 self.restore_dcs();
1101
1102 let ac_table_y = br.read(4)? as usize;
1103 let ac_table_c = br.read(4)? as usize;
1104 for coef_no in 1..64 {
1105 self.vp31_unpack_coeffs(br, coef_no, ac_table_y, ac_table_c)?;
1106 }
1107
1108 if self.is_intra {
1109 self.output_blocks_intra(frm);
1110 } else {
1111 self.output_blocks_inter(frm);
1112 }
1113 if self.loop_str > 0 {
1114 self.vp31_loop_filter(frm);
1115 }
1116
1117 Ok(())
1118 }
1119 fn decode_vp4(&mut self) -> DecoderResult<()> {
1120 unimplemented!();
1121 }
1122 fn predict_dc(&self, bx: usize, by: usize, bw: usize, blk_idx: usize) -> i16 {
1123 let mut preds = [0i32; 4];
1124 let mut pp: usize = 0;
1125 let ref_id = self.blocks[blk_idx].btype.get_ref_id();
1126 let is_right = bx == bw - 1;
1127 if bx > 0 {
1128 fill_dc_pred!(self, ref_id, preds, pp, 0, blk_idx - 1);
1129 if by > 0 {
1130 fill_dc_pred!(self, ref_id, preds, pp, 1, blk_idx - 1 - bw);
1131 }
1132 }
1133 if by > 0 {
1134 fill_dc_pred!(self, ref_id, preds, pp, 2, blk_idx - bw);
1135 if !is_right {
1136 fill_dc_pred!(self, ref_id, preds, pp, 3, blk_idx + 1 - bw);
1137 }
1138 }
1139 if pp == 0 { return self.last_dc[ref_id as usize]; }
1140 let mut pred = 0i32;
1141 for i in 0..4 {
1142 if (pp & (1 << i)) != 0 {
1143 pred += (preds[i] as i32) * (VP31_DC_WEIGHTS[pp][i] as i32);
1144 }
1145 }
1146 pred /= VP31_DC_WEIGHTS[pp][4] as i32;
1147 if (pp & 7) == 7 {
1148 if (pred - preds[2]).abs() > 128 { return preds[2] as i16; }
1149 if (pred - preds[0]).abs() > 128 { return preds[0] as i16; }
1150 if (pred - preds[1]).abs() > 128 { return preds[1] as i16; }
1151 }
1152 pred as i16
1153 }
1154 fn restore_dcs(&mut self) {
1155 let blk_stride = self.mb_w * 2;
1156 let mut blk_idx = 0;
1157 self.last_dc = [0; 3];
1158 for by in 0..self.mb_h*2 {
1159 for bx in 0..self.mb_w*2 {
1160 if !self.blocks[blk_idx + bx].coded { continue; }
1161 let dc = self.predict_dc(bx, by, self.mb_w*2, blk_idx + bx);
1162 self.blocks[blk_idx + bx].coeffs[0] += dc;
1163 self.last_dc[self.blocks[blk_idx + bx].btype.get_ref_id() as usize] = self.blocks[blk_idx + bx].coeffs[0];
1164 }
1165 blk_idx += blk_stride;
1166 }
1167 let blk_stride = self.mb_w;
1168 for _plane in 1..3 {
1169 self.last_dc = [0; 3];
1170 for by in 0..self.mb_h {
1171 for bx in 0..self.mb_w {
1172 if !self.blocks[blk_idx + bx].coded { continue; }
1173 let dc = self.predict_dc(bx, by, self.mb_w, blk_idx + bx);
1174 self.blocks[blk_idx + bx].coeffs[0] += dc;
1175 self.last_dc[self.blocks[blk_idx + bx].btype.get_ref_id() as usize] = self.blocks[blk_idx + bx].coeffs[0];
1176 }
1177 blk_idx += blk_stride;
1178 }
1179 }
1180 }
1181 fn output_blocks_intra(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
1182 let mut biter = self.blocks.iter_mut();
1183 for by in 0..self.mb_h*2 {
1184 for bx in 0..self.mb_w*2 {
1185 let mut blk = biter.next().unwrap();
1186 let qmat = if blk.btype == VPMBType::Intra { &self.qmat_y } else { &self.qmat_inter };
1187 blk.coeffs[0] *= qmat[0];
1188 if blk.has_ac {
1189 unquant(&mut blk.coeffs, qmat);
1190 vp_put_block(&mut blk.coeffs, bx, by, 0, frm);
1191 } else {
1192 vp_put_block_dc(&mut blk.coeffs, bx, by, 0, frm);
1193 }
1194 }
1195 }
1196 for plane in 1..3 {
1197 for by in 0..self.mb_h {
1198 for bx in 0..self.mb_w {
1199 let mut blk = biter.next().unwrap();
1200 let qmat = if blk.btype == VPMBType::Intra { &self.qmat_c } else { &self.qmat_inter };
1201 blk.coeffs[0] *= qmat[0];
1202 if blk.has_ac {
1203 unquant(&mut blk.coeffs, qmat);
1204 vp_put_block(&mut blk.coeffs, bx, by, plane, frm);
1205 } else {
1206 vp_put_block_dc(&mut blk.coeffs, bx, by, plane, frm);
1207 }
1208 }
1209 }
1210 }
1211 }
1212 fn output_blocks_inter(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
1213 let mut blk_idx = 0;
1214 let bstride = self.mb_w * 2;
1215 for by in (0..self.mb_h*2).step_by(2) {
1216 for bx in (0..self.mb_w*2).step_by(2) {
1217 if self.blocks[blk_idx + bx].btype != VPMBType::InterFourMV {
1218 continue;
1219 }
1220 let mv_a = self.blocks[blk_idx + bx].mv;
1221 let mv_b = self.blocks[blk_idx + bx + 1].mv;
1222 let mv_c = self.blocks[blk_idx + bx + bstride].mv;
1223 let mv_d = self.blocks[blk_idx + bx + 1 + bstride].mv;
1224 let mut mv_sum = mv_a + mv_b + mv_c + mv_d;
1225 mv_sum.x = (mv_sum.x + 2) >> 2;
1226 mv_sum.y = (mv_sum.y + 2) >> 2;
1227
1228 let src = self.shuf.get_last().unwrap();
1229 let mode = ((mv_a.x & 1) + (mv_a.y & 1) * 2) as usize;
1230 copy_block(frm, src.clone(), 0, bx * 8, by * 8, mv_a.x >> 1, mv_a.y >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1231 let mode = ((mv_b.x & 1) + (mv_b.y & 1) * 2) as usize;
1232 copy_block(frm, src.clone(), 0, bx * 8 + 8, by * 8, mv_b.x >> 1, mv_b.y >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1233 let mode = ((mv_c.x & 1) + (mv_c.y & 1) * 2) as usize;
1234 copy_block(frm, src.clone(), 0, bx * 8, by * 8 + 8, mv_c.x >> 1, mv_c.y >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1235 let mode = ((mv_d.x & 1) + (mv_d.y & 1) * 2) as usize;
1236 copy_block(frm, src.clone(), 0, bx * 8 + 8, by * 8 + 8, mv_d.x >> 1, mv_d.y >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1237
1238 let mx = (mv_sum.x >> 1) | (mv_sum.x & 1);
1239 let my = (mv_sum.y >> 1) | (mv_sum.y & 1);
1240 let mode = ((mx & 1) + (my & 1) * 2) as usize;
1241 copy_block(frm, src.clone(), 1, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1242 copy_block(frm, src.clone(), 2, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1243 }
1244 blk_idx += bstride * 2;
1245 }
1246
1247 let mut biter = self.blocks.iter_mut();
1248 for by in 0..self.mb_h*2 {
1249 for bx in 0..self.mb_w*2 {
1250 let mut blk = biter.next().unwrap();
1251 // do MC for whole macroblock
1252 if !blk.btype.is_intra() && (((bx | by) & 1) == 0) && (blk.btype != VPMBType::InterFourMV) {
1253 let src = if blk.btype.get_ref_id() == 1 {
1254 self.shuf.get_last().unwrap()
1255 } else {
1256 self.shuf.get_golden().unwrap()
1257 };
1258 let mode = ((blk.mv.x & 1) + (blk.mv.y & 1) * 2) as usize;
1259 copy_block(frm, src.clone(), 0, bx * 8, by * 8, blk.mv.x >> 1, blk.mv.y >> 1, 16, 16, 0, 1, mode, VP3_INTERP_FUNCS);
1260 let mx = (blk.mv.x >> 1) | (blk.mv.x & 1);
1261 let my = (blk.mv.y >> 1) | (blk.mv.y & 1);
1262 let mode = ((mx & 1) + (my & 1) * 2) as usize;
1263 copy_block(frm, src.clone(), 1, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1264 copy_block(frm, src.clone(), 2, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
1265 }
1266 let qmat = if blk.btype.is_intra() { &self.qmat_y } else { &self.qmat_inter };
1267 blk.coeffs[0] *= qmat[0];
1268 if blk.has_ac {
1269 unquant(&mut blk.coeffs, qmat);
1270 }
1271 if blk.btype.is_intra() {
1272 if !blk.coded {
1273 copy_block(frm, self.shuf.get_last().unwrap(), 0, bx * 8, by * 8, 0, 0, 8, 8, 0, 1, 0, VP3_INTERP_FUNCS);
1274 } else if blk.has_ac {
1275 vp_put_block(&mut blk.coeffs, bx, by, 0, frm);
1276 } else {
1277 vp_put_block_dc(&mut blk.coeffs, bx, by, 0, frm);
1278 }
1279 } else if blk.coded {
1280 if blk.has_ac {
1281 vp_add_block(&mut blk.coeffs, bx, by, 0, frm);
1282 } else {
1283 vp_add_block_dc(&mut blk.coeffs, bx, by, 0, frm);
1284 }
1285 }
1286 }
1287 }
1288 for plane in 1..3 {
1289 for by in 0..self.mb_h {
1290 for bx in 0..self.mb_w {
1291 let mut blk = biter.next().unwrap();
1292 let qmat = if blk.btype.is_intra() { &self.qmat_c } else { &self.qmat_inter };
1293 blk.coeffs[0] *= qmat[0];
1294 if blk.has_ac {
1295 unquant(&mut blk.coeffs, qmat);
1296 }
1297 if blk.btype.is_intra() {
1298 if !blk.coded {
1299 copy_block(frm, self.shuf.get_last().unwrap(), plane, bx * 8, by * 8, 0, 0, 8, 8, 0, 1, 0, VP3_INTERP_FUNCS);
1300 } else if blk.has_ac {
1301 vp_put_block(&mut blk.coeffs, bx, by, plane, frm);
1302 } else {
1303 vp_put_block_dc(&mut blk.coeffs, bx, by, plane, frm);
1304 }
1305 } else if blk.coded {
1306 if blk.has_ac {
1307 vp_add_block(&mut blk.coeffs, bx, by, plane, frm);
1308 } else {
1309 vp_add_block_dc(&mut blk.coeffs, bx, by, plane, frm);
1310 }
1311 }
1312 }
1313 }
1314 }
1315 }
1316 fn vp31_loop_filter(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
1317 let mut blk_idx = 0;
1318 let blk_w = self.mb_w * 2;
1319 for by in 0..self.mb_h*2 {
1320 for bx in 0..blk_w {
1321 let blk = &self.blocks[blk_idx + bx];
1322 if (bx > 0) && blk.coded {
1323 vp31_loop_filter_v(frm, bx * 8, by * 8, 0, self.loop_str);
1324 }
1325 if (by > 0) && blk.coded {
1326 vp31_loop_filter_h(frm, bx * 8, by * 8, 0, self.loop_str);
1327 }
1328 if (bx < blk_w - 1) && !self.blocks[blk_idx + bx + 1].coded {
1329 vp31_loop_filter_v(frm, bx * 8 + 8, by * 8, 0, self.loop_str);
1330 }
1331 if (by < self.mb_h * 2 - 1) && !self.blocks[blk_idx + bx + blk_w].coded {
1332 vp31_loop_filter_h(frm, bx * 8, by * 8 + 8, 0, self.loop_str);
1333 }
1334 }
1335 blk_idx += blk_w;
1336 }
1337 /* for plane in 1..3 {
1338 for by in 0..self.mb_h {
1339 for bx in 0..self.mb_w {
1340 }
1341 }
1342 }*/
1343 }
1344 fn generate_block_addr(&mut self) {
1345 let sb_w_y = (self.width + 31) >> 5;
1346 let sb_h_y = (self.height + 31) >> 5;
1347 let sb_w_c = ((self.width >> 1) + 31) >> 5;
1348 let sb_h_c = ((self.height >> 1) + 31) >> 5;
1349 self.y_sbs = sb_w_y * sb_h_y;
1350 let tot_sb = sb_w_y * sb_h_y + 2 * sb_w_c * sb_h_c;
1351 let tot_mb = self.mb_w * self.mb_h * 2 + ((self.mb_w + 1) & !1) * ((self.mb_h + 1) & !1) * 2;
1352 let bw = self.width >> 3;
1353 let bh = self.height >> 3;
1354 let tot_blk = bw * bh * 3 / 2;
1355 self.sb_info.resize(tot_sb, SBState::Uncoded);
1356 self.sb_blocks = Vec::with_capacity(tot_sb);
1357 self.mb_blocks = Vec::with_capacity(tot_mb);
1358 self.sb_mbs = Vec::with_capacity(tot_sb);
1359 self.blk_addr = Vec::with_capacity(tot_blk);
1360 self.y_blocks = bw * bh;
1361 let mut base_idx = 0;
1362 for plane in 0..3 {
1363 let w = if plane > 0 { self.width >> 1 } else { self.width };
1364 let h = if plane > 0 { self.height >> 1 } else { self.height };
1365 let sb_w = (w + 31) >> 5;
1366 let sb_h = (h + 31) >> 5;
1367 let blk_w = w >> 3;
1368 let blk_h = h >> 3;
1369 for y in 0..sb_h {
1370 for x in 0..sb_w {
1371 let mut nmbs = 0;
1372 for mb_no in 0..4 {
1373 let bx = x * 4 + HILBERT_ORDER[mb_no * 4][0];
1374 let by = y * 4 + HILBERT_ORDER[mb_no * 4][1];
1375 if (bx >= blk_w) || (by >= blk_h) { continue; }
1376 let mut nblocks = 0;
1377 for blk_no in 0..4 {
1378 let bx = x * 4 + HILBERT_ORDER[mb_no * 4 + blk_no][0];
1379 let by = y * 4 + HILBERT_ORDER[mb_no * 4 + blk_no][1];
1380 if (bx >= blk_w) || (by >= blk_h) { continue; }
1381 nblocks += 1;
1382 }
1383 self.mb_blocks.push(nblocks);
1384 nmbs += 1;
1385 }
1386 self.sb_mbs.push(nmbs);
1387
1388 let mut nblocks = 0;
1389 for blk_no in 0..16 {
1390 let bx = x * 4 + HILBERT_ORDER[blk_no][0];
1391 let by = y * 4 + HILBERT_ORDER[blk_no][1];
1392 if (bx >= blk_w) || (by >= blk_h) { continue; }
1393 let idx = base_idx + bx + by * blk_w;
1394 self.blk_addr.push(idx * 4 + plane);
1395 nblocks += 1;
1396 }
1397 self.sb_blocks.push(nblocks);
1398 }
1399 }
1400 base_idx += blk_w * blk_h;
1401 }
1402 self.blocks.resize(tot_blk, Block::new());
1403 self.mb_coded.resize(tot_mb, false);
1404 }
1405 }
1406
1407 impl NADecoder for VP34Decoder {
1408 fn init(&mut self, supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
1409 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
1410 let fmt = YUV420_FORMAT;
1411 self.width = vinfo.get_width();
1412 self.height = vinfo.get_height();
1413 validate!(((self.width | self.height) & 15) == 0);
1414 self.mb_w = self.width >> 4;
1415 self.mb_h = self.height >> 4;
1416 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(vinfo.get_width(), vinfo.get_height(), true, fmt));
1417 self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
1418 supp.pool_u8.set_dec_bufs(3);
1419 supp.pool_u8.prealloc_video(NAVideoInfo::new(vinfo.get_width(), vinfo.get_height(), false, fmt), 4)?;
1420
1421 if self.version == 3 {
1422 self.generate_block_addr();
1423 }
1424 Ok(())
1425 } else {
1426 Err(DecoderError::InvalidData)
1427 }
1428 }
1429 fn decode(&mut self, supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
1430 let src = pkt.get_buffer();
1431 validate!(src.len() > 0);
1432 let mut br = BitReader::new(&src, src.len(), BitReaderMode::BE);
1433
1434 self.parse_header(&mut br)?;
1435 if self.is_intra {
1436 self.shuf.clear();
1437 }
1438
1439 let ret = supp.pool_u8.get_free();
1440 if ret.is_none() {
1441 return Err(DecoderError::AllocError);
1442 }
1443 let mut buf = ret.unwrap();
1444 let mut dframe = NASimpleVideoFrame::from_video_buf(&mut buf).unwrap();
1445 match self.version {
1446 30 => self.decode_vp30(&mut br, &mut dframe)?,
1447 31 => self.decode_vp31(&mut br, &mut dframe)?,
1448 4 => self.decode_vp4()?,
1449 _ => return Err(DecoderError::Bug),
1450 }
1451
1452 if self.is_intra {
1453 self.shuf.add_golden_frame(buf.clone());
1454 }
1455 self.shuf.add_frame(buf.clone());
1456
1457 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::Video(buf));
1458 frm.set_keyframe(self.is_intra);
1459 frm.set_frame_type(if self.is_intra { FrameType::I } else { FrameType::P });
1460 Ok(frm.into_ref())
1461 }
1462 }
1463
1464 pub fn get_decoder_vp3() -> Box<NADecoder> {
1465 Box::new(VP34Decoder::new(3))
1466 }
1467
1468 /*pub fn get_decoder_vp4() -> Box<NADecoder> {
1469 Box::new(VP34Decoder::new(4))
1470 }*/
1471
1472 #[cfg(test)]
1473 mod test {
1474 use nihav_core::codecs::RegisteredDecoders;
1475 use nihav_core::demuxers::RegisteredDemuxers;
1476 use nihav_core::test::dec_video::*;
1477 use crate::codecs::duck_register_all_codecs;
1478 use nihav_commonfmt::demuxers::generic_register_all_demuxers;
1479
1480 #[test]
1481 fn test_vp30() {
1482 let mut dmx_reg = RegisteredDemuxers::new();
1483 generic_register_all_demuxers(&mut dmx_reg);
1484 let mut dec_reg = RegisteredDecoders::new();
1485 duck_register_all_codecs(&mut dec_reg);
1486
1487 let file = "assets/Duck/vp30-logo.avi";
1488 test_file_decoding("avi", file, Some(23), true, false, Some("vp30"), &dmx_reg, &dec_reg);
1489 }
1490
1491 #[test]
1492 fn test_vp31() {
1493 let mut dmx_reg = RegisteredDemuxers::new();
1494 generic_register_all_demuxers(&mut dmx_reg);
1495 let mut dec_reg = RegisteredDecoders::new();
1496 duck_register_all_codecs(&mut dec_reg);
1497
1498 let file = "assets/Duck/vp31.avi";
1499 // let file = "assets/Duck/vp31_crash.avi";
1500 // let file = "assets/Duck/01-vp31-0500.avi";
1501 test_file_decoding("avi", file, Some(3), true, false, Some("vp31"), &dmx_reg, &dec_reg);
1502 //panic!("end");
1503 }
1504
1505 #[test]
1506 fn test_vp4() {
1507 let mut dmx_reg = RegisteredDemuxers::new();
1508 generic_register_all_demuxers(&mut dmx_reg);
1509 let mut dec_reg = RegisteredDecoders::new();
1510 duck_register_all_codecs(&mut dec_reg);
1511
1512 let file = "assets/Duck/ot171_vp40.avi";
1513 test_file_decoding("avi", file, Some(16), true, false, Some("vp4"), &dmx_reg, &dec_reg);
1514 }
1515 }
1516
1517 const HILBERT_ORDER: [[usize; 2]; 16] = [
1518 [ 0, 0 ], [ 1, 0 ], [ 1, 1 ], [ 0, 1 ],
1519 [ 0, 2 ], [ 0, 3 ], [ 1, 3 ], [ 1, 2 ],
1520 [ 2, 2 ], [ 2, 3 ], [ 3, 3 ], [ 3, 2 ],
1521 [ 3, 1 ], [ 2, 1 ], [ 2, 0 ], [ 3, 0 ]
1522 ];
1523
1524 const VP31_LOOP_STRENGTH: [i16; 64] = [
1525 30, 25, 20, 20, 15, 15, 14, 14,
1526 13, 13, 12, 12, 11, 11, 10, 10,
1527 9, 9, 8, 8, 7, 7, 7, 7,
1528 6, 6, 6, 6, 5, 5, 5, 5,
1529 4, 4, 4, 4, 3, 3, 3, 3,
1530 2, 2, 2, 2, 2, 2, 2, 2,
1531 0, 0, 0, 0, 0, 0, 0, 0,
1532 0, 0, 0, 0, 0, 0, 0, 0
1533 ];
1534
1535 const VP31_DEFAULT_MB_MODES: [VPMBType; 8] = [
1536 VPMBType::InterNoMV, VPMBType::Intra, VPMBType::InterMV, VPMBType::InterNearest,
1537 VPMBType::InterNear, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1538 ];
1539
1540 const VP31_MB_MODES: [[VPMBType; 8]; 6] = [
1541 [
1542 VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterMV, VPMBType::InterNoMV,
1543 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1544 ], [
1545 VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterNoMV, VPMBType::InterMV,
1546 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1547 ], [
1548 VPMBType::InterNearest, VPMBType::InterMV, VPMBType::InterNear, VPMBType::InterNoMV,
1549 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1550 ], [
1551 VPMBType::InterNearest, VPMBType::InterMV, VPMBType::InterNoMV, VPMBType::InterNear,
1552 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1553 ], [
1554 VPMBType::InterNoMV, VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterMV,
1555 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1556 ], [
1557 VPMBType::InterNoMV, VPMBType::GoldenNoMV, VPMBType::InterNearest, VPMBType::InterNear,
1558 VPMBType::InterMV, VPMBType::Intra, VPMBType::GoldenMV, VPMBType::InterFourMV
1559 ]
1560 ];
1561
1562 const VP3_LITERAL_BASE: [i16; 6] = [ 7, 9, 13, 21, 37, 69 ];
1563
1564 const VP31_AC_SCALES: [i16; 64] = [
1565 500, 450, 400, 370, 340, 310, 285, 265,
1566 245, 225, 210, 195, 185, 180, 170, 160,
1567 150, 145, 135, 130, 125, 115, 110, 107,
1568 100, 96, 93, 89, 85, 82, 75, 74,
1569 70, 68, 64, 60, 57, 56, 52, 50,
1570 49, 45, 44, 43, 40, 38, 37, 35,
1571 33, 32, 30, 29, 28, 25, 24, 22,
1572 21, 19, 18, 17, 15, 13, 12, 10
1573 ];
1574
1575 const VP31_DC_SCALES: [i16; 64] = [
1576 220, 200, 190, 180, 170, 170, 160, 160,
1577 150, 150, 140, 140, 130, 130, 120, 120,
1578 110, 110, 100, 100, 90, 90, 90, 80,
1579 80, 80, 70, 70, 70, 60, 60, 60,
1580 60, 50, 50, 50, 50, 40, 40, 40,
1581 40, 40, 30, 30, 30, 30, 30, 30,
1582 30, 20, 20, 20, 20, 20, 20, 20,
1583 20, 10, 10, 10, 10, 10, 10, 10
1584 ];
1585
1586 const VP3_QMAT_Y: &[i16; 64] = &[
1587 16, 11, 10, 16, 24, 40, 51, 61,
1588 12, 12, 14, 19, 26, 58, 60, 55,
1589 14, 13, 16, 24, 40, 57, 69, 56,
1590 14, 17, 22, 29, 51, 87, 80, 62,
1591 18, 22, 37, 58, 68, 109, 103, 77,
1592 24, 35, 55, 64, 81, 104, 113, 92,
1593 49, 64, 78, 87, 103, 121, 120, 101,
1594 72, 92, 95, 98, 112, 100, 103, 99
1595 ];
1596
1597 const VP3_QMAT_C: &[i16; 64] = &[
1598 17, 18, 24, 47, 99, 99, 99, 99,
1599 18, 21, 26, 66, 99, 99, 99, 99,
1600 24, 26, 56, 99, 99, 99, 99, 99,
1601 47, 66, 99, 99, 99, 99, 99, 99,
1602 99, 99, 99, 99, 99, 99, 99, 99,
1603 99, 99, 99, 99, 99, 99, 99, 99,
1604 99, 99, 99, 99, 99, 99, 99, 99,
1605 99, 99, 99, 99, 99, 99, 99, 99
1606 ];
1607
1608 const VP3_QMAT_INTER: &[i16; 64] = &[
1609 16, 16, 16, 20, 24, 28, 32, 40,
1610 16, 16, 20, 24, 28, 32, 40, 48,
1611 16, 20, 24, 28, 32, 40, 48, 64,
1612 20, 24, 28, 32, 40, 48, 64, 64,
1613 24, 28, 32, 40, 48, 64, 64, 64,
1614 28, 32, 40, 48, 64, 64, 64, 96,
1615 32, 40, 48, 64, 64, 64, 96, 128,
1616 40, 48, 64, 64, 64, 96, 128, 128
1617 ];
1618
1619 const ZIGZAG: [usize; 64] = [
1620 0, 1, 8, 16, 9, 2, 3, 10,
1621 17, 24, 32, 25, 18, 11, 4, 5,
1622 12, 19, 26, 33, 40, 48, 41, 34,
1623 27, 20, 13, 6, 7, 14, 21, 28,
1624 35, 42, 49, 56, 57, 50, 43, 36,
1625 29, 22, 15, 23, 30, 37, 44, 51,
1626 58, 59, 52, 45, 38, 31, 39, 46,
1627 53, 60, 61, 54, 47, 55, 62, 63
1628 ];
1629
1630 const VP31_DC_CODES: [[u16; 32]; 16] = [
1631 [
1632 0x002D, 0x0026, 0x0166, 0x004E, 0x02CE, 0x059E, 0x027D, 0x0008,
1633 0x04F9, 0x000F, 0x000E, 0x001B, 0x0006, 0x0008, 0x0005, 0x001A,
1634 0x0015, 0x0007, 0x000C, 0x0001, 0x0000, 0x0009, 0x0017, 0x0029,
1635 0x0028, 0x00B2, 0x04F8, 0x059F, 0x009E, 0x013F, 0x0012, 0x0058,
1636 ], [
1637 0x0010, 0x0047, 0x01FF, 0x008C, 0x03FC, 0x046A, 0x0469, 0x0022,
1638 0x11A1, 0x000E, 0x000D, 0x0004, 0x0005, 0x0009, 0x0006, 0x001E,
1639 0x0016, 0x0007, 0x000C, 0x0001, 0x0000, 0x000A, 0x0017, 0x007D,
1640 0x007E, 0x011B, 0x08D1, 0x03FD, 0x046B, 0x11A0, 0x007C, 0x00FE,
1641 ], [
1642 0x0016, 0x0020, 0x0086, 0x0087, 0x0367, 0x06CC, 0x06CB, 0x006E,
1643 0x366D, 0x000F, 0x000E, 0x0004, 0x0005, 0x000A, 0x0006, 0x001A,
1644 0x0011, 0x0007, 0x000C, 0x0001, 0x0000, 0x0009, 0x0017, 0x006F,
1645 0x006D, 0x0364, 0x0D9A, 0x06CA, 0x1B37, 0x366C, 0x0042, 0x00D8,
1646 ], [
1647 0x0000, 0x002D, 0x00F7, 0x0058, 0x0167, 0x02CB, 0x02CA, 0x000E,
1648 0x1661, 0x0003, 0x0002, 0x0008, 0x0009, 0x000D, 0x0002, 0x001F,
1649 0x0017, 0x0001, 0x000C, 0x000E, 0x000A, 0x0006, 0x0078, 0x000F,
1650 0x007A, 0x0164, 0x0599, 0x02CD, 0x0B31, 0x1660, 0x0079, 0x00F6,
1651 ], [
1652 0x0003, 0x003C, 0x000F, 0x007A, 0x001D, 0x0020, 0x0072, 0x0006,
1653 0x0399, 0x0004, 0x0005, 0x0005, 0x0006, 0x000E, 0x0004, 0x0000,
1654 0x0019, 0x0002, 0x000D, 0x0007, 0x001F, 0x0030, 0x0011, 0x0031,
1655 0x0005, 0x0021, 0x00E7, 0x0038, 0x01CD, 0x0398, 0x007B, 0x0009,
1656 ], [
1657 0x0009, 0x0002, 0x0074, 0x0007, 0x00EC, 0x00D1, 0x01A6, 0x0006,
1658 0x0D21, 0x0005, 0x0006, 0x0008, 0x0007, 0x000F, 0x0004, 0x0000,
1659 0x001C, 0x0002, 0x0005, 0x0003, 0x000C, 0x0035, 0x01A7, 0x001B,
1660 0x0077, 0x01A5, 0x0349, 0x00D0, 0x0691, 0x0D20, 0x0075, 0x00ED,
1661 ], [
1662 0x000A, 0x000C, 0x0012, 0x001B, 0x00B7, 0x016C, 0x0099, 0x005A,
1663 0x16D8, 0x0007, 0x0006, 0x0009, 0x0008, 0x0000, 0x0005, 0x0017,
1664 0x000E, 0x0002, 0x0003, 0x000F, 0x001A, 0x004D, 0x2DB3, 0x002C,
1665 0x0011, 0x02DA, 0x05B7, 0x0098, 0x0B6D, 0x2DB2, 0x0010, 0x0027,
1666 ], [
1667 0x000D, 0x000F, 0x001D, 0x0008, 0x0051, 0x0056, 0x00AF, 0x002A,
1668 0x148A, 0x0007, 0x0000, 0x0008, 0x0009, 0x000C, 0x0006, 0x0017,
1669 0x000B, 0x0016, 0x0015, 0x0009, 0x0050, 0x00AE, 0x2917, 0x001C,
1670 0x0014, 0x0290, 0x0523, 0x0149, 0x0A44, 0x2916, 0x0053, 0x00A5,
1671 ], [
1672 0x0001, 0x001D, 0x00F5, 0x00F4, 0x024D, 0x0499, 0x0498, 0x0001,
1673 0x0021, 0x0006, 0x0005, 0x0006, 0x0005, 0x0002, 0x0007, 0x0025,
1674 0x007B, 0x001C, 0x0020, 0x000D, 0x0048, 0x0092, 0x0127, 0x000E,
1675 0x0004, 0x0011, 0x000C, 0x003C, 0x000F, 0x0000, 0x001F, 0x0013,
1676 ], [
1677 0x0005, 0x003C, 0x0040, 0x000D, 0x0031, 0x0061, 0x0060, 0x0002,
1678 0x00F5, 0x0006, 0x0005, 0x0007, 0x0006, 0x0002, 0x0009, 0x0025,
1679 0x0007, 0x0021, 0x0024, 0x0010, 0x0041, 0x00F4, 0x0019, 0x000E,
1680 0x0003, 0x0011, 0x0011, 0x003F, 0x003E, 0x007B, 0x0000, 0x0013,
1681 ], [
1682 0x000A, 0x0007, 0x0001, 0x0009, 0x0131, 0x0261, 0x0260, 0x0015,
1683 0x0001, 0x0007, 0x0006, 0x0008, 0x0007, 0x0006, 0x0012, 0x002F,
1684 0x0014, 0x0027, 0x002D, 0x0016, 0x004D, 0x0099, 0x0000, 0x0004,
1685 0x0001, 0x0005, 0x0017, 0x002E, 0x002C, 0x0008, 0x0006, 0x0001,
1686 ], [
1687 0x0000, 0x000E, 0x0017, 0x002A, 0x0010, 0x00F9, 0x00F8, 0x001E,
1688 0x003F, 0x0007, 0x0006, 0x0009, 0x0008, 0x0006, 0x000F, 0x0005,
1689 0x0016, 0x0029, 0x002B, 0x0015, 0x0050, 0x0011, 0x007D, 0x0004,
1690 0x0017, 0x0006, 0x0014, 0x002C, 0x002D, 0x000E, 0x0009, 0x0051,
1691 ], [
1692 0x0002, 0x0018, 0x002F, 0x000D, 0x0053, 0x0295, 0x0294, 0x00A4,
1693 0x007C, 0x0000, 0x0007, 0x0009, 0x0008, 0x001B, 0x000C, 0x0028,
1694 0x006A, 0x001E, 0x001D, 0x0069, 0x00D7, 0x007D, 0x014B, 0x0019,
1695 0x0016, 0x002E, 0x001C, 0x002B, 0x002A, 0x0068, 0x003F, 0x00D6,
1696 ], [
1697 0x0002, 0x001B, 0x000C, 0x0018, 0x0029, 0x007F, 0x02F0, 0x0198,
1698 0x0179, 0x0000, 0x0007, 0x0009, 0x0008, 0x001A, 0x000D, 0x002A,
1699 0x0064, 0x001E, 0x0067, 0x005F, 0x00CD, 0x007E, 0x02F1, 0x0016,
1700 0x000E, 0x002E, 0x0065, 0x002B, 0x0028, 0x003E, 0x00BD, 0x0199,
1701 ], [
1702 0x0002, 0x0007, 0x0016, 0x0006, 0x0036, 0x005C, 0x015D, 0x015C,
1703 0x02BF, 0x0000, 0x0007, 0x0009, 0x0008, 0x0018, 0x0034, 0x002A,
1704 0x005E, 0x006A, 0x0064, 0x005D, 0x00CB, 0x00AD, 0x02BE, 0x0014,
1705 0x0033, 0x006E, 0x005F, 0x006F, 0x006B, 0x00CA, 0x00AC, 0x015E,
1706 ], [
1707 0x000F, 0x001D, 0x0018, 0x000B, 0x0019, 0x0029, 0x00D6, 0x0551,
1708 0x0AA1, 0x0001, 0x0000, 0x0009, 0x0008, 0x001B, 0x0038, 0x0028,
1709 0x0057, 0x006A, 0x0068, 0x0056, 0x00E5, 0x0155, 0x0AA0, 0x0073,
1710 0x0069, 0x00D7, 0x00AB, 0x00E4, 0x00A9, 0x0151, 0x0150, 0x02A9,
1711 ]
1712 ];
1713
1714 const VP31_DC_BITS: [[u8; 32]; 16] = [
1715 [
1716 6, 7, 9, 8, 10, 11, 11, 5, 12, 4, 4, 5, 4, 4, 4, 5,
1717 5, 4, 4, 3, 3, 4, 5, 6, 6, 8, 12, 11, 9, 10, 6, 7,
1718 ], [
1719 5, 7, 9, 8, 10, 11, 11, 6, 13, 4, 4, 4, 4, 4, 4, 5,
1720 5, 4, 4, 3, 3, 4, 5, 7, 7, 9, 12, 10, 11, 13, 7, 8,
1721 ], [
1722 5, 6, 8, 8, 10, 11, 11, 7, 14, 4, 4, 4, 4, 4, 4, 5,
1723 5, 4, 4, 3, 3, 4, 5, 7, 7, 10, 12, 11, 13, 14, 7, 8,
1724 ], [
1725 4, 6, 8, 7, 9, 10, 10, 6, 13, 3, 3, 4, 4, 4, 4, 5,
1726 5, 4, 4, 4, 4, 5, 7, 6, 7, 9, 11, 10, 12, 13, 7, 8,
1727 ], [
1728 4, 6, 7, 7, 8, 9, 10, 6, 13, 3, 3, 4, 4, 4, 4, 4,
1729 5, 4, 4, 4, 5, 6, 8, 6, 6, 9, 11, 9, 12, 13, 7, 7,
1730 ], [
1731 4, 5, 7, 6, 8, 9, 10, 6, 13, 3, 3, 4, 4, 4, 4, 4,
1732 5, 4, 4, 4, 5, 7, 10, 6, 7, 10, 11, 9, 12, 13, 7, 8,
1733 ], [
1734 4, 5, 6, 6, 8, 9, 9, 7, 13, 3, 3, 4, 4, 3, 4, 5,
1735 5, 4, 4, 5, 6, 8, 14, 6, 6, 10, 11, 9, 12, 14, 6, 7,
1736 ], [
1737 4, 5, 6, 5, 7, 8, 9, 7, 13, 3, 2, 4, 4, 4, 4, 5,
1738 5, 5, 5, 5, 7, 9, 14, 6, 6, 10, 11, 9, 12, 14, 7, 8,
1739 ], [
1740 4, 6, 8, 8, 10, 11, 11, 5, 6, 3, 3, 4, 4, 4, 5, 6,
1741 7, 6, 6, 6, 7, 8, 9, 4, 4, 5, 6, 6, 5, 5, 5, 5,
1742 ], [
1743 4, 6, 7, 7, 9, 10, 10, 5, 8, 3, 3, 4, 4, 4, 5, 6,
1744 6, 6, 6, 6, 7, 8, 8, 4, 4, 5, 6, 6, 6, 7, 4, 5,
1745 ], [
1746 4, 5, 6, 6, 9, 10, 10, 6, 7, 3, 3, 4, 4, 4, 5, 6,
1747 6, 6, 6, 6, 7, 8, 7, 4, 4, 5, 6, 6, 6, 6, 5, 5,
1748 ], [
1749 3, 5, 6, 6, 7, 10, 10, 7, 8, 3, 3, 4, 4, 4, 5, 5,
1750 6, 6, 6, 6, 7, 7, 9, 4, 5, 5, 6, 6, 6, 6, 6, 7,
1751 ], [
1752 3, 5, 6, 5, 7, 10, 10, 8, 8, 2, 3, 4, 4, 5, 5, 6,
1753 7, 6, 6, 7, 8, 8, 9, 5, 5, 6, 6, 6, 6, 7, 7, 8,
1754 ], [
1755 3, 5, 5, 5, 6, 8, 10, 9, 9, 2, 3, 4, 4, 5, 5, 6,
1756 7, 6, 7, 7, 8, 8, 10, 5, 5, 6, 7, 6, 6, 7, 8, 9,
1757 ], [
1758 3, 4, 5, 4, 6, 7, 9, 9, 10, 2, 3, 4, 4, 5, 6, 6,
1759 7, 7, 7, 7, 8, 8, 10, 5, 6, 7, 7, 7, 7, 8, 8, 9,
1760 ], [
1761 4, 5, 5, 4, 5, 6, 8, 11, 12, 2, 2, 4, 4, 5, 6, 6,
1762 7, 7, 7, 7, 8, 9, 12, 7, 7, 8, 8, 8, 8, 9, 9, 10,
1763 ]
1764 ];
1765
1766 const VP31_AC_CAT0_CODES: [[u16; 32]; 16] = [
1767 [
1768 0x0008, 0x0025, 0x017A, 0x02F7, 0x0BDB, 0x17B4, 0x2F6B, 0x001D,
1769 0x2F6A, 0x0008, 0x0007, 0x0001, 0x0002, 0x000A, 0x0006, 0x0000,
1770 0x001C, 0x0009, 0x000D, 0x000F, 0x000C, 0x0003, 0x000A, 0x0016,
1771 0x0013, 0x005D, 0x0024, 0x00BC, 0x005C, 0x05EC, 0x000B, 0x005F,
1772 ], [
1773 0x000F, 0x0010, 0x004B, 0x00C6, 0x031D, 0x0C71, 0x0C70, 0x0001,
1774 0x0C73, 0x0008, 0x0009, 0x0002, 0x0003, 0x000B, 0x0006, 0x0000,
1775 0x001C, 0x0005, 0x000D, 0x000F, 0x000A, 0x0019, 0x0013, 0x001D,
1776 0x0030, 0x0062, 0x0024, 0x004A, 0x018F, 0x0C72, 0x000E, 0x0011,
1777 ], [
1778 0x001B, 0x0003, 0x008D, 0x0040, 0x0239, 0x0471, 0x08E0, 0x0003,
1779 0x11C3, 0x000A, 0x0009, 0x0004, 0x0005, 0x000E, 0x0007, 0x0001,
1780 0x001E, 0x0006, 0x000C, 0x000B, 0x0002, 0x0000, 0x0041, 0x001F,
1781 0x0022, 0x0002, 0x008F, 0x008C, 0x011D, 0x11C2, 0x001A, 0x0021,
1782 ], [
1783 0x001F, 0x0003, 0x0003, 0x0043, 0x000B, 0x0015, 0x0051, 0x0003,
1784 0x0050, 0x000D, 0x000C, 0x0004, 0x0006, 0x000E, 0x000A, 0x0001,
1785 0x001E, 0x0005, 0x0009, 0x0007, 0x0011, 0x0002, 0x0004, 0x0002,
1786 0x002D, 0x0020, 0x0042, 0x0001, 0x0000, 0x0029, 0x0017, 0x002C,
1787 ], [
1788 0x0003, 0x001F, 0x003A, 0x005D, 0x0173, 0x02E4, 0x172D, 0x0004,
1789 0x172C, 0x000F, 0x000E, 0x0009, 0x0008, 0x000C, 0x000A, 0x0001,
1790 0x0016, 0x0002, 0x0005, 0x001A, 0x002F, 0x0038, 0x05CA, 0x0006,
1791 0x0037, 0x001E, 0x003B, 0x0039, 0x00B8, 0x0B97, 0x0000, 0x0036,
1792 ], [
1793 0x0006, 0x0037, 0x005D, 0x000C, 0x00B9, 0x02E3, 0x05C4, 0x0004,
1794 0x1715, 0x0000, 0x000F, 0x0008, 0x0007, 0x000C, 0x0009, 0x001D,
1795 0x0016, 0x001C, 0x001A, 0x000B, 0x005E, 0x0170, 0x1714, 0x000A,
1796 0x000A, 0x0036, 0x005F, 0x001B, 0x001A, 0x0B8B, 0x0002, 0x0007,
1797 ], [
1798 0x000C, 0x000B, 0x0079, 0x0022, 0x00F0, 0x0119, 0x0230, 0x001D,
1799 0x08C4, 0x0001, 0x0000, 0x000A, 0x0009, 0x000B, 0x0007, 0x001C,
1800 0x003D, 0x000D, 0x0008, 0x0015, 0x008D, 0x118B, 0x118A, 0x000D,
1801 0x0010, 0x0009, 0x0014, 0x0047, 0x00F1, 0x0463, 0x001F, 0x000C,
1802 ], [
1803 0x0000, 0x001A, 0x0033, 0x000C, 0x0046, 0x01E3, 0x03C5, 0x0017,
1804 0x1E21, 0x0002, 0x0001, 0x0009, 0x000A, 0x0007, 0x001B, 0x003D,
1805 0x001B, 0x0022, 0x0079, 0x00F0, 0x1E20, 0x1E23, 0x1E22, 0x000E,
1806 0x0016, 0x0018, 0x0032, 0x001A, 0x0047, 0x0789, 0x001F, 0x0010,
1807 ], [
1808 0x001D, 0x0061, 0x004E, 0x009E, 0x027C, 0x09F5, 0x09F4, 0x0003,
1809 0x0060, 0x0000, 0x000F, 0x000B, 0x000A, 0x0009, 0x0005, 0x000D,
1810 0x0031, 0x0008, 0x0038, 0x0012, 0x0026, 0x013F, 0x04FB, 0x000D,
1811 0x0002, 0x000C, 0x0039, 0x001C, 0x000F, 0x001D, 0x0008, 0x0019,
1812 ], [
1813 0x0007, 0x0019, 0x00AB, 0x00AA, 0x0119, 0x0461, 0x0460, 0x001B,
1814 0x0047, 0x0001, 0x0000, 0x000C, 0x000B, 0x0009, 0x0005, 0x000D,
1815 0x0035, 0x003D, 0x003C, 0x0018, 0x0022, 0x008D, 0x0231, 0x000E,
1816 0x001F, 0x0009, 0x002B, 0x0010, 0x0034, 0x0054, 0x0008, 0x0014,
1817 ], [
1818 0x000C, 0x0005, 0x0008, 0x005B, 0x004D, 0x0131, 0x0261, 0x001A,
1819 0x0012, 0x0000, 0x000F, 0x000A, 0x0009, 0x0006, 0x001B, 0x0006,
1820 0x001C, 0x002C, 0x0015, 0x005A, 0x0027, 0x0099, 0x0260, 0x000E,
1821 0x0004, 0x000F, 0x0007, 0x001D, 0x000B, 0x0014, 0x0008, 0x0017,
1822 ], [
1823 0x000F, 0x0013, 0x0075, 0x0024, 0x0095, 0x0251, 0x04A0, 0x0010,
1824 0x00C8, 0x0002, 0x0001, 0x0001, 0x0000, 0x001A, 0x0011, 0x002C,
1825 0x0065, 0x0074, 0x004B, 0x00C9, 0x0129, 0x0943, 0x0942, 0x0003,
1826 0x000A, 0x001C, 0x0018, 0x0033, 0x0017, 0x002D, 0x001B, 0x003B,
1827 ], [
1828 0x0003, 0x001A, 0x002D, 0x0038, 0x0028, 0x0395, 0x0E51, 0x0037,
1829 0x00E4, 0x0001, 0x0000, 0x001F, 0x001E, 0x0017, 0x003A, 0x0073,
1830 0x002A, 0x002B, 0x0029, 0x01CB, 0x0729, 0x1CA1, 0x1CA0, 0x0004,
1831 0x000A, 0x0004, 0x0018, 0x0036, 0x000B, 0x002C, 0x0019, 0x003B,
1832 ], [
1833 0x0004, 0x0004, 0x003F, 0x0017, 0x0075, 0x01F5, 0x07D1, 0x0017,
1834 0x01F6, 0x0001, 0x0000, 0x001B, 0x001A, 0x000A, 0x0032, 0x0074,
1835 0x00F8, 0x00F9, 0x01F7, 0x03E9, 0x0FA0, 0x1F43, 0x1F42, 0x0003,
1836 0x000A, 0x001E, 0x001C, 0x003B, 0x0018, 0x0016, 0x0016, 0x0033,
1837 ], [
1838 0x0004, 0x0007, 0x0018, 0x001E, 0x0036, 0x0031, 0x0177, 0x0077,
1839 0x0176, 0x0001, 0x0000, 0x001A, 0x0019, 0x003A, 0x0019, 0x005C,
1840 0x00BA, 0x0061, 0x00C1, 0x0180, 0x0302, 0x0607, 0x0606, 0x0002,
1841 0x000A, 0x001F, 0x001C, 0x0037, 0x0016, 0x0076, 0x000D, 0x002F,
1842 ], [
1843 0x0000, 0x000A, 0x001A, 0x000C, 0x001D, 0x0039, 0x0078, 0x005E,
1844 0x0393, 0x0002, 0x0001, 0x0016, 0x000F, 0x002E, 0x005F, 0x0073,
1845 0x00E5, 0x01C8, 0x0E4A, 0x1C97, 0x1C96, 0x0E49, 0x0E48, 0x0004,
1846 0x0006, 0x001F, 0x001B, 0x001D, 0x0038, 0x0038, 0x003D, 0x0079,
1847 ]
1848 ];
1849
1850 const VP31_AC_CAT0_BITS: [[u8; 32]; 16] = [
1851 [
1852 5, 7, 9, 10, 12, 13, 14, 5, 14, 4, 4, 4, 4, 4, 4, 4,
1853 5, 4, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 7, 11, 5, 7,
1854 ], [
1855 5, 6, 8, 8, 10, 12, 12, 4, 12, 4, 4, 4, 4, 4, 4, 4,
1856 5, 4, 4, 4, 4, 5, 6, 5, 6, 7, 7, 8, 9, 12, 5, 6,
1857 ], [
1858 5, 6, 8, 7, 10, 11, 12, 4, 13, 4, 4, 4, 4, 4, 4, 4,
1859 5, 4, 4, 4, 4, 5, 7, 5, 6, 6, 8, 8, 9, 13, 5, 6,
1860 ], [
1861 5, 6, 7, 7, 9, 10, 12, 4, 12, 4, 4, 4, 4, 4, 4, 4,
1862 5, 4, 4, 4, 5, 6, 8, 4, 6, 6, 7, 7, 7, 11, 5, 6,
1863 ], [
1864 4, 6, 7, 7, 9, 10, 13, 4, 13, 4, 4, 4, 4, 4, 4, 4,
1865 5, 4, 4, 5, 6, 7, 11, 4, 6, 6, 7, 7, 8, 12, 4, 6,
1866 ], [
1867 4, 6, 7, 6, 8, 10, 11, 4, 13, 3, 4, 4, 4, 4, 4, 5,
1868 5, 5, 5, 5, 7, 9, 13, 4, 5, 6, 7, 7, 7, 12, 4, 5,
1869 ], [
1870 4, 5, 7, 6, 8, 9, 10, 5, 12, 3, 3, 4, 4, 4, 4, 5,
1871 6, 5, 5, 6, 8, 13, 13, 4, 5, 5, 6, 7, 8, 11, 5, 5,
1872 ], [
1873 3, 5, 6, 5, 7, 9, 10, 5, 13, 3, 3, 4, 4, 4, 5, 6,
1874 6, 6, 7, 8, 13, 13, 13, 4, 5, 5, 6, 6, 7, 11, 5, 5,
1875 ], [
1876 5, 7, 8, 9, 11, 13, 13, 4, 7, 3, 4, 4, 4, 4, 4, 5,
1877 6, 5, 6, 6, 7, 10, 12, 4, 4, 5, 6, 6, 5, 6, 4, 5,
1878 ], [
1879 4, 6, 8, 8, 10, 12, 12, 5, 8, 3, 3, 4, 4, 4, 4, 5,
1880 6, 6, 6, 6, 7, 9, 11, 4, 5, 5, 6, 6, 6, 7, 4, 5,
1881 ], [
1882 4, 5, 6, 7, 9, 11, 12, 5, 7, 3, 4, 4, 4, 4, 5, 5,
1883 6, 6, 6, 7, 8, 10, 12, 4, 4, 5, 5, 6, 5, 6, 4, 5,
1884 ], [
1885 4, 5, 7, 6, 8, 10, 11, 5, 8, 3, 3, 4, 4, 5, 5, 6,
1886 7, 7, 7, 8, 9, 12, 12, 3, 4, 5, 5, 6, 5, 6, 5, 6,
1887 ], [
1888 3, 5, 6, 6, 7, 10, 12, 6, 8, 3, 3, 5, 5, 5, 6, 7,
1889 7, 7, 7, 9, 11, 13, 13, 3, 4, 4, 5, 6, 5, 6, 5, 6,
1890 ], [
1891 3, 4, 6, 5, 7, 9, 11, 6, 9, 3, 3, 5, 5, 5, 6, 7,
1892 8, 8, 9, 10, 12, 13, 13, 3, 4, 5, 5, 6, 5, 6, 5, 6,
1893 ], [
1894 3, 4, 5, 5, 6, 7, 9, 7, 9, 3, 3, 5, 5, 6, 6, 7,
1895 8, 8, 9, 10, 11, 12, 12, 3, 4, 5, 5, 6, 5, 7, 5, 6,
1896 ], [
1897 3, 4, 5, 4, 5, 6, 7, 7, 11, 3, 3, 5, 5, 6, 7, 8,
1898 9, 10, 13, 14, 14, 13, 13, 3, 4, 5, 5, 6, 6, 7, 6, 7,
1899 ]
1900 ];
1901
1902 const VP31_AC_CAT1_CODES: [[u16; 32]; 16] = [
1903 [
1904 0x000B, 0x002B, 0x0054, 0x01B7, 0x06D9, 0x0DB1, 0x0DB0, 0x0002,
1905 0x00AB, 0x0009, 0x000A, 0x0007, 0x0008, 0x000F, 0x000C, 0x0003,
1906 0x001D, 0x0004, 0x000B, 0x0006, 0x001A, 0x0003, 0x00AA, 0x0001,
1907 0x0000, 0x0014, 0x006C, 0x00DA, 0x0002, 0x036D, 0x001C, 0x0037,
1908 ], [
1909 0x001D, 0x0004, 0x00B6, 0x006A, 0x05B9, 0x16E1, 0x16E0, 0x0007,
1910 0x016F, 0x000C, 0x000D, 0x0009, 0x0008, 0x000F, 0x000A, 0x0003,
1911 0x0017, 0x0002, 0x0004, 0x001C, 0x002C, 0x006B, 0x0B71, 0x0005,
1912 0x0003, 0x001B, 0x005A, 0x0034, 0x0005, 0x02DD, 0x0000, 0x000C,
1913 ], [
1914 0x0003, 0x007F, 0x00A1, 0x00A0, 0x020C, 0x0834, 0x106B, 0x0007,
1915 0x0082, 0x000E, 0x000D, 0x000B, 0x000C, 0x0000, 0x0009, 0x0002,
1916 0x0011, 0x001E, 0x0015, 0x003E, 0x0040, 0x041B, 0x106A, 0x0006,
1917 0x000A, 0x0029, 0x007E, 0x0051, 0x0021, 0x0107, 0x0004, 0x000B,
1918 ], [
1919 0x0007, 0x001B, 0x00F6, 0x00E9, 0x03A1, 0x0740, 0x0E82, 0x001F,
1920 0x01EF, 0x0001, 0x0002, 0x000B, 0x000C, 0x000D, 0x0008, 0x001C,
1921 0x0003, 0x0012, 0x0002, 0x0075, 0x01D1, 0x1D07, 0x1D06, 0x000A,
1922 0x0013, 0x003B, 0x001A, 0x007A, 0x003C, 0x01EE, 0x0000, 0x000C,
1923 ], [
1924 0x000D, 0x003D, 0x0042, 0x0037, 0x00D9, 0x0362, 0x06C6, 0x001F,
1925 0x0086, 0x0001, 0x0002, 0x000C, 0x000B, 0x000A, 0x0001, 0x000F,
1926 0x0025, 0x003C, 0x001A, 0x0087, 0x01B0, 0x0D8F, 0x0D8E, 0x000E,
1927 0x0013, 0x000C, 0x0024, 0x0020, 0x0011, 0x006D, 0x0000, 0x000E,
1928 ], [
1929 0x0000, 0x0012, 0x0076, 0x0077, 0x014D, 0x0533, 0x14C9, 0x0013,
1930 0x00A5, 0x0002, 0x0003, 0x000B, 0x000C, 0x0008, 0x001A, 0x002B,
1931 0x0075, 0x0074, 0x00A7, 0x0298, 0x14C8, 0x14CB, 0x14CA, 0x000F,
1932 0x001C, 0x0007, 0x002A, 0x0028, 0x001B, 0x00A4, 0x0002, 0x0006,
1933 ], [
1934 0x0002, 0x001A, 0x002B, 0x003A, 0x00ED, 0x0283, 0x0A0A, 0x0004,
1935 0x00A1, 0x0004, 0x0003, 0x000B, 0x000C, 0x001F, 0x0006, 0x0077,
1936 0x00A3, 0x00A2, 0x0140, 0x1417, 0x1416, 0x0A09, 0x0A08, 0x0000,
1937 0x001E, 0x0007, 0x002A, 0x0029, 0x001C, 0x00EC, 0x001B, 0x0005,
1938 ], [
1939 0x0002, 0x0002, 0x0018, 0x001D, 0x0035, 0x00E4, 0x01CF, 0x001D,
1940 0x0072, 0x0004, 0x0005, 0x0006, 0x0007, 0x0006, 0x0073, 0x0038,
1941 0x01CE, 0x039B, 0x0398, 0x0733, 0x0732, 0x0735, 0x0734, 0x0000,
1942 0x001F, 0x001B, 0x0034, 0x000F, 0x001E, 0x00E5, 0x0019, 0x0038,
1943 ], [
1944 0x0016, 0x0050, 0x0172, 0x02E7, 0x1732, 0x2E67, 0x2E66, 0x0006,
1945 0x0051, 0x0001, 0x0000, 0x000D, 0x000C, 0x0009, 0x001C, 0x0009,
1946 0x001C, 0x001D, 0x005D, 0x00B8, 0x05CD, 0x1731, 0x1730, 0x000F,
1947 0x0005, 0x000F, 0x0008, 0x0029, 0x001D, 0x002F, 0x0008, 0x0015,
1948 ], [
1949 0x0009, 0x0021, 0x0040, 0x00AD, 0x02B0, 0x1589, 0x1588, 0x001C,
1950 0x005F, 0x0000, 0x000F, 0x000D, 0x000C, 0x0006, 0x0011, 0x002A,
1951 0x0057, 0x005E, 0x0041, 0x0159, 0x0563, 0x158B, 0x158A, 0x0001,
1952 0x0005, 0x0014, 0x003B, 0x002E, 0x0004, 0x003A, 0x0007, 0x0016,
1953 ], [
1954 0x000E, 0x0007, 0x0046, 0x0045, 0x0064, 0x032A, 0x0657, 0x0018,
1955 0x000D, 0x0000, 0x000F, 0x000A, 0x000B, 0x001A, 0x0036, 0x0047,
1956 0x0044, 0x0018, 0x0033, 0x00CB, 0x0656, 0x0329, 0x0328, 0x0002,
1957 0x0006, 0x0019, 0x000E, 0x0037, 0x0009, 0x000F, 0x0002, 0x0010,
1958 ], [
1959 0x0003, 0x0018, 0x0023, 0x0077, 0x0194, 0x1956, 0x32AF, 0x003A,
1960 0x0076, 0x0002, 0x0001, 0x001F, 0x001E, 0x0014, 0x0022, 0x0064,
1961 0x0197, 0x0196, 0x032B, 0x0654, 0x32AE, 0x1955, 0x1954, 0x0000,
1962 0x0009, 0x001C, 0x0015, 0x0010, 0x000D, 0x0017, 0x0016, 0x0033,
1963 ], [
1964 0x0005, 0x0006, 0x003E, 0x0010, 0x0048, 0x093F, 0x24FA, 0x0032,
1965 0x0067, 0x0002, 0x0001, 0x001B, 0x001E, 0x0034, 0x0066, 0x0092,
1966 0x0126, 0x024E, 0x049E, 0x49F7, 0x49F6, 0x24F9, 0x24F8, 0x0000,
1967 0x0007, 0x0018, 0x0011, 0x003F, 0x000E, 0x0013, 0x0035, 0x0025,
1968 ], [
1969 0x0005, 0x0008, 0x0012, 0x001C, 0x001C, 0x00EA, 0x1D75, 0x001E,
1970 0x0066, 0x0001, 0x0002, 0x001B, 0x001A, 0x001F, 0x003B, 0x0074,
1971 0x01D6, 0x03AF, 0x1D74, 0x1D77, 0x1D76, 0x0EB9, 0x0EB8, 0x000F,
1972 0x0006, 0x0013, 0x003B, 0x003A, 0x0000, 0x0018, 0x0032, 0x0067,
1973 ], [
1974 0x0004, 0x000A, 0x001B, 0x000C, 0x000D, 0x00E6, 0x0684, 0x0072,
1975 0x00E7, 0x0002, 0x0001, 0x0017, 0x0016, 0x0018, 0x00D1, 0x01A0,
1976 0x0686, 0x0D0F, 0x0D0A, 0x1A17, 0x1A16, 0x1A1D, 0x1A1C, 0x000F,
1977 0x001D, 0x000E, 0x0035, 0x0038, 0x0000, 0x000F, 0x0019, 0x0069,
1978 ], [
1979 0x0003, 0x000C, 0x001B, 0x0000, 0x0003, 0x002E, 0x0051, 0x00BC,
1980 0x0053, 0x0004, 0x0002, 0x0016, 0x0015, 0x0015, 0x0050, 0x00A4,
1981 0x0294, 0x052B, 0x052A, 0x052D, 0x052C, 0x052F, 0x052E, 0x000E,
1982 0x001A, 0x0004, 0x0028, 0x0029, 0x000F, 0x000B, 0x005F, 0x00BD,
1983 ]
1984 ];
1985
1986 const VP31_AC_CAT1_BITS: [[u8; 32]; 16] = [
1987 [
1988 5, 7, 8, 9, 11, 12, 12, 4, 9, 4, 4, 4, 4, 4, 4, 4,
1989 5, 4, 4, 4, 5, 6, 9, 4, 5, 6, 7, 8, 6, 10, 5, 6,
1990 ], [
1991 5, 6, 8, 8, 11, 13, 13, 4, 9, 4, 4, 4, 4, 4, 4, 4,
1992 5, 4, 4, 5, 6, 8, 12, 4, 5, 6, 7, 7, 6, 10, 4, 5,
1993 ], [
1994 4, 7, 8, 8, 10, 12, 13, 4, 8, 4, 4, 4, 4, 3, 4, 4,
1995 5, 5, 5, 6, 7, 11, 13, 4, 5, 6, 7, 7, 6, 9, 4, 5,
1996 ], [
1997 4, 6, 8, 8, 10, 11, 12, 5, 9, 3, 3, 4, 4, 4, 4, 5,
1998 5, 5, 5, 7, 9, 13, 13, 4, 5, 6, 6, 7, 6, 9, 4, 5,
1999 ], [
2000 4, 6, 7, 7, 9, 11, 12, 5, 8, 3, 3, 4, 4, 4, 4, 5,
2001 6, 6, 6, 8, 10, 13, 13, 4, 5, 5, 6, 6, 5, 8, 4, 5,
2002 ], [
2003 3, 5, 7, 7, 9, 11, 13, 5, 8, 3, 3, 4, 4, 4, 5, 6,
2004 7, 7, 8, 10, 13, 13, 13, 4, 5, 5, 6, 6, 5, 8, 4, 5,
2005 ], [
2006 3, 5, 6, 6, 8, 10, 12, 5, 8, 3, 3, 4, 4, 5, 5, 7,
2007 8, 8, 9, 13, 13, 12, 12, 3, 5, 5, 6, 6, 5, 8, 5, 5,
2008 ], [
2009 3, 4, 5, 5, 6, 8, 11, 7, 9, 3, 3, 4, 4, 5, 7, 8,
2010 11, 12, 12, 13, 13, 13, 13, 3, 5, 5, 6, 6, 5, 8, 5, 6,
2011 ], [
2012 5, 7, 9, 10, 13, 14, 14, 4, 7, 3, 3, 4, 4, 4, 5, 5,
2013 6, 6, 7, 8, 11, 13, 13, 4, 4, 5, 5, 6, 5, 6, 4, 5,
2014 ], [
2015 4, 6, 7, 8, 10, 13, 13, 5, 7, 3, 4, 4, 4, 4, 5, 6,
2016 7, 7, 7, 9, 11, 13, 13, 3, 4, 5, 6, 6, 4, 6, 4, 5,
2017 ], [
2018 4, 5, 7, 7, 9, 12, 13, 5, 6, 3, 4, 4, 4, 5, 6, 7,
2019 7, 7, 8, 10, 13, 12, 12, 3, 4, 5, 5, 6, 4, 5, 4, 5,
2020 ], [
2021 3, 5, 6, 7, 9, 13, 14, 6, 7, 3, 3, 5, 5, 5, 6, 7,
2022 9, 9, 10, 11, 14, 13, 13, 3, 4, 5, 5, 5, 4, 5, 5, 6,
2023 ], [
2024 3, 4, 6, 5, 7, 12, 14, 6, 7, 3, 3, 5, 5, 6, 7, 8,
2025 9, 10, 11, 15, 15, 14, 14, 3, 4, 5, 5, 6, 4, 5, 6, 6,
2026 ], [
2027 3, 4, 5, 5, 6, 9, 14, 6, 7, 3, 3, 5, 5, 6, 7, 8,
2028 10, 11, 14, 14, 14, 13, 13, 4, 4, 5, 6, 6, 3, 5, 6, 7,
2029 ], [
2030 3, 4, 5, 4, 5, 8, 11, 7, 8, 3, 3, 5, 5, 6, 8, 9,
2031 11, 12, 12, 13, 13, 13, 13, 4, 5, 5, 6, 6, 3, 5, 6, 7,
2032 ], [
2033 3, 4, 5, 3, 4, 6, 9, 8, 9, 3, 3, 5, 5, 7, 9, 10,
2034 12, 13, 13, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 6, 7, 8,
2035 ]
2036 ];
2037
2038 const VP31_AC_CAT2_CODES: [[u16; 32]; 16] = [
2039 [
2040 0x0003, 0x0009, 0x00D0, 0x01A3, 0x0344, 0x0D14, 0x1A2B, 0x0004,
2041 0x0015, 0x0000, 0x000F, 0x000B, 0x000C, 0x000E, 0x0009, 0x001B,
2042 0x000A, 0x0014, 0x000D, 0x002A, 0x0014, 0x068B, 0x1A2A, 0x0008,
2043 0x000B, 0x002B, 0x000B, 0x0069, 0x0035, 0x0008, 0x0007, 0x000C,
2044 ], [
2045 0x000A, 0x003C, 0x0032, 0x0030, 0x00C5, 0x0621, 0x0620, 0x001F,
2046 0x0033, 0x0001, 0x0000, 0x000E, 0x000D, 0x000C, 0x0004, 0x000D,
2047 0x0026, 0x0027, 0x0014, 0x0063, 0x0189, 0x0623, 0x0622, 0x000B,
2048 0x0012, 0x003D, 0x0022, 0x0015, 0x000B, 0x0023, 0x0007, 0x0010,
2049 ], [
2050 0x000F, 0x000C, 0x0043, 0x0010, 0x0044, 0x0114, 0x0455, 0x0018,
2051 0x0023, 0x0001, 0x0000, 0x000E, 0x000D, 0x0009, 0x0019, 0x0009,
2052 0x0017, 0x0016, 0x0042, 0x008B, 0x0454, 0x0457, 0x0456, 0x000B,
2053 0x0015, 0x000A, 0x0029, 0x0020, 0x000D, 0x0028, 0x0007, 0x0011,
2054 ], [
2055 0x0001, 0x001A, 0x0029, 0x002A, 0x00A0, 0x0285, 0x1425, 0x0002,
2056 0x0000, 0x0002, 0x0003, 0x000C, 0x000B, 0x0008, 0x0012, 0x0001,
2057 0x0051, 0x0001, 0x0143, 0x0508, 0x1424, 0x1427, 0x1426, 0x000F,
2058 0x001C, 0x0003, 0x0037, 0x002B, 0x0013, 0x0036, 0x001D, 0x0001,
2059 ], [
2060 0x0004, 0x001F, 0x003D, 0x0006, 0x0016, 0x0053, 0x014A, 0x0034,
2061 0x002A, 0x0002, 0x0003, 0x000B, 0x000C, 0x001C, 0x0037, 0x0017,
2062 0x002B, 0x0028, 0x00A4, 0x052D, 0x052C, 0x052F, 0x052E, 0x0000,
2063 0x001D, 0x0007, 0x0004, 0x0035, 0x0014, 0x0036, 0x0015, 0x003C,
2064 ], [
2065 0x0004, 0x000A, 0x0007, 0x001D, 0x0009, 0x01F3, 0x07C7, 0x0008,
2066 0x01F0, 0x0003, 0x0002, 0x000D, 0x000C, 0x0017, 0x007D, 0x01F2,
2067 0x07C6, 0x07C5, 0x1F12, 0x3E27, 0x3E26, 0x1F11, 0x1F10, 0x0000,
2068 0x001E, 0x0006, 0x0039, 0x0038, 0x003F, 0x002C, 0x0005, 0x002D,
2069 ], [
2070 0x0002, 0x0007, 0x0018, 0x0003, 0x0005, 0x0035, 0x004F, 0x0012,
2071 0x04E5, 0x0005, 0x0004, 0x000D, 0x000E, 0x0033, 0x0026, 0x009D,
2072 0x04E4, 0x04E7, 0x04E6, 0x04E1, 0x04E0, 0x04E3, 0x04E2, 0x0000,
2073 0x001F, 0x000C, 0x003D, 0x003C, 0x0032, 0x0034, 0x001B, 0x0008,
2074 ], [
2075 0x0000, 0x0004, 0x001C, 0x000F, 0x0002, 0x0007, 0x0075, 0x00E8,
2076 0x1D2A, 0x0005, 0x0004, 0x000D, 0x000C, 0x0077, 0x0E96, 0x3A57,
2077 0x3A56, 0x3A5D, 0x3A5C, 0x3A5F, 0x3A5E, 0x1D29, 0x1D28, 0x0003,
2078 0x0006, 0x000A, 0x002C, 0x0017, 0x0076, 0x01D3, 0x03A4, 0x002D,
2079 ], [
2080 0x000A, 0x0024, 0x00BF, 0x0085, 0x0211, 0x0842, 0x1087, 0x0018,
2081 0x0020, 0x0001, 0x0002, 0x000E, 0x000D, 0x0007, 0x0013, 0x0025,
2082 0x005E, 0x0043, 0x00BE, 0x0109, 0x1086, 0x0841, 0x0840, 0x000F,
2083 0x0001, 0x0011, 0x0000, 0x002E, 0x0019, 0x0001, 0x0006, 0x0016,
2084 ], [
2085 0x0002, 0x000F, 0x006F, 0x0061, 0x0374, 0x1BA8, 0x3753, 0x0012,
2086 0x0036, 0x0000, 0x0001, 0x000A, 0x000B, 0x001A, 0x0031, 0x0060,
2087 0x00DC, 0x01BB, 0x06EB, 0x1BAB, 0x3752, 0x3755, 0x3754, 0x000E,
2088 0x0006, 0x0013, 0x000E, 0x003E, 0x0008, 0x001E, 0x0019, 0x003F,
2089 ], [
2090 0x0003, 0x001C, 0x0025, 0x0024, 0x01DA, 0x1DBD, 0x3B7C, 0x003C,
2091 0x003D, 0x0000, 0x0001, 0x000B, 0x000A, 0x000B, 0x0077, 0x00EC,
2092 0x03B6, 0x076E, 0x1DBF, 0x76FB, 0x76FA, 0x3B79, 0x3B78, 0x000D,
2093 0x001F, 0x0013, 0x000A, 0x0008, 0x000C, 0x0008, 0x0009, 0x003A,
2094 ], [
2095 0x0005, 0x0003, 0x0004, 0x0010, 0x008F, 0x0475, 0x11D1, 0x0079,
2096 0x0027, 0x0002, 0x0003, 0x0001, 0x0000, 0x0026, 0x0046, 0x011C,
2097 0x0477, 0x08ED, 0x11D0, 0x11D3, 0x11D2, 0x11D9, 0x11D8, 0x000D,
2098 0x001F, 0x0012, 0x0005, 0x003D, 0x000C, 0x000E, 0x0022, 0x0078,
2099 ], [
2100 0x0005, 0x000C, 0x001B, 0x0000, 0x0006, 0x03E2, 0x3E3D, 0x000F,
2101 0x0034, 0x0003, 0x0002, 0x001E, 0x001D, 0x007D, 0x01F0, 0x07C6,
2102 0x3E3C, 0x3E3F, 0x3E3E, 0x3E39, 0x3E38, 0x3E3B, 0x3E3A, 0x0008,
2103 0x001C, 0x0002, 0x003F, 0x0035, 0x0009, 0x0001, 0x000E, 0x00F9,
2104 ], [
2105 0x0004, 0x000B, 0x0001, 0x000A, 0x001E, 0x00E0, 0x0E1E, 0x0071,
2106 0x0039, 0x0007, 0x0006, 0x000D, 0x000C, 0x0020, 0x01C2, 0x1C3F,
2107 0x1C3E, 0x0E19, 0x0E18, 0x0E1B, 0x0E1A, 0x0E1D, 0x0E1C, 0x0000,
2108 0x0009, 0x001D, 0x001F, 0x0011, 0x0005, 0x0001, 0x0043, 0x0042,
2109 ], [
2110 0x0004, 0x000D, 0x0007, 0x0002, 0x0014, 0x016C, 0x16D1, 0x02DF,
2111 0x016E, 0x0000, 0x0007, 0x002C, 0x002B, 0x02DE, 0x16D0, 0x16D3,
2112 0x16D2, 0x2DB5, 0x2DB4, 0x2DB7, 0x2DB6, 0x16D9, 0x16D8, 0x000C,
2113 0x002A, 0x005A, 0x001B, 0x001A, 0x0017, 0x000C, 0x05B7, 0x05B5,
2114 ], [
2115 0x0002, 0x000F, 0x001C, 0x000C, 0x003B, 0x01AC, 0x1AD8, 0x35B3,
2116 0x35B2, 0x0001, 0x0000, 0x0069, 0x0068, 0x35BD, 0x35BC, 0x35BF,
2117 0x35BE, 0x35B9, 0x35B8, 0x35BB, 0x35BA, 0x35B5, 0x35B4, 0x01A9,
2118 0x01A8, 0x035A, 0x00D7, 0x00D5, 0x003A, 0x001B, 0x35B7, 0x35B6,
2119 ]
2120 ];
2121
2122 const VP31_AC_CAT2_BITS: [[u8; 32]; 16] = [
2123 [
2124 4, 6, 8, 9, 10, 12, 13, 4, 7, 3, 4, 4, 4, 4, 4, 5,
2125 5, 5, 5, 6, 7, 11, 13, 4, 5, 6, 6, 7, 6, 6, 4, 5,
2126 ], [
2127 4, 6, 7, 7, 9, 12, 12, 5, 7, 3, 3, 4, 4, 4, 4, 5,
2128 6, 6, 6, 8, 10, 12, 12, 4, 5, 6, 6, 6, 5, 6, 4, 5,
2129 ], [
2130 4, 5, 7, 6, 8, 10, 12, 5, 7, 3, 3, 4, 4, 4, 5, 5,
2131 6, 6, 7, 9, 12, 12, 12, 4, 5, 5, 6, 6, 5, 6, 4, 5,
2132 ], [
2133 3, 5, 6, 6, 8, 10, 13, 5, 7, 3, 3, 4, 4, 4, 5, 6,
2134 7, 7, 9, 11, 13, 13, 13, 4, 5, 5, 6, 6, 5, 6, 5, 5,
2135 ], [
2136 3, 5, 6, 5, 7, 9, 11, 6, 8, 3, 3, 4, 4, 5, 6, 7,
2137 8, 8, 10, 13, 13, 13, 13, 3, 5, 5, 5, 6, 5, 6, 5, 6,
2138 ], [
2139 3, 4, 5, 5, 6, 9, 11, 6, 9, 3, 3, 4, 4, 5, 7, 9,
2140 11, 11, 13, 14, 14, 13, 13, 3, 5, 5, 6, 6, 6, 6, 5, 6,
2141 ], [
2142 3, 4, 5, 4, 5, 7, 9, 7, 13, 3, 3, 4, 4, 6, 8, 10,
2143 13, 13, 13, 13, 13, 13, 13, 3, 5, 5, 6, 6, 6, 7, 6, 6,
2144 ], [
2145 3, 4, 5, 4, 4, 5, 7, 8, 13, 3, 3, 4, 4, 7, 12, 14,
2146 14, 14, 14, 14, 14, 13, 13, 3, 5, 5, 7, 6, 7, 9, 10, 7,
2147 ], [
2148 4, 6, 8, 8, 10, 12, 13, 5, 6, 3, 3, 4, 4, 4, 5, 6,
2149 7, 7, 8, 9, 13, 12, 12, 4, 4, 5, 5, 6, 5, 5, 4, 5,
2150 ], [
2151 3, 5, 7, 7, 10, 13, 14, 5, 6, 3, 3, 4, 4, 5, 6, 7,
2152 8, 9, 11, 13, 14, 14, 14, 4, 4, 5, 5, 6, 4, 5, 5, 6,
2153 ], [
2154 3, 5, 6, 6, 9, 13, 14, 6, 6, 3, 3, 4, 4, 5, 7, 8,
2155 10, 11, 13, 15, 15, 14, 14, 4, 5, 5, 5, 5, 4, 4, 5, 6,
2156 ], [
2157 3, 4, 5, 5, 8, 11, 13, 7, 6, 3, 3, 4, 4, 6, 7, 9,
2158 11, 12, 13, 13, 13, 13, 13, 4, 5, 5, 5, 6, 4, 4, 6, 7,
2159 ], [
2160 3, 4, 5, 4, 6, 10, 14, 7, 6, 3, 3, 5, 5, 7, 9, 11,
2161 14, 14, 14, 14, 14, 14, 14, 4, 5, 5, 6, 6, 4, 3, 7, 8,
2162 ], [
2163 3, 4, 4, 4, 6, 9, 13, 8, 7, 3, 3, 5, 5, 7, 10, 14,
2164 14, 13, 13, 13, 13, 13, 13, 4, 5, 6, 6, 6, 4, 3, 8, 8,
2165 ], [
2166 3, 4, 4, 3, 5, 9, 13, 10, 9, 2, 3, 6, 6, 10, 13, 13,
2167 13, 14, 14, 14, 14, 13, 13, 5, 6, 7, 6, 6, 5, 4, 11, 11,
2168 ], [
2169 2, 4, 5, 4, 6, 9, 13, 14, 14, 2, 2, 7, 7, 14, 14, 14,
2170 14, 14, 14, 14, 14, 14, 14, 9, 9, 10, 8, 8, 6, 5, 14, 14,
2171 ]
2172 ];
2173
2174 const VP31_AC_CAT3_CODES: [[u16; 32]; 16] = [
2175 [
2176 0x0000, 0x0010, 0x0072, 0x0071, 0x0154, 0x0AAB, 0x0AA8, 0x0014,
2177 0x0070, 0x0002, 0x0003, 0x000C, 0x000B, 0x0003, 0x0011, 0x0073,
2178 0x0054, 0x00AB, 0x02AB, 0x1553, 0x1552, 0x1555, 0x1554, 0x000D,
2179 0x001E, 0x0012, 0x003E, 0x002B, 0x0002, 0x003F, 0x001D, 0x0013,
2180 ], [
2181 0x0003, 0x001F, 0x0029, 0x003D, 0x000C, 0x0069, 0x0345, 0x0002,
2182 0x0028, 0x0002, 0x0001, 0x000E, 0x000C, 0x0015, 0x0007, 0x001B,
2183 0x006B, 0x006A, 0x0344, 0x0347, 0x0346, 0x01A1, 0x01A0, 0x000B,
2184 0x001A, 0x0012, 0x0000, 0x003C, 0x0008, 0x001B, 0x0013, 0x0001,
2185 ], [
2186 0x0004, 0x0004, 0x003F, 0x0014, 0x0056, 0x015C, 0x15D5, 0x003C,
2187 0x002A, 0x0000, 0x0001, 0x000E, 0x000D, 0x000C, 0x00AF, 0x02BB,
2188 0x15D4, 0x15D7, 0x15D6, 0x15D1, 0x15D0, 0x15D3, 0x15D2, 0x000B,
2189 0x0019, 0x000D, 0x003E, 0x0031, 0x0007, 0x0005, 0x003D, 0x0030,
2190 ], [
2191 0x0005, 0x0008, 0x001A, 0x0000, 0x0036, 0x0011, 0x0106, 0x000A,
2192 0x006E, 0x0002, 0x0003, 0x0003, 0x0002, 0x006F, 0x0021, 0x020F,
2193 0x020E, 0x0101, 0x0100, 0x0103, 0x0102, 0x0105, 0x0104, 0x000C,
2194 0x001E, 0x0003, 0x003E, 0x003F, 0x0009, 0x000E, 0x000B, 0x0009,
2195 ], [
2196 0x0002, 0x000E, 0x001E, 0x000C, 0x001F, 0x006E, 0x00AD, 0x00AF,
2197 0x0014, 0x0004, 0x0003, 0x001A, 0x0017, 0x002A, 0x0576, 0x0AEF,
2198 0x0AEE, 0x0571, 0x0570, 0x0573, 0x0572, 0x0575, 0x0574, 0x0003,
2199 0x0016, 0x0004, 0x0036, 0x000B, 0x000A, 0x0000, 0x006F, 0x00AC,
2200 ], [
2201 0x0004, 0x0005, 0x0003, 0x0001, 0x0004, 0x002F, 0x0526, 0x1495,
2202 0x00A6, 0x0007, 0x0006, 0x002D, 0x002C, 0x1494, 0x1497, 0x1496,
2203 0x1491, 0x1490, 0x1493, 0x1492, 0x293D, 0x293C, 0x293F, 0x0000,
2204 0x0028, 0x00A5, 0x0148, 0x00A7, 0x002E, 0x0015, 0x0A4E, 0x293E,
2205 ], [
2206 0x0004, 0x0005, 0x0003, 0x0001, 0x0004, 0x002F, 0x0526, 0x1495,
2207 0x00A6, 0x0007, 0x0006, 0x002D, 0x002C, 0x1494, 0x1497, 0x1496,
2208 0x1491, 0x1490, 0x1493, 0x1492, 0x293D, 0x293C, 0x293F, 0x0000,
2209 0x0028, 0x00A5, 0x0148, 0x00A7, 0x002E, 0x0015, 0x0A4E, 0x293E,
2210 ], [
2211 0x0004, 0x0005, 0x0003, 0x0001, 0x0004, 0x002F, 0x0526, 0x1495,
2212 0x00A6, 0x0007, 0x0006, 0x002D, 0x002C, 0x1494, 0x1497, 0x1496,
2213 0x1491, 0x1490, 0x1493, 0x1492, 0x293D, 0x293C, 0x293F, 0x0000,
2214 0x0028, 0x00A5, 0x0148, 0x00A7, 0x002E, 0x0015, 0x0A4E, 0x293E,
2215 ], [
2216 0x0003, 0x0011, 0x0020, 0x0074, 0x010D, 0x0863, 0x0860, 0x000A,
2217 0x0075, 0x0001, 0x0000, 0x000B, 0x000A, 0x0018, 0x0038, 0x0042,
2218 0x010F, 0x010E, 0x0219, 0x10C3, 0x10C2, 0x10C5, 0x10C4, 0x000F,
2219 0x0004, 0x0019, 0x000B, 0x0039, 0x0009, 0x001B, 0x001A, 0x003B,
2220 ], [
2221 0x0005, 0x0001, 0x003E, 0x0001, 0x00E2, 0x1C6F, 0x38D9, 0x0039,
2222 0x001F, 0x0002, 0x0001, 0x0009, 0x0008, 0x0000, 0x0070, 0x01C7,
2223 0x038C, 0x071A, 0x38D8, 0x38DB, 0x38DA, 0x38DD, 0x38DC, 0x000D,
2224 0x001D, 0x000E, 0x003F, 0x003C, 0x000C, 0x0006, 0x003D, 0x001E,
2225 ], [
2226 0x0006, 0x000B, 0x0011, 0x001E, 0x0074, 0x03AA, 0x1D5C, 0x0001,
2227 0x0021, 0x0001, 0x0002, 0x0007, 0x0006, 0x003E, 0x00EB, 0x01D4,
2228 0x0EAF, 0x3ABB, 0x3ABA, 0x1D59, 0x1D58, 0x1D5B, 0x1D5A, 0x000A,
2229 0x001C, 0x0001, 0x003F, 0x003B, 0x0001, 0x0009, 0x0020, 0x0000,
2230 ], [
2231 0x0004, 0x000A, 0x0017, 0x0004, 0x0016, 0x016A, 0x16B1, 0x0017,
2232 0x005B, 0x0006, 0x0007, 0x0001, 0x0000, 0x000A, 0x02D7, 0x0B5A,
2233 0x16B0, 0x16B3, 0x16B2, 0x2D6D, 0x2D6C, 0x2D6F, 0x2D6E, 0x0006,
2234 0x000A, 0x0004, 0x002C, 0x0017, 0x0003, 0x0007, 0x0016, 0x00B4,
2235 ], [
2236 0x0005, 0x000D, 0x0005, 0x0009, 0x0033, 0x0193, 0x192C, 0x0061,
2237 0x0031, 0x0000, 0x0007, 0x0010, 0x0011, 0x00C8, 0x192F, 0x325B,
2238 0x325A, 0x1929, 0x1928, 0x192B, 0x192A, 0x325D, 0x325C, 0x0018,
2239 0x001A, 0x001B, 0x0065, 0x0019, 0x0004, 0x0007, 0x0060, 0x0324,
2240 ], [
2241 0x0006, 0x0000, 0x0002, 0x000F, 0x0039, 0x01D9, 0x1D82, 0x0761,
2242 0x03BE, 0x0001, 0x0002, 0x000F, 0x000E, 0x0762, 0x3B07, 0x3B06,
2243 0x3B1D, 0x3B1C, 0x3B1F, 0x3B1E, 0x3B19, 0x3B18, 0x3B1B, 0x0038,
2244 0x01DE, 0x00ED, 0x03BF, 0x00EE, 0x003A, 0x0006, 0x0EC0, 0x3B1A,
2245 ], [
2246 0x0000, 0x0002, 0x000F, 0x0006, 0x001C, 0x01D0, 0x0E8C, 0x1D1B,
2247 0x1D1A, 0x0003, 0x0002, 0x00EA, 0x00E9, 0x0E89, 0x0E88, 0x0E8B,
2248 0x0E8A, 0x1D65, 0x1D64, 0x1D67, 0x1D66, 0x1D61, 0x1D60, 0x03AD,
2249 0x1D63, 0x1D62, 0x1D1D, 0x1D1C, 0x003B, 0x01D7, 0x1D1F, 0x1D1E,
2250 ], [
2251 0x0002, 0x000F, 0x001C, 0x000C, 0x003B, 0x01AC, 0x1AD8, 0x35B3,
2252 0x35B2, 0x0001, 0x0000, 0x0069, 0x0068, 0x35BD, 0x35BC, 0x35BF,
2253 0x35BE, 0x35B9, 0x35B8, 0x35BB, 0x35BA, 0x35B5, 0x35B4, 0x01A9,
2254 0x01A8, 0x035A, 0x00D7, 0x00D5, 0x003A, 0x001B, 0x35B7, 0x35B6,
2255 ]
2256 ];
2257
2258 const VP31_AC_CAT3_BITS: [[u8; 32]; 16] = [
2259 [
2260 3, 5, 7, 7, 9, 12, 12, 5, 7, 3, 3, 4, 4, 4, 5, 7,
2261 7, 8, 10, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 6, 5, 5,
2262 ], [
2263 3, 5, 6, 6, 7, 10, 13, 5, 6, 3, 3, 4, 4, 5, 6, 8,
2264 10, 10, 13, 13, 13, 12, 12, 4, 5, 5, 5, 6, 4, 5, 5, 5,
2265 ], [
2266 3, 4, 6, 5, 7, 9, 13, 6, 6, 3, 3, 4, 4, 5, 8, 10,
2267 13, 13, 13, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 4, 6, 6,
2268 ], [
2269 3, 4, 5, 4, 6, 8, 12, 7, 7, 3, 3, 4, 4, 7, 9, 13,
2270 13, 12, 12, 12, 12, 12, 12, 4, 5, 5, 6, 6, 4, 4, 7, 7,
2271 ], [
2272 3, 4, 5, 4, 5, 7, 10, 10, 7, 3, 3, 5, 5, 8, 13, 14,
2273 14, 13, 13, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 3, 7, 10,
2274 ], [
2275 3, 4, 3, 3, 4, 6, 11, 13, 8, 3, 3, 6, 6, 13, 13, 13,
2276 13, 13, 13, 13, 14, 14, 14, 3, 6, 8, 9, 8, 6, 5, 12, 14,
2277 ], [
2278 3, 4, 3, 3, 4, 6, 11, 13, 8, 3, 3, 6, 6, 13, 13, 13,
2279 13, 13, 13, 13, 14, 14, 14, 3, 6, 8, 9, 8, 6, 5, 12, 14,
2280 ], [
2281 3, 4, 3, 3, 4, 6, 11, 13, 8, 3, 3, 6, 6, 13, 13, 13,
2282 13, 13, 13, 13, 14, 14, 14, 3, 6, 8, 9, 8, 6, 5, 12, 14,
2283 ], [
2284 3, 5, 6, 7, 9, 12, 12, 5, 7, 3, 3, 4, 4, 5, 6, 7,
2285 9, 9, 10, 13, 13, 13, 13, 4, 4, 5, 5, 6, 4, 5, 5, 6,
2286 ], [
2287 3, 4, 6, 5, 8, 13, 14, 6, 6, 3, 3, 4, 4, 5, 7, 9,
2288 10, 11, 14, 14, 14, 14, 14, 4, 5, 5, 6, 6, 4, 4, 6, 6,
2289 ], [
2290 3, 4, 5, 5, 7, 10, 13, 6, 6, 3, 3, 4, 4, 6, 8, 9,
2291 12, 14, 14, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 4, 6, 6,
2292 ], [
2293 3, 4, 5, 4, 6, 9, 13, 7, 7, 3, 3, 4, 4, 6, 10, 12,
2294 13, 13, 13, 14, 14, 14, 14, 4, 5, 5, 6, 6, 4, 4, 7, 8,
2295 ], [
2296 3, 4, 4, 4, 6, 9, 13, 8, 7, 2, 3, 5, 5, 8, 13, 14,
2297 14, 13, 13, 13, 13, 14, 14, 5, 6, 6, 7, 6, 4, 4, 8, 10,
2298 ], [
2299 3, 3, 4, 4, 6, 9, 13, 11, 10, 2, 2, 6, 6, 11, 14, 14,
2300 14, 14, 14, 14, 14, 14, 14, 6, 9, 8, 10, 8, 6, 5, 12, 14,
2301 ], [
2302 2, 3, 5, 4, 6, 10, 13, 14, 14, 2, 2, 9, 9, 13, 13, 13,
2303 13, 14, 14, 14, 14, 14, 14, 11, 14, 14, 14, 14, 7, 10, 14, 14,
2304 ], [
2305 2, 4, 5, 4, 6, 9, 13, 14, 14, 2, 2, 7, 7, 14, 14, 14,
2306 14, 14, 14, 14, 14, 14, 14, 9, 9, 10, 8, 8, 6, 5, 14, 14,
2307 ]
2308 ];
2309
2310 const VP31_DC_WEIGHTS: [[i16; 5]; 16] = [
2311 [ 0, 0, 0, 0, 0 ],
2312 [ 1, 0, 0, 0, 1 ],
2313 [ 0, 1, 0, 0, 1 ],
2314 [ 1, 0, 0, 0, 1 ],
2315
2316 [ 0, 0, 1, 0, 1 ],
2317 [ 1, 0, 1, 0, 2 ],
2318 [ 0, 0, 1, 0, 1 ],
2319 [ 29, -26, 29, 0, 32 ],
2320
2321 [ 0, 0, 0, 1, 1 ],
2322 [ 75, 0, 0, 53, 128 ],
2323 [ 0, 1, 0, 1, 2 ],
2324 [ 75, 0, 0, 53, 128 ],
2325
2326 [ 0, 0, 1, 0, 1 ],
2327 [ 75, 0, 0, 53, 128 ],
2328 [ 0, 3, 10, 3, 16 ],
2329 [ 29, -26, 29, 0, 32 ],
2330 ];
2331
2332 const VP30_DC_SCALES: [i16; 64] = [
2333 24, 20, 20, 20, 20, 20, 20, 20,
2334 19, 19, 19, 19, 18, 18, 18, 18,
2335 17, 17, 17, 17, 16, 16, 15, 15,
2336 14, 14, 13, 13, 12, 12, 11, 11,
2337 10, 10, 9, 9, 8, 8, 7, 7,
2338 6, 6, 6, 6, 5, 5, 5, 5,
2339 4, 4, 4, 4, 3, 3, 3, 3,
2340 2, 2, 2, 2, 1, 1, 1, 1
2341 ];
2342
2343 const VP30_AC_SCALES: [i16; 64] = [
2344 3000, 2500, 2000, 1500, 1200, 1000, 900, 800,
2345 750, 700, 650, 630, 600, 550, 500, 450,
2346 410, 380, 350, 320, 290, 260, 240, 220,
2347 200, 180, 165, 150, 140, 130, 120, 115,
2348 110, 100, 95, 90, 85, 80, 75, 70,
2349 67, 65, 63, 61, 57, 55, 53, 50,
2350 49, 46, 44, 42, 39, 36, 33, 30,
2351 27, 24, 21, 19, 17, 15, 12, 10
2352 ];
2353
2354 const VP30_DC_CODES: [[u16; 32]; 5] = [
2355 [
2356 0x0005, 0x002D, 0x0004, 0x0009, 0x0088, 0x0225, 0x0224, 0x0005,
2357 0x0011, 0x0007, 0x0006, 0x0009, 0x000A, 0x0007, 0x0017, 0x000C,
2358 0x002C, 0x0005, 0x0008, 0x0003, 0x0012, 0x0010, 0x0113, 0x0003,
2359 0x0010, 0x0000, 0x0013, 0x001A, 0x0023, 0x0045, 0x0001, 0x001B
2360 ], [
2361 0x000B, 0x0012, 0x0029, 0x0010, 0x000D, 0x00A2, 0x0020, 0x0009,
2362 0x0050, 0x0007, 0x0006, 0x0006, 0x0005, 0x0002, 0x0008, 0x0027,
2363 0x0005, 0x0022, 0x0023, 0x0057, 0x00A3, 0x0011, 0x0021, 0x0007,
2364 0x0000, 0x0009, 0x002A, 0x0003, 0x0007, 0x0026, 0x000C, 0x0056
2365 ], [
2366 0x000D, 0x0018, 0x0009, 0x0017, 0x0033, 0x0056, 0x00F7, 0x00F1,
2367 0x007A, 0x0000, 0x0007, 0x0009, 0x0008, 0x0005, 0x000D, 0x002D,
2368 0x0010, 0x001D, 0x001C, 0x0057, 0x00CB, 0x00F6, 0x00F0, 0x0014,
2369 0x000C, 0x002C, 0x0011, 0x001F, 0x002A, 0x0064, 0x00CA, 0x0079
2370 ], [
2371 0x000F, 0x001A, 0x0013, 0x001B, 0x003B, 0x0072, 0x01D3, 0x0707,
2372 0x0E0D, 0x0001, 0x0000, 0x000C, 0x000B, 0x0008, 0x0012, 0x002A,
2373 0x0073, 0x0028, 0x0075, 0x0056, 0x0052, 0x01C0, 0x0E0C, 0x0071,
2374 0x0057, 0x00E1, 0x00A6, 0x00E8, 0x00A7, 0x03A5, 0x03A4, 0x0382
2375 ], [
2376 0x000F, 0x001B, 0x0014, 0x001D, 0x0010, 0x0073, 0x00E2, 0x023C,
2377 0x11C9, 0x0001, 0x0000, 0x000C, 0x000B, 0x0009, 0x0015, 0x0035,
2378 0x0072, 0x0034, 0x0022, 0x0070, 0x0046, 0x011D, 0x11C8, 0x01C7,
2379 0x01C6, 0x0238, 0x047E, 0x023E, 0x0473, 0x08E5, 0x023D, 0x047F
2380 ]
2381 ];
2382 const VP30_DC_BITS: [[u8; 32]; 5] = [
2383 [
2384 4, 6, 6, 6, 8, 10, 10, 6, 7, 3, 3, 4, 4, 4, 5, 5,
2385 6, 5, 5, 5, 6, 7, 9, 4, 5, 5, 6, 6, 6, 7, 5, 6
2386 ], [
2387 4, 5, 6, 5, 6, 8, 9, 7, 7, 3, 3, 4, 4, 4, 5, 6,
2388 6, 6, 6, 7, 8, 8, 9, 4, 4, 5, 6, 5, 5, 6, 6, 7
2389 ], [
2390 4, 5, 5, 5, 6, 7, 9, 9, 8, 2, 3, 4, 4, 4, 5, 6,
2391 6, 6, 6, 7, 8, 9, 9, 5, 5, 6, 6, 6, 6, 7, 8, 8
2392 ], [
2393 4, 5, 5, 5, 6, 7, 9, 11, 12, 2, 2, 4, 4, 4, 5, 6,
2394 7, 6, 7, 7, 7, 9, 12, 7, 7, 8, 8, 8, 8, 10, 10, 10
2395 ], [
2396 4, 5, 5, 5, 5, 7, 8, 10, 13, 2, 2, 4, 4, 4, 5, 6,
2397 7, 6, 6, 7, 7, 9, 13, 9, 9, 10, 11, 10, 11, 12, 10, 11
2398 ]
2399 ];
2400 const VP30_AC_INTRA_CODES: [[u16; 32]; 5] = [
2401 [
2402 0x0008, 0x0033, 0x0008, 0x004B, 0x0089, 0x0221, 0x0220, 0x001F,
2403 0x0045, 0x0000, 0x000E, 0x000B, 0x000A, 0x000D, 0x0006, 0x001E,
2404 0x000A, 0x0018, 0x0013, 0x0005, 0x0009, 0x0046, 0x0111, 0x0007,
2405 0x000B, 0x0032, 0x0010, 0x004A, 0x0024, 0x0047, 0x0003, 0x0009
2406 ], [
2407 0x000E, 0x000E, 0x007B, 0x001E, 0x007E, 0x03EF, 0x07DD, 0x0018,
2408 0x00FA, 0x0002, 0x0000, 0x000A, 0x0008, 0x000B, 0x0003, 0x0012,
2409 0x0033, 0x000C, 0x003C, 0x001A, 0x007F, 0x01F6, 0x07DC, 0x000D,
2410 0x0013, 0x0004, 0x001B, 0x007A, 0x0032, 0x007C, 0x001F, 0x0005
2411 ], [
2412 0x0000, 0x0018, 0x0034, 0x000C, 0x006A, 0x01F9, 0x07EA, 0x0016,
2413 0x0FD7, 0x0002, 0x0001, 0x000A, 0x0009, 0x0007, 0x001B, 0x003E,
2414 0x0020, 0x0021, 0x006B, 0x01FB, 0x03F4, 0x1FAD, 0x1FAC, 0x000E,
2415 0x0019, 0x0011, 0x002F, 0x007F, 0x002E, 0x01F8, 0x001E, 0x000D
2416 ], [
2417 0x000E, 0x0016, 0x002E, 0x0003, 0x006E, 0x008B, 0x0113, 0x0018,
2418 0x0221, 0x0001, 0x0002, 0x000A, 0x0009, 0x0007, 0x001A, 0x0002,
2419 0x001B, 0x0023, 0x006F, 0x008A, 0x0111, 0x0441, 0x0440, 0x000F,
2420 0x0019, 0x0010, 0x0036, 0x001A, 0x002F, 0x0112, 0x0000, 0x000C
2421 ], [
2422 0x000E, 0x000F, 0x001B, 0x0033, 0x005A, 0x00B6, 0x0008, 0x001A,
2423 0x004D, 0x0001, 0x0002, 0x000A, 0x0009, 0x0008, 0x001B, 0x0003,
2424 0x002C, 0x002E, 0x0005, 0x00B7, 0x0027, 0x0099, 0x0098, 0x000F,
2425 0x0018, 0x000E, 0x002F, 0x001A, 0x0032, 0x0012, 0x0000, 0x000C
2426 ]
2427 ];
2428 const VP30_AC_INTRA_BITS: [[u8; 32]; 5] = [
2429 [
2430 4, 6, 6, 7, 9, 11, 11, 5, 8, 3, 4, 4, 4, 4, 4, 5,
2431 5, 5, 5, 5, 6, 8, 10, 4, 5, 6, 6, 7, 6, 8, 4, 5
2432 ], [
2433 4, 5, 7, 6, 8, 11, 12, 5, 9, 3, 3, 4, 4, 4, 4, 5,
2434 6, 5, 6, 6, 8, 10, 12, 4, 5, 5, 6, 7, 6, 8, 5, 5
2435 ], [
2436 3, 5, 6, 5, 7, 9, 11, 5, 12, 3, 3, 4, 4, 4, 5, 6,
2437 6, 6, 7, 9, 10, 13, 13, 4, 5, 5, 6, 7, 6, 9, 5, 5
2438 ], [
2439 4, 5, 6, 5, 7, 8, 9, 5, 10, 3, 3, 4, 4, 4, 5, 5,
2440 6, 6, 7, 8, 9, 11, 11, 4, 5, 5, 6, 6, 6, 9, 4, 5
2441 ], [
2442 4, 5, 6, 6, 7, 8, 7, 5, 10, 3, 3, 4, 4, 4, 5, 5,
2443 6, 6, 6, 8, 9, 11, 11, 4, 5, 5, 6, 6, 6, 8, 4, 5
2444 ]
2445 ];
2446 const VP30_AC_INTER_CODES: [[u16; 32]; 5] = [
2447 [
2448 0x000D, 0x0038, 0x0061, 0x0060, 0x0393, 0x1C95, 0x1C94, 0x0014,
2449 0x0073, 0x0001, 0x0000, 0x000B, 0x0009, 0x001D, 0x000E, 0x0022,
2450 0x0046, 0x0047, 0x00E5, 0x01C8, 0x0724, 0x1C97, 0x1C96, 0x000F,
2451 0x0006, 0x0019, 0x000F, 0x0031, 0x0004, 0x0010, 0x0005, 0x0015
2452 ], [
2453 0x0004, 0x001B, 0x0030, 0x0034, 0x00D5, 0x06B3, 0x3595, 0x0031,
2454 0x001A, 0x0002, 0x0001, 0x001F, 0x001E, 0x000C, 0x001B, 0x00D7,
2455 0x00D4, 0x01AD, 0x0358, 0x0D64, 0x3594, 0x3597, 0x3596, 0x0000,
2456 0x000A, 0x001D, 0x0017, 0x0039, 0x0007, 0x0019, 0x0016, 0x0038
2457 ], [
2458 0x0005, 0x0009, 0x001A, 0x001E, 0x001F, 0x00E2, 0x038E, 0x0070,
2459 0x003B, 0x0001, 0x0000, 0x0019, 0x0018, 0x001E, 0x003A, 0x01C6,
2460 0x071E, 0x0E3E, 0x1C7E, 0x71FD, 0x71FC, 0x71FF, 0x71FE, 0x0002,
2461 0x0008, 0x001D, 0x001B, 0x0039, 0x001F, 0x000D, 0x000C, 0x001C
2462 ], [
2463 0x0003, 0x000B, 0x001C, 0x000D, 0x0004, 0x000A, 0x0076, 0x00E8,
2464 0x01DC, 0x0001, 0x0000, 0x0033, 0x0032, 0x00E9, 0x03BB, 0x0774,
2465 0x1DD5, 0x3BAD, 0x3BAC, 0x3BAF, 0x3BAE, 0x3BA9, 0x3BA8, 0x0004,
2466 0x000A, 0x001F, 0x001E, 0x0030, 0x000B, 0x0075, 0x0031, 0x00EF
2467 ], [
2468 0x0009, 0x001E, 0x000F, 0x000E, 0x000C, 0x0008, 0x0001, 0x00E3,
2469 0x00E2, 0x0002, 0x0000, 0x003A, 0x0039, 0x0070, 0x01DC, 0x0776,
2470 0x0775, 0x0EEF, 0x0EE8, 0x1DD3, 0x1DD2, 0x1DDD, 0x1DDC, 0x0005,
2471 0x001F, 0x001B, 0x0006, 0x006A, 0x0034, 0x0076, 0x006B, 0x00EF
2472 ]
2473 ];
2474 const VP30_AC_INTER_BITS: [[u8; 32]; 5] = [
2475 [
2476 4, 6, 7, 7, 10, 13, 13, 5, 7, 3, 3, 4, 4, 5, 5, 6,
2477 7, 7, 8, 9, 11, 13, 13, 4, 4, 5, 5, 6, 4, 5, 4, 5
2478 ], [
2479 3, 5, 6, 6, 8, 11, 14, 6, 6, 3, 3, 5, 5, 5, 6, 8,
2480 8, 9, 10, 12, 14, 14, 14, 3, 4, 5, 5, 6, 4, 5, 5, 6
2481 ], [
2482 3, 4, 5, 5, 6, 8, 10, 7, 7, 3, 3, 5, 5, 6, 7, 9,
2483 11, 12, 13, 15, 15, 15, 15, 3, 4, 5, 5, 6, 5, 5, 5, 6
2484 ], [
2485 3, 4, 5, 4, 4, 5, 7, 8, 9, 3, 3, 6, 6, 8, 10, 11,
2486 13, 14, 14, 14, 14, 14, 14, 3, 4, 5, 5, 6, 5, 7, 6, 8
2487 ], [
2488 4, 5, 5, 4, 4, 4, 3, 9, 9, 3, 3, 7, 7, 8, 10, 12,
2489 12, 13, 13, 14, 14, 14, 14, 3, 5, 5, 4, 7, 6, 8, 7, 9
2490 ]
2491 ];
2492 const VP30_MBTYPE_CODES: [u8; 7] = [ 0x00, 0x08, 0x0A, 0x03, 0x0B, 0x13, 0x12 ];
2493 const VP30_MBTYPE_BITS: [u8; 7] = [ 1, 4, 4, 2, 4, 5, 5 ];
2494 const VP30_MBTYPE_SYMS: [VPMBType; 7] = [
2495 VPMBType::InterNoMV, VPMBType::Intra, VPMBType::InterMV, VPMBType::InterNearest,
2496 VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
2497 ];