Coverage Report

Created: 2026-08-13 07:24

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libjpeg-turbo.main/src/jddctmgr.c
Line
Count
Source
1
/*
2
 * jddctmgr.c
3
 *
4
 * This file was part of the Independent JPEG Group's software:
5
 * Copyright (C) 1994-1996, Thomas G. Lane.
6
 * Modified 2002-2010 by Guido Vollbeding.
7
 * libjpeg-turbo Modifications:
8
 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
9
 * Copyright (C) 2010, 2015, 2022, 2025-2026, D. R. Commander.
10
 * For conditions of distribution and use, see the accompanying README.ijg
11
 * file.
12
 *
13
 * This file contains the inverse-DCT management logic.
14
 * This code selects a particular IDCT implementation to be used,
15
 * and it performs related housekeeping chores.  No code in this file
16
 * is executed per IDCT step, only during output pass setup.
17
 *
18
 * Note that the IDCT routines are responsible for performing coefficient
19
 * dequantization as well as the IDCT proper.  This module sets up the
20
 * dequantization multiplier table needed by the IDCT routine.
21
 */
22
23
#define JPEG_INTERNALS
24
#include "jinclude.h"
25
#include "jpeglib.h"
26
#include "jdct.h"               /* Private declarations for DCT subsystem */
27
#ifdef WITH_SIMD
28
#include "../simd/jsimddct.h"
29
#endif
30
#include "jpegapicomp.h"
31
32
33
#if defined(DCT_ISLOW_SUPPORTED) || defined(DCT_IFAST_SUPPORTED) || \
34
    defined(DCT_FLOAT_SUPPORTED)
35
36
/*
37
 * The decompressor input side (jdinput.c) saves away the appropriate
38
 * quantization table for each component at the start of the first scan
39
 * involving that component.  (This is necessary in order to correctly
40
 * decode files that reuse Q-table slots.)
41
 * When we are ready to make an output pass, the saved Q-table is converted
42
 * to a multiplier table that will actually be used by the IDCT routine.
43
 * The multiplier table contents are IDCT-method-dependent.  To support
44
 * application changes in IDCT method between scans, we can remake the
45
 * multiplier tables if necessary.
46
 * In buffered-image mode, the first output pass may occur before any data
47
 * has been seen for some components, and thus before their Q-tables have
48
 * been saved away.  To handle this case, multiplier tables are preset
49
 * to zeroes; the result of the IDCT will be a neutral gray level.
50
 */
51
52
53
/* Private subobject for this module */
54
55
typedef struct {
56
  struct jpeg_inverse_dct pub;  /* public fields */
57
58
  /* This array contains the IDCT method code that each multiplier table
59
   * is currently set up for, or -1 if it's not yet set up.
60
   * The actual multiplier tables are pointed to by dct_table in the
61
   * per-component comp_info structures.
62
   */
63
  int cur_method[MAX_COMPONENTS];
64
} my_idct_controller;
65
66
typedef my_idct_controller *my_idct_ptr;
67
68
69
/* Allocated multiplier tables: big enough for any supported variant */
70
71
typedef union {
72
  ISLOW_MULT_TYPE islow_array[DCTSIZE2];
73
#ifdef DCT_IFAST_SUPPORTED
74
  IFAST_MULT_TYPE ifast_array[DCTSIZE2];
75
#endif
76
#ifdef DCT_FLOAT_SUPPORTED
77
  FLOAT_MULT_TYPE float_array[DCTSIZE2];
78
#endif
79
} multiplier_table;
80
81
82
/* The current scaled-IDCT routines require ISLOW-style multiplier tables,
83
 * so be sure to compile that code if either ISLOW or SCALING is requested.
84
 */
85
#ifdef DCT_ISLOW_SUPPORTED
86
#define PROVIDE_ISLOW_TABLES
87
#else
88
#ifdef IDCT_SCALING_SUPPORTED
89
#define PROVIDE_ISLOW_TABLES
90
#endif
91
#endif
92
93
94
/*
95
 * Prepare for an output pass.
96
 * Here we select the proper IDCT routine for each component and build
97
 * a matching multiplier table.
98
 */
