Coverage Report

Created: 2026-10-17 07:27

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
95.5k
{
103
95.5k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
95.5k
  int ci, i;
105
95.5k
  jpeg_component_info *compptr;
106
95.5k
  int method = 0;
107
95.5k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
95.5k
  JQUANT_TBL *qtbl;
109
110
298k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
202k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
202k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
6.78k
    case 1:
116
6.78k
      method_ptr = _jpeg_idct_1x1;
117
6.78k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
6.78k
      break;
119
5.42k
    case 2:
120
#ifdef WITH_SIMD
121
4.36k
      if (jsimd_set_idct_2x2(cinfo))
122
4.36k
        method_ptr = jsimd_idct_2x2;
123
0
      else
124
0
#endif
125
1.05k
        method_ptr = _jpeg_idct_2x2;
126
5.42k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
5.42k
      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
7.76k
    case 4:
133
#ifdef WITH_SIMD
134
4.27k
      if (jsimd_set_idct_4x4(cinfo))
135
4.27k
        method_ptr = jsimd_idct_4x4;
136
0
      else
137
0
#endif
138
3.48k
        method_ptr = _jpeg_idct_4x4;
139
7.76k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
7.76k
      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
177k
    case DCTSIZE:
155
177k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
18.3k
      case JDCT_ISLOW:
158
#ifdef WITH_SIMD
159
11.2k
        if (jsimd_set_idct_islow(cinfo))
160
11.2k
          method_ptr = jsimd_idct_islow;
161
0
        else
162
0
#endif
163
7.14k
          method_ptr = _jpeg_idct_islow;
164
18.3k
        method = JDCT_ISLOW;
165
18.3k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
14.7k
      case JDCT_IFAST:
169
#ifdef WITH_SIMD
170
10.0k
        if (jsimd_set_idct_ifast(cinfo))
171
10.0k
          method_ptr = jsimd_idct_ifast;
172
0
        else
173
0
#endif
174
4.66k
          method_ptr = _jpeg_idct_ifast;
175
14.7k
        method = JDCT_IFAST;
176
14.7k
        break;
177
0
#endif
178
0
#ifdef DCT_FLOAT_SUPPORTED
179
144k
      case JDCT_FLOAT:
180
#ifdef WITH_SIMD
181
144k
        if (jsimd_set_idct_float(cinfo))
182
144k
          method_ptr = jsimd_idct_float;
183
0
        else
184
0
#endif
185
385
          method_ptr = _jpeg_idct_float;
186
144k
        method = JDCT_FLOAT;
187
144k
        break;
188
0
#endif
189
0
      default:
190
0
        ERREXIT(cinfo, JERR_NOT_COMPILED);
191
0
        break;
192
177k
      }
193
177k
      break;
194
177k
#ifdef IDCT_SCALING_SUPPORTED
195
177k
    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
968
    case 12:
208
968
      method_ptr = _jpeg_idct_12x12;
209
968
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
968
      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
202k
    }
232
202k
    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
202k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
72.6k
      continue;
242
130k
    qtbl = compptr->quant_table;
243
130k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
52.8k
      continue;
245
77.3k
    idct->cur_method[ci] = method;
246
77.3k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
30.0k
    case JDCT_ISLOW:
249
30.0k
      {
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.0k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
1.95M
        for (i = 0; i < DCTSIZE2; i++) {
255
1.92M
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
1.92M
        }
257
30.0k
      }
258
30.0k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
11.2k
    case JDCT_IFAST:
262
11.2k
      {
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.2k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
11.2k
#define CONST_BITS  14
272
11.2k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
11.2k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
11.2k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
11.2k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
11.2k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
11.2k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
11.2k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
11.2k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
11.2k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
11.2k
        };
283
11.2k
        SHIFT_TEMPS
284
285
734k
        for (i = 0; i < DCTSIZE2; i++) {
286
723k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
723k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
723k
                                  (JLONG)aanscales[i]),
289
723k
                    CONST_BITS - IFAST_SCALE_BITS);
290
723k
        }
291
11.2k
      }
292
11.2k
      break;
293
0
#endif
294
0
#ifdef DCT_FLOAT_SUPPORTED
295
36.0k
    case JDCT_FLOAT:
296
36.0k
      {
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.0k
        FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *)compptr->dct_table;
303
36.0k
        int row, col;
