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
00031 #include <stdlib.h>
00032 #include <stdio.h>
00033 #include "common.h"
00034 #include "dsputil.h"
00035
00036 #define SHIFT_TEMPS
00037 #define DCTSIZE 8
00038 #define BITS_IN_JSAMPLE 8
00039 #define GLOBAL(x) x
00040 #define RIGHT_SHIFT(x, n) ((x) >> (n))
00041 #define MULTIPLY16C16(var,const) ((var)*(const))
00042
00043 #if 1 //def USE_ACCURATE_ROUNDING
00044 #define DESCALE(x,n) RIGHT_SHIFT((x) + (1 << ((n) - 1)), n)
00045 #else
00046 #define DESCALE(x,n) RIGHT_SHIFT(x, n)
00047 #endif
00048
00049
00050
00051
00052
00053
00054 #if DCTSIZE != 8
00055 Sorry, this code only copes with 8x8 DCTs.
00056 #endif
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 #if BITS_IN_JSAMPLE == 8
00094 #define CONST_BITS 13
00095 #define PASS1_BITS 4
00096 #else
00097 #define CONST_BITS 13
00098 #define PASS1_BITS 1
00099 #endif
00100
00101
00102
00103
00104
00105
00106
00107
00108 #if CONST_BITS == 13
00109 #define FIX_0_298631336 ((int32_t) 2446)
00110 #define FIX_0_390180644 ((int32_t) 3196)
00111 #define FIX_0_541196100 ((int32_t) 4433)
00112 #define FIX_0_765366865 ((int32_t) 6270)
00113 #define FIX_0_899976223 ((int32_t) 7373)
00114 #define FIX_1_175875602 ((int32_t) 9633)
00115 #define FIX_1_501321110 ((int32_t) 12299)
00116 #define FIX_1_847759065 ((int32_t) 15137)
00117 #define FIX_1_961570560 ((int32_t) 16069)
00118 #define FIX_2_053119869 ((int32_t) 16819)
00119 #define FIX_2_562915447 ((int32_t) 20995)
00120 #define FIX_3_072711026 ((int32_t) 25172)
00121 #else
00122 #define FIX_0_298631336 FIX(0.298631336)
00123 #define FIX_0_390180644 FIX(0.390180644)
00124 #define FIX_0_541196100 FIX(0.541196100)
00125 #define FIX_0_765366865 FIX(0.765366865)
00126 #define FIX_0_899976223 FIX(0.899976223)
00127 #define FIX_1_175875602 FIX(1.175875602)
00128 #define FIX_1_501321110 FIX(1.501321110)
00129 #define FIX_1_847759065 FIX(1.847759065)
00130 #define FIX_1_961570560 FIX(1.961570560)
00131 #define FIX_2_053119869 FIX(2.053119869)
00132 #define FIX_2_562915447 FIX(2.562915447)
00133 #define FIX_3_072711026 FIX(3.072711026)
00134 #endif
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 #if BITS_IN_JSAMPLE == 8 && CONST_BITS<=13 && PASS1_BITS<=2
00145 #define MULTIPLY(var,const) MULTIPLY16C16(var,const)
00146 #else
00147 #define MULTIPLY(var,const) ((var) * (const))
00148 #endif
00149
00150
00151 static always_inline void row_fdct(DCTELEM * data){
00152 int_fast32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
00153 int_fast32_t tmp10, tmp11, tmp12, tmp13;
00154 int_fast32_t z1, z2, z3, z4, z5;
00155 DCTELEM *dataptr;
00156 int ctr;
00157 SHIFT_TEMPS
00158
00159
00160
00161
00162
00163 dataptr = data;
00164 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00165 tmp0 = dataptr[0] + dataptr[7];
00166 tmp7 = dataptr[0] - dataptr[7];
00167 tmp1 = dataptr[1] + dataptr[6];
00168 tmp6 = dataptr[1] - dataptr[6];
00169 tmp2 = dataptr[2] + dataptr[5];
00170 tmp5 = dataptr[2] - dataptr[5];
00171 tmp3 = dataptr[3] + dataptr[4];
00172 tmp4 = dataptr[3] - dataptr[4];
00173
00174
00175
00176
00177
00178 tmp10 = tmp0 + tmp3;
00179 tmp13 = tmp0 - tmp3;
00180 tmp11 = tmp1 + tmp2;
00181 tmp12 = tmp1 - tmp2;
00182
00183 dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);
00184 dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
00185
00186 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
00187 dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
00188 CONST_BITS-PASS1_BITS);
00189 dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
00190 CONST_BITS-PASS1_BITS);
00191
00192
00193
00194
00195
00196
00197 z1 = tmp4 + tmp7;
00198 z2 = tmp5 + tmp6;
00199 z3 = tmp4 + tmp6;
00200 z4 = tmp5 + tmp7;
00201 z5 = MULTIPLY(z3 + z4, FIX_1_175875602);
00202
00203 tmp4 = MULTIPLY(tmp4, FIX_0_298631336);
00204 tmp5 = MULTIPLY(tmp5, FIX_2_053119869);
00205 tmp6 = MULTIPLY(tmp6, FIX_3_072711026);
00206 tmp7 = MULTIPLY(tmp7, FIX_1_501321110);
00207 z1 = MULTIPLY(z1, - FIX_0_899976223);
00208 z2 = MULTIPLY(z2, - FIX_2_562915447);
00209 z3 = MULTIPLY(z3, - FIX_1_961570560);
00210 z4 = MULTIPLY(z4, - FIX_0_390180644);
00211
00212 z3 += z5;
00213 z4 += z5;
00214
00215 dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);
00216 dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);
00217 dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);
00218 dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);
00219
00220 dataptr += DCTSIZE;
00221 }
00222 }
00223
00224
00225
00226
00227
00228 GLOBAL(void)
00229 ff_jpeg_fdct_islow (DCTELEM * data)
00230 {
00231 int_fast32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
00232 int_fast32_t tmp10, tmp11, tmp12, tmp13;
00233 int_fast32_t z1, z2, z3, z4, z5;
00234 DCTELEM *dataptr;
00235 int ctr;
00236 SHIFT_TEMPS
00237
00238 row_fdct(data);
00239
00240
00241
00242
00243
00244
00245 dataptr = data;
00246 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00247 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
00248 tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
00249 tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
00250 tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
00251 tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
00252 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
00253 tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
00254 tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
00255
00256
00257
00258
00259
00260 tmp10 = tmp0 + tmp3;
00261 tmp13 = tmp0 - tmp3;
00262 tmp11 = tmp1 + tmp2;
00263 tmp12 = tmp1 - tmp2;
00264
00265 dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
00266 dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);
00267
00268 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
00269 dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
00270 CONST_BITS+PASS1_BITS);
00271 dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
00272 CONST_BITS+PASS1_BITS);
00273
00274
00275
00276
00277
00278
00279 z1 = tmp4 + tmp7;
00280 z2 = tmp5 + tmp6;
00281 z3 = tmp4 + tmp6;
00282 z4 = tmp5 + tmp7;
00283 z5 = MULTIPLY(z3 + z4, FIX_1_175875602);
00284
00285 tmp4 = MULTIPLY(tmp4, FIX_0_298631336);
00286 tmp5 = MULTIPLY(tmp5, FIX_2_053119869);
00287 tmp6 = MULTIPLY(tmp6, FIX_3_072711026);
00288 tmp7 = MULTIPLY(tmp7, FIX_1_501321110);
00289 z1 = MULTIPLY(z1, - FIX_0_899976223);
00290 z2 = MULTIPLY(z2, - FIX_2_562915447);
00291 z3 = MULTIPLY(z3, - FIX_1_961570560);
00292 z4 = MULTIPLY(z4, - FIX_0_390180644);
00293
00294 z3 += z5;
00295 z4 += z5;
00296
00297 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3,
00298 CONST_BITS+PASS1_BITS);
00299 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4,
00300 CONST_BITS+PASS1_BITS);
00301 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3,
00302 CONST_BITS+PASS1_BITS);
00303 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4,
00304 CONST_BITS+PASS1_BITS);
00305
00306 dataptr++;
00307 }
00308 }
00309
00310
00311
00312
00313
00314
00315 GLOBAL(void)
00316 ff_fdct248_islow (DCTELEM * data)
00317 {
00318 int_fast32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
00319 int_fast32_t tmp10, tmp11, tmp12, tmp13;
00320 int_fast32_t z1;
00321 DCTELEM *dataptr;
00322 int ctr;
00323 SHIFT_TEMPS
00324
00325 row_fdct(data);
00326
00327
00328
00329
00330
00331
00332 dataptr = data;
00333 for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00334 tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*1];
00335 tmp1 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];
00336 tmp2 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5];
00337 tmp3 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7];
00338 tmp4 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*1];
00339 tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];
00340 tmp6 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5];
00341 tmp7 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7];
00342
00343 tmp10 = tmp0 + tmp3;
00344 tmp11 = tmp1 + tmp2;
00345 tmp12 = tmp1 - tmp2;
00346 tmp13 = tmp0 - tmp3;
00347
00348 dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
00349 dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);
00350
00351 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
00352 dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
00353 CONST_BITS+PASS1_BITS);
00354 dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
00355 CONST_BITS+PASS1_BITS);
00356
00357 tmp10 = tmp4 + tmp7;
00358 tmp11 = tmp5 + tmp6;
00359 tmp12 = tmp5 - tmp6;
00360 tmp13 = tmp4 - tmp7;
00361
00362 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
00363 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);
00364
00365 z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
00366 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
00367 CONST_BITS+PASS1_BITS);
00368 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
00369 CONST_BITS+PASS1_BITS);
00370
00371 dataptr++;
00372 }
00373 }