99
100
METHODDEF(void)
101
start_pass(j_decompress_ptr cinfo)
102
99.9k
{
103
99.9k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
99.9k
  int ci, i;
105
99.9k
  jpeg_component_info *compptr;
106
99.9k
  int method = 0;
107
99.9k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
99.9k
  JQUANT_TBL *qtbl;
109
110
313k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
213k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
213k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
7.32k
    case 1:
116
7.32k
      method_ptr = _jpeg_idct_1x1;
117
7.32k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
7.32k
      break;
119
5.61k
    case 2:
120
#ifdef WITH_SIMD
121
4.49k
      if (jsimd_set_idct_2x2(cinfo))
122
4.49k
        method_ptr = jsimd_idct_2x2;
123
0
      else
124
0
#endif
125
1.12k
        method_ptr = _jpeg_idct_2x2;
126
5.61k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
5.61k
      break;
128
0
    case 3:
129
0
      method_ptr = _jpeg_idct_3x3;
130
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
131
0
      break;
132
8.40k
    case 4:
133
#ifdef WITH_SIMD
134
4.62k
      if (jsimd_set_idct_4x4(cinfo))
135
4.62k
        method_ptr = jsimd_idct_4x4;
136
0
      else
137
0
#endif
138
3.77k
        method_ptr = _jpeg_idct_4x4;
139
8.40k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
8.40k
      break;
141
0
    case 5:
142
0
      method_ptr = _jpeg_idct_5x5;
143
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
144
0
      break;
145
4.60k
    case 6:
146
4.60k
      method_ptr = _jpeg_idct_6x6;
147
4.60k
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
4.60k
      break;
149
0
    case 7:
150
0
      method_ptr = _jpeg_idct_7x7;
151
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
152
0
      break;
153
0
#endif
154
186k
    case DCTSIZE:
155
186k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
19.3k
      case JDCT_ISLOW:
158
#ifdef WITH_SIMD
159
11.9k
        if (jsimd_set_idct_islow(cinfo))
160
11.9k
          method_ptr = jsimd_idct_islow;
161
0
        else
162
0
#endif
163
7.43k
          method_ptr = _jpeg_idct_islow;
164
19.3k
        method = JDCT_ISLOW;
165
19.3k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
15.7k
      case JDCT_IFAST:
169
#ifdef WITH_SIMD
170
10.7k
        if (jsimd_set_idct_ifast(cinfo))
171
10.7k
          method_ptr = jsimd_idct_ifast;
172
0
        else
173
0
#endif
174
4.99k
          method_ptr = _jpeg_idct_ifast;
175
15.7k
        method = JDCT_IFAST;
176
15.7k
        break;
177
0
#endif
178
0
#ifdef DCT_FLOAT_SUPPORTED
179
151k
      case JDCT_FLOAT:
180
#ifdef WITH_SIMD
181
151k
        if (jsimd_set_idct_float(cinfo))
182
151k
          method_ptr = jsimd_idct_float;
183
0
        else
184
0
#endif
185
389
          method_ptr = _jpeg_idct_float;
186
151k
        method = JDCT_FLOAT;
187
151k
        break;
188
0
#endif
189
0
      default:
190
0
        ERREXIT(cinfo, JERR_NOT_COMPILED);
191
0
        break;
192
186k
      }
193
186k
      break;
194
186k
#ifdef IDCT_SCALING_SUPPORTED
195
186k
    case 9:
196
0
      method_ptr = _jpeg_idct_9x9;
197
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
198
0
      break;
199
0
    case 10:
200
0
      method_ptr = _jpeg_idct_10x10;
201
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
202
0
      break;
203
0
    case 11:
204
0
      method_ptr = _jpeg_idct_11x11;
205
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
206
0
      break;
207
1.06k
    case 12:
208
1.06k
      method_ptr = _jpeg_idct_12x12;
209
1.06k
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
1.06k
      break;
211
0
    case 13:
212
0
      method_ptr = _jpeg_idct_13x13;
213
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
214
0
      break;
215
0
    case 14:
216
0
      method_ptr = _jpeg_idct_14x14;
217
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
218
0
      break;
219
0
    case 15:
220
0
      method_ptr = _jpeg_idct_15x15;
221
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
222
0
      break;
223
0
    case 16:
224
0
      method_ptr = _jpeg_idct_16x16;
225
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
226
0
      break;
227
0
#endif
228
0
    default:
229
0
      ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->_DCT_scaled_size);
230
0
      break;
231
213k
    }
