Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
jidctred.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #define JPEG_INTERNALS
00024 #include "jinclude.h"
00025 #include "jpeglib.h"
00026 #include "jdct.h"
00027
00028 #ifdef IDCT_SCALING_SUPPORTED
00029
00030
00031
00032
00033
00034
00035 #if DCTSIZE != 8
00036 Sorry, this code only copes with 8x8 DCTs.
00037 #endif
00038
00039
00040
00041
00042 #if BITS_IN_JSAMPLE == 8
00043 #define CONST_BITS 13
00044 #define PASS1_BITS 2
00045 #else
00046 #define CONST_BITS 13
00047 #define PASS1_BITS 1
00048 #endif
00049
00050
00051
00052
00053
00054
00055
00056
00057 #if CONST_BITS == 13
00058 #define FIX_0_211164243 ((INT32) 1730)
00059 #define FIX_0_509795579 ((INT32) 4176)
00060 #define FIX_0_601344887 ((INT32) 4926)
00061 #define FIX_0_720959822 ((INT32) 5906)
00062 #define FIX_0_765366865 ((INT32) 6270)
00063 #define FIX_0_850430095 ((INT32) 6967)
00064 #define FIX_0_899976223 ((INT32) 7373)
00065 #define FIX_1_061594337 ((INT32) 8697)
00066 #define FIX_1_272758580 ((INT32) 10426)
00067 #define FIX_1_451774981 ((INT32) 11893)
00068 #define FIX_1_847759065 ((INT32) 15137)
00069 #define FIX_2_172734803 ((INT32) 17799)
00070 #define FIX_2_562915447 ((INT32) 20995)
00071 #define FIX_3_624509785 ((INT32) 29692)
00072 #else
00073 #define FIX_0_211164243 FIX(0.211164243)
00074 #define FIX_0_509795579 FIX(0.509795579)
00075 #define FIX_0_601344887 FIX(0.601344887)
00076 #define FIX_0_720959822 FIX(0.720959822)
00077 #define FIX_0_765366865 FIX(0.765366865)
00078 #define FIX_0_850430095 FIX(0.850430095)
00079 #define FIX_0_899976223 FIX(0.899976223)
00080 #define FIX_1_061594337 FIX(1.061594337)
00081 #define FIX_1_272758580 FIX(1.272758580)
00082 #define FIX_1_451774981 FIX(1.451774981)
00083 #define FIX_1_847759065 FIX(1.847759065)
00084 #define FIX_2_172734803 FIX(2.172734803)
00085 #define FIX_2_562915447 FIX(2.562915447)
00086 #define FIX_3_624509785 FIX(3.624509785)
00087 #endif
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 #if BITS_IN_JSAMPLE == 8
00098 #define MULTIPLY(var,const) MULTIPLY16C16(var,const)
00099 #else
00100 #define MULTIPLY(var,const) ((var) * (const))
00101 #endif
00102
00103
00104
00105
00106
00107
00108
00109 #define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval))
00110
00111
00112
00113
00114
00115
00116
00117 GLOBAL(void)
00118 jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
00119 JCOEFPTR coef_block,
00120 JSAMPARRAY output_buf, JDIMENSION output_col)
00121 {
00122 INT32 tmp0, tmp2, tmp10, tmp12;
00123 INT32 z1, z2, z3, z4;
00124 JCOEFPTR inptr;
00125 ISLOW_MULT_TYPE * quantptr;
00126 int * wsptr;
00127 JSAMPROW outptr;
00128 JSAMPLE *range_limit = IDCT_range_limit(cinfo);
00129 int ctr;
00130 int workspace[DCTSIZE*4];
00131 SHIFT_TEMPS
00132
00133
00134
00135 inptr = coef_block;
00136 quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
00137 wsptr = workspace;
00138 for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
00139
00140 if (ctr == DCTSIZE-4)
00141 continue;
00142 if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
00143 inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 &&
00144 inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) {
00145
00146 int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
00147
00148 wsptr[DCTSIZE*0] = dcval;
00149 wsptr[DCTSIZE*1] = dcval;
00150 wsptr[DCTSIZE*2] = dcval;
00151 wsptr[DCTSIZE*3] = dcval;
00152
00153 continue;
00154 }
00155
00156
00157
00158 tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
00159 tmp0 <<= (CONST_BITS+1);
00160
00161 z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
00162 z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
00163
00164 tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865);
00165
00166 tmp10 = tmp0 + tmp2;
00167 tmp12 = tmp0 - tmp2;
00168
00169
00170
00171 z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
00172 z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
00173 z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
00174 z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
00175
00176 tmp0 = MULTIPLY(z1, - FIX_0_211164243)
00177 + MULTIPLY(z2, FIX_1_451774981)
00178 + MULTIPLY(z3, - FIX_2_172734803)
00179 + MULTIPLY(z4, FIX_1_061594337);
00180
00181 tmp2 = MULTIPLY(z1, - FIX_0_509795579)
00182 + MULTIPLY(z2, - FIX_0_601344887)
00183 + MULTIPLY(z3, FIX_0_899976223)
00184 + MULTIPLY(z4, FIX_2_562915447);
00185
00186
00187
00188 wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1);
00189 wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1);
00190 wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1);
00191 wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1);
00192 }
00193
00194
00195
00196 wsptr = workspace;
00197 for (ctr = 0; ctr < 4; ctr++) {
00198 outptr = output_buf[ctr] + output_col;
00199
00200
00201 #ifndef NO_ZERO_ROW_TEST
00202 if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 &&
00203 wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
00204
00205 JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
00206 & RANGE_MASK];
00207
00208 outptr[0] = dcval;
00209 outptr[1] = dcval;
00210 outptr[2] = dcval;
00211 outptr[3] = dcval;
00212
00213 wsptr += DCTSIZE;
00214 continue;
00215 }
00216 #endif
00217
00218
00219
00220 tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1);
00221
00222 tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065)
00223 + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865);
00224
00225 tmp10 = tmp0 + tmp2;
00226 tmp12 = tmp0 - tmp2;
00227
00228
00229
00230 z1 = (INT32) wsptr[7];
00231 z2 = (INT32) wsptr[5];
00232 z3 = (INT32) wsptr[3];
00233 z4 = (INT32) wsptr[1];
00234
00235 tmp0 = MULTIPLY(z1, - FIX_0_211164243)
00236 + MULTIPLY(z2, FIX_1_451774981)
00237 + MULTIPLY(z3, - FIX_2_172734803)
00238 + MULTIPLY(z4, FIX_1_061594337);
00239
00240 tmp2 = MULTIPLY(z1, - FIX_0_509795579)
00241 + MULTIPLY(z2, - FIX_0_601344887)
00242 + MULTIPLY(z3, FIX_0_899976223)
00243 + MULTIPLY(z4, FIX_2_562915447);
00244
00245
00246
00247 outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2,
00248 CONST_BITS+PASS1_BITS+3+1)
00249 & RANGE_MASK];
00250 outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2,
00251 CONST_BITS+PASS1_BITS+3+1)
00252 & RANGE_MASK];
00253 outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0,
00254 CONST_BITS+PASS1_BITS+3+1)
00255 & RANGE_MASK];
00256 outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0,
00257 CONST_BITS+PASS1_BITS+3+1)
00258 & RANGE_MASK];
00259
00260 wsptr += DCTSIZE;
00261 }
00262 }
00263
00264
00265
00266
00267
00268
00269
00270 GLOBAL(void)
00271 jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
00272 JCOEFPTR coef_block,
00273 JSAMPARRAY output_buf, JDIMENSION output_col)
00274 {
00275 INT32 tmp0, tmp10, z1;
00276 JCOEFPTR inptr;
00277 ISLOW_MULT_TYPE * quantptr;
00278 int * wsptr;
00279 JSAMPROW outptr;
00280 JSAMPLE *range_limit = IDCT_range_limit(cinfo);
00281 int ctr;
00282 int workspace[DCTSIZE*2];
00283 SHIFT_TEMPS
00284
00285
00286
00287 inptr = coef_block;
00288 quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
00289 wsptr = workspace;
00290 for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
00291
00292 if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6)
00293 continue;
00294 if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 &&
00295 inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) {
00296
00297 int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
00298
00299 wsptr[DCTSIZE*0] = dcval;
00300 wsptr[DCTSIZE*1] = dcval;
00301
00302 continue;
00303 }
00304
00305
00306
00307 z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
00308 tmp10 = z1 << (CONST_BITS+2);
00309
00310
00311
00312 z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
00313 tmp0 = MULTIPLY(z1, - FIX_0_720959822);
00314 z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
00315 tmp0 += MULTIPLY(z1, FIX_0_850430095);
00316 z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
00317 tmp0 += MULTIPLY(z1, - FIX_1_272758580);
00318 z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
00319 tmp0 += MULTIPLY(z1, FIX_3_624509785);
00320
00321
00322
00323 wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2);
00324 wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2);
00325 }
00326
00327
00328
00329 wsptr = workspace;
00330 for (ctr = 0; ctr < 2; ctr++) {
00331 outptr = output_buf[ctr] + output_col;
00332
00333
00334 #ifndef NO_ZERO_ROW_TEST
00335 if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) {
00336
00337 JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
00338 & RANGE_MASK];
00339
00340 outptr[0] = dcval;
00341 outptr[1] = dcval;
00342
00343 wsptr += DCTSIZE;
00344 continue;
00345 }
00346 #endif
00347
00348
00349
00350 tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2);
00351
00352
00353
00354 tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822)
00355 + MULTIPLY((INT32) wsptr[5], FIX_0_850430095)
00356 + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580)
00357 + MULTIPLY((INT32) wsptr[1], FIX_3_624509785);
00358
00359
00360
00361 outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0,
00362 CONST_BITS+PASS1_BITS+3+2)
00363 & RANGE_MASK];
00364 outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0,
00365 CONST_BITS+PASS1_BITS+3+2)
00366 & RANGE_MASK];
00367
00368 wsptr += DCTSIZE;
00369 }
00370 }
00371
00372
00373
00374
00375
00376
00377
00378 GLOBAL(void)
00379 jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
00380 JCOEFPTR coef_block,
00381 JSAMPARRAY output_buf, JDIMENSION output_col)
00382 {
00383 int dcval;
00384 ISLOW_MULT_TYPE * quantptr;
00385 JSAMPLE *range_limit = IDCT_range_limit(cinfo);
00386 SHIFT_TEMPS
00387
00388
00389
00390
00391 quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
00392 dcval = DEQUANTIZE(coef_block[0], quantptr[0]);
00393 dcval = (int) DESCALE((INT32) dcval, 3);
00394
00395 output_buf[0][output_col] = range_limit[dcval & RANGE_MASK];
00396 }
00397
00398 #endif