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