Coverage Report

Created: 2026-09-13 07:54

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
96.9k
{
103
96.9k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
96.9k
  int ci, i;
105
96.9k
  jpeg_component_info *compptr;
106
96.9k
  int method = 0;
107
96.9k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
96.9k
  JQUANT_TBL *qtbl;
109
110
304k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
207k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
207k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
7.02k
    case 1:
116
7.02k
      method_ptr = _jpeg_idct_1x1;
117
7.02k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
7.02k
      break;
119
5.46k
    case 2:
120
#ifdef WITH_SIMD
121
4.35k
      if (jsimd_set_idct_2x2(cinfo))
122
4.35k
        method_ptr = jsimd_idct_2x2;
123
0
      else
124
0
#endif
125
1.11k
        method_ptr = _jpeg_idct_2x2;
126
5.46k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
5.46k
      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.03k
    case 4:
133
#ifdef WITH_SIMD
134
4.43k
      if (jsimd_set_idct_4x4(cinfo))
135
4.43k
        method_ptr = jsimd_idct_4x4;
136
0
      else
137
0
#endif
138
3.60k
        method_ptr = _jpeg_idct_4x4;
139
8.03k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
8.03k
      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.48k
    case 6:
146
4.48k
      method_ptr = _jpeg_idct_6x6;
147
4.48k
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
4.48k
      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
181k
    case DCTSIZE:
155
181k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
18.8k
      case JDCT_ISLOW:
158
#ifdef WITH_SIMD
159
11.4k
        if (jsimd_set_idct_islow(cinfo))
160
11.4k
          method_ptr = jsimd_idct_islow;
161
0
        else
162
0
#endif
163
7.39k
          method_ptr = _jpeg_idct_islow;
164
18.8k
        method = JDCT_ISLOW;
165
18.8k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
15.0k
      case JDCT_IFAST:
169
#ifdef WITH_SIMD
170
10.2k
        if (jsimd_set_idct_ifast(cinfo))
171
10.2k
          method_ptr = jsimd_idct_ifast;
172
0
        else
173
0
#endif
174
4.83k
          method_ptr = _jpeg_idct_ifast;
175
15.0k
        method = JDCT_IFAST;
176
15.0k
        break;
177
0
#endif
178
0
#ifdef DCT_FLOAT_SUPPORTED
179
147k
      case JDCT_FLOAT:
180
#ifdef WITH_SIMD
181
147k
        if (jsimd_set_idct_float(cinfo))
182
147k
          method_ptr = jsimd_idct_float;
183
0
        else
184
0
#endif
185
387
          method_ptr = _jpeg_idct_float;
186
147k
        method = JDCT_FLOAT;
187
147k
        break;
188
0
#endif
189
0
      default:
190
0
        ERREXIT(cinfo, JERR_NOT_COMPILED);
191
0
        break;
192
181k
      }
193
181k
      break;
194
181k
#ifdef IDCT_SCALING_SUPPORTED
195
181k
    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.00k
    case 12:
208
1.00k
      method_ptr = _jpeg_idct_12x12;
209
1.00k
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
1.00k
      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
207k
    }
232
207k
    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
207k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
76.0k
      continue;
242
131k
    qtbl = compptr->quant_table;
243
131k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
53.0k
      continue;
245
78.8k
    idct->cur_method[ci] = method;
246
78.8k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
30.7k
    case JDCT_ISLOW:
249
30.7k
      {
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
30.7k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
1.99M
        for (i = 0; i < DCTSIZE2; i++) {
255
1.96M
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
1.96M
        }
257
30.7k
      }
258
30.7k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
11.5k
    case JDCT_IFAST:
262
11.5k
      {
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.5k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
11.5k
#define CONST_BITS  14
272
11.5k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
11.5k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
11.5k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
11.5k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
11.5k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
11.5k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
11.5k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
11.5k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
11.5k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
11.5k
        };
283
11.5k
        SHIFT_TEMPS
284
285
749k
        for (i = 0; i < DCTSIZE2; i++) {
286
738k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
738k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
738k
                                  (JLONG)aanscales[i]),
289
738k
                    CONST_BITS - IFAST_SCALE_BITS);
290
738k
        }
291
11.5k
      }
292
11.5k
      break;
293
0
#endif
294
0
#ifdef DCT_FLOAT_SUPPORTED
295
36.6k
    case JDCT_FLOAT:
296
36.6k
      {
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
36.6k
        FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *)compptr->dct_table;
303
36.6k
        int row, col;
304
36.6k
        static const double aanscalefactor[DCTSIZE] = {
305
36.6k
          1.0, 1.387039845, 1.306562965, 1.175875602,
306
36.6k
          1.0, 0.785694958, 0.541196100, 0.275899379
307
36.6k
        };
308
309
36.6k
        i = 0;
310
329k
        for (row = 0; row < DCTSIZE; row++) {
311
2.63M
          for (col = 0; col < DCTSIZE; col++) {
312
2.34M
            fmtbl[i] = (FLOAT_MULT_TYPE)
313
2.34M
              ((double)qtbl->quantval[i] *
314
2.34M
               aanscalefactor[row] * aanscalefactor[col]);
315
2.34M
            i++;
316
2.34M
          }
317
292k
        }
318
36.6k
      }
319
36.6k
      break;
320
0
#endif
321
0
    default:
322
0
      ERREXIT(cinfo, JERR_NOT_COMPILED);
323
0
      break;
324
78.8k
    }
325
78.8k
  }
326
96.9k
}
jddctmgr-8.c:start_pass
Line
Count
Source
102
83.5k
{
103
83.5k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
83.5k
  int ci, i;
105
83.5k
  jpeg_component_info *compptr;
106
83.5k
  int method = 0;
107
83.5k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
83.5k
  JQUANT_TBL *qtbl;
109
110
270k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
186k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
186k
    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
4.35k
    case 2:
120
4.35k
#ifdef WITH_SIMD
121
4.35k
      if (jsimd_set_idct_2x2(cinfo))
122
4.35k
        method_ptr = jsimd_idct_2x2;
123
0
      else
124
0
#endif
125
0
        method_ptr = _jpeg_idct_2x2;
126
4.35k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
4.35k
      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.43k
    case 4:
133
4.43k
#ifdef WITH_SIMD
134
4.43k
      if (jsimd_set_idct_4x4(cinfo))
135
4.43k
        method_ptr = jsimd_idct_4x4;
136
0
      else
137
0
#endif
138
0
        method_ptr = _jpeg_idct_4x4;
139
4.43k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
4.43k
      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
3.98k
    case 6:
146
3.98k
      method_ptr = _jpeg_idct_6x6;
147
3.98k
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
3.98k
      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
169k
    case DCTSIZE:
155
169k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
11.4k
      case JDCT_ISLOW:
158
11.4k
#ifdef WITH_SIMD
159
11.4k
        if (jsimd_set_idct_islow(cinfo))
160
11.4k
          method_ptr = jsimd_idct_islow;
161
0
        else
162
0
#endif
163
0
          method_ptr = _jpeg_idct_islow;
164
11.4k
        method = JDCT_ISLOW;
165
11.4k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
10.2k
      case JDCT_IFAST:
169
10.2k
#ifdef WITH_SIMD
170
10.2k
        if (jsimd_set_idct_ifast(cinfo))
171
10.2k
          method_ptr = jsimd_idct_ifast;
172
0
        else
173
0
#endif
174
0
          method_ptr = _jpeg_idct_ifast;
175
10.2k
        method = JDCT_IFAST;
176
10.2k
        break;
177
0
#endif
178
0
#ifdef DCT_FLOAT_SUPPORTED
179
147k
      case JDCT_FLOAT:
180
147k
#ifdef WITH_SIMD
181
147k
        if (jsimd_set_idct_float(cinfo))
182
147k
          method_ptr = jsimd_idct_float;
183
0
        else
184
0
#endif
185
0
          method_ptr = _jpeg_idct_float;
186
147k
        method = JDCT_FLOAT;
187
147k
        break;
188
0
#endif
189
0
      default:
190
0
        ERREXIT(cinfo, JERR_NOT_COMPILED);
191
0
        break;
192
169k
      }
193
169k
      break;
194
169k
#ifdef IDCT_SCALING_SUPPORTED
195
169k
    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
840
    case 12:
208
840
      method_ptr = _jpeg_idct_12x12;
209
840
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
840
      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
186k
    }
232
186k
    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
186k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
73.7k
      continue;
242
112k
    qtbl = compptr->quant_table;
243
112k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
48.6k
      continue;
