blob: bdbde3454d82544fbfa5f24ea44581eefa024889 [file] [log] [blame]
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +00001/*
2 * jddctmgr.c
3 *
Thomas G. Lane489583f1996-02-07 00:00:00 +00004 * Copyright (C) 1994-1996, Thomas G. Lane.
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +00005 * This file is part of the Independent JPEG Group's software.
6 * For conditions of distribution and use, see the accompanying README file.
7 *
8 * This file contains the inverse-DCT management logic.
9 * This code selects a particular IDCT implementation to be used,
10 * and it performs related housekeeping chores. No code in this file
Thomas G. Lanebc79e061995-08-02 00:00:00 +000011 * is executed per IDCT step, only during output pass setup.
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000012 *
13 * Note that the IDCT routines are responsible for performing coefficient
14 * dequantization as well as the IDCT proper. This module sets up the
15 * dequantization multiplier table needed by the IDCT routine.
16 */
17
18#define JPEG_INTERNALS
19#include "jinclude.h"
20#include "jpeglib.h"
21#include "jdct.h" /* Private declarations for DCT subsystem */
22
23
Thomas G. Lanebc79e061995-08-02 00:00:00 +000024/*
25 * The decompressor input side (jdinput.c) saves away the appropriate
26 * quantization table for each component at the start of the first scan
27 * involving that component. (This is necessary in order to correctly
28 * decode files that reuse Q-table slots.)
29 * When we are ready to make an output pass, the saved Q-table is converted
30 * to a multiplier table that will actually be used by the IDCT routine.
31 * The multiplier table contents are IDCT-method-dependent. To support
32 * application changes in IDCT method between scans, we can remake the
33 * multiplier tables if necessary.
34 * In buffered-image mode, the first output pass may occur before any data
35 * has been seen for some components, and thus before their Q-tables have
36 * been saved away. To handle this case, multiplier tables are preset
37 * to zeroes; the result of the IDCT will be a neutral gray level.
38 */
39
40
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000041/* Private subobject for this module */
42
43typedef struct {
44 struct jpeg_inverse_dct pub; /* public fields */
45
Thomas G. Lanebc79e061995-08-02 00:00:00 +000046 /* This array contains the IDCT method code that each multiplier table
47 * is currently set up for, or -1 if it's not yet set up.
48 * The actual multiplier tables are pointed to by dct_table in the
49 * per-component comp_info structures.
50 */
51 int cur_method[MAX_COMPONENTS];
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000052} my_idct_controller;
53
54typedef my_idct_controller * my_idct_ptr;
55
56
Thomas G. Lanebc79e061995-08-02 00:00:00 +000057/* Allocated multiplier tables: big enough for any supported variant */
58
59typedef union {
60 ISLOW_MULT_TYPE islow_array[DCTSIZE2];
61#ifdef DCT_IFAST_SUPPORTED
62 IFAST_MULT_TYPE ifast_array[DCTSIZE2];
63#endif
64#ifdef DCT_FLOAT_SUPPORTED
65 FLOAT_MULT_TYPE float_array[DCTSIZE2];
66#endif
67} multiplier_table;
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000068
69
70/* The current scaled-IDCT routines require ISLOW-style multiplier tables,
71 * so be sure to compile that code if either ISLOW or SCALING is requested.
72 */
73#ifdef DCT_ISLOW_SUPPORTED
74#define PROVIDE_ISLOW_TABLES
75#else
76#ifdef IDCT_SCALING_SUPPORTED
77#define PROVIDE_ISLOW_TABLES
78#endif
79#endif
80
81
82/*
Thomas G. Lanebc79e061995-08-02 00:00:00 +000083 * Prepare for an output pass.
84 * Here we select the proper IDCT routine for each component and build
85 * a matching multiplier table.
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000086 */
87
Thomas G. Lane489583f1996-02-07 00:00:00 +000088METHODDEF(void)
Thomas G. Lanebc79e061995-08-02 00:00:00 +000089start_pass (j_decompress_ptr cinfo)
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000090{
91 my_idct_ptr idct = (my_idct_ptr) cinfo->idct;
Thomas G. Lanebc79e061995-08-02 00:00:00 +000092 int ci, i;
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000093 jpeg_component_info *compptr;
Thomas G. Lanebc79e061995-08-02 00:00:00 +000094 int method = 0;
95 inverse_DCT_method_ptr method_ptr = NULL;
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +000096 JQUANT_TBL * qtbl;
97
Thomas G. Lanebc79e061995-08-02 00:00:00 +000098 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
99 ci++, compptr++) {
100 /* Select the proper IDCT routine for this component's scaling */
Guido Vollbeding5996a252009-06-27 00:00:00 +0000101 switch ((compptr->DCT_h_scaled_size << 8) + compptr->DCT_v_scaled_size) {
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000102#ifdef IDCT_SCALING_SUPPORTED
Guido Vollbeding5996a252009-06-27 00:00:00 +0000103 case ((1 << 8) + 1):
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000104 method_ptr = jpeg_idct_1x1;
Guido Vollbeding5996a252009-06-27 00:00:00 +0000105 method = JDCT_ISLOW; /* jidctint uses islow-style table */
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000106 break;
Guido Vollbeding5996a252009-06-27 00:00:00 +0000107 case ((2 << 8) + 2):
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000108 method_ptr = jpeg_idct_2x2;
Guido Vollbeding5996a252009-06-27 00:00:00 +0000109 method = JDCT_ISLOW; /* jidctint uses islow-style table */
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000110 break;
Guido Vollbeding5996a252009-06-27 00:00:00 +0000111 case ((3 << 8) + 3):
112 method_ptr = jpeg_idct_3x3;
113 method = JDCT_ISLOW; /* jidctint uses islow-style table */
114 break;
115 case ((4 << 8) + 4):
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000116 method_ptr = jpeg_idct_4x4;
Guido Vollbeding5996a252009-06-27 00:00:00 +0000117 method = JDCT_ISLOW; /* jidctint uses islow-style table */
118 break;
119 case ((5 << 8) + 5):
120 method_ptr = jpeg_idct_5x5;
121 method = JDCT_ISLOW; /* jidctint uses islow-style table */
122 break;
123 case ((6 << 8) + 6):
124 method_ptr = jpeg_idct_6x6;
125 method = JDCT_ISLOW; /* jidctint uses islow-style table */
126 break;
127 case ((7 << 8) + 7):
128 method_ptr = jpeg_idct_7x7;
129 method = JDCT_ISLOW; /* jidctint uses islow-style table */
130 break;
131 case ((9 << 8) + 9):
132 method_ptr = jpeg_idct_9x9;
133 method = JDCT_ISLOW; /* jidctint uses islow-style table */
134 break;
135 case ((10 << 8) + 10):
136 method_ptr = jpeg_idct_10x10;
137 method = JDCT_ISLOW; /* jidctint uses islow-style table */
138 break;
139 case ((11 << 8) + 11):
140 method_ptr = jpeg_idct_11x11;
141 method = JDCT_ISLOW; /* jidctint uses islow-style table */
142 break;
143 case ((12 << 8) + 12):
144 method_ptr = jpeg_idct_12x12;
145 method = JDCT_ISLOW; /* jidctint uses islow-style table */
146 break;
147 case ((13 << 8) + 13):
148 method_ptr = jpeg_idct_13x13;
149 method = JDCT_ISLOW; /* jidctint uses islow-style table */
150 break;
151 case ((14 << 8) + 14):
152 method_ptr = jpeg_idct_14x14;
153 method = JDCT_ISLOW; /* jidctint uses islow-style table */
154 break;
155 case ((15 << 8) + 15):
156 method_ptr = jpeg_idct_15x15;
157 method = JDCT_ISLOW; /* jidctint uses islow-style table */
158 break;
159 case ((16 << 8) + 16):
160 method_ptr = jpeg_idct_16x16;
161 method = JDCT_ISLOW; /* jidctint uses islow-style table */
162 break;
163 case ((16 << 8) + 8):
164 method_ptr = jpeg_idct_16x8;
165 method = JDCT_ISLOW; /* jidctint uses islow-style table */
166 break;
167 case ((14 << 8) + 7):
168 method_ptr = jpeg_idct_14x7;
169 method = JDCT_ISLOW; /* jidctint uses islow-style table */
170 break;
171 case ((12 << 8) + 6):
172 method_ptr = jpeg_idct_12x6;
173 method = JDCT_ISLOW; /* jidctint uses islow-style table */
174 break;
175 case ((10 << 8) + 5):
176 method_ptr = jpeg_idct_10x5;
177 method = JDCT_ISLOW; /* jidctint uses islow-style table */
178 break;
179 case ((8 << 8) + 4):
180 method_ptr = jpeg_idct_8x4;
181 method = JDCT_ISLOW; /* jidctint uses islow-style table */
182 break;
183 case ((6 << 8) + 3):
184 method_ptr = jpeg_idct_6x3;
185 method = JDCT_ISLOW; /* jidctint uses islow-style table */
186 break;
187 case ((4 << 8) + 2):
188 method_ptr = jpeg_idct_4x2;
189 method = JDCT_ISLOW; /* jidctint uses islow-style table */
190 break;
191 case ((2 << 8) + 1):
192 method_ptr = jpeg_idct_2x1;
193 method = JDCT_ISLOW; /* jidctint uses islow-style table */
194 break;
195 case ((8 << 8) + 16):
196 method_ptr = jpeg_idct_8x16;
197 method = JDCT_ISLOW; /* jidctint uses islow-style table */
198 break;
199 case ((7 << 8) + 14):
200 method_ptr = jpeg_idct_7x14;
201 method = JDCT_ISLOW; /* jidctint uses islow-style table */
202 break;
203 case ((6 << 8) + 12):
204 method_ptr = jpeg_idct_6x12;
205 method = JDCT_ISLOW; /* jidctint uses islow-style table */
206 break;
207 case ((5 << 8) + 10):
208 method_ptr = jpeg_idct_5x10;
209 method = JDCT_ISLOW; /* jidctint uses islow-style table */
210 break;
211 case ((4 << 8) + 8):
212 method_ptr = jpeg_idct_4x8;
213 method = JDCT_ISLOW; /* jidctint uses islow-style table */
214 break;
215 case ((3 << 8) + 6):
216 method_ptr = jpeg_idct_3x6;
217 method = JDCT_ISLOW; /* jidctint uses islow-style table */
218 break;
219 case ((2 << 8) + 4):
220 method_ptr = jpeg_idct_2x4;
221 method = JDCT_ISLOW; /* jidctint uses islow-style table */
222 break;
223 case ((1 << 8) + 2):
224 method_ptr = jpeg_idct_1x2;
225 method = JDCT_ISLOW; /* jidctint uses islow-style table */
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000226 break;
227#endif
Guido Vollbeding5996a252009-06-27 00:00:00 +0000228 case ((DCTSIZE << 8) + DCTSIZE):
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000229 switch (cinfo->dct_method) {
230#ifdef DCT_ISLOW_SUPPORTED
231 case JDCT_ISLOW:
232 method_ptr = jpeg_idct_islow;
233 method = JDCT_ISLOW;
234 break;
235#endif
236#ifdef DCT_IFAST_SUPPORTED
237 case JDCT_IFAST:
238 method_ptr = jpeg_idct_ifast;
239 method = JDCT_IFAST;
240 break;
241#endif
242#ifdef DCT_FLOAT_SUPPORTED
243 case JDCT_FLOAT:
244 method_ptr = jpeg_idct_float;
245 method = JDCT_FLOAT;
246 break;
247#endif
248 default:
249 ERREXIT(cinfo, JERR_NOT_COMPILED);
250 break;
251 }
252 break;
253 default:
Guido Vollbeding5996a252009-06-27 00:00:00 +0000254 ERREXIT2(cinfo, JERR_BAD_DCTSIZE,
255 compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size);
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000256 break;
257 }
258 idct->pub.inverse_DCT[ci] = method_ptr;
259 /* Create multiplier table from quant table.
260 * However, we can skip this if the component is uninteresting
261 * or if we already built the table. Also, if no quant table
262 * has yet been saved for the component, we leave the
263 * multiplier table all-zero; we'll be reading zeroes from the
264 * coefficient controller's buffer anyway.
265 */
266 if (! compptr->component_needed || idct->cur_method[ci] == method)
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000267 continue;
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000268 qtbl = compptr->quant_table;
269 if (qtbl == NULL) /* happens if no data yet for component */
270 continue;
271 idct->cur_method[ci] = method;
272 switch (method) {
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000273#ifdef PROVIDE_ISLOW_TABLES
274 case JDCT_ISLOW:
275 {
276 /* For LL&M IDCT method, multipliers are equal to raw quantization
Thomas G. Lane489583f1996-02-07 00:00:00 +0000277 * coefficients, but are stored as ints to ensure access efficiency.
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000278 */
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000279 ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000280 for (i = 0; i < DCTSIZE2; i++) {
Thomas G. Lane489583f1996-02-07 00:00:00 +0000281 ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000282 }
283 }
284 break;
285#endif
286#ifdef DCT_IFAST_SUPPORTED
287 case JDCT_IFAST:
288 {
289 /* For AA&N IDCT method, multipliers are equal to quantization
290 * coefficients scaled by scalefactor[row]*scalefactor[col], where
291 * scalefactor[0] = 1
292 * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
293 * For integer operation, the multiplier table is to be scaled by
Thomas G. Lane489583f1996-02-07 00:00:00 +0000294 * IFAST_SCALE_BITS.
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000295 */
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000296 IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000297#define CONST_BITS 14
298 static const INT16 aanscales[DCTSIZE2] = {
299 /* precomputed values scaled up by 14 bits */
300 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
301 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
302 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
303 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
304 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
305 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
306 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
307 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
308 };
309 SHIFT_TEMPS
310
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000311 for (i = 0; i < DCTSIZE2; i++) {
312 ifmtbl[i] = (IFAST_MULT_TYPE)
Thomas G. Lane489583f1996-02-07 00:00:00 +0000313 DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000314 (INT32) aanscales[i]),
315 CONST_BITS-IFAST_SCALE_BITS);
316 }
317 }
318 break;
319#endif
320#ifdef DCT_FLOAT_SUPPORTED
321 case JDCT_FLOAT:
322 {
323 /* For float AA&N IDCT method, multipliers are equal to quantization
324 * coefficients scaled by scalefactor[row]*scalefactor[col], where
325 * scalefactor[0] = 1
326 * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000327 */
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000328 FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000329 int row, col;
330 static const double aanscalefactor[DCTSIZE] = {
331 1.0, 1.387039845, 1.306562965, 1.175875602,
332 1.0, 0.785694958, 0.541196100, 0.275899379
333 };
334
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000335 i = 0;
336 for (row = 0; row < DCTSIZE; row++) {
337 for (col = 0; col < DCTSIZE; col++) {
338 fmtbl[i] = (FLOAT_MULT_TYPE)
Thomas G. Lane489583f1996-02-07 00:00:00 +0000339 ((double) qtbl->quantval[i] *
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000340 aanscalefactor[row] * aanscalefactor[col]);
341 i++;
342 }
343 }
344 }
345 break;
346#endif
347 default:
348 ERREXIT(cinfo, JERR_NOT_COMPILED);
349 break;
350 }
351 }
352}
353
354
355/*
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000356 * Initialize IDCT manager.
357 */
358
Thomas G. Lane489583f1996-02-07 00:00:00 +0000359GLOBAL(void)
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000360jinit_inverse_dct (j_decompress_ptr cinfo)
361{
362 my_idct_ptr idct;
363 int ci;
364 jpeg_component_info *compptr;
365
366 idct = (my_idct_ptr)
367 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
368 SIZEOF(my_idct_controller));
369 cinfo->idct = (struct jpeg_inverse_dct *) idct;
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000370 idct->pub.start_pass = start_pass;
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000371
372 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
373 ci++, compptr++) {
Thomas G. Lanebc79e061995-08-02 00:00:00 +0000374 /* Allocate and pre-zero a multiplier table for each component */
375 compptr->dct_table =
376 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
377 SIZEOF(multiplier_table));
378 MEMZERO(compptr->dct_table, SIZEOF(multiplier_table));
379 /* Mark multiplier table not yet set up for any method */
380 idct->cur_method[ci] = -1;
Thomas G. Lane36a4ccc1994-09-24 00:00:00 +0000381 }
382}