1 static CONST1: i32 = 20091; 2 static CONST2: i32 = 35468; 3 idct4x4(block: &mut [i32])4pub 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])43pub 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