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
00038 #include <stdlib.h>
00039 #include <stdio.h>
00040 #include "common.h"
00041 #include "dsputil.h"
00042
00043 #define DCTSIZE 8
00044 #define GLOBAL(x) x
00045 #define RIGHT_SHIFT(x, n) ((x) >> (n))
00046 #define SHIFT_TEMPS
00047
00048
00049
00050
00051
00052 #if DCTSIZE != 8
00053 Sorry, this code only copes with 8x8 DCTs.
00054 #endif
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 #define CONST_BITS 8
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 #if CONST_BITS == 8
00086 #define FIX_0_382683433 ((int32_t) 98)
00087 #define FIX_0_541196100 ((int32_t) 139)
00088 #define FIX_0_707106781 ((int32_t) 181)
00089 #define FIX_1_306562965 ((int32_t) 334)
00090 #else
00091 #define FIX_0_382683433 FIX(0.382683433)
00092 #define FIX_0_541196100 FIX(0.541196100)
00093 #define FIX_0_707106781 FIX(0.707106781)
00094 #define FIX_1_306562965 FIX(1.306562965)
00095 #endif
00096
00097
00098
00099
00100
00101
00102
00103 #ifndef USE_ACCURATE_ROUNDING
00104 #undef DESCALE
00105 #define DESCALE(x,n) RIGHT_SHIFT(x, n)
00106 #endif
00107
00108
00109
00110
00111
00112
00113 #define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
00114
00115 static always_inline void row_fdct(DCTELEM * data){
00116 int_fast16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
00117 int_fast16_t tmp10, tmp11, tmp12, tmp13;
00118 int_fast16_t z1, z2, z3, z4, z5, z11, z13;
00119 DCTELEM *dataptr;
00120 int ctr;
00121 SHIFT_TEMPS
00122
00123
00124
00125 dataptr = data;
00126 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00127 tmp0 = dataptr[0] + dataptr[7];
00128 tmp7 = dataptr[0] - dataptr[7];
00129 tmp1 = dataptr[1] + dataptr[6];
00130 tmp6 = dataptr[1] - dataptr[6];
00131 tmp2 = dataptr[2] + dataptr[5];
00132 tmp5 = dataptr[2] - dataptr[5];
00133 tmp3 = dataptr[3] + dataptr[4];
00134 tmp4 = dataptr[3] - dataptr[4];
00135
00136
00137
00138 tmp10 = tmp0 + tmp3;
00139 tmp13 = tmp0 - tmp3;
00140 tmp11 = tmp1 + tmp2;
00141 tmp12 = tmp1 - tmp2;
00142
00143 dataptr[0] = tmp10 + tmp11;
00144 dataptr[4] = tmp10 - tmp11;
00145
00146 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781);
00147 dataptr[2] = tmp13 + z1;
00148 dataptr[6] = tmp13 - z1;
00149
00150
00151
00152 tmp10 = tmp4 + tmp5;
00153 tmp11 = tmp5 + tmp6;
00154 tmp12 = tmp6 + tmp7;
00155
00156
00157 z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433);
00158 z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5;
00159 z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5;
00160 z3 = MULTIPLY(tmp11, FIX_0_707106781);
00161
00162 z11 = tmp7 + z3;
00163 z13 = tmp7 - z3;
00164
00165 dataptr[5] = z13 + z2;
00166 dataptr[3] = z13 - z2;
00167 dataptr[1] = z11 + z4;
00168 dataptr[7] = z11 - z4;
00169
00170 dataptr += DCTSIZE;
00171 }
00172 }
00173
00174
00175
00176
00177
00178 GLOBAL(void)
00179 fdct_ifast (DCTELEM * data)
00180 {
00181 int_fast16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
00182 int_fast16_t tmp10, tmp11, tmp12, tmp13;
00183 int_fast16_t z1, z2, z3, z4, z5, z11, z13;
00184 DCTELEM *dataptr;
00185 int ctr;
00186 SHIFT_TEMPS
00187
00188 row_fdct(data);
00189
00190
00191
00192 dataptr = data;
00193 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00194 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
00195 tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
00196 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
00197 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
00198 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
00199 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
00200 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
00201 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
00202
00203
00204
00205 tmp10 = tmp0 + tmp3;
00206 tmp13 = tmp0 - tmp3;
00207 tmp11 = tmp1 + tmp2;
00208 tmp12 = tmp1 - tmp2;
00209
00210 dataptr[DCTSIZE*0] = tmp10 + tmp11;
00211 dataptr[DCTSIZE*4] = tmp10 - tmp11;
00212
00213 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781);
00214 dataptr[DCTSIZE*2] = tmp13 + z1;
00215 dataptr[DCTSIZE*6] = tmp13 - z1;
00216
00217
00218
00219 tmp10 = tmp4 + tmp5;
00220 tmp11 = tmp5 + tmp6;
00221 tmp12 = tmp6 + tmp7;
00222
00223
00224 z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433);
00225 z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5;
00226 z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5;
00227 z3 = MULTIPLY(tmp11, FIX_0_707106781);
00228
00229 z11 = tmp7 + z3;
00230 z13 = tmp7 - z3;
00231
00232 dataptr[DCTSIZE*5] = z13 + z2;
00233 dataptr[DCTSIZE*3] = z13 - z2;
00234 dataptr[DCTSIZE*1] = z11 + z4;
00235 dataptr[DCTSIZE*7] = z11 - z4;
00236
00237 dataptr++;
00238 }
00239 }
00240
00241
00242
00243
00244
00245 GLOBAL(void)
00246 fdct_ifast248 (DCTELEM * data)
00247 {
00248 int_fast16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
00249 int_fast16_t tmp10, tmp11, tmp12, tmp13;
00250 int_fast16_t z1;
00251 DCTELEM *dataptr;
00252 int ctr;
00253 SHIFT_TEMPS
00254
00255 row_fdct(data);
00256
00257
00258
00259 dataptr = data;
00260 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00261 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*1];
00262 tmp1 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];
00263 tmp2 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5];
00264 tmp3 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7];
00265 tmp4 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*1];
00266 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];
00267 tmp6 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5];
00268 tmp7 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7];
00269
00270
00271
00272 tmp10 = tmp0 + tmp3;
00273 tmp11 = tmp1 + tmp2;
00274 tmp12 = tmp1 - tmp2;
00275 tmp13 = tmp0 - tmp3;
00276
00277 dataptr[DCTSIZE*0] = tmp10 + tmp11;
00278 dataptr[DCTSIZE*4] = tmp10 - tmp11;
00279
00280 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781);
00281 dataptr[DCTSIZE*2] = tmp13 + z1;
00282 dataptr[DCTSIZE*6] = tmp13 - z1;
00283
00284 tmp10 = tmp4 + tmp7;
00285 tmp11 = tmp5 + tmp6;
00286 tmp12 = tmp5 - tmp6;
00287 tmp13 = tmp4 - tmp7;
00288
00289 dataptr[DCTSIZE*1] = tmp10 + tmp11;
00290 dataptr[DCTSIZE*5] = tmp10 - tmp11;
00291
00292 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781);
00293 dataptr[DCTSIZE*3] = tmp13 + z1;
00294 dataptr[DCTSIZE*7] = tmp13 - z1;
00295
00296 dataptr++;
00297 }
00298 }
00299
00300
00301 #undef GLOBAL
00302 #undef CONST_BITS
00303 #undef DESCALE
00304 #undef FIX_0_541196100
00305 #undef FIX_1_306562965