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