232
213k
    idct->pub._inverse_DCT[ci] = method_ptr;
233
    /* Create multiplier table from quant table.
234
     * However, we can skip this if the component is uninteresting
235
     * or if we already built the table.  Also, if no quant table
236
     * has yet been saved for the component, we leave the
237
     * multiplier table all-zero; we'll be reading zeroes from the
238
     * coefficient controller's buffer anyway.
239
     */
240
213k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
76.8k
      continue;
242
136k
    qtbl = compptr->quant_table;
243
136k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
55.5k
      continue;
245
81.1k
    idct->cur_method[ci] = method;
246
81.1k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
31.4k
    case JDCT_ISLOW:
249
31.4k
      {
250
        /* For LL&M IDCT method, multipliers are equal to raw quantization
251
         * coefficients, but are stored as ints to ensure access efficiency.
252
         */
253
31.4k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
2.04M
        for (i = 0; i < DCTSIZE2; i++) {
255
2.01M
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
2.01M
        }
257
31.4k
      }
258
31.4k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
11.9k
    case JDCT_IFAST:
262
11.9k
      {
263
        /* For AA&N IDCT method, multipliers are equal to quantization
264
         * coefficients scaled by scalefactor[row]*scalefactor[col], where
265
         *   scalefactor[0] = 1
266
         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
267
         * For integer operation, the multiplier table is to be scaled by
268
         * IFAST_SCALE_BITS.
269
         */
270
11.9k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
11.9k
#define CONST_BITS  14
272
11.9k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
11.9k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
11.9k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
11.9k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
11.9k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
11.9k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
11.9k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
11.9k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
11.9k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
11.9k
        };
283
11.9k
        SHIFT_TEMPS
284
285
775k
        for (i = 0; i < DCTSIZE2; i++) {
286
763k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
763k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
763k
                                  (JLONG)aanscales[i]),
289
763k
                    CONST_BITS - IFAST_SCALE_BITS);
290
763k
        }
291
11.9k
      }
292
11.9k
      break;
293
0
#endif
294
0
#ifdef DCT_FLOAT_SUPPORTED
295
37.7k
    case JDCT_FLOAT:
296
37.7k
      {
297
        /* For float AA&N IDCT method, multipliers are equal to quantization
298
         * coefficients scaled by scalefactor[row]*scalefactor[col], where
299
         *   scalefactor[0] = 1
300
         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
301
         */
302
37.7k
        FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *)compptr->dct_table;
303
37.7k
        int row, col;
304
37.7k
        static const double aanscalefactor[DCTSIZE] = {
305
37.7k
          1.0, 1.387039845, 1.306562965, 1.175875602,
306
37.7k
          1.0, 0.785694958, 0.541196100, 0.275899379
307
37.7k
        };
308
309
37.7k
        i = 0;
310
339k
        for (row = 0; row < DCTSIZE; row++) {
311
2.71M
          for (col = 0; col < DCTSIZE; col++) {
312
2.41M
            fmtbl[i] = (FLOAT_MULT_TYPE)
313
2.41M
              ((double)qtbl->quantval[i] *
314
2.41M
               aanscalefactor[row] * aanscalefactor[col]);
315
2.41M
            i++;
316
2.41M
          }
317
301k
        }
318
37.7k
      }
319
37.7k
      break;
320
0
#endif
321
0
    default:
322
0
      ERREXIT(cinfo, JERR_NOT_COMPILED);
323
0
      break;
324
81.1k
    }
325
81.1k
  }
