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