245
64.1k
    idct->cur_method[ci] = method;
246
64.1k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
19.9k
    case JDCT_ISLOW:
249
19.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
19.9k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
1.29M
        for (i = 0; i < DCTSIZE2; i++) {
255
1.27M
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
1.27M
        }
257
19.9k
      }
258
19.9k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
7.84k
    case JDCT_IFAST:
262
7.84k
      {
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
7.84k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
7.84k
#define CONST_BITS  14
272
7.84k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
7.84k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
7.84k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
7.84k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
7.84k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
7.84k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
7.84k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
7.84k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
7.84k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
7.84k
        };
283
7.84k
        SHIFT_TEMPS
284
285
509k
        for (i = 0; i < DCTSIZE2; i++) {
286
501k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
501k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
501k
                                  (JLONG)aanscales[i]),
289
501k
                    CONST_BITS - IFAST_SCALE_BITS);
290
501k
        }
291
7.84k
      }
292
7.84k
      break;
293
0
#endif
294
0
#ifdef DCT_FLOAT_SUPPORTED
295
36.3k
    case JDCT_FLOAT:
296
36.3k
      {
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
36.3k
        FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *)compptr->dct_table;
303
36.3k
        int row, col;
304
36.3k
        static const double aanscalefactor[DCTSIZE] = {
305
36.3k
          1.0, 1.387039845, 1.306562965, 1.175875602,
306
36.3k
          1.0, 0.785694958, 0.541196100, 0.275899379
307
36.3k
        };
308
309
36.3k
        i = 0;
310
327k
        for (row = 0; row < DCTSIZE; row++) {
311
2.61M
          for (col = 0; col < DCTSIZE; col++) {
312
2.32M
            fmtbl[i] = (FLOAT_MULT_TYPE)
313
2.32M
              ((double)qtbl->quantval[i] *
314
2.32M
               aanscalefactor[row] * aanscalefactor[col]);
315
2.32M
            i++;
316
2.32M
          }
317
290k
        }
318
36.3k
      }
319
36.3k
      break;
320
0
#endif
321
0
    default:
322
0
      ERREXIT(cinfo, JERR_NOT_COMPILED);
323
0
      break;
324
64.1k
    }
325
64.1k
  }
326
83.5k
}
jddctmgr-12.c:start_pass
Line
Count
Source
102
13.3k
{
103
13.3k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
13.3k
  int ci, i;
105
13.3k
  jpeg_component_info *compptr;
106
13.3k
  int method = 0;
107
13.3k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
13.3k
  JQUANT_TBL *qtbl;
109
110
34.7k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
21.4k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
21.4k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
3.43k
    case 1:
116
3.43k
      method_ptr = _jpeg_idct_1x1;
117
3.43k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
3.43k
      break;
119
1.11k
    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.11k
        method_ptr = _jpeg_idct_2x2;
126
1.11k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
1.11k
      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.60k
    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.60k
        method_ptr = _jpeg_idct_4x4;
139
3.60k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
3.60k
      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
495
    case 6:
146
495
      method_ptr = _jpeg_idct_6x6;
147
495
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
495
      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.6k
    case DCTSIZE:
155
12.6k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
7.39k
      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.39k
          method_ptr = _jpeg_idct_islow;
164
7.39k
        method = JDCT_ISLOW;
165
7.39k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
4.83k
      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.83k
          method_ptr = _jpeg_idct_ifast;
175
4.83k
        method = JDCT_IFAST;
176
4.83k
        break;
177
0
#endif
178
0
#ifdef DCT_FLOAT_SUPPORTED
179
387
      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
387
          method_ptr = _jpeg_idct_float;
186
387
        method = JDCT_FLOAT;
187
387
        break;
188
0
#endif
189
0
      default:
190
0
        ERREXIT(cinfo, JERR_NOT_COMPILED);
191
0
        break;
192
12.6k
      }
193
12.6k
      break;
194
12.6k
#ifdef IDCT_SCALING_SUPPORTED
195
12.6k
    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.4k
    }
232
21.4k
    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.4k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
2.32k
      continue;
242
19.1k
    qtbl = compptr->quant_table;
243
19.1k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
4.37k
      continue;
245
14.7k
    idct->cur_method[ci] = method;
246
14.7k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
10.7k
    case JDCT_ISLOW:
249
10.7k
      {
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.7k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
700k
        for (i = 0; i < DCTSIZE2; i++) {
255
689k
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
689k
        }
257
10.7k
      }
258
10.7k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
3.69k
    case JDCT_IFAST:
262
3.69k
      {
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.69k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
3.69k
#define CONST_BITS  14
272
3.69k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
3.69k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
3.69k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
3.69k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
3.69k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
3.69k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
3.69k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
3.69k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
3.69k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
3.69k
        };
283
3.69k
        SHIFT_TEMPS
284
285
240k
        for (i = 0; i < DCTSIZE2; i++) {
286
236k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
236k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
236k
                                  (JLONG)aanscales[i]),
289
236k
                    CONST_BITS - IFAST_SCALE_BITS);
290
236k
        }
291
3.69k
      }
292
3.69k
      break;
293
0
#endif
294
0
#ifdef DCT_FLOAT_SUPPORTED
295
255
    case JDCT_FLOAT:
296
255
      {
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
255
        FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *)compptr->dct_table;
303
255
        int row, col;
304
255
        static const double aanscalefactor[DCTSIZE] = {
305
255
          1.0, 1.387039845, 1.306562965, 1.175875602,
306
255
          1.0, 0.785694958, 0.541196100, 0.275899379
307
255
        };
308
309
255
        i = 0;
310
2.29k
        for (row = 0; row < DCTSIZE; row++) {
311
18.3k
          for (col = 0; col < DCTSIZE; col++) {
312
16.3k
            fmtbl[i] = (FLOAT_MULT_TYPE)
313
16.3k
              ((double)qtbl->quantval[i] *
314
16.3k
               aanscalefactor[row] * aanscalefactor[col]);
315
16.3k
            i++;
316
16.3k
          }
317
2.04k
        }
318
255
      }
319
255
      break;
320
0
#endif
321
0
    default:
322
0
      ERREXIT(cinfo, JERR_NOT_COMPILED);
323
0
      break;
324
14.7k
    }
325
14.7k
  }
326
13.3k
}
327
328
329
/*
330
 * Initialize IDCT manager.
331
 */
332
333
GLOBAL(void)
334
_jinit_inverse_dct(j_decompress_ptr cinfo)
335
109k
{
336
109k
  my_idct_ptr idct;
337
109k
  int ci;
338
109k
  jpeg_component_info *compptr;
339
340
109k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
109k
  idct = (my_idct_ptr)
344
109k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
109k
                                sizeof(my_idct_controller));
346
109k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
109k
  idct->pub.start_pass = start_pass;
348
349
311k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
201k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
201k
    compptr->dct_table =
353
201k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
201k
                                  sizeof(multiplier_table));
355
201k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
201k
    idct->cur_method[ci] = -1;
358
201k
  }
359
109k
}
jinit_inverse_dct
Line
Count
Source
335
85.3k
{
336
85.3k
  my_idct_ptr idct;
337
85.3k
  int ci;
338
85.3k
  jpeg_component_info *compptr;
339
340
85.3k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
85.3k
  idct = (my_idct_ptr)
344
85.3k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
85.3k
                                sizeof(my_idct_controller));
346
85.3k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
85.3k
  idct->pub.start_pass = start_pass;
348
349
245k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
160k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
160k
    compptr->dct_table =
353
160k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
160k
                                  sizeof(multiplier_table));
355
160k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
160k
    idct->cur_method[ci] = -1;
358
160k
  }
359
85.3k
}
j12init_inverse_dct
Line
Count
Source
335
24.5k
{
336
24.5k
  my_idct_ptr idct;
337
24.5k
  int ci;
338
24.5k
  jpeg_component_info *compptr;
339
340
24.5k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
24.5k
  idct = (my_idct_ptr)
344
24.5k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
24.5k
                                sizeof(my_idct_controller));
346
24.5k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
24.5k
  idct->pub.start_pass = start_pass;
348
349
66.1k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
41.6k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
41.6k
    compptr->dct_table =
353
41.6k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
41.6k
                                  sizeof(multiplier_table));
355
41.6k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
41.6k
    idct->cur_method[ci] = -1;
358
41.6k
  }
359
24.5k
}
360
361
#endif /* defined(DCT_ISLOW_SUPPORTED) || defined(DCT_IFAST_SUPPORTED) ||
362
          defined(DCT_FLOAT_SUPPORTED) */