304
36.0k
        static const double aanscalefactor[DCTSIZE] = {
305
36.0k
          1.0, 1.387039845, 1.306562965, 1.175875602,
306
36.0k
          1.0, 0.785694958, 0.541196100, 0.275899379
307
36.0k
        };
308
309
36.0k
        i = 0;
310
324k
        for (row = 0; row < DCTSIZE; row++) {
311
2.59M
          for (col = 0; col < DCTSIZE; col++) {
312
2.30M
            fmtbl[i] = (FLOAT_MULT_TYPE)
313
2.30M
              ((double)qtbl->quantval[i] *
314
2.30M
               aanscalefactor[row] * aanscalefactor[col]);
315
2.30M
            i++;
316
2.30M
          }
317
288k
        }
318
36.0k
      }
319
36.0k
      break;
320
0
#endif
321
0
    default:
322
0
      ERREXIT(cinfo, JERR_NOT_COMPILED);
323
0
      break;
324
77.3k
    }
325
77.3k
  }
326
95.5k
}
jddctmgr-8.c:start_pass
Line
Count
Source
102
82.5k
{
103
82.5k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
82.5k
  int ci, i;
105
82.5k
  jpeg_component_info *compptr;
106
82.5k
  int method = 0;
107
82.5k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
82.5k
  JQUANT_TBL *qtbl;
109
110
264k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
182k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
182k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
3.46k
    case 1:
116
3.46k
      method_ptr = _jpeg_idct_1x1;
117
3.46k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
3.46k
      break;
119
4.36k
    case 2:
120
4.36k
#ifdef WITH_SIMD
121
4.36k
      if (jsimd_set_idct_2x2(cinfo))
122
4.36k
        method_ptr = jsimd_idct_2x2;
123
0
      else
124
0
#endif
125
0
        method_ptr = _jpeg_idct_2x2;
126
4.36k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
4.36k
      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.27k
    case 4:
133
4.27k
#ifdef WITH_SIMD
134
4.27k
      if (jsimd_set_idct_4x4(cinfo))
135
4.27k
        method_ptr = jsimd_idct_4x4;
136
0
      else
137
0
#endif
138
0
        method_ptr = _jpeg_idct_4x4;
139
4.27k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
4.27k
      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.01k
    case 6:
146
4.01k
      method_ptr = _jpeg_idct_6x6;
147
4.01k
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
4.01k
      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
165k
    case DCTSIZE:
155
165k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
11.2k
      case JDCT_ISLOW:
158
11.2k
#ifdef WITH_SIMD
159
11.2k
        if (jsimd_set_idct_islow(cinfo))
160
11.2k
          method_ptr = jsimd_idct_islow;
161
0
        else
162
0
#endif
163
0
          method_ptr = _jpeg_idct_islow;
164
11.2k
        method = JDCT_ISLOW;
165
11.2k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
10.0k
      case JDCT_IFAST:
169
10.0k
#ifdef WITH_SIMD
170
10.0k
        if (jsimd_set_idct_ifast(cinfo))
171
10.0k
          method_ptr = jsimd_idct_ifast;
172
0
        else
173
0
#endif
174
0
          method_ptr = _jpeg_idct_ifast;
175
10.0k
        method = JDCT_IFAST;
176
10.0k
        break;
177
0
#endif
178
0
#ifdef DCT_FLOAT_SUPPORTED
179
144k
      case JDCT_FLOAT:
180
144k
#ifdef WITH_SIMD
181
144k
        if (jsimd_set_idct_float(cinfo))
182
144k
          method_ptr = jsimd_idct_float;
183
0
        else
184
0
#endif
185
0
          method_ptr = _jpeg_idct_float;
186
144k
        method = JDCT_FLOAT;
187
144k
        break;
188
0
#endif
189
0
      default:
190
0
        ERREXIT(cinfo, JERR_NOT_COMPILED);
191
0
        break;
192
165k
      }
193
165k
      break;
194
165k
#ifdef IDCT_SCALING_SUPPORTED
195
165k
    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
818
    case 12:
208
818
      method_ptr = _jpeg_idct_12x12;
209
818
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
818
      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
182k
    }
232
182k
    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
182k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
70.4k
      continue;
242
111k
    qtbl = compptr->quant_table;
243
111k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
48.8k
      continue;
245
63.0k
    idct->cur_method[ci] = method;
