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_core::io::intcode::*;
7 use nihav_codec_support::codecs::{IPShuffler, MV, ZERO_MV};
10 ($a:expr, $b:expr, $c:expr, $d:expr) => ({
11 (($a as u32) << 24) | (($b as u32) << 16) | (($c as u32) << 8) | ($d as u32)
14 (($arr[0] as u32) << 24) | (($arr[1] as u32) << 16) | (($arr[2] as u32) << 8) | ($arr[3] as u32)
18 macro_rules! idct_mul {
19 (a; $val: expr) => ($val + ($val >> 2));
20 (b; $val: expr) => ($val >> 1);
21 (c; $val: expr) => ($val - ($val >> 2) - ($val >> 4));
22 (d; $val: expr) => ($val + ($val >> 2) - ($val >> 4));
23 (e; $val: expr) => ($val >> 2);
27 ($src: expr, $sstep: expr, $off: expr, $dst: expr, $dstep: expr, $doff: expr, $bias: expr, $shift: expr) => {
28 let tmp00 = $src[$off + 3 * $sstep] + $src[$off + 5 * $sstep];
29 let tmp01 = $src[$off + 3 * $sstep] - $src[$off + 5 * $sstep];
30 let tmp02 = idct_mul!(a; $src[$off + 2 * $sstep]) + idct_mul!(b; $src[$off + 6 * $sstep]);
31 let tmp03 = idct_mul!(b; $src[$off + 2 * $sstep]) - idct_mul!(a; $src[$off + 6 * $sstep]);
32 let tmp0 = ($src[$off + 0 * $sstep] + $src[$off + 4 * $sstep]) + tmp02;
33 let tmp1 = ($src[$off + 0 * $sstep] + $src[$off + 4 * $sstep]) - tmp02;
34 let tmp2 = $src[$off + 0 * $sstep] - $src[$off + 4 * $sstep];
35 let tmp3 = $src[$off + 1 * $sstep] + tmp00;
36 let tmp4 = $src[$off + 1 * $sstep] - tmp00;
37 let tmp5 = tmp01 + $src[$off + 7 * $sstep];
38 let tmp6 = tmp01 - $src[$off + 7 * $sstep];
39 let tmp7 = tmp4 + idct_mul!(c; tmp6);
40 let tmp8 = idct_mul!(c; tmp4) - tmp6;
41 let tmp9 = idct_mul!(d; tmp3) + idct_mul!(e; tmp5);
42 let tmp10 = idct_mul!(e; tmp3) - idct_mul!(d; tmp5);
43 let tmp11 = tmp2 + tmp03;
44 let tmp12 = tmp2 - tmp03;
46 $dst[$doff + 0 * $dstep] = (tmp0 + tmp9 + $bias) >> $shift;
47 $dst[$doff + 1 * $dstep] = (tmp11 + tmp7 + $bias) >> $shift;
48 $dst[$doff + 2 * $dstep] = (tmp12 + tmp8 + $bias) >> $shift;
49 $dst[$doff + 3 * $dstep] = (tmp1 + tmp10 + $bias) >> $shift;
50 $dst[$doff + 4 * $dstep] = (tmp1 - tmp10 + $bias) >> $shift;
51 $dst[$doff + 5 * $dstep] = (tmp12 - tmp8 + $bias) >> $shift;
52 $dst[$doff + 6 * $dstep] = (tmp11 - tmp7 + $bias) >> $shift;
53 $dst[$doff + 7 * $dstep] = (tmp0 - tmp9 + $bias) >> $shift;
55 (float; $src: expr, $sstep: expr, $off: expr, $dst: expr, $dstep: expr, $doff: expr, $bias: expr, $shift: expr) => {
56 let t00 = $src[$off + $sstep * 2] + $src[$off + $sstep * 6];
57 let t01 = ($src[$off + $sstep * 2] - $src[$off + $sstep * 6]) * std::f32::consts::SQRT_2 - t00;
58 let t02 = $src[$off + $sstep * 0] + $src[$off + $sstep * 4];
59 let t03 = $src[$off + $sstep * 0] - $src[$off + $sstep * 4];
60 let t04 = $src[$off + $sstep * 3] + $src[$off + $sstep * 5];
61 let t05 = $src[$off + $sstep * 3] - $src[$off + $sstep * 5];
62 let t06 = $src[$off + $sstep * 1] + $src[$off + $sstep * 7];
63 let t07 = $src[$off + $sstep * 1] - $src[$off + $sstep * 7];
69 let t13 = (t06 - t04) * std::f32::consts::SQRT_2;
70 let t14 = (t07 - t05) * 1.847759;
71 let t15 = t05 * 2.613126 + t14 - t12;
73 let t17 = t07 * 1.0823922 - t14 + t16;
75 $dst[$doff + 0 * $dstep] = t08 + t12;
76 $dst[$doff + 1 * $dstep] = t10 + t15;
77 $dst[$doff + 2 * $dstep] = t11 + t16;
78 $dst[$doff + 3 * $dstep] = t09 - t17;
79 $dst[$doff + 4 * $dstep] = t09 + t17;
80 $dst[$doff + 5 * $dstep] = t11 - t16;
81 $dst[$doff + 6 * $dstep] = t10 - t15;
82 $dst[$doff + 7 * $dstep] = t08 - t12;
86 #[allow(clippy::erasing_op)]
87 fn bink2_idct(coeffs: &mut [i32; 64]) {
88 let mut tmp: [i32; 64] = [0; 64];
90 idct!(coeffs, 1, 8 * i, tmp, 8, i, 0, 0);
93 idct!(tmp, 1, 8 * i, coeffs, 1, 8 * i, 0, 6);
97 #[allow(clippy::erasing_op)]
98 fn bink2_idct_old(coeffs: &mut [f32; 64]) {
99 let mut tmp: [f32; 64] = [0.0; 64];
102 idct!(float; coeffs, 8, i, tmp, 8, i, 0, 0);
105 idct!(float; tmp, 1, 8 * i, coeffs, 1, 8 * i, 0, 6);
111 fn clip8(val: i32) -> u8 {
112 val.min(255).max(0) as u8
116 ($src: expr, $off: expr) => (
121 macro_rules! luma_filter {
122 ($src: expr, $off: expr, $step: expr) => ({
123 let t0 = el!($src, $off - 0 * $step) + el!($src, $off + 1 * $step);
124 let t1 = el!($src, $off - 1 * $step) + el!($src, $off + 2 * $step);
125 let t2 = el!($src, $off - 2 * $step) + el!($src, $off + 3 * $step);
126 (((t0 * 19) >> 1) - t1 * 2 + (t2 >> 1) + 8) >> 4
130 macro_rules! chroma_interp {
131 ($dst: expr, $dstride: expr, $h: expr, $ty: tt, $src: expr, $sstride: expr, $step: expr, $mode: expr, $shift: expr) => {
133 for out in $dst.chunks_mut($dstride).take($h) {
135 let e0 = el!($src, soff + i);
136 let e1 = el!($src, soff + i + $step);
137 out[i] = match $mode {
139 1 => (e0 * 3 + e1 + $shift) >> $shift,
140 2 => (e0 * 2 + e1 * 2 + $shift) >> $shift,
141 _ => (e0 + e1 * 3 + $shift) >> $shift,
149 macro_rules! avg_tree {
150 ($a: expr, $b: expr) => (($a + $b + 1) >> 1);
151 ($a: expr, $b: expr, $c: expr, $d: expr) => (avg_tree!(avg_tree!($a, $b), avg_tree!($c, $d)));
154 #[allow(clippy::erasing_op)]
156 #[allow(clippy::identity_op)]
157 fn calc_dc(src: &[u8], stride: usize) -> i32 {
158 let mut sums = [0u16; 8];
160 let s0 = src[i + stride * 0] as u16;
161 let s1 = src[i + stride * 1] as u16;
162 let s2 = src[i + stride * 2] as u16;
163 let s3 = src[i + stride * 3] as u16;
164 let s4 = src[i + stride * 4] as u16;
165 let s5 = src[i + stride * 5] as u16;
166 let s6 = src[i + stride * 6] as u16;
167 let s7 = src[i + stride * 7] as u16;
168 sums[i] = avg_tree!(avg_tree!(s0, s1, s2, s3), avg_tree!(s4, s5, s6, s7));
171 for e in sums.iter() {
176 fn put_mb4(dst: &mut [u8], mut off: usize, stride: usize, blk: &mut [[i32; 64]; 4]) {
177 bink2_idct(&mut blk[0]);
178 bink2_idct(&mut blk[1]);
179 bink2_idct(&mut blk[2]);
180 bink2_idct(&mut blk[3]);
182 let dout = &mut dst[off..];
183 for (row, (b0, b1)) in dout.chunks_mut(stride).zip(blk[0].chunks(8).zip(blk[1].chunks(8))) {
184 for (dst, &c) in row[..8].iter_mut().zip(b0.iter()) {
187 for (dst, &c) in row[8..16].iter_mut().zip(b1.iter()) {
194 let dout = &mut dst[off..];
195 for (row, (b2, b3)) in dout.chunks_mut(stride).zip(blk[2].chunks(8).zip(blk[3].chunks(8))) {
196 for (dst, &c) in row[..8].iter_mut().zip(b2.iter()) {
199 for (dst, &c) in row[8..16].iter_mut().zip(b3.iter()) {
205 fn add_mb4(dst: &mut [u8], mut off: usize, stride: usize, blk: &mut [[i32; 64]; 4]) {
206 bink2_idct(&mut blk[0]);
207 bink2_idct(&mut blk[1]);
208 bink2_idct(&mut blk[2]);
209 bink2_idct(&mut blk[3]);
211 let dout = &mut dst[off..];
212 for (row, (b0, b1)) in dout.chunks_mut(stride).zip(blk[0].chunks(8).zip(blk[1].chunks(8))) {
213 for (dst, &add) in row[..8].iter_mut().zip(b0.iter()) {
214 *dst = clip8(i32::from(*dst) + add);
216 for (dst, &add) in row[8..16].iter_mut().zip(b1.iter()) {
217 *dst = clip8(i32::from(*dst) + add);
223 let dout = &mut dst[off..];
224 for (row, (b2, b3)) in dout.chunks_mut(stride).zip(blk[2].chunks(8).zip(blk[3].chunks(8))) {
225 for (dst, &add) in row[..8].iter_mut().zip(b2.iter()) {
226 *dst = clip8(i32::from(*dst) + add);
228 for (dst, &add) in row[8..16].iter_mut().zip(b3.iter()) {
229 *dst = clip8(i32::from(*dst) + add);
234 fn put_mb4_old(dst: &mut [u8], mut off: usize, stride: usize, blk: &mut [[f32; 64]; 4]) {
235 bink2_idct_old(&mut blk[0]);
236 bink2_idct_old(&mut blk[1]);
237 bink2_idct_old(&mut blk[2]);
238 bink2_idct_old(&mut blk[3]);
240 let dout = &mut dst[off..];
241 for (row, (b0, b1)) in dout.chunks_mut(stride).zip(blk[0].chunks(8).zip(blk[1].chunks(8))) {
242 for (dst, &c) in row[..8].iter_mut().zip(b0.iter()) {
243 *dst = clip8((c as i32) - 512);
245 for (dst, &c) in row[8..16].iter_mut().zip(b1.iter()) {
246 *dst = clip8((c as i32) - 512);
252 let dout = &mut dst[off..];
253 for (row, (b2, b3)) in dout.chunks_mut(stride).zip(blk[2].chunks(8).zip(blk[3].chunks(8))) {
254 for (dst, &c) in row[..8].iter_mut().zip(b2.iter()) {
255 *dst = clip8((c as i32) - 512);
257 for (dst, &c) in row[8..16].iter_mut().zip(b3.iter()) {
258 *dst = clip8((c as i32) - 512);
263 fn add_mb4_old(dst: &mut [u8], mut off: usize, stride: usize, blk: &mut [[f32; 64]; 4]) {
264 bink2_idct_old(&mut blk[0]);
265 bink2_idct_old(&mut blk[1]);
266 bink2_idct_old(&mut blk[2]);
267 bink2_idct_old(&mut blk[3]);
269 let dout = &mut dst[off..];
270 for (row, (b0, b1)) in dout.chunks_mut(stride).zip(blk[0].chunks(8).zip(blk[1].chunks(8))) {
271 for (dst, &add) in row[..8].iter_mut().zip(b0.iter()) {
272 *dst = clip8(i32::from(*dst) + (add as i32) - 512);
274 for (dst, &add) in row[8..16].iter_mut().zip(b1.iter()) {
275 *dst = clip8(i32::from(*dst) + (add as i32) - 512);
281 let dout = &mut dst[off..];
282 for (row, (b2, b3)) in dout.chunks_mut(stride).zip(blk[2].chunks(8).zip(blk[3].chunks(8))) {
283 for (dst, &add) in row[..8].iter_mut().zip(b2.iter()) {
284 *dst = clip8(i32::from(*dst) + (add as i32) - 512);
286 for (dst, &add) in row[8..16].iter_mut().zip(b3.iter()) {
287 *dst = clip8(i32::from(*dst) + (add as i32) - 512);
292 fn mc_luma(dst: &mut [u8], stride: usize, ref_pic: &NAVideoBuffer<u8>, xoff: usize, yoff: usize, mv: MV, plane: usize) -> DecoderResult<()> {
293 let sx = (xoff as isize) + ((mv.x >> 1) as isize);
294 let sy = (yoff as isize) + ((mv.y >> 1) as isize);
295 let mode = (mv.x & 1) + (mv.y & 1) * 2;
296 let (d_x, add_x) = if (mv.x & 1) != 0 { (2, 5) } else { (0, 0) };
297 let (d_y, add_y) = if (mv.y & 1) != 0 { (2, 5) } else { (0, 0) };
299 let (w, h) = ref_pic.get_dimensions(plane);
300 let align_w = ((w + 31) & !31) as isize;
301 let align_h = ((h + 31) & !31) as isize;
302 validate!((sx - d_x >= 0) && (sx - d_x + add_x + 16 <= align_w));
303 validate!((sy - d_y >= 0) && (sy - d_y + add_y + 16 <= align_h));
304 let pstride = ref_pic.get_stride(plane);
305 let mut poff = ref_pic.get_offset(plane) + (sx as usize) + (sy as usize) * pstride;
306 let pdata = ref_pic.get_data();
307 let ppix = pdata.as_slice();
309 let dst = &mut dst[xoff + (yoff & 31) * stride..];
313 let src = &ppix[poff..];
314 for (out, row) in dst.chunks_mut(stride).take(16).zip(src.chunks(pstride)) {
315 out[..16].copy_from_slice(&row[..16]);
319 for out in dst.chunks_mut(stride).take(16) {
320 for (i, el) in out[..16].iter_mut().enumerate() {
321 *el = clip8(luma_filter!(ppix, poff + i, 1));
327 for out in dst.chunks_mut(stride).take(16) {
329 out[i] = clip8(luma_filter!(ppix, poff + i, pstride));
335 let mut tmp = [0i16; 21 * 16];
336 for out in tmp.chunks_mut(16) {
338 out[i] = luma_filter!(ppix, poff - 2 * pstride + i, 1) as i16;
342 for (row, out) in dst.chunks_mut(stride).take(16).enumerate() {
344 out[i] = clip8(luma_filter!(tmp, (row + 2) * 16 + i, 16));
352 fn mc_chroma(dst: &mut [u8], stride: usize, ref_pic: &NAVideoBuffer<u8>, xoff: usize, yoff: usize, mv: MV, plane: usize) -> DecoderResult<()> {
353 let sx = (xoff as isize) + ((mv.x >> 2) as isize);
354 let sy = (yoff as isize) + ((mv.y >> 2) as isize);
357 let add_x = if mx != 0 { 1 } else { 0 };
358 let add_y = if my != 0 { 1 } else { 0 };
360 let (w, h) = ref_pic.get_dimensions(plane);
361 let align_w = ((w + 15) & !15) as isize;
362 let align_h = ((h + 15) & !15) as isize;
363 validate!((sx >= 0) && (sx + add_x + 8 <= align_w));
364 validate!((sy >= 0) && (sy + add_y + 8 <= align_h));
365 let pstride = ref_pic.get_stride(plane);
366 let poff = ref_pic.get_offset(plane) + (sx as usize) + (sy as usize) * pstride;
367 let pdata = ref_pic.get_data();
368 let ppix = pdata.as_slice();
370 let dst = &mut dst[xoff + (yoff & 15) * stride..];
371 if (mx == 0) && (my == 0) {
372 let inpix = &ppix[poff..];
373 for (out, src) in dst.chunks_mut(stride).take(8).zip(inpix.chunks(pstride)) {
374 out[..8].copy_from_slice(&src[..8]);
377 chroma_interp!(dst, stride, 8, u8, &ppix[poff..], pstride, 1, mx, 2);
379 chroma_interp!(dst, stride, 8, u8, &ppix[poff..], pstride, pstride, my, 2);
381 let mut tmp = [0u16; 9 * 8];
382 chroma_interp!(tmp, 8, 9, u16, &ppix[poff..], pstride, 1, mx, 0);
383 chroma_interp!(dst, stride, 8, u8, &tmp, 8, 8, my, 4);
389 #[allow(clippy::collapsible_else_if)]
390 fn mid_pred<T:PartialOrd>(a: T, b: T, c: T) -> T {
395 if a < c { c } else { a }
399 if a < c { a } else { c }
415 fn resize(&mut self, bw: usize) {
416 self.qstride = bw * 2;
417 self.quants.resize(self.qstride * 2, 0);
419 self.pqpos = self.qstride;
421 fn update_line(&mut self) {
422 mem::swap(&mut self.qpos, &mut self.pqpos);
424 fn pred_quant(&self, pos: usize, is_top: bool) -> u8 {
425 let is_left = pos < 2;
427 if is_left { 16 } else { self.quants[self.qpos + pos - 2] }
429 self.quants[self.pqpos + pos]
431 mid_pred(self.quants[self.pqpos + pos - 2],
432 self.quants[self.pqpos + pos],
433 self.quants[self.qpos + pos - 2])
436 fn set_quant(&mut self, pos: usize, q: u8) {
437 self.quants[self.qpos + pos] = q;
452 fn resize(&mut self, bw: usize) {
453 self.stride = bw * 4 + 4;
455 self.prev_dcs.resize(self.stride, 0);
456 self.new_dcs.resize(self.stride, 0);
458 fn update_line(&mut self) {
459 mem::swap(&mut self.prev_dcs, &mut self.new_dcs);
461 fn set_dcs(&mut self, bx: usize, dc5: i32, dc7: i32, dc13: i32, dc10: i32, dc11: i32, dc14: i32, dc15: i32) {
466 let new_dc = &mut self.new_dcs[bx * 4 + 4..];
485 fn resize(&mut self, bw: usize) {
486 self.stride = bw * 2 + 2;
488 self.prev_dcs.resize(self.stride, 0);
489 self.new_dcs.resize(self.stride, 0);
491 fn update_line(&mut self) {
492 mem::swap(&mut self.prev_dcs, &mut self.new_dcs);
494 fn set_dcs(&mut self, bx: usize, dc1: i32, dc2: i32, dc3: i32) {
498 let new_dc = &mut self.new_dcs[bx * 2 + 2..];
505 fn decode_dcs(&mut self, br: &mut BitReader, q: u8) -> DecoderResult<bool>;
506 fn predict(&mut self, bx: usize, is_top: bool, is_left: bool, min_dc: i32, max_dc: i32);
507 fn predict_inter(&mut self, min_dc: i32, max_dc: i32);
510 fn dc_pred2(a: i32, b: i32) -> i32 {
511 (a.max(b)).min(a.min(b).max(a * 2 - b))
513 fn dc_pred(a: i32, b: i32, c: i32) -> i32 {
514 (a.max(b).max(c)).min((a.min(b).min(c)).max(b - a + c))
517 #[allow(clippy::identity_op)]
518 impl DCInfo for YDCInfo {
519 fn decode_dcs(&mut self, br: &mut BitReader, q: u8) -> DecoderResult<bool> {
520 decode_dcs(br, &mut self.dc_buf, q)
522 #[allow(non_snake_case)]
523 #[allow(clippy::collapsible_else_if)]
524 #[allow(clippy::needless_late_init)]
525 fn predict(&mut self, bx: usize, is_top: bool, is_left: bool, min_dc: i32, max_dc: i32) {
526 let a0; let a1; let a2; let a3; let a4; let a5; let a6; let a7;
527 let a8; let a9; let aA; let aB; let aC; let aD; let aE; let aF;
528 let prev_dc = &self.prev_dcs[bx * 4..];
529 let dst = &mut self.dcs;
530 let dcs = &self.dc_buf;
532 if is_top { //zigzag in 2x2 blocks
533 let add = 1 << 10;//if has_prev_dc { 1 << 10 } else { 0 };
534 a0 = (dcs[ 0] + add).max(min_dc).min(max_dc);
535 a1 = (dcs[ 1] + a0).max(min_dc).min(max_dc);
536 a2 = (dcs[ 2] + dc_pred2(a0, a1)).max(min_dc).min(max_dc);
537 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
539 a4 = (dcs[ 4] + dc_pred2(a1, a3)).max(min_dc).min(max_dc);
540 a5 = (dcs[ 5] + a4).max(min_dc).min(max_dc);
541 a6 = (dcs[ 6] + dc_pred(a1, a3, a4)).max(min_dc).min(max_dc);
542 a7 = (dcs[ 7] + dc_pred(a4, a5, a6)).max(min_dc).min(max_dc);
544 a8 = (dcs[ 8] + dc_pred2(a2, a3)).max(min_dc).min(max_dc);
545 a9 = (dcs[ 9] + dc_pred(a2, a3, a8)).max(min_dc).min(max_dc);
546 aA = (dcs[10] + dc_pred2(a8, a9)).max(min_dc).min(max_dc);
547 aB = (dcs[11] + dc_pred(a8, a9, aA)).max(min_dc).min(max_dc);
549 aC = (dcs[12] + dc_pred(a3, a6, a9)).max(min_dc).min(max_dc);
550 aD = (dcs[13] + dc_pred(a6, a7, aC)).max(min_dc).min(max_dc);
551 aE = (dcs[14] + dc_pred(a9, aB, aC)).max(min_dc).min(max_dc);
552 aF = (dcs[15] + dc_pred(aC, aD, aE)).max(min_dc).min(max_dc);
554 a0 = (dcs[ 0] + dc_pred2(prev_dc[4], prev_dc[5])).max(min_dc).min(max_dc);
555 a1 = (dcs[ 1] + dc_pred(prev_dc[4], prev_dc[5], a0)).max(min_dc).min(max_dc);
556 a2 = (dcs[ 2] + dc_pred2(a0, a1)).max(min_dc).min(max_dc);
557 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
559 a4 = (dcs[ 4] + dc_pred(prev_dc[5], prev_dc[6], a1)).max(min_dc).min(max_dc);
560 a5 = (dcs[ 5] + dc_pred(prev_dc[6], prev_dc[7], a4)).max(min_dc).min(max_dc);
561 a6 = (dcs[ 6] + dc_pred(a1, a3, a4)).max(min_dc).min(max_dc);
562 a7 = (dcs[ 7] + dc_pred(a4, a5, a6)).max(min_dc).min(max_dc);
564 a8 = (dcs[ 8] + dc_pred2(a2, a3)).max(min_dc).min(max_dc);
565 a9 = (dcs[ 9] + dc_pred(a2, a3, a8)).max(min_dc).min(max_dc);
566 aA = (dcs[10] + dc_pred2(a8, a9)).max(min_dc).min(max_dc);
567 aB = (dcs[11] + dc_pred(a8, a9, aA)).max(min_dc).min(max_dc);
569 aC = (dcs[12] + dc_pred(a3, a6, a9)).max(min_dc).min(max_dc);
570 aD = (dcs[13] + dc_pred(a6, a7, aC)).max(min_dc).min(max_dc);
571 aE = (dcs[14] + dc_pred(a9, aB, aC)).max(min_dc).min(max_dc);
572 aF = (dcs[15] + dc_pred(aC, aD, aE)).max(min_dc).min(max_dc);
576 a0 = (dcs[ 0] + dc_pred2(dst[5], dst[7])).max(min_dc).min(max_dc);
577 a1 = (dcs[ 1] + a0).max(min_dc).min(max_dc);
578 a2 = (dcs[ 2] + dc_pred(dst[5], dst[7], a0)).max(min_dc).min(max_dc);
579 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
581 a4 = (dcs[ 4] + dc_pred2(a1, a3)).max(min_dc).min(max_dc);
582 a5 = (dcs[ 5] + a4).max(min_dc).min(max_dc);
583 a6 = (dcs[ 6] + dc_pred(a1, a3, a4)).max(min_dc).min(max_dc);
584 a7 = (dcs[ 7] + dc_pred(a4, a5, a6)).max(min_dc).min(max_dc);
586 a8 = (dcs[ 8] + dc_pred(dst[7], dst[13], a2)).max(min_dc).min(max_dc);
587 a9 = (dcs[ 9] + dc_pred(a2, a3, a8)).max(min_dc).min(max_dc);
588 aA = (dcs[10] + dc_pred(dst[13], dst[15], a8)).max(min_dc).min(max_dc);
589 aB = (dcs[11] + dc_pred(a8, a9, aA)).max(min_dc).min(max_dc);
591 aC = (dcs[12] + dc_pred(a3, a6, a9)).max(min_dc).min(max_dc);
592 aD = (dcs[13] + dc_pred(a6, a7, aC)).max(min_dc).min(max_dc);
593 aE = (dcs[14] + dc_pred(a9, aB, aC)).max(min_dc).min(max_dc);
594 aF = (dcs[15] + dc_pred(aC, aD, aE)).max(min_dc).min(max_dc);
596 a0 = (dcs[ 0] + dc_pred(prev_dc[3], prev_dc[4], dst[5])).max(min_dc).min(max_dc);
597 a1 = (dcs[ 1] + dc_pred(prev_dc[4], prev_dc[5], a0)).max(min_dc).min(max_dc);
598 a2 = (dcs[ 2] + dc_pred(dst[5], dst[7], a0)).max(min_dc).min(max_dc);
599 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
601 a4 = (dcs[ 4] + dc_pred(prev_dc[5], prev_dc[6], a1)).max(min_dc).min(max_dc);
602 a5 = (dcs[ 5] + dc_pred(prev_dc[6], prev_dc[7], a4)).max(min_dc).min(max_dc);
603 a6 = (dcs[ 6] + dc_pred(a1, a3, a4)).max(min_dc).min(max_dc);
604 a7 = (dcs[ 7] + dc_pred(a4, a5, a6)).max(min_dc).min(max_dc);
606 a8 = (dcs[ 8] + dc_pred(dst[7], dst[13], a2)).max(min_dc).min(max_dc);
607 a9 = (dcs[ 9] + dc_pred(a2, a3, a8)).max(min_dc).min(max_dc);
608 aA = (dcs[10] + dc_pred(dst[13], dst[15], a8)).max(min_dc).min(max_dc);
609 aB = (dcs[11] + dc_pred(a8, a9, aA)).max(min_dc).min(max_dc);
611 aC = (dcs[12] + dc_pred(a3, a6, a9)).max(min_dc).min(max_dc);
612 aD = (dcs[13] + dc_pred(a6, a7, aC)).max(min_dc).min(max_dc);
613 aE = (dcs[14] + dc_pred(a9, aB, aC)).max(min_dc).min(max_dc);
614 aF = (dcs[15] + dc_pred(aC, aD, aE)).max(min_dc).min(max_dc);
633 let new_dc = &mut self.new_dcs[bx * 4 + 4..];
639 #[allow(non_snake_case)]
640 fn predict_inter(&mut self, min_dc: i32, max_dc: i32) {
641 let dst = &mut self.dcs;
642 let dcs = &self.dc_buf;
643 let a0 = (dcs[ 0] + 0).max(min_dc).min(max_dc);
644 let a1 = (dcs[ 1] + a0).max(min_dc).min(max_dc);
645 let a2 = (dcs[ 2] + dc_pred2(a0, a1)).max(min_dc).min(max_dc);
646 let a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
648 let a4 = (dcs[ 4] + dc_pred2(a1, a3)).max(min_dc).min(max_dc);
649 let a5 = (dcs[ 5] + a4).max(min_dc).min(max_dc);
650 let a6 = (dcs[ 6] + dc_pred(a1, a3, a4)).max(min_dc).min(max_dc);
651 let a7 = (dcs[ 7] + dc_pred(a4, a5, a6)).max(min_dc).min(max_dc);
653 let a8 = (dcs[ 8] + dc_pred2(a2, a3)).max(min_dc).min(max_dc);
654 let a9 = (dcs[ 9] + dc_pred(a2, a3, a8)).max(min_dc).min(max_dc);
655 let aA = (dcs[10] + dc_pred2(a8, a9)).max(min_dc).min(max_dc);
656 let aB = (dcs[11] + dc_pred(a8, a9, aA)).max(min_dc).min(max_dc);
658 let aC = (dcs[12] + dc_pred(a3, a6, a9)).max(min_dc).min(max_dc);
659 let aD = (dcs[13] + dc_pred(a6, a7, aC)).max(min_dc).min(max_dc);
660 let aE = (dcs[14] + dc_pred(a9, aB, aC)).max(min_dc).min(max_dc);
661 let aF = (dcs[15] + dc_pred(aC, aD, aE)).max(min_dc).min(max_dc);
682 impl DCInfo for CDCInfo {
683 fn decode_dcs(&mut self, br: &mut BitReader, q: u8) -> DecoderResult<bool> {
684 decode_dcs(br, &mut self.dc_buf, q)
686 fn predict(&mut self, bx: usize, is_top: bool, is_left: bool, min_dc: i32, max_dc: i32) {
687 let prev_dc = &self.prev_dcs[bx * 2..];
688 let dst = &mut self.dcs;
689 let dcs = &self.dc_buf;
691 let a0; let a1; let a2; let a3;
694 let add = 1 << 10;//if has_prev_dc { 1 << 10 } else { 0 };
695 a0 = (dcs[ 0] + add).max(min_dc).min(max_dc);
696 a1 = (dcs[ 1] + a0).max(min_dc).min(max_dc);
698 a0 = (dcs[ 0] + dc_pred2(prev_dc[2], prev_dc[3])).max(min_dc).min(max_dc);
699 a1 = (dcs[ 1] + dc_pred(prev_dc[2], prev_dc[3], a0)).max(min_dc).min(max_dc);
701 a2 = (dcs[ 2] + dc_pred2(a0, a1)).max(min_dc).min(max_dc);
702 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
705 a0 = (dcs[ 0] + dc_pred2(dst[1], dst[3])).max(min_dc).min(max_dc);
706 a1 = (dcs[ 1] + a0).max(min_dc).min(max_dc);
708 a0 = (dcs[ 0] + dc_pred(prev_dc[1], prev_dc[2], dst[1])).max(min_dc).min(max_dc);
709 a1 = (dcs[ 1] + dc_pred(prev_dc[2], prev_dc[3], a0)).max(min_dc).min(max_dc);
711 a2 = (dcs[ 2] + dc_pred(dst[1], dst[3], a0)).max(min_dc).min(max_dc);
712 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
718 let new_dc = &mut self.new_dcs[bx * 2 + 2..];
722 #[allow(clippy::identity_op)]
723 fn predict_inter(&mut self, min_dc: i32, max_dc: i32) {
724 let dst = &mut self.dcs;
725 let dcs = &self.dc_buf;
727 let a0 = (dcs[ 0] + 0).max(min_dc).min(max_dc);
728 let a1 = (dcs[ 1] + a0).max(min_dc).min(max_dc);
729 let a2 = (dcs[ 2] + dc_pred2(a0, a1)).max(min_dc).min(max_dc);
730 let a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
739 fn decode_dcs(br: &mut BitReader, dcs: &mut [i32], q: u8) -> DecoderResult<bool> {
740 if !br.read_bool()? {
741 for dc in dcs.iter_mut() {
746 let quant = BINK2_QUANT_DC[q.max(8) as usize];
747 for dc in dcs.iter_mut() {
748 *dc = br.read_bink2_code_zero()?;
750 *dc = (*dc * quant + 0x1FF) >> 10;
767 #[allow(clippy::collapsible_else_if)]
768 #[allow(clippy::identity_op)]
770 fn resize(&mut self, bw: usize) {
771 self.stride = bw * 4;
773 self.prev_off = self.stride;
774 self.mvs.resize(self.stride * 2, ZERO_MV);
776 fn update_line(&mut self) {
777 mem::swap(&mut self.mv_off, &mut self.prev_off);
779 fn decode_mv_new(&mut self, br: &mut BitReader, mv_cb: &Codebook<i8>, bx: usize, is_top: bool, is_left: bool) -> DecoderResult<()> {
780 let num_mv = if br.read_bool()? { 1 } else { 4 };
781 let mv = &mut self.mvs;
782 let mv_pos = self.mv_off + bx * 4;
783 let ref_pos = self.prev_off + bx * 4;
788 let raw_val = br.read_cb(mv_cb)?;
789 if raw_val != BINK2_MV_ESC {
790 val = raw_val as i16;
792 let len = br.read_code(UintCodeType::LimitedUnary(12, 1))? as u8;
794 let uval = (br.read(nlen)? as i32) + (1 << nlen) - 1;
796 val = (-(uval >> 1) - 1) as i16;
798 val = (uval >> 1) as i16;
802 mv[mv_pos + i].x = val;
804 mv[mv_pos + i].y = val;
812 let mv0 = mv[mv_pos + 0] + MV::pred(mv[mv_pos - 4], mv[mv_pos - 3], mv[mv_pos - 1]);
813 mv[mv_pos + 0] = mv0;
814 let mv2 = mv[mv_pos + 2] + MV::pred(mv[mv_pos - 3], mv[mv_pos - 1], mv[mv_pos + 0]);
815 mv[mv_pos + 2] = mv2;
816 let mv1 = mv[mv_pos + 1] + MV::pred(mv[mv_pos - 3], mv[mv_pos + 0], mv[mv_pos + 2]);
817 mv[mv_pos + 1] = mv1;
818 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
819 mv[mv_pos + 3] = mv3;
821 let mv1 = mv[mv_pos + 1] + mv[mv_pos + 0];
822 mv[mv_pos + 1] = mv1;
823 let mv2 = mv[mv_pos + 2] + mv[mv_pos + 0];
824 mv[mv_pos + 2] = mv2;
825 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
826 mv[mv_pos + 3] = mv3;
830 let mv0 = mv[mv_pos + 0] + MV::pred(mv[ref_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
831 mv[mv_pos + 0] = mv0;
832 let mv1 = mv[mv_pos + 1] + MV::pred(mv[ref_pos + 2], mv[ref_pos + 3], mv[mv_pos + 0]);
833 mv[mv_pos + 1] = mv1;
834 let mv2 = mv[mv_pos + 2] + MV::pred(mv[ref_pos + 2], mv[mv_pos + 0], mv[mv_pos + 1]);
835 mv[mv_pos + 2] = mv2;
836 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
837 mv[mv_pos + 3] = mv3;
839 let mv0 = mv[mv_pos + 0] + MV::pred(mv[ref_pos + 2], mv[ref_pos - 1], mv[mv_pos - 3]);
840 mv[mv_pos + 0] = mv0;
841 let mv1 = mv[mv_pos + 1] + MV::pred(mv[ref_pos + 2], mv[ref_pos + 3], mv[mv_pos + 0]);
842 mv[mv_pos + 1] = mv1;
843 let mv2 = mv[mv_pos + 2] + MV::pred(mv[mv_pos - 3], mv[mv_pos - 1], mv[mv_pos + 0]);
844 mv[mv_pos + 2] = mv2;
845 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
846 mv[mv_pos + 3] = mv3;
850 let mut mv_pred = mv[mv_pos + 0];
853 mv_pred += MV::pred(mv[mv_pos - 4], mv[mv_pos - 3], mv[mv_pos - 1]);
857 mv_pred += MV::pred(mv[ref_pos - 1], mv[ref_pos + 2], mv[mv_pos - 3]);
859 mv_pred += MV::pred(mv[ref_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
862 mv[mv_pos + 0] = mv_pred;
863 mv[mv_pos + 1] = mv_pred;
864 mv[mv_pos + 2] = mv_pred;
865 mv[mv_pos + 3] = mv_pred;
869 fn decode_mv_old(&mut self, br: &mut BitReader, bx: usize, is_top: bool, is_left: bool) -> DecoderResult<()> {
870 let mv = &mut self.mvs;
871 let mv_pos = self.mv_off + bx * 4;
872 let ref_pos = self.prev_off + bx * 4;
877 let mut bits = br.read(3)? as u8;
879 bits += br.read(2)? as u8;
881 let mut mv_c: [i16; 4] = [0; 4];
883 for mv in mv_c.iter_mut() {
884 *mv = br.read(bits)? as i16;
886 for mv in mv_c.iter_mut() {
887 if (*mv != 0) && br.read_bool()? {
892 if is_top && is_left {
893 let mut val = br.read(5)? as i16;
894 if (val != 0) && br.read_bool()? {
905 mv[mv_pos + i].x = mv_c[i];
909 mv[mv_pos + i].y = mv_c[i];
915 let mv0 = mv[mv_pos + 0] + MV::pred(mv[ref_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
916 mv[mv_pos + 0] = mv0;
917 let mv1 = mv[mv_pos + 1] + MV::pred(mv[ref_pos + 2], mv[ref_pos + 3], mv[mv_pos + 0]);
918 mv[mv_pos + 1] = mv1;
919 let mv2 = mv[mv_pos + 2] + MV::pred(mv[ref_pos + 2], mv[mv_pos + 0], mv[mv_pos + 1]);
920 mv[mv_pos + 2] = mv2;
921 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
922 mv[mv_pos + 3] = mv3;
924 let mv0 = mv[mv_pos + 0] + MV::pred(mv[ref_pos - 1], mv[ref_pos + 2], mv[mv_pos - 3]);
925 mv[mv_pos + 0] = mv0;
926 let mv1 = mv[mv_pos + 1] + MV::pred(mv[ref_pos + 2], mv[ref_pos + 3], mv[mv_pos + 0]);
927 mv[mv_pos + 1] = mv1;
928 let mv2 = mv[mv_pos + 2] + MV::pred(mv[ref_pos + 2], mv[mv_pos + 0], mv[mv_pos + 1]);
929 mv[mv_pos + 2] = mv2;
930 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
931 mv[mv_pos + 3] = mv3;
935 let base_mv = MV { x: basex * 16, y: basey * 16 };
936 mv[mv_pos + 0] += base_mv;
937 mv[mv_pos + 1] += base_mv;
938 mv[mv_pos + 2] += base_mv;
939 mv[mv_pos + 3] += base_mv;
941 let mv0 = mv[mv_pos + 0] + MV::pred(mv[mv_pos - 4], mv[mv_pos - 3], mv[mv_pos - 1]);
942 mv[mv_pos + 0] = mv0;
943 let mv2 = mv[mv_pos + 2] + MV::pred(mv[mv_pos - 3], mv[mv_pos - 1], mv[mv_pos + 0]);
944 mv[mv_pos + 2] = mv2;
945 let mv1 = mv[mv_pos + 1] + MV::pred(mv[mv_pos - 3], mv[mv_pos + 0], mv[mv_pos + 2]);
946 mv[mv_pos + 1] = mv1;
947 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
948 mv[mv_pos + 3] = mv3;
954 fn predict_mvs(&mut self, bx: usize, is_top: bool, is_left: bool, is_new: bool) {
955 let mv = &mut self.mvs;
956 let mv_pos = self.mv_off + bx * 4;
957 let ref_pos = self.prev_off + bx * 4;
962 mv[mv_pos + i] = ZERO_MV;
965 mv[mv_pos + 0] = MV::pred(mv[mv_pos - 4], mv[mv_pos - 3], mv[mv_pos - 1]);
966 mv[mv_pos + 2] = MV::pred(mv[mv_pos - 3], mv[mv_pos - 1], mv[mv_pos + 0]);
967 mv[mv_pos + 1] = MV::pred(mv[mv_pos - 1], mv[mv_pos + 0], mv[mv_pos + 2]);
968 mv[mv_pos + 3] = MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
972 mv[mv_pos + 0] = MV::pred(mv[ref_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
973 mv[mv_pos + 1] = MV::pred(mv[mv_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
974 mv[mv_pos + 2] = MV::pred(mv[ref_pos + 2], mv[mv_pos + 1], mv[mv_pos + 0]);
975 mv[mv_pos + 3] = MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
977 mv[mv_pos + 0] = MV::pred(mv[mv_pos - 3], mv[ref_pos - 1], mv[ref_pos + 2]);
978 mv[mv_pos + 1] = MV::pred(mv[mv_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
980 mv[mv_pos + 2] = MV::pred(mv[mv_pos - 3], mv[mv_pos - 1], mv[mv_pos + 0]);
982 mv[mv_pos + 2] = MV::pred(mv[ref_pos + 2], mv[mv_pos + 1], mv[mv_pos + 0]);
984 mv[mv_pos + 3] = MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
989 fn get_mv(&self, bx: usize, blk: usize) -> MV { self.mvs[self.mv_off + bx * 4 + blk] }
990 fn zero(&mut self, bx: usize) {
991 let pos = self.mv_off + bx * 4;
992 self.mvs[pos + 0] = ZERO_MV;
993 self.mvs[pos + 1] = ZERO_MV;
994 self.mvs[pos + 2] = ZERO_MV;
995 self.mvs[pos + 3] = ZERO_MV;
1000 ac_cb1: Codebook<u8>,
1001 ac_cb2: Codebook<u8>,
1002 mv_cb: Codebook<i8>,
1003 val_cb1: Codebook<u8>,
1004 val_cb2: Codebook<u8>,
1005 skip_cb1: Codebook<u8>,
1006 skip_cb2: Codebook<u8>,
1007 quant_cb: Codebook<u8>,
1010 fn map_ac(idx: usize) -> u8 { idx as u8 }
1012 impl Default for Bink2Codes {
1013 fn default() -> Self {
1014 let mut cbr = TableCodebookDescReader::new(BINK2_AC_CODES1, BINK2_AC_BITS1, map_ac);
1015 let ac_cb1 = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
1016 let mut cbr = TableCodebookDescReader::new(BINK2_AC_CODES2, BINK2_AC_BITS2, map_ac);
1017 let ac_cb2 = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
1018 let mut cbr = TableCodebookDescReader::new(BINK2_MV_CODES, BINK2_MV_BITS, |idx| BINK2_MV_SYMS[idx]);
1019 let mv_cb = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
1020 let mut cbr = TableCodebookDescReader::new(BINK2_AC_VAL_CODES1, BINK2_AC_VAL_BITS1, map_ac);
1021 let val_cb1 = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
1022 let mut cbr = TableCodebookDescReader::new(BINK2_AC_VAL_CODES2, BINK2_AC_VAL_BITS2, map_ac);
1023 let val_cb2 = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
1024 let mut cbr = TableCodebookDescReader::new(BINK2_AC_SKIP_CODES1, BINK2_AC_SKIP_BITS1, map_ac);
1025 let skip_cb1 = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
1026 let mut cbr = TableCodebookDescReader::new(BINK2_AC_SKIP_CODES2, BINK2_AC_SKIP_BITS2, map_ac);
1027 let skip_cb2 = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
1028 let mut cbr = TableCodebookDescReader::new(BINK2_QUANT_CODES, BINK2_QUANT_BITS, map_ac);
1029 let quant_cb = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
1030 Self { ac_cb1, ac_cb2, mv_cb, val_cb1, val_cb2, skip_cb1, skip_cb2, quant_cb }
1035 struct Bink2Decoder {
1036 info: NACodecInfoRef,
1041 slice_h: [usize; 8],
1057 #[allow(clippy::erasing_op)]
1063 #[allow(clippy::cognitive_complexity)]
1064 #[allow(clippy::identity_op)]
1065 #[allow(clippy::needless_range_loop)]
1066 fn decode_frame_new(&mut self, br: &mut BitReader, buf: &mut NAVideoBuffer<u8>, is_intra: bool) -> DecoderResult<()> {
1067 let (stride_y, stride_u, stride_v, stride_a) = (buf.get_stride(0), buf.get_stride(1), buf.get_stride(2), buf.get_stride(3));
1068 let (mut off_y, mut off_u, mut off_v, mut off_a) = (buf.get_offset(0), buf.get_offset(1), buf.get_offset(2), buf.get_offset(3));
1069 let (ooff_y, ooff_u, ooff_v, ooff_a) = (off_y, off_u, off_v, off_a);
1070 let (width, height) = buf.get_dimensions(0);
1071 let data = buf.get_data_mut().unwrap();
1072 let dst = data.as_mut_slice();
1073 let bw = (width + 31) >> 5;
1074 let bheight = (height + 31) >> 5;
1075 self.cur_w = (width + 7) & !7;
1076 self.cur_h = ((height + 7) & !7) >> 1;
1078 let frame_flags = br.read(32)?;
1079 let mut offsets: [u32; 7] = [0; 7];
1080 for offset in offsets[..self.num_slices-1].iter_mut() {
1081 *offset = br.read(32)?;
1083 let mut do_alpha = self.has_alpha;
1084 if (frame_flags & 0x80000) != 0 && self.has_alpha {
1086 let fillval = (frame_flags >> 24) as u8;
1087 let aplane = &mut dst[off_a..][..stride_a * bheight * 32];
1088 for el in aplane.iter_mut() {
1092 let mut row_flags: Vec<bool> = Vec::with_capacity(bheight * 4);
1093 let mut col_flags: Vec<bool> = Vec::with_capacity(bw * 4);
1094 if (frame_flags & 0x10000) != 0 {
1095 if (frame_flags & 0x8000) == 0 {
1096 let len = (height + 15) >> 4;
1097 decode_flags(br, &mut row_flags, 1, len * 2 - 1)?;
1099 if (frame_flags & 0x4000) == 0 {
1100 let len = (width + 15) >> 4;
1101 decode_flags(br, &mut col_flags, 1, len * 2 - 1)?;
1104 row_flags.resize(bheight * 4, false);
1105 col_flags.resize(bw * 4, false);
1106 //store frame_flags * 8 & 0x7F8
1108 let mut start_by = 0;
1109 for slice_no in 0..self.num_slices {
1110 let end_by = self.slice_h[slice_no];
1112 br.seek(offsets[slice_no - 1] * 8)?;
1114 off_y = ooff_y + stride_y * start_by * 32;
1115 off_u = ooff_u + stride_u * start_by * 16;
1116 off_v = ooff_v + stride_v * start_by * 16;
1117 off_a = ooff_a + stride_a * start_by * 32;
1119 let mut row_state = frame_flags & 0x2E000;
1121 row_state |= 0x10000;
1123 self.qinfo.resize(bw);
1124 self.y_dcs.resize(bw);
1125 self.u_dcs.resize(bw);
1126 self.v_dcs.resize(bw);
1127 self.a_dcs.resize(bw);
1128 self.mvs.resize(bw);
1129 for by in start_by..end_by {
1134 let mut cbp_y_p = 0;
1135 let mut cbp_u_p = 0;
1136 let mut cbp_v_p = 0;
1137 let mut cbp_a_p = 0;
1146 let rflags = (row_flags[by] as u32) * 4;
1147 row_state = (row_state & 0x3FFFFFF) | ((row_state >> 4) & 0xC000000) | (rflags << 28);
1151 // row_state |= 0x8;
1153 if by + 2 >= end_by {
1157 let mut btype_lru: [u8; 4] = [ 2, 3, 1, 0 ];
1158 let mut edge_state = 0;
1159 let is_top = by == start_by;
1161 let mut blk_state = row_state | (edge_state & 0x3FC0000);
1171 let clflags = (col_flags[bx] as u32) * 4;
1172 let edge_state_c = ((blk_state >> 4) & 0x3C0000) | (blk_state & 0xFC03FFFF) | ((clflags & 0xF) << 22);
1173 let edge_state_y = (frame_flags & 0x40000) | (blk_state & 0x3FFFF);
1174 edge_state = edge_state_c;
1176 //let is_top = (edge_state & 0x88) != 0;
1177 let is_left = bx == 0; //(edge_state & 0x20) != 0;
1182 } else if (blk_state & 0x2000) != 0 {
1183 let val = br.read_code(UintCodeType::LimitedUnary(3, 1))?;
1186 btype = btype_lru[0];
1189 btype = btype_lru[1];
1190 btype_lru[1] = btype_lru[0];
1191 btype_lru[0] = btype;
1194 btype = btype_lru[3];
1195 btype_lru[3] = btype_lru[2];
1196 btype_lru[2] = btype;
1199 btype = btype_lru[2];
1200 btype_lru[2] = btype_lru[1];
1201 btype_lru[1] = btype;
1203 _ => unreachable!(),
1206 btype = br.read(2)? as u8;
1209 let q = self.qinfo.pred_quant(bx * 2, is_top);
1210 self.qinfo.set_quant(bx * 2, q);
1211 let q = self.qinfo.pred_quant(bx * 2 + 1, is_top);
1212 self.qinfo.set_quant(bx * 2 + 1, q);
1216 if (frame_flags & 0x2000) != 0 {
1217 let mut yblk: [[[i32; 64]; 4]; 4] = [[[0; 64]; 4]; 4];
1218 let mut ublk: [[i32; 64]; 4] = [[0; 64]; 4];
1219 let mut vblk: [[i32; 64]; 4] = [[0; 64]; 4];
1220 let q = get_new_quant(br, self.qinfo.pred_quant(bx * 2, is_top))?;
1221 self.qinfo.set_quant(bx * 2, q);
1222 cbp_y = decode_luma_intra(br, &self.codes, cbp_y, q, &mut yblk, edge_state_y, &mut self.y_dcs, bx)?;
1223 cbp_v = decode_chroma_intra(br, &self.codes, cbp_v, q, &mut vblk, edge_state_c, &mut self.v_dcs, bx)?;
1224 cbp_u = decode_chroma_intra(br, &self.codes, cbp_u, q, &mut ublk, edge_state_c, &mut self.u_dcs, bx)?;
1226 let mut ablk: [[[i32; 64]; 4]; 4] = [[[0; 64]; 4]; 4];
1227 cbp_a = decode_luma_intra(br, &self.codes, cbp_a, q, &mut ablk, edge_state_y, &mut self.a_dcs, bx)?;
1228 Bink2DSP::put_mb4(dst, off_a + bx * 32 + 0 + 0 * stride_a, stride_a, &mut ablk[0]);
1229 Bink2DSP::put_mb4(dst, off_a + bx * 32 + 16 + 0 * stride_a, stride_a, &mut ablk[1]);
1230 Bink2DSP::put_mb4(dst, off_a + bx * 32 + 0 + 16 * stride_a, stride_a, &mut ablk[2]);
1231 Bink2DSP::put_mb4(dst, off_a + bx * 32 + 16 + 16 * stride_a, stride_a, &mut ablk[3]);
1233 //if smth else decode one more y
1234 Bink2DSP::put_mb4(dst, off_y + bx * 32 + 0 + 0 * stride_y, stride_y, &mut yblk[0]);
1235 Bink2DSP::put_mb4(dst, off_y + bx * 32 + 16 + 0 * stride_y, stride_y, &mut yblk[1]);
1236 Bink2DSP::put_mb4(dst, off_y + bx * 32 + 0 + 16 * stride_y, stride_y, &mut yblk[2]);
1237 Bink2DSP::put_mb4(dst, off_y + bx * 32 + 16 + 16 * stride_y, stride_y, &mut yblk[3]);
1238 Bink2DSP::put_mb4(dst, off_u + bx * 16, stride_u, &mut ublk);
1239 Bink2DSP::put_mb4(dst, off_v + bx * 16, stride_v, &mut vblk);
1241 let mut yblk: [[[f32; 64]; 4]; 4] = [[[0.0; 64]; 4]; 4];
1242 let mut ublk: [[f32; 64]; 4] = [[0.0; 64]; 4];
1243 let mut vblk: [[f32; 64]; 4] = [[0.0; 64]; 4];
1244 cbp_y = decode_luma_intra_old(br, &self.codes, cbp_y, &mut yblk, edge_state_y, &mut self.y_dcs, bx, &mut q_y)?;
1245 cbp_v = decode_chroma_intra_old(br, &self.codes, cbp_v, &mut vblk, edge_state_c, &mut self.v_dcs, bx, &mut q_v)?;
1246 cbp_u = decode_chroma_intra_old(br, &self.codes, cbp_u, &mut ublk, edge_state_c, &mut self.u_dcs, bx, &mut q_u)?;
1248 let mut ablk: [[[f32; 64]; 4]; 4] = [[[0.0; 64]; 4]; 4];
1249 cbp_a = decode_luma_intra_old(br, &self.codes, cbp_a, &mut ablk, edge_state_y, &mut self.a_dcs, bx, &mut q_a)?;
1250 Bink2DSP::put_mb4_old(dst, off_a + bx * 32 + 0 + 0 * stride_a, stride_a, &mut ablk[0]);
1251 Bink2DSP::put_mb4_old(dst, off_a + bx * 32 + 16 + 0 * stride_a, stride_a, &mut ablk[1]);
1252 Bink2DSP::put_mb4_old(dst, off_a + bx * 32 + 0 + 16 * stride_a, stride_a, &mut ablk[2]);
1253 Bink2DSP::put_mb4_old(dst, off_a + bx * 32 + 16 + 16 * stride_a, stride_a, &mut ablk[3]);
1255 Bink2DSP::put_mb4_old(dst, off_y + bx * 32 + 0 + 0 * stride_y, stride_y, &mut yblk[0]);
1256 Bink2DSP::put_mb4_old(dst, off_y + bx * 32 + 16 + 0 * stride_y, stride_y, &mut yblk[1]);
1257 Bink2DSP::put_mb4_old(dst, off_y + bx * 32 + 0 + 16 * stride_y, stride_y, &mut yblk[2]);
1258 Bink2DSP::put_mb4_old(dst, off_y + bx * 32 + 16 + 16 * stride_y, stride_y, &mut yblk[3]);
1259 Bink2DSP::put_mb4_old(dst, off_u + bx * 16, stride_u, &mut ublk);
1260 Bink2DSP::put_mb4_old(dst, off_v + bx * 16, stride_v, &mut vblk);
1263 self.mvs.predict_mvs(bx, is_top, is_left, (frame_flags & 0x2000) != 0);
1267 if let Some(ref ref_pic) = self.ips.get_ref() {
1268 for blk_no in 0..4 {
1269 let xoff = bx * 32 + (blk_no & 1) * 16;
1270 let yoff = by * 32 + (blk_no & 2) * 8;
1271 Bink2DSP::mc_luma(&mut dst[off_y..], stride_y, ref_pic, xoff, yoff, ZERO_MV, 0)?;
1272 Bink2DSP::mc_chroma(&mut dst[off_u..], stride_u, ref_pic, xoff >> 1, yoff >> 1, ZERO_MV, 1)?;
1273 Bink2DSP::mc_chroma(&mut dst[off_v..], stride_v, ref_pic, xoff >> 1, yoff >> 1, ZERO_MV, 2)?;
1275 Bink2DSP::mc_luma(&mut dst[off_a..], stride_a, ref_pic, xoff, yoff, ZERO_MV, 3)?;
1279 return Err(DecoderError::MissingReference);
1284 if (frame_flags & 0x2000) != 0 {
1285 self.mvs.decode_mv_new(br, &self.codes.mv_cb, bx, is_top, is_left)?;
1287 self.mvs.decode_mv_old(br, bx, is_top, is_left)?;
1289 if let Some(ref ref_pic) = self.ips.get_ref() {
1290 for blk_no in 0..4 {
1291 let xoff = bx * 32 + (blk_no & 1) * 16;
1292 let yoff = by * 32 + (blk_no & 2) * 8;
1293 let mv = self.mvs.get_mv(bx, blk_no);
1294 Bink2DSP::mc_luma(&mut dst[off_y..], stride_y, ref_pic, xoff, yoff, mv, 0)?;
1295 Bink2DSP::mc_chroma(&mut dst[off_u..], stride_u, ref_pic, xoff >> 1, yoff >> 1, mv, 1)?;
1296 Bink2DSP::mc_chroma(&mut dst[off_v..], stride_v, ref_pic, xoff >> 1, yoff >> 1, mv, 2)?;
1298 Bink2DSP::mc_luma(&mut dst[off_a..], stride_a, ref_pic, xoff, yoff, mv, 3)?;
1302 return Err(DecoderError::MissingReference);
1306 if (frame_flags & 0x2000) != 0 {
1307 self.mvs.decode_mv_new(br, &self.codes.mv_cb, bx, is_top, is_left)?;
1309 self.mvs.decode_mv_old(br, bx, is_top, is_left)?;
1311 if let Some(ref ref_pic) = self.ips.get_ref() {
1312 for blk_no in 0..4 {
1313 let xoff = bx * 32 + (blk_no & 1) * 16;
1314 let yoff = by * 32 + (blk_no & 2) * 8;
1315 let mv = self.mvs.get_mv(bx, blk_no);
1316 Bink2DSP::mc_luma(&mut dst[off_y..], stride_y, ref_pic, xoff, yoff, mv, 0)?;
1317 Bink2DSP::mc_chroma(&mut dst[off_u..], stride_u, ref_pic, xoff >> 1, yoff >> 1, mv, 1)?;
1318 Bink2DSP::mc_chroma(&mut dst[off_v..], stride_v, ref_pic, xoff >> 1, yoff >> 1, mv, 2)?;
1320 Bink2DSP::mc_luma(&mut dst[off_a..], stride_a, ref_pic, xoff, yoff, mv, 3)?;
1324 return Err(DecoderError::MissingReference);
1326 if (frame_flags & 0x2000) != 0 {
1327 let mut yblk: [[[i32; 64]; 4]; 4] = [[[0; 64]; 4]; 4];
1328 let mut ublk: [[i32; 64]; 4] = [[0; 64]; 4];
1329 let mut vblk: [[i32; 64]; 4] = [[0; 64]; 4];
1330 let q = get_new_quant(br, self.qinfo.pred_quant(bx * 2 + 1, is_top))?;
1331 self.qinfo.set_quant(bx * 2 + 1, q);
1332 cbp_y_p = decode_luma_inter(br, &self.codes, cbp_y_p, q, &mut yblk, edge_state_y, &mut self.y_dcs)?;
1333 if br.read_bool()? {
1334 cbp_v_p = decode_chroma_inter(br, &self.codes, cbp_v_p, q, &mut vblk, edge_state_y, &mut self.v_dcs)?;
1335 cbp_u_p = decode_chroma_inter(br, &self.codes, cbp_u_p, q, &mut ublk, edge_state_y, &mut self.u_dcs)?;
1341 let mut ablk: [[[i32; 64]; 4]; 4] = [[[0; 64]; 4]; 4];
1342 cbp_a_p = decode_luma_inter(br, &self.codes, cbp_a_p, q, &mut ablk, edge_state_y, &mut self.a_dcs)?;
1343 Bink2DSP::add_mb4(dst, off_a + bx * 32 + 0 + 0 * stride_a, stride_a, &mut ablk[0]);
1344 Bink2DSP::add_mb4(dst, off_a + bx * 32 + 16 + 0 * stride_a, stride_a, &mut ablk[1]);
1345 Bink2DSP::add_mb4(dst, off_a + bx * 32 + 0 + 16 * stride_a, stride_a, &mut ablk[2]);
1346 Bink2DSP::add_mb4(dst, off_a + bx * 32 + 16 + 16 * stride_a, stride_a, &mut ablk[3]);
1348 Bink2DSP::add_mb4(dst, off_y + bx * 32 + 0 + 0 * stride_y, stride_y, &mut yblk[0]);
1349 Bink2DSP::add_mb4(dst, off_y + bx * 32 + 16 + 0 * stride_y, stride_y, &mut yblk[1]);
1350 Bink2DSP::add_mb4(dst, off_y + bx * 32 + 0 + 16 * stride_y, stride_y, &mut yblk[2]);
1351 Bink2DSP::add_mb4(dst, off_y + bx * 32 + 16 + 16 * stride_y, stride_y, &mut yblk[3]);
1352 Bink2DSP::add_mb4(dst, off_u + bx * 16, stride_u, &mut ublk);
1353 Bink2DSP::add_mb4(dst, off_v + bx * 16, stride_v, &mut vblk);
1355 let mut yblk: [[[f32; 64]; 4]; 4] = [[[0.0; 64]; 4]; 4];
1356 let mut ublk: [[f32; 64]; 4] = [[0.0; 64]; 4];
1357 let mut vblk: [[f32; 64]; 4] = [[0.0; 64]; 4];
1358 cbp_y_p = decode_luma_inter_old(br, &self.codes, cbp_y_p, &mut yblk, edge_state_y, &mut self.y_dcs, &mut q_y_p)?;
1359 cbp_v_p = decode_chroma_inter_old(br, &self.codes, cbp_v_p, &mut vblk, edge_state_y, &mut self.v_dcs, &mut q_v_p)?;
1360 cbp_u_p = decode_chroma_inter_old(br, &self.codes, cbp_u_p, &mut ublk, edge_state_y, &mut self.u_dcs, &mut q_u_p)?;
1362 let mut ablk: [[[f32; 64]; 4]; 4] = [[[0.0; 64]; 4]; 4];
1363 cbp_a_p = decode_luma_inter_old(br, &self.codes, cbp_a_p, &mut ablk, edge_state_y, &mut self.a_dcs, &mut q_a_p)?;
1364 Bink2DSP::add_mb4_old(dst, off_a + bx * 32 + 0 + 0 * stride_a, stride_a, &mut ablk[0]);
1365 Bink2DSP::add_mb4_old(dst, off_a + bx * 32 + 16 + 0 * stride_a, stride_a, &mut ablk[1]);
1366 Bink2DSP::add_mb4_old(dst, off_a + bx * 32 + 0 + 16 * stride_a, stride_a, &mut ablk[2]);
1367 Bink2DSP::add_mb4_old(dst, off_a + bx * 32 + 16 + 16 * stride_a, stride_a, &mut ablk[3]);
1369 Bink2DSP::add_mb4_old(dst, off_y + bx * 32 + 0 + 0 * stride_y, stride_y, &mut yblk[0]);
1370 Bink2DSP::add_mb4_old(dst, off_y + bx * 32 + 16 + 0 * stride_y, stride_y, &mut yblk[1]);
1371 Bink2DSP::add_mb4_old(dst, off_y + bx * 32 + 0 + 16 * stride_y, stride_y, &mut yblk[2]);
1372 Bink2DSP::add_mb4_old(dst, off_y + bx * 32 + 16 + 16 * stride_y, stride_y, &mut yblk[3]);
1373 Bink2DSP::add_mb4_old(dst, off_u + bx * 16, stride_u, &mut ublk);
1374 Bink2DSP::add_mb4_old(dst, off_v + bx * 16, stride_v, &mut vblk);
1377 _ => unreachable!(),
1380 let src = &dst[off_y + bx * 32..];
1381 let dc5 = Bink2DSP::calc_dc(&src[24..], stride_y);
1382 let dc7 = Bink2DSP::calc_dc(&src[24 + stride_y * 8..], stride_y);
1383 let dc13 = Bink2DSP::calc_dc(&src[24 + stride_y * 16..], stride_y);
1384 let dc10 = Bink2DSP::calc_dc(&src[ 0 + stride_y * 24..], stride_y);
1385 let dc11 = Bink2DSP::calc_dc(&src[ 8 + stride_y * 24..], stride_y);
1386 let dc14 = Bink2DSP::calc_dc(&src[16 + stride_y * 24..], stride_y);
1387 let dc15 = Bink2DSP::calc_dc(&src[24 + stride_y * 24..], stride_y);
1388 self.y_dcs.set_dcs(bx, dc5, dc7, dc13, dc10, dc11, dc14, dc15);
1389 let src = &dst[off_u + bx * 16..];
1390 let dc1 = Bink2DSP::calc_dc(&src[8..], stride_u);
1391 let dc2 = Bink2DSP::calc_dc(&src[0 + stride_u * 8..], stride_u);
1392 let dc3 = Bink2DSP::calc_dc(&src[8 + stride_u * 8..], stride_u);
1393 self.u_dcs.set_dcs(bx, dc1, dc2, dc3);
1394 let src = &dst[off_v + bx * 16..];
1395 let dc1 = Bink2DSP::calc_dc(&src[8..], stride_v);
1396 let dc2 = Bink2DSP::calc_dc(&src[0 + stride_v * 8..], stride_v);
1397 let dc3 = Bink2DSP::calc_dc(&src[8 + stride_v * 8..], stride_v);
1398 self.v_dcs.set_dcs(bx, dc1, dc2, dc3);
1400 let src = &dst[off_a + bx * 32..];
1401 let dc5 = Bink2DSP::calc_dc(&src[24..], stride_a);
1402 let dc7 = Bink2DSP::calc_dc(&src[24 + stride_y * 8..], stride_a);
1403 let dc13 = Bink2DSP::calc_dc(&src[24 + stride_y * 16..], stride_a);
1404 let dc10 = Bink2DSP::calc_dc(&src[ 0 + stride_y * 24..], stride_a);
1405 let dc11 = Bink2DSP::calc_dc(&src[ 8 + stride_y * 24..], stride_a);
1406 let dc14 = Bink2DSP::calc_dc(&src[16 + stride_y * 24..], stride_a);
1407 let dc15 = Bink2DSP::calc_dc(&src[24 + stride_y * 24..], stride_a);
1408 self.a_dcs.set_dcs(bx, dc5, dc7, dc13, dc10, dc11, dc14, dc15);
1412 self.qinfo.update_line();
1413 self.y_dcs.update_line();
1414 self.u_dcs.update_line();
1415 self.v_dcs.update_line();
1416 self.a_dcs.update_line();
1417 self.mvs.update_line();
1418 off_y += stride_y * 32;
1419 off_u += stride_u * 16;
1420 off_v += stride_v * 16;
1421 off_a += stride_a * 32;
1422 row_state = (row_state & !0x190) | ((row_state & 4) << 2);
1424 start_by = self.slice_h[slice_no];
1430 fn decode_flags(br: &mut BitReader, dst: &mut Vec<bool>, start: usize, nbits: usize) -> DecoderResult<()> {
1434 if !br.read_bool()? {
1436 let bit = br.read_bool()?;
1440 let mut cur_bits = nbits;
1442 let mut lastbit = false;
1443 while cur_bits > 0 {
1444 if !br.read_bool()? {
1445 lastbit = if mode == 3 { !lastbit } else { br.read_bool()? };
1448 let len = cur_bits.min(4);
1450 let bit = br.read_bool()?;
1459 } else if cur_bits < 16 {
1464 lastbit = if mode == 3 { !lastbit } else { br.read_bool()? };
1465 let mut run = (if mode == 3 { bread + 1 } else { bread + 2 } as usize).min(cur_bits);
1466 if run != cur_bits {
1467 let add_run = br.read(bread)? as usize;
1469 mode = if add_run == (1 << bread) - 1 { 1 } else { 3 };
1481 fn get_new_quant(br: &mut BitReader, prev_q: u8) -> DecoderResult<u8> {
1482 let mut code = br.read_code(UintCodeType::LimitedUnary(4, 1))? as u8;
1487 code += br.read(1)? as u8;
1488 } else if code == 4 {
1489 code = (br.read(5)? as u8) + 5;
1491 let ret = if !br.read_bool()? {
1492 prev_q.checked_add(code)
1494 prev_q.checked_sub(code)
1496 validate!(ret.is_some());
1497 let val = ret.unwrap();
1498 validate!(val < (BINK2_QUANT_DC.len() as u8));
1503 fn decode_luma_intra(br: &mut BitReader, codes: &Bink2Codes, prev_cbp: u32, q: u8, dst: &mut [[[i32; 64]; 4]; 4], edge_state: u32, dcinfo: &mut YDCInfo, bx: usize) -> DecoderResult<u32> {
1504 let cbp = decode_cbp_luma(br, prev_cbp, edge_state)?;
1505 let _coded = dcinfo.decode_dcs(br, q)?;
1506 dcinfo.predict(bx, (edge_state & 0x88) != 0, (edge_state & 0x20) != 0, 0, 0x7FF);
1507 let dcs = &dcinfo.dcs;
1509 decode_acs_4blocks(br, codes, &mut dst[i], BINK2_QUANT_INTRA_LUMA, q, cbp >> (i * 4))?;
1510 for j in 0..4 { dst[i][j][0] = dcs[i * 4 + j] * 8 + 32; }
1515 fn decode_chroma_intra(br: &mut BitReader, codes: &Bink2Codes, prev_cbp: u32, q: u8, dst: &mut [[i32; 64]; 4], edge_state: u32, dcinfo: &mut CDCInfo, bx: usize) -> DecoderResult<u32> {
1516 let cbp = decode_cbp_chroma(br, prev_cbp)?;
1517 let _coded = dcinfo.decode_dcs(br, q)?;
1518 dcinfo.predict(bx, (edge_state & 0x88) != 0, (edge_state & 0x20) != 0, 0, 0x7FF);
1519 decode_acs_4blocks(br, codes, dst, BINK2_QUANT_INTRA_CHROMA, q, cbp)?;
1520 let dcs = &dcinfo.dcs;
1521 for i in 0..4 { dst[i][0] = dcs[i] * 8 + 32; }
1525 fn decode_luma_inter(br: &mut BitReader, codes: &Bink2Codes, prev_cbp: u32, q: u8, dst: &mut [[[i32; 64]; 4]; 4], edge_state: u32, dcinfo: &mut YDCInfo) -> DecoderResult<u32> {
1526 let cbp = decode_cbp_luma(br, prev_cbp, edge_state)?;
1527 let (min_dc, max_dc) = if (edge_state & 0x40000) != 0 { (-0x7FF, 0x7FF) } else { (-0x3FF, 0x3FF) };
1528 let _coded = dcinfo.decode_dcs(br, q)?;
1529 dcinfo.predict_inter(min_dc, max_dc);
1530 let dcs = &dcinfo.dcs;
1532 decode_acs_4blocks(br, codes, &mut dst[i], BINK2_QUANT_INTER, q, cbp >> (i * 4))?;
1533 for j in 0..4 { dst[i][j][0] = dcs[i * 4 + j] * 8; }
1538 fn decode_chroma_inter(br: &mut BitReader, codes: &Bink2Codes, prev_cbp: u32, q: u8, dst: &mut [[i32; 64]; 4], edge_state: u32, dcinfo: &mut CDCInfo) -> DecoderResult<u32> {
1539 let cbp = decode_cbp_chroma(br, prev_cbp)?;
1540 let (min_dc, max_dc) = if (edge_state & 0x40000) != 0 { (-0x7FF, 0x7FF) } else { (-0x3FF, 0x3FF) };
1541 let _coded = dcinfo.decode_dcs(br, q)?;
1542 dcinfo.predict_inter(min_dc, max_dc);
1543 let dcs = &dcinfo.dcs;
1544 decode_acs_4blocks(br, codes, dst, BINK2_QUANT_INTER, q, cbp)?;
1545 for i in 0..4 { dst[i][0] = dcs[i] * 8; }
1549 #[allow(clippy::collapsible_if)]
1550 fn decode_cbp_luma(br: &mut BitReader, prev_cbp: u32, edge_state: u32) -> DecoderResult<u32> {
1551 let cnt = (prev_cbp as u16).count_ones() as usize;
1552 let (min_count, mask) = if cnt < 8 { (cnt, 0x0000) } else { (16 - cnt, 0xFFFF) };
1555 if br.read_bool()? {
1557 } else if min_count >= 4 {
1562 if !br.read_bool()? {
1563 let cbp4 = br.read(4)?;
1564 cbp |= cbp4 << (i * 4);
1569 if ((edge_state & 0x40000) == 0) || (cbp != 0) {
1570 if br.read_bool()? {
1576 fn decode_cbp_chroma(br: &mut BitReader, last_cbp: u32) -> DecoderResult<u32> {
1577 if br.read_bool()? {
1578 Ok((last_cbp & 0xF0000) | BINK2_CHROMA_CBPS[(last_cbp & 0xF) as usize])
1580 let ncbp = br.read(4)?;
1581 if br.read_bool()? {
1582 Ok(ncbp | (ncbp << 16))
1589 trait ReadBink2Code {
1590 fn read_bink2_code_zero(&mut self) -> DecoderResult<i32>;
1591 fn read_bink2_code_nz(&mut self) -> DecoderResult<i32>;
1594 impl<'a> ReadBink2Code for BitReader<'a> {
1595 fn read_bink2_code_zero(&mut self) -> DecoderResult<i32> {
1596 let pfx = self.read_code(UintCodeType::LimitedUnary(12, 0))? as i32;
1600 let add_bits = self.read((pfx as u8) - 3)? as i32;
1601 Ok((1 << (pfx - 3)) + add_bits + 2)
1604 fn read_bink2_code_nz(&mut self) -> DecoderResult<i32> {
1605 let pfx = self.read_code(UintCodeType::LimitedUnary(12, 0))? + 1;
1606 let val = if pfx >= 4 {
1607 let add_bits = self.read((pfx as u8) - 3)? as i32;
1608 (1 << (pfx - 3)) + add_bits + 2
1612 if self.read_bool()? {
1620 fn decode_acs_4blocks(br: &mut BitReader, codes: &Bink2Codes, dst: &mut [[i32; 64]; 4], quant_mat: &[[i32; 64]; 4], q: u8, cbp: u32) -> DecoderResult<()> {
1621 let cb = if (cbp >> 16) != 0 { &codes.ac_cb1 } else { &codes.ac_cb2 };
1622 let qmat = &quant_mat[(q & 3) as usize];
1624 for (blk_no, block) in dst.iter_mut().enumerate() {
1625 if ((cbp >> blk_no) & 1) == 0 { continue; }
1626 let mut esc_len = 0;
1632 let sym = br.read_cb(cb)?;
1633 let skip = if sym == 11 {
1634 br.read(6)? as usize
1636 BINK2_AC_RUNS[sym as usize]
1639 if idx > 63 { break; }
1640 esc_len = if sym == 13 { 6 } else { 0 };
1642 let level = br.read_bink2_code_nz()?;
1643 let pos = BINK2_ZIGZAG[idx];
1644 block[pos] = (((level * qmat[pos]) << shift) + 0x40) >> 7;
1647 // set blk info to (dc & 0x1FFF) | (intra ? 0x8000 : 0) | (((ncoded == 0) + (ncoded < 4) + (ncoded < 8)) << 13)
1652 fn decode_luma_intra_old(br: &mut BitReader, codes: &Bink2Codes, prev_cbp: u32, dst: &mut [[[f32; 64]; 4]; 4], edge_state: u32, dcinfo: &mut YDCInfo, bx: usize, old_q: &mut u8) -> DecoderResult<u32> {
1653 let cbp = decode_cbp_luma_old(br, prev_cbp)?;
1654 let q = decode_quant_old(br, &codes.quant_cb, *old_q)?;
1656 let is_top = (edge_state & 0x88) != 0;
1657 let is_left = (edge_state & 0x20) != 0;
1658 decode_dcs_old(br, &mut dcinfo.dc_buf, q, is_top && is_left)?;
1659 dcinfo.predict(bx, is_top, is_left, 0, 0x7FF);
1660 let dcs = &dcinfo.dcs;
1662 decode_acs_4blocks_old(br, codes, &mut dst[i], BINK2_QMAT_INTRA_LUMA_OLD, q, cbp >> (i * 4), BINK2_LUMA_SCAN_OLD)?;
1663 for j in 0..4 { dst[i][j][0] = (dcs[i * 4 + j] as f32) * 0.125; }
1668 fn decode_chroma_intra_old(br: &mut BitReader, codes: &Bink2Codes, prev_cbp: u32, dst: &mut [[f32; 64]; 4], edge_state: u32, dcinfo: &mut CDCInfo, bx: usize, old_q: &mut u8) -> DecoderResult<u32> {
1669 let cbp = decode_cbp_chroma_old(br, prev_cbp)?;
1670 let q = decode_quant_old(br, &codes.quant_cb, *old_q)?;
1672 let is_top = (edge_state & 0x88) != 0;
1673 let is_left = (edge_state & 0x20) != 0;
1674 decode_dcs_old(br, &mut dcinfo.dc_buf, q, is_top && is_left)?;
1675 dcinfo.predict(bx, is_top, is_left, 0, 0x7FF);
1676 decode_acs_4blocks_old(br, codes, dst, BINK2_QMAT_CHROMA_OLD, q, cbp, BINK2_CHROMA_SCAN_OLD)?;
1677 let dcs = &dcinfo.dcs;
1678 for i in 0..4 { dst[i][0] = (dcs[i] as f32) * 0.125; }
1683 fn decode_luma_inter_old(br: &mut BitReader, codes: &Bink2Codes, prev_cbp: u32, dst: &mut [[[f32; 64]; 4]; 4], _edge_state: u32, dcinfo: &mut YDCInfo, old_q: &mut u8) -> DecoderResult<u32> {
1684 let cbp = decode_cbp_luma_old(br, prev_cbp)?;
1685 let q = decode_quant_old(br, &codes.quant_cb, *old_q)?;
1687 decode_dcs_old(br, &mut dcinfo.dc_buf, q, false)?;
1688 dcinfo.predict_inter(-1023, 1023);
1689 let dcs = &dcinfo.dcs;
1691 decode_acs_4blocks_old(br, codes, &mut dst[i], BINK2_QMAT_INTER_LUMA_OLD, q, cbp >> (i * 4), BINK2_LUMA_SCAN_OLD)?;
1692 for j in 0..4 { dst[i][j][0] = (dcs[i * 4 + j] as f32) * 0.125; }
1697 fn decode_chroma_inter_old(br: &mut BitReader, codes: &Bink2Codes, prev_cbp: u32, dst: &mut [[f32; 64]; 4], _edge_state: u32, dcinfo: &mut CDCInfo, old_q: &mut u8) -> DecoderResult<u32> {
1698 let cbp = decode_cbp_chroma_old(br, prev_cbp)?;
1699 let q = decode_quant_old(br, &codes.quant_cb, *old_q)?;
1701 decode_dcs_old(br, &mut dcinfo.dc_buf, q, false)?;
1702 dcinfo.predict_inter(-1023, 1023);
1703 let dcs = &dcinfo.dcs;
1704 decode_acs_4blocks_old(br, codes, dst, BINK2_QMAT_CHROMA_OLD, q, cbp, BINK2_CHROMA_SCAN_OLD)?;
1705 for i in 0..4 { dst[i][0] = (dcs[i] as f32) * 0.125; }
1709 fn decode_quant_old(br: &mut BitReader, quant_cb: &Codebook<u8>, prev_quant: u8) -> DecoderResult<u8> {
1710 let diff = br.read_cb(quant_cb)?;
1714 let res = if br.read_bool()? {
1715 prev_quant.checked_sub(diff)
1717 prev_quant.checked_add(diff)
1719 validate!(res.is_some());
1720 let q = res.unwrap();
1726 fn decode_cbp_luma_old(br: &mut BitReader, prev_cbp: u32) -> DecoderResult<u32> {
1728 if br.read_bool()? {
1729 if br.read_bool()? {
1730 return Ok(prev_cbp);
1732 low = prev_cbp & 0xFFFF;
1734 let mut nib1 = (prev_cbp >> 4) & 0xF;
1735 if !br.read_bool()? {
1738 let mut new_cbp = nib1;
1739 if !br.read_bool()? {
1742 new_cbp |= nib1 << 4;
1743 if !br.read_bool()? {
1746 new_cbp |= nib1 << 8;
1747 if !br.read_bool()? {
1750 low = new_cbp | (nib1 << 12);
1752 let mut nib_hi = (prev_cbp >> 20) & 0xF;
1755 let nib = (low >> (4 * i)) & 0xF;
1756 if nib.count_ones() == 0 {
1758 } else if (nib.count_ones() == 1) || !br.read_bool()? {
1761 if (((nib >> bit) & 1) != 0) && br.read_bool()? {
1767 high = (high >> 4) | (nib_hi << 28);
1772 fn decode_cbp_chroma_old(br: &mut BitReader, prev_cbp: u32) -> DecoderResult<u32> {
1773 let low = if !br.read_bool()? {
1776 if br.read_bool()? {
1777 return Ok(prev_cbp);
1782 if low.count_ones() == 0 {
1785 if low.count_ones() != 1 {
1786 high = (prev_cbp >> 16) & low;
1787 if br.read_bool()? {
1788 return Ok((high << 16) | low);
1793 if (((low >> bit) & 1) != 0) && br.read_bool()? {
1797 Ok((high << 16) | low)
1800 fn decode_dcs_old(br: &mut BitReader, dcs: &mut [i32], q: u8, read_bias: bool) -> DecoderResult<()> {
1801 let mut bits = br.read(3)? as u8;
1803 bits += br.read(2)? as u8;
1805 let scale = BINK2_OLD_DC_QUANTS[q as usize];
1807 for el in dcs.iter_mut() { *el = 0; }
1809 for dcb in dcs.chunks_mut(4) {
1810 for dc in dcb.iter_mut() {
1811 *dc = br.read(bits)? as i32;
1813 for dc in dcb.iter_mut() {
1814 if *dc == 0 { continue; }
1816 if br.read_bool()? {
1823 let add_bits = BINK2_DC_EXTRA_BITS[q as usize] + bits;
1825 let pfx = br.read(10 - add_bits)? as i32;
1828 if br.read_bool()? {
1829 base_dc = -(pfx << bits);
1831 base_dc = pfx << bits;
1836 dcs[0] += base_dc * scale;
1842 fn decode_acs_4blocks_old(br: &mut BitReader, codes: &Bink2Codes, dst: &mut [[f32; 64]; 4], quant_mat: &[f32; 64], q: u8, cbp: u32, scan: &[usize; 64]) -> DecoderResult<()> {
1843 let quant = BINK2_OLD_QUANTS[q as usize];
1844 for (blk_no, block) in dst.iter_mut().enumerate() {
1845 if ((cbp >> blk_no) & 1) == 0 { continue; }
1846 let val_cb = if ((cbp >> (16 + blk_no)) & 1) != 0 { &codes.val_cb2 } else { &codes.val_cb1 };
1847 let skip_cb = if ((cbp >> (16 + blk_no)) & 1) != 0 { &codes.skip_cb2 } else { &codes.skip_cb1 };
1848 let mut esc_len = 0;
1851 let val = br.read_cb(val_cb)?;
1855 let add_bits = br.read(val - 3)? as i32;
1856 level = (1 << (val - 3)) + add_bits + 2;
1860 if br.read_bool()? {
1863 let pos = scan[idx];
1864 block[pos] = (level as f32) * quant_mat[(pos & 7) * 8 + (pos >> 3)] * quant;
1867 if idx >= 64 { break; }
1871 let sym = br.read_cb(skip_cb)?;
1872 let skip = if sym == 11 {
1873 br.read(6)? as usize
1875 BINK2_AC_RUNS[sym as usize]
1878 if idx > 63 { break; }
1879 esc_len = if sym == 13 { 6 } else { 0 };
1886 const KB2H_NUM_SLICES: [usize; 4] = [ 2, 3, 4, 8 ];
1888 impl NADecoder for Bink2Decoder {
1889 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
1890 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
1891 let w = vinfo.get_width();
1892 let h = vinfo.get_height();
1894 let edata = info.get_extradata().unwrap();
1895 validate!(edata.len() >= 8);
1897 let mut mr = MemoryReader::new_read(&edata);
1898 let mut br = ByteReader::new(&mut mr);
1899 let magic = br.read_u32be()?;
1900 let flags = br.read_u32le()?;
1902 self.version = magic;
1903 self.has_alpha = (flags & 0x100000) != 0;
1905 let height_a = (h + 31) & !31;
1906 if self.version <= mktag!(b"KB2f") {
1907 self.num_slices = 2;
1908 self.slice_h[0] = (h + 32) >> 6;
1909 } else if self.version == mktag!(b"KB2g") {
1911 self.num_slices = 1;
1913 self.num_slices = 2;
1914 self.slice_h[0] = (h + 31) >> 6;
1917 self.num_slices = KB2H_NUM_SLICES[(flags & 3) as usize];
1919 let mut end = height_a + 32 * self.num_slices - 1;
1920 for i in 0..self.num_slices - 1 {
1921 start += ((end - start) / (self.num_slices - i)) & !31;
1923 self.slice_h[i] = start >> 5;
1926 self.slice_h[self.num_slices - 1] = height_a >> 5;
1928 let aplane = if self.has_alpha { Some(NAPixelChromaton::new(0, 0, false, 8, 0, 3, 1)) } else { None };
1929 let fmt = NAPixelFormaton::new(ColorModel::YUV(YUVSubmodel::YUVJ),
1930 Some(NAPixelChromaton::new(0, 0, false, 8, 0, 0, 1)),
1931 Some(NAPixelChromaton::new(1, 1, false, 8, 0, 1, 1)),
1932 Some(NAPixelChromaton::new(1, 1, false, 8, 0, 2, 1)),
1934 if self.has_alpha { FORMATON_FLAG_ALPHA } else { 0 },
1935 if self.has_alpha { 4 } else { 3 });
1936 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
1937 self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
1941 Err(DecoderError::InvalidData)
1944 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
1945 let src = pkt.get_buffer();
1947 let mut br = BitReader::new(&src, BitReaderMode::LE);
1950 self.key_frame = pkt.is_keyframe();
1952 let bufinfo = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 5)?;
1953 buf = bufinfo.get_vbuf().unwrap();
1955 self.decode_frame_new(&mut br, &mut buf, pkt.is_keyframe())?;
1956 let bufinfo = NABufferType::Video(buf);
1957 self.ips.add_frame(bufinfo.get_vbuf().unwrap());
1959 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
1960 frm.set_frame_type(if self.key_frame { FrameType::I } else { FrameType::P });
1963 fn flush(&mut self) {
1968 impl NAOptionHandler for Bink2Decoder {
1969 fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] }
1970 fn set_options(&mut self, _options: &[NAOption]) { }
1971 fn query_option_value(&self, _name: &str) -> Option<NAValue> { None }
1974 pub fn get_decoder() -> Box<dyn NADecoder + Send> {
1975 Box::new(Bink2Decoder::new())
1980 use nihav_core::codecs::RegisteredDecoders;
1981 use nihav_core::demuxers::RegisteredDemuxers;
1982 use nihav_codec_support::test::dec_video::*;
1983 use crate::rad_register_all_decoders;
1984 use crate::rad_register_all_demuxers;
1987 let mut dmx_reg = RegisteredDemuxers::new();
1988 rad_register_all_demuxers(&mut dmx_reg);
1989 let mut dec_reg = RegisteredDecoders::new();
1990 rad_register_all_decoders(&mut dec_reg);
1992 //let file = "assets/RAD/Open_Logos_partial.bik";
1993 //let file = "assets/RAD/sc13_01_partial.bk2";
1994 // sample from a private collection
1995 let file = "assets/RAD/ge_video_86l.bk2";
1996 //let file = "assets/RAD/eg_club_0.bk2";
1997 test_file_decoding("bink", file, Some(8), true, false, None/*Some("bink2")*/, &dmx_reg, &dec_reg);
2001 const BINK2_ZIGZAG: [usize; 64] = [
2002 0, 8, 1, 2, 9, 16, 24, 17,
2003 10, 3, 4, 11, 18, 25, 32, 40,
2004 33, 26, 19, 12, 5, 6, 13, 20,
2005 27, 34, 41, 48, 56, 49, 42, 35,
2006 28, 21, 14, 7, 15, 22, 29, 36,
2007 43, 50, 57, 58, 51, 44, 37, 30,
2008 23, 31, 38, 45, 52, 59, 60, 53,
2009 46, 39, 47, 54, 61, 62, 55, 63
2011 const BINK2_LUMA_SCAN_OLD: &[usize; 64] = &[
2012 0, 2, 1, 8, 9, 17, 10, 16,
2013 24, 3, 18, 25, 32, 11, 33, 26,
2014 4, 40, 19, 12, 27, 41, 34, 5,
2015 20, 48, 6, 28, 15, 42, 23, 35,
2016 21, 13, 14, 7, 31, 43, 49, 36,
2017 22, 56, 39, 50, 30, 44, 29, 51,
2018 57, 47, 58, 59, 63, 61, 55, 38,
2019 52, 62, 45, 37, 60, 46, 54, 53
2021 const BINK2_CHROMA_SCAN_OLD: &[usize; 64] = &[
2022 0, 1, 8, 2, 9, 16, 10, 17,
2023 3, 24, 11, 18, 25, 13, 14, 4,
2024 15, 5, 6, 7, 12, 19, 20, 21,
2025 22, 23, 26, 27, 28, 29, 30, 31,
2026 32, 33, 34, 35, 36, 37, 38, 39,
2027 40, 41, 42, 43, 44, 45, 46, 47,
2028 48, 49, 50, 51, 52, 53, 54, 55,
2029 56, 57, 58, 59, 60, 61, 62, 63
2032 const BINK2_CHROMA_CBPS: [u32; 16] = [
2039 const BINK2_QUANT_DC: [i32; 37] = [
2040 0x400, 0x4C2, 0x5A8, 0x6BA, 0x800, 0x983, 0xB50, 0xD74,
2041 0x1000, 0x1307, 0x16A1, 0x1AE9, 0x2000, 0x260E, 0x2D41, 0x35D1,
2042 0x4000, 0x4C1C, 0x5A82, 0x6BA3, 0x8000, 0x9838, 0xB505, 0xD745,
2043 0x10000, 0x13070, 0x16A0A, 0x1AE8A, 0x20000, 0x260E0, 0x2D414, 0x35D14,
2044 0x40000, 0x4C1C0, 0x5A828, 0x6BA28, 0x80000
2047 const BINK2_QUANT_INTRA_LUMA: &[[i32; 64]; 4] = &[
2049 0x400, 0x598, 0x5E2, 0x49D, 0x733, 0x7E9, 0x1497, 0x2190,
2050 0x521, 0x685, 0x65E, 0x688, 0xA41, 0xD72, 0x1F57, 0x31FA,
2051 0x434, 0x6DB, 0x710, 0x79E, 0xF8C, 0x130B, 0x226D, 0x2E85,
2052 0x546, 0x74C, 0x84F, 0x7E0, 0x1275, 0x1162, 0x1E20, 0x25A5,
2053 0x99A, 0xC1F, 0x10CF, 0x10CF, 0x1B33, 0x1AB3, 0x2B47, 0x3435,
2054 0xD2F, 0x1648, 0x13BC, 0x17A1, 0x23EE, 0x1C40, 0x29E5, 0x266A,
2055 0x156E, 0x1D61, 0x1E75, 0x1BB3, 0x2B47, 0x2720, 0x34F7, 0x3270,
2056 0x1C6F, 0x1DE1, 0x1B6C, 0x17D1, 0x23E5, 0x2357, 0x3175, 0x35C8
2058 0x4C2, 0x6A7, 0x6FF, 0x57D, 0x890, 0x968, 0x187C, 0x27EA,
2059 0x619, 0x7C1, 0x792, 0x7C4, 0xC32, 0xFFD, 0x2545, 0x3B6F,
2060 0x4FF, 0x827, 0x866, 0x90F, 0x127D, 0x16A6, 0x28F1, 0x3752,
2061 0x646, 0x8AE, 0x9E2, 0x95E, 0x15F3, 0x14AC, 0x23D3, 0x2CC4,
2062 0xB6B, 0xE6A, 0x13FD, 0x13FE, 0x2059, 0x1FC0, 0x3378, 0x3E16,
2063 0xFAE, 0x1A7F, 0x1778, 0x1C1A, 0x2ABA, 0x2198, 0x31D3, 0x2DAE,
2064 0x197C, 0x22F0, 0x2438, 0x20F1, 0x3378, 0x2E87, 0x3EFD, 0x3BFA,
2065 0x21D1, 0x2388, 0x209C, 0x1C52, 0x2AAF, 0x2A07, 0x3AD0, 0x3FF5
2067 0x5A8, 0x7E9, 0x852, 0x687, 0xA2F, 0xB30, 0x1D1E, 0x2F77,
2068 0x740, 0x938, 0x901, 0x93C, 0xE81, 0x1303, 0x2C52, 0x46AE,
2069 0x5F1, 0x9B2, 0x9FD, 0xAC6, 0x15FC, 0x1AEE, 0x30B0, 0x41C9,
2070 0x775, 0xA52, 0xBC0, 0xB24, 0x1A1B, 0x1895, 0x2A9A, 0x353D,
2071 0xD94, 0x1124, 0x17C5, 0x17C6, 0x2677, 0x25C2, 0x3D34, 0x49D5,
2072 0x12A5, 0x1F82, 0x1BE9, 0x216B, 0x32CF, 0x27F3, 0x3B40, 0x3653,
2073 0x1E4E, 0x298D, 0x2B12, 0x272C, 0x3D34, 0x3755, 0x4AE7, 0x4753,
2074 0x2836, 0x2A41, 0x26C7, 0x21AE, 0x32C3, 0x31FA, 0x45F1, 0x4C0E
2076 0x6BA, 0x968, 0x9E5, 0x7C3, 0xC1C, 0xD4E, 0x22A0, 0x3872,
2077 0x8A0, 0xAF7, 0xAB5, 0xAFB, 0x113F, 0x169C, 0x34B5, 0x540D,
2078 0x711, 0xB87, 0xBE1, 0xCD0, 0x1A25, 0x2007, 0x39E6, 0x4E3C,
2079 0x8DF, 0xC46, 0xDFA, 0xD3F, 0x1F0B, 0x1D3C, 0x32A9, 0x3F4F,
2080 0x1025, 0x1462, 0x1C44, 0x1C46, 0x2DBF, 0x2CE7, 0x48C9, 0x57CE,
2081 0x162D, 0x2578, 0x2131, 0x27BE, 0x3C6D, 0x2F82, 0x4676, 0x409A,
2082 0x240A, 0x3169, 0x3338, 0x2E96, 0x48C9, 0x41CD, 0x5914, 0x54D3,
2083 0x2FD2, 0x3240, 0x2E1E, 0x280E, 0x3C5E, 0x3B6F, 0x532D, 0x5A73
2087 const BINK2_QUANT_INTRA_CHROMA: &[[i32; 64]; 4] = &[
2089 0x400, 0x4A9, 0x59A, 0x89B, 0x1600, 0x1221, 0x171C, 0x19A3,
2090 0x4A9, 0x656, 0x713, 0xE16, 0x19A3, 0x1520, 0x1AEE, 0x1DE1,
2091 0x59A, 0x713, 0xDBB, 0x130B, 0x171C, 0x130B, 0x1847, 0x1AEE,
2092 0x89B, 0xE16, 0x130B, 0xEF0, 0x1221, 0xEF0, 0x130B, 0x1520,
2093 0x1600, 0x19A3, 0x171C, 0x1221, 0x1600, 0x1221, 0x171C, 0x19A3,
2094 0x1221, 0x1520, 0x130B, 0xEF0, 0x1221, 0xEF0, 0x130B, 0x1520,
2095 0x171C, 0x1AEE, 0x1847, 0x130B, 0x171C, 0x130B, 0x1847, 0x1AEE,
2096 0x19A3, 0x1DE1, 0x1AEE, 0x1520, 0x19A3, 0x1520, 0x1AEE, 0x1DE1
2098 0x4C2, 0x58B, 0x6AA, 0xA3C, 0x1A2A, 0x158F, 0x1B7B, 0x1E7D,
2099 0x58B, 0x789, 0x869, 0x10C0, 0x1E7D, 0x1920, 0x2007, 0x2388,
2100 0x6AA, 0x869, 0x1054, 0x16A6, 0x1B7B, 0x16A6, 0x1CDE, 0x2007,
2101 0xA3C, 0x10C0, 0x16A6, 0x11C4, 0x158F, 0x11C4, 0x16A6, 0x1920,
2102 0x1A2A, 0x1E7D, 0x1B7B, 0x158F, 0x1A2A, 0x158F, 0x1B7B, 0x1E7D,
2103 0x158F, 0x1920, 0x16A6, 0x11C4, 0x158F, 0x11C4, 0x16A6, 0x1920,
2104 0x1B7B, 0x2007, 0x1CDE, 0x16A6, 0x1B7B, 0x16A6, 0x1CDE, 0x2007,
2105 0x1E7D, 0x2388, 0x2007, 0x1920, 0x1E7D, 0x1920, 0x2007, 0x2388
2107 0x5A8, 0x698, 0x7EC, 0xC2C, 0x1F1D, 0x19A3, 0x20AF, 0x2442,
2108 0x698, 0x8F6, 0xA01, 0x13EB, 0x2442, 0x1DE1, 0x2616, 0x2A41,
2109 0x7EC, 0xA01, 0x136B, 0x1AEE, 0x20AF, 0x1AEE, 0x2255, 0x2616,
2110 0xC2C, 0x13EB, 0x1AEE, 0x1520, 0x19A3, 0x1520, 0x1AEE, 0x1DE1,
2111 0x1F1D, 0x2442, 0x20AF, 0x19A3, 0x1F1D, 0x19A3, 0x20AF, 0x2442,
2112 0x19A3, 0x1DE1, 0x1AEE, 0x1520, 0x19A3, 0x1520, 0x1AEE, 0x1DE1,
2113 0x20AF, 0x2616, 0x2255, 0x1AEE, 0x20AF, 0x1AEE, 0x2255, 0x2616,
2114 0x2442, 0x2A41, 0x2616, 0x1DE1, 0x2442, 0x1DE1, 0x2616, 0x2A41
2116 0x6BA, 0x7D7, 0x96C, 0xE7A, 0x2500, 0x1E7D, 0x26DE, 0x2B1E,
2117 0x7D7, 0xAA9, 0xBE5, 0x17B0, 0x2B1E, 0x2388, 0x2D4B, 0x3240,
2118 0x96C, 0xBE5, 0x1718, 0x2007, 0x26DE, 0x2007, 0x28D4, 0x2D4B,
2119 0xE7A, 0x17B0, 0x2007, 0x1920, 0x1E7D, 0x1920, 0x2007, 0x2388,
2120 0x2500, 0x2B1E, 0x26DE, 0x1E7D, 0x2500, 0x1E7D, 0x26DE, 0x2B1E,
2121 0x1E7D, 0x2388, 0x2007, 0x1920, 0x1E7D, 0x1920, 0x2007, 0x2388,
2122 0x26DE, 0x2D4B, 0x28D4, 0x2007, 0x26DE, 0x2007, 0x28D4, 0x2D4B,
2123 0x2B1E, 0x3240, 0x2D4B, 0x2388, 0x2B1E, 0x2388, 0x2D4B, 0x3240
2127 const BINK2_QUANT_INTER: &[[i32; 64]; 4] = &[
2129 0x400, 0x4A9, 0x434, 0x34C, 0x41C, 0x392, 0x4C9, 0x5D4,
2130 0x4A9, 0x56F, 0x4E6, 0x3D7, 0x4CB, 0x429, 0x5B7, 0x718,
2131 0x434, 0x4E6, 0x489, 0x3A8, 0x4AB, 0x40A, 0x5A4, 0x6CD,
2132 0x34C, 0x3D7, 0x3A8, 0x32B, 0x41F, 0x39F, 0x519, 0x630,
2133 0x41C, 0x4CB, 0x4AB, 0x41F, 0x5AB, 0x538, 0x778, 0x932,
2134 0x392, 0x429, 0x40A, 0x39F, 0x538, 0x521, 0x799, 0x9B6,
2135 0x4C9, 0x5B7, 0x5A4, 0x519, 0x778, 0x799, 0xBE4, 0xFC7,
2136 0x5D4, 0x718, 0x6CD, 0x630, 0x932, 0x9B6, 0xFC7, 0x162F
2138 0x4C2, 0x58B, 0x4FF, 0x3EB, 0x4E4, 0x43F, 0x5B1, 0x6EE,
2139 0x58B, 0x676, 0x5D3, 0x491, 0x5B3, 0x4F3, 0x6CB, 0x86F,
2140 0x4FF, 0x5D3, 0x565, 0x459, 0x58D, 0x4CE, 0x6B5, 0x816,
2141 0x3EB, 0x491, 0x459, 0x3C5, 0x4E6, 0x44F, 0x610, 0x75C,
2142 0x4E4, 0x5B3, 0x58D, 0x4E6, 0x6BD, 0x635, 0x8E2, 0xAEF,
2143 0x43F, 0x4F3, 0x4CE, 0x44F, 0x635, 0x61A, 0x909, 0xB8C,
2144 0x5B1, 0x6CB, 0x6B5, 0x610, 0x8E2, 0x909, 0xE24, 0x12C3,
2145 0x6EE, 0x86F, 0x816, 0x75C, 0xAEF, 0xB8C, 0x12C3, 0x1A61
2147 0x5A8, 0x698, 0x5F1, 0x4A9, 0x5D0, 0x50D, 0x6C4, 0x83E,
2148 0x698, 0x7AF, 0x6ED, 0x56F, 0x6C7, 0x5E3, 0x814, 0xA08,
2149 0x5F1, 0x6ED, 0x66A, 0x52B, 0x69A, 0x5B6, 0x7FA, 0x99E,
2150 0x4A9, 0x56F, 0x52B, 0x47B, 0x5D4, 0x51F, 0x735, 0x8C1,
2151 0x5D0, 0x6C7, 0x69A, 0x5D4, 0x804, 0x761, 0xA90, 0xD00,
2152 0x50D, 0x5E3, 0x5B6, 0x51F, 0x761, 0x741, 0xABF, 0xDBB,
2153 0x6C4, 0x814, 0x7FA, 0x735, 0xA90, 0xABF, 0x10D2, 0x1650,
2154 0x83E, 0xA08, 0x99E, 0x8C1, 0xD00, 0xDBB, 0x1650, 0x1F5F
2156 0x6BA, 0x7D7, 0x711, 0x58B, 0x6EA, 0x601, 0x80C, 0x9CD,
2157 0x7D7, 0x923, 0x83C, 0x676, 0x80F, 0x700, 0x99C, 0xBEE,
2158 0x711, 0x83C, 0x7A1, 0x626, 0x7DA, 0x6CB, 0x97C, 0xB70,
2159 0x58B, 0x676, 0x626, 0x554, 0x6EE, 0x617, 0x893, 0xA68,
2160 0x6EA, 0x80F, 0x7DA, 0x6EE, 0x988, 0x8C7, 0xC90, 0xF76,
2161 0x601, 0x700, 0x6CB, 0x617, 0x8C7, 0x8A1, 0xCC7, 0x1055,
2162 0x80C, 0x99C, 0x97C, 0x893, 0xC90, 0xCC7, 0x1400, 0x1A89,
2163 0x9CD, 0xBEE, 0xB70, 0xA68, 0xF76, 0x1055, 0x1A89, 0x254E
2167 const BINK2_AC_CODES1: &[u8] = &[
2168 0x01, 0x04, 0x00, 0x08, 0x02, 0x32, 0x0A, 0x12,
2169 0x3A, 0x7A, 0xFA, 0x72, 0x06, 0x1A
2171 const BINK2_AC_BITS1: &[u8] = &[ 1, 3, 4, 4, 5, 7, 5, 6, 7, 8, 8, 7, 3, 6 ];
2172 const BINK2_AC_CODES2: &[u16] = &[
2173 0x01, 0x00, 0x04, 0x2C, 0x6C, 0x0C, 0x4C, 0xAC,
2174 0xEC, 0x12C, 0x16C, 0x1AC, 0x02, 0x1C
2176 const BINK2_AC_BITS2: &[u8] = &[ 1, 3, 4, 9, 9, 7, 7, 9, 8, 9, 9, 9, 2, 5 ];
2178 const BINK2_AC_RUNS: [usize; 14] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 64, 0 ];
2180 const BINK2_MV_CODES: &[u8] = &[
2181 0x01, 0x06, 0x0C, 0x1C, 0x18, 0x38, 0x58, 0x78,
2182 0x68, 0x48, 0x28, 0x08, 0x14, 0x04, 0x02, 0x00
2184 const BINK2_MV_BITS: &[u8] = &[
2185 1, 3, 5, 5, 7, 7, 7, 7,
2186 7, 7, 7, 7, 5, 5, 3, 4
2188 const BINK2_MV_ESC: i8 = 42;
2189 const BINK2_MV_SYMS: &[i8] = &[
2190 0, 1, 2, 3, 4, 5, 6, 7,
2191 -7, -6, -5, -4, -3, -2, -1, BINK2_MV_ESC
2194 const BINK2_AC_VAL_CODES1: &[u16] = &[
2195 0x004, 0x01, 0x002, 0x00, 0x08, 0x18, 0xF8, 0x178,
2196 0x138, 0x38, 0x1B8, 0x78, 0xB8
2198 const BINK2_AC_VAL_BITS1: &[u8] = &[ 3, 1, 2, 4, 5, 6, 8, 9, 9, 9, 9, 9, 9 ];
2199 const BINK2_AC_VAL_CODES2: &[u16] = &[
2200 0x0A, 0x001, 0x004, 0x08, 0x06, 0x00, 0x02, 0x1A,
2201 0x2A, 0x16A, 0x1EA, 0x6A, 0xEA
2203 const BINK2_AC_VAL_BITS2: &[u8] = &[ 6, 1, 3, 4, 3, 4, 4, 5, 7, 9, 9, 9, 9 ];
2204 const BINK2_AC_SKIP_CODES1: &[u16] = &[
2205 0x00, 0x001, 0x0D, 0x15, 0x45, 0x85, 0xA5, 0x165,
2206 0x65, 0x1E5, 0xE5, 0x25, 0x03, 0x05
2208 const BINK2_AC_SKIP_BITS1: &[u8] = &[ 1, 3, 4, 5, 7, 8, 8, 9, 9, 9, 9, 8, 2, 8 ];
2209 const BINK2_AC_SKIP_CODES2: &[u16] = &[
2210 0x00, 0x01, 0x003, 0x07, 0x1F, 0x1B, 0x0F, 0x2F,
2211 0x5B, 0xDB, 0x1DB, 0x3B, 0x05, 0x0B
2213 const BINK2_AC_SKIP_BITS2: &[u8] = &[ 1, 3, 4, 4, 5, 7, 6, 6, 8, 9, 9, 6, 3, 5 ];
2214 const BINK2_QUANT_CODES: &[u8] = &[
2215 0x01, 0x02, 0x04, 0x08, 0x10, 0x30, 0x50, 0x70,
2216 0x00, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xE0
2218 const BINK2_QUANT_BITS: &[u8] = &[ 1, 2, 3, 4, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8 ];
2220 const BINK2_OLD_QUANTS: [f32; 16] = [
2221 1.0, 2.0, 2.5, 3.0, 3.5, 4.0, 6.0, 7.0, 8.0, 12.0, 16.0, 24.0, 32.0, 48.0, 64.0, 128.0
2223 const BINK2_OLD_DC_QUANTS: [i32; 16] = [
2224 4, 4, 4, 4, 4, 6, 7, 8, 10, 12, 16, 24, 32, 48, 64, 128
2226 const BINK2_DC_EXTRA_BITS: [u8; 16] = [ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6 ];
2227 const BINK2_QMAT_INTRA_LUMA_OLD: &[f32; 64] = &[
2228 0.125, 0.208056, 0.22864901, 0.205778, 0.22499999, 0.235708, 0.33148301, 0.248309,
2229 0.190718, 0.288582, 0.29449099, 0.34658501, 0.38143599, 0.47678301, 0.600528, 0.44008601,
2230 0.16332, 0.31714499, 0.34142101, 0.42249799, 0.604285, 0.70576, 0.68942899, 0.42807001,
2231 0.235175, 0.38735899, 0.46090701, 0.50122303, 0.82311302, 0.73910397, 0.69206202, 0.39741901,
2232 0.30000001, 0.45078799, 0.65328097, 0.74962097, 0.85000002, 0.79551601, 0.69678998, 0.38625899,
2233 0.392847, 0.79009801, 0.73142397, 1.004719, 1.070509, 0.80251199, 0.64313799, 0.27096599,
2234 0.34501299, 0.56299502, 0.60987997, 0.636379, 0.69678998, 0.60061598, 0.43934, 0.19224399,
2235 0.210373, 0.26309499, 0.252336, 0.25142801, 0.265553, 0.24928901, 0.188511, 0.094199002
2237 const BINK2_QMAT_CHROMA_OLD: &[f32; 64] = &[
2238 0.125, 0.17338, 0.217761, 0.383793, 0.6875, 0.54016501, 0.37207201, 0.18968099,
2239 0.17338, 0.28056601, 0.32721299, 0.74753499, 0.95358998, 0.74923098, 0.51607901, 0.26309499,
2240 0.217761, 0.32721299, 0.66387498, 1.056244, 0.89826202, 0.70576, 0.48613599, 0.24783,
2241 0.383793, 0.74753499, 1.056244, 0.95059502, 0.80841398, 0.635167, 0.437511, 0.223041,
2242 0.6875, 0.95358998, 0.89826202, 0.80841398, 0.6875, 0.54016501, 0.37207201, 0.18968099,
2243 0.54016501, 0.74923098, 0.70576, 0.635167, 0.54016501, 0.42440501, 0.292335, 0.149031,
2244 0.37207201, 0.51607901, 0.48613599, 0.437511, 0.37207201, 0.292335, 0.201364, 0.102655,
2245 0.18968099, 0.26309499, 0.24783, 0.223041, 0.18968099, 0.149031, 0.102655, 0.052333001
2247 const BINK2_QMAT_INTER_LUMA_OLD: &[f32; 64] = &[
2248 0.125, 0.17338, 0.16332, 0.146984, 0.128475, 0.106393, 0.077045999, 0.043109,
2249 0.17338, 0.240485, 0.226532, 0.20387299, 0.17820001, 0.147571, 0.109474, 0.062454,
2250 0.16332, 0.226532, 0.219321, 0.202722, 0.181465, 0.149711, 0.112943, 0.062583998,
2251 0.146984, 0.20387299, 0.202722, 0.201647, 0.183731, 0.15397599, 0.11711, 0.065334998,
2252 0.128475, 0.17820001, 0.181465, 0.183731, 0.17708801, 0.155499, 0.120267, 0.068016,
2253 0.106393, 0.147571, 0.149711, 0.15397599, 0.155499, 0.14575601, 0.116636, 0.068494998,
2254 0.077045999, 0.109474, 0.112943, 0.11711, 0.120267, 0.116636, 0.098646, 0.060141001,
2255 0.043109, 0.062454, 0.062583998, 0.065334998, 0.068016, 0.068494998, 0.060141001, 0.038853001