]> git.nihav.org Git - nihav.git/blame - nihav-rad/src/codecs/bink2.rs
avimux: do not record palette change chunks in OpenDML index
[nihav.git] / nihav-rad / src / codecs / bink2.rs
CommitLineData
232deab9 1use std::mem;
606c448e 2use nihav_core::codecs::*;
232deab9
KS
3use nihav_core::io::byteio::*;
4use nihav_core::io::bitreader::*;
5use nihav_core::io::codebook::*;
6use nihav_core::io::intcode::*;
b4d5b851 7use nihav_codec_support::codecs::{IPShuffler, MV, ZERO_MV};
232deab9 8
9dce67e3
KS
9macro_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
232deab9
KS
18macro_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
26macro_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];
c2a4fa57 57 let t01 = ($src[$off + $sstep * 2] - $src[$off + $sstep * 6]) * std::f32::consts::SQRT_2 - t00;
232deab9
KS
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;
c2a4fa57 69 let t13 = (t06 - t04) * std::f32::consts::SQRT_2;
232deab9
KS
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
c2a4fa57 86#[allow(clippy::erasing_op)]
232deab9
KS
87fn 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
c2a4fa57 97#[allow(clippy::erasing_op)]
232deab9
KS
98fn bink2_idct_old(coeffs: &mut [f32; 64]) {
99 let mut tmp: [f32; 64] = [0.0; 64];
3654ecf2 100 coeffs[0] += 512.5;
232deab9
KS
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
109struct Bink2DSP { }
110
111fn clip8(val: i32) -> u8 {
112 val.min(255).max(0) as u8
113}
114
115macro_rules! el {
116 ($src: expr, $off: expr) => (
117 $src[$off] as i32
118 );
119}
120
121macro_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);
d1886673 126 (((t0 * 19) >> 1) - t1 * 2 + (t2 >> 1) + 8) >> 4
232deab9
KS
127 });
128}
129
130macro_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
5de1b118
KS
149macro_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
c2a4fa57 154#[allow(clippy::erasing_op)]
232deab9 155impl Bink2DSP {
3687b8b3 156 #[allow(clippy::identity_op)]
232deab9 157 fn calc_dc(src: &[u8], stride: usize) -> i32 {
5de1b118
KS
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 }
232deab9 170 let mut sum = 0;
5de1b118
KS
171 for e in sums.iter() {
172 sum += e;
232deab9 173 }
5de1b118 174 sum as i32
232deab9
KS
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))) {
3687b8b3
KS
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 }
232deab9
KS
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))) {
3687b8b3
KS
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 }
232deab9
KS
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))) {
3687b8b3
KS
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 }
232deab9
KS
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))) {
3687b8b3
KS
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 }
232deab9
KS
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))) {
3687b8b3
KS
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 }
232deab9
KS
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))) {
3687b8b3
KS
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 }
232deab9
KS
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))) {
3687b8b3
KS
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 }
232deab9
KS
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))) {
3687b8b3
KS
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 }
232deab9
KS
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);
d1886673
KS
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));
232deab9
KS
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)) {
bf109afe 315 out[..16].copy_from_slice(&row[..16]);
232deab9
KS
316 }
317 },
318 1 => {
319 for out in dst.chunks_mut(stride).take(16) {
3687b8b3
KS
320 for (i, el) in out[..16].iter_mut().enumerate() {
321 *el = clip8(luma_filter!(ppix, poff + i, 1));
232deab9
KS
322 }
323 poff += pstride;
324 }
325 },
326 2 => {
327 for out in dst.chunks_mut(stride).take(16) {
328 for i in 0..16 {
d1886673 329 out[i] = clip8(luma_filter!(ppix, poff + i, pstride));
232deab9
KS
330 }
331 poff += pstride;
332 }
333 },
334 3 => {
d1886673 335 let mut tmp = [0i16; 21 * 16];
232deab9
KS
336 for out in tmp.chunks_mut(16) {
337 for i in 0..16 {
d1886673 338 out[i] = luma_filter!(ppix, poff - 2 * pstride + i, 1) as i16;
232deab9
KS
339 }
340 poff += pstride;
341 }
342 for (row, out) in dst.chunks_mut(stride).take(16).enumerate() {
343 for i in 0..16 {
d1886673 344 out[i] = clip8(luma_filter!(tmp, (row + 2) * 16 + i, 16));
232deab9
KS
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);
d1886673
KS
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));
232deab9
KS
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)) {
bf109afe 374 out[..8].copy_from_slice(&src[..8]);
232deab9
KS
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
3687b8b3 389#[allow(clippy::collapsible_else_if)]
232deab9
KS
390fn 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)]
407struct QuantInfo {
408 quants: Vec<u8>,
409 qstride: usize,
410 qpos: usize,
411 pqpos: usize,
412}
413
414impl 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] }
3687b8b3
KS
428 } else if is_left {
429 self.quants[self.pqpos + pos]
232deab9 430 } else {
3687b8b3
KS
431 mid_pred(self.quants[self.pqpos + pos - 2],
432 self.quants[self.pqpos + pos],
433 self.quants[self.qpos + pos - 2])
232deab9
KS
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)]
442struct 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
451impl 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)]
475struct 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
484impl 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
504trait 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
510fn dc_pred2(a: i32, b: i32) -> i32 {
511 (a.max(b)).min(a.min(b).max(a * 2 - b))
512}
513fn 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
3687b8b3 517#[allow(clippy::identity_op)]
232deab9
KS
518impl 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)]
3687b8b3
KS
523 #[allow(clippy::collapsible_else_if)]
524 #[allow(clippy::needless_late_init)]
232deab9
KS
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) {
232deab9
KS
641 let dst = &mut self.dcs;
642 let dcs = &self.dc_buf;
3687b8b3
KS
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);
232deab9
KS
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
682impl 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 }
3687b8b3 722 #[allow(clippy::identity_op)]
232deab9
KS
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
3687b8b3
KS
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);
232deab9
KS
731
732 dst[0] = a0;
733 dst[1] = a1;
734 dst[2] = a2;
735 dst[3] = a3;
736 }
737}
738
739fn 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)]
760struct MVInfo {
761 mvs: Vec<MV>,
762 stride: usize,
763 mv_off: usize,
764 prev_off: usize,
765}
766
3687b8b3
KS
767#[allow(clippy::collapsible_else_if)]
768#[allow(clippy::identity_op)]
232deab9
KS
769impl 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 {
3687b8b3
KS
883 for mv in mv_c.iter_mut() {
884 *mv = br.read(bits)? as i16;
232deab9 885 }
3687b8b3
KS
886 for mv in mv_c.iter_mut() {
887 if (*mv != 0) && br.read_bool()? {
888 *mv = -*mv;
232deab9
KS
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
999struct 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
1010fn map_ac(idx: usize) -> u8 { idx as u8 }
232deab9
KS
1011
1012impl 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();
635e4170 1018 let mut cbr = TableCodebookDescReader::new(BINK2_MV_CODES, BINK2_MV_BITS, |idx| BINK2_MV_SYMS[idx]);
232deab9
KS
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)]
1035struct Bink2Decoder {
2422d969 1036 info: NACodecInfoRef,
232deab9
KS
1037 ips: IPShuffler,
1038
1039 version: u32,
9dce67e3
KS
1040 has_alpha: bool,
1041 slice_h: [usize; 8],
1042 num_slices: usize,
1043
232deab9
KS
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,
9dce67e3 1051 a_dcs: YDCInfo,
232deab9
KS
1052 mvs: MVInfo,
1053
1054 codes: Bink2Codes,
1055}
1056
c2a4fa57 1057#[allow(clippy::erasing_op)]
232deab9
KS
1058impl Bink2Decoder {
1059 fn new() -> Self {
1060 Self::default()
1061 }
1062
b7c882c1 1063 #[allow(clippy::cognitive_complexity)]
3687b8b3
KS
1064 #[allow(clippy::identity_op)]
1065 #[allow(clippy::needless_range_loop)]
232deab9 1066 fn decode_frame_new(&mut self, br: &mut BitReader, buf: &mut NAVideoBuffer<u8>, is_intra: bool) -> DecoderResult<()> {
9dce67e3
KS
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);
232deab9 1070 let (width, height) = buf.get_dimensions(0);
1a967e6b 1071 let data = buf.get_data_mut().unwrap();
232deab9
KS
1072 let dst = data.as_mut_slice();
1073 let bw = (width + 31) >> 5;
d1886673 1074 let bheight = (height + 31) >> 5;
232deab9
KS
1075 self.cur_w = (width + 7) & !7;
1076 self.cur_h = ((height + 7) & !7) >> 1;
1077
1078 let frame_flags = br.read(32)?;
9dce67e3 1079 let mut offsets: [u32; 7] = [0; 7];
3687b8b3
KS
1080 for offset in offsets[..self.num_slices-1].iter_mut() {
1081 *offset = br.read(32)?;
9dce67e3
KS
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 }
232deab9 1091 }
e2392676
KS
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 {
9dce67e3
KS
1096 let len = (height + 15) >> 4;
1097 decode_flags(br, &mut row_flags, 1, len * 2 - 1)?;
e2392676
KS
1098 }
1099 if (frame_flags & 0x4000) == 0 {
9dce67e3
KS
1100 let len = (width + 15) >> 4;
1101 decode_flags(br, &mut col_flags, 1, len * 2 - 1)?;
e2392676 1102 }
e2392676 1103 }
9dce67e3
KS
1104 row_flags.resize(bheight * 4, false);
1105 col_flags.resize(bw * 4, false);
e2392676
KS
1106 //store frame_flags * 8 & 0x7F8
1107
9dce67e3
KS
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)?;
232deab9 1113 }
9dce67e3
KS
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;
232deab9
KS
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);
9dce67e3 1127 self.a_dcs.resize(bw);
232deab9 1128 self.mvs.resize(bw);
9dce67e3 1129 for by in start_by..end_by {
232deab9
KS
1130 let mut cbp_y = 0;
1131 let mut cbp_u = 0;
1132 let mut cbp_v = 0;
9dce67e3 1133 let mut cbp_a = 0;
232deab9
KS
1134 let mut cbp_y_p = 0;
1135 let mut cbp_u_p = 0;
1136 let mut cbp_v_p = 0;
9dce67e3 1137 let mut cbp_a_p = 0;
232deab9
KS
1138 let mut q_y = 8;
1139 let mut q_u = 8;
1140 let mut q_v = 8;
9dce67e3 1141 let mut q_a = 8;
232deab9
KS
1142 let mut q_y_p = 8;
1143 let mut q_u_p = 8;
1144 let mut q_v_p = 8;
9dce67e3
KS
1145 let mut q_a_p = 8;
1146 let rflags = (row_flags[by] as u32) * 4;
232deab9 1147 row_state = (row_state & 0x3FFFFFF) | ((row_state >> 4) & 0xC000000) | (rflags << 28);
9dce67e3 1148 if by == start_by {
232deab9
KS
1149 row_state |= 0x80;
1150// } else {
1151// row_state |= 0x8;
1152 }
9dce67e3 1153 if by + 2 >= end_by {
232deab9
KS
1154 row_state |= 0x100;
1155 }
1156
1157 let mut btype_lru: [u8; 4] = [ 2, 3, 1, 0 ];
1158 let mut edge_state = 0;
9dce67e3 1159 let is_top = by == start_by;
232deab9
KS
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 }
e2392676 1171 let clflags = (col_flags[bx] as u32) * 4;
232deab9
KS
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;
3687b8b3
KS
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 };
232deab9 1205 } else {
3687b8b3 1206 btype = br.read(2)? as u8;
232deab9
KS
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)?;
9dce67e3
KS
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 }
232deab9
KS
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)?;
9dce67e3
KS
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 }
232deab9
KS
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;
9dce67e3 1270 let yoff = by * 32 + (blk_no & 2) * 8;
232deab9
KS
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)?;
9dce67e3
KS
1274 if do_alpha {
1275 Bink2DSP::mc_luma(&mut dst[off_a..], stride_a, ref_pic, xoff, yoff, ZERO_MV, 3)?;
1276 }
232deab9
KS
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;
9dce67e3 1292 let yoff = by * 32 + (blk_no & 2) * 8;
232deab9
KS
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)?;
9dce67e3
KS
1297 if do_alpha {
1298 Bink2DSP::mc_luma(&mut dst[off_a..], stride_a, ref_pic, xoff, yoff, mv, 3)?;
1299 }
232deab9
KS
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;
9dce67e3 1314 let yoff = by * 32 + (blk_no & 2) * 8;
232deab9
KS
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)?;
9dce67e3
KS
1319 if do_alpha {
1320 Bink2DSP::mc_luma(&mut dst[off_a..], stride_a, ref_pic, xoff, yoff, mv, 3)?;
1321 }
232deab9
KS
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 }
9dce67e3
KS
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 }
232deab9
KS
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)?;
9dce67e3
KS
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 }
232deab9
KS
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);
9dce67e3
KS
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 }
232deab9
KS
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();
9dce67e3 1416 self.a_dcs.update_line();
232deab9
KS
1417 self.mvs.update_line();
1418 off_y += stride_y * 32;
1419 off_u += stride_u * 16;
1420 off_v += stride_v * 16;
9dce67e3 1421 off_a += stride_a * 32;
232deab9
KS
1422 row_state = (row_state & !0x190) | ((row_state & 4) << 2);
1423 }
9dce67e3 1424 start_by = self.slice_h[slice_no];
232deab9
KS
1425 }
1426 Ok(())
1427 }
1428}
1429
e2392676
KS
1430fn 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);
232deab9 1438 }
232deab9
KS
1439 } else {
1440 let mut cur_bits = nbits;
1441 let mut mode = 0;
e2392676 1442 let mut lastbit = false;
232deab9
KS
1443 while cur_bits > 0 {
1444 if !br.read_bool()? {
e2392676
KS
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);
232deab9 1452 }
e2392676
KS
1453 cur_bits -= len;
1454 mode = 2;
232deab9 1455 } else {
e2392676 1456 let bread: u8;
232deab9
KS
1457 if cur_bits < 4 {
1458 bread = 2;
1459 } else if cur_bits < 16 {
1460 bread = 4;
1461 } else {
1462 bread = 4 | 1;
1463 }
e2392676
KS
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 {
232deab9
KS
1467 let add_run = br.read(bread)? as usize;
1468 run += add_run;
e2392676
KS
1469 mode = if add_run == (1 << bread) - 1 { 1 } else { 3 };
1470 }
1471 for _ in 0..run {
1472 dst.push(lastbit);
232deab9 1473 }
e2392676 1474 cur_bits -= run;
232deab9
KS
1475 }
1476 }
1477 }
e2392676 1478 Ok(())
232deab9
KS
1479}
1480
1481fn 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 }
3687b8b3
KS
1491 let ret = if !br.read_bool()? {
1492 prev_q.checked_add(code)
1493 } else {
1494 prev_q.checked_sub(code)
1495 };
232deab9
KS
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
1503fn 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
1515fn 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
1525fn 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))?;
3c38de0f 1533 for j in 0..4 { dst[i][j][0] = dcs[i * 4 + j] * 8; }
232deab9
KS
1534 }
1535 Ok(cbp)
1536}
1537
1538fn 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)?;
3c38de0f 1545 for i in 0..4 { dst[i][0] = dcs[i] * 8; }
232deab9
KS
1546 Ok(cbp)
1547}
1548
3687b8b3 1549#[allow(clippy::collapsible_if)]
232deab9
KS
1550fn 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}
1576fn 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
1589trait ReadBink2Code {
1590 fn read_bink2_code_zero(&mut self) -> DecoderResult<i32>;
1591 fn read_bink2_code_nz(&mut self) -> DecoderResult<i32>;
1592}
1593
1594impl<'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;
3687b8b3
KS
1597 if pfx < 4 {
1598 Ok(pfx)
232deab9 1599 } else {
3687b8b3
KS
1600 let add_bits = self.read((pfx as u8) - 3)? as i32;
1601 Ok((1 << (pfx - 3)) + add_bits + 2)
232deab9
KS
1602 }
1603 }
1604 fn read_bink2_code_nz(&mut self) -> DecoderResult<i32> {
1605 let pfx = self.read_code(UintCodeType::LimitedUnary(12, 0))? + 1;
3687b8b3
KS
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 };
232deab9
KS
1612 if self.read_bool()? {
1613 Ok(-val)
1614 } else {
1615 Ok(val)
1616 }
1617 }
1618}
1619
1620fn 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;
3687b8b3 1624 for (blk_no, block) in dst.iter_mut().enumerate() {
232deab9
KS
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)?;
3687b8b3
KS
1633 let skip = if sym == 11 {
1634 br.read(6)? as usize
1635 } else {
1636 BINK2_AC_RUNS[sym as usize]
1637 };
232deab9
KS
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];
3687b8b3 1644 block[pos] = (((level * qmat[pos]) << shift) + 0x40) >> 7;
232deab9
KS
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
1652fn 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
1668fn 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
1683fn 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
1697fn 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
1709fn 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 {
3687b8b3
KS
1714 let res = if br.read_bool()? {
1715 prev_quant.checked_sub(diff)
1716 } else {
1717 prev_quant.checked_add(diff)
1718 };
232deab9
KS
1719 validate!(res.is_some());
1720 let q = res.unwrap();
1721 validate!(q < 16);
1722 Ok(q)
1723 }
1724}
1725
1726fn 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 }
7e6086e5 1742 new_cbp |= nib1 << 4;
232deab9
KS
1743 if !br.read_bool()? {
1744 nib1 = br.read(4)?;
1745 }
7e6086e5 1746 new_cbp |= nib1 << 8;
232deab9
KS
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
1772fn decode_cbp_chroma_old(br: &mut BitReader, prev_cbp: u32) -> DecoderResult<u32> {
3687b8b3
KS
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 };
232deab9
KS
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
1800fn 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
1842fn 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];
3687b8b3 1844 for (blk_no, block) in dst.iter_mut().enumerate() {
232deab9
KS
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];
3687b8b3 1864 block[pos] = (level as f32) * quant_mat[(pos & 7) * 8 + (pos >> 3)] * quant;
232deab9
KS
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)?;
3687b8b3
KS
1872 let skip = if sym == 11 {
1873 br.read(6)? as usize
1874 } else {
1875 BINK2_AC_RUNS[sym as usize]
1876 };
232deab9
KS
1877 idx += skip;
1878 if idx > 63 { break; }
1879 esc_len = if sym == 13 { 6 } else { 0 };
1880 }
1881 }
1882 }
1883 Ok(())
1884}
1885
9dce67e3
KS
1886const KB2H_NUM_SLICES: [usize; 4] = [ 2, 3, 4, 8 ];
1887
232deab9 1888impl NADecoder for Bink2Decoder {
01613464 1889 fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> {
232deab9
KS
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()?;
9dce67e3 1900 let flags = br.read_u32le()?;
232deab9
KS
1901
1902 self.version = magic;
9dce67e3
KS
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;
232deab9 1927
9dce67e3 1928 let aplane = if self.has_alpha { Some(NAPixelChromaton::new(0, 0, false, 8, 0, 3, 1)) } else { None };
3687b8b3 1929 let fmt = NAPixelFormaton::new(ColorModel::YUV(YUVSubmodel::YUVJ),
232deab9
KS
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)),
9dce67e3
KS
1933 aplane, None,
1934 if self.has_alpha { FORMATON_FLAG_ALPHA } else { 0 },
1935 if self.has_alpha { 4 } else { 3 });
232deab9 1936 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
2422d969 1937 self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref();
232deab9
KS
1938
1939 Ok(())
1940 } else {
1941 Err(DecoderError::InvalidData)
1942 }
1943 }
01613464 1944 fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
232deab9
KS
1945 let src = pkt.get_buffer();
1946
fa90ccfb 1947 let mut br = BitReader::new(&src, BitReaderMode::LE);
232deab9
KS
1948
1949 let mut buf;
1950 self.key_frame = pkt.is_keyframe();
1951
7e6086e5 1952 let bufinfo = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 5)?;
232deab9
KS
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 });
171860fc 1961 Ok(frm.into_ref())
232deab9 1962 }
f9be4e75
KS
1963 fn flush(&mut self) {
1964 self.ips.clear();
1965 }
232deab9 1966}
606c448e 1967
7d57ae2f
KS
1968impl 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
08a1fab7 1974pub fn get_decoder() -> Box<dyn NADecoder + Send> {
232deab9
KS
1975 Box::new(Bink2Decoder::new())
1976}
1977
1978#[cfg(test)]
1979mod test {
1980 use nihav_core::codecs::RegisteredDecoders;
1981 use nihav_core::demuxers::RegisteredDemuxers;
ce742854 1982 use nihav_codec_support::test::dec_video::*;
78fb6560 1983 use crate::rad_register_all_decoders;
e64739f8 1984 use crate::rad_register_all_demuxers;
232deab9
KS
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();
78fb6560 1990 rad_register_all_decoders(&mut dec_reg);
232deab9
KS
1991
1992 //let file = "assets/RAD/Open_Logos_partial.bik";
1993 //let file = "assets/RAD/sc13_01_partial.bk2";
886cde48 1994 // sample from a private collection
232deab9
KS
1995 let file = "assets/RAD/ge_video_86l.bk2";
1996 //let file = "assets/RAD/eg_club_0.bk2";
68331a50 1997 test_file_decoding("bink", file, Some(8), true, false, None/*Some("bink2")*/, &dmx_reg, &dec_reg);
232deab9 1998 }
606c448e
KS
1999}
2000
232deab9
KS
2001const 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];
2011const 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];
2021const 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
2032const 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
2039const 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
2047const 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
2087const 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
2127const 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
2167const BINK2_AC_CODES1: &[u8] = &[
2168 0x01, 0x04, 0x00, 0x08, 0x02, 0x32, 0x0A, 0x12,
2169 0x3A, 0x7A, 0xFA, 0x72, 0x06, 0x1A
2170];
2171const BINK2_AC_BITS1: &[u8] = &[ 1, 3, 4, 4, 5, 7, 5, 6, 7, 8, 8, 7, 3, 6 ];
2172const BINK2_AC_CODES2: &[u16] = &[
2173 0x01, 0x00, 0x04, 0x2C, 0x6C, 0x0C, 0x4C, 0xAC,
2174 0xEC, 0x12C, 0x16C, 0x1AC, 0x02, 0x1C
2175];
2176const BINK2_AC_BITS2: &[u8] = &[ 1, 3, 4, 9, 9, 7, 7, 9, 8, 9, 9, 9, 2, 5 ];
2177
2178const BINK2_AC_RUNS: [usize; 14] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 64, 0 ];
2179
2180const BINK2_MV_CODES: &[u8] = &[
2181 0x01, 0x06, 0x0C, 0x1C, 0x18, 0x38, 0x58, 0x78,
2182 0x68, 0x48, 0x28, 0x08, 0x14, 0x04, 0x02, 0x00
2183];
2184const BINK2_MV_BITS: &[u8] = &[
2185 1, 3, 5, 5, 7, 7, 7, 7,
2186 7, 7, 7, 7, 5, 5, 3, 4
2187];
2188const BINK2_MV_ESC: i8 = 42;
2189const 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
2194const BINK2_AC_VAL_CODES1: &[u16] = &[
2195 0x004, 0x01, 0x002, 0x00, 0x08, 0x18, 0xF8, 0x178,
2196 0x138, 0x38, 0x1B8, 0x78, 0xB8
2197];
2198const BINK2_AC_VAL_BITS1: &[u8] = &[ 3, 1, 2, 4, 5, 6, 8, 9, 9, 9, 9, 9, 9 ];
2199const BINK2_AC_VAL_CODES2: &[u16] = &[
2200 0x0A, 0x001, 0x004, 0x08, 0x06, 0x00, 0x02, 0x1A,
2201 0x2A, 0x16A, 0x1EA, 0x6A, 0xEA
2202];
2203const BINK2_AC_VAL_BITS2: &[u8] = &[ 6, 1, 3, 4, 3, 4, 4, 5, 7, 9, 9, 9, 9 ];
2204const BINK2_AC_SKIP_CODES1: &[u16] = &[
2205 0x00, 0x001, 0x0D, 0x15, 0x45, 0x85, 0xA5, 0x165,
2206 0x65, 0x1E5, 0xE5, 0x25, 0x03, 0x05
2207];
2208const BINK2_AC_SKIP_BITS1: &[u8] = &[ 1, 3, 4, 5, 7, 8, 8, 9, 9, 9, 9, 8, 2, 8 ];
2209const BINK2_AC_SKIP_CODES2: &[u16] = &[
2210 0x00, 0x01, 0x003, 0x07, 0x1F, 0x1B, 0x0F, 0x2F,
2211 0x5B, 0xDB, 0x1DB, 0x3B, 0x05, 0x0B
2212];
2213const BINK2_AC_SKIP_BITS2: &[u8] = &[ 1, 3, 4, 4, 5, 7, 6, 6, 8, 9, 9, 6, 3, 5 ];
2214const BINK2_QUANT_CODES: &[u8] = &[
2215 0x01, 0x02, 0x04, 0x08, 0x10, 0x30, 0x50, 0x70,
2216 0x00, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xE0
2217];
2218const BINK2_QUANT_BITS: &[u8] = &[ 1, 2, 3, 4, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8 ];
2219
2220const 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];
2223const BINK2_OLD_DC_QUANTS: [i32; 16] = [
2224 4, 4, 4, 4, 4, 6, 7, 8, 10, 12, 16, 24, 32, 48, 64, 128
2225];
2226const BINK2_DC_EXTRA_BITS: [u8; 16] = [ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6 ];
2227const 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];
2237const 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];
2247const 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];