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