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