]> git.sesse.net Git - x264/blob - doc/dct.txt
tweak cflags
[x264] / doc / dct.txt
1 /****************************************************************************
2  * DCT/IDCT functions
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] )
6 {
7     int tmp[2][2];
8
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];
13
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];
18 }
19
20 static void idct_2x2_dc( int16_t dct[2][2], int16_t chroma[2][2] )
21 {
22     dct_2x2_dc( chroma, dct );
23 }
24
25 static void dct_4x4_dc( int16_t dct[4][4], int16_t luma[4][4] )
26 {
27     int16_t tmp[4][4];
28     int i;
29
30     for( i = 0; i < 4; i++ )
31     {
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];
36     }
37
38     for( i = 0; i < 4; i++ )
39     {
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;
44     }
45 }
46
47 static void dct_4x4( int16_t dct[4][4], int16_t luma[4][4] )
48 {
49     int16_t tmp[4][4];
50     int i;
51
52     for( i = 0; i < 4; i++ )
53     {
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];
58     }
59
60     for( i = 0; i < 4; i++ )
61     {
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];
66     }
67 }
68
69 static void idct_4x4( int16_t dct[4][4], int16_t luma[4][4] )
70 {
71     int16_t tmp[4][4];
72     int i;
73
74     for( i = 0; i < 4; i++ )
75     {
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);
80     }
81
82     for( i = 0; i < 4; i++ )
83     {
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;
89     }
90 }
91 static void idct_4x4_dc( int16_t dct[4][4], int16_t luma[4][4] )
92 {
93     int16_t tmp[4][4];
94     int i;
95
96     for( i = 0; i < 4; i++ )
97     {
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];
102     }
103
104     for( i = 0; i < 4; i++ )
105     {
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] ) ;
110     }
111 }