246
63.0k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
19.5k
    case JDCT_ISLOW:
249
19.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
19.5k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
1.27M
        for (i = 0; i < DCTSIZE2; i++) {
255
1.25M
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
1.25M
        }
257
19.5k
      }
258
19.5k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
7.69k
    case JDCT_IFAST:
262
7.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
7.69k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
7.69k
#define CONST_BITS  14
272
7.69k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
7.69k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
7.69k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
7.69k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
7.69k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
7.69k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
7.69k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
7.69k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
7.69k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
7.69k
        };
283
7.69k
        SHIFT_TEMPS
284
285
500k
        for (i = 0; i < DCTSIZE2; i++) {
286
492k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
492k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
492k
                                  (JLONG)aanscales[i]),
289
492k
                    CONST_BITS - IFAST_SCALE_BITS);
290
492k
        }
291
7.69k
      }
292
7.69k
      break;
293
0
#endif
294
0
#ifdef DCT_FLOAT_SUPPORTED
295
35.7k
    case JDCT_FLOAT:
296
35.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
35.7k
        FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *)compptr->dct_table;
303
35.7k
        int row, col;
304
35.7k
        static const double aanscalefactor[DCTSIZE] = {
305
35.7k
          1.0, 1.387039845, 1.306562965, 1.175875602,
306
35.7k
          1.0, 0.785694958, 0.541196100, 0.275899379
307
35.7k
        };
308
309
35.7k
        i = 0;
310
321k
        for (row = 0; row < DCTSIZE; row++) {
311
2.57M
          for (col = 0; col < DCTSIZE; col++) {
312
2.28M
            fmtbl[i] = (FLOAT_MULT_TYPE)
313
2.28M
              ((double)qtbl->quantval[i] *
314
2.28M
               aanscalefactor[row] * aanscalefactor[col]);
315
2.28M
            i++;
316
2.28M
          }
317
285k
        }
318
35.7k
      }
319
35.7k
      break;
320
0
#endif
321
0
    default:
322
0
      ERREXIT(cinfo, JERR_NOT_COMPILED);
323
0
      break;
324
63.0k
    }
325
63.0k
  }
326
82.5k
}
jddctmgr-12.c:start_pass
Line
Count
Source
102
13.0k
{
103
13.0k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
13.0k
  int ci, i;
105
13.0k
  jpeg_component_info *compptr;
106
13.0k
  int method = 0;
107
13.0k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
13.0k
  JQUANT_TBL *qtbl;
109
110
33.7k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
20.6k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
20.6k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
3.32k
    case 1:
116
3.32k
      method_ptr = _jpeg_idct_1x1;
117
3.32k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
3.32k
      break;
119
1.05k
    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.05k
        method_ptr = _jpeg_idct_2x2;
126
1.05k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
1.05k
      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.48k
    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.48k
        method_ptr = _jpeg_idct_4x4;
139
3.48k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
3.48k
      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
468
    case 6:
146
468
      method_ptr = _jpeg_idct_6x6;
147
468
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
468
      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.1k
    case DCTSIZE:
155
12.1k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
7.14k
      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.14k
          method_ptr = _jpeg_idct_islow;
164
7.14k
        method = JDCT_ISLOW;
165
7.14k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
4.66k
      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.66k
          method_ptr = _jpeg_idct_ifast;
175
4.66k
        method = JDCT_IFAST;
176
4.66k
        break;
177
0
#endif
178
0
#ifdef DCT_FLOAT_SUPPORTED
179
385
      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
385
          method_ptr = _jpeg_idct_float;
186
385
        method = JDCT_FLOAT;
187
385
        break;
188
0
#endif
189
0
      default:
190
0
        ERREXIT(cinfo, JERR_NOT_COMPILED);
191
0
        break;
192
12.1k
      }
193
12.1k
      break;
194
12.1k
#ifdef IDCT_SCALING_SUPPORTED
195
12.1k
    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
150
    case 12:
208
150
      method_ptr = _jpeg_idct_12x12;
209
150
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
150
      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
20.6k
    }
232
20.6k
    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
20.6k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
2.25k
      continue;
242
18.4k
    qtbl = compptr->quant_table;
243
18.4k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
4.04k
      continue;
245
14.3k
    idct->cur_method[ci] = method;
246
14.3k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
10.5k
    case JDCT_ISLOW:
