2 use nihav_core::codecs::*;
3 use nihav_core::io::byteio::*;
4 use nihav_core::io::bitreader::*;
5 use nihav_core::io::codebook::*;
6 use nihav_codec_support::codecs::{IPShuffler, HAMShuffler};
8 const SKIP_BLOCK: u8 = 0;
9 const SCALED_BLOCK: u8 = 1;
10 const MOTION_BLOCK: u8 = 2;
11 const RUN_BLOCK: u8 = 3;
12 const RESIDUE_BLOCK: u8 = 4;
13 const INTRA_BLOCK: u8 = 5;
14 const FILL_BLOCK: u8 = 6;
15 const INTER_BLOCK: u8 = 7;
16 const PATTERN_BLOCK: u8 = 8;
17 const RAW_BLOCK: u8 = 9;
19 #[derive(Default, Clone,Copy)]
26 fn read_desc(&mut self, br: &mut BitReader) -> DecoderResult<()> {
27 self.id = br.read(4)? as usize;
29 for i in 0..16 { self.syms[i] = i as u8; }
32 let len = br.read(3)? as usize;
33 let mut present: [bool; 16] = [false; 16];
35 self.syms[i] = br.read(4)? as u8;
36 present[self.syms[i] as usize] = true;
38 let mut idx = len + 1;
40 if present[i] { continue; }
41 self.syms[idx] = i as u8;
45 let len = br.read(2)? as usize;
46 let mut syms: [u8; 16] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
47 let mut tmp: [u8; 16] = [0; 16];
50 for arr in syms.chunks_mut(size * 2) {
54 while (ptr0 < size) && (ptr1 < size * 2) {
56 tmp[optr] = arr[ptr0];
59 tmp[optr] = arr[ptr1];
65 tmp[optr] = arr[ptr0];
69 while ptr1 < size * 2 {
70 tmp[optr] = arr[ptr1];
74 arr.copy_from_slice(&tmp[0..size * 2]);
82 fn read_sym(&self, br: &mut BitReader, trees: &BinkTrees) -> DecoderResult<u8> {
83 let idx = br.read_cb(&trees.cb[self.id])?;
84 Ok(self.syms[idx as usize])
89 struct Bundle<T: Copy> {
97 impl<T:Copy> Bundle<T> {
98 fn binkb_reset(&mut self, bits: u8) {
103 fn reset(&mut self) {
107 fn read_desc(&mut self, br: &mut BitReader) -> DecoderResult<()> {
110 self.tree.read_desc(br)?;
113 fn read_len(&mut self, br: &mut BitReader) -> DecoderResult<usize> {
114 if self.read_pos < self.dec_pos { return Ok(0); }
115 let len = br.read(self.bits)? as usize;
117 self.dec_pos = self.data.len();
118 self.read_pos = self.data.len() - 1;
122 fn read_len_binkb(&mut self, br: &mut BitReader) -> DecoderResult<usize> {
123 if self.read_pos < self.dec_pos { return Ok(0); }
124 let len = br.read(13)? as usize;
126 self.dec_pos = self.data.len();
127 self.read_pos = self.data.len() - 1;
131 fn get_val(&mut self) -> DecoderResult<T> {
132 validate!(self.read_pos < self.dec_pos);
133 let val = self.data[self.read_pos];
139 const BLOCK_TYPE_RUNS: [usize; 4] = [ 4, 8, 12, 32 ];
141 fn read_binkb(&mut self, br: &mut BitReader) -> DecoderResult<()> {
142 let len = self.read_len_binkb(br)?;
143 if len == 0 { return Ok(()); }
144 let end = self.dec_pos + len;
145 validate!(end <= self.data.len());
147 self.data[self.dec_pos + i] = br.read(self.bits)? as u8;
152 fn read_runs(&mut self, br: &mut BitReader, trees: &BinkTrees) -> DecoderResult<()> {
153 let len = self.read_len(br)?;
154 if len == 0 { return Ok(()); }
155 let end = self.dec_pos + len;
156 validate!(end <= self.data.len());
158 let val = br.read(4)? as u8;
159 for i in 0..len { self.data[self.dec_pos + i] = val; }
162 while self.dec_pos < end {
163 self.data[self.dec_pos] = self.tree.read_sym(br, trees)?;
169 fn read_block_types(&mut self, br: &mut BitReader, trees: &BinkTrees) -> DecoderResult<()> {
170 let len = self.read_len(br)?;
171 if len == 0 { return Ok(()); }
172 let end = self.dec_pos + len;
173 validate!(end <= self.data.len());
175 let val = br.read(4)? as u8;
176 for i in 0..len { self.data[self.dec_pos + i] = val; }
180 while self.dec_pos < end {
181 let val = self.tree.read_sym(br, trees)?;
183 self.data[self.dec_pos] = val;
187 let run = BLOCK_TYPE_RUNS[(val - 12) as usize];
188 validate!(self.dec_pos + run <= end);
190 self.data[self.dec_pos + i] = last;
198 fn read_patterns(&mut self, br: &mut BitReader, trees: &BinkTrees) -> DecoderResult<()> {
199 let len = self.read_len(br)?;
200 if len == 0 { return Ok(()); }
201 let end = self.dec_pos + len;
202 validate!(end <= self.data.len());
204 let pat_lo = self.tree.read_sym(br, trees)?;
205 let pat_hi = self.tree.read_sym(br, trees)?;
206 self.data[self.dec_pos + i] = pat_lo | (pat_hi << 4);
211 fn cvt_color(lo: u8, hi: u8, new_bink: bool) -> u8 {
212 let val = lo | (hi << 4);
214 let sign = ((val as i8) >> 7) as u8;
215 ((val & 0x7F) ^ sign).wrapping_sub(sign) ^ 0x80
220 fn read_colors(&mut self, br: &mut BitReader, trees: &BinkTrees, col_hi: &[Tree; 16], col_last: &mut u8, new_bink: bool) -> DecoderResult<()> {
221 let len = self.read_len(br)?;
222 if len == 0 { return Ok(()); }
223 let end = self.dec_pos + len;
224 validate!(end <= self.data.len());
225 let mut last = *col_last;
227 last = col_hi[last as usize].read_sym(br, trees)?;
228 let lo = self.tree.read_sym(br, trees)?;
229 let val = Self::cvt_color(lo, last, new_bink);
230 for i in 0..len { self.data[self.dec_pos + i] = val as u8; }
233 while self.dec_pos < end {
234 last = col_hi[last as usize].read_sym(br, trees)?;
235 let lo = self.tree.read_sym(br, trees)?;
236 let val = Self::cvt_color(lo, last, new_bink);
237 self.data[self.dec_pos] = val;
247 fn read_binkb(&mut self, br: &mut BitReader) -> DecoderResult<()> {
248 let len = self.read_len_binkb(br)?;
249 if len == 0 { return Ok(()); }
250 let end = self.dec_pos + len;
251 validate!(end <= self.data.len());
252 let bias = 1 << (self.bits - 1);
254 self.data[self.dec_pos + i] = (br.read(self.bits)? as i8) - bias;
259 fn read_motion_values(&mut self, br: &mut BitReader, trees: &BinkTrees) -> DecoderResult<()> {
260 let len = self.read_len(br)?;
261 if len == 0 { return Ok(()); }
262 let end = self.dec_pos + len;
263 validate!(end <= self.data.len());
265 let mut val = br.read(4)? as i8;
266 if val != 0 && br.read_bool()? { val = -val; }
267 for i in 0..len { self.data[self.dec_pos + i] = val; }
270 while self.dec_pos < end {
271 self.data[self.dec_pos] = self.tree.read_sym(br, trees)? as i8;
272 if self.data[self.dec_pos] != 0 && br.read_bool()? {
273 self.data[self.dec_pos] = -self.data[self.dec_pos];
282 const DC_START_BITS: u8 = 11;
284 fn read_binkb(&mut self, br: &mut BitReader) -> DecoderResult<()> {
285 let len = self.read_len_binkb(br)?;
286 if len == 0 { return Ok(()); }
287 let end = self.dec_pos + len;
288 validate!(end <= self.data.len());
290 self.data[self.dec_pos + i] = br.read(self.bits)? as u16;
295 fn read_dcs(&mut self, br: &mut BitReader, start_bits: u8) -> DecoderResult<()> {
296 let len = self.read_len(br)?;
297 if len == 0 { return Ok(()); }
298 let end = self.dec_pos + len;
299 validate!(end <= self.data.len());
300 let mut val = br.read(start_bits)? as u16;
301 self.data[self.dec_pos] = val;
303 for i in (1..len).step_by(8) {
304 let seg_len = (len - i).min(8);
305 let bits = br.read(4)? as u8;
307 for _ in 0..seg_len {
308 let diff = br.read(bits)? as u16;
309 let res = if diff != 0 && br.read_bool()? {
310 val.checked_sub(diff)
312 val.checked_add(diff)
314 validate!(res.is_some());
316 self.data[self.dec_pos] = val;
320 for _ in 0..seg_len {
321 self.data[self.dec_pos] = val;
331 fn read_binkb(&mut self, br: &mut BitReader) -> DecoderResult<()> {
332 let len = self.read_len_binkb(br)?;
333 if len == 0 { return Ok(()); }
334 let end = self.dec_pos + len;
335 validate!(end <= self.data.len());
336 let bias = 1 << (self.bits - 1);
338 self.data[self.dec_pos + i] = (br.read(self.bits)? as i16) - bias;
343 fn read_dcs(&mut self, br: &mut BitReader, start_bits: u8) -> DecoderResult<()> {
344 let len = self.read_len(br)?;
345 if len == 0 { return Ok(()); }
346 let end = self.dec_pos + len;
347 validate!(end <= self.data.len());
348 let mut val = br.read(start_bits - 1)? as i16;
349 if val != 0 && br.read_bool()? {
352 self.data[self.dec_pos] = val;
354 for i in (1..len).step_by(8) {
355 let seg_len = (len - i).min(8);
356 let bits = br.read(4)? as u8;
358 for _ in 0..seg_len {
359 let mut diff = br.read(bits)? as i16;
360 if diff != 0 && br.read_bool()? {
363 let res = val.checked_add(diff);
364 validate!(res.is_some());
366 self.data[self.dec_pos] = val;
370 for _ in 0..seg_len {
371 self.data[self.dec_pos] = val;
381 cb: [Codebook<u8>; 16],
384 fn map_u8(idx: usize) -> u8 { idx as u8 }
386 impl Default for BinkTrees {
387 fn default() -> Self {
389 let mut ucb: std::mem::MaybeUninit::<[Codebook<u8>; 16]> = std::mem::MaybeUninit::uninit();
391 let mut cr = TableCodebookDescReader::new(&BINK_TREE_CODES[i], &BINK_TREE_BITS[i], map_u8);
392 std::ptr::write(&mut (*ucb.as_mut_ptr())[i], Codebook::new(&mut cr, CodebookMode::LSB).unwrap());
400 const A1: i32 = 2896;
401 const A2: i32 = 2217;
402 const A3: i32 = 3784;
403 const A4: i32 = -5352;
406 ($src: expr, $sstep: expr, $dst: expr, $dstep: expr, $off: expr, $bias: expr, $shift: expr) => {
407 let a0 = $src[$off + 0 * $sstep] + $src[$off + 4 * $sstep];
408 let a1 = $src[$off + 0 * $sstep] - $src[$off + 4 * $sstep];
409 let a2 = $src[$off + 2 * $sstep] + $src[$off + 6 * $sstep];
410 let a3 = A1.wrapping_mul($src[$off + 2 * $sstep] - $src[$off + 6 * $sstep]) >> 11;
411 let a4 = $src[$off + 5 * $sstep] + $src[$off + 3 * $sstep];
412 let a5 = $src[$off + 5 * $sstep] - $src[$off + 3 * $sstep];
413 let a6 = $src[$off + 1 * $sstep] + $src[$off + 7 * $sstep];
414 let a7 = $src[$off + 1 * $sstep] - $src[$off + 7 * $sstep];
416 let b1 = A3.wrapping_mul(a5 + a7) >> 11;
417 let b2 = (A4.wrapping_mul(a5) >> 11) - b0 + b1;
418 let b3 = (A1.wrapping_mul(a6 - a4) >> 11) - b2;
419 let b4 = (A2.wrapping_mul(a7) >> 11) + b3 - b1;
422 let c2 = a1 + (a3 - a2);
423 let c3 = a1 - (a3 - a2);
425 $dst[$off + 0 * $dstep] = (c0 + b0 + $bias) >> $shift;
426 $dst[$off + 1 * $dstep] = (c2 + b2 + $bias) >> $shift;
427 $dst[$off + 2 * $dstep] = (c3 + b3 + $bias) >> $shift;
428 $dst[$off + 3 * $dstep] = (c1 - b4 + $bias) >> $shift;
429 $dst[$off + 4 * $dstep] = (c1 + b4 + $bias) >> $shift;
430 $dst[$off + 5 * $dstep] = (c3 - b3 + $bias) >> $shift;
431 $dst[$off + 6 * $dstep] = (c2 - b2 + $bias) >> $shift;
432 $dst[$off + 7 * $dstep] = (c0 - b0 + $bias) >> $shift;
437 intra_qmat: [[i32; 64]; 16],
438 inter_qmat: [[i32; 64]; 16],
442 fn calc_binkb_quants(&mut self) {
443 let mut inv_scan: [usize; 64] = [0; 64];
444 let mut mod_mat: [f32; 64] = [0.0; 64];
445 let base = consts::PI / 16.0;
447 for i in 0..64 { inv_scan[BINK_SCAN[i]] = i; }
450 let j_scale = if (j != 0) && (j != 4) { (base * (j as f32)).cos() * consts::SQRT_2 } else { 1.0 };
452 let i_scale = if (i != 0) && (i != 4) { (base * (i as f32)).cos() * consts::SQRT_2 } else { 1.0 };
453 mod_mat[i + j * 8] = i_scale * j_scale;
458 let (num, den) = BINKB_REF_QUANTS[q];
459 let quant = (num as f32) * ((1 << 12) as f32) / (den as f32);
461 let idx = inv_scan[c];
462 self.intra_qmat[q][idx] = ((BINKB_REF_INTRA_Q[c] as f32) * mod_mat[c] * quant) as i32;
463 self.inter_qmat[q][idx] = ((BINKB_REF_INTER_Q[c] as f32) * mod_mat[c] * quant) as i32;
469 impl Default for QuantMats {
470 fn default() -> Self {
471 Self { intra_qmat: [[0; 64]; 16], inter_qmat: [[0; 64]; 16] }
477 info: NACodecInfoRef,
479 hams: HAMShuffler<u8>,
492 colhi_tree: [Tree; 16],
501 intradc: Bundle<u16>,
502 interdc: Bundle<i16>,
505 nresidues: Bundle<u8>,
513 fn calc_len(size: usize) -> u8 {
514 (32 - ((size + 511) as u32).leading_zeros()) as u8
521 fn init_bundle_bufs(&mut self, bw: usize, bh: usize) {
522 let size = bw * bh * 64;
523 self.btype.data.resize(size, 0);
524 self.sbtype.data.resize(size, 0);
525 self.colors.data.resize(size, 0);
526 self.pattern.data.resize(size, 0);
527 self.xoff.data.resize(size, 0);
528 self.yoff.data.resize(size, 0);
529 self.intradc.data.resize(size, 0);
530 self.interdc.data.resize(size, 0);
531 self.intraq.data.resize(size, 0);
532 self.interq.data.resize(size, 0);
533 self.nresidues.data.resize(size, 0);
534 self.run.data.resize(size, 0);
536 fn init_bundle_lengths(&mut self, w: usize, bw: usize) {
537 let w = (w + 7) & !7;
538 self.btype.bits = calc_len(w >> 3);
539 self.sbtype.bits = calc_len(w >> 4);
540 self.colors.bits = calc_len(bw * 64);
541 self.pattern.bits = calc_len(bw * 8);
542 self.xoff.bits = calc_len(w >> 3);
543 self.yoff.bits = calc_len(w >> 3);
544 self.intradc.bits = calc_len(w >> 3);
545 self.interdc.bits = calc_len(w >> 3);
546 self.run.bits = calc_len(bw * 48);
548 fn init_bundle_lengths_binkb(&mut self) {
549 self.btype.binkb_reset(4);
550 self.colors.binkb_reset(8);
551 self.pattern.binkb_reset(8);
552 self.xoff.binkb_reset(5);
553 self.yoff.binkb_reset(5);
554 self.intradc.binkb_reset(11);
555 self.interdc.binkb_reset(11);
556 self.intraq.binkb_reset(4);
557 self.interq.binkb_reset(4);
558 self.nresidues.binkb_reset(7);
560 fn read_bundles_desc(&mut self, br: &mut BitReader) -> DecoderResult<()> {
561 self.btype.read_desc(br)?;
562 self.sbtype.read_desc(br)?;
563 for el in &mut self.colhi_tree {
567 self.colors.read_desc(br)?;
568 self.pattern.read_desc(br)?;
569 self.xoff.read_desc(br)?;
570 self.yoff.read_desc(br)?;
571 self.intradc.reset();
572 self.interdc.reset();
573 self.run.read_desc(br)?;
576 fn read_bundles_binkb(&mut self, br: &mut BitReader) -> DecoderResult<()> {
577 self.btype.read_binkb(br)?;
578 self.colors.read_binkb(br)?;
579 self.pattern.read_binkb(br)?;
580 self.xoff.read_binkb(br)?;
581 self.yoff.read_binkb(br)?;
582 self.intradc.read_binkb(br)?;
583 self.interdc.read_binkb(br)?;
584 self.intraq.read_binkb(br)?;
585 self.interq.read_binkb(br)?;
586 self.nresidues.read_binkb(br)?;
589 fn read_bundles(&mut self, br: &mut BitReader) -> DecoderResult<()> {
590 self.btype.read_block_types(br, &self.trees)?;
591 self.sbtype.read_block_types(br, &self.trees)?;
592 self.colors.read_colors(br, &self.trees, &self.colhi_tree, &mut self.col_last, self.is_ver_i)?;
593 self.pattern.read_patterns(br, &self.trees)?;
594 self.xoff.read_motion_values(br, &self.trees)?;
595 self.yoff.read_motion_values(br, &self.trees)?;
596 self.intradc.read_dcs(br, DC_START_BITS)?;
597 self.interdc.read_dcs(br, DC_START_BITS)?;
598 self.run.read_runs(br, &self.trees)?;
602 fn put_block(&self, block: &[u8; 64], dst: &mut [u8], mut off: usize, stride: usize, scaled: bool) {
604 for src in block.chunks_exact(8) {
605 let out = &mut dst[off..][..8];
606 out.copy_from_slice(src);
610 for src in block.chunks_exact(8) {
612 dst[off + i * 2 + 0] = src[i];
613 dst[off + i * 2 + 1] = src[i];
617 dst[off + i * 2 + 0] = src[i];
618 dst[off + i * 2 + 1] = src[i];
624 fn copy_block(&mut self, dst: &mut [u8], mut off: usize, stride: usize, bx: usize, by: usize, xoff: i8, yoff: i8) -> DecoderResult<()> {
625 if let Some(prev_buf) = self.ips.get_ref() {
626 let xoff = ((bx * 8) as isize) + (xoff as isize);
627 let yoff = ((by * 8) as isize) + (yoff as isize);
628 validate!((xoff >= 0) && (xoff + 8 <= (self.cur_w as isize)));
629 validate!((yoff >= 0) && (yoff + 8 <= (self.cur_h as isize)));
630 let pstride = prev_buf.get_stride(self.cur_plane);
631 let mut poff = prev_buf.get_offset(self.cur_plane) + (xoff as usize) + (yoff as usize) * pstride;
632 let pdata = prev_buf.get_data();
633 let ppix = pdata.as_slice();
635 let src = &ppix[poff..][..8];
636 let out = &mut dst[off..][..8];
637 out.copy_from_slice(src);
643 Err(DecoderError::MissingReference)
646 fn copy_overlapped(&mut self, dst: &mut [u8], mut off: usize, stride: usize, bx: usize, by: usize, xoff: i8, yoff1: i8) -> DecoderResult<()> {
647 let ybias = if self.key_frame { -15 } else { 0 };
648 let yoff = yoff1 + ybias;
650 let xpos = ((bx * 8) as isize) + (xoff as isize);
651 let ypos = ((by * 8) as isize) + (yoff as isize);
652 validate!((xpos >= 0) && (xpos + 8 <= (self.cur_w as isize)));
653 validate!((ypos >= 0) && (ypos + 8 <= (self.cur_h as isize)));
655 let mut block: [u8; 64] = [0; 64];
656 let mut ref_off = ((off as isize) + (xoff as isize) + (yoff as isize) * (stride as isize)) as usize;
657 for row in block.chunks_exact_mut(8) {
658 row.copy_from_slice(&dst[ref_off..][..8]);
661 for row in block.chunks_exact(8) {
662 let out = &mut dst[off..][..8];
663 out.copy_from_slice(row);
669 fn add_block(&self, coeffs: &[i32; 64], dst: &mut [u8], mut off: usize, stride: usize) {
670 for src in coeffs.chunks_exact(8) {
672 let v = (dst[off + i] as i32) + src[i];
673 dst[off + i] = v as u8;
678 fn idct_put(&self, coeffs: &[i32; 64], dst: &mut [u8], mut off: usize, stride: usize) {
679 let mut tmp: [i32; 64] = [0; 64];
680 let mut row: [i32; 8] = [0; 8];
682 idct!(coeffs, 8, tmp, 8, i, 0, 0);
684 for srow in tmp.chunks_exact(8) {
685 idct!(srow, 1, row, 1, 0, 0x7F, 8);
687 dst[off + i] = row[i] as u8;
692 fn idct_add(&self, coeffs: &[i32; 64], dst: &mut [u8], mut off: usize, stride: usize) {
693 let mut tmp: [i32; 64] = [0; 64];
694 let mut row: [i32; 8] = [0; 8];
696 idct!(coeffs, 8, tmp, 8, i, 0, 0);
698 for srow in tmp.chunks_exact(8) {
699 idct!(srow, 1, row, 1, 0, 0x7F, 8);
701 let v = (dst[off + i] as i32) + row[i];
702 dst[off + i] = v as u8;
708 fn decode_plane_binkb(&mut self, br: &mut BitReader, plane_no: usize, buf: &mut NAVideoBuffer<u8>) -> DecoderResult<()> {
709 let stride = buf.get_stride(plane_no);
710 let mut off = buf.get_offset(plane_no);
711 let (width, height) = buf.get_dimensions(plane_no);
712 let data = buf.get_data_mut().unwrap();
713 let dst = data.as_mut_slice();
714 let bw = (width + 7) >> 3;
715 let bh = (height + 7) >> 3;
716 self.cur_w = (width + 7) & !7;
717 self.cur_h = (height + 7) & !7;
718 self.cur_plane = plane_no;
719 self.init_bundle_lengths_binkb();
721 self.read_bundles_binkb(br)?;
723 let mut coeffs: [i32; 64] = [0; 64];
724 let btype = self.btype.get_val()?;
729 let scan = BINK_PATTERNS[br.read(4)? as usize];
732 let run = br.read_bool()?;
733 let len = (br.read(BINKB_RUN_BITS[idx])? as usize) + 1;
734 validate!(idx + len <= 64);
736 let val = self.colors.get_val()?;
738 let pos = scan[idx + j] as usize;
739 dst[off + (pos >> 3) * stride + (pos & 7)] = val;
744 let pos = scan[idx] as usize;
745 dst[off + (pos >> 3) * stride + (pos & 7)] = self.colors.get_val()?;
751 let pos = scan[idx] as usize;
752 dst[off + (pos >> 3) * stride + (pos & 7)] = self.colors.get_val()?;
756 coeffs[0] = self.intradc.get_val()? as i32;
757 let q = self.intraq.get_val()? as usize;
758 read_dct_coefficients(br, &mut coeffs, &BINK_SCAN, &self.qmat_b.intra_qmat, Some(q))?;
759 self.idct_put(&coeffs, dst, off, stride);
762 let xoff = self.xoff.get_val()?;
763 let yoff = self.yoff.get_val()?;
764 self.copy_overlapped(dst, off, stride, bx, by, xoff, yoff)?;
765 let nmasks = self.nresidues.get_val()? as usize;
766 read_residue(br, &mut coeffs, nmasks)?;
767 self.add_block(&coeffs, dst, off, stride);
770 let xoff = self.xoff.get_val()?;
771 let yoff = self.yoff.get_val()?;
772 self.copy_overlapped(dst, off, stride, bx, by, xoff, yoff)?;
773 coeffs[0] = self.interdc.get_val()? as i32;
774 let q = self.interq.get_val()? as usize;
775 read_dct_coefficients(br, &mut coeffs, &BINK_SCAN, &self.qmat_b.inter_qmat, Some(q))?;
776 self.idct_add(&coeffs, dst, off, stride);
779 let fill = self.colors.get_val()?;
781 for j in 0..8 { dst[off + i * stride + j] = fill; }
785 let clr: [u8; 2] = [ self.colors.get_val()?, self.colors.get_val()? ];
787 let pattern = self.pattern.get_val()? as usize;
789 dst[off + i * stride + j] = clr[(pattern >> j) & 1];
793 7 => { // motion block
794 let xoff = self.xoff.get_val()?;
795 let yoff = self.yoff.get_val()?;
796 self.copy_overlapped(dst, off, stride, bx, by, xoff, yoff)?;
801 dst[off + i * stride + j] = self.colors.get_val()?;
805 _ => { return Err(DecoderError::InvalidData); },
809 off += stride * 8 - bw * 8;
811 if (br.tell() & 0x1F) != 0 {
812 let skip = (32 - (br.tell() & 0x1F)) as u32;
817 fn handle_block(&mut self, br: &mut BitReader, bx: usize, by: usize,
818 dst: &mut [u8], off: usize, stride: usize, btype: u8, scaled: bool) -> DecoderResult<()> {
819 let mut oblock: [u8; 64] = [0; 64];
820 let mut coeffs: [i32; 64] = [0; 64];
824 self.copy_block(dst, off, stride, bx, by, 0, 0)?;
828 let sbtype = self.sbtype.get_val()?;
829 self.handle_block(br, bx, by, dst, off, stride, sbtype, true)?;
833 let xoff = self.xoff.get_val()?;
834 let yoff = self.yoff.get_val()?;
835 self.copy_block(dst, off, stride, bx, by, xoff, yoff)?;
838 let scan = BINK_PATTERNS[br.read(4)? as usize];
841 let run = (self.run.get_val()? as usize) + 1;
842 validate!(idx + run <= 64);
844 let val = self.colors.get_val()?;
846 oblock[scan[idx + j] as usize] = val;
851 oblock[scan[idx] as usize] = self.colors.get_val()?;
856 if idx == 63 { oblock[scan[63] as usize] = self.colors.get_val()?; }
857 self.put_block(&oblock, dst, off, stride, scaled);
861 let xoff = self.xoff.get_val()?;
862 let yoff = self.yoff.get_val()?;
863 self.copy_block(dst, off, stride, bx, by, xoff, yoff)?;
864 let nmasks = br.read(7)? as usize;
865 read_residue(br, &mut coeffs, nmasks)?;
866 self.add_block(&coeffs, dst, off, stride);
869 coeffs[0] = self.intradc.get_val()? as i32;
870 read_dct_coefficients(br, &mut coeffs, &BINK_SCAN, BINK_INTRA_QUANT, None)?;
872 self.idct_put(&coeffs, dst, off, stride);
874 self.idct_put(&coeffs, &mut oblock, 0, 8);
875 self.put_block(&oblock, dst, off, stride, scaled);
879 let fill = self.colors.get_val()?;
881 self.put_block(&oblock, dst, off, stride, scaled);
885 let xoff = self.xoff.get_val()?;
886 let yoff = self.yoff.get_val()?;
887 self.copy_block(dst, off, stride, bx, by, xoff, yoff)?;
888 coeffs[0] = self.interdc.get_val()? as i32;
889 read_dct_coefficients(br, &mut coeffs, &BINK_SCAN, BINK_INTER_QUANT, None)?;
890 self.idct_add(&coeffs, dst, off, stride);
893 let clr: [u8; 2] = [ self.colors.get_val()?, self.colors.get_val()? ];
895 let pattern = self.pattern.get_val()? as usize;
897 oblock[i * 8 + j] = clr[(pattern >> j) & 1];
900 self.put_block(&oblock, dst, off, stride, scaled);
905 oblock[i * 8 + j] = self.colors.get_val()?;
908 self.put_block(&oblock, dst, off, stride, scaled);
910 _ => { return Err(DecoderError::InvalidData); },
914 fn decode_plane(&mut self, br: &mut BitReader, plane_no: usize, buf: &mut NAVideoBuffer<u8>) -> DecoderResult<()> {
915 let stride = buf.get_stride(plane_no);
916 let mut off = buf.get_offset(plane_no);
917 let (width, height) = buf.get_dimensions(plane_no);
918 let data = buf.get_data_mut().unwrap();
919 let dst = data.as_mut_slice();
920 let bw = (width + 7) >> 3;
921 let bh = (height + 7) >> 3;
922 self.cur_w = (width + 7) & !7;
923 self.cur_h = (height + 7) & !7;
924 self.cur_plane = plane_no;
925 self.init_bundle_lengths(width.max(8), bw);
926 self.read_bundles_desc(br)?;
928 self.read_bundles(br)?;
931 let btype = self.btype.get_val()?;
932 if btype == SCALED_BLOCK && (by & 1) == 1 { // already decoded scaled block, skip
936 self.handle_block(br, bx, by, dst, off + bx * 8, stride, btype, false)?;
937 if btype == SCALED_BLOCK {
944 if (br.tell() & 0x1F) != 0 {
945 let skip = (32 - (br.tell() & 0x1F)) as u32;
952 fn get_coef(br: &mut BitReader, bits1: u8) -> DecoderResult<i32> {
955 t = if br.read_bool()? { -1 } else { 1 };
957 let bits = bits1 - 1;
958 let val = (br.read(bits)? as i32) | (1 << bits);
968 fn read_dct_coefficients(br: &mut BitReader, block: &mut [i32; 64], scan: &[usize; 64],
969 quant_matrices: &[[i32; 64]; 16], q: Option<usize>) -> DecoderResult<()> {
970 let mut coef_list: [i32; 128] = [0; 128];
971 let mut mode_list: [u8; 128] = [0; 128];
972 let mut list_start = 64;
973 let mut list_end = 64;
974 let mut coef_idx: [usize; 64] = [0; 64];
975 let mut coef_count = 0;
977 coef_list[list_end] = 4; mode_list[list_end] = 0; list_end += 1;
978 coef_list[list_end] = 24; mode_list[list_end] = 0; list_end += 1;
979 coef_list[list_end] = 44; mode_list[list_end] = 0; list_end += 1;
980 coef_list[list_end] = 1; mode_list[list_end] = 3; list_end += 1;
981 coef_list[list_end] = 2; mode_list[list_end] = 3; list_end += 1;
982 coef_list[list_end] = 3; mode_list[list_end] = 3; list_end += 1;
984 let mut bits1 = br.read(4)? as u8;
986 let mut list_pos = list_start;
987 while list_pos < list_end {
988 let ccoef = coef_list[list_pos];
989 let mode = mode_list[list_pos];
990 if (mode == 0 && ccoef == 0) || !br.read_bool()? {
997 coef_list[list_pos] = ccoef + 4;
998 mode_list[list_pos] = 1;
1000 coef_list[list_pos] = 0;
1001 mode_list[list_pos] = 0;
1005 if br.read_bool()? {
1007 coef_list[list_start] = ccoef + i;
1008 mode_list[list_start] = 3;
1010 let idx = (ccoef + i) as usize;
1011 block[scan[idx]] = get_coef(br, bits1)?;
1012 coef_idx[coef_count] = idx;
1018 mode_list[list_pos] = 2;
1020 coef_list[list_end] = ccoef + i * 4 + 4;
1021 mode_list[list_end] = 2;
1026 let idx = ccoef as usize;
1027 block[scan[idx]] = get_coef(br, bits1)?;
1028 coef_idx[coef_count] = idx;
1030 coef_list[list_pos] = 0;
1031 mode_list[list_pos] = 0;
1034 _ => unreachable!(),
1040 let q_index = if let Some(qidx) = q { qidx } else { br.read(4)? as usize };
1041 let qmat = &quant_matrices[q_index];
1042 block[0] = block[0].wrapping_mul(qmat[0]) >> 11;
1043 for idx in coef_idx.iter().take(coef_count) {
1044 block[scan[*idx]] = block[scan[*idx]].wrapping_mul(qmat[*idx]) >> 11;
1050 fn read_residue(br: &mut BitReader, block: &mut [i32; 64], mut masks_count: usize) -> DecoderResult<()> {
1051 let mut coef_list: [i32; 128] = [0; 128];
1052 let mut mode_list: [u8; 128] = [0; 128];
1053 let mut list_start = 64;
1054 let mut list_end = 64;
1055 let mut nz_coef_idx: [usize; 64] = [0; 64];
1056 let mut nz_coef_count = 0;
1058 coef_list[list_end] = 4; mode_list[list_end] = 0; list_end += 1;
1059 coef_list[list_end] = 24; mode_list[list_end] = 0; list_end += 1;
1060 coef_list[list_end] = 44; mode_list[list_end] = 0; list_end += 1;
1061 coef_list[list_end] = 0; mode_list[list_end] = 2; list_end += 1;
1063 let mut mask = 1 << br.read(3)?;
1065 for i in 0..nz_coef_count {
1066 if !br.read_bool()? { continue; }
1067 let idx = nz_coef_idx[i];
1073 if masks_count == 0 {
1078 let mut list_pos = list_start;
1079 while list_pos < list_end {
1080 let ccoef = coef_list[list_pos];
1081 let mode = mode_list[list_pos];
1082 if (mode == 0 && ccoef == 0) || !br.read_bool()? {
1089 coef_list[list_pos] = ccoef + 4;
1090 mode_list[list_pos] = 1;
1092 coef_list[list_pos] = 0;
1093 mode_list[list_pos] = 0;
1097 if br.read_bool()? {
1099 coef_list[list_start] = ccoef + i;
1100 mode_list[list_start] = 3;
1102 let idx = (ccoef + i) as usize;
1103 nz_coef_idx[nz_coef_count] = BINK_SCAN[idx];
1105 block[BINK_SCAN[idx]] = if br.read_bool()? { -mask } else { mask };
1106 if masks_count == 0 {
1114 mode_list[list_pos] = 2;
1116 coef_list[list_end] = ccoef + i * 4 + 4;
1117 mode_list[list_end] = 2;
1122 let idx = ccoef as usize;
1123 nz_coef_idx[nz_coef_count] = BINK_SCAN[idx];
1125 block[BINK_SCAN[idx]] = if br.read_bool()? { -mask } else { mask };
1126 coef_list[list_pos] = 0;
1127 mode_list[list_pos] = 0;
1129 if masks_count == 0 {
1134 _ => unreachable!(),
1143 const BINK_FLAG_ALPHA: u32 = 0x00100000;
1144 const BINK_FLAG_GRAY: u32 = 0x00020000;
1146 impl NADecoder for BinkDecoder {
1147 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
1148 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
1149 let w = vinfo.get_width();
1150 let h = vinfo.get_height();
1152 let edata = info.get_extradata().unwrap();
1153 validate!(edata.len() >= 8);
1155 let mut mr = MemoryReader::new_read(&edata);
1156 let mut br = ByteReader::new(&mut mr);
1157 let magic = br.read_u32be()?;
1158 let flags = br.read_u32le()?;
1160 self.is_ver_b = (magic & 0xFF) == (b'b' as u32);
1161 self.is_ver_i = (magic & 0xFF) >= (b'i' as u32);
1162 self.has_alpha = (flags & BINK_FLAG_ALPHA) != 0;
1163 self.is_gray = (flags & BINK_FLAG_GRAY) != 0;
1164 self.swap_uv = (magic & 0xFF) >= (b'h' as u32);
1165 if self.has_alpha && self.is_gray { return Err(DecoderError::NotImplemented); }
1167 let aplane = if self.has_alpha { Some(NAPixelChromaton::new(0, 0, false, 8, 0, 3, 1)) } else { None };
1170 fmt = NAPixelFormaton::new(ColorModel::YUV(YUVSubmodel::YUVJ),
1171 Some(NAPixelChromaton::new(0, 0, false, 8, 0, 0, 1)),
1172 Some(NAPixelChromaton::new(1, 1, false, 8, 0, 1, 1)),
1173 Some(NAPixelChromaton::new(1, 1, false, 8, 0, 2, 1)),
1175 0, if self.has_alpha { 4 } else { 3 } );
1177 fmt = NAPixelFormaton::new(ColorModel::YUV(YUVSubmodel::YUVJ),
1178 Some(NAPixelChromaton::new(0, 0, false, 8, 0, 0, 1)),
1179 None, None, None, None, 0, 1);
1181 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
1182 self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
1184 //self.init_bundle_lengths(w.max(8), (w + 7) >> 3);
1185 self.init_bundle_bufs((w + 7) >> 3, (h + 7) >> 3);
1188 self.qmat_b.calc_binkb_quants();
1193 Err(DecoderError::InvalidData)
1196 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
1197 let src = pkt.get_buffer();
1199 let mut br = BitReader::new(&src, BitReaderMode::LE);
1202 self.key_frame = pkt.is_keyframe();
1204 let bufret = self.hams.clone_ref();
1205 if let Some(bbuf) = bufret {
1208 let bufinfo = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 4)?;
1209 buf = bufinfo.get_vbuf().unwrap();
1210 self.key_frame = true;
1211 self.hams.add_frame(buf);
1212 buf = self.hams.get_output_frame().unwrap();
1215 let bufinfo = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 4)?;
1216 buf = bufinfo.get_vbuf().unwrap();
1219 let nplanes = if self.is_gray { 1 } else { 3 };
1221 validate!(!self.is_ver_b);
1225 self.decode_plane(&mut br, nplanes, &mut buf)?;
1230 for plane in 0..nplanes {
1232 self.decode_plane_binkb(&mut br, plane, &mut buf)?;
1234 let plane_idx = if plane > 0 && self.swap_uv { plane ^ 3 } else { plane };
1235 self.decode_plane(&mut br, plane_idx, &mut buf)?;
1238 let bufinfo = NABufferType::Video(buf);
1240 self.ips.add_frame(bufinfo.get_vbuf().unwrap());
1243 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
1244 frm.set_frame_type(FrameType::P);
1247 fn flush(&mut self) {
1252 impl NAOptionHandler for BinkDecoder {
1253 fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
1254 fn set_options(&mut self, _options: &[NAOption]) { }
1255 fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
1258 pub fn get_decoder() -> Box<dyn NADecoder + Send> {
1259 Box::new(BinkDecoder::new())
1264 use nihav_core::codecs::RegisteredDecoders;
1265 use nihav_core::demuxers::RegisteredDemuxers;
1266 use nihav_codec_support::test::dec_video::*;
1267 use crate::rad_register_all_decoders;
1268 use crate::rad_register_all_demuxers;
1270 fn test_binkvid_b() {
1271 let mut dmx_reg = RegisteredDemuxers::new();
1272 rad_register_all_demuxers(&mut dmx_reg);
1273 let mut dec_reg = RegisteredDecoders::new();
1274 rad_register_all_decoders(&mut dec_reg);
1276 test_decoding("bink", "bink-video", "assets/RAD/NEW.BIK", Some(16), &dmx_reg, &dec_reg,
1277 ExpectedTestResult::MD5Frames(vec![
1278 [0x00edef7e, 0x7efad3b1, 0x7e8bdd74, 0x3f6b00ba],
1279 [0xbc40683f, 0xbeb1c5e4, 0x934777b5, 0x8a8a350d],
1280 [0x68b78627, 0x28ceb63d, 0xfdb1171a, 0x23e69d90],
1281 [0xc8d907a0, 0xb8d44079, 0x0286336b, 0x996479f3],
1282 [0x57bbe4ec, 0xdb8bb9c2, 0x0e6f1fd6, 0xe180125e],
1283 [0xd43c2ae0, 0x4010007f, 0x2a6360a1, 0xb5203a05],
1284 [0xa883acf6, 0x25843f92, 0x4ced9a46, 0x6d513ad9],
1285 [0x959e843f, 0x8d8182b9, 0x3f12d29b, 0x2af8d39f],
1286 [0x93840946, 0x1188c6d1, 0xd5499833, 0x62aac0c6],
1287 [0x4e5a56a6, 0x21517d9a, 0xbe1f270d, 0xe5621945],
1288 [0x1b133742, 0x1eb1bf0a, 0x68cab2e3, 0x92176b5d],
1289 [0x0cf78c43, 0x4bc15549, 0x3dd94323, 0x737eaaae],
1290 [0xdd731c4a, 0x801453b3, 0xa38bef3e, 0x285cfdfe],
1291 [0xe1fec4ee, 0x46737abc, 0x8c452209, 0xc8c6addd],
1292 [0x2978aa50, 0x5f1e6d5a, 0x1f5b0fba, 0xb8e32196],
1293 [0x2e1e95ab, 0x8e31a0b0, 0xfe998512, 0xea9397b6],
1294 [0xf7f6c0d8, 0x893e77a7, 0xdfe0309f, 0xf5e644e2]]));
1298 let mut dmx_reg = RegisteredDemuxers::new();
1299 rad_register_all_demuxers(&mut dmx_reg);
1300 let mut dec_reg = RegisteredDecoders::new();
1301 rad_register_all_decoders(&mut dec_reg);
1303 test_decoding("bink", "bink-video", "assets/RAD/ActivisionLogo.bik", Some(42),
1305 ExpectedTestResult::MD5([0x41128884, 0x73a8c710, 0x5072ea4a, 0x8caca428]));
1309 const BINK_SCAN: [usize; 64] = [
1310 0, 1, 8, 9, 2, 3, 10, 11,
1311 4, 5, 12, 13, 6, 7, 14, 15,
1312 20, 21, 28, 29, 22, 23, 30, 31,
1313 16, 17, 24, 25, 32, 33, 40, 41,
1314 34, 35, 42, 43, 48, 49, 56, 57,
1315 50, 51, 58, 59, 18, 19, 26, 27,
1316 36, 37, 44, 45, 38, 39, 46, 47,
1317 52, 53, 60, 61, 54, 55, 62, 63
1320 const BINK_TREE_CODES: [[u8; 16]; 16] = [
1321 [ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F ],
1322 [ 0x00, 0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F ],
1323 [ 0x00, 0x02, 0x01, 0x09, 0x05, 0x15, 0x0D, 0x1D, 0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F ],
1324 [ 0x00, 0x02, 0x06, 0x01, 0x09, 0x05, 0x0D, 0x1D, 0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F ],
1325 [ 0x00, 0x04, 0x02, 0x06, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F ],
1326 [ 0x00, 0x04, 0x02, 0x0A, 0x06, 0x0E, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x07, 0x17, 0x0F, 0x1F ],
1327 [ 0x00, 0x02, 0x0A, 0x06, 0x0E, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x1B, 0x07, 0x17, 0x0F, 0x1F ],
1328 [ 0x00, 0x01, 0x05, 0x03, 0x13, 0x0B, 0x1B, 0x3B, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F ],
1329 [ 0x00, 0x01, 0x03, 0x13, 0x0B, 0x2B, 0x1B, 0x3B, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F ],
1330 [ 0x00, 0x01, 0x05, 0x0D, 0x03, 0x13, 0x0B, 0x1B, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F ],
1331 [ 0x00, 0x02, 0x01, 0x05, 0x0D, 0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F ],
1332 [ 0x00, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x13, 0x0B, 0x1B, 0x07, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F ],
1333 [ 0x00, 0x02, 0x01, 0x03, 0x13, 0x0B, 0x1B, 0x3B, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x1F, 0x3F ],
1334 [ 0x00, 0x01, 0x05, 0x03, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x4F, 0x2F, 0x6F, 0x1F, 0x5F, 0x3F, 0x7F ],
1335 [ 0x00, 0x01, 0x05, 0x03, 0x07, 0x17, 0x37, 0x77, 0x0F, 0x4F, 0x2F, 0x6F, 0x1F, 0x5F, 0x3F, 0x7F ],
1336 [ 0x00, 0x02, 0x01, 0x05, 0x03, 0x07, 0x27, 0x17, 0x37, 0x0F, 0x2F, 0x6F, 0x1F, 0x5F, 0x3F, 0x7F ]
1339 const BINK_TREE_BITS: [[u8; 16]; 16] = [
1340 [ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ],
1341 [ 1, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 ],
1342 [ 2, 2, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 ],
1343 [ 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 ],
1344 [ 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5 ],
1345 [ 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5 ],
1346 [ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5 ],
1347 [ 1, 3, 3, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ],
1348 [ 1, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ],
1349 [ 1, 3, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6 ],
1350 [ 2, 2, 3, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6 ],
1351 [ 1, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6 ],
1352 [ 2, 2, 2, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ],
1353 [ 1, 3, 3, 3, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7 ],
1354 [ 1, 3, 3, 3, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 ],
1355 [ 2, 2, 3, 3, 3, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7 ]
1358 const BINK_PATTERNS: [[u8; 64]; 16] = [
1360 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38,
1361 0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x09, 0x01,
1362 0x02, 0x0A, 0x12, 0x1A, 0x22, 0x2A, 0x32, 0x3A,
1363 0x3B, 0x33, 0x2B, 0x23, 0x1B, 0x13, 0x0B, 0x03,
1364 0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x34, 0x3C,
1365 0x3D, 0x35, 0x2D, 0x25, 0x1D, 0x15, 0x0D, 0x05,
1366 0x06, 0x0E, 0x16, 0x1E, 0x26, 0x2E, 0x36, 0x3E,
1367 0x3F, 0x37, 0x2F, 0x27, 0x1F, 0x17, 0x0F, 0x07,
1369 0x3B, 0x3A, 0x39, 0x38, 0x30, 0x31, 0x32, 0x33,
1370 0x2B, 0x2A, 0x29, 0x28, 0x20, 0x21, 0x22, 0x23,
1371 0x1B, 0x1A, 0x19, 0x18, 0x10, 0x11, 0x12, 0x13,
1372 0x0B, 0x0A, 0x09, 0x08, 0x00, 0x01, 0x02, 0x03,
1373 0x04, 0x05, 0x06, 0x07, 0x0F, 0x0E, 0x0D, 0x0C,
1374 0x14, 0x15, 0x16, 0x17, 0x1F, 0x1E, 0x1D, 0x1C,
1375 0x24, 0x25, 0x26, 0x27, 0x2F, 0x2E, 0x2D, 0x2C,
1376 0x34, 0x35, 0x36, 0x37, 0x3F, 0x3E, 0x3D, 0x3C,
1378 0x19, 0x11, 0x12, 0x1A, 0x1B, 0x13, 0x0B, 0x03,
1379 0x02, 0x0A, 0x09, 0x01, 0x00, 0x08, 0x10, 0x18,
1380 0x20, 0x28, 0x30, 0x38, 0x39, 0x31, 0x29, 0x2A,
1381 0x32, 0x3A, 0x3B, 0x33, 0x2B, 0x23, 0x22, 0x21,
1382 0x1D, 0x15, 0x16, 0x1E, 0x1F, 0x17, 0x0F, 0x07,
1383 0x06, 0x0E, 0x0D, 0x05, 0x04, 0x0C, 0x14, 0x1C,
1384 0x24, 0x2C, 0x34, 0x3C, 0x3D, 0x35, 0x2D, 0x2E,
1385 0x36, 0x3E, 0x3F, 0x37, 0x2F, 0x27, 0x26, 0x25,
1387 0x03, 0x0B, 0x02, 0x0A, 0x01, 0x09, 0x00, 0x08,
1388 0x10, 0x18, 0x11, 0x19, 0x12, 0x1A, 0x13, 0x1B,
1389 0x23, 0x2B, 0x22, 0x2A, 0x21, 0x29, 0x20, 0x28,
1390 0x30, 0x38, 0x31, 0x39, 0x32, 0x3A, 0x33, 0x3B,
1391 0x3C, 0x34, 0x3D, 0x35, 0x3E, 0x36, 0x3F, 0x37,
1392 0x2F, 0x27, 0x2E, 0x26, 0x2D, 0x25, 0x2C, 0x24,
1393 0x1C, 0x14, 0x1D, 0x15, 0x1E, 0x16, 0x1F, 0x17,
1394 0x0F, 0x07, 0x0E, 0x06, 0x0D, 0x05, 0x0C, 0x04,
1396 0x18, 0x19, 0x10, 0x11, 0x08, 0x09, 0x00, 0x01,
1397 0x02, 0x03, 0x0A, 0x0B, 0x12, 0x13, 0x1A, 0x1B,
1398 0x1C, 0x1D, 0x14, 0x15, 0x0C, 0x0D, 0x04, 0x05,
1399 0x06, 0x07, 0x0E, 0x0F, 0x16, 0x17, 0x1E, 0x1F,
1400 0x27, 0x26, 0x2F, 0x2E, 0x37, 0x36, 0x3F, 0x3E,
1401 0x3D, 0x3C, 0x35, 0x34, 0x2D, 0x2C, 0x25, 0x24,
1402 0x23, 0x22, 0x2B, 0x2A, 0x33, 0x32, 0x3B, 0x3A,
1403 0x39, 0x38, 0x31, 0x30, 0x29, 0x28, 0x21, 0x20,
1405 0x00, 0x01, 0x02, 0x03, 0x08, 0x09, 0x0A, 0x0B,
1406 0x10, 0x11, 0x12, 0x13, 0x18, 0x19, 0x1A, 0x1B,
1407 0x20, 0x21, 0x22, 0x23, 0x28, 0x29, 0x2A, 0x2B,
1408 0x30, 0x31, 0x32, 0x33, 0x38, 0x39, 0x3A, 0x3B,
1409 0x04, 0x05, 0x06, 0x07, 0x0C, 0x0D, 0x0E, 0x0F,
1410 0x14, 0x15, 0x16, 0x17, 0x1C, 0x1D, 0x1E, 0x1F,
1411 0x24, 0x25, 0x26, 0x27, 0x2C, 0x2D, 0x2E, 0x2F,
1412 0x34, 0x35, 0x36, 0x37, 0x3C, 0x3D, 0x3E, 0x3F,
1414 0x06, 0x07, 0x0F, 0x0E, 0x0D, 0x05, 0x0C, 0x04,
1415 0x03, 0x0B, 0x02, 0x0A, 0x09, 0x01, 0x00, 0x08,
1416 0x10, 0x18, 0x11, 0x19, 0x12, 0x1A, 0x13, 0x1B,
1417 0x14, 0x1C, 0x15, 0x1D, 0x16, 0x1E, 0x17, 0x1F,
1418 0x27, 0x2F, 0x26, 0x2E, 0x25, 0x2D, 0x24, 0x2C,
1419 0x23, 0x2B, 0x22, 0x2A, 0x21, 0x29, 0x20, 0x28,
1420 0x31, 0x30, 0x38, 0x39, 0x3A, 0x32, 0x3B, 0x33,
1421 0x3C, 0x34, 0x3D, 0x35, 0x36, 0x37, 0x3F, 0x3E,
1423 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1424 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08,
1425 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1426 0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18,
1427 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
1428 0x2F, 0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x28,
1429 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
1430 0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38,
1432 0x00, 0x08, 0x09, 0x01, 0x02, 0x03, 0x0B, 0x0A,
1433 0x12, 0x13, 0x1B, 0x1A, 0x19, 0x11, 0x10, 0x18,
1434 0x20, 0x28, 0x29, 0x21, 0x22, 0x23, 0x2B, 0x2A,
1435 0x32, 0x31, 0x30, 0x38, 0x39, 0x3A, 0x3B, 0x33,
1436 0x34, 0x3C, 0x3D, 0x3E, 0x3F, 0x37, 0x36, 0x35,
1437 0x2D, 0x2C, 0x24, 0x25, 0x26, 0x2E, 0x2F, 0x27,
1438 0x1F, 0x17, 0x16, 0x1E, 0x1D, 0x1C, 0x14, 0x15,
1439 0x0D, 0x0C, 0x04, 0x05, 0x06, 0x0E, 0x0F, 0x07,
1441 0x18, 0x19, 0x10, 0x11, 0x08, 0x09, 0x00, 0x01,
1442 0x02, 0x03, 0x0A, 0x0B, 0x12, 0x13, 0x1A, 0x1B,
1443 0x1C, 0x1D, 0x14, 0x15, 0x0C, 0x0D, 0x04, 0x05,
1444 0x06, 0x07, 0x0E, 0x0F, 0x16, 0x17, 0x1E, 0x1F,
1445 0x26, 0x27, 0x2E, 0x2F, 0x36, 0x37, 0x3E, 0x3F,
1446 0x3C, 0x3D, 0x34, 0x35, 0x2C, 0x2D, 0x24, 0x25,
1447 0x22, 0x23, 0x2A, 0x2B, 0x32, 0x33, 0x3A, 0x3B,
1448 0x38, 0x39, 0x30, 0x31, 0x28, 0x29, 0x20, 0x21,
1450 0x00, 0x08, 0x01, 0x09, 0x02, 0x0A, 0x03, 0x0B,
1451 0x13, 0x1B, 0x12, 0x1A, 0x11, 0x19, 0x10, 0x18,
1452 0x20, 0x28, 0x21, 0x29, 0x22, 0x2A, 0x23, 0x2B,
1453 0x33, 0x3B, 0x32, 0x3A, 0x31, 0x39, 0x30, 0x38,
1454 0x3C, 0x34, 0x3D, 0x35, 0x3E, 0x36, 0x3F, 0x37,
1455 0x2F, 0x27, 0x2E, 0x26, 0x2D, 0x25, 0x2C, 0x24,
1456 0x1F, 0x17, 0x1E, 0x16, 0x1D, 0x15, 0x1C, 0x14,
1457 0x0C, 0x04, 0x0D, 0x05, 0x0E, 0x06, 0x0F, 0x07,
1459 0x00, 0x08, 0x10, 0x18, 0x19, 0x1A, 0x1B, 0x13,
1460 0x0B, 0x03, 0x02, 0x01, 0x09, 0x11, 0x12, 0x0A,
1461 0x04, 0x0C, 0x14, 0x1C, 0x1D, 0x1E, 0x1F, 0x17,
1462 0x0F, 0x07, 0x06, 0x05, 0x0D, 0x15, 0x16, 0x0E,
1463 0x24, 0x2C, 0x34, 0x3C, 0x3D, 0x3E, 0x3F, 0x37,
1464 0x2F, 0x27, 0x26, 0x25, 0x2D, 0x35, 0x36, 0x2E,
1465 0x20, 0x28, 0x30, 0x38, 0x39, 0x3A, 0x3B, 0x33,
1466 0x2B, 0x23, 0x22, 0x21, 0x29, 0x31, 0x32, 0x2A,
1468 0x00, 0x08, 0x09, 0x01, 0x02, 0x03, 0x0B, 0x0A,
1469 0x13, 0x1B, 0x1A, 0x12, 0x11, 0x10, 0x18, 0x19,
1470 0x21, 0x20, 0x28, 0x29, 0x2A, 0x22, 0x23, 0x2B,
1471 0x33, 0x3B, 0x3A, 0x32, 0x31, 0x39, 0x38, 0x30,
1472 0x34, 0x3C, 0x3D, 0x35, 0x36, 0x3E, 0x3F, 0x37,
1473 0x2F, 0x27, 0x26, 0x2E, 0x2D, 0x2C, 0x24, 0x25,
1474 0x1D, 0x1C, 0x14, 0x15, 0x16, 0x1E, 0x1F, 0x17,
1475 0x0E, 0x0F, 0x07, 0x06, 0x05, 0x0D, 0x0C, 0x04,
1477 0x18, 0x10, 0x08, 0x00, 0x01, 0x02, 0x03, 0x0B,
1478 0x13, 0x1B, 0x1A, 0x19, 0x11, 0x0A, 0x09, 0x12,
1479 0x1C, 0x14, 0x0C, 0x04, 0x05, 0x06, 0x07, 0x0F,
1480 0x17, 0x1F, 0x1E, 0x1D, 0x15, 0x0E, 0x0D, 0x16,
1481 0x3C, 0x34, 0x2C, 0x24, 0x25, 0x26, 0x27, 0x2F,
1482 0x37, 0x3F, 0x3E, 0x3D, 0x35, 0x2E, 0x2D, 0x36,
1483 0x38, 0x30, 0x28, 0x20, 0x21, 0x22, 0x23, 0x2B,
1484 0x33, 0x3B, 0x3A, 0x39, 0x31, 0x2A, 0x29, 0x32,
1486 0x00, 0x08, 0x09, 0x01, 0x02, 0x0A, 0x12, 0x11,
1487 0x10, 0x18, 0x19, 0x1A, 0x1B, 0x13, 0x0B, 0x03,
1488 0x07, 0x06, 0x0E, 0x0F, 0x17, 0x16, 0x15, 0x0D,
1489 0x05, 0x04, 0x0C, 0x14, 0x1C, 0x1D, 0x1E, 0x1F,
1490 0x3F, 0x3E, 0x36, 0x37, 0x2F, 0x2E, 0x2D, 0x35,
1491 0x3D, 0x3C, 0x34, 0x2C, 0x24, 0x25, 0x26, 0x27,
1492 0x38, 0x30, 0x31, 0x39, 0x3A, 0x32, 0x2A, 0x29,
1493 0x28, 0x20, 0x21, 0x22, 0x23, 0x2B, 0x33, 0x3B,
1495 0x00, 0x01, 0x08, 0x09, 0x10, 0x11, 0x18, 0x19,
1496 0x20, 0x21, 0x28, 0x29, 0x30, 0x31, 0x38, 0x39,
1497 0x3A, 0x3B, 0x32, 0x33, 0x2A, 0x2B, 0x22, 0x23,
1498 0x1A, 0x1B, 0x12, 0x13, 0x0A, 0x0B, 0x02, 0x03,
1499 0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,
1500 0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x3C, 0x3D,
1501 0x3E, 0x3F, 0x36, 0x37, 0x2E, 0x2F, 0x26, 0x27,
1502 0x1E, 0x1F, 0x16, 0x17, 0x0E, 0x0F, 0x06, 0x07,
1506 const BINK_INTRA_QUANT: &[[i32; 64]; 16] = &[
1508 0x010000, 0x016315, 0x01E83D, 0x02A535, 0x014E7B, 0x016577, 0x02F1E6, 0x02724C,
1509 0x010000, 0x00EEDA, 0x024102, 0x017F9B, 0x00BE80, 0x00611E, 0x01083C, 0x00A552,
1510 0x021F88, 0x01DC53, 0x027FAD, 0x01F697, 0x014819, 0x00A743, 0x015A31, 0x009688,
1511 0x02346F, 0x030EE5, 0x01FBFA, 0x02C096, 0x01D000, 0x028396, 0x019247, 0x01F9AA,
1512 0x02346F, 0x01FBFA, 0x01DC53, 0x0231B8, 0x012F12, 0x01E06C, 0x00CB10, 0x0119A8,
1513 0x01C48C, 0x019748, 0x014E86, 0x0122AF, 0x02C628, 0x027F20, 0x0297B5, 0x023F32,
1514 0x025000, 0x01AB6B, 0x01D122, 0x0159B3, 0x012669, 0x008D43, 0x00EE1F, 0x0075ED,
1515 0x01490C, 0x010288, 0x00F735, 0x00EF51, 0x00E0F1, 0x0072AD, 0x00A4D8, 0x006517,
1517 0x015555, 0x01D971, 0x028AFC, 0x0386F1, 0x01BDF9, 0x01DC9F, 0x03ED33, 0x034311,
1518 0x015555, 0x013E78, 0x030158, 0x01FF7A, 0x00FE00, 0x00817D, 0x01604F, 0x00DC6D,
1519 0x02D4B5, 0x027B19, 0x0354E7, 0x029E1F, 0x01B577, 0x00DF04, 0x01CD96, 0x00C8B6,
1520 0x02F095, 0x0413DC, 0x02A54E, 0x03AB73, 0x026AAB, 0x035A1E, 0x02185E, 0x02A238,
1521 0x02F095, 0x02A54E, 0x027B19, 0x02ECF5, 0x019418, 0x028090, 0x010EC0, 0x01778A,
1522 0x025B66, 0x021F0B, 0x01BE09, 0x018394, 0x03B2E0, 0x03542A, 0x0374F1, 0x02FEEE,
1523 0x031555, 0x0239E4, 0x026C2D, 0x01CCEE, 0x01888C, 0x00BC59, 0x013D7E, 0x009D3C,
1524 0x01B6BB, 0x0158B5, 0x01499C, 0x013F17, 0x012BEC, 0x0098E6, 0x00DBCB, 0x0086C9,
1526 0x01AAAB, 0x024FCE, 0x032DBB, 0x0468AD, 0x022D78, 0x0253C7, 0x04E87F, 0x0413D5,
1527 0x01AAAB, 0x018E16, 0x03C1AE, 0x027F58, 0x013D80, 0x00A1DC, 0x01B863, 0x011388,
1528 0x0389E2, 0x0319DF, 0x042A21, 0x0345A7, 0x0222D4, 0x0116C5, 0x0240FC, 0x00FAE3,
1529 0x03ACBA, 0x0518D3, 0x034EA1, 0x04964F, 0x030555, 0x0430A5, 0x029E76, 0x034AC5,
1530 0x03ACBA, 0x034EA1, 0x0319DF, 0x03A833, 0x01F91E, 0x0320B4, 0x015270, 0x01D56D,
1531 0x02F23F, 0x02A6CE, 0x022D8B, 0x01E479, 0x049F98, 0x042935, 0x04522D, 0x03BEA9,
1532 0x03DAAB, 0x02C85D, 0x030738, 0x02402A, 0x01EAAF, 0x00EB6F, 0x018CDE, 0x00C48A,
1533 0x022469, 0x01AEE2, 0x019C02, 0x018EDD, 0x0176E7, 0x00BF20, 0x0112BE, 0x00A87B,
1535 0x020000, 0x02C62A, 0x03D07A, 0x054A69, 0x029CF6, 0x02CAEF, 0x05E3CC, 0x04E499,
1536 0x020000, 0x01DDB4, 0x048204, 0x02FF36, 0x017D01, 0x00C23C, 0x021077, 0x014AA3,
1537 0x043F0F, 0x03B8A6, 0x04FF5A, 0x03ED2E, 0x029032, 0x014E86, 0x02B461, 0x012D11,
1538 0x0468DF, 0x061DCA, 0x03F7F5, 0x05812C, 0x03A000, 0x05072C, 0x03248D, 0x03F353,
1539 0x0468DF, 0x03F7F5, 0x03B8A6, 0x046370, 0x025E24, 0x03C0D8, 0x019620, 0x02334F,
1540 0x038919, 0x032E91, 0x029D0D, 0x02455E, 0x058C50, 0x04FE3F, 0x052F69, 0x047E65,
1541 0x04A000, 0x0356D6, 0x03A243, 0x02B365, 0x024CD2, 0x011A85, 0x01DC3E, 0x00EBD9,
1542 0x029218, 0x020510, 0x01EE69, 0x01DEA2, 0x01C1E2, 0x00E559, 0x0149B0, 0x00CA2D,
1544 0x02AAAB, 0x03B2E3, 0x0515F8, 0x070DE2, 0x037BF2, 0x03B93E, 0x07DA65, 0x068621,
1545 0x02AAAB, 0x027CF0, 0x0602B1, 0x03FEF3, 0x01FC01, 0x0102FA, 0x02C09F, 0x01B8DA,
1546 0x05A96A, 0x04F632, 0x06A9CE, 0x053C3E, 0x036AED, 0x01BE09, 0x039B2D, 0x01916B,
1547 0x05E129, 0x0827B8, 0x054A9C, 0x0756E5, 0x04D555, 0x06B43B, 0x0430BC, 0x05446F,
1548 0x05E129, 0x054A9C, 0x04F632, 0x05D9EB, 0x032830, 0x050121, 0x021D80, 0x02EF14,
1549 0x04B6CC, 0x043E16, 0x037C11, 0x030728, 0x0765C0, 0x06A855, 0x06E9E2, 0x05FDDB,
1550 0x062AAB, 0x0473C8, 0x04D85A, 0x0399DC, 0x031118, 0x0178B2, 0x027AFD, 0x013A77,
1551 0x036D76, 0x02B16A, 0x029337, 0x027E2E, 0x0257D8, 0x0131CC, 0x01B796, 0x010D91,
1553 0x038000, 0x04DACA, 0x06ACD5, 0x094238, 0x0492AE, 0x04E322, 0x0A4EA5, 0x08900C,
1554 0x038000, 0x0343FB, 0x07E388, 0x053E9F, 0x029AC1, 0x0153E8, 0x039CD0, 0x02429E,
1555 0x076E5B, 0x068322, 0x08BEDE, 0x06DF11, 0x047C57, 0x02496B, 0x04BBAB, 0x020EDD,
1556 0x07B786, 0x0AB421, 0x06F1ED, 0x09A20D, 0x065800, 0x08CC8E, 0x057FF7, 0x06E9D2,
1557 0x07B786, 0x06F1ED, 0x068322, 0x07AE04, 0x0424BF, 0x06917B, 0x02C6B8, 0x03D9CB,
1558 0x062FEB, 0x05917D, 0x0492D7, 0x03F964, 0x09B58C, 0x08BCEF, 0x0912F8, 0x07DD30,
1559 0x081800, 0x05D7F7, 0x065BF6, 0x04B9F1, 0x040670, 0x01EE69, 0x03416C, 0x019CBC,
1560 0x047FAA, 0x0388DC, 0x036138, 0x03459C, 0x03134C, 0x01915C, 0x0240F5, 0x0161CF,
1562 0x040000, 0x058C54, 0x07A0F4, 0x0A94D3, 0x0539EC, 0x0595DD, 0x0BC798, 0x09C932,
1563 0x040000, 0x03BB68, 0x090409, 0x05FE6D, 0x02FA01, 0x018477, 0x0420EE, 0x029547,
1564 0x087E1F, 0x07714C, 0x09FEB5, 0x07DA5D, 0x052064, 0x029D0D, 0x0568C3, 0x025A21,
1565 0x08D1BE, 0x0C3B94, 0x07EFEA, 0x0B0258, 0x074000, 0x0A0E59, 0x06491A, 0x07E6A7,
1566 0x08D1BE, 0x07EFEA, 0x07714C, 0x08C6E0, 0x04BC48, 0x0781B1, 0x032C3F, 0x04669F,
1567 0x071232, 0x065D22, 0x053A1A, 0x048ABC, 0x0B18A0, 0x09FC7F, 0x0A5ED3, 0x08FCC9,
1568 0x094000, 0x06ADAC, 0x074487, 0x0566CA, 0x0499A5, 0x02350B, 0x03B87B, 0x01D7B3,
1569 0x052430, 0x040A20, 0x03DCD3, 0x03BD45, 0x0383C5, 0x01CAB3, 0x029361, 0x01945A,
1571 0x050000, 0x06EF69, 0x098931, 0x0D3A07, 0x068867, 0x06FB55, 0x0EB97E, 0x0C3B7E,
1572 0x050000, 0x04AA42, 0x0B450B, 0x077E08, 0x03B881, 0x01E595, 0x05292A, 0x033A99,
1573 0x0A9DA7, 0x094D9F, 0x0C7E62, 0x09D0F4, 0x06687D, 0x034450, 0x06C2F4, 0x02F0AA,
1574 0x0B062D, 0x0F4A78, 0x09EBE4, 0x0DC2EE, 0x091000, 0x0C91EF, 0x07DB61, 0x09E050,
1575 0x0B062D, 0x09EBE4, 0x094D9F, 0x0AF898, 0x05EB59, 0x09621D, 0x03F74F, 0x058046,
1576 0x08D6BE, 0x07F46A, 0x0688A0, 0x05AD6B, 0x0DDEC8, 0x0C7B9F, 0x0CF687, 0x0B3BFB,
1577 0x0B9000, 0x085917, 0x0915A8, 0x06C07D, 0x05C00E, 0x02C24D, 0x04A69A, 0x024D9F,
1578 0x066D3C, 0x050CA7, 0x04D407, 0x04AC96, 0x0464B6, 0x023D5F, 0x033839, 0x01F971,
1580 0x060000, 0x08527E, 0x0B716E, 0x0FDF3C, 0x07D6E1, 0x0860CC, 0x11AB63, 0x0EADCB,
1581 0x060000, 0x05991C, 0x0D860D, 0x08FDA3, 0x047702, 0x0246B3, 0x063165, 0x03DFEA,
1582 0x0CBD2E, 0x0B29F1, 0x0EFE0F, 0x0BC78B, 0x07B096, 0x03EB93, 0x081D24, 0x038732,
1583 0x0D3A9C, 0x12595D, 0x0BE7DF, 0x108384, 0x0AE000, 0x0F1585, 0x096DA8, 0x0BD9FA,
1584 0x0D3A9C, 0x0BE7DF, 0x0B29F1, 0x0D2A50, 0x071A6B, 0x0B4289, 0x04C25F, 0x0699EE,
1585 0x0A9B4A, 0x098BB2, 0x07D727, 0x06D01A, 0x10A4F0, 0x0EFABE, 0x0F8E3C, 0x0D7B2E,
1586 0x0DE000, 0x0A0482, 0x0AE6CA, 0x081A2F, 0x06E677, 0x034F90, 0x0594B9, 0x02C38C,
1587 0x07B649, 0x060F2F, 0x05CB3C, 0x059BE7, 0x0545A7, 0x02B00C, 0x03DD11, 0x025E87,
1589 0x080000, 0x0B18A8, 0x0F41E8, 0x1529A5, 0x0A73D7, 0x0B2BBB, 0x178F2F, 0x139264,
1590 0x080000, 0x0776CF, 0x120812, 0x0BFCD9, 0x05F402, 0x0308EF, 0x0841DC, 0x052A8E,
1591 0x10FC3E, 0x0EE297, 0x13FD69, 0x0FB4B9, 0x0A40C8, 0x053A1A, 0x0AD186, 0x04B442,
1592 0x11A37B, 0x187727, 0x0FDFD4, 0x1604B0, 0x0E8000, 0x141CB1, 0x0C9235, 0x0FCD4D,
1593 0x11A37B, 0x0FDFD4, 0x0EE297, 0x118DC0, 0x09788F, 0x0F0362, 0x06587F, 0x08CD3D,
1594 0x0E2463, 0x0CBA43, 0x0A7434, 0x091577, 0x163140, 0x13F8FE, 0x14BDA5, 0x11F992,
1595 0x128000, 0x0D5B58, 0x0E890D, 0x0ACD94, 0x093349, 0x046A15, 0x0770F7, 0x03AF65,
1596 0x0A4861, 0x08143F, 0x07B9A6, 0x077A89, 0x070789, 0x039565, 0x0526C2, 0x0328B4,
1598 0x0C0000, 0x10A4FD, 0x16E2DB, 0x1FBE78, 0x0FADC3, 0x10C198, 0x2356C7, 0x1D5B96,
1599 0x0C0000, 0x0B3237, 0x1B0C1A, 0x11FB46, 0x08EE03, 0x048D66, 0x0C62CA, 0x07BFD5,
1600 0x197A5D, 0x1653E3, 0x1DFC1E, 0x178F16, 0x0F612C, 0x07D727, 0x103A49, 0x070E64,
1601 0x1A7539, 0x24B2BB, 0x17CFBD, 0x210709, 0x15C000, 0x1E2B0A, 0x12DB4F, 0x17B3F4,
1602 0x1A7539, 0x17CFBD, 0x1653E3, 0x1A54A0, 0x0E34D7, 0x168513, 0x0984BE, 0x0D33DC,
1603 0x153695, 0x131765, 0x0FAE4E, 0x0DA033, 0x2149E1, 0x1DF57D, 0x1F1C78, 0x1AF65B,
1604 0x1BC000, 0x140904, 0x15CD94, 0x10345E, 0x0DCCEE, 0x069F20, 0x0B2972, 0x058718,
1605 0x0F6C91, 0x0C1E5E, 0x0B9678, 0x0B37CE, 0x0A8B4E, 0x056018, 0x07BA22, 0x04BD0E,
1607 0x110000, 0x179466, 0x206C0C, 0x2CF87F, 0x16362A, 0x17BCED, 0x321044, 0x299714,
1608 0x110000, 0x0FDC79, 0x265125, 0x19794E, 0x0CA685, 0x0672FB, 0x118BF4, 0x0AFA6D,
1609 0x241804, 0x1FA181, 0x2A7A80, 0x21600A, 0x15C9A9, 0x0B1B77, 0x16FD3C, 0x09FF0D,
1610 0x257B66, 0x33FD33, 0x21BBA2, 0x2EC9F7, 0x1ED000, 0x2ABCF9, 0x1AB6B0, 0x219444,
1611 0x257B66, 0x21BBA2, 0x1FA181, 0x254D38, 0x142030, 0x1FE730, 0x0D7C0E, 0x12B423,
1612 0x1E0D52, 0x1B0BCF, 0x1636EE, 0x134D9E, 0x2F28A9, 0x2A711B, 0x2C12FF, 0x263256,
1613 0x275000, 0x1C621B, 0x1EE33C, 0x16F4DB, 0x138CFB, 0x09616E, 0x0FD00C, 0x07D4B7,
1614 0x15D9CE, 0x112B06, 0x106A80, 0x0FE464, 0x0EF004, 0x079D77, 0x0AF25B, 0x06B67F,
1616 0x160000, 0x1E83CF, 0x29F53D, 0x3A3286, 0x1CBE90, 0x1EB842, 0x40C9C2, 0x35D293,
1617 0x160000, 0x1486BA, 0x319630, 0x20F756, 0x105F06, 0x085891, 0x16B51E, 0x0E3506,
1618 0x2EB5AA, 0x28EF20, 0x36F8E1, 0x2B30FE, 0x1C3225, 0x0E5FC7, 0x1DC030, 0x0CEFB7,
1619 0x308193, 0x4347AC, 0x2BA786, 0x3C8CE5, 0x27E000, 0x374EE7, 0x229212, 0x2B7494,
1620 0x308193, 0x2BA786, 0x28EF20, 0x3045D0, 0x1A0B89, 0x29494D, 0x11735D, 0x183469,
1621 0x26E410, 0x230039, 0x1CBF8F, 0x18FB09, 0x3D0771, 0x36ECBA, 0x390986, 0x316E52,
1622 0x32E000, 0x24BB33, 0x27F8E4, 0x1DB557, 0x194D09, 0x0C23BB, 0x1476A6, 0x0A2256,
1623 0x1C470A, 0x1637AD, 0x153E87, 0x1490FA, 0x1354B9, 0x09DAD6, 0x0E2A94, 0x08AFF0,
1625 0x1C0000, 0x26D64D, 0x3566AA, 0x4A11C2, 0x249572, 0x27190E, 0x527525, 0x44805E,
1626 0x1C0000, 0x1A1FD6, 0x3F1C3E, 0x29F4F9, 0x14D607, 0x0A9F44, 0x1CE683, 0x1214F0,
1627 0x3B72D9, 0x341911, 0x45F6F0, 0x36F889, 0x23E2BB, 0x124B5B, 0x25DD54, 0x1076E9,
1628 0x3DBC30, 0x55A109, 0x378F64, 0x4D1069, 0x32C000, 0x46646C, 0x2BFFB9, 0x374E8E,
1629 0x3DBC30, 0x378F64, 0x341911, 0x3D7020, 0x2125F5, 0x348BD6, 0x1635BC, 0x1ECE57,
1630 0x317F5B, 0x2C8BEB, 0x2496B6, 0x1FCB22, 0x4DAC61, 0x45E778, 0x4897C2, 0x3EE97F,
1631 0x40C000, 0x2EBFB5, 0x32DFAE, 0x25CF86, 0x203380, 0x0F734B, 0x1A0B5F, 0x0CE5E2,
1632 0x23FD53, 0x1C46DC, 0x1B09C4, 0x1A2CE1, 0x189A60, 0x0C8AE2, 0x1207A5, 0x0B0E77,
1634 0x220000, 0x2F28CC, 0x40D818, 0x59F0FE, 0x2C6C53, 0x2F79DA, 0x642089, 0x532E29,
1635 0x220000, 0x1FB8F1, 0x4CA24B, 0x32F29C, 0x194D09, 0x0CE5F7, 0x2317E8, 0x15F4DB,
1636 0x483007, 0x3F4303, 0x54F4FF, 0x42C014, 0x2B9351, 0x1636EE, 0x2DFA79, 0x13FE1A,
1637 0x4AF6CC, 0x67FA67, 0x437743, 0x5D93EE, 0x3DA000, 0x5579F1, 0x356D61, 0x432888,
1638 0x4AF6CC, 0x437743, 0x3F4303, 0x4A9A70, 0x284060, 0x3FCE60, 0x1AF81B, 0x256845,
1639 0x3C1AA5, 0x36179D, 0x2C6DDD, 0x269B3C, 0x5E5152, 0x54E237, 0x5825FE, 0x4C64AD,
1640 0x4EA000, 0x38C437, 0x3DC678, 0x2DE9B5, 0x2719F7, 0x12C2DB, 0x1FA018, 0x0FA96E,
1641 0x2BB39B, 0x22560C, 0x20D500, 0x1FC8C8, 0x1DE007, 0x0F3AEE, 0x15E4B7, 0x0D6CFE,
1643 0x2C0000, 0x3D079E, 0x53EA79, 0x74650C, 0x397D20, 0x3D7083, 0x819383, 0x6BA525,
1644 0x2C0000, 0x290D75, 0x632C61, 0x41EEAC, 0x20BE0C, 0x10B121, 0x2D6A3B, 0x1C6A0C,
1645 0x5D6B54, 0x51DE40, 0x6DF1C2, 0x5661FB, 0x38644B, 0x1CBF8F, 0x3B8060, 0x19DF6D,
1646 0x610326, 0x868F57, 0x574F0B, 0x7919CA, 0x4FC000, 0x6E9DCE, 0x452423, 0x56E928,
1647 0x610326, 0x574F0B, 0x51DE40, 0x608BA0, 0x341713, 0x52929A, 0x22E6BA, 0x3068D2,
1648 0x4DC821, 0x460071, 0x397F1E, 0x31F611, 0x7A0EE2, 0x6DD974, 0x72130C, 0x62DCA3,
1649 0x65C000, 0x497665, 0x4FF1C9, 0x3B6AAE, 0x329A12, 0x184776, 0x28ED4D, 0x1444AC,
1650 0x388E14, 0x2C6F5A, 0x2A7D0F, 0x2921F4, 0x26A973, 0x13B5AD, 0x1C5528, 0x115FDF,
1654 const BINK_INTER_QUANT: &[[i32; 64]; 16] = &[
1656 0x010000, 0x017946, 0x01A5A9, 0x0248DC, 0x016363, 0x0152A7, 0x0243EC, 0x0209EA,
1657 0x012000, 0x00E248, 0x01BBDA, 0x015CBC, 0x00A486, 0x0053E0, 0x00F036, 0x008095,
1658 0x01B701, 0x016959, 0x01B0B9, 0x0153FD, 0x00F8E7, 0x007EE4, 0x00EA30, 0x007763,
1659 0x01B701, 0x0260EB, 0x019DE9, 0x023E1B, 0x017000, 0x01FE6E, 0x012DB5, 0x01A27B,
1660 0x01E0D1, 0x01B0B9, 0x018A33, 0x01718D, 0x00D87A, 0x014449, 0x007B9A, 0x00AB71,
1661 0x013178, 0x0112EA, 0x00AD08, 0x009BB9, 0x023D97, 0x020437, 0x021CCC, 0x01E6B4,
1662 0x018000, 0x012DB5, 0x0146D9, 0x0100CE, 0x00CFD2, 0x006E5C, 0x00B0E4, 0x005A2D,
1663 0x00E9CC, 0x00B7B1, 0x00846F, 0x006B85, 0x008337, 0x0042E5, 0x004A10, 0x002831,
1665 0x015555, 0x01F708, 0x023237, 0x030BD0, 0x01D9D9, 0x01C389, 0x03053B, 0x02B7E3,
1666 0x018000, 0x012DB5, 0x024FCE, 0x01D0FA, 0x00DB5D, 0x006FD5, 0x014048, 0x00AB71,
1667 0x024957, 0x01E1CC, 0x0240F7, 0x01C551, 0x014BDE, 0x00A92F, 0x013840, 0x009F2F,
1668 0x024957, 0x032BE4, 0x0227E1, 0x02FD7A, 0x01EAAB, 0x02A893, 0x019247, 0x022DF9,
1669 0x028116, 0x0240F7, 0x020D99, 0x01ECBC, 0x0120A3, 0x01B061, 0x00A4CE, 0x00E497,
1670 0x01974B, 0x016E8E, 0x00E6B5, 0x00CFA2, 0x02FCC9, 0x02B04A, 0x02D110, 0x0288F1,
1671 0x020000, 0x019247, 0x01B3CC, 0x015668, 0x011518, 0x009325, 0x00EBDA, 0x00783D,
1672 0x0137BB, 0x00F4ED, 0x00B093, 0x008F5C, 0x00AEF4, 0x005931, 0x0062BF, 0x003597,
1674 0x01AAAB, 0x0274CB, 0x02BEC4, 0x03CEC4, 0x02504F, 0x02346C, 0x03C689, 0x0365DC,
1675 0x01E000, 0x017922, 0x02E3C1, 0x024539, 0x011235, 0x008BCA, 0x01905A, 0x00D64D,
1676 0x02DBAD, 0x025A40, 0x02D134, 0x0236A5, 0x019ED6, 0x00D37B, 0x018650, 0x00C6FB,
1677 0x02DBAD, 0x03F6DD, 0x02B1D9, 0x03BCD8, 0x026555, 0x0352B8, 0x01F6D8, 0x02B977,
1678 0x03215C, 0x02D134, 0x029100, 0x0267EB, 0x0168CC, 0x021C7A, 0x00CE01, 0x011DBD,
1679 0x01FD1E, 0x01CA31, 0x012062, 0x01038A, 0x03BBFB, 0x035C5C, 0x038554, 0x032B2D,
1680 0x028000, 0x01F6D8, 0x0220C0, 0x01AC02, 0x015A5E, 0x00B7EF, 0x0126D1, 0x00964C,
1681 0x0185A9, 0x013228, 0x00DCB8, 0x00B333, 0x00DAB2, 0x006F7D, 0x007B6F, 0x0042FC,
1683 0x020000, 0x02F28D, 0x034B52, 0x0491B8, 0x02C6C5, 0x02A54E, 0x0487D8, 0x0413D5,
1684 0x024000, 0x01C48F, 0x0377B5, 0x02B977, 0x01490C, 0x00A7BF, 0x01E06C, 0x01012A,
1685 0x036E03, 0x02D2B3, 0x036172, 0x02A7FA, 0x01F1CE, 0x00FDC7, 0x01D460, 0x00EEC7,
1686 0x036E03, 0x04C1D6, 0x033BD1, 0x047C37, 0x02E000, 0x03FCDD, 0x025B6A, 0x0344F5,
1687 0x03C1A1, 0x036172, 0x031466, 0x02E31B, 0x01B0F5, 0x028892, 0x00F735, 0x0156E2,
1688 0x0262F1, 0x0225D5, 0x015A10, 0x013772, 0x047B2D, 0x04086E, 0x043998, 0x03CD69,
1689 0x030000, 0x025B6A, 0x028DB3, 0x02019B, 0x019FA3, 0x00DCB8, 0x0161C7, 0x00B45B,
1690 0x01D398, 0x016F63, 0x0108DD, 0x00D70A, 0x01066F, 0x0085C9, 0x00941F, 0x005062,
1692 0x02AAAB, 0x03EE11, 0x04646D, 0x0617A0, 0x03B3B2, 0x038713, 0x060A75, 0x056FC6,
1693 0x030000, 0x025B6A, 0x049F9B, 0x03A1F4, 0x01B6BB, 0x00DFAA, 0x028090, 0x0156E2,
1694 0x0492AE, 0x03C399, 0x0481ED, 0x038AA2, 0x0297BD, 0x01525F, 0x027080, 0x013E5E,
1695 0x0492AE, 0x0657C8, 0x044FC1, 0x05FAF4, 0x03D555, 0x055126, 0x03248D, 0x045BF2,
1696 0x05022D, 0x0481ED, 0x041B33, 0x03D979, 0x024147, 0x0360C3, 0x01499C, 0x01C92E,
1697 0x032E96, 0x02DD1C, 0x01CD6A, 0x019F43, 0x05F991, 0x056093, 0x05A220, 0x0511E1,
1698 0x040000, 0x03248D, 0x036799, 0x02ACCF, 0x022A2F, 0x01264B, 0x01D7B5, 0x00F079,
1699 0x026F75, 0x01E9D9, 0x016127, 0x011EB8, 0x015DE9, 0x00B262, 0x00C57F, 0x006B2D,
1701 0x038000, 0x052876, 0x05C3CF, 0x07FF02, 0x04DBD9, 0x04A148, 0x07EDBA, 0x0722B4,
1702 0x03F000, 0x0317FB, 0x06117C, 0x04C491, 0x023FD5, 0x01258F, 0x0348BD, 0x01C209,
1703 0x060085, 0x04F0B9, 0x05EA87, 0x04A5F5, 0x036728, 0x01BC1C, 0x0333A8, 0x01A1DB,
1704 0x060085, 0x085336, 0x05A8AE, 0x07D960, 0x050800, 0x06FA82, 0x041FF9, 0x05B8AE,
1705 0x0692DA, 0x05EA87, 0x0563B2, 0x050D6E, 0x02F5AD, 0x046F00, 0x01B09C, 0x02580C,
1706 0x042D25, 0x03C235, 0x025D9B, 0x022108, 0x07D78F, 0x070EC1, 0x0764CA, 0x06A777,
1707 0x054000, 0x041FF9, 0x0477F9, 0x0382D0, 0x02D75E, 0x018242, 0x026B1D, 0x013B9F,
1708 0x03324A, 0x0282ED, 0x01CF83, 0x017851, 0x01CB42, 0x00EA21, 0x010336, 0x008CAC,
1710 0x040000, 0x05E519, 0x0696A4, 0x092370, 0x058D8A, 0x054A9C, 0x090FB0, 0x0827AA,
1711 0x048000, 0x03891F, 0x06EF69, 0x0572EE, 0x029218, 0x014F7E, 0x03C0D8, 0x020254,
1712 0x06DC05, 0x05A565, 0x06C2E4, 0x054FF3, 0x03E39B, 0x01FB8E, 0x03A8C0, 0x01DD8D,
1713 0x06DC05, 0x0983AC, 0x0677A2, 0x08F86E, 0x05C000, 0x07F9B9, 0x04B6D4, 0x0689EB,
1714 0x078343, 0x06C2E4, 0x0628CC, 0x05C635, 0x0361EA, 0x051124, 0x01EE69, 0x02ADC5,
1715 0x04C5E1, 0x044BAA, 0x02B41F, 0x026EE5, 0x08F65A, 0x0810DD, 0x087330, 0x079AD1,
1716 0x060000, 0x04B6D4, 0x051B65, 0x040337, 0x033F47, 0x01B970, 0x02C38F, 0x0168B6,
1717 0x03A730, 0x02DEC6, 0x0211BA, 0x01AE14, 0x020CDD, 0x010B93, 0x01283E, 0x00A0C4,
1719 0x050000, 0x075E60, 0x083C4D, 0x0B6C4C, 0x06F0ED, 0x069D43, 0x0B539C, 0x0A3194,
1720 0x05A000, 0x046B67, 0x08AB44, 0x06CFAA, 0x03369E, 0x01A35E, 0x04B10F, 0x0282E8,
1721 0x089307, 0x070EBF, 0x08739C, 0x06A3F0, 0x04DC82, 0x027A72, 0x0492F0, 0x0254F0,
1722 0x089307, 0x0BE497, 0x08158B, 0x0B3689, 0x073000, 0x09F827, 0x05E489, 0x082C66,
1723 0x096413, 0x08739C, 0x07B2FF, 0x0737C2, 0x043A64, 0x06556D, 0x026A04, 0x035936,
1724 0x05F75A, 0x055E94, 0x036127, 0x030A9E, 0x0B33F1, 0x0A1514, 0x0A8FFC, 0x098186,
1725 0x078000, 0x05E489, 0x06623F, 0x050405, 0x040F19, 0x0227CC, 0x037473, 0x01C2E3,
1726 0x0490FC, 0x039677, 0x029629, 0x021999, 0x029015, 0x014E78, 0x01724E, 0x00C8F5,
1728 0x060000, 0x08D7A6, 0x09E1F6, 0x0DB528, 0x085450, 0x07EFEA, 0x0D9788, 0x0C3B7E,
1729 0x06C000, 0x054DAE, 0x0A671E, 0x082C66, 0x03DB24, 0x01F73E, 0x05A145, 0x03037D,
1730 0x0A4A08, 0x087818, 0x0A2455, 0x07F7ED, 0x05D569, 0x02F955, 0x057D20, 0x02CC54,
1731 0x0A4A08, 0x0E4582, 0x09B373, 0x0D74A5, 0x08A000, 0x0BF696, 0x07123E, 0x09CEE0,
1732 0x0B44E4, 0x0A2455, 0x093D32, 0x08A950, 0x0512DF, 0x0799B6, 0x02E59E, 0x0404A7,
1733 0x0728D2, 0x06717F, 0x040E2F, 0x03A657, 0x0D7187, 0x0C194B, 0x0CACC8, 0x0B683A,
1734 0x090000, 0x07123E, 0x07A918, 0x0604D2, 0x04DEEA, 0x029629, 0x042556, 0x021D11,
1735 0x057AC8, 0x044E28, 0x031A97, 0x02851E, 0x03134C, 0x01915C, 0x01BC5D, 0x00F126,
1737 0x080000, 0x0BCA33, 0x0D2D48, 0x1246E0, 0x0B1B15, 0x0A9538, 0x121F5F, 0x104F53,
1738 0x090000, 0x07123E, 0x0DDED2, 0x0AE5DD, 0x052430, 0x029EFD, 0x0781B1, 0x0404A7,
1739 0x0DB80B, 0x0B4ACB, 0x0D85C7, 0x0A9FE7, 0x07C736, 0x03F71D, 0x075180, 0x03BB1A,
1740 0x0DB80B, 0x130757, 0x0CEF44, 0x11F0DC, 0x0B8000, 0x0FF372, 0x096DA8, 0x0D13D6,
1741 0x0F0686, 0x0D85C7, 0x0C5198, 0x0B8C6A, 0x06C3D4, 0x0A2248, 0x03DCD3, 0x055B8A,
1742 0x098BC3, 0x089754, 0x05683E, 0x04DDC9, 0x11ECB4, 0x1021B9, 0x10E661, 0x0F35A3,
1743 0x0C0000, 0x096DA8, 0x0A36CB, 0x08066E, 0x067E8E, 0x0372E1, 0x05871E, 0x02D16B,
1744 0x074E60, 0x05BD8B, 0x042374, 0x035C28, 0x0419BB, 0x021726, 0x02507C, 0x014188,
1746 0x0C0000, 0x11AF4C, 0x13C3EC, 0x1B6A50, 0x10A89F, 0x0FDFD4, 0x1B2F0F, 0x1876FD,
1747 0x0D8000, 0x0A9B5D, 0x14CE3C, 0x1058CB, 0x07B649, 0x03EE7B, 0x0B4289, 0x0606FB,
1748 0x149410, 0x10F030, 0x1448AB, 0x0FEFDA, 0x0BAAD2, 0x05F2AB, 0x0AFA40, 0x0598A7,
1749 0x149410, 0x1C8B03, 0x1366E6, 0x1AE949, 0x114000, 0x17ED2B, 0x0E247C, 0x139DC1,
1750 0x1689C8, 0x1448AB, 0x127A63, 0x11529F, 0x0A25BE, 0x0F336D, 0x05CB3C, 0x08094E,
1751 0x0E51A4, 0x0CE2FE, 0x081C5D, 0x074CAE, 0x1AE30E, 0x183296, 0x195991, 0x16D074,
1752 0x120000, 0x0E247C, 0x0F5230, 0x0C09A5, 0x09BDD5, 0x052C51, 0x084AAC, 0x043A21,
1753 0x0AF590, 0x089C51, 0x06352E, 0x050A3B, 0x062698, 0x0322B9, 0x0378BA, 0x01E24D,
1755 0x110000, 0x190DAC, 0x1C0039, 0x26D69C, 0x17998C, 0x167D16, 0x2682AB, 0x22A891,
1756 0x132000, 0x0F06C3, 0x1D797F, 0x172876, 0x0AECE7, 0x0591D9, 0x0FF398, 0x0889E3,
1757 0x1D2717, 0x17FEEF, 0x1CBC47, 0x1693CA, 0x108754, 0x086D1D, 0x0F8D30, 0x07ED98,
1758 0x1D2717, 0x286F9A, 0x1B7C71, 0x261FD3, 0x187000, 0x21E552, 0x140904, 0x1BCA27,
1759 0x1FEDDC, 0x1CBC47, 0x1A2D62, 0x188A62, 0x0E6022, 0x1588DA, 0x083540, 0x0B6284,
1760 0x1448FE, 0x124192, 0x0B7D84, 0x0A574B, 0x2616FF, 0x2247AA, 0x23E98D, 0x2051FA,
1761 0x198000, 0x140904, 0x15B46F, 0x110DAA, 0x0DCCEE, 0x07541E, 0x0BBF1F, 0x05FD04,
1762 0x0F868B, 0x0C32C8, 0x08CB57, 0x0723D4, 0x08B6AD, 0x047130, 0x04EB08, 0x02AB42,
1764 0x160000, 0x206C0C, 0x243C86, 0x3242E8, 0x1E8A79, 0x1D1A59, 0x31D646, 0x2CDA25,
1765 0x18C000, 0x13722A, 0x2624C3, 0x1DF820, 0x0E2385, 0x073537, 0x14A4A7, 0x0B0CCC,
1766 0x25BA1D, 0x1F0DAE, 0x252FE4, 0x1D37BB, 0x1563D6, 0x0AE78E, 0x142021, 0x0A4288,
1767 0x25BA1D, 0x345430, 0x2391FB, 0x31565C, 0x1FA000, 0x2BDD7A, 0x19ED8D, 0x23F68C,
1768 0x2951EF, 0x252FE4, 0x21E061, 0x1FC224, 0x129A87, 0x1BDE47, 0x0A9F44, 0x0EBBBA,
1769 0x1A4058, 0x17A026, 0x0EDEAB, 0x0D61E9, 0x314AEF, 0x2C5CBE, 0x2E798A, 0x29D380,
1770 0x210000, 0x19ED8D, 0x1C16AE, 0x1611AE, 0x11DC06, 0x097BEA, 0x0F3391, 0x07BFE7,
1771 0x141787, 0x0FC93E, 0x0B617F, 0x093D6D, 0x0B46C1, 0x05BFA8, 0x065D55, 0x037437,
1773 0x1C0000, 0x2943B2, 0x2E1E7C, 0x3FF810, 0x26DEC9, 0x250A43, 0x3F6DCE, 0x3915A3,
1774 0x1F8000, 0x18BFD8, 0x308BE1, 0x262485, 0x11FEA9, 0x092C75, 0x1A45EB, 0x0E1049,
1775 0x300425, 0x2785C6, 0x2F5439, 0x252FA8, 0x1B393F, 0x0DE0E4, 0x199D41, 0x0D0EDC,
1776 0x300425, 0x4299B2, 0x2D456E, 0x3ECB00, 0x284000, 0x37D40F, 0x20FFCB, 0x2DC56D,
1777 0x3496D3, 0x2F5439, 0x2B1D93, 0x286B74, 0x17AD66, 0x2377FE, 0x0D84E2, 0x12C062,
1778 0x21692A, 0x1E11A5, 0x12ECDA, 0x110840, 0x3EBC76, 0x387608, 0x3B2652, 0x353BBA,
1779 0x2A0000, 0x20FFCB, 0x23BFC6, 0x1C1681, 0x16BAF1, 0x0C1213, 0x1358E8, 0x09DCF8,
1780 0x19924F, 0x141767, 0x0E7C16, 0x0BC28A, 0x0E5A0D, 0x075104, 0x0819B2, 0x04655D,
1782 0x220000, 0x321B58, 0x380072, 0x4DAD38, 0x2F3318, 0x2CFA2D, 0x4D0556, 0x455122,
1783 0x264000, 0x1E0D86, 0x3AF2FE, 0x2E50EB, 0x15D9CE, 0x0B23B2, 0x1FE730, 0x1113C7,
1784 0x3A4E2D, 0x2FFDDF, 0x39788E, 0x2D2795, 0x210EA8, 0x10DA39, 0x1F1A61, 0x0FDB2F,
1785 0x3A4E2D, 0x50DF33, 0x36F8E1, 0x4C3FA5, 0x30E000, 0x43CAA5, 0x281209, 0x37944D,
1786 0x3FDBB7, 0x39788E, 0x345AC4, 0x3114C3, 0x1CC044, 0x2B11B4, 0x106A80, 0x16C509,
1787 0x2891FC, 0x248324, 0x16FB08, 0x14AE97, 0x4C2DFD, 0x448F54, 0x47D31B, 0x40A3F5,
1788 0x330000, 0x281209, 0x2B68DF, 0x221B53, 0x1B99DB, 0x0EA83B, 0x177E3E, 0x0BFA09,
1789 0x1F0D17, 0x18658F, 0x1196AE, 0x0E47A8, 0x116D5A, 0x08E260, 0x09D60F, 0x055684,
1791 0x2C0000, 0x40D818, 0x48790C, 0x6485D0, 0x3D14F2, 0x3A34B2, 0x63AC8D, 0x59B44A,
1792 0x318000, 0x26E454, 0x4C4986, 0x3BF03F, 0x1C470A, 0x0E6A6E, 0x29494D, 0x161998,
1793 0x4B743A, 0x3E1B5C, 0x4A5FC7, 0x3A6F75, 0x2AC7AC, 0x15CF1D, 0x284041, 0x148510,
1794 0x4B743A, 0x68A861, 0x4723F6, 0x62ACB8, 0x3F4000, 0x57BAF3, 0x33DB1A, 0x47ED19,
1795 0x52A3DE, 0x4A5FC7, 0x43C0C2, 0x3F8448, 0x25350D, 0x37BC8E, 0x153E87, 0x1D7775,
1796 0x3480B0, 0x2F404C, 0x1DBD56, 0x1AC3D2, 0x6295DE, 0x58B97B, 0x5CF313, 0x53A701,
1797 0x420000, 0x33DB1A, 0x382D5C, 0x2C235D, 0x23B80D, 0x12F7D4, 0x1E6723, 0x0F7FCF,
1798 0x282F0E, 0x1F927D, 0x16C2FF, 0x127AD9, 0x168D83, 0x0B7F50, 0x0CBAAA, 0x06E86E,
1802 const BINKB_RUN_BITS: [u8; 64] = [
1803 6, 6, 6, 6, 6, 6, 6, 6,
1804 6, 6, 6, 6, 6, 6, 6, 6,
1805 6, 6, 6, 6, 6, 6, 6, 6,
1806 6, 6, 6, 6, 6, 6, 6, 6,
1807 5, 5, 5, 5, 5, 5, 5, 5,
1808 5, 5, 5, 5, 5, 5, 5, 5,
1809 4, 4, 4, 4, 4, 4, 4, 4,
1810 3, 3, 3, 3, 2, 2, 1, 0
1813 const BINKB_REF_INTRA_Q: [u8; 64] = [
1814 16, 16, 16, 19, 16, 19, 22, 22,
1815 22, 22, 26, 24, 26, 22, 22, 27,
1816 27, 27, 26, 26, 26, 29, 29, 29,
1817 27, 27, 27, 26, 34, 34, 34, 29,
1818 29, 29, 27, 27, 37, 34, 34, 32,
1819 32, 29, 29, 38, 37, 35, 35, 34,
1820 35, 40, 40, 40, 38, 38, 48, 48,
1821 46, 46, 58, 56, 56, 69, 69, 83
1824 const BINKB_REF_INTER_Q: [u8; 64] = [
1825 16, 17, 17, 18, 18, 18, 19, 19,
1826 19, 19, 20, 20, 20, 20, 20, 21,
1827 21, 21, 21, 21, 21, 22, 22, 22,
1828 22, 22, 22, 22, 23, 23, 23, 23,
1829 23, 23, 23, 23, 24, 24, 24, 25,
1830 24, 24, 24, 25, 26, 26, 26, 26,
1831 25, 27, 27, 27, 27, 27, 28, 28,
1832 28, 28, 30, 30, 30, 31, 31, 33
1835 const BINKB_REF_QUANTS: [(u8, u8); 16] = [
1836 (1, 1), (4, 3), (5, 3), (2, 1), (7, 3), (8, 3), (3, 1), (7, 2),
1837 (4, 1), (9, 2), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)