1d85a7915d85dc0961b240b9536dcc408cf471e3
[nihav.git] / nihav-duck / src / codecs / vp3.rs
1 use std::mem;
2 use std::ptr;
3 use nihav_core::codecs::*;
4 use nihav_core::codecs::blockdsp::*;
5 use nihav_core::io::bitreader::*;
6 use nihav_core::io::codebook::*;
7 use nihav_core::io::intcode::*;
8 use super::vpcommon::*;
9
10 #[derive(Clone,Copy,Debug,PartialEq)]
11 enum SBState {
12 Coded,
13 Partial,
14 Uncoded,
15 }
16
17 struct VP3Codes {
18 dc_cb: [Codebook<u8>; 16],
19 ac0_cb: [Codebook<u8>; 16],
20 ac1_cb: [Codebook<u8>; 16],
21 ac2_cb: [Codebook<u8>; 16],
22 ac3_cb: [Codebook<u8>; 16],
23 }
24
25 fn map_idx(idx: usize) -> u8 {
26 idx as u8
27 }
28
29 impl VP3Codes {
30 fn new() -> Self {
31 let mut dc_cb: [Codebook<u8>; 16];
32 let mut ac0_cb: [Codebook<u8>; 16];
33 let mut ac1_cb: [Codebook<u8>; 16];
34 let mut ac2_cb: [Codebook<u8>; 16];
35 let mut ac3_cb: [Codebook<u8>; 16];
36 unsafe {
37 dc_cb = mem::uninitialized();
38 ac0_cb = mem::uninitialized();
39 ac1_cb = mem::uninitialized();
40 ac2_cb = mem::uninitialized();
41 ac3_cb = mem::uninitialized();
42 for i in 0..16 {
43 let mut cr = TableCodebookDescReader::new(&VP3_DC_CODES[i], &VP3_DC_BITS[i], map_idx);
44 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
45 ptr::write(&mut dc_cb[i], cb);
46
47 let mut cr = TableCodebookDescReader::new(&VP3_AC_CAT0_CODES[i], &VP3_AC_CAT0_BITS[i], map_idx);
48 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
49 ptr::write(&mut ac0_cb[i], cb);
50 let mut cr = TableCodebookDescReader::new(&VP3_AC_CAT1_CODES[i], &VP3_AC_CAT1_BITS[i], map_idx);
51 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
52 ptr::write(&mut ac1_cb[i], cb);
53 let mut cr = TableCodebookDescReader::new(&VP3_AC_CAT2_CODES[i], &VP3_AC_CAT2_BITS[i], map_idx);
54 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
55 ptr::write(&mut ac2_cb[i], cb);
56 let mut cr = TableCodebookDescReader::new(&VP3_AC_CAT3_CODES[i], &VP3_AC_CAT3_BITS[i], map_idx);
57 let cb = Codebook::new(&mut cr, CodebookMode::MSB).unwrap();
58 ptr::write(&mut ac3_cb[i], cb);
59 }
60 }
61 Self { dc_cb, ac0_cb, ac1_cb, ac2_cb, ac3_cb }
62 }
63 }
64
65 #[derive(Clone)]
66 struct Block {
67 btype: VPMBType,
68 coeffs: [i16; 64],
69 has_ac: bool,
70 idx: usize,
71 mv: MV,
72 coded: bool,
73 }
74
75 impl Block {
76 fn new() -> Self {
77 Self {
78 btype: VPMBType::Intra,
79 coeffs: [0; 64],
80 has_ac: false,
81 idx: 0,
82 mv: ZERO_MV,
83 coded: false,
84 }
85 }
86 }
87
88 type ReadRunFunc = fn (&mut BitReader) -> DecoderResult<usize>;
89
90 const VP3_LONG_RUN_BASE: [usize; 7] = [ 1, 2, 4, 6, 10, 18, 34 ];
91 const VP3_LONG_RUN_BITS: [u8; 7] = [ 0, 1, 1, 2, 3, 4, 12 ];
92 fn read_long_run(br: &mut BitReader) -> DecoderResult<usize> {
93 let pfx = br.read_code(UintCodeType::LimitedUnary(6, 0))? as usize;
94 if pfx == 0 { return Ok(1); }
95 Ok(VP3_LONG_RUN_BASE[pfx] + (br.read(VP3_LONG_RUN_BITS[pfx])? as usize))
96 }
97
98 const VP3_SHORT_RUN_BASE: [usize; 6] = [ 1, 3, 5, 7, 11, 15 ];
99 const VP3_SHORT_RUN_BITS: [u8; 6] = [ 1, 1, 1, 2, 2, 4 ];
100 fn read_short_run(br: &mut BitReader) -> DecoderResult<usize> {
101 let pfx = br.read_code(UintCodeType::LimitedUnary(5, 0))? as usize;
102 Ok(VP3_SHORT_RUN_BASE[pfx] + (br.read(VP3_SHORT_RUN_BITS[pfx])? as usize))
103 }
104
105 struct BitRunDecoder {
106 value: bool,
107 run: usize,
108 read_run: ReadRunFunc,
109 }
110
111 impl BitRunDecoder {
112 fn new(br: &mut BitReader, read_run: ReadRunFunc) -> DecoderResult<Self> {
113 let value = !br.read_bool()?; // it will be flipped before run decoding
114 Ok(Self { value, run: 0, read_run })
115 }
116 fn get_val(&mut self, br: &mut BitReader) -> DecoderResult<bool> {
117 if self.run == 0 {
118 self.value = !self.value;
119 self.run = (self.read_run)(br)?;
120 }
121 self.run -= 1;
122 Ok(self.value)
123 }
124 }
125
126 struct VP34Decoder {
127 info: NACodecInfoRef,
128 width: usize,
129 height: usize,
130 mb_w: usize,
131 mb_h: usize,
132 version: u8,
133 is_intra: bool,
134 quant: usize,
135 shuf: VPShuffler,
136 codes: VP3Codes,
137 loop_str: i16,
138
139 blocks: Vec<Block>,
140 y_blocks: usize,
141 y_sbs: usize,
142 qmat_y: [i16; 64],
143 qmat_c: [i16; 64],
144 qmat_inter: [i16; 64],
145
146 eob_run: usize,
147 last_dc: [i16; 3],
148
149 blk_addr: Vec<usize>,
150 sb_info: Vec<SBState>,
151 sb_blocks: Vec<u8>,
152 }
153
154 fn read_mv_comp_packed(br: &mut BitReader) -> DecoderResult<i16> {
155 let code = br.read(3)?;
156 match code {
157 0 => Ok(0),
158 1 => Ok(1),
159 2 => Ok(-1),
160 3 => if br.read_bool()? { Ok(-2) } else { Ok(2) },
161 4 => if br.read_bool()? { Ok(-3) } else { Ok(3) },
162 5 => {
163 let val = (br.read(2)? as i16) + 4;
164 if br.read_bool()? {
165 Ok(-val)
166 } else {
167 Ok(val)
168 }
169 },
170 6 => {
171 let val = (br.read(3)? as i16) + 8;
172 if br.read_bool()? {
173 Ok(-val)
174 } else {
175 Ok(val)
176 }
177 },
178 _ => {
179 let val = (br.read(4)? as i16) + 16;
180 if br.read_bool()? {
181 Ok(-val)
182 } else {
183 Ok(val)
184 }
185 },
186 }
187 }
188
189 fn read_mv_packed(br: &mut BitReader) -> DecoderResult<MV> {
190 let x = read_mv_comp_packed(br)?;
191 let y = read_mv_comp_packed(br)?;
192 Ok(MV{ x, y })
193 }
194
195 fn read_mv_comp_raw(br: &mut BitReader) -> DecoderResult<i16> {
196 let val = br.read(5)? as i16;
197 if br.read_bool()? {
198 Ok(-val)
199 } else {
200 Ok(val)
201 }
202 }
203
204 fn read_mv_raw(br: &mut BitReader) -> DecoderResult<MV> {
205 let x = read_mv_comp_raw(br)?;
206 let y = read_mv_comp_raw(br)?;
207 Ok(MV{ x, y })
208 }
209
210 fn rescale_qmat(dst_qmat: &mut [i16; 64], base_qmat: &[i16; 64], dc_quant: i16, ac_quant: i16) {
211 for (dst, src) in dst_qmat.iter_mut().zip(base_qmat.iter()) {
212 *dst = (src.wrapping_mul(ac_quant) / 100).max(2) << 2;
213 }
214 dst_qmat[0] = (base_qmat[0] * dc_quant / 100).max(4) << 2;
215 }
216
217 macro_rules! fill_dc_pred {
218 ($self: expr, $ref_id: expr, $pred: expr, $pp: expr, $bit: expr, $idx: expr) => {
219 if $self.blocks[$idx].coded && $self.blocks[$idx].btype.get_ref_id() == $ref_id {
220 $pred[$bit] = $self.blocks[$idx].coeffs[0] as i32;
221 $pp |= 1 << $bit;
222 }
223 };
224 }
225
226 fn vp3_interp00(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
227 {
228 let mut didx = 0;
229 let mut sidx = 0;
230 for _ in 0..bh {
231 for x in 0..bw { dst[didx + x] = src[sidx + x]; }
232 didx += dstride;
233 sidx += sstride;
234 }
235 }
236
237 fn vp3_interp01(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
238 {
239 let mut didx = 0;
240 let mut sidx = 0;
241 for _ in 0..bh {
242 for x in 0..bw { dst[didx + x] = (((src[sidx + x] as u16) + (src[sidx + x + 1] as u16)) >> 1) as u8; }
243 didx += dstride;
244 sidx += sstride;
245 }
246 }
247
248 fn vp3_interp10(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
249 {
250 let mut didx = 0;
251 let mut sidx = 0;
252 for _ in 0..bh {
253 for x in 0..bw { dst[didx + x] = (((src[sidx + x] as u16) + (src[sidx + x + sstride] as u16)) >> 1) as u8; }
254 didx += dstride;
255 sidx += sstride;
256 }
257 }
258
259 fn vp3_interp11(dst: &mut [u8], dstride: usize, src: &[u8], sstride: usize, bw: usize, bh: usize)
260 {
261 let mut didx = 0;
262 let mut sidx = 0;
263 for _ in 0..bh {
264 for x in 0..bw {
265 dst[didx + x] = (((src[sidx + x] as u16) +
266 (src[sidx + x + 1] as u16) +
267 (src[sidx + x + sstride] as u16) +
268 (src[sidx + x + sstride + 1] as u16)) >> 2) as u8;
269 }
270 didx += dstride;
271 sidx += sstride;
272 }
273 }
274
275 fn vp3_loop_filter(data: &mut [u8], mut off: usize, step: usize, stride: usize, loop_str: i16) {
276 for _ in 0..8 {
277 let a = data[off - step * 2] as i16;
278 let b = data[off - step] as i16;
279 let c = data[off] as i16;
280 let d = data[off + step] as i16;
281 let mut diff = ((a - d) + 3 * (c - b) + 4) >> 3;
282 if diff.abs() >= 2 * loop_str {
283 diff = 0;
284 } else if diff.abs() >= loop_str {
285 if diff < 0 {
286 diff = -diff - 2 * loop_str;
287 } else {
288 diff = -diff + 2 * loop_str;
289 }
290 }
291 if diff != 0 {
292 data[off - step] = (b + diff).max(0).min(255) as u8;
293 data[off] = (c - diff).max(0).min(255) as u8;
294 }
295
296 off += stride;
297 }
298 }
299
300 fn vp3_loop_filter_v(frm: &mut NASimpleVideoFrame<u8>, x: usize, y: usize, plane: usize, loop_str: i16) {
301 let off = frm.offset[plane] + x + y * frm.stride[plane];
302 vp3_loop_filter(frm.data, off, 1, frm.stride[plane], loop_str);
303 }
304
305 fn vp3_loop_filter_h(frm: &mut NASimpleVideoFrame<u8>, x: usize, y: usize, plane: usize, loop_str: i16) {
306 let off = frm.offset[plane] + x + y * frm.stride[plane];
307 vp3_loop_filter(frm.data, off, frm.stride[plane], 1, loop_str);
308 }
309
310 pub const VP3_INTERP_FUNCS: &[blockdsp::BlkInterpFunc] = &[ vp3_interp00, vp3_interp01, vp3_interp10, vp3_interp11 ];
311
312 impl VP34Decoder {
313 fn new(version: u8) -> Self {
314 Self {
315 info: NACodecInfoRef::default(),
316 width: 0,
317 height: 0,
318 mb_w: 0,
319 mb_h: 0,
320 version,
321 is_intra: true,
322 quant: 0,
323 shuf: VPShuffler::new(),
324 codes: VP3Codes::new(),
325 loop_str: 0,
326
327 blocks: Vec::new(),
328 y_blocks: 0,
329 y_sbs: 0,
330
331 qmat_y: [0; 64],
332 qmat_c: [0; 64],
333 qmat_inter: [0; 64],
334
335 eob_run: 0,
336 last_dc: [0; 3],
337
338 blk_addr: Vec::new(),
339 sb_info: Vec::new(),
340 sb_blocks: Vec::new(),
341 }
342 }
343 fn parse_header(&mut self, br: &mut BitReader) -> DecoderResult<()> {
344 self.is_intra = !br.read_bool()?;
345 br.skip(1)?;
346 self.quant = br.read(6)? as usize;
347 self.loop_str = VP3_LOOP_STRENGTH[self.quant];
348 println!("quant = {}", self.quant);
349 if self.is_intra {
350 if br.peek(8) != 0 {
351 unimplemented!();
352 }
353 let version = br.read(13)?;
354 println!("intra, ver {} (self {})", version, self.version);
355 validate!((self.version == 3 && version == 1) || (self.version == 4 && version == 3));
356 let coding_type = br.read(1)?;
357 validate!(coding_type == 0);
358 br.skip(2)?;
359 }
360 Ok(())
361 }
362 fn unpack_sb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
363 let mut has_uncoded = false;
364 let mut has_partial = false;
365 {
366 let mut brun = BitRunDecoder::new(br, read_long_run)?;
367 for sb in self.sb_info.iter_mut() {
368 if brun.get_val(br)? {
369 *sb = SBState::Partial;
370 has_partial = true;
371 } else {
372 *sb = SBState::Uncoded;
373 has_uncoded = true;
374 }
375 }
376 }
377 if has_uncoded {
378 let mut brun = BitRunDecoder::new(br, read_long_run)?;
379 let mut cur_blk = 0;
380 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()) {
381 let nblks = *nblk as usize;
382 if *sb != SBState::Partial && brun.get_val(br)? {
383 *sb = SBState::Coded;
384 for _ in 0..nblks {
385 let blk_idx = self.blk_addr[cur_blk] >> 2;
386 self.blocks[blk_idx].coded = true;
387 cur_blk += 1;
388 }
389 } else {
390 for _ in 0..nblks {
391 let blk_idx = self.blk_addr[cur_blk] >> 2;
392 self.blocks[blk_idx].coded = false;
393 cur_blk += 1;
394 }
395 }
396 }
397 }
398 if has_partial {
399 let mut brun = BitRunDecoder::new(br, read_short_run)?;
400 let mut cur_blk = 0;
401 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()) {
402 let nblks = *nblk as usize;
403 if *sb == SBState::Partial {
404 for _ in 0..nblks {
405 let blk_idx = self.blk_addr[cur_blk] >> 2;
406 self.blocks[blk_idx].coded = brun.get_val(br)?;
407 cur_blk += 1;
408 }
409 } else {
410 cur_blk += nblks;
411 }
412 }
413 }
414 Ok(())
415 }
416 fn unpack_mb_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
417 let mut modes = [VPMBType::InterNoMV; 8];
418 let alphabet = br.read(3)? as usize;
419 let raw_modes = alphabet >= 7;
420 if alphabet == 0 {
421 for mode in VP3_DEFAULT_MB_MODES.iter() {
422 modes[br.read(3)? as usize] = *mode;
423 }
424 } else if alphabet < 7 {
425 modes.copy_from_slice(&VP3_MB_MODES[alphabet - 1]);
426 }
427
428 let mut cur_blk = 0;
429 for (sb, nblk) in self.sb_info.iter_mut().zip(self.sb_blocks.iter()).take(self.y_sbs) {
430 let nblks = *nblk as usize;
431 if *sb == SBState::Uncoded {
432 for _ in 0..nblks {
433 self.blocks[self.blk_addr[cur_blk] >> 2].btype = VPMBType::InterNoMV;
434 cur_blk += 1;
435 }
436 } else {
437 for _ in 0..nblks/4 {
438 let mut coded = *sb == SBState::Coded;
439 if !coded {
440 for blk in 0..4 {
441 if self.blocks[self.blk_addr[cur_blk + blk] >> 2].coded {
442 coded = true;
443 break;
444 }
445 }
446 }
447 let mode = if !coded {
448 VPMBType::InterNoMV
449 } else if !raw_modes {
450 let code = br.read_code(UintCodeType::LimitedUnary(7, 0))?;
451 modes[code as usize]
452 } else {
453 VP3_DEFAULT_MB_MODES[br.read(3)? as usize]
454 };
455 for _ in 0..4 {
456 self.blocks[self.blk_addr[cur_blk] >> 2].btype = mode;
457 cur_blk += 1;
458 }
459 }
460 }
461 }
462 // replicate types for chroma
463 let mut off_y = 0;
464 let mut off_u = self.y_blocks;
465 let mut off_v = off_u + self.mb_w * self.mb_h;
466 for _blk_y in 0..self.mb_h {
467 for blk_x in 0..self.mb_w {
468 let btype = self.blocks[off_y + blk_x * 2].btype;
469 self.blocks[off_u + blk_x].btype = btype;
470 self.blocks[off_v + blk_x].btype = btype;
471 }
472 off_y += self.mb_w * 2 * 2;
473 off_u += self.mb_w;
474 off_v += self.mb_w;
475 }
476 Ok(())
477 }
478 fn unpack_mv_info(&mut self, br: &mut BitReader) -> DecoderResult<()> {
479 let mut last_mv = ZERO_MV;
480 let mut last2_mv = ZERO_MV;
481 let read_mv = if br.read_bool()? { read_mv_raw } else { read_mv_packed };
482
483 let mut cur_blk = 0;
484 for _ in 0..self.y_blocks/4 {
485 if self.blocks[self.blk_addr[cur_blk] >> 2].btype == VPMBType::InterFourMV {
486 for _ in 0..4 {
487 let blk = &mut self.blocks[self.blk_addr[cur_blk] >> 2];
488 if blk.coded {
489 blk.mv = (read_mv)(br)?;
490 last2_mv = last_mv;
491 last_mv = blk.mv;
492 }
493 cur_blk += 1;
494 }
495 } else {
496 let cur_mv;
497 match self.blocks[self.blk_addr[cur_blk] >> 2].btype {
498 VPMBType::Intra | VPMBType::InterNoMV | VPMBType::GoldenNoMV => {
499 cur_mv = ZERO_MV;
500 },
501 VPMBType::InterMV => {
502 cur_mv = (read_mv)(br)?;
503 last2_mv = last_mv;
504 last_mv = cur_mv;
505 },
506 VPMBType::InterNearest => {
507 cur_mv = last_mv;
508 },
509 VPMBType::InterNear => {
510 cur_mv = last2_mv;
511 std::mem::swap(&mut last_mv, &mut last2_mv);
512 },
513 _ => { // GoldenMV
514 cur_mv = (read_mv)(br)?;
515 },
516 };
517 for _ in 0..4 {
518 self.blocks[self.blk_addr[cur_blk] >> 2].mv = cur_mv;
519 cur_blk += 1;
520 }
521 }
522 }
523 Ok(())
524 }
525 fn unpack_coeffs(&mut self, br: &mut BitReader, coef_no: usize, table_y: usize, table_c: usize) -> DecoderResult<()> {
526 let cbs = if coef_no == 0 {
527 [&self.codes.dc_cb[table_y], &self.codes.dc_cb[table_c]]
528 } else if coef_no < 6 {
529 [&self.codes.ac0_cb[table_y], &self.codes.ac0_cb[table_c]]
530 } else if coef_no < 15 {
531 [&self.codes.ac1_cb[table_y], &self.codes.ac1_cb[table_c]]
532 } else if coef_no < 28 {
533 [&self.codes.ac2_cb[table_y], &self.codes.ac2_cb[table_c]]
534 } else {
535 [&self.codes.ac3_cb[table_y], &self.codes.ac3_cb[table_c]]
536 };
537 for blkaddr in self.blk_addr.iter() {
538 let blk: &mut Block = &mut self.blocks[blkaddr >> 2];
539 if !blk.coded || blk.idx != coef_no { continue; }
540 if self.eob_run > 0 {
541 blk.idx = 64;
542 self.eob_run -= 1;
543 continue;
544 }
545 let cb = if (blkaddr & 3) == 0 { cbs[0] } else { cbs[1] };
546 let token = br.read_cb(cb)?;
547 match token {
548 // EOBs
549 0 | 1 | 2 => { self.eob_run = (token as usize) + 1; },
550 3 | 4 | 5 => {
551 let bits = token - 1;
552 self.eob_run = (br.read(bits)? as usize) + (1 << bits);
553 },
554 6 => { self.eob_run = br.read(12)? as usize; },
555 // zero runs
556 7 | 8 => {
557 let bits = if token == 7 { 3 } else { 6 };
558 let run = (br.read(bits)? as usize) + 1;
559 blk.idx += run;
560 validate!(blk.idx <= 64);
561 },
562 // single coefficients
563 9 | 10 | 11 | 12 => {
564 let val = (i16::from(token) - 7) >> 1;
565 if (token & 1) == 1 {
566 blk.coeffs[ZIGZAG[blk.idx]] = val;
567 } else {
568 blk.coeffs[ZIGZAG[blk.idx]] = -val;
569 }
570 blk.idx += 1;
571 },
572 13 | 14 | 15 | 16 => {
573 let val = i16::from(token) - 10;
574 if !br.read_bool()? {
575 blk.coeffs[ZIGZAG[blk.idx]] = val;
576 } else {
577 blk.coeffs[ZIGZAG[blk.idx]] = -val;
578 }
579 blk.idx += 1;
580 },
581 17 | 18 | 19 | 20 | 21 | 22 => {
582 let add_bits = if token == 22 { 9 } else { token - 16 };
583 let sign = br.read_bool()?;
584 let val = (br.read(add_bits)? as i16) + VP3_LITERAL_BASE[(token - 17) as usize];
585 if !sign {
586 blk.coeffs[ZIGZAG[blk.idx]] = val;
587 } else {
588 blk.coeffs[ZIGZAG[blk.idx]] = -val;
589 }
590 blk.idx += 1;
591 }
592 // zero run plus coefficient
593 23 | 24 | 25 | 26 | 27 => {
594 blk.idx += (token - 22) as usize;
595 validate!(blk.idx < 64);
596 if !br.read_bool()? {
597 blk.coeffs[ZIGZAG[blk.idx]] = 1;
598 } else {
599 blk.coeffs[ZIGZAG[blk.idx]] = -1;
600 }
601 blk.idx += 1;
602 },
603 28 | 29 => {
604 let run_bits = token - 26;
605 if token == 28 {
606 blk.idx += 6;
607 } else {
608 blk.idx += 10;
609 }
610 let sign = br.read_bool()?;
611 blk.idx += br.read(run_bits)? as usize;
612 validate!(blk.idx < 64);
613 if !sign {
614 blk.coeffs[ZIGZAG[blk.idx]] = 1;
615 } else {
616 blk.coeffs[ZIGZAG[blk.idx]] = -1;
617 }
618 blk.idx += 1;
619 },
620 30 => {
621 blk.idx += 1;
622 validate!(blk.idx < 64);
623 let sign = br.read_bool()?;
624 let val = (br.read(1)? as i16) + 2;
625 if !sign {
626 blk.coeffs[ZIGZAG[blk.idx]] = val;
627 } else {
628 blk.coeffs[ZIGZAG[blk.idx]] = -val;
629 }
630 blk.idx += 1;
631 },
632 _ => {
633 let sign = br.read_bool()?;
634 let val = (br.read(1)? as i16) + 2;
635 blk.idx += (br.read(1)? as usize) + 2;
636 validate!(blk.idx < 64);
637 if !sign {
638 blk.coeffs[ZIGZAG[blk.idx]] = val;
639 } else {
640 blk.coeffs[ZIGZAG[blk.idx]] = -val;
641 }
642 blk.idx += 1;
643 },
644 };
645 if self.eob_run > 0 {
646 blk.idx = 64;
647 self.eob_run -= 1;
648 } else if coef_no > 0 {
649 blk.has_ac = true;
650 }
651 }
652 Ok(())
653 }
654 fn decode_vp3(&mut self, br: &mut BitReader, frm: &mut NASimpleVideoFrame<u8>) -> DecoderResult<()> {
655 for blk in self.blocks.iter_mut() {
656 blk.coeffs = [0; 64];
657 blk.idx = 0;
658 blk.coded = false;
659 blk.has_ac = false;
660 }
661 if self.is_intra {
662 for sb in self.sb_info.iter_mut() { *sb = SBState::Coded; }
663 for blk in self.blocks.iter_mut() {
664 blk.btype = VPMBType::Intra;
665 blk.coded = true;
666 }
667 } else {
668 if self.shuf.get_last().is_none() || self.shuf.get_golden().is_none() {
669 return Err(DecoderError::MissingReference);
670 }
671 self.unpack_sb_info(br)?;
672 self.unpack_mb_info(br)?;
673 self.unpack_mv_info(br)?;
674 }
675 let dc_quant = VP3_DC_SCALES[self.quant];
676 let ac_quant = VP3_AC_SCALES[self.quant];
677 rescale_qmat(&mut self.qmat_y, VP3_QMAT_Y, dc_quant, ac_quant);
678 rescale_qmat(&mut self.qmat_c, VP3_QMAT_C, dc_quant, ac_quant);
679 rescale_qmat(&mut self.qmat_inter, VP3_QMAT_INTER, dc_quant, ac_quant);
680
681 self.eob_run = 0;
682 let dc_table_y = br.read(4)? as usize;
683 let dc_table_c = br.read(4)? as usize;
684 self.unpack_coeffs(br, 0, dc_table_y, dc_table_c)?;
685 self.restore_dcs();
686
687 let ac_table_y = br.read(4)? as usize;
688 let ac_table_c = br.read(4)? as usize;
689 for coef_no in 1..64 {
690 self.unpack_coeffs(br, coef_no, ac_table_y, ac_table_c)?;
691 }
692
693 if self.is_intra {
694 self.output_blocks_intra(frm);
695 } else {
696 self.output_blocks_inter(frm);
697 }
698 if self.loop_str > 0 {
699 self.loop_filter(frm);
700 }
701
702 Ok(())
703 }
704 fn decode_vp4(&mut self) -> DecoderResult<()> {
705 unimplemented!();
706 }
707 fn predict_dc(&self, bx: usize, by: usize, bw: usize, blk_idx: usize) -> i16 {
708 let mut preds = [0i32; 4];
709 let mut pp: usize = 0;
710 let ref_id = self.blocks[blk_idx].btype.get_ref_id();
711 let is_right = bx == bw - 1;
712 if bx > 0 {
713 fill_dc_pred!(self, ref_id, preds, pp, 0, blk_idx - 1);
714 if by > 0 {
715 fill_dc_pred!(self, ref_id, preds, pp, 1, blk_idx - 1 - bw);
716 }
717 }
718 if by > 0 {
719 fill_dc_pred!(self, ref_id, preds, pp, 2, blk_idx - bw);
720 if !is_right {
721 fill_dc_pred!(self, ref_id, preds, pp, 3, blk_idx + 1 - bw);
722 }
723 }
724 if pp == 0 { return self.last_dc[ref_id as usize]; }
725 let mut pred = 0i32;
726 for i in 0..4 {
727 if (pp & (1 << i)) != 0 {
728 pred += (preds[i] as i32) * (VP3_DC_WEIGHTS[pp][i] as i32);
729 }
730 }
731 pred /= VP3_DC_WEIGHTS[pp][4] as i32;
732 if (pp & 7) == 7 {
733 if (pred - preds[2]).abs() > 128 { return preds[2] as i16; }
734 if (pred - preds[0]).abs() > 128 { return preds[0] as i16; }
735 if (pred - preds[1]).abs() > 128 { return preds[1] as i16; }
736 }
737 pred as i16
738 }
739 fn restore_dcs(&mut self) {
740 let blk_stride = self.mb_w * 2;
741 let mut blk_idx = 0;
742 self.last_dc = [0; 3];
743 for by in 0..self.mb_h*2 {
744 for bx in 0..self.mb_w*2 {
745 if !self.blocks[blk_idx + bx].coded { continue; }
746 let dc = self.predict_dc(bx, by, self.mb_w*2, blk_idx + bx);
747 self.blocks[blk_idx + bx].coeffs[0] += dc;
748 self.last_dc[self.blocks[blk_idx + bx].btype.get_ref_id() as usize] = self.blocks[blk_idx + bx].coeffs[0];
749 }
750 blk_idx += blk_stride;
751 }
752 let blk_stride = self.mb_w;
753 for _plane in 1..3 {
754 self.last_dc = [0; 3];
755 for by in 0..self.mb_h {
756 for bx in 0..self.mb_w {
757 if !self.blocks[blk_idx + bx].coded { continue; }
758 let dc = self.predict_dc(bx, by, self.mb_w, blk_idx + bx);
759 self.blocks[blk_idx + bx].coeffs[0] += dc;
760 self.last_dc[self.blocks[blk_idx + bx].btype.get_ref_id() as usize] = self.blocks[blk_idx + bx].coeffs[0];
761 }
762 blk_idx += blk_stride;
763 }
764 }
765 }
766 fn output_blocks_intra(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
767 let mut biter = self.blocks.iter_mut();
768 for by in 0..self.mb_h*2 {
769 for bx in 0..self.mb_w*2 {
770 let mut blk = biter.next().unwrap();
771 let qmat = if blk.btype == VPMBType::Intra { &self.qmat_y } else { &self.qmat_inter };
772 blk.coeffs[0] *= qmat[0];
773 if blk.has_ac {
774 unquant(&mut blk.coeffs, qmat);
775 vp_put_block(&mut blk.coeffs, bx, by, 0, frm);
776 } else {
777 vp_put_block_dc(&mut blk.coeffs, bx, by, 0, frm);
778 }
779 }
780 }
781 for plane in 1..3 {
782 for by in 0..self.mb_h {
783 for bx in 0..self.mb_w {
784 let mut blk = biter.next().unwrap();
785 let qmat = if blk.btype == VPMBType::Intra { &self.qmat_c } else { &self.qmat_inter };
786 blk.coeffs[0] *= qmat[0];
787 if blk.has_ac {
788 unquant(&mut blk.coeffs, qmat);
789 vp_put_block(&mut blk.coeffs, bx, by, plane, frm);
790 } else {
791 vp_put_block_dc(&mut blk.coeffs, bx, by, plane, frm);
792 }
793 }
794 }
795 }
796 }
797 fn output_blocks_inter(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
798 let mut blk_idx = 0;
799 let bstride = self.mb_w * 2;
800 for by in (0..self.mb_h*2).step_by(2) {
801 for bx in (0..self.mb_w*2).step_by(2) {
802 if self.blocks[blk_idx + bx].btype != VPMBType::InterFourMV {
803 continue;
804 }
805 let mv_a = self.blocks[blk_idx + bx].mv;
806 let mv_b = self.blocks[blk_idx + bx + 1].mv;
807 let mv_c = self.blocks[blk_idx + bx + bstride].mv;
808 let mv_d = self.blocks[blk_idx + bx + 1 + bstride].mv;
809 let mut mv_sum = mv_a + mv_b + mv_c + mv_d;
810 mv_sum.x = (mv_sum.x + 2) >> 2;
811 mv_sum.y = (mv_sum.y + 2) >> 2;
812
813 let src = self.shuf.get_last().unwrap();
814 let mode = ((mv_a.x & 1) + (mv_a.y & 1) * 2) as usize;
815 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);
816 let mode = ((mv_b.x & 1) + (mv_b.y & 1) * 2) as usize;
817 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);
818 let mode = ((mv_c.x & 1) + (mv_c.y & 1) * 2) as usize;
819 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);
820 let mode = ((mv_d.x & 1) + (mv_d.y & 1) * 2) as usize;
821 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);
822
823 let mx = (mv_sum.x >> 1) | (mv_sum.x & 1);
824 let my = (mv_sum.y >> 1) | (mv_sum.y & 1);
825 let mode = ((mx & 1) + (my & 1) * 2) as usize;
826 copy_block(frm, src.clone(), 1, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
827 copy_block(frm, src.clone(), 2, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
828 }
829 blk_idx += bstride;
830 }
831
832 let mut biter = self.blocks.iter_mut();
833 for by in 0..self.mb_h*2 {
834 for bx in 0..self.mb_w*2 {
835 let mut blk = biter.next().unwrap();
836 // do MC for whole macroblock
837 if !blk.btype.is_intra() && (((bx | by) & 1) == 0) && (blk.btype != VPMBType::InterFourMV) {
838 let src = if blk.btype.get_ref_id() == 1 {
839 self.shuf.get_last().unwrap()
840 } else {
841 self.shuf.get_golden().unwrap()
842 };
843 let mode = ((blk.mv.x & 1) + (blk.mv.y & 1) * 2) as usize;
844 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);
845 let mx = (blk.mv.x >> 1) | (blk.mv.x & 1);
846 let my = (blk.mv.y >> 1) | (blk.mv.y & 1);
847 let mode = ((mx & 1) + (my & 1) * 2) as usize;
848 copy_block(frm, src.clone(), 1, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
849 copy_block(frm, src.clone(), 2, bx * 4, by * 4, mx >> 1, my >> 1, 8, 8, 0, 1, mode, VP3_INTERP_FUNCS);
850 }
851 let qmat = if blk.btype.is_intra() { &self.qmat_y } else { &self.qmat_inter };
852 blk.coeffs[0] *= qmat[0];
853 if blk.has_ac {
854 unquant(&mut blk.coeffs, qmat);
855 }
856 if blk.btype.is_intra() {
857 if !blk.coded {
858 copy_block(frm, self.shuf.get_last().unwrap(), 0, bx * 8, by * 8, 0, 0, 8, 8, 0, 1, 0, VP3_INTERP_FUNCS);
859 } else if blk.has_ac {
860 vp_put_block(&mut blk.coeffs, bx, by, 0, frm);
861 } else {
862 vp_put_block_dc(&mut blk.coeffs, bx, by, 0, frm);
863 }
864 } else if blk.coded {
865 if blk.has_ac {
866 vp_add_block(&mut blk.coeffs, bx, by, 0, frm);
867 } else {
868 vp_add_block_dc(&mut blk.coeffs, bx, by, 0, frm);
869 }
870 }
871 }
872 }
873 for plane in 1..3 {
874 for by in 0..self.mb_h {
875 for bx in 0..self.mb_w {
876 let mut blk = biter.next().unwrap();
877 let qmat = if blk.btype.is_intra() { &self.qmat_c } else { &self.qmat_inter };
878 blk.coeffs[0] *= qmat[0];
879 if blk.has_ac {
880 unquant(&mut blk.coeffs, qmat);
881 }
882 if blk.btype.is_intra() {
883 if !blk.coded {
884 copy_block(frm, self.shuf.get_last().unwrap(), plane, bx * 8, by * 8, 0, 0, 8, 8, 0, 1, 0, VP3_INTERP_FUNCS);
885 } else if blk.has_ac {
886 vp_put_block(&mut blk.coeffs, bx, by, plane, frm);
887 } else {
888 vp_put_block_dc(&mut blk.coeffs, bx, by, plane, frm);
889 }
890 } else if blk.coded {
891 if blk.has_ac {
892 vp_add_block(&mut blk.coeffs, bx, by, plane, frm);
893 } else {
894 vp_add_block_dc(&mut blk.coeffs, bx, by, plane, frm);
895 }
896 }
897 }
898 }
899 }
900 }
901 fn loop_filter(&mut self, frm: &mut NASimpleVideoFrame<u8>) {
902 let mut blk_idx = 0;
903 let blk_w = self.mb_w * 2;
904 for by in 0..self.mb_h*2 {
905 for bx in 0..blk_w {
906 let blk = &self.blocks[blk_idx + bx];
907 if (bx > 0) && blk.coded {
908 vp3_loop_filter_v(frm, bx * 8, by * 8, 0, self.loop_str);
909 }
910 if (by > 0) && blk.coded {
911 vp3_loop_filter_h(frm, bx * 8, by * 8, 0, self.loop_str);
912 }
913 if (bx < blk_w - 1) && !self.blocks[blk_idx + bx + 1].coded {
914 vp3_loop_filter_v(frm, bx * 8 + 8, by * 8, 0, self.loop_str);
915 }
916 if (by < self.mb_h * 2 - 1) && !self.blocks[blk_idx + bx + blk_w].coded {
917 vp3_loop_filter_h(frm, bx * 8, by * 8 + 8, 0, self.loop_str);
918 }
919 }
920 blk_idx += blk_w;
921 }
922 /* for plane in 1..3 {
923 for by in 0..self.mb_h {
924 for bx in 0..self.mb_w {
925 }
926 }
927 }*/
928 }
929 fn generate_block_addr(&mut self) {
930 let sb_w_y = (self.width + 31) >> 5;
931 let sb_h_y = (self.height + 31) >> 5;
932 let sb_w_c = ((self.width >> 1) + 31) >> 5;
933 let sb_h_c = ((self.height >> 1) + 31) >> 5;
934 self.y_sbs = sb_w_y * sb_h_y;
935 let tot_sb = sb_w_y * sb_h_y + 2 * sb_w_c * sb_h_c;
936 let bw = self.width >> 3;
937 let bh = self.height >> 3;
938 let tot_blk = bw * bh * 3 / 2;
939 self.sb_info.resize(tot_sb, SBState::Uncoded);
940 self.sb_blocks = Vec::with_capacity(tot_sb);
941 self.blk_addr = Vec::with_capacity(tot_blk);
942 self.y_blocks = bw * bh;
943 let mut base_idx = 0;
944 for plane in 0..3 {
945 let w = if plane > 0 { self.width >> 1 } else { self.width };
946 let h = if plane > 0 { self.height >> 1 } else { self.height };
947 let sb_w = (w + 31) >> 5;
948 let sb_h = (h + 31) >> 5;
949 let blk_w = w >> 3;
950 let blk_h = h >> 3;
951 for y in 0..sb_h {
952 for x in 0..sb_w {
953 let mut nblocks = 0;
954 for blk_no in 0..16 {
955 let bx = x * 4 + HILBERT_ORDER[blk_no][0];
956 let by = y * 4 + HILBERT_ORDER[blk_no][1];
957 if (bx >= blk_w) || (by >= blk_h) { continue; }
958 let idx = base_idx + bx + by * blk_w;
959 self.blk_addr.push(idx * 4 + plane);
960 nblocks += 1;
961 }
962 self.sb_blocks.push(nblocks);
963 }
964 }
965 base_idx += blk_w * blk_h;
966 }
967 self.blocks.resize(tot_blk, Block::new());
968 }
969 }
970
971 impl NADecoder for VP34Decoder {
972 fn init(&mut self, supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
973 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
974 let fmt = YUV420_FORMAT;
975 self.width = vinfo.get_width();
976 self.height = vinfo.get_height();
977 validate!(((self.width | self.height) & 15) == 0);
978 self.mb_w = self.width >> 4;
979 self.mb_h = self.height >> 4;
980 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(vinfo.get_width(), vinfo.get_height(), true, fmt));
981 self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
982 supp.pool_u8.set_dec_bufs(3);
983 supp.pool_u8.prealloc_video(NAVideoInfo::new(vinfo.get_width(), vinfo.get_height(), false, fmt), 4)?;
984
985 if self.version == 3 {
986 self.generate_block_addr();
987 }
988 Ok(())
989 } else {
990 Err(DecoderError::InvalidData)
991 }
992 }
993 fn decode(&mut self, supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
994 let src = pkt.get_buffer();
995 validate!(src.len() > 0);
996 let mut br = BitReader::new(&src, src.len(), BitReaderMode::BE);
997
998 self.parse_header(&mut br)?;
999 if self.is_intra {
1000 self.shuf.clear();
1001 }
1002
1003 let ret = supp.pool_u8.get_free();
1004 if ret.is_none() {
1005 return Err(DecoderError::AllocError);
1006 }
1007 let mut buf = ret.unwrap();
1008 let mut dframe = NASimpleVideoFrame::from_video_buf(&mut buf).unwrap();
1009 if self.version == 3 {
1010 self.decode_vp3(&mut br, &mut dframe)?;
1011 } else {
1012 self.decode_vp4()?;
1013 }
1014
1015 if self.is_intra {
1016 self.shuf.add_golden_frame(buf.clone());
1017 }
1018 self.shuf.add_frame(buf.clone());
1019
1020 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::Video(buf));
1021 frm.set_keyframe(self.is_intra);
1022 frm.set_frame_type(if self.is_intra { FrameType::I } else { FrameType::P });
1023 Ok(frm.into_ref())
1024 }
1025 }
1026
1027 pub fn get_decoder_vp3() -> Box<NADecoder> {
1028 Box::new(VP34Decoder::new(3))
1029 }
1030
1031 /*pub fn get_decoder_vp4() -> Box<NADecoder> {
1032 Box::new(VP34Decoder::new(4))
1033 }*/
1034
1035 #[cfg(test)]
1036 mod test {
1037 use nihav_core::codecs::RegisteredDecoders;
1038 use nihav_core::demuxers::RegisteredDemuxers;
1039 use nihav_core::test::dec_video::*;
1040 use crate::codecs::duck_register_all_codecs;
1041 use nihav_commonfmt::demuxers::generic_register_all_demuxers;
1042
1043 #[test]
1044 fn test_vp3() {
1045 let mut dmx_reg = RegisteredDemuxers::new();
1046 generic_register_all_demuxers(&mut dmx_reg);
1047 let mut dec_reg = RegisteredDecoders::new();
1048 duck_register_all_codecs(&mut dec_reg);
1049
1050 // let file = "assets/Duck/vp30-logo.avi";
1051 let file = "assets/Duck/vp31.avi";
1052 // let file = "assets/Duck/vp31_crash.avi";
1053 // let file = "assets/Duck/01-vp31-0500.avi";
1054 test_file_decoding("avi", file, Some(3), true, false, Some("vp3"), &dmx_reg, &dec_reg);
1055 //panic!("end");
1056 }
1057
1058 #[test]
1059 fn test_vp4() {
1060 let mut dmx_reg = RegisteredDemuxers::new();
1061 generic_register_all_demuxers(&mut dmx_reg);
1062 let mut dec_reg = RegisteredDecoders::new();
1063 duck_register_all_codecs(&mut dec_reg);
1064
1065 let file = "assets/Duck/ot171_vp40.avi";
1066 test_file_decoding("avi", file, Some(16), true, false, Some("vp4"), &dmx_reg, &dec_reg);
1067 }
1068 }
1069
1070 const HILBERT_ORDER: [[usize; 2]; 16] = [
1071 [ 0, 0 ], [ 1, 0 ], [ 1, 1 ], [ 0, 1 ],
1072 [ 0, 2 ], [ 0, 3 ], [ 1, 3 ], [ 1, 2 ],
1073 [ 2, 2 ], [ 2, 3 ], [ 3, 3 ], [ 3, 2 ],
1074 [ 3, 1 ], [ 2, 1 ], [ 2, 0 ], [ 3, 0 ]
1075 ];
1076
1077 const VP3_LOOP_STRENGTH: [i16; 64] = [
1078 30, 25, 20, 20, 15, 15, 14, 14,
1079 13, 13, 12, 12, 11, 11, 10, 10,
1080 9, 9, 8, 8, 7, 7, 7, 7,
1081 6, 6, 6, 6, 5, 5, 5, 5,
1082 4, 4, 4, 4, 3, 3, 3, 3,
1083 2, 2, 2, 2, 2, 2, 2, 2,
1084 0, 0, 0, 0, 0, 0, 0, 0,
1085 0, 0, 0, 0, 0, 0, 0, 0
1086 ];
1087
1088 const VP3_DEFAULT_MB_MODES: [VPMBType; 8] = [
1089 VPMBType::InterNoMV, VPMBType::Intra, VPMBType::InterMV, VPMBType::InterNearest,
1090 VPMBType::InterNear, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1091 ];
1092
1093 const VP3_MB_MODES: [[VPMBType; 8]; 6] = [
1094 [
1095 VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterMV, VPMBType::InterNoMV,
1096 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1097 ], [
1098 VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterNoMV, VPMBType::InterMV,
1099 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1100 ], [
1101 VPMBType::InterNearest, VPMBType::InterMV, VPMBType::InterNear, VPMBType::InterNoMV,
1102 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1103 ], [
1104 VPMBType::InterNearest, VPMBType::InterMV, VPMBType::InterNoMV, VPMBType::InterNear,
1105 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1106 ], [
1107 VPMBType::InterNoMV, VPMBType::InterNearest, VPMBType::InterNear, VPMBType::InterMV,
1108 VPMBType::Intra, VPMBType::GoldenNoMV, VPMBType::GoldenMV, VPMBType::InterFourMV
1109 ], [
1110 VPMBType::InterNoMV, VPMBType::GoldenNoMV, VPMBType::InterNearest, VPMBType::InterNear,
1111 VPMBType::InterMV, VPMBType::Intra, VPMBType::GoldenMV, VPMBType::InterFourMV
1112 ]
1113 ];
1114
1115 const VP3_LITERAL_BASE: [i16; 6] = [ 7, 9, 13, 21, 37, 69 ];
1116
1117 const VP3_AC_SCALES: [i16; 64] = [
1118 500, 450, 400, 370, 340, 310, 285, 265,
1119 245, 225, 210, 195, 185, 180, 170, 160,
1120 150, 145, 135, 130, 125, 115, 110, 107,
1121 100, 96, 93, 89, 85, 82, 75, 74,
1122 70, 68, 64, 60, 57, 56, 52, 50,
1123 49, 45, 44, 43, 40, 38, 37, 35,
1124 33, 32, 30, 29, 28, 25, 24, 22,
1125 21, 19, 18, 17, 15, 13, 12, 10
1126 ];
1127
1128 const VP3_DC_SCALES: [i16; 64] = [
1129 220, 200, 190, 180, 170, 170, 160, 160,
1130 150, 150, 140, 140, 130, 130, 120, 120,
1131 110, 110, 100, 100, 90, 90, 90, 80,
1132 80, 80, 70, 70, 70, 60, 60, 60,
1133 60, 50, 50, 50, 50, 40, 40, 40,
1134 40, 40, 30, 30, 30, 30, 30, 30,
1135 30, 20, 20, 20, 20, 20, 20, 20,
1136 20, 10, 10, 10, 10, 10, 10, 10
1137 ];
1138
1139 const VP3_QMAT_Y: &[i16; 64] = &[
1140 16, 11, 10, 16, 24, 40, 51, 61,
1141 12, 12, 14, 19, 26, 58, 60, 55,
1142 14, 13, 16, 24, 40, 57, 69, 56,
1143 14, 17, 22, 29, 51, 87, 80, 62,
1144 18, 22, 37, 58, 68, 109, 103, 77,
1145 24, 35, 55, 64, 81, 104, 113, 92,
1146 49, 64, 78, 87, 103, 121, 120, 101,
1147 72, 92, 95, 98, 112, 100, 103, 99
1148 ];
1149
1150 const VP3_QMAT_C: &[i16; 64] = &[
1151 17, 18, 24, 47, 99, 99, 99, 99,
1152 18, 21, 26, 66, 99, 99, 99, 99,
1153 24, 26, 56, 99, 99, 99, 99, 99,
1154 47, 66, 99, 99, 99, 99, 99, 99,
1155 99, 99, 99, 99, 99, 99, 99, 99,
1156 99, 99, 99, 99, 99, 99, 99, 99,
1157 99, 99, 99, 99, 99, 99, 99, 99,
1158 99, 99, 99, 99, 99, 99, 99, 99
1159 ];
1160
1161 const VP3_QMAT_INTER: &[i16; 64] = &[
1162 16, 16, 16, 20, 24, 28, 32, 40,
1163 16, 16, 20, 24, 28, 32, 40, 48,
1164 16, 20, 24, 28, 32, 40, 48, 64,
1165 20, 24, 28, 32, 40, 48, 64, 64,
1166 24, 28, 32, 40, 48, 64, 64, 64,
1167 28, 32, 40, 48, 64, 64, 64, 96,
1168 32, 40, 48, 64, 64, 64, 96, 128,
1169 40, 48, 64, 64, 64, 96, 128, 128
1170 ];
1171
1172 const ZIGZAG: [usize; 64] = [
1173 0, 1, 8, 16, 9, 2, 3, 10,
1174 17, 24, 32, 25, 18, 11, 4, 5,
1175 12, 19, 26, 33, 40, 48, 41, 34,
1176 27, 20, 13, 6, 7, 14, 21, 28,
1177 35, 42, 49, 56, 57, 50, 43, 36,
1178 29, 22, 15, 23, 30, 37, 44, 51,
1179 58, 59, 52, 45, 38, 31, 39, 46,
1180 53, 60, 61, 54, 47, 55, 62, 63
1181 ];
1182
1183 const VP3_DC_CODES: [[u16; 32]; 16] = [
1184 [
1185 0x002D, 0x0026, 0x0166, 0x004E, 0x02CE, 0x059E, 0x027D, 0x0008,
1186 0x04F9, 0x000F, 0x000E, 0x001B, 0x0006, 0x0008, 0x0005, 0x001A,
1187 0x0015, 0x0007, 0x000C, 0x0001, 0x0000, 0x0009, 0x0017, 0x0029,
1188 0x0028, 0x00B2, 0x04F8, 0x059F, 0x009E, 0x013F, 0x0012, 0x0058,
1189 ], [
1190 0x0010, 0x0047, 0x01FF, 0x008C, 0x03FC, 0x046A, 0x0469, 0x0022,
1191 0x11A1, 0x000E, 0x000D, 0x0004, 0x0005, 0x0009, 0x0006, 0x001E,
1192 0x0016, 0x0007, 0x000C, 0x0001, 0x0000, 0x000A, 0x0017, 0x007D,
1193 0x007E, 0x011B, 0x08D1, 0x03FD, 0x046B, 0x11A0, 0x007C, 0x00FE,
1194 ], [
1195 0x0016, 0x0020, 0x0086, 0x0087, 0x0367, 0x06CC, 0x06CB, 0x006E,
1196 0x366D, 0x000F, 0x000E, 0x0004, 0x0005, 0x000A, 0x0006, 0x001A,
1197 0x0011, 0x0007, 0x000C, 0x0001, 0x0000, 0x0009, 0x0017, 0x006F,
1198 0x006D, 0x0364, 0x0D9A, 0x06CA, 0x1B37, 0x366C, 0x0042, 0x00D8,
1199 ], [
1200 0x0000, 0x002D, 0x00F7, 0x0058, 0x0167, 0x02CB, 0x02CA, 0x000E,
1201 0x1661, 0x0003, 0x0002, 0x0008, 0x0009, 0x000D, 0x0002, 0x001F,
1202 0x0017, 0x0001, 0x000C, 0x000E, 0x000A, 0x0006, 0x0078, 0x000F,
1203 0x007A, 0x0164, 0x0599, 0x02CD, 0x0B31, 0x1660, 0x0079, 0x00F6,
1204 ], [
1205 0x0003, 0x003C, 0x000F, 0x007A, 0x001D, 0x0020, 0x0072, 0x0006,
1206 0x0399, 0x0004, 0x0005, 0x0005, 0x0006, 0x000E, 0x0004, 0x0000,
1207 0x0019, 0x0002, 0x000D, 0x0007, 0x001F, 0x0030, 0x0011, 0x0031,
1208 0x0005, 0x0021, 0x00E7, 0x0038, 0x01CD, 0x0398, 0x007B, 0x0009,
1209 ], [
1210 0x0009, 0x0002, 0x0074, 0x0007, 0x00EC, 0x00D1, 0x01A6, 0x0006,
1211 0x0D21, 0x0005, 0x0006, 0x0008, 0x0007, 0x000F, 0x0004, 0x0000,
1212 0x001C, 0x0002, 0x0005, 0x0003, 0x000C, 0x0035, 0x01A7, 0x001B,
1213 0x0077, 0x01A5, 0x0349, 0x00D0, 0x0691, 0x0D20, 0x0075, 0x00ED,
1214 ], [
1215 0x000A, 0x000C, 0x0012, 0x001B, 0x00B7, 0x016C, 0x0099, 0x005A,
1216 0x16D8, 0x0007, 0x0006, 0x0009, 0x0008, 0x0000, 0x0005, 0x0017,
1217 0x000E, 0x0002, 0x0003, 0x000F, 0x001A, 0x004D, 0x2DB3, 0x002C,
1218 0x0011, 0x02DA, 0x05B7, 0x0098, 0x0B6D, 0x2DB2, 0x0010, 0x0027,
1219 ], [
1220 0x000D, 0x000F, 0x001D, 0x0008, 0x0051, 0x0056, 0x00AF, 0x002A,
1221 0x148A, 0x0007, 0x0000, 0x0008, 0x0009, 0x000C, 0x0006, 0x0017,
1222 0x000B, 0x0016, 0x0015, 0x0009, 0x0050, 0x00AE, 0x2917, 0x001C,
1223 0x0014, 0x0290, 0x0523, 0x0149, 0x0A44, 0x2916, 0x0053, 0x00A5,
1224 ], [
1225 0x0001, 0x001D, 0x00F5, 0x00F4, 0x024D, 0x0499, 0x0498, 0x0001,
1226 0x0021, 0x0006, 0x0005, 0x0006, 0x0005, 0x0002, 0x0007, 0x0025,
1227 0x007B, 0x001C, 0x0020, 0x000D, 0x0048, 0x0092, 0x0127, 0x000E,
1228 0x0004, 0x0011, 0x000C, 0x003C, 0x000F, 0x0000, 0x001F, 0x0013,
1229 ], [
1230 0x0005, 0x003C, 0x0040, 0x000D, 0x0031, 0x0061, 0x0060, 0x0002,
1231 0x00F5, 0x0006, 0x0005, 0x0007, 0x0006, 0x0002, 0x0009, 0x0025,
1232 0x0007, 0x0021, 0x0024, 0x0010, 0x0041, 0x00F4, 0x0019, 0x000E,
1233 0x0003, 0x0011, 0x0011, 0x003F, 0x003E, 0x007B, 0x0000, 0x0013,
1234 ], [
1235 0x000A, 0x0007, 0x0001, 0x0009, 0x0131, 0x0261, 0x0260, 0x0015,
1236 0x0001, 0x0007, 0x0006, 0x0008, 0x0007, 0x0006, 0x0012, 0x002F,
1237 0x0014, 0x0027, 0x002D, 0x0016, 0x004D, 0x0099, 0x0000, 0x0004,
1238 0x0001, 0x0005, 0x0017, 0x002E, 0x002C, 0x0008, 0x0006, 0x0001,
1239 ], [
1240 0x0000, 0x000E, 0x0017, 0x002A, 0x0010, 0x00F9, 0x00F8, 0x001E,
1241 0x003F, 0x0007, 0x0006, 0x0009, 0x0008, 0x0006, 0x000F, 0x0005,
1242 0x0016, 0x0029, 0x002B, 0x0015, 0x0050, 0x0011, 0x007D, 0x0004,
1243 0x0017, 0x0006, 0x0014, 0x002C, 0x002D, 0x000E, 0x0009, 0x0051,
1244 ], [
1245 0x0002, 0x0018, 0x002F, 0x000D, 0x0053, 0x0295, 0x0294, 0x00A4,
1246 0x007C, 0x0000, 0x0007, 0x0009, 0x0008, 0x001B, 0x000C, 0x0028,
1247 0x006A, 0x001E, 0x001D, 0x0069, 0x00D7, 0x007D, 0x014B, 0x0019,
1248 0x0016, 0x002E, 0x001C, 0x002B, 0x002A, 0x0068, 0x003F, 0x00D6,
1249 ], [
1250 0x0002, 0x001B, 0x000C, 0x0018, 0x0029, 0x007F, 0x02F0, 0x0198,
1251 0x0179, 0x0000, 0x0007, 0x0009, 0x0008, 0x001A, 0x000D, 0x002A,
1252 0x0064, 0x001E, 0x0067, 0x005F, 0x00CD, 0x007E, 0x02F1, 0x0016,
1253 0x000E, 0x002E, 0x0065, 0x002B, 0x0028, 0x003E, 0x00BD, 0x0199,
1254 ], [
1255 0x0002, 0x0007, 0x0016, 0x0006, 0x0036, 0x005C, 0x015D, 0x015C,
1256 0x02BF, 0x0000, 0x0007, 0x0009, 0x0008, 0x0018, 0x0034, 0x002A,
1257 0x005E, 0x006A, 0x0064, 0x005D, 0x00CB, 0x00AD, 0x02BE, 0x0014,
1258 0x0033, 0x006E, 0x005F, 0x006F, 0x006B, 0x00CA, 0x00AC, 0x015E,
1259 ], [
1260 0x000F, 0x001D, 0x0018, 0x000B, 0x0019, 0x0029, 0x00D6, 0x0551,
1261 0x0AA1, 0x0001, 0x0000, 0x0009, 0x0008, 0x001B, 0x0038, 0x0028,
1262 0x0057, 0x006A, 0x0068, 0x0056, 0x00E5, 0x0155, 0x0AA0, 0x0073,
1263 0x0069, 0x00D7, 0x00AB, 0x00E4, 0x00A9, 0x0151, 0x0150, 0x02A9,
1264 ]
1265 ];
1266
1267 const VP3_DC_BITS: [[u8; 32]; 16] = [
1268 [
1269 6, 7, 9, 8, 10, 11, 11, 5, 12, 4, 4, 5, 4, 4, 4, 5,
1270 5, 4, 4, 3, 3, 4, 5, 6, 6, 8, 12, 11, 9, 10, 6, 7,
1271 ], [
1272 5, 7, 9, 8, 10, 11, 11, 6, 13, 4, 4, 4, 4, 4, 4, 5,
1273 5, 4, 4, 3, 3, 4, 5, 7, 7, 9, 12, 10, 11, 13, 7, 8,
1274 ], [
1275 5, 6, 8, 8, 10, 11, 11, 7, 14, 4, 4, 4, 4, 4, 4, 5,
1276 5, 4, 4, 3, 3, 4, 5, 7, 7, 10, 12, 11, 13, 14, 7, 8,
1277 ], [
1278 4, 6, 8, 7, 9, 10, 10, 6, 13, 3, 3, 4, 4, 4, 4, 5,
1279 5, 4, 4, 4, 4, 5, 7, 6, 7, 9, 11, 10, 12, 13, 7, 8,
1280 ], [
1281 4, 6, 7, 7, 8, 9, 10, 6, 13, 3, 3, 4, 4, 4, 4, 4,
1282 5, 4, 4, 4, 5, 6, 8, 6, 6, 9, 11, 9, 12, 13, 7, 7,
1283 ], [
1284 4, 5, 7, 6, 8, 9, 10, 6, 13, 3, 3, 4, 4, 4, 4, 4,
1285 5, 4, 4, 4, 5, 7, 10, 6, 7, 10, 11, 9, 12, 13, 7, 8,
1286 ], [
1287 4, 5, 6, 6, 8, 9, 9, 7, 13, 3, 3, 4, 4, 3, 4, 5,
1288 5, 4, 4, 5, 6, 8, 14, 6, 6, 10, 11, 9, 12, 14, 6, 7,
1289 ], [
1290 4, 5, 6, 5, 7, 8, 9, 7, 13, 3, 2, 4, 4, 4, 4, 5,
1291 5, 5, 5, 5, 7, 9, 14, 6, 6, 10, 11, 9, 12, 14, 7, 8,
1292 ], [
1293 4, 6, 8, 8, 10, 11, 11, 5, 6, 3, 3, 4, 4, 4, 5, 6,
1294 7, 6, 6, 6, 7, 8, 9, 4, 4, 5, 6, 6, 5, 5, 5, 5,
1295 ], [
1296 4, 6, 7, 7, 9, 10, 10, 5, 8, 3, 3, 4, 4, 4, 5, 6,
1297 6, 6, 6, 6, 7, 8, 8, 4, 4, 5, 6, 6, 6, 7, 4, 5,
1298 ], [
1299 4, 5, 6, 6, 9, 10, 10, 6, 7, 3, 3, 4, 4, 4, 5, 6,
1300 6, 6, 6, 6, 7, 8, 7, 4, 4, 5, 6, 6, 6, 6, 5, 5,
1301 ], [
1302 3, 5, 6, 6, 7, 10, 10, 7, 8, 3, 3, 4, 4, 4, 5, 5,
1303 6, 6, 6, 6, 7, 7, 9, 4, 5, 5, 6, 6, 6, 6, 6, 7,
1304 ], [
1305 3, 5, 6, 5, 7, 10, 10, 8, 8, 2, 3, 4, 4, 5, 5, 6,
1306 7, 6, 6, 7, 8, 8, 9, 5, 5, 6, 6, 6, 6, 7, 7, 8,
1307 ], [
1308 3, 5, 5, 5, 6, 8, 10, 9, 9, 2, 3, 4, 4, 5, 5, 6,
1309 7, 6, 7, 7, 8, 8, 10, 5, 5, 6, 7, 6, 6, 7, 8, 9,
1310 ], [
1311 3, 4, 5, 4, 6, 7, 9, 9, 10, 2, 3, 4, 4, 5, 6, 6,
1312 7, 7, 7, 7, 8, 8, 10, 5, 6, 7, 7, 7, 7, 8, 8, 9,
1313 ], [
1314 4, 5, 5, 4, 5, 6, 8, 11, 12, 2, 2, 4, 4, 5, 6, 6,
1315 7, 7, 7, 7, 8, 9, 12, 7, 7, 8, 8, 8, 8, 9, 9, 10,
1316 ]
1317 ];
1318
1319 const VP3_AC_CAT0_CODES: [[u16; 32]; 16] = [
1320 [
1321 0x0008, 0x0025, 0x017A, 0x02F7, 0x0BDB, 0x17B4, 0x2F6B, 0x001D,
1322 0x2F6A, 0x0008, 0x0007, 0x0001, 0x0002, 0x000A, 0x0006, 0x0000,
1323 0x001C, 0x0009, 0x000D, 0x000F, 0x000C, 0x0003, 0x000A, 0x0016,
1324 0x0013, 0x005D, 0x0024, 0x00BC, 0x005C, 0x05EC, 0x000B, 0x005F,
1325 ], [
1326 0x000F, 0x0010, 0x004B, 0x00C6, 0x031D, 0x0C71, 0x0C70, 0x0001,
1327 0x0C73, 0x0008, 0x0009, 0x0002, 0x0003, 0x000B, 0x0006, 0x0000,
1328 0x001C, 0x0005, 0x000D, 0x000F, 0x000A, 0x0019, 0x0013, 0x001D,
1329 0x0030, 0x0062, 0x0024, 0x004A, 0x018F, 0x0C72, 0x000E, 0x0011,
1330 ], [
1331 0x001B, 0x0003, 0x008D, 0x0040, 0x0239, 0x0471, 0x08E0, 0x0003,
1332 0x11C3, 0x000A, 0x0009, 0x0004, 0x0005, 0x000E, 0x0007, 0x0001,
1333 0x001E, 0x0006, 0x000C, 0x000B, 0x0002, 0x0000, 0x0041, 0x001F,
1334 0x0022, 0x0002, 0x008F, 0x008C, 0x011D, 0x11C2, 0x001A, 0x0021,
1335 ], [
1336 0x001F, 0x0003, 0x0003, 0x0043, 0x000B, 0x0015, 0x0051, 0x0003,
1337 0x0050, 0x000D, 0x000C, 0x0004, 0x0006, 0x000E, 0x000A, 0x0001,
1338 0x001E, 0x0005, 0x0009, 0x0007, 0x0011, 0x0002, 0x0004, 0x0002,
1339 0x002D, 0x0020, 0x0042, 0x0001, 0x0000, 0x0029, 0x0017, 0x002C,
1340 ], [
1341 0x0003, 0x001F, 0x003A, 0x005D, 0x0173, 0x02E4, 0x172D, 0x0004,
1342 0x172C, 0x000F, 0x000E, 0x0009, 0x0008, 0x000C, 0x000A, 0x0001,
1343 0x0016, 0x0002, 0x0005, 0x001A, 0x002F, 0x0038, 0x05CA, 0x0006,
1344 0x0037, 0x001E, 0x003B, 0x0039, 0x00B8, 0x0B97, 0x0000, 0x0036,
1345 ], [
1346 0x0006, 0x0037, 0x005D, 0x000C, 0x00B9, 0x02E3, 0x05C4, 0x0004,
1347 0x1715, 0x0000, 0x000F, 0x0008, 0x0007, 0x000C, 0x0009, 0x001D,
1348 0x0016, 0x001C, 0x001A, 0x000B, 0x005E, 0x0170, 0x1714, 0x000A,
1349 0x000A, 0x0036, 0x005F, 0x001B, 0x001A, 0x0B8B, 0x0002, 0x0007,
1350 ], [
1351 0x000C, 0x000B, 0x0079, 0x0022, 0x00F0, 0x0119, 0x0230, 0x001D,
1352 0x08C4, 0x0001, 0x0000, 0x000A, 0x0009, 0x000B, 0x0007, 0x001C,
1353 0x003D, 0x000D, 0x0008, 0x0015, 0x008D, 0x118B, 0x118A, 0x000D,
1354 0x0010, 0x0009, 0x0014, 0x0047, 0x00F1, 0x0463, 0x001F, 0x000C,
1355 ], [
1356 0x0000, 0x001A, 0x0033, 0x000C, 0x0046, 0x01E3, 0x03C5, 0x0017,
1357 0x1E21, 0x0002, 0x0001, 0x0009, 0x000A, 0x0007, 0x001B, 0x003D,
1358 0x001B, 0x0022, 0x0079, 0x00F0, 0x1E20, 0x1E23, 0x1E22, 0x000E,
1359 0x0016, 0x0018, 0x0032, 0x001A, 0x0047, 0x0789, 0x001F, 0x0010,
1360 ], [
1361 0x001D, 0x0061, 0x004E, 0x009E, 0x027C, 0x09F5, 0x09F4, 0x0003,
1362 0x0060, 0x0000, 0x000F, 0x000B, 0x000A, 0x0009, 0x0005, 0x000D,
1363 0x0031, 0x0008, 0x0038, 0x0012, 0x0026, 0x013F, 0x04FB, 0x000D,
1364 0x0002, 0x000C, 0x0039, 0x001C, 0x000F, 0x001D, 0x0008, 0x0019,
1365 ], [
1366 0x0007, 0x0019, 0x00AB, 0x00AA, 0x0119, 0x0461, 0x0460, 0x001B,
1367 0x0047, 0x0001, 0x0000, 0x000C, 0x000B, 0x0009, 0x0005, 0x000D,
1368 0x0035, 0x003D, 0x003C, 0x0018, 0x0022, 0x008D, 0x0231, 0x000E,
1369 0x001F, 0x0009, 0x002B, 0x0010, 0x0034, 0x0054, 0x0008, 0x0014,
1370 ], [
1371 0x000C, 0x0005, 0x0008, 0x005B, 0x004D, 0x0131, 0x0261, 0x001A,
1372 0x0012, 0x0000, 0x000F, 0x000A, 0x0009, 0x0006, 0x001B, 0x0006,
1373 0x001C, 0x002C, 0x0015, 0x005A, 0x0027, 0x0099, 0x0260, 0x000E,
1374 0x0004, 0x000F, 0x0007, 0x001D, 0x000B, 0x0014, 0x0008, 0x0017,
1375 ], [
1376 0x000F, 0x0013, 0x0075, 0x0024, 0x0095, 0x0251, 0x04A0, 0x0010,
1377 0x00C8, 0x0002, 0x0001, 0x0001, 0x0000, 0x001A, 0x0011, 0x002C,
1378 0x0065, 0x0074, 0x004B, 0x00C9, 0x0129, 0x0943, 0x0942, 0x0003,
1379 0x000A, 0x001C, 0x0018, 0x0033, 0x0017, 0x002D, 0x001B, 0x003B,
1380 ], [
1381 0x0003, 0x001A, 0x002D, 0x0038, 0x0028, 0x0395, 0x0E51, 0x0037,
1382 0x00E4, 0x0001, 0x0000, 0x001F, 0x001E, 0x0017, 0x003A, 0x0073,
1383 0x002A, 0x002B, 0x0029, 0x01CB, 0x0729, 0x1CA1, 0x1CA0, 0x0004,
1384 0x000A, 0x0004, 0x0018, 0x0036, 0x000B, 0x002C, 0x0019, 0x003B,
1385 ], [
1386 0x0004, 0x0004, 0x003F, 0x0017, 0x0075, 0x01F5, 0x07D1, 0x0017,
1387 0x01F6, 0x0001, 0x0000, 0x001B, 0x001A, 0x000A, 0x0032, 0x0074,
1388 0x00F8, 0x00F9, 0x01F7, 0x03E9, 0x0FA0, 0x1F43, 0x1F42, 0x0003,
1389 0x000A, 0x001E, 0x001C, 0x003B, 0x0018, 0x0016, 0x0016, 0x0033,
1390 ], [
1391 0x0004, 0x0007, 0x0018, 0x001E, 0x0036, 0x0031, 0x0177, 0x0077,
1392 0x0176, 0x0001, 0x0000, 0x001A, 0x0019, 0x003A, 0x0019, 0x005C,
1393 0x00BA, 0x0061, 0x00C1, 0x0180, 0x0302, 0x0607, 0x0606, 0x0002,
1394 0x000A, 0x001F, 0x001C, 0x0037, 0x0016, 0x0076, 0x000D, 0x002F,
1395 ], [
1396 0x0000, 0x000A, 0x001A, 0x000C, 0x001D, 0x0039, 0x0078, 0x005E,
1397 0x0393, 0x0002, 0x0001, 0x0016, 0x000F, 0x002E, 0x005F, 0x0073,
1398 0x00E5, 0x01C8, 0x0E4A, 0x1C97, 0x1C96, 0x0E49, 0x0E48, 0x0004,
1399 0x0006, 0x001F, 0x001B, 0x001D, 0x0038, 0x0038, 0x003D, 0x0079,
1400 ]
1401 ];
1402
1403 const VP3_AC_CAT0_BITS: [[u8; 32]; 16] = [
1404 [
1405 5, 7, 9, 10, 12, 13, 14, 5, 14, 4, 4, 4, 4, 4, 4, 4,
1406 5, 4, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 7, 11, 5, 7,
1407 ], [
1408 5, 6, 8, 8, 10, 12, 12, 4, 12, 4, 4, 4, 4, 4, 4, 4,
1409 5, 4, 4, 4, 4, 5, 6, 5, 6, 7, 7, 8, 9, 12, 5, 6,
1410 ], [
1411 5, 6, 8, 7, 10, 11, 12, 4, 13, 4, 4, 4, 4, 4, 4, 4,
1412 5, 4, 4, 4, 4, 5, 7, 5, 6, 6, 8, 8, 9, 13, 5, 6,
1413 ], [
1414 5, 6, 7, 7, 9, 10, 12, 4, 12, 4, 4, 4, 4, 4, 4, 4,
1415 5, 4, 4, 4, 5, 6, 8, 4, 6, 6, 7, 7, 7, 11, 5, 6,
1416 ], [
1417 4, 6, 7, 7, 9, 10, 13, 4, 13, 4, 4, 4, 4, 4, 4, 4,
1418 5, 4, 4, 5, 6, 7, 11, 4, 6, 6, 7, 7, 8, 12, 4, 6,
1419 ], [
1420 4, 6, 7, 6, 8, 10, 11, 4, 13, 3, 4, 4, 4, 4, 4, 5,
1421 5, 5, 5, 5, 7, 9, 13, 4, 5, 6, 7, 7, 7, 12, 4, 5,
1422 ], [
1423 4, 5, 7, 6, 8, 9, 10, 5, 12, 3, 3, 4, 4, 4, 4, 5,
1424 6, 5, 5, 6, 8, 13, 13, 4, 5, 5, 6, 7, 8, 11, 5, 5,
1425 ], [
1426 3, 5, 6, 5, 7, 9, 10, 5, 13, 3, 3, 4, 4, 4, 5, 6,
1427 6, 6, 7, 8, 13, 13, 13, 4, 5, 5, 6, 6, 7, 11, 5, 5,
1428 ], [
1429 5, 7, 8, 9, 11, 13, 13, 4, 7, 3, 4, 4, 4, 4, 4, 5,
1430 6, 5, 6, 6, 7, 10, 12, 4, 4, 5, 6, 6, 5, 6, 4, 5,
1431 ], [
1432 4, 6, 8, 8, 10, 12, 12, 5, 8, 3, 3, 4, 4, 4, 4, 5,
1433 6, 6, 6, 6, 7, 9, 11, 4, 5, 5, 6, 6, 6, 7, 4, 5,
1434 ], [
1435 4, 5, 6, 7, 9, 11, 12, 5, 7, 3, 4, 4, 4, 4, 5, 5,
1436 6, 6, 6, 7, 8, 10, 12, 4, 4, 5, 5, 6, 5, 6, 4, 5,
1437 ], [
1438 4, 5, 7, 6, 8, 10, 11, 5, 8, 3, 3, 4, 4, 5, 5, 6,
1439 7, 7, 7, 8, 9, 12, 12, 3, 4, 5, 5, 6, 5, 6, 5, 6,
1440 ], [
1441 3, 5, 6, 6, 7, 10, 12, 6, 8, 3, 3, 5, 5, 5, 6, 7,
1442 7, 7, 7, 9, 11, 13, 13, 3, 4, 4, 5, 6, 5, 6, 5, 6,
1443 ], [
1444 3, 4, 6, 5, 7, 9, 11, 6, 9, 3, 3, 5, 5, 5, 6, 7,
1445 8, 8, 9, 10, 12, 13, 13, 3, 4, 5, 5, 6, 5, 6, 5, 6,
1446 ], [
1447 3, 4, 5, 5, 6, 7, 9, 7, 9, 3, 3, 5, 5, 6, 6, 7,
1448 8, 8, 9, 10, 11, 12, 12, 3, 4, 5, 5, 6, 5, 7, 5, 6,
1449 ], [
1450 3, 4, 5, 4, 5, 6, 7, 7, 11, 3, 3, 5, 5, 6, 7, 8,
1451 9, 10, 13, 14, 14, 13, 13, 3, 4, 5, 5, 6, 6, 7, 6, 7,
1452 ]
1453 ];
1454
1455 const VP3_AC_CAT1_CODES: [[u16; 32]; 16] = [
1456 [
1457 0x000B, 0x002B, 0x0054, 0x01B7, 0x06D9, 0x0DB1, 0x0DB0, 0x0002,
1458 0x00AB, 0x0009, 0x000A, 0x0007, 0x0008, 0x000F, 0x000C, 0x0003,
1459 0x001D, 0x0004, 0x000B, 0x0006, 0x001A, 0x0003, 0x00AA, 0x0001,
1460 0x0000, 0x0014, 0x006C, 0x00DA, 0x0002, 0x036D, 0x001C, 0x0037,
1461 ], [
1462 0x001D, 0x0004, 0x00B6, 0x006A, 0x05B9, 0x16E1, 0x16E0, 0x0007,
1463 0x016F, 0x000C, 0x000D, 0x0009, 0x0008, 0x000F, 0x000A, 0x0003,
1464 0x0017, 0x0002, 0x0004, 0x001C, 0x002C, 0x006B, 0x0B71, 0x0005,
1465 0x0003, 0x001B, 0x005A, 0x0034, 0x0005, 0x02DD, 0x0000, 0x000C,
1466 ], [
1467 0x0003, 0x007F, 0x00A1, 0x00A0, 0x020C, 0x0834, 0x106B, 0x0007,
1468 0x0082, 0x000E, 0x000D, 0x000B, 0x000C, 0x0000, 0x0009, 0x0002,
1469 0x0011, 0x001E, 0x0015, 0x003E, 0x0040, 0x041B, 0x106A, 0x0006,
1470 0x000A, 0x0029, 0x007E, 0x0051, 0x0021, 0x0107, 0x0004, 0x000B,
1471 ], [
1472 0x0007, 0x001B, 0x00F6, 0x00E9, 0x03A1, 0x0740, 0x0E82, 0x001F,
1473 0x01EF, 0x0001, 0x0002, 0x000B, 0x000C, 0x000D, 0x0008, 0x001C,
1474 0x0003, 0x0012, 0x0002, 0x0075, 0x01D1, 0x1D07, 0x1D06, 0x000A,
1475 0x0013, 0x003B, 0x001A, 0x007A, 0x003C, 0x01EE, 0x0000, 0x000C,
1476 ], [
1477 0x000D, 0x003D, 0x0042, 0x0037, 0x00D9, 0x0362, 0x06C6, 0x001F,
1478 0x0086, 0x0001, 0x0002, 0x000C, 0x000B, 0x000A, 0x0001, 0x000F,
1479 0x0025, 0x003C, 0x001A, 0x0087, 0x01B0, 0x0D8F, 0x0D8E, 0x000E,
1480 0x0013, 0x000C, 0x0024, 0x0020, 0x0011, 0x006D, 0x0000, 0x000E,
1481 ], [
1482 0x0000, 0x0012, 0x0076, 0x0077, 0x014D, 0x0533, 0x14C9, 0x0013,
1483 0x00A5, 0x0002, 0x0003, 0x000B, 0x000C, 0x0008, 0x001A, 0x002B,
1484 0x0075, 0x0074, 0x00A7, 0x0298, 0x14C8, 0x14CB, 0x14CA, 0x000F,
1485 0x001C, 0x0007, 0x002A, 0x0028, 0x001B, 0x00A4, 0x0002, 0x0006,
1486 ], [
1487 0x0002, 0x001A, 0x002B, 0x003A, 0x00ED, 0x0283, 0x0A0A, 0x0004,
1488 0x00A1, 0x0004, 0x0003, 0x000B, 0x000C, 0x001F, 0x0006, 0x0077,
1489 0x00A3, 0x00A2, 0x0140, 0x1417, 0x1416, 0x0A09, 0x0A08, 0x0000,
1490 0x001E, 0x0007, 0x002A, 0x0029, 0x001C, 0x00EC, 0x001B, 0x0005,
1491 ], [
1492 0x0002, 0x0002, 0x0018, 0x001D, 0x0035, 0x00E4, 0x01CF, 0x001D,
1493 0x0072, 0x0004, 0x0005, 0x0006, 0x0007, 0x0006, 0x0073, 0x0038,
1494 0x01CE, 0x039B, 0x0398, 0x0733, 0x0732, 0x0735, 0x0734, 0x0000,
1495 0x001F, 0x001B, 0x0034, 0x000F, 0x001E, 0x00E5, 0x0019, 0x0038,
1496 ], [
1497 0x0016, 0x0050, 0x0172, 0x02E7, 0x1732, 0x2E67, 0x2E66, 0x0006,
1498 0x0051, 0x0001, 0x0000, 0x000D, 0x000C, 0x0009, 0x001C, 0x0009,
1499 0x001C, 0x001D, 0x005D, 0x00B8, 0x05CD, 0x1731, 0x1730, 0x000F,
1500 0x0005, 0x000F, 0x0008, 0x0029, 0x001D, 0x002F, 0x0008, 0x0015,
1501 ], [
1502 0x0009, 0x0021, 0x0040, 0x00AD, 0x02B0, 0x1589, 0x1588, 0x001C,
1503 0x005F, 0x0000, 0x000F, 0x000D, 0x000C, 0x0006, 0x0011, 0x002A,
1504 0x0057, 0x005E, 0x0041, 0x0159, 0x0563, 0x158B, 0x158A, 0x0001,
1505 0x0005, 0x0014, 0x003B, 0x002E, 0x0004, 0x003A, 0x0007, 0x0016,
1506 ], [
1507 0x000E, 0x0007, 0x0046, 0x0045, 0x0064, 0x032A, 0x0657, 0x0018,
1508 0x000D, 0x0000, 0x000F, 0x000A, 0x000B, 0x001A, 0x0036, 0x0047,
1509 0x0044, 0x0018, 0x0033, 0x00CB, 0x0656, 0x0329, 0x0328, 0x0002,
1510 0x0006, 0x0019, 0x000E, 0x0037, 0x0009, 0x000F, 0x0002, 0x0010,
1511 ], [
1512 0x0003, 0x0018, 0x0023, 0x0077, 0x0194, 0x1956, 0x32AF, 0x003A,
1513 0x0076, 0x0002, 0x0001, 0x001F, 0x001E, 0x0014, 0x0022, 0x0064,
1514 0x0197, 0x0196, 0x032B, 0x0654, 0x32AE, 0x1955, 0x1954, 0x0000,
1515 0x0009, 0x001C, 0x0015, 0x0010, 0x000D, 0x0017, 0x0016, 0x0033,
1516 ], [
1517 0x0005, 0x0006, 0x003E, 0x0010, 0x0048, 0x093F, 0x24FA, 0x0032,
1518 0x0067, 0x0002, 0x0001, 0x001B, 0x001E, 0x0034, 0x0066, 0x0092,
1519 0x0126, 0x024E, 0x049E, 0x49F7, 0x49F6, 0x24F9, 0x24F8, 0x0000,
1520 0x0007, 0x0018, 0x0011, 0x003F, 0x000E, 0x0013, 0x0035, 0x0025,
1521 ], [
1522 0x0005, 0x0008, 0x0012, 0x001C, 0x001C, 0x00EA, 0x1D75, 0x001E,
1523 0x0066, 0x0001, 0x0002, 0x001B, 0x001A, 0x001F, 0x003B, 0x0074,
1524 0x01D6, 0x03AF, 0x1D74, 0x1D77, 0x1D76, 0x0EB9, 0x0EB8, 0x000F,
1525 0x0006, 0x0013, 0x003B, 0x003A, 0x0000, 0x0018, 0x0032, 0x0067,
1526 ], [
1527 0x0004, 0x000A, 0x001B, 0x000C, 0x000D, 0x00E6, 0x0684, 0x0072,
1528 0x00E7, 0x0002, 0x0001, 0x0017, 0x0016, 0x0018, 0x00D1, 0x01A0,
1529 0x0686, 0x0D0F, 0x0D0A, 0x1A17, 0x1A16, 0x1A1D, 0x1A1C, 0x000F,
1530 0x001D, 0x000E, 0x0035, 0x0038, 0x0000, 0x000F, 0x0019, 0x0069,
1531 ], [
1532 0x0003, 0x000C, 0x001B, 0x0000, 0x0003, 0x002E, 0x0051, 0x00BC,
1533 0x0053, 0x0004, 0x0002, 0x0016, 0x0015, 0x0015, 0x0050, 0x00A4,
1534 0x0294, 0x052B, 0x052A, 0x052D, 0x052C, 0x052F, 0x052E, 0x000E,
1535 0x001A, 0x0004, 0x0028, 0x0029, 0x000F, 0x000B, 0x005F, 0x00BD,
1536 ]
1537 ];
1538
1539 const VP3_AC_CAT1_BITS: [[u8; 32]; 16] = [
1540 [
1541 5, 7, 8, 9, 11, 12, 12, 4, 9, 4, 4, 4, 4, 4, 4, 4,
1542 5, 4, 4, 4, 5, 6, 9, 4, 5, 6, 7, 8, 6, 10, 5, 6,
1543 ], [
1544 5, 6, 8, 8, 11, 13, 13, 4, 9, 4, 4, 4, 4, 4, 4, 4,
1545 5, 4, 4, 5, 6, 8, 12, 4, 5, 6, 7, 7, 6, 10, 4, 5,
1546 ], [
1547 4, 7, 8, 8, 10, 12, 13, 4, 8, 4, 4, 4, 4, 3, 4, 4,
1548 5, 5, 5, 6, 7, 11, 13, 4, 5, 6, 7, 7, 6, 9, 4, 5,
1549 ], [
1550 4, 6, 8, 8, 10, 11, 12, 5, 9, 3, 3, 4, 4, 4, 4, 5,
1551 5, 5, 5, 7, 9, 13, 13, 4, 5, 6, 6, 7, 6, 9, 4, 5,
1552 ], [
1553 4, 6, 7, 7, 9, 11, 12, 5, 8, 3, 3, 4, 4, 4, 4, 5,
1554 6, 6, 6, 8, 10, 13, 13, 4, 5, 5, 6, 6, 5, 8, 4, 5,
1555 ], [
1556 3, 5, 7, 7, 9, 11, 13, 5, 8, 3, 3, 4, 4, 4, 5, 6,
1557 7, 7, 8, 10, 13, 13, 13, 4, 5, 5, 6, 6, 5, 8, 4, 5,
1558 ], [
1559 3, 5, 6, 6, 8, 10, 12, 5, 8, 3, 3, 4, 4, 5, 5, 7,
1560 8, 8, 9, 13, 13, 12, 12, 3, 5, 5, 6, 6, 5, 8, 5, 5,
1561 ], [
1562 3, 4, 5, 5, 6, 8, 11, 7, 9, 3, 3, 4, 4, 5, 7, 8,
1563 11, 12, 12, 13, 13, 13, 13, 3, 5, 5, 6, 6, 5, 8, 5, 6,
1564 ], [
1565 5, 7, 9, 10, 13, 14, 14, 4, 7, 3, 3, 4, 4, 4, 5, 5,
1566 6, 6, 7, 8, 11, 13, 13, 4, 4, 5, 5, 6, 5, 6, 4, 5,
1567 ], [
1568 4, 6, 7, 8, 10, 13, 13, 5, 7, 3, 4, 4, 4, 4, 5, 6,
1569 7, 7, 7, 9, 11, 13, 13, 3, 4, 5, 6, 6, 4, 6, 4, 5,
1570 ], [
1571 4, 5, 7, 7, 9, 12, 13, 5, 6, 3, 4, 4, 4, 5, 6, 7,
1572 7, 7, 8, 10, 13, 12, 12, 3, 4, 5, 5, 6, 4, 5, 4, 5,
1573 ], [
1574 3, 5, 6, 7, 9, 13, 14, 6, 7, 3, 3, 5, 5, 5, 6, 7,
1575 9, 9, 10, 11, 14, 13, 13, 3, 4, 5, 5, 5, 4, 5, 5, 6,
1576 ], [
1577 3, 4, 6, 5, 7, 12, 14, 6, 7, 3, 3, 5, 5, 6, 7, 8,
1578 9, 10, 11, 15, 15, 14, 14, 3, 4, 5, 5, 6, 4, 5, 6, 6,
1579 ], [
1580 3, 4, 5, 5, 6, 9, 14, 6, 7, 3, 3, 5, 5, 6, 7, 8,
1581 10, 11, 14, 14, 14, 13, 13, 4, 4, 5, 6, 6, 3, 5, 6, 7,
1582 ], [
1583 3, 4, 5, 4, 5, 8, 11, 7, 8, 3, 3, 5, 5, 6, 8, 9,
1584 11, 12, 12, 13, 13, 13, 13, 4, 5, 5, 6, 6, 3, 5, 6, 7,
1585 ], [
1586 3, 4, 5, 3, 4, 6, 9, 8, 9, 3, 3, 5, 5, 7, 9, 10,
1587 12, 13, 13, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 6, 7, 8,
1588 ]
1589 ];
1590
1591 const VP3_AC_CAT2_CODES: [[u16; 32]; 16] = [
1592 [
1593 0x0003, 0x0009, 0x00D0, 0x01A3, 0x0344, 0x0D14, 0x1A2B, 0x0004,
1594 0x0015, 0x0000, 0x000F, 0x000B, 0x000C, 0x000E, 0x0009, 0x001B,
1595 0x000A, 0x0014, 0x000D, 0x002A, 0x0014, 0x068B, 0x1A2A, 0x0008,
1596 0x000B, 0x002B, 0x000B, 0x0069, 0x0035, 0x0008, 0x0007, 0x000C,
1597 ], [
1598 0x000A, 0x003C, 0x0032, 0x0030, 0x00C5, 0x0621, 0x0620, 0x001F,
1599 0x0033, 0x0001, 0x0000, 0x000E, 0x000D, 0x000C, 0x0004, 0x000D,
1600 0x0026, 0x0027, 0x0014, 0x0063, 0x0189, 0x0623, 0x0622, 0x000B,
1601 0x0012, 0x003D, 0x0022, 0x0015, 0x000B, 0x0023, 0x0007, 0x0010,
1602 ], [
1603 0x000F, 0x000C, 0x0043, 0x0010, 0x0044, 0x0114, 0x0455, 0x0018,
1604 0x0023, 0x0001, 0x0000, 0x000E, 0x000D, 0x0009, 0x0019, 0x0009,
1605 0x0017, 0x0016, 0x0042, 0x008B, 0x0454, 0x0457, 0x0456, 0x000B,
1606 0x0015, 0x000A, 0x0029, 0x0020, 0x000D, 0x0028, 0x0007, 0x0011,
1607 ], [
1608 0x0001, 0x001A, 0x0029, 0x002A, 0x00A0, 0x0285, 0x1425, 0x0002,
1609 0x0000, 0x0002, 0x0003, 0x000C, 0x000B, 0x0008, 0x0012, 0x0001,
1610 0x0051, 0x0001, 0x0143, 0x0508, 0x1424, 0x1427, 0x1426, 0x000F,
1611 0x001C, 0x0003, 0x0037, 0x002B, 0x0013, 0x0036, 0x001D, 0x0001,
1612 ], [
1613 0x0004, 0x001F, 0x003D, 0x0006, 0x0016, 0x0053, 0x014A, 0x0034,
1614 0x002A, 0x0002, 0x0003, 0x000B, 0x000C, 0x001C, 0x0037, 0x0017,
1615 0x002B, 0x0028, 0x00A4, 0x052D, 0x052C, 0x052F, 0x052E, 0x0000,
1616 0x001D, 0x0007, 0x0004, 0x0035, 0x0014, 0x0036, 0x0015, 0x003C,
1617 ], [
1618 0x0004, 0x000A, 0x0007, 0x001D, 0x0009, 0x01F3, 0x07C7, 0x0008,
1619 0x01F0, 0x0003, 0x0002, 0x000D, 0x000C, 0x0017, 0x007D, 0x01F2,
1620 0x07C6, 0x07C5, 0x1F12, 0x3E27, 0x3E26, 0x1F11, 0x1F10, 0x0000,
1621 0x001E, 0x0006, 0x0039, 0x0038, 0x003F, 0x002C, 0x0005, 0x002D,
1622 ], [
1623 0x0002, 0x0007, 0x0018, 0x0003, 0x0005, 0x0035, 0x004F, 0x0012,
1624 0x04E5, 0x0005, 0x0004, 0x000D, 0x000E, 0x0033, 0x0026, 0x009D,
1625 0x04E4, 0x04E7, 0x04E6, 0x04E1, 0x04E0, 0x04E3, 0x04E2, 0x0000,
1626 0x001F, 0x000C, 0x003D, 0x003C, 0x0032, 0x0034, 0x001B, 0x0008,
1627 ], [
1628 0x0000, 0x0004, 0x001C, 0x000F, 0x0002, 0x0007, 0x0075, 0x00E8,
1629 0x1D2A, 0x0005, 0x0004, 0x000D, 0x000C, 0x0077, 0x0E96, 0x3A57,
1630 0x3A56, 0x3A5D, 0x3A5C, 0x3A5F, 0x3A5E, 0x1D29, 0x1D28, 0x0003,
1631 0x0006, 0x000A, 0x002C, 0x0017, 0x0076, 0x01D3, 0x03A4, 0x002D,
1632 ], [
1633 0x000A, 0x0024, 0x00BF, 0x0085, 0x0211, 0x0842, 0x1087, 0x0018,
1634 0x0020, 0x0001, 0x0002, 0x000E, 0x000D, 0x0007, 0x0013, 0x0025,
1635 0x005E, 0x0043, 0x00BE, 0x0109, 0x1086, 0x0841, 0x0840, 0x000F,
1636 0x0001, 0x0011, 0x0000, 0x002E, 0x0019, 0x0001, 0x0006, 0x0016,
1637 ], [
1638 0x0002, 0x000F, 0x006F, 0x0061, 0x0374, 0x1BA8, 0x3753, 0x0012,
1639 0x0036, 0x0000, 0x0001, 0x000A, 0x000B, 0x001A, 0x0031, 0x0060,
1640 0x00DC, 0x01BB, 0x06EB, 0x1BAB, 0x3752, 0x3755, 0x3754, 0x000E,
1641 0x0006, 0x0013, 0x000E, 0x003E, 0x0008, 0x001E, 0x0019, 0x003F,
1642 ], [
1643 0x0003, 0x001C, 0x0025, 0x0024, 0x01DA, 0x1DBD, 0x3B7C, 0x003C,
1644 0x003D, 0x0000, 0x0001, 0x000B, 0x000A, 0x000B, 0x0077, 0x00EC,
1645 0x03B6, 0x076E, 0x1DBF, 0x76FB, 0x76FA, 0x3B79, 0x3B78, 0x000D,
1646 0x001F, 0x0013, 0x000A, 0x0008, 0x000C, 0x0008, 0x0009, 0x003A,
1647 ], [
1648 0x0005, 0x0003, 0x0004, 0x0010, 0x008F, 0x0475, 0x11D1, 0x0079,
1649 0x0027, 0x0002, 0x0003, 0x0001, 0x0000, 0x0026, 0x0046, 0x011C,
1650 0x0477, 0x08ED, 0x11D0, 0x11D3, 0x11D2, 0x11D9, 0x11D8, 0x000D,
1651 0x001F, 0x0012, 0x0005, 0x003D, 0x000C, 0x000E, 0x0022, 0x0078,
1652 ], [
1653 0x0005, 0x000C, 0x001B, 0x0000, 0x0006, 0x03E2, 0x3E3D, 0x000F,
1654 0x0034, 0x0003, 0x0002, 0x001E, 0x001D, 0x007D, 0x01F0, 0x07C6,
1655 0x3E3C, 0x3E3F, 0x3E3E, 0x3E39, 0x3E38, 0x3E3B, 0x3E3A, 0x0008,
1656 0x001C, 0x0002, 0x003F, 0x0035, 0x0009, 0x0001, 0x000E, 0x00F9,
1657 ], [
1658 0x0004, 0x000B, 0x0001, 0x000A, 0x001E, 0x00E0, 0x0E1E, 0x0071,
1659 0x0039, 0x0007, 0x0006, 0x000D, 0x000C, 0x0020, 0x01C2, 0x1C3F,
1660 0x1C3E, 0x0E19, 0x0E18, 0x0E1B, 0x0E1A, 0x0E1D, 0x0E1C, 0x0000,
1661 0x0009, 0x001D, 0x001F, 0x0011, 0x0005, 0x0001, 0x0043, 0x0042,
1662 ], [
1663 0x0004, 0x000D, 0x0007, 0x0002, 0x0014, 0x016C, 0x16D1, 0x02DF,
1664 0x016E, 0x0000, 0x0007, 0x002C, 0x002B, 0x02DE, 0x16D0, 0x16D3,
1665 0x16D2, 0x2DB5, 0x2DB4, 0x2DB7, 0x2DB6, 0x16D9, 0x16D8, 0x000C,
1666 0x002A, 0x005A, 0x001B, 0x001A, 0x0017, 0x000C, 0x05B7, 0x05B5,
1667 ], [
1668 0x0002, 0x000F, 0x001C, 0x000C, 0x003B, 0x01AC, 0x1AD8, 0x35B3,
1669 0x35B2, 0x0001, 0x0000, 0x0069, 0x0068, 0x35BD, 0x35BC, 0x35BF,
1670 0x35BE, 0x35B9, 0x35B8, 0x35BB, 0x35BA, 0x35B5, 0x35B4, 0x01A9,
1671 0x01A8, 0x035A, 0x00D7, 0x00D5, 0x003A, 0x001B, 0x35B7, 0x35B6,
1672 ]
1673 ];
1674
1675 const VP3_AC_CAT2_BITS: [[u8; 32]; 16] = [
1676 [
1677 4, 6, 8, 9, 10, 12, 13, 4, 7, 3, 4, 4, 4, 4, 4, 5,
1678 5, 5, 5, 6, 7, 11, 13, 4, 5, 6, 6, 7, 6, 6, 4, 5,
1679 ], [
1680 4, 6, 7, 7, 9, 12, 12, 5, 7, 3, 3, 4, 4, 4, 4, 5,
1681 6, 6, 6, 8, 10, 12, 12, 4, 5, 6, 6, 6, 5, 6, 4, 5,
1682 ], [
1683 4, 5, 7, 6, 8, 10, 12, 5, 7, 3, 3, 4, 4, 4, 5, 5,
1684 6, 6, 7, 9, 12, 12, 12, 4, 5, 5, 6, 6, 5, 6, 4, 5,
1685 ], [
1686 3, 5, 6, 6, 8, 10, 13, 5, 7, 3, 3, 4, 4, 4, 5, 6,
1687 7, 7, 9, 11, 13, 13, 13, 4, 5, 5, 6, 6, 5, 6, 5, 5,
1688 ], [
1689 3, 5, 6, 5, 7, 9, 11, 6, 8, 3, 3, 4, 4, 5, 6, 7,
1690 8, 8, 10, 13, 13, 13, 13, 3, 5, 5, 5, 6, 5, 6, 5, 6,
1691 ], [
1692 3, 4, 5, 5, 6, 9, 11, 6, 9, 3, 3, 4, 4, 5, 7, 9,
1693 11, 11, 13, 14, 14, 13, 13, 3, 5, 5, 6, 6, 6, 6, 5, 6,
1694 ], [
1695 3, 4, 5, 4, 5, 7, 9, 7, 13, 3, 3, 4, 4, 6, 8, 10,
1696 13, 13, 13, 13, 13, 13, 13, 3, 5, 5, 6, 6, 6, 7, 6, 6,
1697 ], [
1698 3, 4, 5, 4, 4, 5, 7, 8, 13, 3, 3, 4, 4, 7, 12, 14,
1699 14, 14, 14, 14, 14, 13, 13, 3, 5, 5, 7, 6, 7, 9, 10, 7,
1700 ], [
1701 4, 6, 8, 8, 10, 12, 13, 5, 6, 3, 3, 4, 4, 4, 5, 6,
1702 7, 7, 8, 9, 13, 12, 12, 4, 4, 5, 5, 6, 5, 5, 4, 5,
1703 ], [
1704 3, 5, 7, 7, 10, 13, 14, 5, 6, 3, 3, 4, 4, 5, 6, 7,
1705 8, 9, 11, 13, 14, 14, 14, 4, 4, 5, 5, 6, 4, 5, 5, 6,
1706 ], [
1707 3, 5, 6, 6, 9, 13, 14, 6, 6, 3, 3, 4, 4, 5, 7, 8,
1708 10, 11, 13, 15, 15, 14, 14, 4, 5, 5, 5, 5, 4, 4, 5, 6,
1709 ], [
1710 3, 4, 5, 5, 8, 11, 13, 7, 6, 3, 3, 4, 4, 6, 7, 9,
1711 11, 12, 13, 13, 13, 13, 13, 4, 5, 5, 5, 6, 4, 4, 6, 7,
1712 ], [
1713 3, 4, 5, 4, 6, 10, 14, 7, 6, 3, 3, 5, 5, 7, 9, 11,
1714 14, 14, 14, 14, 14, 14, 14, 4, 5, 5, 6, 6, 4, 3, 7, 8,
1715 ], [
1716 3, 4, 4, 4, 6, 9, 13, 8, 7, 3, 3, 5, 5, 7, 10, 14,
1717 14, 13, 13, 13, 13, 13, 13, 4, 5, 6, 6, 6, 4, 3, 8, 8,
1718 ], [
1719 3, 4, 4, 3, 5, 9, 13, 10, 9, 2, 3, 6, 6, 10, 13, 13,
1720 13, 14, 14, 14, 14, 13, 13, 5, 6, 7, 6, 6, 5, 4, 11, 11,
1721 ], [
1722 2, 4, 5, 4, 6, 9, 13, 14, 14, 2, 2, 7, 7, 14, 14, 14,
1723 14, 14, 14, 14, 14, 14, 14, 9, 9, 10, 8, 8, 6, 5, 14, 14,
1724 ]
1725 ];
1726
1727 const VP3_AC_CAT3_CODES: [[u16; 32]; 16] = [
1728 [
1729 0x0000, 0x0010, 0x0072, 0x0071, 0x0154, 0x0AAB, 0x0AA8, 0x0014,
1730 0x0070, 0x0002, 0x0003, 0x000C, 0x000B, 0x0003, 0x0011, 0x0073,
1731 0x0054, 0x00AB, 0x02AB, 0x1553, 0x1552, 0x1555, 0x1554, 0x000D,
1732 0x001E, 0x0012, 0x003E, 0x002B, 0x0002, 0x003F, 0x001D, 0x0013,
1733 ], [
1734 0x0003, 0x001F, 0x0029, 0x003D, 0x000C, 0x0069, 0x0345, 0x0002,
1735 0x0028, 0x0002, 0x0001, 0x000E, 0x000C, 0x0015, 0x0007, 0x001B,
1736 0x006B, 0x006A, 0x0344, 0x0347, 0x0346, 0x01A1, 0x01A0, 0x000B,
1737 0x001A, 0x0012, 0x0000, 0x003C, 0x0008, 0x001B, 0x0013, 0x0001,
1738 ], [
1739 0x0004, 0x0004, 0x003F, 0x0014, 0x0056, 0x015C, 0x15D5, 0x003C,
1740 0x002A, 0x0000, 0x0001, 0x000E, 0x000D, 0x000C, 0x00AF, 0x02BB,
1741 0x15D4, 0x15D7, 0x15D6, 0x15D1, 0x15D0, 0x15D3, 0x15D2, 0x000B,
1742 0x0019, 0x000D, 0x003E, 0x0031, 0x0007, 0x0005, 0x003D, 0x0030,
1743 ], [
1744 0x0005, 0x0008, 0x001A, 0x0000, 0x0036, 0x0011, 0x0106, 0x000A,
1745 0x006E, 0x0002, 0x0003, 0x0003, 0x0002, 0x006F, 0x0021, 0x020F,
1746 0x020E, 0x0101, 0x0100, 0x0103, 0x0102, 0x0105, 0x0104, 0x000C,
1747 0x001E, 0x0003, 0x003E, 0x003F, 0x0009, 0x000E, 0x000B, 0x0009,
1748 ], [
1749 0x0002, 0x000E, 0x001E, 0x000C, 0x001F, 0x006E, 0x00AD, 0x00AF,
1750 0x0014, 0x0004, 0x0003, 0x001A, 0x0017, 0x002A, 0x0576, 0x0AEF,
1751 0x0AEE, 0x0571, 0x0570, 0x0573, 0x0572, 0x0575, 0x0574, 0x0003,
1752 0x0016, 0x0004, 0x0036, 0x000B, 0x000A, 0x0000, 0x006F, 0x00AC,
1753 ], [
1754 0x0004, 0x0005, 0x0003, 0x0001, 0x0004, 0x002F, 0x0526, 0x1495,
1755 0x00A6, 0x0007, 0x0006, 0x002D, 0x002C, 0x1494, 0x1497, 0x1496,
1756 0x1491, 0x1490, 0x1493, 0x1492, 0x293D, 0x293C, 0x293F, 0x0000,
1757 0x0028, 0x00A5, 0x0148, 0x00A7, 0x002E, 0x0015, 0x0A4E, 0x293E,
1758 ], [
1759 0x0004, 0x0005, 0x0003, 0x0001, 0x0004, 0x002F, 0x0526, 0x1495,
1760 0x00A6, 0x0007, 0x0006, 0x002D, 0x002C, 0x1494, 0x1497, 0x1496,
1761 0x1491, 0x1490, 0x1493, 0x1492, 0x293D, 0x293C, 0x293F, 0x0000,
1762 0x0028, 0x00A5, 0x0148, 0x00A7, 0x002E, 0x0015, 0x0A4E, 0x293E,
1763 ], [
1764 0x0004, 0x0005, 0x0003, 0x0001, 0x0004, 0x002F, 0x0526, 0x1495,
1765 0x00A6, 0x0007, 0x0006, 0x002D, 0x002C, 0x1494, 0x1497, 0x1496,
1766 0x1491, 0x1490, 0x1493, 0x1492, 0x293D, 0x293C, 0x293F, 0x0000,
1767 0x0028, 0x00A5, 0x0148, 0x00A7, 0x002E, 0x0015, 0x0A4E, 0x293E,
1768 ], [
1769 0x0003, 0x0011, 0x0020, 0x0074, 0x010D, 0x0863, 0x0860, 0x000A,
1770 0x0075, 0x0001, 0x0000, 0x000B, 0x000A, 0x0018, 0x0038, 0x0042,
1771 0x010F, 0x010E, 0x0219, 0x10C3, 0x10C2, 0x10C5, 0x10C4, 0x000F,
1772 0x0004, 0x0019, 0x000B, 0x0039, 0x0009, 0x001B, 0x001A, 0x003B,
1773 ], [
1774 0x0005, 0x0001, 0x003E, 0x0001, 0x00E2, 0x1C6F, 0x38D9, 0x0039,
1775 0x001F, 0x0002, 0x0001, 0x0009, 0x0008, 0x0000, 0x0070, 0x01C7,
1776 0x038C, 0x071A, 0x38D8, 0x38DB, 0x38DA, 0x38DD, 0x38DC, 0x000D,
1777 0x001D, 0x000E, 0x003F, 0x003C, 0x000C, 0x0006, 0x003D, 0x001E,
1778 ], [
1779 0x0006, 0x000B, 0x0011, 0x001E, 0x0074, 0x03AA, 0x1D5C, 0x0001,
1780 0x0021, 0x0001, 0x0002, 0x0007, 0x0006, 0x003E, 0x00EB, 0x01D4,
1781 0x0EAF, 0x3ABB, 0x3ABA, 0x1D59, 0x1D58, 0x1D5B, 0x1D5A, 0x000A,
1782 0x001C, 0x0001, 0x003F, 0x003B, 0x0001, 0x0009, 0x0020, 0x0000,
1783 ], [
1784 0x0004, 0x000A, 0x0017, 0x0004, 0x0016, 0x016A, 0x16B1, 0x0017,
1785 0x005B, 0x0006, 0x0007, 0x0001, 0x0000, 0x000A, 0x02D7, 0x0B5A,
1786 0x16B0, 0x16B3, 0x16B2, 0x2D6D, 0x2D6C, 0x2D6F, 0x2D6E, 0x0006,
1787 0x000A, 0x0004, 0x002C, 0x0017, 0x0003, 0x0007, 0x0016, 0x00B4,
1788 ], [
1789 0x0005, 0x000D, 0x0005, 0x0009, 0x0033, 0x0193, 0x192C, 0x0061,
1790 0x0031, 0x0000, 0x0007, 0x0010, 0x0011, 0x00C8, 0x192F, 0x325B,
1791 0x325A, 0x1929, 0x1928, 0x192B, 0x192A, 0x325D, 0x325C, 0x0018,
1792 0x001A, 0x001B, 0x0065, 0x0019, 0x0004, 0x0007, 0x0060, 0x0324,
1793 ], [
1794 0x0006, 0x0000, 0x0002, 0x000F, 0x0039, 0x01D9, 0x1D82, 0x0761,
1795 0x03BE, 0x0001, 0x0002, 0x000F, 0x000E, 0x0762, 0x3B07, 0x3B06,
1796 0x3B1D, 0x3B1C, 0x3B1F, 0x3B1E, 0x3B19, 0x3B18, 0x3B1B, 0x0038,
1797 0x01DE, 0x00ED, 0x03BF, 0x00EE, 0x003A, 0x0006, 0x0EC0, 0x3B1A,
1798 ], [
1799 0x0000, 0x0002, 0x000F, 0x0006, 0x001C, 0x01D0, 0x0E8C, 0x1D1B,
1800 0x1D1A, 0x0003, 0x0002, 0x00EA, 0x00E9, 0x0E89, 0x0E88, 0x0E8B,
1801 0x0E8A, 0x1D65, 0x1D64, 0x1D67, 0x1D66, 0x1D61, 0x1D60, 0x03AD,
1802 0x1D63, 0x1D62, 0x1D1D, 0x1D1C, 0x003B, 0x01D7, 0x1D1F, 0x1D1E,
1803 ], [
1804 0x0002, 0x000F, 0x001C, 0x000C, 0x003B, 0x01AC, 0x1AD8, 0x35B3,
1805 0x35B2, 0x0001, 0x0000, 0x0069, 0x0068, 0x35BD, 0x35BC, 0x35BF,
1806 0x35BE, 0x35B9, 0x35B8, 0x35BB, 0x35BA, 0x35B5, 0x35B4, 0x01A9,
1807 0x01A8, 0x035A, 0x00D7, 0x00D5, 0x003A, 0x001B, 0x35B7, 0x35B6,
1808 ]
1809 ];
1810
1811 const VP3_AC_CAT3_BITS: [[u8; 32]; 16] = [
1812 [
1813 3, 5, 7, 7, 9, 12, 12, 5, 7, 3, 3, 4, 4, 4, 5, 7,
1814 7, 8, 10, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 6, 5, 5,
1815 ], [
1816 3, 5, 6, 6, 7, 10, 13, 5, 6, 3, 3, 4, 4, 5, 6, 8,
1817 10, 10, 13, 13, 13, 12, 12, 4, 5, 5, 5, 6, 4, 5, 5, 5,
1818 ], [
1819 3, 4, 6, 5, 7, 9, 13, 6, 6, 3, 3, 4, 4, 5, 8, 10,
1820 13, 13, 13, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 4, 6, 6,
1821 ], [
1822 3, 4, 5, 4, 6, 8, 12, 7, 7, 3, 3, 4, 4, 7, 9, 13,
1823 13, 12, 12, 12, 12, 12, 12, 4, 5, 5, 6, 6, 4, 4, 7, 7,
1824 ], [
1825 3, 4, 5, 4, 5, 7, 10, 10, 7, 3, 3, 5, 5, 8, 13, 14,
1826 14, 13, 13, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 3, 7, 10,
1827 ], [
1828 3, 4, 3, 3, 4, 6, 11, 13, 8, 3, 3, 6, 6, 13, 13, 13,
1829 13, 13, 13, 13, 14, 14, 14, 3, 6, 8, 9, 8, 6, 5, 12, 14,
1830 ], [
1831 3, 4, 3, 3, 4, 6, 11, 13, 8, 3, 3, 6, 6, 13, 13, 13,
1832 13, 13, 13, 13, 14, 14, 14, 3, 6, 8, 9, 8, 6, 5, 12, 14,
1833 ], [
1834 3, 4, 3, 3, 4, 6, 11, 13, 8, 3, 3, 6, 6, 13, 13, 13,
1835 13, 13, 13, 13, 14, 14, 14, 3, 6, 8, 9, 8, 6, 5, 12, 14,
1836 ], [
1837 3, 5, 6, 7, 9, 12, 12, 5, 7, 3, 3, 4, 4, 5, 6, 7,
1838 9, 9, 10, 13, 13, 13, 13, 4, 4, 5, 5, 6, 4, 5, 5, 6,
1839 ], [
1840 3, 4, 6, 5, 8, 13, 14, 6, 6, 3, 3, 4, 4, 5, 7, 9,
1841 10, 11, 14, 14, 14, 14, 14, 4, 5, 5, 6, 6, 4, 4, 6, 6,
1842 ], [
1843 3, 4, 5, 5, 7, 10, 13, 6, 6, 3, 3, 4, 4, 6, 8, 9,
1844 12, 14, 14, 13, 13, 13, 13, 4, 5, 5, 6, 6, 4, 4, 6, 6,
1845 ], [
1846 3, 4, 5, 4, 6, 9, 13, 7, 7, 3, 3, 4, 4, 6, 10, 12,
1847 13, 13, 13, 14, 14, 14, 14, 4, 5, 5, 6, 6, 4, 4, 7, 8,
1848 ], [
1849 3, 4, 4, 4, 6, 9, 13, 8, 7, 2, 3, 5, 5, 8, 13, 14,
1850 14, 13, 13, 13, 13, 14, 14, 5, 6, 6, 7, 6, 4, 4, 8, 10,
1851 ], [
1852 3, 3, 4, 4, 6, 9, 13, 11, 10, 2, 2, 6, 6, 11, 14, 14,
1853 14, 14, 14, 14, 14, 14, 14, 6, 9, 8, 10, 8, 6, 5, 12, 14,
1854 ], [
1855 2, 3, 5, 4, 6, 10, 13, 14, 14, 2, 2, 9, 9, 13, 13, 13,
1856 13, 14, 14, 14, 14, 14, 14, 11, 14, 14, 14, 14, 7, 10, 14, 14,
1857 ], [
1858 2, 4, 5, 4, 6, 9, 13, 14, 14, 2, 2, 7, 7, 14, 14, 14,
1859 14, 14, 14, 14, 14, 14, 14, 9, 9, 10, 8, 8, 6, 5, 14, 14,
1860 ]
1861 ];
1862
1863 const VP3_DC_WEIGHTS: [[i16; 5]; 16] = [
1864 [ 0, 0, 0, 0, 0 ],
1865 [ 1, 0, 0, 0, 1 ],
1866 [ 0, 1, 0, 0, 1 ],
1867 [ 1, 0, 0, 0, 1 ],
1868
1869 [ 0, 0, 1, 0, 1 ],
1870 [ 1, 0, 1, 0, 2 ],
1871 [ 0, 0, 1, 0, 1 ],
1872 [ 29, -26, 29, 0, 32 ],
1873
1874 [ 0, 0, 0, 1, 1 ],
1875 [ 75, 0, 0, 53, 128 ],
1876 [ 0, 1, 0, 1, 2 ],
1877 [ 75, 0, 0, 53, 128 ],
1878
1879 [ 0, 0, 1, 0, 1 ],
1880 [ 75, 0, 0, 53, 128 ],
1881 [ 0, 3, 10, 3, 16 ],
1882 [ 29, -26, 29, 0, 32 ],
1883 ];