326
99.9k
}
jddctmgr-8.c:start_pass
Line
Count
Source
102
86.3k
{
103
86.3k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
86.3k
  int ci, i;
105
86.3k
  jpeg_component_info *compptr;
106
86.3k
  int method = 0;
107
86.3k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
86.3k
  JQUANT_TBL *qtbl;
109
110
277k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
191k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
191k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
3.72k
    case 1:
116
3.72k
      method_ptr = _jpeg_idct_1x1;
117
3.72k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
3.72k
      break;
119
4.49k
    case 2:
120
4.49k
#ifdef WITH_SIMD
121
4.49k
      if (jsimd_set_idct_2x2(cinfo))
122
4.49k
        method_ptr = jsimd_idct_2x2;
123
0
      else
124
0
#endif
125
0
        method_ptr = _jpeg_idct_2x2;
126
4.49k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
4.49k
      break;
128
0
    case 3:
129
0
      method_ptr = _jpeg_idct_3x3;
130
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
131
0
      break;
132
4.62k
    case 4:
133
4.62k
#ifdef WITH_SIMD
134
4.62k
      if (jsimd_set_idct_4x4(cinfo))
135
4.62k
        method_ptr = jsimd_idct_4x4;
136
0
      else
137
0
#endif
138
0
        method_ptr = _jpeg_idct_4x4;
139
4.62k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
4.62k
      break;
141
0
    case 5:
142
0
      method_ptr = _jpeg_idct_5x5;
143
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
144
0
      break;
145
4.12k
    case 6:
146
4.12k
      method_ptr = _jpeg_idct_6x6;
147
4.12k
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
4.12k
      break;
149
0
    case 7:
150
0
      method_ptr = _jpeg_idct_7x7;
151
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
152
0
      break;
153
0
#endif
154
173k
    case DCTSIZE:
155
173k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
11.9k
      case JDCT_ISLOW:
158
11.9k
#ifdef WITH_SIMD
159
11.9k
        if (jsimd_set_idct_islow(cinfo))
160
11.9k
          method_ptr = jsimd_idct_islow;
161
0
        else
162
0
#endif
163
0
          method_ptr = _jpeg_idct_islow;
164
11.9k
        method = JDCT_ISLOW;
165
11.9k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
10.7k
      case JDCT_IFAST:
169
10.7k
#ifdef WITH_SIMD
170
10.7k
        if (jsimd_set_idct_ifast(cinfo))
171
10.7k
          method_ptr = jsimd_idct_ifast;
172
0
        else
173
0
#endif
174
0
          method_ptr = _jpeg_idct_ifast;
175
10.7k
        method = JDCT_IFAST;
176
10.7k
        break;
177
0
#endif
178
0
#ifdef DCT_FLOAT_SUPPORTED
179
151k
      case JDCT_FLOAT:
180
151k
#ifdef WITH_SIMD
181
151k
        if (jsimd_set_idct_float(cinfo))
182
151k
          method_ptr = jsimd_idct_float;
183
0
        else
184
0
#endif
185
0
          method_ptr = _jpeg_idct_float;
186
151k
        method = JDCT_FLOAT;
187
151k
        break;
188
0
#endif
189
0
      default:
190
0
        ERREXIT(cinfo, JERR_NOT_COMPILED);
191
0
        break;
192
173k
      }
193
173k
      break;
194
173k
#ifdef IDCT_SCALING_SUPPORTED
195
173k
    case 9:
196
0
      method_ptr = _jpeg_idct_9x9;
197
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
198
0
      break;
199
0
    case 10:
200
0
      method_ptr = _jpeg_idct_10x10;
201
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
202
0
      break;
203
0
    case 11:
204
0
      method_ptr = _jpeg_idct_11x11;
205
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
206
0
      break;
207
900
    case 12:
208
900
      method_ptr = _jpeg_idct_12x12;
209
900
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
900
      break;
211
0
    case 13:
212
0
      method_ptr = _jpeg_idct_13x13;
213
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
214
0
      break;
215
0
    case 14:
216
0
      method_ptr = _jpeg_idct_14x14;
217
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
218
0
      break;
219
0
    case 15:
220
0
      method_ptr = _jpeg_idct_15x15;
221
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
222
0
      break;
223
0
    case 16:
224
0
      method_ptr = _jpeg_idct_16x16;
225
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
226
0
      break;
227
0
#endif
228
0
    default:
229
0
      ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->_DCT_scaled_size);
230
0
      break;
231
191k
    }
232
191k
    idct->pub._inverse_DCT[ci] = method_ptr;
233
    /* Create multiplier table from quant table.
234
     * However, we can skip this if the component is uninteresting
235
     * or if we already built the table.  Also, if no quant table
236
     * has yet been saved for the component, we leave the
237
     * multiplier table all-zero; we'll be reading zeroes from the
238
     * coefficient controller's buffer anyway.
239
     */
240
191k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
74.5k
      continue;
242
117k
    qtbl = compptr->quant_table;
243
117k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
50.9k
      continue;
245
66.1k
    idct->cur_method[ci] = method;
246
66.1k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
20.5k
    case JDCT_ISLOW:
