1 /****************************************************************************
3 ****************************************************************************/
4 /* be carefull that "dct" could be equal to "luma" (ie dct_4x4(dct,dct) )*/
5 static void dct_2x2_dc( int16_t dct[2][2], int16_t chroma[2][2] )
9 tmp[0][0] = chroma[0][0] + chroma[0][1];
10 tmp[1][0] = chroma[0][0] - chroma[0][1];
11 tmp[0][1] = chroma[1][0] + chroma[1][1];
12 tmp[1][1] = chroma[1][0] - chroma[1][1];
14 dct[0][0] = tmp[0][0] + tmp[0][1];
15 dct[0][1] = tmp[1][0] + tmp[1][1];
16 dct[1][0] = tmp[0][0] - tmp[0][1];
17 dct[1][1] = tmp[1][0] - tmp[1][1];
20 static void idct_2x2_dc( int16_t dct[2][2], int16_t chroma[2][2] )
22 dct_2x2_dc( chroma, dct );
25 static void dct_4x4_dc( int16_t dct[4][4], int16_t luma[4][4] )
30 for( i = 0; i < 4; i++ )
32 tmp[0][i] = luma[i][0] + luma[i][1] + luma[i][2] + luma[i][3];
33 tmp[1][i] = luma[i][0] + luma[i][1] - luma[i][2] - luma[i][3];
34 tmp[2][i] = luma[i][0] - luma[i][1] - luma[i][2] + luma[i][3];
35 tmp[3][i] = luma[i][0] - luma[i][1] + luma[i][2] - luma[i][3];
38 for( i = 0; i < 4; i++ )
40 dct[0][i] = ( tmp[i][0] + tmp[i][1] + tmp[i][2] + tmp[i][3] + 1) / 2;
41 dct[1][i] = ( tmp[i][0] + tmp[i][1] - tmp[i][2] - tmp[i][3] + 1) / 2;
42 dct[2][i] = ( tmp[i][0] - tmp[i][1] - tmp[i][2] + tmp[i][3] + 1) / 2;
43 dct[3][i] = ( tmp[i][0] - tmp[i][1] + tmp[i][2] - tmp[i][3] + 1) / 2;
47 static void dct_4x4( int16_t dct[4][4], int16_t luma[4][4] )
52 for( i = 0; i < 4; i++ )
54 tmp[0][i] = luma[i][0] + luma[i][1] + luma[i][2] + luma[i][3];
55 tmp[1][i] = 2*luma[i][0] + luma[i][1] - luma[i][2] - 2*luma[i][3];
56 tmp[2][i] = luma[i][0] - luma[i][1] - luma[i][2] + luma[i][3];
57 tmp[3][i] = luma[i][0] - 2*luma[i][1] + 2*luma[i][2] - luma[i][3];
60 for( i = 0; i < 4; i++ )
62 dct[0][i] = tmp[i][0] + tmp[i][1] + tmp[i][2] + tmp[i][3];
63 dct[1][i] = 2*tmp[i][0] + tmp[i][1] - tmp[i][2] - 2*tmp[i][3];
64 dct[2][i] = tmp[i][0] - tmp[i][1] - tmp[i][2] + tmp[i][3];
65 dct[3][i] = tmp[i][0] - 2*tmp[i][1] + 2*tmp[i][2] - tmp[i][3];
69 static void idct_4x4( int16_t dct[4][4], int16_t luma[4][4] )
74 for( i = 0; i < 4; i++ )
76 tmp[0][i] = dct[0][i] + dct[1][i] + dct[2][i] + (dct[3][i]>>1);
77 tmp[1][i] = dct[0][i] + (dct[1][i]>>1) - dct[2][i] - dct[3][i];
78 tmp[2][i] = dct[0][i] - (dct[1][i]>>1) - dct[2][i] + dct[3][i];
79 tmp[3][i] = dct[0][i] - dct[1][i] + dct[2][i] - (dct[3][i]>>1);
82 for( i = 0; i < 4; i++ )
84 /* XXX XXX use >> 6 and not / 64 -> doesn't give the same result :((((((((( */
85 luma[i][0] = ( tmp[i][0] + tmp[i][1] + tmp[i][2] + (tmp[i][3]>>1) + 32 ) >> 6;
86 luma[i][1] = ( tmp[i][0] + (tmp[i][1]>>1) - tmp[i][2] - tmp[i][3] + 32 ) >> 6;
87 luma[i][2] = ( tmp[i][0] - (tmp[i][1]>>1) - tmp[i][2] + tmp[i][3] + 32 ) >> 6;
88 luma[i][3] = ( tmp[i][0] - tmp[i][1] + tmp[i][2] - (tmp[i][3]>>1) + 32 ) >> 6;
91 static void idct_4x4_dc( int16_t dct[4][4], int16_t luma[4][4] )
96 for( i = 0; i < 4; i++ )
98 tmp[0][i] = dct[0][i] + dct[1][i] + dct[2][i] + dct[3][i];
99 tmp[1][i] = dct[0][i] + dct[1][i] - dct[2][i] - dct[3][i];
100 tmp[2][i] = dct[0][i] - dct[1][i] - dct[2][i] + dct[3][i];
101 tmp[3][i] = dct[0][i] - dct[1][i] + dct[2][i] - dct[3][i];
104 for( i = 0; i < 4; i++ )
106 luma[i][0] = ( tmp[i][0] + tmp[i][1] + tmp[i][2] + tmp[i][3] ) ;
107 luma[i][1] = ( tmp[i][0] + tmp[i][1] - tmp[i][2] - tmp[i][3] ) ;
108 luma[i][2] = ( tmp[i][0] - tmp[i][1] - tmp[i][2] + tmp[i][3] ) ;
109 luma[i][3] = ( tmp[i][0] - tmp[i][1] + tmp[i][2] - tmp[i][3] ) ;