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