4 * This file was part of the Independent JPEG Group's software:
5 * Copyright (C) 1994-1998, Thomas G. Lane.
6 * libjpeg-turbo Modifications:
7 * Copyright (C) 2015, D. R. Commander.
8 * For conditions of distribution and use, see the accompanying README.ijg
11 * This file contains inverse-DCT routines that produce reduced-size output:
12 * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block.
14 * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M)
15 * algorithm used in jidctint.c. We simply replace each 8-to-8 1-D IDCT step
16 * with an 8-to-4 step that produces the four averages of two adjacent outputs
17 * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output).
18 * These steps were derived by computing the corresponding values at the end
19 * of the normal LL&M code, then simplifying as much as possible.
21 * 1x1 is trivial: just take the DC coefficient divided by 8.
23 * See jidctint.c for additional comments.
26 #define JPEG_INTERNALS
29 #include "jdct.h" /* Private declarations for DCT subsystem */
31 #ifdef IDCT_SCALING_SUPPORTED
35 * This module is specialized to the case DCTSIZE = 8.
39 Sorry
, this code only copes with
8x8 DCTs
. /* deliberate syntax err */
43 /* Scaling is the same as in jidctint.c. */
45 #if BITS_IN_JSAMPLE == 8
50 #define PASS1_BITS 1 /* lose a little precision to avoid overflow */
53 /* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
54 * causing a lot of useless floating-point operations at run time.
55 * To get around this we use the following pre-calculated constants.
56 * If you change CONST_BITS you may want to add appropriate values.
57 * (With a reasonable C compiler, you can just rely on the FIX() macro...)
61 #define FIX_0_211164243 ((JLONG)1730) /* FIX(0.211164243) */
62 #define FIX_0_509795579 ((JLONG)4176) /* FIX(0.509795579) */
63 #define FIX_0_601344887 ((JLONG)4926) /* FIX(0.601344887) */
64 #define FIX_0_720959822 ((JLONG)5906) /* FIX(0.720959822) */
65 #define FIX_0_765366865 ((JLONG)6270) /* FIX(0.765366865) */
66 #define FIX_0_850430095 ((JLONG)6967) /* FIX(0.850430095) */
67 #define FIX_0_899976223 ((JLONG)7373) /* FIX(0.899976223) */
68 #define FIX_1_061594337 ((JLONG)8697) /* FIX(1.061594337) */
69 #define FIX_1_272758580 ((JLONG)10426) /* FIX(1.272758580) */
70 #define FIX_1_451774981 ((JLONG)11893) /* FIX(1.451774981) */
71 #define FIX_1_847759065 ((JLONG)15137) /* FIX(1.847759065) */
72 #define FIX_2_172734803 ((JLONG)17799) /* FIX(2.172734803) */
73 #define FIX_2_562915447 ((JLONG)20995) /* FIX(2.562915447) */
74 #define FIX_3_624509785 ((JLONG)29692) /* FIX(3.624509785) */
76 #define FIX_0_211164243 FIX(0.211164243)
77 #define FIX_0_509795579 FIX(0.509795579)
78 #define FIX_0_601344887 FIX(0.601344887)
79 #define FIX_0_720959822 FIX(0.720959822)
80 #define FIX_0_765366865 FIX(0.765366865)
81 #define FIX_0_850430095 FIX(0.850430095)
82 #define FIX_0_899976223 FIX(0.899976223)
83 #define FIX_1_061594337 FIX(1.061594337)
84 #define FIX_1_272758580 FIX(1.272758580)
85 #define FIX_1_451774981 FIX(1.451774981)
86 #define FIX_1_847759065 FIX(1.847759065)
87 #define FIX_2_172734803 FIX(2.172734803)
88 #define FIX_2_562915447 FIX(2.562915447)
89 #define FIX_3_624509785 FIX(3.624509785)
93 /* Multiply a JLONG variable by a JLONG constant to yield a JLONG result.
94 * For 8-bit samples with the recommended scaling, all the variable
95 * and constant values involved are no more than 16 bits wide, so a
96 * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
97 * For 12-bit samples, a full 32-bit multiplication will be needed.
100 #if BITS_IN_JSAMPLE == 8
101 #define MULTIPLY(var, const) MULTIPLY16C16(var, const)
103 #define MULTIPLY(var, const) ((var) * (const))
107 /* Dequantize a coefficient by multiplying it by the multiplier-table
108 * entry; produce an int result. In this module, both inputs and result
109 * are 16 bits or less, so either int or short multiply will work.
112 #define DEQUANTIZE(coef, quantval) (((ISLOW_MULT_TYPE)(coef)) * (quantval))
116 * Perform dequantization and inverse DCT on one block of coefficients,
117 * producing a reduced-size 4x4 output block.
121 jpeg_idct_4x4(j_decompress_ptr cinfo
, jpeg_component_info
*compptr
,
122 JCOEFPTR coef_block
, JSAMPARRAY output_buf
,
123 JDIMENSION output_col
)
125 JLONG tmp0
, tmp2
, tmp10
, tmp12
;
126 JLONG z1
, z2
, z3
, z4
;
128 ISLOW_MULT_TYPE
*quantptr
;
131 JSAMPLE
*range_limit
= IDCT_range_limit(cinfo
);
133 int workspace
[DCTSIZE
* 4]; /* buffers data between passes */
136 /* Pass 1: process columns from input, store into work array. */
139 quantptr
= (ISLOW_MULT_TYPE
*)compptr
->dct_table
;
141 for (ctr
= DCTSIZE
; ctr
> 0; inptr
++, quantptr
++, wsptr
++, ctr
--) {
142 /* Don't bother to process column 4, because second pass won't use it */
143 if (ctr
== DCTSIZE
- 4)
145 if (inptr
[DCTSIZE
* 1] == 0 && inptr
[DCTSIZE
* 2] == 0 &&
146 inptr
[DCTSIZE
* 3] == 0 && inptr
[DCTSIZE
* 5] == 0 &&
147 inptr
[DCTSIZE
* 6] == 0 && inptr
[DCTSIZE
* 7] == 0) {
148 /* AC terms all zero; we need not examine term 4 for 4x4 output */
149 int dcval
= LEFT_SHIFT(DEQUANTIZE(inptr
[DCTSIZE
* 0],
150 quantptr
[DCTSIZE
* 0]), PASS1_BITS
);
152 wsptr
[DCTSIZE
* 0] = dcval
;
153 wsptr
[DCTSIZE
* 1] = dcval
;
154 wsptr
[DCTSIZE
* 2] = dcval
;
155 wsptr
[DCTSIZE
* 3] = dcval
;
162 tmp0
= DEQUANTIZE(inptr
[DCTSIZE
* 0], quantptr
[DCTSIZE
* 0]);
163 tmp0
= LEFT_SHIFT(tmp0
, CONST_BITS
+ 1);
165 z2
= DEQUANTIZE(inptr
[DCTSIZE
* 2], quantptr
[DCTSIZE
* 2]);
166 z3
= DEQUANTIZE(inptr
[DCTSIZE
* 6], quantptr
[DCTSIZE
* 6]);
168 tmp2
= MULTIPLY(z2
, FIX_1_847759065
) + MULTIPLY(z3
, -FIX_0_765366865
);
175 z1
= DEQUANTIZE(inptr
[DCTSIZE
* 7], quantptr
[DCTSIZE
* 7]);
176 z2
= DEQUANTIZE(inptr
[DCTSIZE
* 5], quantptr
[DCTSIZE
* 5]);
177 z3
= DEQUANTIZE(inptr
[DCTSIZE
* 3], quantptr
[DCTSIZE
* 3]);
178 z4
= DEQUANTIZE(inptr
[DCTSIZE
* 1], quantptr
[DCTSIZE
* 1]);
180 tmp0
= MULTIPLY(z1
, -FIX_0_211164243
) + /* sqrt(2) * ( c3-c1) */
181 MULTIPLY(z2
, FIX_1_451774981
) + /* sqrt(2) * ( c3+c7) */
182 MULTIPLY(z3
, -FIX_2_172734803
) + /* sqrt(2) * (-c1-c5) */
183 MULTIPLY(z4
, FIX_1_061594337
); /* sqrt(2) * ( c5+c7) */
185 tmp2
= MULTIPLY(z1
, -FIX_0_509795579
) + /* sqrt(2) * (c7-c5) */
186 MULTIPLY(z2
, -FIX_0_601344887
) + /* sqrt(2) * (c5-c1) */
187 MULTIPLY(z3
, FIX_0_899976223
) + /* sqrt(2) * (c3-c7) */
188 MULTIPLY(z4
, FIX_2_562915447
); /* sqrt(2) * (c1+c3) */
190 /* Final output stage */
193 (int)DESCALE(tmp10
+ tmp2
, CONST_BITS
- PASS1_BITS
+ 1);
195 (int)DESCALE(tmp10
- tmp2
, CONST_BITS
- PASS1_BITS
+ 1);
197 (int)DESCALE(tmp12
+ tmp0
, CONST_BITS
- PASS1_BITS
+ 1);
199 (int)DESCALE(tmp12
- tmp0
, CONST_BITS
- PASS1_BITS
+ 1);
202 /* Pass 2: process 4 rows from work array, store into output array. */
205 for (ctr
= 0; ctr
< 4; ctr
++) {
206 outptr
= output_buf
[ctr
] + output_col
;
207 /* It's not clear whether a zero row test is worthwhile here ... */
209 #ifndef NO_ZERO_ROW_TEST
210 if (wsptr
[1] == 0 && wsptr
[2] == 0 && wsptr
[3] == 0 &&
211 wsptr
[5] == 0 && wsptr
[6] == 0 && wsptr
[7] == 0) {
212 /* AC terms all zero */
213 JSAMPLE dcval
= range_limit
[(int)DESCALE((JLONG
)wsptr
[0],
214 PASS1_BITS
+ 3) & RANGE_MASK
];
221 wsptr
+= DCTSIZE
; /* advance pointer to next row */
228 tmp0
= LEFT_SHIFT((JLONG
)wsptr
[0], CONST_BITS
+ 1);
230 tmp2
= MULTIPLY((JLONG
)wsptr
[2], FIX_1_847759065
) +
231 MULTIPLY((JLONG
)wsptr
[6], -FIX_0_765366865
);
238 z1
= (JLONG
)wsptr
[7];
239 z2
= (JLONG
)wsptr
[5];
240 z3
= (JLONG
)wsptr
[3];
241 z4
= (JLONG
)wsptr
[1];
243 tmp0
= MULTIPLY(z1
, -FIX_0_211164243
) + /* sqrt(2) * ( c3-c1) */
244 MULTIPLY(z2
, FIX_1_451774981
) + /* sqrt(2) * ( c3+c7) */
245 MULTIPLY(z3
, -FIX_2_172734803
) + /* sqrt(2) * (-c1-c5) */
246 MULTIPLY(z4
, FIX_1_061594337
); /* sqrt(2) * ( c5+c7) */
248 tmp2
= MULTIPLY(z1
, -FIX_0_509795579
) + /* sqrt(2) * (c7-c5) */
249 MULTIPLY(z2
, -FIX_0_601344887
) + /* sqrt(2) * (c5-c1) */
250 MULTIPLY(z3
, FIX_0_899976223
) + /* sqrt(2) * (c3-c7) */
251 MULTIPLY(z4
, FIX_2_562915447
); /* sqrt(2) * (c1+c3) */
253 /* Final output stage */
255 outptr
[0] = range_limit
[(int)DESCALE(tmp10
+ tmp2
,
256 CONST_BITS
+ PASS1_BITS
+ 3 + 1) &
258 outptr
[3] = range_limit
[(int)DESCALE(tmp10
- tmp2
,
259 CONST_BITS
+ PASS1_BITS
+ 3 + 1) &
261 outptr
[1] = range_limit
[(int)DESCALE(tmp12
+ tmp0
,
262 CONST_BITS
+ PASS1_BITS
+ 3 + 1) &
264 outptr
[2] = range_limit
[(int)DESCALE(tmp12
- tmp0
,
265 CONST_BITS
+ PASS1_BITS
+ 3 + 1) &
268 wsptr
+= DCTSIZE
; /* advance pointer to next row */
274 * Perform dequantization and inverse DCT on one block of coefficients,
275 * producing a reduced-size 2x2 output block.
279 jpeg_idct_2x2(j_decompress_ptr cinfo
, jpeg_component_info
*compptr
,
280 JCOEFPTR coef_block
, JSAMPARRAY output_buf
,
281 JDIMENSION output_col
)
283 JLONG tmp0
, tmp10
, z1
;
285 ISLOW_MULT_TYPE
*quantptr
;
288 JSAMPLE
*range_limit
= IDCT_range_limit(cinfo
);
290 int workspace
[DCTSIZE
* 2]; /* buffers data between passes */
293 /* Pass 1: process columns from input, store into work array. */
296 quantptr
= (ISLOW_MULT_TYPE
*)compptr
->dct_table
;
298 for (ctr
= DCTSIZE
; ctr
> 0; inptr
++, quantptr
++, wsptr
++, ctr
--) {
299 /* Don't bother to process columns 2,4,6 */
300 if (ctr
== DCTSIZE
- 2 || ctr
== DCTSIZE
- 4 || ctr
== DCTSIZE
- 6)
302 if (inptr
[DCTSIZE
* 1] == 0 && inptr
[DCTSIZE
* 3] == 0 &&
303 inptr
[DCTSIZE
* 5] == 0 && inptr
[DCTSIZE
* 7] == 0) {
304 /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */
305 int dcval
= LEFT_SHIFT(DEQUANTIZE(inptr
[DCTSIZE
* 0],
306 quantptr
[DCTSIZE
* 0]), PASS1_BITS
);
308 wsptr
[DCTSIZE
* 0] = dcval
;
309 wsptr
[DCTSIZE
* 1] = dcval
;
316 z1
= DEQUANTIZE(inptr
[DCTSIZE
* 0], quantptr
[DCTSIZE
* 0]);
317 tmp10
= LEFT_SHIFT(z1
, CONST_BITS
+ 2);
321 z1
= DEQUANTIZE(inptr
[DCTSIZE
* 7], quantptr
[DCTSIZE
* 7]);
322 tmp0
= MULTIPLY(z1
, -FIX_0_720959822
); /* sqrt(2) * ( c7-c5+c3-c1) */
323 z1
= DEQUANTIZE(inptr
[DCTSIZE
* 5], quantptr
[DCTSIZE
* 5]);
324 tmp0
+= MULTIPLY(z1
, FIX_0_850430095
); /* sqrt(2) * (-c1+c3+c5+c7) */
325 z1
= DEQUANTIZE(inptr
[DCTSIZE
* 3], quantptr
[DCTSIZE
* 3]);
326 tmp0
+= MULTIPLY(z1
, -FIX_1_272758580
); /* sqrt(2) * (-c1+c3-c5-c7) */
327 z1
= DEQUANTIZE(inptr
[DCTSIZE
* 1], quantptr
[DCTSIZE
* 1]);
328 tmp0
+= MULTIPLY(z1
, FIX_3_624509785
); /* sqrt(2) * ( c1+c3+c5+c7) */
330 /* Final output stage */
333 (int)DESCALE(tmp10
+ tmp0
, CONST_BITS
- PASS1_BITS
+ 2);
335 (int)DESCALE(tmp10
- tmp0
, CONST_BITS
- PASS1_BITS
+ 2);
338 /* Pass 2: process 2 rows from work array, store into output array. */
341 for (ctr
= 0; ctr
< 2; ctr
++) {
342 outptr
= output_buf
[ctr
] + output_col
;
343 /* It's not clear whether a zero row test is worthwhile here ... */
345 #ifndef NO_ZERO_ROW_TEST
346 if (wsptr
[1] == 0 && wsptr
[3] == 0 && wsptr
[5] == 0 && wsptr
[7] == 0) {
347 /* AC terms all zero */
348 JSAMPLE dcval
= range_limit
[(int)DESCALE((JLONG
)wsptr
[0],
349 PASS1_BITS
+ 3) & RANGE_MASK
];
354 wsptr
+= DCTSIZE
; /* advance pointer to next row */
361 tmp10
= LEFT_SHIFT((JLONG
)wsptr
[0], CONST_BITS
+ 2);
365 tmp0
= MULTIPLY((JLONG
)wsptr
[7], -FIX_0_720959822
) + /* sqrt(2) * ( c7-c5+c3-c1) */
366 MULTIPLY((JLONG
)wsptr
[5], FIX_0_850430095
) + /* sqrt(2) * (-c1+c3+c5+c7) */
367 MULTIPLY((JLONG
)wsptr
[3], -FIX_1_272758580
) + /* sqrt(2) * (-c1+c3-c5-c7) */
368 MULTIPLY((JLONG
)wsptr
[1], FIX_3_624509785
); /* sqrt(2) * ( c1+c3+c5+c7) */
370 /* Final output stage */
372 outptr
[0] = range_limit
[(int)DESCALE(tmp10
+ tmp0
,
373 CONST_BITS
+ PASS1_BITS
+ 3 + 2) &
375 outptr
[1] = range_limit
[(int)DESCALE(tmp10
- tmp0
,
376 CONST_BITS
+ PASS1_BITS
+ 3 + 2) &
379 wsptr
+= DCTSIZE
; /* advance pointer to next row */
385 * Perform dequantization and inverse DCT on one block of coefficients,
386 * producing a reduced-size 1x1 output block.
390 jpeg_idct_1x1(j_decompress_ptr cinfo
, jpeg_component_info
*compptr
,
391 JCOEFPTR coef_block
, JSAMPARRAY output_buf
,
392 JDIMENSION output_col
)
395 ISLOW_MULT_TYPE
*quantptr
;
396 JSAMPLE
*range_limit
= IDCT_range_limit(cinfo
);
399 /* We hardly need an inverse DCT routine for this: just take the
400 * average pixel value, which is one-eighth of the DC coefficient.
402 quantptr
= (ISLOW_MULT_TYPE
*)compptr
->dct_table
;
403 dcval
= DEQUANTIZE(coef_block
[0], quantptr
[0]);
404 dcval
= (int)DESCALE((JLONG
)dcval
, 3);
406 output_buf
[0][output_col
] = range_limit
[dcval
& RANGE_MASK
];
409 #endif /* IDCT_SCALING_SUPPORTED */