249
20.5k
      {
250
        /* For LL&M IDCT method, multipliers are equal to raw quantization
251
         * coefficients, but are stored as ints to ensure access efficiency.
252
         */
253
20.5k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
1.33M
        for (i = 0; i < DCTSIZE2; i++) {
255
1.31M
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
1.31M
        }
257
20.5k
      }
258
20.5k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
8.14k
    case JDCT_IFAST:
262
8.14k
      {
263
        /* For AA&N IDCT method, multipliers are equal to quantization
264
         * coefficients scaled by scalefactor[row]*scalefactor[col], where
265
         *   scalefactor[0] = 1
266
         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
267
         * For integer operation, the multiplier table is to be scaled by
268
         * IFAST_SCALE_BITS.
269
         */
270
8.14k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
8.14k
#define CONST_BITS  14
272
8.14k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
8.14k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
8.14k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
8.14k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
8.14k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
8.14k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
8.14k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
8.14k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
8.14k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
8.14k
        };
283
8.14k
        SHIFT_TEMPS
284
285
529k
        for (i = 0; i < DCTSIZE2; i++) {
286
521k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
521k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
521k
                                  (JLONG)aanscales[i]),
289
521k
                    CONST_BITS - IFAST_SCALE_BITS);
290
521k
        }
291
8.14k
      }
292
8.14k
      break;
293
0
#endif
294
0
#ifdef DCT_FLOAT_SUPPORTED
295
37.4k
    case JDCT_FLOAT:
296
37.4k
      {
297
        /* For float AA&N IDCT method, multipliers are equal to quantization
298
         * coefficients scaled by scalefactor[row]*scalefactor[col], where
299
         *   scalefactor[0] = 1
300
         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
301
         */
302
37.4k
        FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *)compptr->dct_table;
303
37.4k
        int row, col;
304
37.4k
        static const double aanscalefactor[DCTSIZE] = {
305
37.4k
          1.0, 1.387039845, 1.306562965, 1.175875602,
306
37.4k
          1.0, 0.785694958, 0.541196100, 0.275899379
307
37.4k
        };
308
309
37.4k
        i = 0;
310
337k
        for (row = 0; row < DCTSIZE; row++) {
311
2.69M
          for (col = 0; col < DCTSIZE; col++) {
312
2.39M
            fmtbl[i] = (FLOAT_MULT_TYPE)
313
2.39M
              ((double)qtbl->quantval[i] *
314
2.39M
               aanscalefactor[row] * aanscalefactor[col]);
315
2.39M
            i++;
316
2.39M
          }
317
299k
        }
318
37.4k
      }
319
37.4k
      break;
320
0
#endif
321
0
    default:
322
0
      ERREXIT(cinfo, JERR_NOT_COMPILED);
323
0
      break;
324
66.1k
    }
325
66.1k
  }
