]> git.nihav.org Git - nihav.git/blob - nihav-rad/src/codecs/bink2.rs
avimux: do not record palette change chunks in OpenDML index
[nihav.git] / nihav-rad / src / codecs / bink2.rs
1 use std::mem;
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};
8
9 macro_rules! mktag {
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)
12 });
13 ($arr:expr) => ({
14 (($arr[0] as u32) << 24) | (($arr[1] as u32) << 16) | (($arr[2] as u32) << 8) | ($arr[3] as u32)
15 });
16 }
17
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);
24 }
25
26 macro_rules! idct {
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;
45
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;
54 };
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];
64 let t08 = t02 + t00;
65 let t09 = t02 - t00;
66 let t10 = t03 + t01;
67 let t11 = t03 - t01;
68 let t12 = t06 + t04;
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;
72 let t16 = t13 - t15;
73 let t17 = t07 * 1.0823922 - t14 + t16;
74
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;
83 };
84 }
85
86 #[allow(clippy::erasing_op)]
87 fn bink2_idct(coeffs: &mut [i32; 64]) {
88 let mut tmp: [i32; 64] = [0; 64];
89 for i in 0..8 {
90 idct!(coeffs, 1, 8 * i, tmp, 8, i, 0, 0);
91 }
92 for i in 0..8 {
93 idct!(tmp, 1, 8 * i, coeffs, 1, 8 * i, 0, 6);
94 }
95 }
96
97 #[allow(clippy::erasing_op)]
98 fn bink2_idct_old(coeffs: &mut [f32; 64]) {
99 let mut tmp: [f32; 64] = [0.0; 64];
100 coeffs[0] += 512.5;
101 for i in 0..8 {
102 idct!(float; coeffs, 8, i, tmp, 8, i, 0, 0);
103 }
104 for i in 0..8 {
105 idct!(float; tmp, 1, 8 * i, coeffs, 1, 8 * i, 0, 6);
106 }
107 }
108
109 struct Bink2DSP { }
110
111 fn clip8(val: i32) -> u8 {
112 val.min(255).max(0) as u8
113 }
114
115 macro_rules! el {
116 ($src: expr, $off: expr) => (
117 $src[$off] as i32
118 );
119 }
120
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
127 });
128 }
129
130 macro_rules! chroma_interp {
131 ($dst: expr, $dstride: expr, $h: expr, $ty: tt, $src: expr, $sstride: expr, $step: expr, $mode: expr, $shift: expr) => {
132 let mut soff = 0;
133 for out in $dst.chunks_mut($dstride).take($h) {
134 for i in 0..8 {
135 let e0 = el!($src, soff + i);
136 let e1 = el!($src, soff + i + $step);
137 out[i] = match $mode {
138 0 => e0,
139 1 => (e0 * 3 + e1 + $shift) >> $shift,
140 2 => (e0 * 2 + e1 * 2 + $shift) >> $shift,
141 _ => (e0 + e1 * 3 + $shift) >> $shift,
142 } as $ty;
143 }
144 soff += $sstride;
145 }
146 };
147 }
148
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)));
152 }
153
154 #[allow(clippy::erasing_op)]
155 impl Bink2DSP {
156 #[allow(clippy::identity_op)]
157 fn calc_dc(src: &[u8], stride: usize) -> i32 {
158 let mut sums = [0u16; 8];
159 for i in 0..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));
169 }
170 let mut sum = 0;
171 for e in sums.iter() {
172 sum += e;
173 }
174 sum as i32
175 }
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]);
181 {
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()) {
185 *dst = clip8(c);
186 }
187 for (dst, &c) in row[8..16].iter_mut().zip(b1.iter()) {
188 *dst = clip8(c);
189 }
190 }
191 }
192 off += stride * 8;
193 {
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()) {
197 *dst = clip8(c);
198 }
199 for (dst, &c) in row[8..16].iter_mut().zip(b3.iter()) {
200 *dst = clip8(c);
201 }
202 }
203 }
204 }
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]);
210 {
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);
215 }
216 for (dst, &add) in row[8..16].iter_mut().zip(b1.iter()) {
217 *dst = clip8(i32::from(*dst) + add);
218 }
219 }
220 }
221 off += stride * 8;
222 {
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);
227 }
228 for (dst, &add) in row[8..16].iter_mut().zip(b3.iter()) {
229 *dst = clip8(i32::from(*dst) + add);
230 }
231 }
232 }
233 }
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]);
239 {
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);
244 }
245 for (dst, &c) in row[8..16].iter_mut().zip(b1.iter()) {
246 *dst = clip8((c as i32) - 512);
247 }
248 }
249 }
250 off += stride * 8;
251 {
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);
256 }
257 for (dst, &c) in row[8..16].iter_mut().zip(b3.iter()) {
258 *dst = clip8((c as i32) - 512);
259 }
260 }
261 }
262 }
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]);
268 {
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);
273 }
274 for (dst, &add) in row[8..16].iter_mut().zip(b1.iter()) {
275 *dst = clip8(i32::from(*dst) + (add as i32) - 512);
276 }
277 }
278 }
279 off += stride * 8;
280 {
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);
285 }
286 for (dst, &add) in row[8..16].iter_mut().zip(b3.iter()) {
287 *dst = clip8(i32::from(*dst) + (add as i32) - 512);
288 }
289 }
290 }
291 }
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) };
298
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();
308
309 let dst = &mut dst[xoff + (yoff & 31) * stride..];
310
311 match mode {
312 0 => {
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]);
316 }
317 },
318 1 => {
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));
322 }
323 poff += pstride;
324 }
325 },
326 2 => {
327 for out in dst.chunks_mut(stride).take(16) {
328 for i in 0..16 {
329 out[i] = clip8(luma_filter!(ppix, poff + i, pstride));
330 }
331 poff += pstride;
332 }
333 },
334 3 => {
335 let mut tmp = [0i16; 21 * 16];
336 for out in tmp.chunks_mut(16) {
337 for i in 0..16 {
338 out[i] = luma_filter!(ppix, poff - 2 * pstride + i, 1) as i16;
339 }
340 poff += pstride;
341 }
342 for (row, out) in dst.chunks_mut(stride).take(16).enumerate() {
343 for i in 0..16 {
344 out[i] = clip8(luma_filter!(tmp, (row + 2) * 16 + i, 16));
345 }
346 }
347 },
348 _ => unreachable!(),
349 };
350 Ok(())
351 }
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);
355 let mx = mv.x & 3;
356 let my = mv.y & 3;
357 let add_x = if mx != 0 { 1 } else { 0 };
358 let add_y = if my != 0 { 1 } else { 0 };
359
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();
369
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]);
375 }
376 } else if my == 0 {
377 chroma_interp!(dst, stride, 8, u8, &ppix[poff..], pstride, 1, mx, 2);
378 } else if mx == 0 {
379 chroma_interp!(dst, stride, 8, u8, &ppix[poff..], pstride, pstride, my, 2);
380 } else {
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);
384 }
385 Ok(())
386 }
387 }
388
389 #[allow(clippy::collapsible_else_if)]
390 fn mid_pred<T:PartialOrd>(a: T, b: T, c: T) -> T {
391 if a < b {
392 if b < c {
393 b
394 } else {
395 if a < c { c } else { a }
396 }
397 } else {
398 if b < c {
399 if a < c { a } else { c }
400 } else {
401 b
402 }
403 }
404 }
405
406 #[derive(Default)]
407 struct QuantInfo {
408 quants: Vec<u8>,
409 qstride: usize,
410 qpos: usize,
411 pqpos: usize,
412 }
413
414 impl QuantInfo {
415 fn resize(&mut self, bw: usize) {
416 self.qstride = bw * 2;
417 self.quants.resize(self.qstride * 2, 0);
418 self.qpos = 0;
419 self.pqpos = self.qstride;
420 }
421 fn update_line(&mut self) {
422 mem::swap(&mut self.qpos, &mut self.pqpos);
423 }
424 fn pred_quant(&self, pos: usize, is_top: bool) -> u8 {
425 let is_left = pos < 2;
426 if is_top {
427 if is_left { 16 } else { self.quants[self.qpos + pos - 2] }
428 } else if is_left {
429 self.quants[self.pqpos + pos]
430 } else {
431 mid_pred(self.quants[self.pqpos + pos - 2],
432 self.quants[self.pqpos + pos],
433 self.quants[self.qpos + pos - 2])
434 }
435 }
436 fn set_quant(&mut self, pos: usize, q: u8) {
437 self.quants[self.qpos + pos] = q;
438 }
439 }
440
441 #[derive(Default)]
442 struct YDCInfo {
443 dcs: [i32; 16],
444 dc_buf: [i32; 16],
445 prev_dcs: Vec<i32>,
446 new_dcs: Vec<i32>,
447 stride: usize,
448 prev_off: usize,
449 }
450
451 impl YDCInfo {
452 fn resize(&mut self, bw: usize) {
453 self.stride = bw * 4 + 4;
454 self.prev_off = 4;
455 self.prev_dcs.resize(self.stride, 0);
456 self.new_dcs.resize(self.stride, 0);
457 }
458 fn update_line(&mut self) {
459 mem::swap(&mut self.prev_dcs, &mut self.new_dcs);
460 }
461 fn set_dcs(&mut self, bx: usize, dc5: i32, dc7: i32, dc13: i32, dc10: i32, dc11: i32, dc14: i32, dc15: i32) {
462 self.dcs[ 5] = dc5;
463 self.dcs[ 7] = dc7;
464 self.dcs[13] = dc13;
465 self.dcs[15] = dc15;
466 let new_dc = &mut self.new_dcs[bx * 4 + 4..];
467 new_dc[0] = dc10;
468 new_dc[1] = dc11;
469 new_dc[2] = dc14;
470 new_dc[3] = dc15;
471 }
472 }
473
474 #[derive(Default)]
475 struct CDCInfo {
476 dcs: [i32; 4],
477 dc_buf: [i32; 4],
478 prev_dcs: Vec<i32>,
479 new_dcs: Vec<i32>,
480 stride: usize,
481 prev_off: usize,
482 }
483
484 impl CDCInfo {
485 fn resize(&mut self, bw: usize) {
486 self.stride = bw * 2 + 2;
487 self.prev_off = 2;
488 self.prev_dcs.resize(self.stride, 0);
489 self.new_dcs.resize(self.stride, 0);
490 }
491 fn update_line(&mut self) {
492 mem::swap(&mut self.prev_dcs, &mut self.new_dcs);
493 }
494 fn set_dcs(&mut self, bx: usize, dc1: i32, dc2: i32, dc3: i32) {
495 self.dcs[1] = dc1;
496 self.dcs[2] = dc2;
497 self.dcs[3] = dc3;
498 let new_dc = &mut self.new_dcs[bx * 2 + 2..];
499 new_dc[0] = dc2;
500 new_dc[1] = dc3;
501 }
502 }
503
504 trait DCInfo {
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);
508 }
509
510 fn dc_pred2(a: i32, b: i32) -> i32 {
511 (a.max(b)).min(a.min(b).max(a * 2 - b))
512 }
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))
515 }
516
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)
521 }
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;
531 if is_left {
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);
538
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);
543
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);
548
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);
553 } else {
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);
558
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);
563
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);
568
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);
573 }
574 } else {
575 if is_top {
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);
580
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);
585
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);
590
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);
595 } else {
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);
600
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);
605
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);
610
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);
615 }
616 }
617 dst[ 0] = a0;
618 dst[ 1] = a1;
619 dst[ 2] = a2;
620 dst[ 3] = a3;
621 dst[ 4] = a4;
622 dst[ 5] = a5;
623 dst[ 6] = a6;
624 dst[ 7] = a7;
625 dst[ 8] = a8;
626 dst[ 9] = a9;
627 dst[10] = aA;
628 dst[11] = aB;
629 dst[12] = aC;
630 dst[13] = aD;
631 dst[14] = aE;
632 dst[15] = aF;
633 let new_dc = &mut self.new_dcs[bx * 4 + 4..];
634 new_dc[0] = aA;
635 new_dc[1] = aB;
636 new_dc[2] = aE;
637 new_dc[3] = aF;
638 }
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);
647
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);
652
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);
657
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);
662
663 dst[ 0] = a0;
664 dst[ 1] = a1;
665 dst[ 2] = a2;
666 dst[ 3] = a3;
667 dst[ 4] = a4;
668 dst[ 5] = a5;
669 dst[ 6] = a6;
670 dst[ 7] = a7;
671 dst[ 8] = a8;
672 dst[ 9] = a9;
673 dst[10] = aA;
674 dst[11] = aB;
675 dst[12] = aC;
676 dst[13] = aD;
677 dst[14] = aE;
678 dst[15] = aF;
679 }
680 }
681
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)
685 }
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;
690
691 let a0; let a1; let a2; let a3;
692 if is_left {
693 if is_top {
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);
697 } else {
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);
700 }
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);
703 } else {
704 if is_top {
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);
707 } else {
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);
710 }
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);
713 }
714 dst[0] = a0;
715 dst[1] = a1;
716 dst[2] = a2;
717 dst[3] = a3;
718 let new_dc = &mut self.new_dcs[bx * 2 + 2..];
719 new_dc[0] = a2;
720 new_dc[1] = a3;
721 }
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;
726
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);
731
732 dst[0] = a0;
733 dst[1] = a1;
734 dst[2] = a2;
735 dst[3] = a3;
736 }
737 }
738
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() {
742 *dc = 0;
743 }
744 Ok(false)
745 } else {
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()?;
749 if *dc != 0 {
750 *dc = (*dc * quant + 0x1FF) >> 10;
751 if br.read_bool()? {
752 *dc = -*dc;
753 }
754 }
755 }
756 Ok(true)
757 }
758 }
759 #[derive(Default)]
760 struct MVInfo {
761 mvs: Vec<MV>,
762 stride: usize,
763 mv_off: usize,
764 prev_off: usize,
765 }
766
767 #[allow(clippy::collapsible_else_if)]
768 #[allow(clippy::identity_op)]
769 impl MVInfo {
770 fn resize(&mut self, bw: usize) {
771 self.stride = bw * 4;
772 self.mv_off = 0;
773 self.prev_off = self.stride;
774 self.mvs.resize(self.stride * 2, ZERO_MV);
775 }
776 fn update_line(&mut self) {
777 mem::swap(&mut self.mv_off, &mut self.prev_off);
778 }
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;
784
785 for comp in 0..2 {
786 for i in 0..num_mv {
787 let val;
788 let raw_val = br.read_cb(mv_cb)?;
789 if raw_val != BINK2_MV_ESC {
790 val = raw_val as i16;
791 } else {
792 let len = br.read_code(UintCodeType::LimitedUnary(12, 1))? as u8;
793 let nlen = len + 4;
794 let uval = (br.read(nlen)? as i32) + (1 << nlen) - 1;
795 if (uval & 1) != 0 {
796 val = (-(uval >> 1) - 1) as i16;
797 } else {
798 val = (uval >> 1) as i16;
799 }
800 }
801 if comp == 0 {
802 mv[mv_pos + i].x = val;
803 } else {
804 mv[mv_pos + i].y = val;
805 }
806 }
807 }
808
809 if num_mv > 1 {
810 if is_top {
811 if !is_left {
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;
820 } else {
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;
827 }
828 } else {
829 if is_left {
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;
838 } else {
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;
847 }
848 }
849 } else {
850 let mut mv_pred = mv[mv_pos + 0];
851 if is_top {
852 if !is_left {
853 mv_pred += MV::pred(mv[mv_pos - 4], mv[mv_pos - 3], mv[mv_pos - 1]);
854 }
855 } else {
856 if !is_left {
857 mv_pred += MV::pred(mv[ref_pos - 1], mv[ref_pos + 2], mv[mv_pos - 3]);
858 } else {
859 mv_pred += MV::pred(mv[ref_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
860 }
861 }
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;
866 }
867 Ok(())
868 }
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;
873
874 let mut basex = 0;
875 let mut basey = 0;
876 for comp in 0..2 {
877 let mut bits = br.read(3)? as u8;
878 if bits == 7 {
879 bits += br.read(2)? as u8;
880 }
881 let mut mv_c: [i16; 4] = [0; 4];
882 if bits > 0 {
883 for mv in mv_c.iter_mut() {
884 *mv = br.read(bits)? as i16;
885 }
886 for mv in mv_c.iter_mut() {
887 if (*mv != 0) && br.read_bool()? {
888 *mv = -*mv;
889 }
890 }
891 }
892 if is_top && is_left {
893 let mut val = br.read(5)? as i16;
894 if (val != 0) && br.read_bool()? {
895 val = -val;
896 }
897 if comp == 0 {
898 basex = val;
899 } else {
900 basey = val;
901 }
902 }
903 if comp == 0 {
904 for i in 0..4 {
905 mv[mv_pos + i].x = mv_c[i];
906 }
907 } else {
908 for i in 0..4 {
909 mv[mv_pos + i].y = mv_c[i];
910 }
911 }
912 }
913 if !is_top {
914 if is_left {
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;
923 } else {
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;
932 }
933 } else {
934 if is_left {
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;
940 } else {
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;
949 }
950 }
951 Ok(())
952 }
953
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;
958
959 if is_top {
960 if is_left {
961 for i in 0..4 {
962 mv[mv_pos + i] = ZERO_MV;
963 }
964 } else {
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]);
969 }
970 } else {
971 if is_left {
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]);
976 } else {
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]);
979 if is_new {
980 mv[mv_pos + 2] = MV::pred(mv[mv_pos - 3], mv[mv_pos - 1], mv[mv_pos + 0]);
981 } else {
982 mv[mv_pos + 2] = MV::pred(mv[ref_pos + 2], mv[mv_pos + 1], mv[mv_pos + 0]);
983 }
984 mv[mv_pos + 3] = MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
985 }
986 }
987 }
988
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;
996 }
997 }
998
999 struct Bink2Codes {
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>,
1008 }
1009
1010 fn map_ac(idx: usize) -> u8 { idx as u8 }
1011
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 }
1031 }
1032 }
1033
1034 #[derive(Default)]
1035 struct Bink2Decoder {
1036 info: NACodecInfoRef,
1037 ips: IPShuffler,
1038
1039 version: u32,
1040 has_alpha: bool,
1041 slice_h: [usize; 8],
1042 num_slices: usize,
1043
1044 key_frame: bool,
1045 cur_w: usize,
1046 cur_h: usize,
1047 qinfo: QuantInfo,
1048 y_dcs: YDCInfo,
1049 u_dcs: CDCInfo,
1050 v_dcs: CDCInfo,
1051 a_dcs: YDCInfo,
1052 mvs: MVInfo,
1053
1054 codes: Bink2Codes,
1055 }
1056
1057 #[allow(clippy::erasing_op)]
1058 impl Bink2Decoder {
1059 fn new() -> Self {
1060 Self::default()
1061 }
1062
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;
1077
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)?;
1082 }
1083 let mut do_alpha = self.has_alpha;
1084 if (frame_flags & 0x80000) != 0 && self.has_alpha {
1085 do_alpha = false;
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() {
1089 *el = fillval;
1090 }
1091 }
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)?;
1098 }
1099 if (frame_flags & 0x4000) == 0 {
1100 let len = (width + 15) >> 4;
1101 decode_flags(br, &mut col_flags, 1, len * 2 - 1)?;
1102 }
1103 }
1104 row_flags.resize(bheight * 4, false);
1105 col_flags.resize(bw * 4, false);
1106 //store frame_flags * 8 & 0x7F8
1107
1108 let mut start_by = 0;
1109 for slice_no in 0..self.num_slices {
1110 let end_by = self.slice_h[slice_no];
1111 if slice_no != 0 {
1112 br.seek(offsets[slice_no - 1] * 8)?;
1113 }
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;
1118
1119 let mut row_state = frame_flags & 0x2E000;
1120 if is_intra {
1121 row_state |= 0x10000;
1122 }
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 {
1130 let mut cbp_y = 0;
1131 let mut cbp_u = 0;
1132 let mut cbp_v = 0;
1133 let mut cbp_a = 0;
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;
1138 let mut q_y = 8;
1139 let mut q_u = 8;
1140 let mut q_v = 8;
1141 let mut q_a = 8;
1142 let mut q_y_p = 8;
1143 let mut q_u_p = 8;
1144 let mut q_v_p = 8;
1145 let mut q_a_p = 8;
1146 let rflags = (row_flags[by] as u32) * 4;
1147 row_state = (row_state & 0x3FFFFFF) | ((row_state >> 4) & 0xC000000) | (rflags << 28);
1148 if by == start_by {
1149 row_state |= 0x80;
1150 // } else {
1151 // row_state |= 0x8;
1152 }
1153 if by + 2 >= end_by {
1154 row_state |= 0x100;
1155 }
1156
1157 let mut btype_lru: [u8; 4] = [ 2, 3, 1, 0 ];
1158 let mut edge_state = 0;
1159 let is_top = by == start_by;
1160 for bx in 0..bw {
1161 let mut blk_state = row_state | (edge_state & 0x3FC0000);
1162 if bx == 0 {
1163 blk_state |= 0x20;
1164 }
1165 if bx + 2 < bw {
1166 blk_state |= 0x40;
1167 }
1168 if (bx & 1) != 0 {
1169 blk_state |= 0x200;
1170 }
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;
1175
1176 //let is_top = (edge_state & 0x88) != 0;
1177 let is_left = bx == 0; //(edge_state & 0x20) != 0;
1178
1179 let btype;
1180 if is_intra {
1181 btype = 0;
1182 } else if (blk_state & 0x2000) != 0 {
1183 let val = br.read_code(UintCodeType::LimitedUnary(3, 1))?;
1184 match val {
1185 0 => {
1186 btype = btype_lru[0];
1187 },
1188 1 => {
1189 btype = btype_lru[1];
1190 btype_lru[1] = btype_lru[0];
1191 btype_lru[0] = btype;
1192 },
1193 2 => {
1194 btype = btype_lru[3];
1195 btype_lru[3] = btype_lru[2];
1196 btype_lru[2] = btype;
1197 },
1198 3 => {
1199 btype = btype_lru[2];
1200 btype_lru[2] = btype_lru[1];
1201 btype_lru[1] = btype;
1202 },
1203 _ => unreachable!(),
1204 };
1205 } else {
1206 btype = br.read(2)? as u8;
1207 }
1208 if !is_intra {
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);
1213 }
1214 match btype {
1215 0 => { // intra
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)?;
1225 if do_alpha {
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]);
1232 }
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);
1240 } else {
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)?;
1247 if do_alpha {
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]);
1254 }
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);
1261 }
1262 if !is_intra {
1263 self.mvs.predict_mvs(bx, is_top, is_left, (frame_flags & 0x2000) != 0);
1264 }
1265 },
1266 1 => { // skip
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)?;
1274 if do_alpha {
1275 Bink2DSP::mc_luma(&mut dst[off_a..], stride_a, ref_pic, xoff, yoff, ZERO_MV, 3)?;
1276 }
1277 }
1278 } else {
1279 return Err(DecoderError::MissingReference);
1280 }
1281 self.mvs.zero(bx);
1282 },
1283 2 => { // motion
1284 if (frame_flags & 0x2000) != 0 {
1285 self.mvs.decode_mv_new(br, &self.codes.mv_cb, bx, is_top, is_left)?;
1286 } else {
1287 self.mvs.decode_mv_old(br, bx, is_top, is_left)?;
1288 }
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)?;
1297 if do_alpha {
1298 Bink2DSP::mc_luma(&mut dst[off_a..], stride_a, ref_pic, xoff, yoff, mv, 3)?;
1299 }
1300 }
1301 } else {
1302 return Err(DecoderError::MissingReference);
1303 }
1304 },
1305 3 => { // inter
1306 if (frame_flags & 0x2000) != 0 {
1307 self.mvs.decode_mv_new(br, &self.codes.mv_cb, bx, is_top, is_left)?;
1308 } else {
1309 self.mvs.decode_mv_old(br, bx, is_top, is_left)?;
1310 }
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)?;
1319 if do_alpha {
1320 Bink2DSP::mc_luma(&mut dst[off_a..], stride_a, ref_pic, xoff, yoff, mv, 3)?;
1321 }
1322 }
1323 } else {
1324 return Err(DecoderError::MissingReference);
1325 }
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)?;
1336 } else {
1337 cbp_v_p = 0;
1338 cbp_u_p = 0;
1339 }
1340 if do_alpha {
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]);
1347 }
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);
1354 } else {
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)?;
1361 if do_alpha {
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]);
1368 }
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);
1375 }
1376 },
1377 _ => unreachable!(),
1378 };
1379 if btype != 0 {
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);
1399 if do_alpha {
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);
1409 }
1410 }
1411 }
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);
1423 }
1424 start_by = self.slice_h[slice_no];
1425 }
1426 Ok(())
1427 }
1428 }
1429
1430 fn decode_flags(br: &mut BitReader, dst: &mut Vec<bool>, start: usize, nbits: usize) -> DecoderResult<()> {
1431 if start > 0 {
1432 dst.push(false);
1433 }
1434 if !br.read_bool()? {
1435 for _ in 0..nbits {
1436 let bit = br.read_bool()?;
1437 dst.push(bit);
1438 }
1439 } else {
1440 let mut cur_bits = nbits;
1441 let mut mode = 0;
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()? };
1446 dst.push(lastbit);
1447 cur_bits -= 1;
1448 let len = cur_bits.min(4);
1449 for _ in 0..len {
1450 let bit = br.read_bool()?;
1451 dst.push(bit);
1452 }
1453 cur_bits -= len;
1454 mode = 2;
1455 } else {
1456 let bread: u8;
1457 if cur_bits < 4 {
1458 bread = 2;
1459 } else if cur_bits < 16 {
1460 bread = 4;
1461 } else {
1462 bread = 4 | 1;
1463 }
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;
1468 run += add_run;
1469 mode = if add_run == (1 << bread) - 1 { 1 } else { 3 };
1470 }
1471 for _ in 0..run {
1472 dst.push(lastbit);
1473 }
1474 cur_bits -= run;
1475 }
1476 }
1477 }
1478 Ok(())
1479 }
1480
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;
1483 if code == 0 {
1484 Ok(prev_q)
1485 } else {
1486 if code == 3 {
1487 code += br.read(1)? as u8;
1488 } else if code == 4 {
1489 code = (br.read(5)? as u8) + 5;
1490 }
1491 let ret = if !br.read_bool()? {
1492 prev_q.checked_add(code)
1493 } else {
1494 prev_q.checked_sub(code)
1495 };
1496 validate!(ret.is_some());
1497 let val = ret.unwrap();
1498 validate!(val < (BINK2_QUANT_DC.len() as u8));
1499 Ok(val)
1500 }
1501 }
1502
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;
1508 for i in 0..4 {
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; }
1511 }
1512 Ok(cbp)
1513 }
1514
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; }
1522 Ok(cbp)
1523 }
1524
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;
1531 for i in 0..4 {
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; }
1534 }
1535 Ok(cbp)
1536 }
1537
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; }
1546 Ok(cbp)
1547 }
1548
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) };
1553
1554 let mut cbp;
1555 if br.read_bool()? {
1556 cbp = 0;
1557 } else if min_count >= 4 {
1558 cbp = br.read(16)?;
1559 } else {
1560 cbp = 0;
1561 for i in 0..4 {
1562 if !br.read_bool()? {
1563 let cbp4 = br.read(4)?;
1564 cbp |= cbp4 << (i * 4);
1565 }
1566 }
1567 }
1568 cbp ^= mask;
1569 if ((edge_state & 0x40000) == 0) || (cbp != 0) {
1570 if br.read_bool()? {
1571 cbp |= cbp << 16;
1572 }
1573 }
1574 Ok(cbp)
1575 }
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])
1579 } else {
1580 let ncbp = br.read(4)?;
1581 if br.read_bool()? {
1582 Ok(ncbp | (ncbp << 16))
1583 } else {
1584 Ok(ncbp)
1585 }
1586 }
1587 }
1588
1589 trait ReadBink2Code {
1590 fn read_bink2_code_zero(&mut self) -> DecoderResult<i32>;
1591 fn read_bink2_code_nz(&mut self) -> DecoderResult<i32>;
1592 }
1593
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;
1597 if pfx < 4 {
1598 Ok(pfx)
1599 } else {
1600 let add_bits = self.read((pfx as u8) - 3)? as i32;
1601 Ok((1 << (pfx - 3)) + add_bits + 2)
1602 }
1603 }
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
1609 } else {
1610 pfx as i32
1611 };
1612 if self.read_bool()? {
1613 Ok(-val)
1614 } else {
1615 Ok(val)
1616 }
1617 }
1618 }
1619
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];
1623 let shift = q >> 2;
1624 for (blk_no, block) in dst.iter_mut().enumerate() {
1625 if ((cbp >> blk_no) & 1) == 0 { continue; }
1626 let mut esc_len = 0;
1627 let mut idx = 1;
1628 while idx < 64 {
1629 if esc_len >= 1 {
1630 esc_len -= 1;
1631 } else {
1632 let sym = br.read_cb(cb)?;
1633 let skip = if sym == 11 {
1634 br.read(6)? as usize
1635 } else {
1636 BINK2_AC_RUNS[sym as usize]
1637 };
1638 idx += skip;
1639 if idx > 63 { break; }
1640 esc_len = if sym == 13 { 6 } else { 0 };
1641 }
1642 let level = br.read_bink2_code_nz()?;
1643 let pos = BINK2_ZIGZAG[idx];
1644 block[pos] = (((level * qmat[pos]) << shift) + 0x40) >> 7;
1645 idx += 1;
1646 }
1647 // set blk info to (dc & 0x1FFF) | (intra ? 0x8000 : 0) | (((ncoded == 0) + (ncoded < 4) + (ncoded < 8)) << 13)
1648 }
1649 Ok(())
1650 }
1651
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)?;
1655 *old_q = 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;
1661 for i in 0..4 {
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; }
1664 }
1665 Ok(cbp)
1666 }
1667
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)?;
1671 *old_q = 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; }
1679 Ok(cbp)
1680 }
1681
1682
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)?;
1686 *old_q = q;
1687 decode_dcs_old(br, &mut dcinfo.dc_buf, q, false)?;
1688 dcinfo.predict_inter(-1023, 1023);
1689 let dcs = &dcinfo.dcs;
1690 for i in 0..4 {
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; }
1693 }
1694 Ok(cbp)
1695 }
1696
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)?;
1700 *old_q = 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; }
1706 Ok(cbp)
1707 }
1708
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)?;
1711 if diff == 0 {
1712 Ok(prev_quant)
1713 } else {
1714 let res = if br.read_bool()? {
1715 prev_quant.checked_sub(diff)
1716 } else {
1717 prev_quant.checked_add(diff)
1718 };
1719 validate!(res.is_some());
1720 let q = res.unwrap();
1721 validate!(q < 16);
1722 Ok(q)
1723 }
1724 }
1725
1726 fn decode_cbp_luma_old(br: &mut BitReader, prev_cbp: u32) -> DecoderResult<u32> {
1727 let low;
1728 if br.read_bool()? {
1729 if br.read_bool()? {
1730 return Ok(prev_cbp);
1731 }
1732 low = prev_cbp & 0xFFFF;
1733 } else {
1734 let mut nib1 = (prev_cbp >> 4) & 0xF;
1735 if !br.read_bool()? {
1736 nib1 = br.read(4)?;
1737 }
1738 let mut new_cbp = nib1;
1739 if !br.read_bool()? {
1740 nib1 = br.read(4)?;
1741 }
1742 new_cbp |= nib1 << 4;
1743 if !br.read_bool()? {
1744 nib1 = br.read(4)?;
1745 }
1746 new_cbp |= nib1 << 8;
1747 if !br.read_bool()? {
1748 nib1 = br.read(4)?;
1749 }
1750 low = new_cbp | (nib1 << 12);
1751 }
1752 let mut nib_hi = (prev_cbp >> 20) & 0xF;
1753 let mut high = 0;
1754 for i in 0..4 {
1755 let nib = (low >> (4 * i)) & 0xF;
1756 if nib.count_ones() == 0 {
1757 nib_hi = 0;
1758 } else if (nib.count_ones() == 1) || !br.read_bool()? {
1759 nib_hi = 0;
1760 for bit in 0..4 {
1761 if (((nib >> bit) & 1) != 0) && br.read_bool()? {
1762 nib_hi |= 1 << bit;
1763 }
1764 }
1765 }
1766 nib_hi &= nib;
1767 high = (high >> 4) | (nib_hi << 28);
1768 }
1769 Ok(low | high)
1770 }
1771
1772 fn decode_cbp_chroma_old(br: &mut BitReader, prev_cbp: u32) -> DecoderResult<u32> {
1773 let low = if !br.read_bool()? {
1774 br.read(4)?
1775 } else {
1776 if br.read_bool()? {
1777 return Ok(prev_cbp);
1778 }
1779 prev_cbp & 0xF
1780 };
1781 let mut high;
1782 if low.count_ones() == 0 {
1783 return Ok(low);
1784 }
1785 if low.count_ones() != 1 {
1786 high = (prev_cbp >> 16) & low;
1787 if br.read_bool()? {
1788 return Ok((high << 16) | low);
1789 }
1790 }
1791 high = 0;
1792 for bit in 0..4 {
1793 if (((low >> bit) & 1) != 0) && br.read_bool()? {
1794 high |= 1 << bit;
1795 }
1796 }
1797 Ok((high << 16) | low)
1798 }
1799
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;
1802 if bits == 7 {
1803 bits += br.read(2)? as u8;
1804 }
1805 let scale = BINK2_OLD_DC_QUANTS[q as usize];
1806 if bits == 0 {
1807 for el in dcs.iter_mut() { *el = 0; }
1808 } else {
1809 for dcb in dcs.chunks_mut(4) {
1810 for dc in dcb.iter_mut() {
1811 *dc = br.read(bits)? as i32;
1812 }
1813 for dc in dcb.iter_mut() {
1814 if *dc == 0 { continue; }
1815 *dc *= scale;
1816 if br.read_bool()? {
1817 *dc = -*dc;
1818 }
1819 }
1820 }
1821 }
1822 if read_bias {
1823 let add_bits = BINK2_DC_EXTRA_BITS[q as usize] + bits;
1824 if add_bits < 10 {
1825 let pfx = br.read(10 - add_bits)? as i32;
1826 let base_dc;
1827 if pfx > 0 {
1828 if br.read_bool()? {
1829 base_dc = -(pfx << bits);
1830 } else {
1831 base_dc = pfx << bits;
1832 }
1833 } else {
1834 base_dc = 0;
1835 }
1836 dcs[0] += base_dc * scale;
1837 }
1838 }
1839 Ok(())
1840 }
1841
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;
1849 let mut idx = 1;
1850 while idx < 64 {
1851 let val = br.read_cb(val_cb)?;
1852 if val != 0 {
1853 let mut level;
1854 if val >= 4 {
1855 let add_bits = br.read(val - 3)? as i32;
1856 level = (1 << (val - 3)) + add_bits + 2;
1857 } else {
1858 level = val as i32;
1859 }
1860 if br.read_bool()? {
1861 level = -level;
1862 }
1863 let pos = scan[idx];
1864 block[pos] = (level as f32) * quant_mat[(pos & 7) * 8 + (pos >> 3)] * quant;
1865 }
1866 idx += 1;
1867 if idx >= 64 { break; }
1868 if esc_len >= 1 {
1869 esc_len -= 1;
1870 } else {
1871 let sym = br.read_cb(skip_cb)?;
1872 let skip = if sym == 11 {
1873 br.read(6)? as usize
1874 } else {
1875 BINK2_AC_RUNS[sym as usize]
1876 };
1877 idx += skip;
1878 if idx > 63 { break; }
1879 esc_len = if sym == 13 { 6 } else { 0 };
1880 }
1881 }
1882 }
1883 Ok(())
1884 }
1885
1886 const KB2H_NUM_SLICES: [usize; 4] = [ 2, 3, 4, 8 ];
1887
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();
1893
1894 let edata = info.get_extradata().unwrap();
1895 validate!(edata.len() >= 8);
1896
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()?;
1901
1902 self.version = magic;
1903 self.has_alpha = (flags & 0x100000) != 0;
1904
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") {
1910 if height_a < 128 {
1911 self.num_slices = 1;
1912 } else {
1913 self.num_slices = 2;
1914 self.slice_h[0] = (h + 31) >> 6;
1915 }
1916 } else {
1917 self.num_slices = KB2H_NUM_SLICES[(flags & 3) as usize];
1918 let mut start = 0;
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;
1922 end -= 32;
1923 self.slice_h[i] = start >> 5;
1924 }
1925 }
1926 self.slice_h[self.num_slices - 1] = height_a >> 5;
1927
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)),
1933 aplane, None,
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();
1938
1939 Ok(())
1940 } else {
1941 Err(DecoderError::InvalidData)
1942 }
1943 }
1944 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
1945 let src = pkt.get_buffer();
1946
1947 let mut br = BitReader::new(&src, BitReaderMode::LE);
1948
1949 let mut buf;
1950 self.key_frame = pkt.is_keyframe();
1951
1952 let bufinfo = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 5)?;
1953 buf = bufinfo.get_vbuf().unwrap();
1954
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());
1958
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 });
1961 Ok(frm.into_ref())
1962 }
1963 fn flush(&mut self) {
1964 self.ips.clear();
1965 }
1966 }
1967
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 }
1972 }
1973
1974 pub fn get_decoder() -> Box<dyn NADecoder + Send> {
1975 Box::new(Bink2Decoder::new())
1976 }
1977
1978 #[cfg(test)]
1979 mod test {
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;
1985 #[test]
1986 fn test_bink2() {
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);
1991
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);
1998 }
1999 }
2000
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
2010 ];
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
2020 ];
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
2030 ];
2031
2032 const BINK2_CHROMA_CBPS: [u32; 16] = [
2033 0x0, 0x0, 0x0, 0xF,
2034 0x0, 0xF, 0xF, 0xF,
2035 0x0, 0xF, 0xF, 0xF,
2036 0xF, 0xF, 0xF, 0xF
2037 ];
2038
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
2045 ];
2046
2047 const BINK2_QUANT_INTRA_LUMA: &[[i32; 64]; 4] = &[
2048 [
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
2057 ], [
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
2066 ], [
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
2075 ], [
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
2084 ]
2085 ];
2086
2087 const BINK2_QUANT_INTRA_CHROMA: &[[i32; 64]; 4] = &[
2088 [
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
2097 ], [
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
2106 ], [
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
2115 ], [
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
2124 ]
2125 ];
2126
2127 const BINK2_QUANT_INTER: &[[i32; 64]; 4] = &[
2128 [
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
2137 ], [
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
2146 ], [
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
2155 ], [
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
2164 ]
2165 ];
2166
2167 const BINK2_AC_CODES1: &[u8] = &[
2168 0x01, 0x04, 0x00, 0x08, 0x02, 0x32, 0x0A, 0x12,
2169 0x3A, 0x7A, 0xFA, 0x72, 0x06, 0x1A
2170 ];
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
2175 ];
2176 const BINK2_AC_BITS2: &[u8] = &[ 1, 3, 4, 9, 9, 7, 7, 9, 8, 9, 9, 9, 2, 5 ];
2177
2178 const BINK2_AC_RUNS: [usize; 14] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 64, 0 ];
2179
2180 const BINK2_MV_CODES: &[u8] = &[
2181 0x01, 0x06, 0x0C, 0x1C, 0x18, 0x38, 0x58, 0x78,
2182 0x68, 0x48, 0x28, 0x08, 0x14, 0x04, 0x02, 0x00
2183 ];
2184 const BINK2_MV_BITS: &[u8] = &[
2185 1, 3, 5, 5, 7, 7, 7, 7,
2186 7, 7, 7, 7, 5, 5, 3, 4
2187 ];
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
2192 ];
2193
2194 const BINK2_AC_VAL_CODES1: &[u16] = &[
2195 0x004, 0x01, 0x002, 0x00, 0x08, 0x18, 0xF8, 0x178,
2196 0x138, 0x38, 0x1B8, 0x78, 0xB8
2197 ];
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
2202 ];
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
2207 ];
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
2212 ];
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
2217 ];
2218 const BINK2_QUANT_BITS: &[u8] = &[ 1, 2, 3, 4, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8 ];
2219
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
2222 ];
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
2225 ];
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
2236 ];
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
2246 ];
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
2256 ];