bink2: correct KB2f IDCT
[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
8 macro_rules! idct_mul {
9 (a; $val: expr) => ($val + ($val >> 2));
10 (b; $val: expr) => ($val >> 1);
11 (c; $val: expr) => ($val - ($val >> 2) - ($val >> 4));
12 (d; $val: expr) => ($val + ($val >> 2) - ($val >> 4));
13 (e; $val: expr) => ($val >> 2);
14 }
15
16 macro_rules! idct {
17 ($src: expr, $sstep: expr, $off: expr, $dst: expr, $dstep: expr, $doff: expr, $bias: expr, $shift: expr) => {
18 let tmp00 = $src[$off + 3 * $sstep] + $src[$off + 5 * $sstep];
19 let tmp01 = $src[$off + 3 * $sstep] - $src[$off + 5 * $sstep];
20 let tmp02 = idct_mul!(a; $src[$off + 2 * $sstep]) + idct_mul!(b; $src[$off + 6 * $sstep]);
21 let tmp03 = idct_mul!(b; $src[$off + 2 * $sstep]) - idct_mul!(a; $src[$off + 6 * $sstep]);
22 let tmp0 = ($src[$off + 0 * $sstep] + $src[$off + 4 * $sstep]) + tmp02;
23 let tmp1 = ($src[$off + 0 * $sstep] + $src[$off + 4 * $sstep]) - tmp02;
24 let tmp2 = $src[$off + 0 * $sstep] - $src[$off + 4 * $sstep];
25 let tmp3 = $src[$off + 1 * $sstep] + tmp00;
26 let tmp4 = $src[$off + 1 * $sstep] - tmp00;
27 let tmp5 = tmp01 + $src[$off + 7 * $sstep];
28 let tmp6 = tmp01 - $src[$off + 7 * $sstep];
29 let tmp7 = tmp4 + idct_mul!(c; tmp6);
30 let tmp8 = idct_mul!(c; tmp4) - tmp6;
31 let tmp9 = idct_mul!(d; tmp3) + idct_mul!(e; tmp5);
32 let tmp10 = idct_mul!(e; tmp3) - idct_mul!(d; tmp5);
33 let tmp11 = tmp2 + tmp03;
34 let tmp12 = tmp2 - tmp03;
35
36 $dst[$doff + 0 * $dstep] = (tmp0 + tmp9 + $bias) >> $shift;
37 $dst[$doff + 1 * $dstep] = (tmp11 + tmp7 + $bias) >> $shift;
38 $dst[$doff + 2 * $dstep] = (tmp12 + tmp8 + $bias) >> $shift;
39 $dst[$doff + 3 * $dstep] = (tmp1 + tmp10 + $bias) >> $shift;
40 $dst[$doff + 4 * $dstep] = (tmp1 - tmp10 + $bias) >> $shift;
41 $dst[$doff + 5 * $dstep] = (tmp12 - tmp8 + $bias) >> $shift;
42 $dst[$doff + 6 * $dstep] = (tmp11 - tmp7 + $bias) >> $shift;
43 $dst[$doff + 7 * $dstep] = (tmp0 - tmp9 + $bias) >> $shift;
44 };
45 (float; $src: expr, $sstep: expr, $off: expr, $dst: expr, $dstep: expr, $doff: expr, $bias: expr, $shift: expr) => {
46 let t00 = $src[$off + $sstep * 2] + $src[$off + $sstep * 6];
47 let t01 = ($src[$off + $sstep * 2] - $src[$off + $sstep * 6]) * 1.4142135 - t00;
48 let t02 = $src[$off + $sstep * 0] + $src[$off + $sstep * 4];
49 let t03 = $src[$off + $sstep * 0] - $src[$off + $sstep * 4];
50 let t04 = $src[$off + $sstep * 3] + $src[$off + $sstep * 5];
51 let t05 = $src[$off + $sstep * 3] - $src[$off + $sstep * 5];
52 let t06 = $src[$off + $sstep * 1] + $src[$off + $sstep * 7];
53 let t07 = $src[$off + $sstep * 1] - $src[$off + $sstep * 7];
54 let t08 = t02 + t00;
55 let t09 = t02 - t00;
56 let t10 = t03 + t01;
57 let t11 = t03 - t01;
58 let t12 = t06 + t04;
59 let t13 = (t06 - t04) * 1.4142135;
60 let t14 = (t07 - t05) * 1.847759;
61 let t15 = t05 * 2.613126 + t14 - t12;
62 let t16 = t13 - t15;
63 let t17 = t07 * 1.0823922 - t14 + t16;
64
65 $dst[$doff + 0 * $dstep] = t08 + t12;
66 $dst[$doff + 1 * $dstep] = t10 + t15;
67 $dst[$doff + 2 * $dstep] = t11 + t16;
68 $dst[$doff + 3 * $dstep] = t09 - t17;
69 $dst[$doff + 4 * $dstep] = t09 + t17;
70 $dst[$doff + 5 * $dstep] = t11 - t16;
71 $dst[$doff + 6 * $dstep] = t10 - t15;
72 $dst[$doff + 7 * $dstep] = t08 - t12;
73 };
74 }
75
76 fn bink2_idct(coeffs: &mut [i32; 64]) {
77 let mut tmp: [i32; 64] = [0; 64];
78 for i in 0..8 {
79 idct!(coeffs, 1, 8 * i, tmp, 8, i, 0, 0);
80 }
81 for i in 0..8 {
82 idct!(tmp, 1, 8 * i, coeffs, 1, 8 * i, 0, 6);
83 }
84 }
85
86 fn bink2_idct_old(coeffs: &mut [f32; 64]) {
87 let mut tmp: [f32; 64] = [0.0; 64];
88 coeffs[0] += 512.5;
89 for i in 0..8 {
90 idct!(float; coeffs, 8, i, tmp, 8, i, 0, 0);
91 }
92 for i in 0..8 {
93 idct!(float; tmp, 1, 8 * i, coeffs, 1, 8 * i, 0, 6);
94 }
95 }
96
97 struct Bink2DSP { }
98
99 fn clip8(val: i32) -> u8 {
100 val.min(255).max(0) as u8
101 }
102
103 macro_rules! el {
104 ($src: expr, $off: expr) => (
105 $src[$off] as i32
106 );
107 }
108
109 macro_rules! luma_filter {
110 ($src: expr, $off: expr, $step: expr) => ({
111 let t0 = el!($src, $off - 0 * $step) + el!($src, $off + 1 * $step);
112 let t1 = el!($src, $off - 1 * $step) + el!($src, $off + 2 * $step);
113 let t2 = el!($src, $off - 2 * $step) + el!($src, $off + 3 * $step);
114 clip8((((t0 * 19) >> 1) - t1 * 2 + (t2 >> 1) + 8) >> 4)
115 });
116 }
117
118 macro_rules! chroma_interp {
119 ($dst: expr, $dstride: expr, $h: expr, $ty: tt, $src: expr, $sstride: expr, $step: expr, $mode: expr, $shift: expr) => {
120 let mut soff = 0;
121 for out in $dst.chunks_mut($dstride).take($h) {
122 for i in 0..8 {
123 let e0 = el!($src, soff + i);
124 let e1 = el!($src, soff + i + $step);
125 out[i] = match $mode {
126 0 => e0,
127 1 => (e0 * 3 + e1 + $shift) >> $shift,
128 2 => (e0 * 2 + e1 * 2 + $shift) >> $shift,
129 _ => (e0 + e1 * 3 + $shift) >> $shift,
130 } as $ty;
131 }
132 soff += $sstride;
133 }
134 };
135 }
136
137 macro_rules! avg_tree {
138 ($a: expr, $b: expr) => (($a + $b + 1) >> 1);
139 ($a: expr, $b: expr, $c: expr, $d: expr) => (avg_tree!(avg_tree!($a, $b), avg_tree!($c, $d)));
140 }
141
142 impl Bink2DSP {
143 fn calc_dc(src: &[u8], stride: usize) -> i32 {
144 let mut sums = [0u16; 8];
145 for i in 0..8 {
146 let s0 = src[i + stride * 0] as u16;
147 let s1 = src[i + stride * 1] as u16;
148 let s2 = src[i + stride * 2] as u16;
149 let s3 = src[i + stride * 3] as u16;
150 let s4 = src[i + stride * 4] as u16;
151 let s5 = src[i + stride * 5] as u16;
152 let s6 = src[i + stride * 6] as u16;
153 let s7 = src[i + stride * 7] as u16;
154 sums[i] = avg_tree!(avg_tree!(s0, s1, s2, s3), avg_tree!(s4, s5, s6, s7));
155 }
156 let mut sum = 0;
157 for e in sums.iter() {
158 sum += e;
159 }
160 sum as i32
161 }
162 fn put_mb4(dst: &mut [u8], mut off: usize, stride: usize, blk: &mut [[i32; 64]; 4]) {
163 bink2_idct(&mut blk[0]);
164 bink2_idct(&mut blk[1]);
165 bink2_idct(&mut blk[2]);
166 bink2_idct(&mut blk[3]);
167 {
168 let dout = &mut dst[off..];
169 for (row, (b0, b1)) in dout.chunks_mut(stride).zip(blk[0].chunks(8).zip(blk[1].chunks(8))) {
170 for i in 0..8 { row[i + 0] = clip8(b0[i]); }
171 for i in 0..8 { row[i + 8] = clip8(b1[i]); }
172 }
173 }
174 off += stride * 8;
175 {
176 let dout = &mut dst[off..];
177 for (row, (b2, b3)) in dout.chunks_mut(stride).zip(blk[2].chunks(8).zip(blk[3].chunks(8))) {
178 for i in 0..8 { row[i + 0] = clip8(b2[i]); }
179 for i in 0..8 { row[i + 8] = clip8(b3[i]); }
180 }
181 }
182 }
183 fn add_mb4(dst: &mut [u8], mut off: usize, stride: usize, blk: &mut [[i32; 64]; 4]) {
184 bink2_idct(&mut blk[0]);
185 bink2_idct(&mut blk[1]);
186 bink2_idct(&mut blk[2]);
187 bink2_idct(&mut blk[3]);
188 {
189 let dout = &mut dst[off..];
190 for (row, (b0, b1)) in dout.chunks_mut(stride).zip(blk[0].chunks(8).zip(blk[1].chunks(8))) {
191 for i in 0..8 { row[i + 0] = clip8((row[i + 0] as i32) + b0[i]); }
192 for i in 0..8 { row[i + 8] = clip8((row[i + 8] as i32) + b1[i]); }
193 }
194 }
195 off += stride * 8;
196 {
197 let dout = &mut dst[off..];
198 for (row, (b2, b3)) in dout.chunks_mut(stride).zip(blk[2].chunks(8).zip(blk[3].chunks(8))) {
199 for i in 0..8 { row[i + 0] = clip8((row[i + 0] as i32) + b2[i]); }
200 for i in 0..8 { row[i + 8] = clip8((row[i + 8] as i32) + b3[i]); }
201 }
202 }
203 }
204 fn put_mb4_old(dst: &mut [u8], mut off: usize, stride: usize, blk: &mut [[f32; 64]; 4]) {
205 bink2_idct_old(&mut blk[0]);
206 bink2_idct_old(&mut blk[1]);
207 bink2_idct_old(&mut blk[2]);
208 bink2_idct_old(&mut blk[3]);
209 {
210 let dout = &mut dst[off..];
211 for (row, (b0, b1)) in dout.chunks_mut(stride).zip(blk[0].chunks(8).zip(blk[1].chunks(8))) {
212 for i in 0..8 { row[i + 0] = clip8((b0[i] as i32) - 512); }
213 for i in 0..8 { row[i + 8] = clip8((b1[i] as i32) - 512); }
214 }
215 }
216 off += stride * 8;
217 {
218 let dout = &mut dst[off..];
219 for (row, (b2, b3)) in dout.chunks_mut(stride).zip(blk[2].chunks(8).zip(blk[3].chunks(8))) {
220 for i in 0..8 { row[i + 0] = clip8((b2[i] as i32) - 512); }
221 for i in 0..8 { row[i + 8] = clip8((b3[i] as i32) - 512); }
222 }
223 }
224 }
225 fn add_mb4_old(dst: &mut [u8], mut off: usize, stride: usize, blk: &mut [[f32; 64]; 4]) {
226 bink2_idct_old(&mut blk[0]);
227 bink2_idct_old(&mut blk[1]);
228 bink2_idct_old(&mut blk[2]);
229 bink2_idct_old(&mut blk[3]);
230 {
231 let dout = &mut dst[off..];
232 for (row, (b0, b1)) in dout.chunks_mut(stride).zip(blk[0].chunks(8).zip(blk[1].chunks(8))) {
233 for i in 0..8 { row[i + 0] = clip8((row[i + 0] as i32) + (b0[i] as i32) - 512); }
234 for i in 0..8 { row[i + 8] = clip8((row[i + 8] as i32) + (b1[i] as i32) - 512); }
235 }
236 }
237 off += stride * 8;
238 {
239 let dout = &mut dst[off..];
240 for (row, (b2, b3)) in dout.chunks_mut(stride).zip(blk[2].chunks(8).zip(blk[3].chunks(8))) {
241 for i in 0..8 { row[i + 0] = clip8((row[i + 0] as i32) + (b2[i] as i32) - 512); }
242 for i in 0..8 { row[i + 8] = clip8((row[i + 8] as i32) + (b3[i] as i32) - 512); }
243 }
244 }
245 }
246 fn mc_luma(dst: &mut [u8], stride: usize, ref_pic: &NAVideoBuffer<u8>, xoff: usize, yoff: usize, mv: MV, plane: usize) -> DecoderResult<()> {
247 let sx = (xoff as isize) + ((mv.x >> 1) as isize);
248 let sy = (yoff as isize) + ((mv.y >> 1) as isize);
249 let mode = (mv.x & 1) + (mv.y & 1) * 2;
250 let (d_x, add_x) = if (mv.x & 1) != 0 { (2, 5) } else { (0, 0) };
251 let (d_y, add_y) = if (mv.y & 1) != 0 { (2, 5) } else { (0, 0) };
252
253 let (w, h) = ref_pic.get_dimensions(plane);
254 validate!((sx - d_x >= 0) && (sx - d_x + add_x + 16 <= (w as isize)));
255 validate!((sy - d_y >= 0) && (sy - d_y + add_y + 16 <= (h as isize)));
256 let pstride = ref_pic.get_stride(plane);
257 let mut poff = ref_pic.get_offset(plane) + (sx as usize) + (sy as usize) * pstride;
258 let pdata = ref_pic.get_data();
259 let ppix = pdata.as_slice();
260
261 let dst = &mut dst[xoff + (yoff & 31) * stride..];
262
263 match mode {
264 0 => {
265 let src = &ppix[poff..];
266 for (out, row) in dst.chunks_mut(stride).take(16).zip(src.chunks(pstride)) {
267 for i in 0..16 { out[i] = row[i]; }
268 }
269 },
270 1 => {
271 for out in dst.chunks_mut(stride).take(16) {
272 for i in 0..16 {
273 out[i] = luma_filter!(ppix, poff + i, 1);
274 }
275 poff += pstride;
276 }
277 },
278 2 => {
279 for out in dst.chunks_mut(stride).take(16) {
280 for i in 0..16 {
281 out[i] = luma_filter!(ppix, poff + i, pstride);
282 }
283 poff += pstride;
284 }
285 },
286 3 => {
287 let mut tmp = [0u8; 21 * 16];
288 for out in tmp.chunks_mut(16) {
289 for i in 0..16 {
290 out[i] = luma_filter!(ppix, poff - 2 * pstride + i, 1);
291 }
292 poff += pstride;
293 }
294 for (row, out) in dst.chunks_mut(stride).take(16).enumerate() {
295 for i in 0..16 {
296 out[i] = luma_filter!(tmp, (row + 2) * 16 + i, 16);
297 }
298 }
299 },
300 _ => unreachable!(),
301 };
302 Ok(())
303 }
304 fn mc_chroma(dst: &mut [u8], stride: usize, ref_pic: &NAVideoBuffer<u8>, xoff: usize, yoff: usize, mv: MV, plane: usize) -> DecoderResult<()> {
305 let sx = (xoff as isize) + ((mv.x >> 2) as isize);
306 let sy = (yoff as isize) + ((mv.y >> 2) as isize);
307 let mx = mv.x & 3;
308 let my = mv.y & 3;
309 let add_x = if mx != 0 { 1 } else { 0 };
310 let add_y = if my != 0 { 1 } else { 0 };
311
312 let (w, h) = ref_pic.get_dimensions(plane);
313 validate!((sx >= 0) && (sx + add_x + 8 <= (w as isize)));
314 validate!((sy >= 0) && (sy + add_y + 8 <= (h as isize)));
315 let pstride = ref_pic.get_stride(plane);
316 let poff = ref_pic.get_offset(plane) + (sx as usize) + (sy as usize) * pstride;
317 let pdata = ref_pic.get_data();
318 let ppix = pdata.as_slice();
319
320 let dst = &mut dst[xoff + (yoff & 15) * stride..];
321 if (mx == 0) && (my == 0) {
322 let inpix = &ppix[poff..];
323 for (out, src) in dst.chunks_mut(stride).take(8).zip(inpix.chunks(pstride)) {
324 for i in 0..8 { out[i] = src[i]; }
325 }
326 } else if my == 0 {
327 chroma_interp!(dst, stride, 8, u8, &ppix[poff..], pstride, 1, mx, 2);
328 } else if mx == 0 {
329 chroma_interp!(dst, stride, 8, u8, &ppix[poff..], pstride, pstride, my, 2);
330 } else {
331 let mut tmp = [0u16; 9 * 8];
332 chroma_interp!(tmp, 8, 9, u16, &ppix[poff..], pstride, 1, mx, 0);
333 chroma_interp!(dst, stride, 8, u8, &tmp, 8, 8, my, 4);
334 }
335 Ok(())
336 }
337 }
338
339 fn mid_pred<T:PartialOrd>(a: T, b: T, c: T) -> T {
340 if a < b {
341 if b < c {
342 b
343 } else {
344 if a < c { c } else { a }
345 }
346 } else {
347 if b < c {
348 if a < c { a } else { c }
349 } else {
350 b
351 }
352 }
353 }
354
355 #[derive(Default)]
356 struct QuantInfo {
357 quants: Vec<u8>,
358 qstride: usize,
359 qpos: usize,
360 pqpos: usize,
361 }
362
363 impl QuantInfo {
364 fn resize(&mut self, bw: usize) {
365 self.qstride = bw * 2;
366 self.quants.resize(self.qstride * 2, 0);
367 self.qpos = 0;
368 self.pqpos = self.qstride;
369 }
370 fn update_line(&mut self) {
371 mem::swap(&mut self.qpos, &mut self.pqpos);
372 }
373 fn pred_quant(&self, pos: usize, is_top: bool) -> u8 {
374 let is_left = pos < 2;
375 if is_top {
376 if is_left { 16 } else { self.quants[self.qpos + pos - 2] }
377 } else {
378 if is_left {
379 self.quants[self.pqpos + pos]
380 } else {
381 mid_pred(self.quants[self.pqpos + pos - 2],
382 self.quants[self.pqpos + pos],
383 self.quants[self.qpos + pos - 2])
384 }
385 }
386 }
387 fn set_quant(&mut self, pos: usize, q: u8) {
388 self.quants[self.qpos + pos] = q;
389 }
390 }
391
392 #[derive(Default)]
393 struct YDCInfo {
394 dcs: [i32; 16],
395 dc_buf: [i32; 16],
396 prev_dcs: Vec<i32>,
397 new_dcs: Vec<i32>,
398 stride: usize,
399 prev_off: usize,
400 }
401
402 impl YDCInfo {
403 fn resize(&mut self, bw: usize) {
404 self.stride = bw * 4 + 4;
405 self.prev_off = 4;
406 self.prev_dcs.resize(self.stride, 0);
407 self.new_dcs.resize(self.stride, 0);
408 }
409 fn update_line(&mut self) {
410 mem::swap(&mut self.prev_dcs, &mut self.new_dcs);
411 }
412 fn set_dcs(&mut self, bx: usize, dc5: i32, dc7: i32, dc13: i32, dc10: i32, dc11: i32, dc14: i32, dc15: i32) {
413 self.dcs[ 5] = dc5;
414 self.dcs[ 7] = dc7;
415 self.dcs[13] = dc13;
416 self.dcs[15] = dc15;
417 let new_dc = &mut self.new_dcs[bx * 4 + 4..];
418 new_dc[0] = dc10;
419 new_dc[1] = dc11;
420 new_dc[2] = dc14;
421 new_dc[3] = dc15;
422 }
423 }
424
425 #[derive(Default)]
426 struct CDCInfo {
427 dcs: [i32; 4],
428 dc_buf: [i32; 4],
429 prev_dcs: Vec<i32>,
430 new_dcs: Vec<i32>,
431 stride: usize,
432 prev_off: usize,
433 }
434
435 impl CDCInfo {
436 fn resize(&mut self, bw: usize) {
437 self.stride = bw * 2 + 2;
438 self.prev_off = 2;
439 self.prev_dcs.resize(self.stride, 0);
440 self.new_dcs.resize(self.stride, 0);
441 }
442 fn update_line(&mut self) {
443 mem::swap(&mut self.prev_dcs, &mut self.new_dcs);
444 }
445 fn set_dcs(&mut self, bx: usize, dc1: i32, dc2: i32, dc3: i32) {
446 self.dcs[1] = dc1;
447 self.dcs[2] = dc2;
448 self.dcs[3] = dc3;
449 let new_dc = &mut self.new_dcs[bx * 2 + 2..];
450 new_dc[0] = dc2;
451 new_dc[1] = dc3;
452 }
453 }
454
455 trait DCInfo {
456 fn decode_dcs(&mut self, br: &mut BitReader, q: u8) -> DecoderResult<bool>;
457 fn predict(&mut self, bx: usize, is_top: bool, is_left: bool, min_dc: i32, max_dc: i32);
458 fn predict_inter(&mut self, min_dc: i32, max_dc: i32);
459 }
460
461 fn dc_pred2(a: i32, b: i32) -> i32 {
462 (a.max(b)).min(a.min(b).max(a * 2 - b))
463 }
464 fn dc_pred(a: i32, b: i32, c: i32) -> i32 {
465 (a.max(b).max(c)).min((a.min(b).min(c)).max(b - a + c))
466 }
467
468 impl DCInfo for YDCInfo {
469 fn decode_dcs(&mut self, br: &mut BitReader, q: u8) -> DecoderResult<bool> {
470 decode_dcs(br, &mut self.dc_buf, q)
471 }
472 #[allow(non_snake_case)]
473 fn predict(&mut self, bx: usize, is_top: bool, is_left: bool, min_dc: i32, max_dc: i32) {
474 let a0; let a1; let a2; let a3; let a4; let a5; let a6; let a7;
475 let a8; let a9; let aA; let aB; let aC; let aD; let aE; let aF;
476 let prev_dc = &self.prev_dcs[bx * 4..];
477 let dst = &mut self.dcs;
478 let dcs = &self.dc_buf;
479 if is_left {
480 if is_top { //zigzag in 2x2 blocks
481 let add = 1 << 10;//if has_prev_dc { 1 << 10 } else { 0 };
482 a0 = (dcs[ 0] + add).max(min_dc).min(max_dc);
483 a1 = (dcs[ 1] + a0).max(min_dc).min(max_dc);
484 a2 = (dcs[ 2] + dc_pred2(a0, a1)).max(min_dc).min(max_dc);
485 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
486
487 a4 = (dcs[ 4] + dc_pred2(a1, a3)).max(min_dc).min(max_dc);
488 a5 = (dcs[ 5] + a4).max(min_dc).min(max_dc);
489 a6 = (dcs[ 6] + dc_pred(a1, a3, a4)).max(min_dc).min(max_dc);
490 a7 = (dcs[ 7] + dc_pred(a4, a5, a6)).max(min_dc).min(max_dc);
491
492 a8 = (dcs[ 8] + dc_pred2(a2, a3)).max(min_dc).min(max_dc);
493 a9 = (dcs[ 9] + dc_pred(a2, a3, a8)).max(min_dc).min(max_dc);
494 aA = (dcs[10] + dc_pred2(a8, a9)).max(min_dc).min(max_dc);
495 aB = (dcs[11] + dc_pred(a8, a9, aA)).max(min_dc).min(max_dc);
496
497 aC = (dcs[12] + dc_pred(a3, a6, a9)).max(min_dc).min(max_dc);
498 aD = (dcs[13] + dc_pred(a6, a7, aC)).max(min_dc).min(max_dc);
499 aE = (dcs[14] + dc_pred(a9, aB, aC)).max(min_dc).min(max_dc);
500 aF = (dcs[15] + dc_pred(aC, aD, aE)).max(min_dc).min(max_dc);
501 } else {
502 a0 = (dcs[ 0] + dc_pred2(prev_dc[4], prev_dc[5])).max(min_dc).min(max_dc);
503 a1 = (dcs[ 1] + dc_pred(prev_dc[4], prev_dc[5], a0)).max(min_dc).min(max_dc);
504 a2 = (dcs[ 2] + dc_pred2(a0, a1)).max(min_dc).min(max_dc);
505 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
506
507 a4 = (dcs[ 4] + dc_pred(prev_dc[5], prev_dc[6], a1)).max(min_dc).min(max_dc);
508 a5 = (dcs[ 5] + dc_pred(prev_dc[6], prev_dc[7], a4)).max(min_dc).min(max_dc);
509 a6 = (dcs[ 6] + dc_pred(a1, a3, a4)).max(min_dc).min(max_dc);
510 a7 = (dcs[ 7] + dc_pred(a4, a5, a6)).max(min_dc).min(max_dc);
511
512 a8 = (dcs[ 8] + dc_pred2(a2, a3)).max(min_dc).min(max_dc);
513 a9 = (dcs[ 9] + dc_pred(a2, a3, a8)).max(min_dc).min(max_dc);
514 aA = (dcs[10] + dc_pred2(a8, a9)).max(min_dc).min(max_dc);
515 aB = (dcs[11] + dc_pred(a8, a9, aA)).max(min_dc).min(max_dc);
516
517 aC = (dcs[12] + dc_pred(a3, a6, a9)).max(min_dc).min(max_dc);
518 aD = (dcs[13] + dc_pred(a6, a7, aC)).max(min_dc).min(max_dc);
519 aE = (dcs[14] + dc_pred(a9, aB, aC)).max(min_dc).min(max_dc);
520 aF = (dcs[15] + dc_pred(aC, aD, aE)).max(min_dc).min(max_dc);
521 }
522 } else {
523 if is_top {
524 a0 = (dcs[ 0] + dc_pred2(dst[5], dst[7])).max(min_dc).min(max_dc);
525 a1 = (dcs[ 1] + a0).max(min_dc).min(max_dc);
526 a2 = (dcs[ 2] + dc_pred(dst[5], dst[7], a0)).max(min_dc).min(max_dc);
527 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
528
529 a4 = (dcs[ 4] + dc_pred2(a1, a3)).max(min_dc).min(max_dc);
530 a5 = (dcs[ 5] + a4).max(min_dc).min(max_dc);
531 a6 = (dcs[ 6] + dc_pred(a1, a3, a4)).max(min_dc).min(max_dc);
532 a7 = (dcs[ 7] + dc_pred(a4, a5, a6)).max(min_dc).min(max_dc);
533
534 a8 = (dcs[ 8] + dc_pred(dst[7], dst[13], a2)).max(min_dc).min(max_dc);
535 a9 = (dcs[ 9] + dc_pred(a2, a3, a8)).max(min_dc).min(max_dc);
536 aA = (dcs[10] + dc_pred(dst[13], dst[15], a8)).max(min_dc).min(max_dc);
537 aB = (dcs[11] + dc_pred(a8, a9, aA)).max(min_dc).min(max_dc);
538
539 aC = (dcs[12] + dc_pred(a3, a6, a9)).max(min_dc).min(max_dc);
540 aD = (dcs[13] + dc_pred(a6, a7, aC)).max(min_dc).min(max_dc);
541 aE = (dcs[14] + dc_pred(a9, aB, aC)).max(min_dc).min(max_dc);
542 aF = (dcs[15] + dc_pred(aC, aD, aE)).max(min_dc).min(max_dc);
543 } else {
544 a0 = (dcs[ 0] + dc_pred(prev_dc[3], prev_dc[4], dst[5])).max(min_dc).min(max_dc);
545 a1 = (dcs[ 1] + dc_pred(prev_dc[4], prev_dc[5], a0)).max(min_dc).min(max_dc);
546 a2 = (dcs[ 2] + dc_pred(dst[5], dst[7], a0)).max(min_dc).min(max_dc);
547 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
548
549 a4 = (dcs[ 4] + dc_pred(prev_dc[5], prev_dc[6], a1)).max(min_dc).min(max_dc);
550 a5 = (dcs[ 5] + dc_pred(prev_dc[6], prev_dc[7], a4)).max(min_dc).min(max_dc);
551 a6 = (dcs[ 6] + dc_pred(a1, a3, a4)).max(min_dc).min(max_dc);
552 a7 = (dcs[ 7] + dc_pred(a4, a5, a6)).max(min_dc).min(max_dc);
553
554 a8 = (dcs[ 8] + dc_pred(dst[7], dst[13], a2)).max(min_dc).min(max_dc);
555 a9 = (dcs[ 9] + dc_pred(a2, a3, a8)).max(min_dc).min(max_dc);
556 aA = (dcs[10] + dc_pred(dst[13], dst[15], a8)).max(min_dc).min(max_dc);
557 aB = (dcs[11] + dc_pred(a8, a9, aA)).max(min_dc).min(max_dc);
558
559 aC = (dcs[12] + dc_pred(a3, a6, a9)).max(min_dc).min(max_dc);
560 aD = (dcs[13] + dc_pred(a6, a7, aC)).max(min_dc).min(max_dc);
561 aE = (dcs[14] + dc_pred(a9, aB, aC)).max(min_dc).min(max_dc);
562 aF = (dcs[15] + dc_pred(aC, aD, aE)).max(min_dc).min(max_dc);
563 }
564 }
565 dst[ 0] = a0;
566 dst[ 1] = a1;
567 dst[ 2] = a2;
568 dst[ 3] = a3;
569 dst[ 4] = a4;
570 dst[ 5] = a5;
571 dst[ 6] = a6;
572 dst[ 7] = a7;
573 dst[ 8] = a8;
574 dst[ 9] = a9;
575 dst[10] = aA;
576 dst[11] = aB;
577 dst[12] = aC;
578 dst[13] = aD;
579 dst[14] = aE;
580 dst[15] = aF;
581 let new_dc = &mut self.new_dcs[bx * 4 + 4..];
582 new_dc[0] = aA;
583 new_dc[1] = aB;
584 new_dc[2] = aE;
585 new_dc[3] = aF;
586 }
587 #[allow(non_snake_case)]
588 fn predict_inter(&mut self, min_dc: i32, max_dc: i32) {
589 let a0; let a1; let a2; let a3; let a4; let a5; let a6; let a7;
590 let a8; let a9; let aA; let aB; let aC; let aD; let aE; let aF;
591 let dst = &mut self.dcs;
592 let dcs = &self.dc_buf;
593 a0 = (dcs[ 0] + 0).max(min_dc).min(max_dc);
594 a1 = (dcs[ 1] + a0).max(min_dc).min(max_dc);
595 a2 = (dcs[ 2] + dc_pred2(a0, a1)).max(min_dc).min(max_dc);
596 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
597
598 a4 = (dcs[ 4] + dc_pred2(a1, a3)).max(min_dc).min(max_dc);
599 a5 = (dcs[ 5] + a4).max(min_dc).min(max_dc);
600 a6 = (dcs[ 6] + dc_pred(a1, a3, a4)).max(min_dc).min(max_dc);
601 a7 = (dcs[ 7] + dc_pred(a4, a5, a6)).max(min_dc).min(max_dc);
602
603 a8 = (dcs[ 8] + dc_pred2(a2, a3)).max(min_dc).min(max_dc);
604 a9 = (dcs[ 9] + dc_pred(a2, a3, a8)).max(min_dc).min(max_dc);
605 aA = (dcs[10] + dc_pred2(a8, a9)).max(min_dc).min(max_dc);
606 aB = (dcs[11] + dc_pred(a8, a9, aA)).max(min_dc).min(max_dc);
607
608 aC = (dcs[12] + dc_pred(a3, a6, a9)).max(min_dc).min(max_dc);
609 aD = (dcs[13] + dc_pred(a6, a7, aC)).max(min_dc).min(max_dc);
610 aE = (dcs[14] + dc_pred(a9, aB, aC)).max(min_dc).min(max_dc);
611 aF = (dcs[15] + dc_pred(aC, aD, aE)).max(min_dc).min(max_dc);
612
613 dst[ 0] = a0;
614 dst[ 1] = a1;
615 dst[ 2] = a2;
616 dst[ 3] = a3;
617 dst[ 4] = a4;
618 dst[ 5] = a5;
619 dst[ 6] = a6;
620 dst[ 7] = a7;
621 dst[ 8] = a8;
622 dst[ 9] = a9;
623 dst[10] = aA;
624 dst[11] = aB;
625 dst[12] = aC;
626 dst[13] = aD;
627 dst[14] = aE;
628 dst[15] = aF;
629 }
630 }
631
632 impl DCInfo for CDCInfo {
633 fn decode_dcs(&mut self, br: &mut BitReader, q: u8) -> DecoderResult<bool> {
634 decode_dcs(br, &mut self.dc_buf, q)
635 }
636 fn predict(&mut self, bx: usize, is_top: bool, is_left: bool, min_dc: i32, max_dc: i32) {
637 let prev_dc = &self.prev_dcs[bx * 2..];
638 let dst = &mut self.dcs;
639 let dcs = &self.dc_buf;
640
641 let a0; let a1; let a2; let a3;
642 if is_left {
643 if is_top {
644 let add = 1 << 10;//if has_prev_dc { 1 << 10 } else { 0 };
645 a0 = (dcs[ 0] + add).max(min_dc).min(max_dc);
646 a1 = (dcs[ 1] + a0).max(min_dc).min(max_dc);
647 } else {
648 a0 = (dcs[ 0] + dc_pred2(prev_dc[2], prev_dc[3])).max(min_dc).min(max_dc);
649 a1 = (dcs[ 1] + dc_pred(prev_dc[2], prev_dc[3], a0)).max(min_dc).min(max_dc);
650 }
651 a2 = (dcs[ 2] + dc_pred2(a0, a1)).max(min_dc).min(max_dc);
652 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
653 } else {
654 if is_top {
655 a0 = (dcs[ 0] + dc_pred2(dst[1], dst[3])).max(min_dc).min(max_dc);
656 a1 = (dcs[ 1] + a0).max(min_dc).min(max_dc);
657 } else {
658 a0 = (dcs[ 0] + dc_pred(prev_dc[1], prev_dc[2], dst[1])).max(min_dc).min(max_dc);
659 a1 = (dcs[ 1] + dc_pred(prev_dc[2], prev_dc[3], a0)).max(min_dc).min(max_dc);
660 }
661 a2 = (dcs[ 2] + dc_pred(dst[1], dst[3], a0)).max(min_dc).min(max_dc);
662 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
663 }
664 dst[0] = a0;
665 dst[1] = a1;
666 dst[2] = a2;
667 dst[3] = a3;
668 let new_dc = &mut self.new_dcs[bx * 2 + 2..];
669 new_dc[0] = a2;
670 new_dc[1] = a3;
671 }
672 fn predict_inter(&mut self, min_dc: i32, max_dc: i32) {
673 let dst = &mut self.dcs;
674 let dcs = &self.dc_buf;
675
676 let a0; let a1; let a2; let a3;
677
678 a0 = (dcs[ 0] + 0).max(min_dc).min(max_dc);
679 a1 = (dcs[ 1] + a0).max(min_dc).min(max_dc);
680 a2 = (dcs[ 2] + dc_pred2(a0, a1)).max(min_dc).min(max_dc);
681 a3 = (dcs[ 3] + dc_pred(a0, a1, a2)).max(min_dc).min(max_dc);
682
683 dst[0] = a0;
684 dst[1] = a1;
685 dst[2] = a2;
686 dst[3] = a3;
687 }
688 }
689
690 fn decode_dcs(br: &mut BitReader, dcs: &mut [i32], q: u8) -> DecoderResult<bool> {
691 if !br.read_bool()? {
692 for dc in dcs.iter_mut() {
693 *dc = 0;
694 }
695 Ok(false)
696 } else {
697 let quant = BINK2_QUANT_DC[q.max(8) as usize];
698 for dc in dcs.iter_mut() {
699 *dc = br.read_bink2_code_zero()?;
700 if *dc != 0 {
701 *dc = (*dc * quant + 0x1FF) >> 10;
702 if br.read_bool()? {
703 *dc = -*dc;
704 }
705 }
706 }
707 Ok(true)
708 }
709 }
710 #[derive(Default)]
711 struct MVInfo {
712 mvs: Vec<MV>,
713 stride: usize,
714 mv_off: usize,
715 prev_off: usize,
716 }
717
718 impl MVInfo {
719 fn resize(&mut self, bw: usize) {
720 self.stride = bw * 4;
721 self.mv_off = 0;
722 self.prev_off = self.stride;
723 self.mvs.resize(self.stride * 2, ZERO_MV);
724 }
725 fn update_line(&mut self) {
726 mem::swap(&mut self.mv_off, &mut self.prev_off);
727 }
728 fn decode_mv_new(&mut self, br: &mut BitReader, mv_cb: &Codebook<i8>, bx: usize, is_top: bool, is_left: bool) -> DecoderResult<()> {
729 let num_mv = if br.read_bool()? { 1 } else { 4 };
730 let mv = &mut self.mvs;
731 let mv_pos = self.mv_off + bx * 4;
732 let ref_pos = self.prev_off + bx * 4;
733
734 for comp in 0..2 {
735 for i in 0..num_mv {
736 let val;
737 let raw_val = br.read_cb(mv_cb)?;
738 if raw_val != BINK2_MV_ESC {
739 val = raw_val as i16;
740 } else {
741 let len = br.read_code(UintCodeType::LimitedUnary(12, 1))? as u8;
742 let nlen = len + 4;
743 let uval = (br.read(nlen)? as i32) + (1 << nlen) - 1;
744 if (uval & 1) != 0 {
745 val = (-(uval >> 1) - 1) as i16;
746 } else {
747 val = (uval >> 1) as i16;
748 }
749 }
750 if comp == 0 {
751 mv[mv_pos + i].x = val;
752 } else {
753 mv[mv_pos + i].y = val;
754 }
755 }
756 }
757
758 if num_mv > 1 {
759 if is_top {
760 if !is_left {
761 let mv0 = mv[mv_pos + 0] + MV::pred(mv[mv_pos - 4], mv[mv_pos - 3], mv[mv_pos - 1]);
762 mv[mv_pos + 0] = mv0;
763 let mv2 = mv[mv_pos + 2] + MV::pred(mv[mv_pos - 3], mv[mv_pos - 1], mv[mv_pos + 0]);
764 mv[mv_pos + 2] = mv2;
765 let mv1 = mv[mv_pos + 1] + MV::pred(mv[mv_pos - 3], mv[mv_pos + 0], mv[mv_pos + 2]);
766 mv[mv_pos + 1] = mv1;
767 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
768 mv[mv_pos + 3] = mv3;
769 } else {
770 let mv1 = mv[mv_pos + 1] + mv[mv_pos + 0];
771 mv[mv_pos + 1] = mv1;
772 let mv2 = mv[mv_pos + 2] + mv[mv_pos + 0];
773 mv[mv_pos + 2] = mv2;
774 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
775 mv[mv_pos + 3] = mv3;
776 }
777 } else {
778 if is_left {
779 let mv0 = mv[mv_pos + 0] + MV::pred(mv[ref_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
780 mv[mv_pos + 0] = mv0;
781 let mv1 = mv[mv_pos + 1] + MV::pred(mv[ref_pos + 2], mv[ref_pos + 3], mv[mv_pos + 0]);
782 mv[mv_pos + 1] = mv1;
783 let mv2 = mv[mv_pos + 2] + MV::pred(mv[ref_pos + 2], mv[mv_pos + 0], mv[mv_pos + 1]);
784 mv[mv_pos + 2] = mv2;
785 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
786 mv[mv_pos + 3] = mv3;
787 } else {
788 let mv0 = mv[mv_pos + 0] + MV::pred(mv[ref_pos + 2], mv[ref_pos - 1], mv[mv_pos - 3]);
789 mv[mv_pos + 0] = mv0;
790 let mv1 = mv[mv_pos + 1] + MV::pred(mv[ref_pos + 2], mv[ref_pos + 3], mv[mv_pos + 0]);
791 mv[mv_pos + 1] = mv1;
792 let mv2 = mv[mv_pos + 2] + MV::pred(mv[mv_pos - 3], mv[mv_pos - 1], mv[mv_pos + 0]);
793 mv[mv_pos + 2] = mv2;
794 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
795 mv[mv_pos + 3] = mv3;
796 }
797 }
798 } else {
799 let mut mv_pred = mv[mv_pos + 0];
800 if is_top {
801 if !is_left {
802 mv_pred += MV::pred(mv[mv_pos - 4], mv[mv_pos - 3], mv[mv_pos - 1]);
803 }
804 } else {
805 if !is_left {
806 mv_pred += MV::pred(mv[ref_pos - 1], mv[ref_pos + 2], mv[mv_pos - 3]);
807 } else {
808 mv_pred += MV::pred(mv[ref_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
809 }
810 }
811 mv[mv_pos + 0] = mv_pred;
812 mv[mv_pos + 1] = mv_pred;
813 mv[mv_pos + 2] = mv_pred;
814 mv[mv_pos + 3] = mv_pred;
815 }
816 Ok(())
817 }
818 fn decode_mv_old(&mut self, br: &mut BitReader, bx: usize, is_top: bool, is_left: bool) -> DecoderResult<()> {
819 let mv = &mut self.mvs;
820 let mv_pos = self.mv_off + bx * 4;
821 let ref_pos = self.prev_off + bx * 4;
822
823 let mut basex = 0;
824 let mut basey = 0;
825 for comp in 0..2 {
826 let mut bits = br.read(3)? as u8;
827 if bits == 7 {
828 bits += br.read(2)? as u8;
829 }
830 let mut mv_c: [i16; 4] = [0; 4];
831 if bits > 0 {
832 for i in 0..4 {
833 mv_c[i] = br.read(bits)? as i16;
834 }
835 for i in 0..4 {
836 if (mv_c[i] != 0) && br.read_bool()? {
837 mv_c[i] = -mv_c[i];
838 }
839 }
840 }
841 if is_top && is_left {
842 let mut val = br.read(5)? as i16;
843 if (val != 0) && br.read_bool()? {
844 val = -val;
845 }
846 if comp == 0 {
847 basex = val;
848 } else {
849 basey = val;
850 }
851 }
852 if comp == 0 {
853 for i in 0..4 {
854 mv[mv_pos + i].x = mv_c[i];
855 }
856 } else {
857 for i in 0..4 {
858 mv[mv_pos + i].y = mv_c[i];
859 }
860 }
861 }
862 if !is_top {
863 if is_left {
864 let mv0 = mv[mv_pos + 0] + MV::pred(mv[ref_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
865 mv[mv_pos + 0] = mv0;
866 let mv1 = mv[mv_pos + 1] + MV::pred(mv[ref_pos + 2], mv[ref_pos + 3], mv[mv_pos + 0]);
867 mv[mv_pos + 1] = mv1;
868 let mv2 = mv[mv_pos + 2] + MV::pred(mv[ref_pos + 2], mv[mv_pos + 0], mv[mv_pos + 1]);
869 mv[mv_pos + 2] = mv2;
870 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
871 mv[mv_pos + 3] = mv3;
872 } else {
873 let mv0 = mv[mv_pos + 0] + MV::pred(mv[ref_pos - 1], mv[ref_pos + 2], mv[mv_pos - 3]);
874 mv[mv_pos + 0] = mv0;
875 let mv1 = mv[mv_pos + 1] + MV::pred(mv[ref_pos + 2], mv[ref_pos + 3], mv[mv_pos + 0]);
876 mv[mv_pos + 1] = mv1;
877 let mv2 = mv[mv_pos + 2] + MV::pred(mv[ref_pos + 2], mv[mv_pos + 0], mv[mv_pos + 1]);
878 mv[mv_pos + 2] = mv2;
879 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
880 mv[mv_pos + 3] = mv3;
881 }
882 } else {
883 if is_left {
884 let base_mv = MV { x: basex * 16, y: basey * 16 };
885 mv[mv_pos + 0] += base_mv;
886 mv[mv_pos + 1] += base_mv;
887 mv[mv_pos + 2] += base_mv;
888 mv[mv_pos + 3] += base_mv;
889 } else {
890 let mv0 = mv[mv_pos + 0] + MV::pred(mv[mv_pos - 4], mv[mv_pos - 3], mv[mv_pos - 1]);
891 mv[mv_pos + 0] = mv0;
892 let mv2 = mv[mv_pos + 2] + MV::pred(mv[mv_pos - 3], mv[mv_pos - 1], mv[mv_pos + 0]);
893 mv[mv_pos + 2] = mv2;
894 let mv1 = mv[mv_pos + 1] + MV::pred(mv[mv_pos - 3], mv[mv_pos + 0], mv[mv_pos + 2]);
895 mv[mv_pos + 1] = mv1;
896 let mv3 = mv[mv_pos + 3] + MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
897 mv[mv_pos + 3] = mv3;
898 }
899 }
900 Ok(())
901 }
902
903 fn predict_mvs(&mut self, bx: usize, is_top: bool, is_left: bool, is_new: bool) {
904 let mv = &mut self.mvs;
905 let mv_pos = self.mv_off + bx * 4;
906 let ref_pos = self.prev_off + bx * 4;
907
908 if is_top {
909 if is_left {
910 for i in 0..4 {
911 mv[mv_pos + i] = ZERO_MV;
912 }
913 } else {
914 mv[mv_pos + 0] = MV::pred(mv[mv_pos - 4], mv[mv_pos - 3], mv[mv_pos - 1]);
915 mv[mv_pos + 2] = MV::pred(mv[mv_pos - 3], mv[mv_pos - 1], mv[mv_pos + 0]);
916 mv[mv_pos + 1] = MV::pred(mv[mv_pos - 1], mv[mv_pos + 0], mv[mv_pos + 2]);
917 mv[mv_pos + 3] = MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
918 }
919 } else {
920 if is_left {
921 mv[mv_pos + 0] = MV::pred(mv[ref_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
922 mv[mv_pos + 1] = MV::pred(mv[mv_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
923 mv[mv_pos + 2] = MV::pred(mv[ref_pos + 2], mv[mv_pos + 1], mv[mv_pos + 0]);
924 mv[mv_pos + 3] = MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
925 } else {
926 mv[mv_pos + 0] = MV::pred(mv[mv_pos - 3], mv[ref_pos - 1], mv[ref_pos + 2]);
927 mv[mv_pos + 1] = MV::pred(mv[mv_pos + 0], mv[ref_pos + 2], mv[ref_pos + 3]);
928 if is_new {
929 mv[mv_pos + 2] = MV::pred(mv[mv_pos - 3], mv[mv_pos - 1], mv[mv_pos + 0]);
930 } else {
931 mv[mv_pos + 2] = MV::pred(mv[ref_pos + 2], mv[mv_pos + 1], mv[mv_pos + 0]);
932 }
933 mv[mv_pos + 3] = MV::pred(mv[mv_pos + 0], mv[mv_pos + 1], mv[mv_pos + 2]);
934 }
935 }
936 }
937
938 fn get_mv(&self, bx: usize, blk: usize) -> MV { self.mvs[self.mv_off + bx * 4 + blk] }
939 fn zero(&mut self, bx: usize) {
940 let pos = self.mv_off + bx * 4;
941 self.mvs[pos + 0] = ZERO_MV;
942 self.mvs[pos + 1] = ZERO_MV;
943 self.mvs[pos + 2] = ZERO_MV;
944 self.mvs[pos + 3] = ZERO_MV;
945 }
946 }
947
948 struct Bink2Codes {
949 ac_cb1: Codebook<u8>,
950 ac_cb2: Codebook<u8>,
951 mv_cb: Codebook<i8>,
952 val_cb1: Codebook<u8>,
953 val_cb2: Codebook<u8>,
954 skip_cb1: Codebook<u8>,
955 skip_cb2: Codebook<u8>,
956 quant_cb: Codebook<u8>,
957 }
958
959 fn map_ac(idx: usize) -> u8 { idx as u8 }
960 fn map_mv(idx: usize) -> i8 { BINK2_MV_SYMS[idx] }
961
962 impl Default for Bink2Codes {
963 fn default() -> Self {
964 let mut cbr = TableCodebookDescReader::new(BINK2_AC_CODES1, BINK2_AC_BITS1, map_ac);
965 let ac_cb1 = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
966 let mut cbr = TableCodebookDescReader::new(BINK2_AC_CODES2, BINK2_AC_BITS2, map_ac);
967 let ac_cb2 = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
968 let mut cbr = TableCodebookDescReader::new(BINK2_MV_CODES, BINK2_MV_BITS, map_mv);
969 let mv_cb = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
970 let mut cbr = TableCodebookDescReader::new(BINK2_AC_VAL_CODES1, BINK2_AC_VAL_BITS1, map_ac);
971 let val_cb1 = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
972 let mut cbr = TableCodebookDescReader::new(BINK2_AC_VAL_CODES2, BINK2_AC_VAL_BITS2, map_ac);
973 let val_cb2 = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
974 let mut cbr = TableCodebookDescReader::new(BINK2_AC_SKIP_CODES1, BINK2_AC_SKIP_BITS1, map_ac);
975 let skip_cb1 = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
976 let mut cbr = TableCodebookDescReader::new(BINK2_AC_SKIP_CODES2, BINK2_AC_SKIP_BITS2, map_ac);
977 let skip_cb2 = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
978 let mut cbr = TableCodebookDescReader::new(BINK2_QUANT_CODES, BINK2_QUANT_BITS, map_ac);
979 let quant_cb = Codebook::new(&mut cbr, CodebookMode::LSB).unwrap();
980 Self { ac_cb1, ac_cb2, mv_cb, val_cb1, val_cb2, skip_cb1, skip_cb2, quant_cb }
981 }
982 }
983
984 #[derive(Default)]
985 struct Bink2Decoder {
986 info: Rc<NACodecInfo>,
987 ips: IPShuffler,
988
989 version: u32,
990 key_frame: bool,
991 cur_w: usize,
992 cur_h: usize,
993 qinfo: QuantInfo,
994 y_dcs: YDCInfo,
995 u_dcs: CDCInfo,
996 v_dcs: CDCInfo,
997 mvs: MVInfo,
998
999 codes: Bink2Codes,
1000 }
1001
1002 impl Bink2Decoder {
1003 fn new() -> Self {
1004 Self::default()
1005 }
1006
1007 fn decode_frame_new(&mut self, br: &mut BitReader, buf: &mut NAVideoBuffer<u8>, is_intra: bool) -> DecoderResult<()> {
1008 let (stride_y, stride_u, stride_v) = (buf.get_stride(0), buf.get_stride(1), buf.get_stride(2));
1009 let (mut off_y, mut off_u, mut off_v) = (buf.get_offset(0), buf.get_offset(1), buf.get_offset(2));
1010 let (ooff_y, ooff_u, ooff_v) = (off_y, off_u, off_v);
1011 let (width, height) = buf.get_dimensions(0);
1012 let mut data = buf.get_data_mut();
1013 let dst = data.as_mut_slice();
1014 let bw = (width + 31) >> 5;
1015 let bh = (height + 31) >> 6;
1016 self.cur_w = (width + 7) & !7;
1017 self.cur_h = ((height + 7) & !7) >> 1;
1018
1019 let frame_flags = br.read(32)?;
1020 let offset2 = br.read(32)?;
1021 if (frame_flags & 0x80000) != 0 {
1022 println!("fill {:X}", frame_flags);
1023 unimplemented!();
1024 }
1025 for slice_no in 0..2 {
1026 if slice_no == 1 {
1027 br.seek(offset2 * 8)?;
1028 off_y = ooff_y + stride_y * bh * 32;
1029 off_u = ooff_u + stride_u * bh * 16;
1030 off_v = ooff_v + stride_v * bh * 16;
1031 }
1032 let mut row_flags: Vec<u8> = Vec::with_capacity(height >> 3);
1033 let mut col_flags: Vec<u8> = Vec::with_capacity(width >> 3);
1034 if (frame_flags & 0x1000) != 0 {
1035 if (frame_flags & 0x8000) != 0 {
1036 decode_flags(br, &mut row_flags, 1, (height >> 3) - 1)?;
1037 }
1038 if (frame_flags & 0x4000) != 0 {
1039 decode_flags(br, &mut col_flags, 1, (width >> 3) - 1)?;
1040 }
1041 }
1042 row_flags.resize(height >> 3, 0);
1043 col_flags.resize(width >> 3, 0);
1044 //store frame_flags * 8 & 0x7F8
1045
1046 let mut row_state = frame_flags & 0x2E000;
1047 if is_intra {
1048 row_state |= 0x10000;
1049 }
1050 self.qinfo.resize(bw);
1051 self.y_dcs.resize(bw);
1052 self.u_dcs.resize(bw);
1053 self.v_dcs.resize(bw);
1054 self.mvs.resize(bw);
1055 for by in 0..bh {
1056 let mut cbp_y = 0;
1057 let mut cbp_u = 0;
1058 let mut cbp_v = 0;
1059 let mut cbp_y_p = 0;
1060 let mut cbp_u_p = 0;
1061 let mut cbp_v_p = 0;
1062 let mut q_y = 8;
1063 let mut q_u = 8;
1064 let mut q_v = 8;
1065 let mut q_y_p = 8;
1066 let mut q_u_p = 8;
1067 let mut q_v_p = 8;
1068 let rflags = (row_flags[by >> 1] >> (if (by & 1) != 0 { 4 } else { 0 })) as u32;
1069 row_state = (row_state & 0x3FFFFFF) | ((row_state >> 4) & 0xC000000) | (rflags << 28);
1070 if by == 0 {
1071 row_state |= 0x80;
1072 // } else {
1073 // row_state |= 0x8;
1074 }
1075 if by + 2 >= bh {
1076 row_state |= 0x100;
1077 }
1078
1079 let mut btype_lru: [u8; 4] = [ 2, 3, 1, 0 ];
1080 let mut edge_state = 0;
1081 let is_top = by == 0;
1082 for bx in 0..bw {
1083 let mut blk_state = row_state | (edge_state & 0x3FC0000);
1084 if bx == 0 {
1085 blk_state |= 0x20;
1086 }
1087 if bx + 2 < bw {
1088 blk_state |= 0x40;
1089 }
1090 if (bx & 1) != 0 {
1091 blk_state |= 0x200;
1092 }
1093 let clflags = (col_flags[bx >> 1] >> (if (bx & 1) != 0 { 4 } else { 0 })) as u32;
1094 let edge_state_c = ((blk_state >> 4) & 0x3C0000) | (blk_state & 0xFC03FFFF) | ((clflags & 0xF) << 22);
1095 let edge_state_y = (frame_flags & 0x40000) | (blk_state & 0x3FFFF);
1096 edge_state = edge_state_c;
1097
1098 //let is_top = (edge_state & 0x88) != 0;
1099 let is_left = bx == 0; //(edge_state & 0x20) != 0;
1100
1101 let btype;
1102 if is_intra {
1103 btype = 0;
1104 } else {
1105 if (blk_state & 0x2000) != 0 {
1106 let val = br.read_code(UintCodeType::LimitedUnary(3, 1))?;
1107 match val {
1108 0 => {
1109 btype = btype_lru[0];
1110 },
1111 1 => {
1112 btype = btype_lru[1];
1113 btype_lru[1] = btype_lru[0];
1114 btype_lru[0] = btype;
1115 },
1116 2 => {
1117 btype = btype_lru[3];
1118 btype_lru[3] = btype_lru[2];
1119 btype_lru[2] = btype;
1120 },
1121 3 => {
1122 btype = btype_lru[2];
1123 btype_lru[2] = btype_lru[1];
1124 btype_lru[1] = btype;
1125 },
1126 _ => unreachable!(),
1127 };
1128 } else {
1129 btype = br.read(2)? as u8;
1130 }
1131 }
1132 if !is_intra {
1133 let q = self.qinfo.pred_quant(bx * 2, is_top);
1134 self.qinfo.set_quant(bx * 2, q);
1135 let q = self.qinfo.pred_quant(bx * 2 + 1, is_top);
1136 self.qinfo.set_quant(bx * 2 + 1, q);
1137 }
1138 match btype {
1139 0 => { // intra
1140 if (frame_flags & 0x2000) != 0 {
1141 let mut yblk: [[[i32; 64]; 4]; 4] = [[[0; 64]; 4]; 4];
1142 let mut ublk: [[i32; 64]; 4] = [[0; 64]; 4];
1143 let mut vblk: [[i32; 64]; 4] = [[0; 64]; 4];
1144 let q = get_new_quant(br, self.qinfo.pred_quant(bx * 2, is_top))?;
1145 self.qinfo.set_quant(bx * 2, q);
1146 cbp_y = decode_luma_intra(br, &self.codes, cbp_y, q, &mut yblk, edge_state_y, &mut self.y_dcs, bx)?;
1147 cbp_v = decode_chroma_intra(br, &self.codes, cbp_v, q, &mut vblk, edge_state_c, &mut self.v_dcs, bx)?;
1148 cbp_u = decode_chroma_intra(br, &self.codes, cbp_u, q, &mut ublk, edge_state_c, &mut self.u_dcs, bx)?;
1149 //if smth decode one more y
1150 //if smth else decode one more y
1151 Bink2DSP::put_mb4(dst, off_y + bx * 32 + 0 + 0 * stride_y, stride_y, &mut yblk[0]);
1152 Bink2DSP::put_mb4(dst, off_y + bx * 32 + 16 + 0 * stride_y, stride_y, &mut yblk[1]);
1153 Bink2DSP::put_mb4(dst, off_y + bx * 32 + 0 + 16 * stride_y, stride_y, &mut yblk[2]);
1154 Bink2DSP::put_mb4(dst, off_y + bx * 32 + 16 + 16 * stride_y, stride_y, &mut yblk[3]);
1155 Bink2DSP::put_mb4(dst, off_u + bx * 16, stride_u, &mut ublk);
1156 Bink2DSP::put_mb4(dst, off_v + bx * 16, stride_v, &mut vblk);
1157 } else {
1158 let mut yblk: [[[f32; 64]; 4]; 4] = [[[0.0; 64]; 4]; 4];
1159 let mut ublk: [[f32; 64]; 4] = [[0.0; 64]; 4];
1160 let mut vblk: [[f32; 64]; 4] = [[0.0; 64]; 4];
1161 cbp_y = decode_luma_intra_old(br, &self.codes, cbp_y, &mut yblk, edge_state_y, &mut self.y_dcs, bx, &mut q_y)?;
1162 cbp_v = decode_chroma_intra_old(br, &self.codes, cbp_v, &mut vblk, edge_state_c, &mut self.v_dcs, bx, &mut q_v)?;
1163 cbp_u = decode_chroma_intra_old(br, &self.codes, cbp_u, &mut ublk, edge_state_c, &mut self.u_dcs, bx, &mut q_u)?;
1164 Bink2DSP::put_mb4_old(dst, off_y + bx * 32 + 0 + 0 * stride_y, stride_y, &mut yblk[0]);
1165 Bink2DSP::put_mb4_old(dst, off_y + bx * 32 + 16 + 0 * stride_y, stride_y, &mut yblk[1]);
1166 Bink2DSP::put_mb4_old(dst, off_y + bx * 32 + 0 + 16 * stride_y, stride_y, &mut yblk[2]);
1167 Bink2DSP::put_mb4_old(dst, off_y + bx * 32 + 16 + 16 * stride_y, stride_y, &mut yblk[3]);
1168 Bink2DSP::put_mb4_old(dst, off_u + bx * 16, stride_u, &mut ublk);
1169 Bink2DSP::put_mb4_old(dst, off_v + bx * 16, stride_v, &mut vblk);
1170 }
1171 if !is_intra {
1172 self.mvs.predict_mvs(bx, is_top, is_left, (frame_flags & 0x2000) != 0);
1173 }
1174 },
1175 1 => { // skip
1176 if let Some(ref ref_pic) = self.ips.get_ref() {
1177 for blk_no in 0..4 {
1178 let xoff = bx * 32 + (blk_no & 1) * 16;
1179 let yoff = slice_no * bh * 32 + by * 32 + (blk_no & 2) * 8;
1180 Bink2DSP::mc_luma(&mut dst[off_y..], stride_y, ref_pic, xoff, yoff, ZERO_MV, 0)?;
1181 Bink2DSP::mc_chroma(&mut dst[off_u..], stride_u, ref_pic, xoff >> 1, yoff >> 1, ZERO_MV, 1)?;
1182 Bink2DSP::mc_chroma(&mut dst[off_v..], stride_v, ref_pic, xoff >> 1, yoff >> 1, ZERO_MV, 2)?;
1183 }
1184 } else {
1185 return Err(DecoderError::MissingReference);
1186 }
1187 self.mvs.zero(bx);
1188 },
1189 2 => { // motion
1190 if (frame_flags & 0x2000) != 0 {
1191 self.mvs.decode_mv_new(br, &self.codes.mv_cb, bx, is_top, is_left)?;
1192 } else {
1193 self.mvs.decode_mv_old(br, bx, is_top, is_left)?;
1194 }
1195 if let Some(ref ref_pic) = self.ips.get_ref() {
1196 for blk_no in 0..4 {
1197 let xoff = bx * 32 + (blk_no & 1) * 16;
1198 let yoff = slice_no * bh * 32 + by * 32 + (blk_no & 2) * 8;
1199 let mv = self.mvs.get_mv(bx, blk_no);
1200 Bink2DSP::mc_luma(&mut dst[off_y..], stride_y, ref_pic, xoff, yoff, mv, 0)?;
1201 Bink2DSP::mc_chroma(&mut dst[off_u..], stride_u, ref_pic, xoff >> 1, yoff >> 1, mv, 1)?;
1202 Bink2DSP::mc_chroma(&mut dst[off_v..], stride_v, ref_pic, xoff >> 1, yoff >> 1, mv, 2)?;
1203 }
1204 } else {
1205 return Err(DecoderError::MissingReference);
1206 }
1207 },
1208 3 => { // inter
1209 if (frame_flags & 0x2000) != 0 {
1210 self.mvs.decode_mv_new(br, &self.codes.mv_cb, bx, is_top, is_left)?;
1211 } else {
1212 self.mvs.decode_mv_old(br, bx, is_top, is_left)?;
1213 }
1214 if let Some(ref ref_pic) = self.ips.get_ref() {
1215 for blk_no in 0..4 {
1216 let xoff = bx * 32 + (blk_no & 1) * 16;
1217 let yoff = slice_no * bh * 32 + by * 32 + (blk_no & 2) * 8;
1218 let mv = self.mvs.get_mv(bx, blk_no);
1219 Bink2DSP::mc_luma(&mut dst[off_y..], stride_y, ref_pic, xoff, yoff, mv, 0)?;
1220 Bink2DSP::mc_chroma(&mut dst[off_u..], stride_u, ref_pic, xoff >> 1, yoff >> 1, mv, 1)?;
1221 Bink2DSP::mc_chroma(&mut dst[off_v..], stride_v, ref_pic, xoff >> 1, yoff >> 1, mv, 2)?;
1222 }
1223 } else {
1224 return Err(DecoderError::MissingReference);
1225 }
1226 if (frame_flags & 0x2000) != 0 {
1227 let mut yblk: [[[i32; 64]; 4]; 4] = [[[0; 64]; 4]; 4];
1228 let mut ublk: [[i32; 64]; 4] = [[0; 64]; 4];
1229 let mut vblk: [[i32; 64]; 4] = [[0; 64]; 4];
1230 let q = get_new_quant(br, self.qinfo.pred_quant(bx * 2 + 1, is_top))?;
1231 self.qinfo.set_quant(bx * 2 + 1, q);
1232 cbp_y_p = decode_luma_inter(br, &self.codes, cbp_y_p, q, &mut yblk, edge_state_y, &mut self.y_dcs)?;
1233 if br.read_bool()? {
1234 cbp_v_p = decode_chroma_inter(br, &self.codes, cbp_v_p, q, &mut vblk, edge_state_y, &mut self.v_dcs)?;
1235 cbp_u_p = decode_chroma_inter(br, &self.codes, cbp_u_p, q, &mut ublk, edge_state_y, &mut self.u_dcs)?;
1236 } else {
1237 cbp_v_p = 0;
1238 cbp_u_p = 0;
1239 }
1240 Bink2DSP::add_mb4(dst, off_y + bx * 32 + 0 + 0 * stride_y, stride_y, &mut yblk[0]);
1241 Bink2DSP::add_mb4(dst, off_y + bx * 32 + 16 + 0 * stride_y, stride_y, &mut yblk[1]);
1242 Bink2DSP::add_mb4(dst, off_y + bx * 32 + 0 + 16 * stride_y, stride_y, &mut yblk[2]);
1243 Bink2DSP::add_mb4(dst, off_y + bx * 32 + 16 + 16 * stride_y, stride_y, &mut yblk[3]);
1244 Bink2DSP::add_mb4(dst, off_u + bx * 16, stride_u, &mut ublk);
1245 Bink2DSP::add_mb4(dst, off_v + bx * 16, stride_v, &mut vblk);
1246 } else {
1247 let mut yblk: [[[f32; 64]; 4]; 4] = [[[0.0; 64]; 4]; 4];
1248 let mut ublk: [[f32; 64]; 4] = [[0.0; 64]; 4];
1249 let mut vblk: [[f32; 64]; 4] = [[0.0; 64]; 4];
1250 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)?;
1251 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)?;
1252 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)?;
1253 Bink2DSP::add_mb4_old(dst, off_y + bx * 32 + 0 + 0 * stride_y, stride_y, &mut yblk[0]);
1254 Bink2DSP::add_mb4_old(dst, off_y + bx * 32 + 16 + 0 * stride_y, stride_y, &mut yblk[1]);
1255 Bink2DSP::add_mb4_old(dst, off_y + bx * 32 + 0 + 16 * stride_y, stride_y, &mut yblk[2]);
1256 Bink2DSP::add_mb4_old(dst, off_y + bx * 32 + 16 + 16 * stride_y, stride_y, &mut yblk[3]);
1257 Bink2DSP::add_mb4_old(dst, off_u + bx * 16, stride_u, &mut ublk);
1258 Bink2DSP::add_mb4_old(dst, off_v + bx * 16, stride_v, &mut vblk);
1259 }
1260 },
1261 _ => unreachable!(),
1262 };
1263 if btype != 0 {
1264 let src = &dst[off_y + bx * 32..];
1265 let dc5 = Bink2DSP::calc_dc(&src[24..], stride_y);
1266 let dc7 = Bink2DSP::calc_dc(&src[24 + stride_y * 8..], stride_y);
1267 let dc13 = Bink2DSP::calc_dc(&src[24 + stride_y * 16..], stride_y);
1268 let dc10 = Bink2DSP::calc_dc(&src[ 0 + stride_y * 24..], stride_y);
1269 let dc11 = Bink2DSP::calc_dc(&src[ 8 + stride_y * 24..], stride_y);
1270 let dc14 = Bink2DSP::calc_dc(&src[16 + stride_y * 24..], stride_y);
1271 let dc15 = Bink2DSP::calc_dc(&src[24 + stride_y * 24..], stride_y);
1272 self.y_dcs.set_dcs(bx, dc5, dc7, dc13, dc10, dc11, dc14, dc15);
1273 let src = &dst[off_u + bx * 16..];
1274 let dc1 = Bink2DSP::calc_dc(&src[8..], stride_u);
1275 let dc2 = Bink2DSP::calc_dc(&src[0 + stride_u * 8..], stride_u);
1276 let dc3 = Bink2DSP::calc_dc(&src[8 + stride_u * 8..], stride_u);
1277 self.u_dcs.set_dcs(bx, dc1, dc2, dc3);
1278 let src = &dst[off_v + bx * 16..];
1279 let dc1 = Bink2DSP::calc_dc(&src[8..], stride_v);
1280 let dc2 = Bink2DSP::calc_dc(&src[0 + stride_v * 8..], stride_v);
1281 let dc3 = Bink2DSP::calc_dc(&src[8 + stride_v * 8..], stride_v);
1282 self.v_dcs.set_dcs(bx, dc1, dc2, dc3);
1283 }
1284 }
1285 self.qinfo.update_line();
1286 self.y_dcs.update_line();
1287 self.u_dcs.update_line();
1288 self.v_dcs.update_line();
1289 self.mvs.update_line();
1290 off_y += stride_y * 32;
1291 off_u += stride_u * 16;
1292 off_v += stride_v * 16;
1293 row_state = (row_state & !0x190) | ((row_state & 4) << 2);
1294 }
1295 }
1296 Ok(())
1297 }
1298 }
1299
1300 fn decode_flags(_br: &mut BitReader, _dst: &mut Vec<u8>, _start: usize, _nbits: usize) -> DecoderResult<u32> {
1301 unimplemented!();
1302 /* if !br.read_bool()? { // read bits into byte array?
1303 if nbits == 0 { return Ok(()); }
1304 if nbits < 9 {
1305 shift = in_shift;
1306 pfx = 0;
1307 } else {
1308 shift = in_shift;
1309 loop {
1310 pfx |= br.read(8)? << shift;
1311 dst.push((pfx & 0xFF) as u8);
1312 pfx >>= 8;
1313 shift -= 8;
1314 }
1315 }
1316 let val = br.read(cur_nbits)?;
1317 dst.push(pfx | (val << shift))
1318 } else {
1319 let mut cur_bits = nbits;
1320 let mut mode = 0;
1321 let mut lastbit = 0;
1322 while cur_bits > 0 {
1323 if !br.read_bool()? {
1324 lastbit = if mode == 3 { lastbit ^ 1 } else { br.read(1)? };
1325 let val1 = lastval | (lastbit << shift);
1326 let val2 = br.read(if cur_bits > 4 { 4 } else { cur_bits });
1327 let val = lastval | (lastbit << shift) | (val2 << (shift + 1));
1328 mode = 2;
1329 if oshift >= 8 {
1330 dst.push((val & 0xFF) as u8);
1331 oshift -= 8;
1332 val >>= 8;
1333 }
1334 lastval = val;
1335 } else {
1336 let bread;
1337 if cur_bits < 4 {
1338 bread = 2;
1339 } else if cur_bits < 16 {
1340 bread = 4;
1341 } else {
1342 bread = 4 | 1;
1343 }
1344 lastbit = if mode == 3 { lastbit ^ 1 } else { br.read(1)? };
1345 run = (if mode == 3 { bread + 1 } else { bread + 2 }).min(cur_bits);
1346 if run == cur_bits {
1347 output lastbit x run
1348 } else {
1349 let add_run = br.read(bread)? as usize;
1350 run += add_run;
1351 output lastbit x run
1352 mode = if add_run == (1 << bread) - 1 { 3 } else { 1 };
1353 }
1354 }
1355 }
1356 }
1357 Ok(())*/
1358 }
1359
1360 fn get_new_quant(br: &mut BitReader, prev_q: u8) -> DecoderResult<u8> {
1361 let mut code = br.read_code(UintCodeType::LimitedUnary(4, 1))? as u8;
1362 if code == 0 {
1363 Ok(prev_q)
1364 } else {
1365 if code == 3 {
1366 code += br.read(1)? as u8;
1367 } else if code == 4 {
1368 code = (br.read(5)? as u8) + 5;
1369 }
1370 let ret;
1371 if !br.read_bool()? {
1372 ret = prev_q.checked_add(code);
1373 } else {
1374 ret = prev_q.checked_sub(code);
1375 }
1376 validate!(ret.is_some());
1377 let val = ret.unwrap();
1378 validate!(val < (BINK2_QUANT_DC.len() as u8));
1379 Ok(val)
1380 }
1381 }
1382
1383 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> {
1384 let cbp = decode_cbp_luma(br, prev_cbp, edge_state)?;
1385 let _coded = dcinfo.decode_dcs(br, q)?;
1386 dcinfo.predict(bx, (edge_state & 0x88) != 0, (edge_state & 0x20) != 0, 0, 0x7FF);
1387 let dcs = &dcinfo.dcs;
1388 for i in 0..4 {
1389 decode_acs_4blocks(br, codes, &mut dst[i], BINK2_QUANT_INTRA_LUMA, q, cbp >> (i * 4))?;
1390 for j in 0..4 { dst[i][j][0] = dcs[i * 4 + j] * 8 + 32; }
1391 }
1392 Ok(cbp)
1393 }
1394
1395 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> {
1396 let cbp = decode_cbp_chroma(br, prev_cbp)?;
1397 let _coded = dcinfo.decode_dcs(br, q)?;
1398 dcinfo.predict(bx, (edge_state & 0x88) != 0, (edge_state & 0x20) != 0, 0, 0x7FF);
1399 decode_acs_4blocks(br, codes, dst, BINK2_QUANT_INTRA_CHROMA, q, cbp)?;
1400 let dcs = &dcinfo.dcs;
1401 for i in 0..4 { dst[i][0] = dcs[i] * 8 + 32; }
1402 Ok(cbp)
1403 }
1404
1405 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> {
1406 let cbp = decode_cbp_luma(br, prev_cbp, edge_state)?;
1407 let (min_dc, max_dc) = if (edge_state & 0x40000) != 0 { (-0x7FF, 0x7FF) } else { (-0x3FF, 0x3FF) };
1408 let _coded = dcinfo.decode_dcs(br, q)?;
1409 dcinfo.predict_inter(min_dc, max_dc);
1410 let dcs = &dcinfo.dcs;
1411 for i in 0..4 {
1412 decode_acs_4blocks(br, codes, &mut dst[i], BINK2_QUANT_INTER, q, cbp >> (i * 4))?;
1413 for j in 0..4 { dst[i][j][0] = dcs[i * 4 + j]; }
1414 }
1415 Ok(cbp)
1416 }
1417
1418 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> {
1419 let cbp = decode_cbp_chroma(br, prev_cbp)?;
1420 let (min_dc, max_dc) = if (edge_state & 0x40000) != 0 { (-0x7FF, 0x7FF) } else { (-0x3FF, 0x3FF) };
1421 let _coded = dcinfo.decode_dcs(br, q)?;
1422 dcinfo.predict_inter(min_dc, max_dc);
1423 let dcs = &dcinfo.dcs;
1424 decode_acs_4blocks(br, codes, dst, BINK2_QUANT_INTER, q, cbp)?;
1425 for i in 0..4 { dst[i][0] = dcs[i]; }
1426 Ok(cbp)
1427 }
1428
1429 fn decode_cbp_luma(br: &mut BitReader, prev_cbp: u32, edge_state: u32) -> DecoderResult<u32> {
1430 let cnt = (prev_cbp as u16).count_ones() as usize;
1431 let (min_count, mask) = if cnt < 8 { (cnt, 0x0000) } else { (16 - cnt, 0xFFFF) };
1432
1433 let mut cbp;
1434 if br.read_bool()? {
1435 cbp = 0;
1436 } else if min_count >= 4 {
1437 cbp = br.read(16)?;
1438 } else {
1439 cbp = 0;
1440 for i in 0..4 {
1441 if !br.read_bool()? {
1442 let cbp4 = br.read(4)?;
1443 cbp |= cbp4 << (i * 4);
1444 }
1445 }
1446 }
1447 cbp ^= mask;
1448 if ((edge_state & 0x40000) == 0) || (cbp != 0) {
1449 if br.read_bool()? {
1450 cbp |= cbp << 16;
1451 }
1452 }
1453 Ok(cbp)
1454 }
1455 fn decode_cbp_chroma(br: &mut BitReader, last_cbp: u32) -> DecoderResult<u32> {
1456 if br.read_bool()? {
1457 Ok((last_cbp & 0xF0000) | BINK2_CHROMA_CBPS[(last_cbp & 0xF) as usize])
1458 } else {
1459 let ncbp = br.read(4)?;
1460 if br.read_bool()? {
1461 Ok(ncbp | (ncbp << 16))
1462 } else {
1463 Ok(ncbp)
1464 }
1465 }
1466 }
1467
1468 trait ReadBink2Code {
1469 fn read_bink2_code_zero(&mut self) -> DecoderResult<i32>;
1470 fn read_bink2_code_nz(&mut self) -> DecoderResult<i32>;
1471 }
1472
1473 impl<'a> ReadBink2Code for BitReader<'a> {
1474 fn read_bink2_code_zero(&mut self) -> DecoderResult<i32> {
1475 let pfx = self.read_code(UintCodeType::LimitedUnary(12, 0))? as i32;
1476 if pfx > 0 {
1477 let val: i32;
1478 if pfx >= 4 {
1479 let add_bits = self.read((pfx as u8) - 3)? as i32;
1480 val = (1 << (pfx - 3)) + add_bits + 2;
1481 } else {
1482 val = pfx;
1483 }
1484 Ok(val)
1485 } else {
1486 Ok(0)
1487 }
1488 }
1489 fn read_bink2_code_nz(&mut self) -> DecoderResult<i32> {
1490 let pfx = self.read_code(UintCodeType::LimitedUnary(12, 0))? + 1;
1491 let val: i32;
1492 if pfx >= 4 {
1493 let add_bits = self.read((pfx as u8) - 3)? as i32;
1494 val = (1 << (pfx - 3)) + add_bits + 2;
1495 } else {
1496 val = pfx as i32;
1497 }
1498 if self.read_bool()? {
1499 Ok(-val)
1500 } else {
1501 Ok(val)
1502 }
1503 }
1504 }
1505
1506 fn decode_acs_4blocks(br: &mut BitReader, codes: &Bink2Codes, dst: &mut [[i32; 64]; 4], quant_mat: &[[i32; 64]; 4], q: u8, cbp: u32) -> DecoderResult<()> {
1507 let cb = if (cbp >> 16) != 0 { &codes.ac_cb1 } else { &codes.ac_cb2 };
1508 let qmat = &quant_mat[(q & 3) as usize];
1509 let shift = q >> 2;
1510 for blk_no in 0..4 {
1511 if ((cbp >> blk_no) & 1) == 0 { continue; }
1512 let mut esc_len = 0;
1513 let mut idx = 1;
1514 while idx < 64 {
1515 if esc_len >= 1 {
1516 esc_len -= 1;
1517 } else {
1518 let sym = br.read_cb(cb)?;
1519 let skip;
1520 if sym == 11 {
1521 skip = br.read(6)? as usize;
1522 } else {
1523 skip = BINK2_AC_RUNS[sym as usize];
1524 }
1525 idx += skip;
1526 if idx > 63 { break; }
1527 esc_len = if sym == 13 { 6 } else { 0 };
1528 }
1529 let level = br.read_bink2_code_nz()?;
1530 let pos = BINK2_ZIGZAG[idx];
1531 dst[blk_no][pos] = (((level * qmat[pos]) << shift) + 0x40) >> 7;
1532 idx += 1;
1533 }
1534 // set blk info to (dc & 0x1FFF) | (intra ? 0x8000 : 0) | (((ncoded == 0) + (ncoded < 4) + (ncoded < 8)) << 13)
1535 }
1536 Ok(())
1537 }
1538
1539 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> {
1540 let cbp = decode_cbp_luma_old(br, prev_cbp)?;
1541 let q = decode_quant_old(br, &codes.quant_cb, *old_q)?;
1542 *old_q = q;
1543 let is_top = (edge_state & 0x88) != 0;
1544 let is_left = (edge_state & 0x20) != 0;
1545 decode_dcs_old(br, &mut dcinfo.dc_buf, q, is_top && is_left)?;
1546 dcinfo.predict(bx, is_top, is_left, 0, 0x7FF);
1547 let dcs = &dcinfo.dcs;
1548 for i in 0..4 {
1549 decode_acs_4blocks_old(br, codes, &mut dst[i], BINK2_QMAT_INTRA_LUMA_OLD, q, cbp >> (i * 4), BINK2_LUMA_SCAN_OLD)?;
1550 for j in 0..4 { dst[i][j][0] = (dcs[i * 4 + j] as f32) * 0.125; }
1551 }
1552 Ok(cbp)
1553 }
1554
1555 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> {
1556 let cbp = decode_cbp_chroma_old(br, prev_cbp)?;
1557 let q = decode_quant_old(br, &codes.quant_cb, *old_q)?;
1558 *old_q = q;
1559 let is_top = (edge_state & 0x88) != 0;
1560 let is_left = (edge_state & 0x20) != 0;
1561 decode_dcs_old(br, &mut dcinfo.dc_buf, q, is_top && is_left)?;
1562 dcinfo.predict(bx, is_top, is_left, 0, 0x7FF);
1563 decode_acs_4blocks_old(br, codes, dst, BINK2_QMAT_CHROMA_OLD, q, cbp, BINK2_CHROMA_SCAN_OLD)?;
1564 let dcs = &dcinfo.dcs;
1565 for i in 0..4 { dst[i][0] = (dcs[i] as f32) * 0.125; }
1566 Ok(cbp)
1567 }
1568
1569
1570 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> {
1571 let cbp = decode_cbp_luma_old(br, prev_cbp)?;
1572 let q = decode_quant_old(br, &codes.quant_cb, *old_q)?;
1573 *old_q = q;
1574 decode_dcs_old(br, &mut dcinfo.dc_buf, q, false)?;
1575 dcinfo.predict_inter(-1023, 1023);
1576 let dcs = &dcinfo.dcs;
1577 for i in 0..4 {
1578 decode_acs_4blocks_old(br, codes, &mut dst[i], BINK2_QMAT_INTER_LUMA_OLD, q, cbp >> (i * 4), BINK2_LUMA_SCAN_OLD)?;
1579 for j in 0..4 { dst[i][j][0] = (dcs[i * 4 + j] as f32) * 0.125; }
1580 }
1581 Ok(cbp)
1582 }
1583
1584 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> {
1585 let cbp = decode_cbp_chroma_old(br, prev_cbp)?;
1586 let q = decode_quant_old(br, &codes.quant_cb, *old_q)?;
1587 *old_q = q;
1588 decode_dcs_old(br, &mut dcinfo.dc_buf, q, false)?;
1589 dcinfo.predict_inter(-1023, 1023);
1590 let dcs = &dcinfo.dcs;
1591 decode_acs_4blocks_old(br, codes, dst, BINK2_QMAT_CHROMA_OLD, q, cbp, BINK2_CHROMA_SCAN_OLD)?;
1592 for i in 0..4 { dst[i][0] = (dcs[i] as f32) * 0.125; }
1593 Ok(cbp)
1594 }
1595
1596 fn decode_quant_old(br: &mut BitReader, quant_cb: &Codebook<u8>, prev_quant: u8) -> DecoderResult<u8> {
1597 let diff = br.read_cb(quant_cb)?;
1598 if diff == 0 {
1599 Ok(prev_quant)
1600 } else {
1601 let res;
1602 if br.read_bool()? {
1603 res = prev_quant.checked_sub(diff);
1604 } else {
1605 res = prev_quant.checked_add(diff);
1606 }
1607 validate!(res.is_some());
1608 let q = res.unwrap();
1609 validate!(q < 16);
1610 Ok(q)
1611 }
1612 }
1613
1614 fn decode_cbp_luma_old(br: &mut BitReader, prev_cbp: u32) -> DecoderResult<u32> {
1615 let low;
1616 if br.read_bool()? {
1617 if br.read_bool()? {
1618 return Ok(prev_cbp);
1619 }
1620 low = prev_cbp & 0xFFFF;
1621 } else {
1622 let mut nib1 = (prev_cbp >> 4) & 0xF;
1623 if !br.read_bool()? {
1624 nib1 = br.read(4)?;
1625 }
1626 let mut new_cbp = nib1;
1627 if !br.read_bool()? {
1628 nib1 = br.read(4)?;
1629 }
1630 new_cbp = new_cbp | (nib1 << 4);
1631 if !br.read_bool()? {
1632 nib1 = br.read(4)?;
1633 }
1634 new_cbp = new_cbp | (nib1 << 8);
1635 if !br.read_bool()? {
1636 nib1 = br.read(4)?;
1637 }
1638 low = new_cbp | (nib1 << 12);
1639 }
1640 let mut nib_hi = (prev_cbp >> 20) & 0xF;
1641 let mut high = 0;
1642 for i in 0..4 {
1643 let nib = (low >> (4 * i)) & 0xF;
1644 if nib.count_ones() == 0 {
1645 nib_hi = 0;
1646 } else if (nib.count_ones() == 1) || !br.read_bool()? {
1647 nib_hi = 0;
1648 for bit in 0..4 {
1649 if (((nib >> bit) & 1) != 0) && br.read_bool()? {
1650 nib_hi |= 1 << bit;
1651 }
1652 }
1653 }
1654 nib_hi &= nib;
1655 high = (high >> 4) | (nib_hi << 28);
1656 }
1657 Ok(low | high)
1658 }
1659
1660 fn decode_cbp_chroma_old(br: &mut BitReader, prev_cbp: u32) -> DecoderResult<u32> {
1661 let low;
1662 if !br.read_bool()? {
1663 low = br.read(4)?;
1664 } else {
1665 if br.read_bool()? {
1666 return Ok(prev_cbp);
1667 }
1668 low = prev_cbp & 0xF;
1669 }
1670 let mut high;
1671 if low.count_ones() == 0 {
1672 return Ok(low);
1673 }
1674 if low.count_ones() != 1 {
1675 high = (prev_cbp >> 16) & low;
1676 if br.read_bool()? {
1677 return Ok((high << 16) | low);
1678 }
1679 }
1680 high = 0;
1681 for bit in 0..4 {
1682 if (((low >> bit) & 1) != 0) && br.read_bool()? {
1683 high |= 1 << bit;
1684 }
1685 }
1686 Ok((high << 16) | low)
1687 }
1688
1689 fn decode_dcs_old(br: &mut BitReader, dcs: &mut [i32], q: u8, read_bias: bool) -> DecoderResult<()> {
1690 let mut bits = br.read(3)? as u8;
1691 if bits == 7 {
1692 bits += br.read(2)? as u8;
1693 }
1694 let scale = BINK2_OLD_DC_QUANTS[q as usize];
1695 if bits == 0 {
1696 for el in dcs.iter_mut() { *el = 0; }
1697 } else {
1698 for dcb in dcs.chunks_mut(4) {
1699 for dc in dcb.iter_mut() {
1700 *dc = br.read(bits)? as i32;
1701 }
1702 for dc in dcb.iter_mut() {
1703 if *dc == 0 { continue; }
1704 *dc *= scale;
1705 if br.read_bool()? {
1706 *dc = -*dc;
1707 }
1708 }
1709 }
1710 }
1711 if read_bias {
1712 let add_bits = BINK2_DC_EXTRA_BITS[q as usize] + bits;
1713 if add_bits < 10 {
1714 let pfx = br.read(10 - add_bits)? as i32;
1715 let base_dc;
1716 if pfx > 0 {
1717 if br.read_bool()? {
1718 base_dc = -(pfx << bits);
1719 } else {
1720 base_dc = pfx << bits;
1721 }
1722 } else {
1723 base_dc = 0;
1724 }
1725 dcs[0] += base_dc * scale;
1726 }
1727 }
1728 Ok(())
1729 }
1730
1731 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<()> {
1732 let quant = BINK2_OLD_QUANTS[q as usize];
1733 for blk_no in 0..4 {
1734 if ((cbp >> blk_no) & 1) == 0 { continue; }
1735 let val_cb = if ((cbp >> (16 + blk_no)) & 1) != 0 { &codes.val_cb2 } else { &codes.val_cb1 };
1736 let skip_cb = if ((cbp >> (16 + blk_no)) & 1) != 0 { &codes.skip_cb2 } else { &codes.skip_cb1 };
1737 let mut esc_len = 0;
1738 let mut idx = 1;
1739 while idx < 64 {
1740 let val = br.read_cb(val_cb)?;
1741 if val != 0 {
1742 let mut level;
1743 if val >= 4 {
1744 let add_bits = br.read(val - 3)? as i32;
1745 level = (1 << (val - 3)) + add_bits + 2;
1746 } else {
1747 level = val as i32;
1748 }
1749 if br.read_bool()? {
1750 level = -level;
1751 }
1752 let pos = scan[idx];
1753 dst[blk_no][pos] = (level as f32) * quant_mat[idx] * quant;
1754 }
1755 idx += 1;
1756 if idx >= 64 { break; }
1757 if esc_len >= 1 {
1758 esc_len -= 1;
1759 } else {
1760 let sym = br.read_cb(skip_cb)?;
1761 let skip;
1762 if sym == 11 {
1763 skip = br.read(6)? as usize;
1764 } else {
1765 skip = BINK2_AC_RUNS[sym as usize];
1766 }
1767 idx += skip;
1768 if idx > 63 { break; }
1769 esc_len = if sym == 13 { 6 } else { 0 };
1770 }
1771 }
1772 }
1773 Ok(())
1774 }
1775
1776 impl NADecoder for Bink2Decoder {
1777 fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
1778 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
1779 let w = vinfo.get_width();
1780 let h = vinfo.get_height();
1781
1782 let edata = info.get_extradata().unwrap();
1783 validate!(edata.len() >= 8);
1784
1785 let mut mr = MemoryReader::new_read(&edata);
1786 let mut br = ByteReader::new(&mut mr);
1787 let magic = br.read_u32be()?;
1788 let _flags = br.read_u32le()?;
1789
1790 self.version = magic;
1791
1792 let fmt;
1793 fmt = NAPixelFormaton::new(ColorModel::YUV(YUVSubmodel::YUVJ),
1794 Some(NAPixelChromaton::new(0, 0, false, 8, 0, 0, 1)),
1795 Some(NAPixelChromaton::new(1, 1, false, 8, 0, 1, 1)),
1796 Some(NAPixelChromaton::new(1, 1, false, 8, 0, 2, 1)),
1797 None, None,
1798 0, 3);
1799 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
1800 self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
1801
1802 Ok(())
1803 } else {
1804 Err(DecoderError::InvalidData)
1805 }
1806 }
1807 fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
1808 let src = pkt.get_buffer();
1809
1810 let mut br = BitReader::new(&src, src.len(), BitReaderMode::LE);
1811
1812 let mut buf;
1813 self.key_frame = pkt.is_keyframe();
1814
1815 let bufret = alloc_video_buffer(self.info.get_properties().get_video_info().unwrap(), 4);
1816 if let Err(_) = bufret { return Err(DecoderError::InvalidData); }
1817 let bufinfo = bufret.unwrap();
1818 buf = bufinfo.get_vbuf().unwrap();
1819
1820 self.decode_frame_new(&mut br, &mut buf, pkt.is_keyframe())?;
1821 let bufinfo = NABufferType::Video(buf);
1822 self.ips.add_frame(bufinfo.get_vbuf().unwrap());
1823
1824 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
1825 frm.set_frame_type(if self.key_frame { FrameType::I } else { FrameType::P });
1826 Ok(Rc::new(RefCell::new(frm)))
1827 }
1828 }
1829
1830 pub fn get_decoder() -> Box<NADecoder> {
1831 Box::new(Bink2Decoder::new())
1832 }
1833
1834 #[cfg(test)]
1835 mod test {
1836 use nihav_core::codecs::RegisteredDecoders;
1837 use nihav_core::demuxers::RegisteredDemuxers;
1838 use nihav_core::test::dec_video::*;
1839 use crate::codecs::rad_register_all_codecs;
1840 use crate::demuxers::rad_register_all_demuxers;
1841 #[test]
1842 fn test_bink2() {
1843 let mut dmx_reg = RegisteredDemuxers::new();
1844 rad_register_all_demuxers(&mut dmx_reg);
1845 let mut dec_reg = RegisteredDecoders::new();
1846 rad_register_all_codecs(&mut dec_reg);
1847
1848 //let file = "assets/RAD/Open_Logos_partial.bik";
1849 //let file = "assets/RAD/sc13_01_partial.bk2";
1850 let file = "assets/RAD/ge_video_86l.bk2";
1851 //let file = "assets/RAD/eg_club_0.bk2";
1852 test_file_decoding("bink", file, Some(8), true, false, None/*Some("bink2")*/, &dmx_reg, &dec_reg);
1853 }
1854 }
1855
1856 const BINK2_ZIGZAG: [usize; 64] = [
1857 0, 8, 1, 2, 9, 16, 24, 17,
1858 10, 3, 4, 11, 18, 25, 32, 40,
1859 33, 26, 19, 12, 5, 6, 13, 20,
1860 27, 34, 41, 48, 56, 49, 42, 35,
1861 28, 21, 14, 7, 15, 22, 29, 36,
1862 43, 50, 57, 58, 51, 44, 37, 30,
1863 23, 31, 38, 45, 52, 59, 60, 53,
1864 46, 39, 47, 54, 61, 62, 55, 63
1865 ];
1866 const BINK2_LUMA_SCAN_OLD: &[usize; 64] = &[
1867 0, 2, 1, 8, 9, 17, 10, 16,
1868 24, 3, 18, 25, 32, 11, 33, 26,
1869 4, 40, 19, 12, 27, 41, 34, 5,
1870 20, 48, 6, 28, 15, 42, 23, 35,
1871 21, 13, 14, 7, 31, 43, 49, 36,
1872 22, 56, 39, 50, 30, 44, 29, 51,
1873 57, 47, 58, 59, 63, 61, 55, 38,
1874 52, 62, 45, 37, 60, 46, 54, 53
1875 ];
1876 const BINK2_CHROMA_SCAN_OLD: &[usize; 64] = &[
1877 0, 1, 8, 2, 9, 16, 10, 17,
1878 3, 24, 11, 18, 25, 13, 14, 4,
1879 15, 5, 6, 7, 12, 19, 20, 21,
1880 22, 23, 26, 27, 28, 29, 30, 31,
1881 32, 33, 34, 35, 36, 37, 38, 39,
1882 40, 41, 42, 43, 44, 45, 46, 47,
1883 48, 49, 50, 51, 52, 53, 54, 55,
1884 56, 57, 58, 59, 60, 61, 62, 63
1885 ];
1886
1887 const BINK2_CHROMA_CBPS: [u32; 16] = [
1888 0x0, 0x0, 0x0, 0xF,
1889 0x0, 0xF, 0xF, 0xF,
1890 0x0, 0xF, 0xF, 0xF,
1891 0xF, 0xF, 0xF, 0xF
1892 ];
1893
1894 const BINK2_QUANT_DC: [i32; 37] = [
1895 0x400, 0x4C2, 0x5A8, 0x6BA, 0x800, 0x983, 0xB50, 0xD74,
1896 0x1000, 0x1307, 0x16A1, 0x1AE9, 0x2000, 0x260E, 0x2D41, 0x35D1,
1897 0x4000, 0x4C1C, 0x5A82, 0x6BA3, 0x8000, 0x9838, 0xB505, 0xD745,
1898 0x10000, 0x13070, 0x16A0A, 0x1AE8A, 0x20000, 0x260E0, 0x2D414, 0x35D14,
1899 0x40000, 0x4C1C0, 0x5A828, 0x6BA28, 0x80000
1900 ];
1901
1902 const BINK2_QUANT_INTRA_LUMA: &[[i32; 64]; 4] = &[
1903 [
1904 0x400, 0x598, 0x5E2, 0x49D, 0x733, 0x7E9, 0x1497, 0x2190,
1905 0x521, 0x685, 0x65E, 0x688, 0xA41, 0xD72, 0x1F57, 0x31FA,
1906 0x434, 0x6DB, 0x710, 0x79E, 0xF8C, 0x130B, 0x226D, 0x2E85,
1907 0x546, 0x74C, 0x84F, 0x7E0, 0x1275, 0x1162, 0x1E20, 0x25A5,
1908 0x99A, 0xC1F, 0x10CF, 0x10CF, 0x1B33, 0x1AB3, 0x2B47, 0x3435,
1909 0xD2F, 0x1648, 0x13BC, 0x17A1, 0x23EE, 0x1C40, 0x29E5, 0x266A,
1910 0x156E, 0x1D61, 0x1E75, 0x1BB3, 0x2B47, 0x2720, 0x34F7, 0x3270,
1911 0x1C6F, 0x1DE1, 0x1B6C, 0x17D1, 0x23E5, 0x2357, 0x3175, 0x35C8
1912 ], [
1913 0x4C2, 0x6A7, 0x6FF, 0x57D, 0x890, 0x968, 0x187C, 0x27EA,
1914 0x619, 0x7C1, 0x792, 0x7C4, 0xC32, 0xFFD, 0x2545, 0x3B6F,
1915 0x4FF, 0x827, 0x866, 0x90F, 0x127D, 0x16A6, 0x28F1, 0x3752,
1916 0x646, 0x8AE, 0x9E2, 0x95E, 0x15F3, 0x14AC, 0x23D3, 0x2CC4,
1917 0xB6B, 0xE6A, 0x13FD, 0x13FE, 0x2059, 0x1FC0, 0x3378, 0x3E16,
1918 0xFAE, 0x1A7F, 0x1778, 0x1C1A, 0x2ABA, 0x2198, 0x31D3, 0x2DAE,
1919 0x197C, 0x22F0, 0x2438, 0x20F1, 0x3378, 0x2E87, 0x3EFD, 0x3BFA,
1920 0x21D1, 0x2388, 0x209C, 0x1C52, 0x2AAF, 0x2A07, 0x3AD0, 0x3FF5
1921 ], [
1922 0x5A8, 0x7E9, 0x852, 0x687, 0xA2F, 0xB30, 0x1D1E, 0x2F77,
1923 0x740, 0x938, 0x901, 0x93C, 0xE81, 0x1303, 0x2C52, 0x46AE,
1924 0x5F1, 0x9B2, 0x9FD, 0xAC6, 0x15FC, 0x1AEE, 0x30B0, 0x41C9,
1925 0x775, 0xA52, 0xBC0, 0xB24, 0x1A1B, 0x1895, 0x2A9A, 0x353D,
1926 0xD94, 0x1124, 0x17C5, 0x17C6, 0x2677, 0x25C2, 0x3D34, 0x49D5,
1927 0x12A5, 0x1F82, 0x1BE9, 0x216B, 0x32CF, 0x27F3, 0x3B40, 0x3653,
1928 0x1E4E, 0x298D, 0x2B12, 0x272C, 0x3D34, 0x3755, 0x4AE7, 0x4753,
1929 0x2836, 0x2A41, 0x26C7, 0x21AE, 0x32C3, 0x31FA, 0x45F1, 0x4C0E
1930 ], [
1931 0x6BA, 0x968, 0x9E5, 0x7C3, 0xC1C, 0xD4E, 0x22A0, 0x3872,
1932 0x8A0, 0xAF7, 0xAB5, 0xAFB, 0x113F, 0x169C, 0x34B5, 0x540D,
1933 0x711, 0xB87, 0xBE1, 0xCD0, 0x1A25, 0x2007, 0x39E6, 0x4E3C,
1934 0x8DF, 0xC46, 0xDFA, 0xD3F, 0x1F0B, 0x1D3C, 0x32A9, 0x3F4F,
1935 0x1025, 0x1462, 0x1C44, 0x1C46, 0x2DBF, 0x2CE7, 0x48C9, 0x57CE,
1936 0x162D, 0x2578, 0x2131, 0x27BE, 0x3C6D, 0x2F82, 0x4676, 0x409A,
1937 0x240A, 0x3169, 0x3338, 0x2E96, 0x48C9, 0x41CD, 0x5914, 0x54D3,
1938 0x2FD2, 0x3240, 0x2E1E, 0x280E, 0x3C5E, 0x3B6F, 0x532D, 0x5A73
1939 ]
1940 ];
1941
1942 const BINK2_QUANT_INTRA_CHROMA: &[[i32; 64]; 4] = &[
1943 [
1944 0x400, 0x4A9, 0x59A, 0x89B, 0x1600, 0x1221, 0x171C, 0x19A3,
1945 0x4A9, 0x656, 0x713, 0xE16, 0x19A3, 0x1520, 0x1AEE, 0x1DE1,
1946 0x59A, 0x713, 0xDBB, 0x130B, 0x171C, 0x130B, 0x1847, 0x1AEE,
1947 0x89B, 0xE16, 0x130B, 0xEF0, 0x1221, 0xEF0, 0x130B, 0x1520,
1948 0x1600, 0x19A3, 0x171C, 0x1221, 0x1600, 0x1221, 0x171C, 0x19A3,
1949 0x1221, 0x1520, 0x130B, 0xEF0, 0x1221, 0xEF0, 0x130B, 0x1520,
1950 0x171C, 0x1AEE, 0x1847, 0x130B, 0x171C, 0x130B, 0x1847, 0x1AEE,
1951 0x19A3, 0x1DE1, 0x1AEE, 0x1520, 0x19A3, 0x1520, 0x1AEE, 0x1DE1
1952 ], [
1953 0x4C2, 0x58B, 0x6AA, 0xA3C, 0x1A2A, 0x158F, 0x1B7B, 0x1E7D,
1954 0x58B, 0x789, 0x869, 0x10C0, 0x1E7D, 0x1920, 0x2007, 0x2388,
1955 0x6AA, 0x869, 0x1054, 0x16A6, 0x1B7B, 0x16A6, 0x1CDE, 0x2007,
1956 0xA3C, 0x10C0, 0x16A6, 0x11C4, 0x158F, 0x11C4, 0x16A6, 0x1920,
1957 0x1A2A, 0x1E7D, 0x1B7B, 0x158F, 0x1A2A, 0x158F, 0x1B7B, 0x1E7D,
1958 0x158F, 0x1920, 0x16A6, 0x11C4, 0x158F, 0x11C4, 0x16A6, 0x1920,
1959 0x1B7B, 0x2007, 0x1CDE, 0x16A6, 0x1B7B, 0x16A6, 0x1CDE, 0x2007,
1960 0x1E7D, 0x2388, 0x2007, 0x1920, 0x1E7D, 0x1920, 0x2007, 0x2388
1961 ], [
1962 0x5A8, 0x698, 0x7EC, 0xC2C, 0x1F1D, 0x19A3, 0x20AF, 0x2442,
1963 0x698, 0x8F6, 0xA01, 0x13EB, 0x2442, 0x1DE1, 0x2616, 0x2A41,
1964 0x7EC, 0xA01, 0x136B, 0x1AEE, 0x20AF, 0x1AEE, 0x2255, 0x2616,
1965 0xC2C, 0x13EB, 0x1AEE, 0x1520, 0x19A3, 0x1520, 0x1AEE, 0x1DE1,
1966 0x1F1D, 0x2442, 0x20AF, 0x19A3, 0x1F1D, 0x19A3, 0x20AF, 0x2442,
1967 0x19A3, 0x1DE1, 0x1AEE, 0x1520, 0x19A3, 0x1520, 0x1AEE, 0x1DE1,
1968 0x20AF, 0x2616, 0x2255, 0x1AEE, 0x20AF, 0x1AEE, 0x2255, 0x2616,
1969 0x2442, 0x2A41, 0x2616, 0x1DE1, 0x2442, 0x1DE1, 0x2616, 0x2A41
1970 ], [
1971 0x6BA, 0x7D7, 0x96C, 0xE7A, 0x2500, 0x1E7D, 0x26DE, 0x2B1E,
1972 0x7D7, 0xAA9, 0xBE5, 0x17B0, 0x2B1E, 0x2388, 0x2D4B, 0x3240,
1973 0x96C, 0xBE5, 0x1718, 0x2007, 0x26DE, 0x2007, 0x28D4, 0x2D4B,
1974 0xE7A, 0x17B0, 0x2007, 0x1920, 0x1E7D, 0x1920, 0x2007, 0x2388,
1975 0x2500, 0x2B1E, 0x26DE, 0x1E7D, 0x2500, 0x1E7D, 0x26DE, 0x2B1E,
1976 0x1E7D, 0x2388, 0x2007, 0x1920, 0x1E7D, 0x1920, 0x2007, 0x2388,
1977 0x26DE, 0x2D4B, 0x28D4, 0x2007, 0x26DE, 0x2007, 0x28D4, 0x2D4B,
1978 0x2B1E, 0x3240, 0x2D4B, 0x2388, 0x2B1E, 0x2388, 0x2D4B, 0x3240
1979 ]
1980 ];
1981
1982 const BINK2_QUANT_INTER: &[[i32; 64]; 4] = &[
1983 [
1984 0x400, 0x4A9, 0x434, 0x34C, 0x41C, 0x392, 0x4C9, 0x5D4,
1985 0x4A9, 0x56F, 0x4E6, 0x3D7, 0x4CB, 0x429, 0x5B7, 0x718,
1986 0x434, 0x4E6, 0x489, 0x3A8, 0x4AB, 0x40A, 0x5A4, 0x6CD,
1987 0x34C, 0x3D7, 0x3A8, 0x32B, 0x41F, 0x39F, 0x519, 0x630,
1988 0x41C, 0x4CB, 0x4AB, 0x41F, 0x5AB, 0x538, 0x778, 0x932,
1989 0x392, 0x429, 0x40A, 0x39F, 0x538, 0x521, 0x799, 0x9B6,
1990 0x4C9, 0x5B7, 0x5A4, 0x519, 0x778, 0x799, 0xBE4, 0xFC7,
1991 0x5D4, 0x718, 0x6CD, 0x630, 0x932, 0x9B6, 0xFC7, 0x162F
1992 ], [
1993 0x4C2, 0x58B, 0x4FF, 0x3EB, 0x4E4, 0x43F, 0x5B1, 0x6EE,
1994 0x58B, 0x676, 0x5D3, 0x491, 0x5B3, 0x4F3, 0x6CB, 0x86F,
1995 0x4FF, 0x5D3, 0x565, 0x459, 0x58D, 0x4CE, 0x6B5, 0x816,
1996 0x3EB, 0x491, 0x459, 0x3C5, 0x4E6, 0x44F, 0x610, 0x75C,
1997 0x4E4, 0x5B3, 0x58D, 0x4E6, 0x6BD, 0x635, 0x8E2, 0xAEF,
1998 0x43F, 0x4F3, 0x4CE, 0x44F, 0x635, 0x61A, 0x909, 0xB8C,
1999 0x5B1, 0x6CB, 0x6B5, 0x610, 0x8E2, 0x909, 0xE24, 0x12C3,
2000 0x6EE, 0x86F, 0x816, 0x75C, 0xAEF, 0xB8C, 0x12C3, 0x1A61
2001 ], [
2002 0x5A8, 0x698, 0x5F1, 0x4A9, 0x5D0, 0x50D, 0x6C4, 0x83E,
2003 0x698, 0x7AF, 0x6ED, 0x56F, 0x6C7, 0x5E3, 0x814, 0xA08,
2004 0x5F1, 0x6ED, 0x66A, 0x52B, 0x69A, 0x5B6, 0x7FA, 0x99E,
2005 0x4A9, 0x56F, 0x52B, 0x47B, 0x5D4, 0x51F, 0x735, 0x8C1,
2006 0x5D0, 0x6C7, 0x69A, 0x5D4, 0x804, 0x761, 0xA90, 0xD00,
2007 0x50D, 0x5E3, 0x5B6, 0x51F, 0x761, 0x741, 0xABF, 0xDBB,
2008 0x6C4, 0x814, 0x7FA, 0x735, 0xA90, 0xABF, 0x10D2, 0x1650,
2009 0x83E, 0xA08, 0x99E, 0x8C1, 0xD00, 0xDBB, 0x1650, 0x1F5F
2010 ], [
2011 0x6BA, 0x7D7, 0x711, 0x58B, 0x6EA, 0x601, 0x80C, 0x9CD,
2012 0x7D7, 0x923, 0x83C, 0x676, 0x80F, 0x700, 0x99C, 0xBEE,
2013 0x711, 0x83C, 0x7A1, 0x626, 0x7DA, 0x6CB, 0x97C, 0xB70,
2014 0x58B, 0x676, 0x626, 0x554, 0x6EE, 0x617, 0x893, 0xA68,
2015 0x6EA, 0x80F, 0x7DA, 0x6EE, 0x988, 0x8C7, 0xC90, 0xF76,
2016 0x601, 0x700, 0x6CB, 0x617, 0x8C7, 0x8A1, 0xCC7, 0x1055,
2017 0x80C, 0x99C, 0x97C, 0x893, 0xC90, 0xCC7, 0x1400, 0x1A89,
2018 0x9CD, 0xBEE, 0xB70, 0xA68, 0xF76, 0x1055, 0x1A89, 0x254E
2019 ]
2020 ];
2021
2022 const BINK2_AC_CODES1: &[u8] = &[
2023 0x01, 0x04, 0x00, 0x08, 0x02, 0x32, 0x0A, 0x12,
2024 0x3A, 0x7A, 0xFA, 0x72, 0x06, 0x1A
2025 ];
2026 const BINK2_AC_BITS1: &[u8] = &[ 1, 3, 4, 4, 5, 7, 5, 6, 7, 8, 8, 7, 3, 6 ];
2027 const BINK2_AC_CODES2: &[u16] = &[
2028 0x01, 0x00, 0x04, 0x2C, 0x6C, 0x0C, 0x4C, 0xAC,
2029 0xEC, 0x12C, 0x16C, 0x1AC, 0x02, 0x1C
2030 ];
2031 const BINK2_AC_BITS2: &[u8] = &[ 1, 3, 4, 9, 9, 7, 7, 9, 8, 9, 9, 9, 2, 5 ];
2032
2033 const BINK2_AC_RUNS: [usize; 14] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 64, 0 ];
2034
2035 const BINK2_MV_CODES: &[u8] = &[
2036 0x01, 0x06, 0x0C, 0x1C, 0x18, 0x38, 0x58, 0x78,
2037 0x68, 0x48, 0x28, 0x08, 0x14, 0x04, 0x02, 0x00
2038 ];
2039 const BINK2_MV_BITS: &[u8] = &[
2040 1, 3, 5, 5, 7, 7, 7, 7,
2041 7, 7, 7, 7, 5, 5, 3, 4
2042 ];
2043 const BINK2_MV_ESC: i8 = 42;
2044 const BINK2_MV_SYMS: &[i8] = &[
2045 0, 1, 2, 3, 4, 5, 6, 7,
2046 -7, -6, -5, -4, -3, -2, -1, BINK2_MV_ESC
2047 ];
2048
2049 const BINK2_AC_VAL_CODES1: &[u16] = &[
2050 0x004, 0x01, 0x002, 0x00, 0x08, 0x18, 0xF8, 0x178,
2051 0x138, 0x38, 0x1B8, 0x78, 0xB8
2052 ];
2053 const BINK2_AC_VAL_BITS1: &[u8] = &[ 3, 1, 2, 4, 5, 6, 8, 9, 9, 9, 9, 9, 9 ];
2054 const BINK2_AC_VAL_CODES2: &[u16] = &[
2055 0x0A, 0x001, 0x004, 0x08, 0x06, 0x00, 0x02, 0x1A,
2056 0x2A, 0x16A, 0x1EA, 0x6A, 0xEA
2057 ];
2058 const BINK2_AC_VAL_BITS2: &[u8] = &[ 6, 1, 3, 4, 3, 4, 4, 5, 7, 9, 9, 9, 9 ];
2059 const BINK2_AC_SKIP_CODES1: &[u16] = &[
2060 0x00, 0x001, 0x0D, 0x15, 0x45, 0x85, 0xA5, 0x165,
2061 0x65, 0x1E5, 0xE5, 0x25, 0x03, 0x05
2062 ];
2063 const BINK2_AC_SKIP_BITS1: &[u8] = &[ 1, 3, 4, 5, 7, 8, 8, 9, 9, 9, 9, 8, 2, 8 ];
2064 const BINK2_AC_SKIP_CODES2: &[u16] = &[
2065 0x00, 0x01, 0x003, 0x07, 0x1F, 0x1B, 0x0F, 0x2F,
2066 0x5B, 0xDB, 0x1DB, 0x3B, 0x05, 0x0B
2067 ];
2068 const BINK2_AC_SKIP_BITS2: &[u8] = &[ 1, 3, 4, 4, 5, 7, 6, 6, 8, 9, 9, 6, 3, 5 ];
2069 const BINK2_QUANT_CODES: &[u8] = &[
2070 0x01, 0x02, 0x04, 0x08, 0x10, 0x30, 0x50, 0x70,
2071 0x00, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xE0
2072 ];
2073 const BINK2_QUANT_BITS: &[u8] = &[ 1, 2, 3, 4, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8 ];
2074
2075 const BINK2_OLD_QUANTS: [f32; 16] = [
2076 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
2077 ];
2078 const BINK2_OLD_DC_QUANTS: [i32; 16] = [
2079 4, 4, 4, 4, 4, 6, 7, 8, 10, 12, 16, 24, 32, 48, 64, 128
2080 ];
2081 const BINK2_DC_EXTRA_BITS: [u8; 16] = [ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 6 ];
2082 const BINK2_QMAT_INTRA_LUMA_OLD: &[f32; 64] = &[
2083 0.125, 0.208056, 0.22864901, 0.205778, 0.22499999, 0.235708, 0.33148301, 0.248309,
2084 0.190718, 0.288582, 0.29449099, 0.34658501, 0.38143599, 0.47678301, 0.600528, 0.44008601,
2085 0.16332, 0.31714499, 0.34142101, 0.42249799, 0.604285, 0.70576, 0.68942899, 0.42807001,
2086 0.235175, 0.38735899, 0.46090701, 0.50122303, 0.82311302, 0.73910397, 0.69206202, 0.39741901,
2087 0.30000001, 0.45078799, 0.65328097, 0.74962097, 0.85000002, 0.79551601, 0.69678998, 0.38625899,
2088 0.392847, 0.79009801, 0.73142397, 1.004719, 1.070509, 0.80251199, 0.64313799, 0.27096599,
2089 0.34501299, 0.56299502, 0.60987997, 0.636379, 0.69678998, 0.60061598, 0.43934, 0.19224399,
2090 0.210373, 0.26309499, 0.252336, 0.25142801, 0.265553, 0.24928901, 0.188511, 0.094199002
2091 ];
2092 const BINK2_QMAT_CHROMA_OLD: &[f32; 64] = &[
2093 0.125, 0.17338, 0.217761, 0.383793, 0.6875, 0.54016501, 0.37207201, 0.18968099,
2094 0.17338, 0.28056601, 0.32721299, 0.74753499, 0.95358998, 0.74923098, 0.51607901, 0.26309499,
2095 0.217761, 0.32721299, 0.66387498, 1.056244, 0.89826202, 0.70576, 0.48613599, 0.24783,
2096 0.383793, 0.74753499, 1.056244, 0.95059502, 0.80841398, 0.635167, 0.437511, 0.223041,
2097 0.6875, 0.95358998, 0.89826202, 0.80841398, 0.6875, 0.54016501, 0.37207201, 0.18968099,
2098 0.54016501, 0.74923098, 0.70576, 0.635167, 0.54016501, 0.42440501, 0.292335, 0.149031,
2099 0.37207201, 0.51607901, 0.48613599, 0.437511, 0.37207201, 0.292335, 0.201364, 0.102655,
2100 0.18968099, 0.26309499, 0.24783, 0.223041, 0.18968099, 0.149031, 0.102655, 0.052333001
2101 ];
2102 const BINK2_QMAT_INTER_LUMA_OLD: &[f32; 64] = &[
2103 0.125, 0.17338, 0.16332, 0.146984, 0.128475, 0.106393, 0.077045999, 0.043109,
2104 0.17338, 0.240485, 0.226532, 0.20387299, 0.17820001, 0.147571, 0.109474, 0.062454,
2105 0.16332, 0.226532, 0.219321, 0.202722, 0.181465, 0.149711, 0.112943, 0.062583998,
2106 0.146984, 0.20387299, 0.202722, 0.201647, 0.183731, 0.15397599, 0.11711, 0.065334998,
2107 0.128475, 0.17820001, 0.181465, 0.183731, 0.17708801, 0.155499, 0.120267, 0.068016,
2108 0.106393, 0.147571, 0.149711, 0.15397599, 0.155499, 0.14575601, 0.116636, 0.068494998,
2109 0.077045999, 0.109474, 0.112943, 0.11711, 0.120267, 0.116636, 0.098646, 0.060141001,
2110 0.043109, 0.062454, 0.062583998, 0.065334998, 0.068016, 0.068494998, 0.060141001, 0.038853001
2111 ];