326
86.3k
}
jddctmgr-12.c:start_pass
Line
Count
Source
102
13.5k
{
103
13.5k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
13.5k
  int ci, i;
105
13.5k
  jpeg_component_info *compptr;
106
13.5k
  int method = 0;
107
13.5k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
13.5k
  JQUANT_TBL *qtbl;
109
110
35.5k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
21.9k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
21.9k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
3.59k
    case 1:
116
3.59k
      method_ptr = _jpeg_idct_1x1;
117
3.59k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
3.59k
      break;
119
1.12k
    case 2:
120
#ifdef WITH_SIMD
121
      if (jsimd_set_idct_2x2(cinfo))
122
        method_ptr = jsimd_idct_2x2;
123
      else
124
#endif
125
1.12k
        method_ptr = _jpeg_idct_2x2;
126
1.12k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
1.12k
      break;
128
0
    case 3:
129
0
      method_ptr = _jpeg_idct_3x3;
130
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
131
0
      break;
132
3.77k
    case 4:
133
#ifdef WITH_SIMD
134
      if (jsimd_set_idct_4x4(cinfo))
135
        method_ptr = jsimd_idct_4x4;
136
      else
137
#endif
138
3.77k
        method_ptr = _jpeg_idct_4x4;
139
3.77k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
3.77k
      break;
141
0
    case 5:
142
0
      method_ptr = _jpeg_idct_5x5;
143
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
144
0
      break;
145
488
    case 6:
146
488
      method_ptr = _jpeg_idct_6x6;
147
488
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
488
      break;
149
0
    case 7:
150
0
      method_ptr = _jpeg_idct_7x7;
151
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
152
0
      break;
153
0
#endif
154
12.8k
    case DCTSIZE:
155
12.8k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
7.43k
      case JDCT_ISLOW:
158
#ifdef WITH_SIMD
159
        if (jsimd_set_idct_islow(cinfo))
160
          method_ptr = jsimd_idct_islow;
161
        else
162
#endif
163
7.43k
          method_ptr = _jpeg_idct_islow;
164
7.43k
        method = JDCT_ISLOW;
165
7.43k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
4.99k
      case JDCT_IFAST:
169
#ifdef WITH_SIMD
170
        if (jsimd_set_idct_ifast(cinfo))
171
          method_ptr = jsimd_idct_ifast;
172
        else
173
#endif
174
4.99k
          method_ptr = _jpeg_idct_ifast;
175
4.99k
        method = JDCT_IFAST;
176
4.99k
        break;
177
0
#endif
178
0
#ifdef DCT_FLOAT_SUPPORTED
179
389
      case JDCT_FLOAT:
180
#ifdef WITH_SIMD
181
        if (jsimd_set_idct_float(cinfo))
182
          method_ptr = jsimd_idct_float;
183
        else
184
#endif
185
389
          method_ptr = _jpeg_idct_float;
186
389
        method = JDCT_FLOAT;
187
389
        break;
188
0
#endif
189
0
      default:
190
0
        ERREXIT(cinfo, JERR_NOT_COMPILED);
191
0
        break;
192
12.8k
      }
193
12.8k
      break;
194
12.8k
#ifdef IDCT_SCALING_SUPPORTED
195
12.8k
    case 9:
196
0
      method_ptr = _jpeg_idct_9x9;
197
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
198
0
      break;
199
0
    case 10:
200
0
      method_ptr = _jpeg_idct_10x10;
201
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
202
0
      break;
203
0
    case 11:
204
0
      method_ptr = _jpeg_idct_11x11;
205
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
206
0
      break;
207
166
    case 12:
208
166
      method_ptr = _jpeg_idct_12x12;
209
166
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
166
      break;
211
0
    case 13:
212
0
      method_ptr = _jpeg_idct_13x13;
213
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
214
0
      break;
215
0
    case 14:
216
0
      method_ptr = _jpeg_idct_14x14;
217
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
218
0
      break;
219
0
    case 15:
220
0
      method_ptr = _jpeg_idct_15x15;
221
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
222
0
      break;
223
0
    case 16:
224
0
      method_ptr = _jpeg_idct_16x16;
225
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
226
0
      break;
227
0
#endif
228
0
    default:
229
0
      ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->_DCT_scaled_size);
230
0
      break;
231
21.9k
    }
232
21.9k
    idct->pub._inverse_DCT[ci] = method_ptr;
233
    /* Create multiplier table from quant table.
234
     * However, we can skip this if the component is uninteresting
235
     * or if we already built the table.  Also, if no quant table
236
     * has yet been saved for the component, we leave the
237
     * multiplier table all-zero; we'll be reading zeroes from the
238
     * coefficient controller's buffer anyway.
239
     */
240
21.9k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
2.30k
      continue;
242
19.6k
    qtbl = compptr->quant_table;
243
19.6k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
4.66k
      continue;
245
14.9k
    idct->cur_method[ci] = method;
246
14.9k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
10.9k
    case JDCT_ISLOW:
249
10.9k
      {
250
        /* For LL&M IDCT method, multipliers are equal to raw quantization
251
         * coefficients, but are stored as ints to ensure access efficiency.
252
         */
253
10.9k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
711k
        for (i = 0; i < DCTSIZE2; i++) {
255
700k
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
700k
        }
257
10.9k
      }
258
10.9k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
3.79k
    case JDCT_IFAST:
262
3.79k
      {
263
        /* For AA&N IDCT method, multipliers are equal to quantization
264
         * coefficients scaled by scalefactor[row]*scalefactor[col], where
265
         *   scalefactor[0] = 1
266
         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
267
         * For integer operation, the multiplier table is to be scaled by
268
         * IFAST_SCALE_BITS.
269
         */
270
3.79k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
3.79k
#define CONST_BITS  14
272
3.79k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
3.79k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
3.79k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
3.79k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
3.79k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
3.79k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
3.79k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
3.79k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
3.79k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
3.79k
        };