249
10.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
10.5k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
684k
        for (i = 0; i < DCTSIZE2; i++) {
255
673k
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
673k
        }
257
10.5k
      }
258
10.5k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
3.60k
    case JDCT_IFAST:
262
3.60k
      {
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.60k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
3.60k
#define CONST_BITS  14
272
3.60k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
3.60k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
3.60k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
3.60k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
3.60k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
3.60k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
3.60k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
3.60k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
3.60k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
3.60k
        };
283
3.60k
        SHIFT_TEMPS
284
285
234k
        for (i = 0; i < DCTSIZE2; i++) {
286
230k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
230k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
230k
                                  (JLONG)aanscales[i]),
289
230k
                    CONST_BITS - IFAST_SCALE_BITS);
290
230k
        }
291
3.60k
      }
292
3.60k
      break;
293
0
#endif
294
0
#ifdef DCT_FLOAT_SUPPORTED
295
253
    case JDCT_FLOAT:
296
253
      {
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
253
        FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *)compptr->dct_table;
303
253
        int row, col;
304
253
        static const double aanscalefactor[DCTSIZE] = {
305
253
          1.0, 1.387039845, 1.306562965, 1.175875602,
306
253
          1.0, 0.785694958, 0.541196100, 0.275899379
307
253
        };
308
309
253
        i = 0;
310
2.27k
        for (row = 0; row < DCTSIZE; row++) {
311
18.2k
          for (col = 0; col < DCTSIZE; col++) {
312
16.1k
            fmtbl[i] = (FLOAT_MULT_TYPE)
313
16.1k
              ((double)qtbl->quantval[i] *
314
16.1k
               aanscalefactor[row] * aanscalefactor[col]);
315
16.1k
            i++;
316
16.1k
          }
317
2.02k
        }
318
253
      }
319
253
      break;
320
0
#endif
321
0
    default:
322
0
      ERREXIT(cinfo, JERR_NOT_COMPILED);
323
0
      break;
324
14.3k
    }
325
14.3k
  }
326
13.0k
}
327
328
329
/*
330
 * Initialize IDCT manager.
331
 */
332
333
GLOBAL(void)
334
_jinit_inverse_dct(j_decompress_ptr cinfo)
335
108k
{
336
108k
  my_idct_ptr idct;
337
108k
  int ci;
338
108k
  jpeg_component_info *compptr;
339
340
108k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
108k
  idct = (my_idct_ptr)
344
108k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
108k
                                sizeof(my_idct_controller));
346
108k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
108k
  idct->pub.start_pass = start_pass;
348
349
306k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
197k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
197k
    compptr->dct_table =
353
197k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
197k
                                  sizeof(multiplier_table));
355
197k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
197k
    idct->cur_method[ci] = -1;
358
197k
  }
359
108k
}
jinit_inverse_dct
Line
Count
Source
335
84.2k
{
336
84.2k
  my_idct_ptr idct;
337
84.2k
  int ci;
338
84.2k
  jpeg_component_info *compptr;
339
340
84.2k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
84.2k
  idct = (my_idct_ptr)
344
84.2k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
84.2k
                                sizeof(my_idct_controller));
346
84.2k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
84.2k
  idct->pub.start_pass = start_pass;
348
349
241k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
157k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
157k
    compptr->dct_table =
353
157k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
157k
                                  sizeof(multiplier_table));
355
157k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
157k
    idct->cur_method[ci] = -1;
358
157k
  }
359
84.2k
}
j12init_inverse_dct
Line
Count
Source
335
24.2k
{
336
24.2k
  my_idct_ptr idct;
337
24.2k
  int ci;
338
24.2k
  jpeg_component_info *compptr;
339
340
24.2k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
24.2k
  idct = (my_idct_ptr)
344
24.2k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
24.2k
                                sizeof(my_idct_controller));
346
24.2k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
24.2k
  idct->pub.start_pass = start_pass;
348
349
65.0k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
40.8k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
40.8k
    compptr->dct_table =
353
40.8k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
40.8k
                                  sizeof(multiplier_table));
355
40.8k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
40.8k
    idct->cur_method[ci] = -1;
358
40.8k
  }
359
24.2k
}
360
361
#endif /* defined(DCT_ISLOW_SUPPORTED) || defined(DCT_IFAST_SUPPORTED) ||
362
          defined(DCT_FLOAT_SUPPORTED) */