00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <math.h>
00034
00035 #ifndef PI
00036 # ifdef M_PI
00037 # define PI M_PI
00038 # else
00039 # define PI 3.14159265358979323846
00040 # endif
00041 #endif
00042
00043
00044 void init_fdct (void);
00045 void fdct (short *block);
00046
00047
00048 static double c[8][8];
00049
00050 void init_fdct()
00051 {
00052 int i, j;
00053 double s;
00054
00055 for (i=0; i<8; i++)
00056 {
00057 s = (i==0) ? sqrt(0.125) : 0.5;
00058
00059 for (j=0; j<8; j++)
00060 c[i][j] = s * cos((PI/8.0)*i*(j+0.5));
00061 }
00062 }
00063
00064 void fdct(block)
00065 short *block;
00066 {
00067 register int i, j;
00068 double s;
00069 double tmp[64];
00070
00071 for(i = 0; i < 8; i++)
00072 for(j = 0; j < 8; j++)
00073 {
00074 s = 0.0;
00075
00076
00077
00078
00079
00080 s += c[j][0] * block[8 * i + 0];
00081 s += c[j][1] * block[8 * i + 1];
00082 s += c[j][2] * block[8 * i + 2];
00083 s += c[j][3] * block[8 * i + 3];
00084 s += c[j][4] * block[8 * i + 4];
00085 s += c[j][5] * block[8 * i + 5];
00086 s += c[j][6] * block[8 * i + 6];
00087 s += c[j][7] * block[8 * i + 7];
00088
00089 tmp[8 * i + j] = s;
00090 }
00091
00092 for(j = 0; j < 8; j++)
00093 for(i = 0; i < 8; i++)
00094 {
00095 s = 0.0;
00096
00097
00098
00099
00100
00101 s += c[i][0] * tmp[8 * 0 + j];
00102 s += c[i][1] * tmp[8 * 1 + j];
00103 s += c[i][2] * tmp[8 * 2 + j];
00104 s += c[i][3] * tmp[8 * 3 + j];
00105 s += c[i][4] * tmp[8 * 4 + j];
00106 s += c[i][5] * tmp[8 * 5 + j];
00107 s += c[i][6] * tmp[8 * 6 + j];
00108 s += c[i][7] * tmp[8 * 7 + j];
00109 s*=8.0;
00110
00111 block[8 * i + j] = (short)floor(s + 0.499999);
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 }
00122 }
00123
00124
00125
00126 void idct(block)
00127 short *block;
00128 {
00129 int i, j, k, v;
00130 double partial_product;
00131 double tmp[64];
00132
00133 for (i=0; i<8; i++)
00134 for (j=0; j<8; j++)
00135 {
00136 partial_product = 0.0;
00137
00138 for (k=0; k<8; k++)
00139 partial_product+= c[k][j]*block[8*i+k];
00140
00141 tmp[8*i+j] = partial_product;
00142 }
00143
00144
00145
00146
00147 for (j=0; j<8; j++)
00148 for (i=0; i<8; i++)
00149 {
00150 partial_product = 0.0;
00151
00152 for (k=0; k<8; k++)
00153 partial_product+= c[k][i]*tmp[8*k+j];
00154
00155 v = (int) floor(partial_product+0.5);
00156 block[8*i+j] = v;
00157 }
00158 }