283
3.79k
        SHIFT_TEMPS
284
285
246k
        for (i = 0; i < DCTSIZE2; i++) {
286
242k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
242k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
242k
                                  (JLONG)aanscales[i]),
289
242k
                    CONST_BITS - IFAST_SCALE_BITS);
290
242k
        }
291
3.79k
      }
292
3.79k
      break;
293
0
#endif
294
0
#ifdef DCT_FLOAT_SUPPORTED
295
257
    case JDCT_FLOAT:
296
257
      {
297
        /* For float AA&N IDCT method, multipliers are equal to quantization
298
         * coefficients scaled by scalefactor[row]*scalefactor[col], where
299
         *   scalefactor[0] = 1
300
         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
301
         */
302
257
        FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *)compptr->dct_table;
303
257
        int row, col;
304
257
        static const double aanscalefactor[DCTSIZE] = {
305
257
          1.0, 1.387039845, 1.306562965, 1.175875602,
306
257
          1.0, 0.785694958, 0.541196100, 0.275899379
307
257
        };
308
309
257
        i = 0;
310
2.31k
        for (row = 0; row < DCTSIZE; row++) {
311
18.5k
          for (col = 0; col < DCTSIZE; col++) {
312
16.4k
            fmtbl[i] = (FLOAT_MULT_TYPE)
313
16.4k
              ((double)qtbl->quantval[i] *
314
16.4k
               aanscalefactor[row] * aanscalefactor[col]);
315
16.4k
            i++;
316
16.4k
          }
317
2.05k
        }
318
257
      }
319
257
      break;
320
0
#endif
321
0
    default:
322
0
      ERREXIT(cinfo, JERR_NOT_COMPILED);
323
0
      break;
324
14.9k
    }
325
14.9k
  }
326
13.5k
}
327
328
329
/*
330
 * Initialize IDCT manager.
331
 */
332
333
GLOBAL(void)
334
_jinit_inverse_dct(j_decompress_ptr cinfo)
335
113k
{
336
113k
  my_idct_ptr idct;
337
113k
  int ci;
338
113k
  jpeg_component_info *compptr;
339
340
113k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
113k
  idct = (my_idct_ptr)
344
113k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
113k
                                sizeof(my_idct_controller));
346
113k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
113k
  idct->pub.start_pass = start_pass;
348
349
322k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
209k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
209k
    compptr->dct_table =
353
209k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
209k
                                  sizeof(multiplier_table));
355
209k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
209k
    idct->cur_method[ci] = -1;
358
209k
  }
359
113k
}
jinit_inverse_dct
Line
Count
Source
335
88.0k
{
336
88.0k
  my_idct_ptr idct;
337
88.0k
  int ci;
338
88.0k
  jpeg_component_info *compptr;
339
340
88.0k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
88.0k
  idct = (my_idct_ptr)
344
88.0k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
88.0k
                                sizeof(my_idct_controller));
346
88.0k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
88.0k
  idct->pub.start_pass = start_pass;
348
349
254k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
166k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
166k
    compptr->dct_table =
353
166k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
166k
                                  sizeof(multiplier_table));
355
166k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
166k
    idct->cur_method[ci] = -1;
358
166k
  }
359
88.0k
}
j12init_inverse_dct
Line
Count
Source
335
25.1k
{
336
25.1k
  my_idct_ptr idct;
337
25.1k
  int ci;
338
25.1k
  jpeg_component_info *compptr;
339
340
25.1k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
25.1k
  idct = (my_idct_ptr)
344
25.1k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
25.1k
                                sizeof(my_idct_controller));
346
25.1k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
25.1k
  idct->pub.start_pass = start_pass;
348
349
68.1k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
42.9k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
42.9k
    compptr->dct_table =
353
42.9k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
42.9k
                                  sizeof(multiplier_table));
355
42.9k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
42.9k
    idct->cur_method[ci] = -1;
358
42.9k
  }
359
25.1k
}
360
361
#endif /* defined(DCT_ISLOW_SUPPORTED) || defined(DCT_IFAST_SUPPORTED) ||
362
          defined(DCT_FLOAT_SUPPORTED) */