1 static CONST1: i32 = 20091;
2 static CONST2: i32 = 35468;
3 
idct4x4(block: &mut [i32])4 pub fn idct4x4(block: &mut [i32]) {
5     for i in 0usize..4 {
6         let a1 = block[i] + block[8 + i];
7         let b1 = block[i] - block[8 + i];
8 
9         let t1 = (block[4 + i] * CONST2) >> 16;
10         let t2 = block[12 + i] + ((block[12 + i] * CONST1) >> 16);
11         let c1 = t1 - t2;
12 
13         let t1 = block[4 + i] + ((block[4 + i] * CONST1) >> 16);
14         let t2 = (block[12 + i] * CONST2) >> 16;
15         let d1 = t1 + t2;
16 
17         block[i] = a1 + d1;
18         block[4 + i] = b1 + c1;
19         block[4 * 3 + i] = a1 - d1;
20         block[4 * 2 + i] = b1 - c1;
21     }
22 
23     for i in 0usize..4 {
24         let a1 = block[4 * i] + block[4 * i + 2];
25         let b1 = block[4 * i] - block[4 * i + 2];
26 
27         let t1 = (block[4 * i + 1] * CONST2) >> 16;
28         let t2 = block[4 * i + 3] + ((block[4 * i + 3] * CONST1) >> 16);
29         let c1 = t1 - t2;
30 
31         let t1 = block[4 * i + 1] + ((block[4 * i + 1] * CONST1) >> 16);
32         let t2 = (block[4 * i + 3] * CONST2) >> 16;
33         let d1 = t1 + t2;
34 
35         block[4 * i] = (a1 + d1 + 4) >> 3;
36         block[4 * i + 3] = (a1 - d1 + 4) >> 3;
37         block[4 * i + 1] = (b1 + c1 + 4) >> 3;
38         block[4 * i + 2] = (b1 - c1 + 4) >> 3;
39     }
40 }
41 
42 // 14.3
iwht4x4(block: &mut [i32])43 pub fn iwht4x4(block: &mut [i32]) {
44     for i in 0usize..4 {
45         let a1 = block[i] + block[12 + i];
46         let b1 = block[4 + i] + block[8 + i];
47         let c1 = block[4 + i] - block[8 + i];
48         let d1 = block[i] - block[12 + i];
49 
50         block[i] = a1 + b1;
51         block[4 + i] = c1 + d1;
52         block[8 + i] = a1 - b1;
53         block[12 + i] = d1 - c1;
54     }
55 
56     for i in 0usize..4 {
57         let a1 = block[4 * i] + block[4 * i + 3];
58         let b1 = block[4 * i + 1] + block[4 * i + 2];
59         let c1 = block[4 * i + 1] - block[4 * i + 2];
60         let d1 = block[4 * i] - block[4 * i + 3];
61 
62         let a2 = a1 + b1;
63         let b2 = c1 + d1;
64         let c2 = a1 - b1;
65         let d2 = d1 - c1;
66 
67         block[4 * i] = (a2 + 3) >> 3;
68         block[4 * i + 1] = (b2 + 3) >> 3;
69         block[4 * i + 2] = (c2 + 3) >> 3;
70         block[4 * i + 3] = (d2 + 3) >> 3;
71     }
72 }
73