Coverage Report

Created: 2026-07-30 06:40

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
11.7k
{
103
11.7k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
11.7k
  int ci, i;
105
11.7k
  jpeg_component_info *compptr;
106
11.7k
  int method = 0;
107
11.7k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
11.7k
  JQUANT_TBL *qtbl;
109
110
29.6k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
17.9k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
17.9k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
3.47k
    case 1:
116
3.47k
      method_ptr = _jpeg_idct_1x1;
117
3.47k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
3.47k
      break;
119
531
    case 2:
120
#ifdef WITH_SIMD
121
183
      if (jsimd_set_idct_2x2(cinfo))
122
183
        method_ptr = jsimd_idct_2x2;
123
0
      else
124
0
#endif
125
348
        method_ptr = _jpeg_idct_2x2;
126
531
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
531
      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
1.83k
      if (jsimd_set_idct_4x4(cinfo))
135
1.83k
        method_ptr = jsimd_idct_4x4;
136
0
      else
137
0
#endif
138
1.64k
        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
0
    case 6:
146
0
      method_ptr = _jpeg_idct_6x6;
147
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
0
      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
10.4k
    case DCTSIZE:
155
10.4k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
6.37k
      case JDCT_ISLOW:
158
#ifdef WITH_SIMD
159
3.15k
        if (jsimd_set_idct_islow(cinfo))
160
3.15k
          method_ptr = jsimd_idct_islow;
161
0
        else
162
0
#endif
163
3.22k
          method_ptr = _jpeg_idct_islow;
164
6.37k
        method = JDCT_ISLOW;
165
6.37k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
4.06k
      case JDCT_IFAST:
169
#ifdef WITH_SIMD
170
2.06k
        if (jsimd_set_idct_ifast(cinfo))
171
2.06k
          method_ptr = jsimd_idct_ifast;
172
0
        else
173
0
#endif
174
2.00k
          method_ptr = _jpeg_idct_ifast;
175
4.06k
        method = JDCT_IFAST;
176
4.06k
        break;
177
0
#endif
178
0
#ifdef DCT_FLOAT_SUPPORTED
179
0
      case JDCT_FLOAT:
180
#ifdef WITH_SIMD
181
0
        if (jsimd_set_idct_float(cinfo))
182
0
          method_ptr = jsimd_idct_float;
183
0
        else
184
0
#endif
185
0
          method_ptr = _jpeg_idct_float;
186
0
        method = JDCT_FLOAT;
187
0
        break;
188
0
#endif
189
0
      default:
190
0
        ERREXIT(cinfo, JERR_NOT_COMPILED);
191
0
        break;
192
10.4k
      }
193
10.4k
      break;
194
10.4k
#ifdef IDCT_SCALING_SUPPORTED
195
10.4k
    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
0
    case 12:
208
0
      method_ptr = _jpeg_idct_12x12;
209
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
0
      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
17.9k
    }
232
17.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
17.9k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
2.06k
      continue;
242
15.8k
    qtbl = compptr->quant_table;
243
15.8k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
3.35k
      continue;
245
12.5k
    idct->cur_method[ci] = method;
246
12.5k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
9.27k
    case JDCT_ISLOW:
249
9.27k
      {
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
9.27k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
603k
        for (i = 0; i < DCTSIZE2; i++) {
255
593k
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
593k
        }
257
9.27k
      }
258
9.27k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
3.22k
    case JDCT_IFAST:
262
3.22k
      {
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.22k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
3.22k
#define CONST_BITS  14
272
3.22k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
3.22k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
3.22k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
3.22k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
3.22k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
3.22k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
3.22k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
3.22k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
3.22k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
3.22k
        };
283
3.22k
        SHIFT_TEMPS
284
285
209k
        for (i = 0; i < DCTSIZE2; i++) {
286
206k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
206k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
206k
                                  (JLONG)aanscales[i]),
289
206k
                    CONST_BITS - IFAST_SCALE_BITS);
290
206k
        }
291
3.22k
      }
292
3.22k
      break;
293
0
#endif
294
0
#ifdef DCT_FLOAT_SUPPORTED
295
0
    case JDCT_FLOAT:
296
0
      {
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
0
        FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *)compptr->dct_table;
303
0
        int row, col;
304
0
        static const double aanscalefactor[DCTSIZE] = {
305
0
          1.0, 1.387039845, 1.306562965, 1.175875602,
306
0
          1.0, 0.785694958, 0.541196100, 0.275899379
307
0
        };
308
309
0
        i = 0;
310
0
        for (row = 0; row < DCTSIZE; row++) {
311
0
          for (col = 0; col < DCTSIZE; col++) {
312
0
            fmtbl[i] = (FLOAT_MULT_TYPE)
313
0
              ((double)qtbl->quantval[i] *
314
0
               aanscalefactor[row] * aanscalefactor[col]);
315
0
            i++;
316
0
          }
317
0
        }
318
0
      }
319
0
      break;
320
0
#endif
321
0
    default:
322
0
      ERREXIT(cinfo, JERR_NOT_COMPILED);
323
0
      break;
324
12.5k
    }
325
12.5k
  }
326
11.7k
}
jddctmgr-8.c:start_pass
Line
Count
Source
102
6.29k
{
103
6.29k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
6.29k
  int ci, i;
105
6.29k
  jpeg_component_info *compptr;
106
6.29k
  int method = 0;
107
6.29k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
6.29k
  JQUANT_TBL *qtbl;
109
110
15.3k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
9.07k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
9.07k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
1.83k
    case 1:
116
1.83k
      method_ptr = _jpeg_idct_1x1;
117
1.83k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
1.83k
      break;
119
183
    case 2:
120
183
#ifdef WITH_SIMD
121
183
      if (jsimd_set_idct_2x2(cinfo))
122
183
        method_ptr = jsimd_idct_2x2;
123
0
      else
124
0
#endif
125
0
        method_ptr = _jpeg_idct_2x2;
126
183
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
183
      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
1.83k
    case 4:
133
1.83k
#ifdef WITH_SIMD
134
1.83k
      if (jsimd_set_idct_4x4(cinfo))
135
1.83k
        method_ptr = jsimd_idct_4x4;
136
0
      else
137
0
#endif
138
0
        method_ptr = _jpeg_idct_4x4;
139
1.83k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
1.83k
      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
0
    case 6:
146
0
      method_ptr = _jpeg_idct_6x6;
147
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
0
      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
5.21k
    case DCTSIZE:
155
5.21k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
3.15k
      case JDCT_ISLOW:
158
3.15k
#ifdef WITH_SIMD
159
3.15k
        if (jsimd_set_idct_islow(cinfo))
160
3.15k
          method_ptr = jsimd_idct_islow;
161
0
        else
162
0
#endif
163
0
          method_ptr = _jpeg_idct_islow;
164
3.15k
        method = JDCT_ISLOW;
165
3.15k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
2.06k
      case JDCT_IFAST:
169
2.06k
#ifdef WITH_SIMD
170
2.06k
        if (jsimd_set_idct_ifast(cinfo))
171
2.06k
          method_ptr = jsimd_idct_ifast;
172
0
        else
173
0
#endif
174
0
          method_ptr = _jpeg_idct_ifast;
175
2.06k
        method = JDCT_IFAST;
176
2.06k
        break;
177
0
#endif
178
0
#ifdef DCT_FLOAT_SUPPORTED
179
0
      case JDCT_FLOAT:
180
0
#ifdef WITH_SIMD
181
0
        if (jsimd_set_idct_float(cinfo))
182
0
          method_ptr = jsimd_idct_float;
183
0
        else
184
0
#endif
185
0
          method_ptr = _jpeg_idct_float;
186
0
        method = JDCT_FLOAT;
187
0
        break;
188
0
#endif
189
0
      default:
190
0
        ERREXIT(cinfo, JERR_NOT_COMPILED);
191
0
        break;
192
5.21k
      }
193
5.21k
      break;
194
5.21k
#ifdef IDCT_SCALING_SUPPORTED
195
5.21k
    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
0
    case 12:
208
0
      method_ptr = _jpeg_idct_12x12;
209
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
0
      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
9.07k
    }
232
9.07k
    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
9.07k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
992
      continue;
242
8.07k
    qtbl = compptr->quant_table;
243
8.07k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
1.36k
      continue;
245
6.71k
    idct->cur_method[ci] = method;
246
6.71k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
4.98k
    case JDCT_ISLOW:
249
4.98k
      {
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
4.98k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
324k
        for (i = 0; i < DCTSIZE2; i++) {
255
319k
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
319k
        }
257
4.98k
      }
258
4.98k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
1.72k
    case JDCT_IFAST:
262
1.72k
      {
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
1.72k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
1.72k
#define CONST_BITS  14
272
1.72k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
1.72k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
1.72k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
1.72k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
1.72k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
1.72k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
1.72k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
1.72k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
1.72k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
1.72k
        };
283
1.72k
        SHIFT_TEMPS
284
285
112k
        for (i = 0; i < DCTSIZE2; i++) {
286
110k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
110k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
110k
                                  (JLONG)aanscales[i]),
289
110k
                    CONST_BITS - IFAST_SCALE_BITS);
290
110k
        }
291
1.72k
      }
292
1.72k
      break;
293
0
#endif
294
0
#ifdef DCT_FLOAT_SUPPORTED
295
0
    case JDCT_FLOAT:
296
0
      {
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
0
        FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *)compptr->dct_table;
303
0
        int row, col;
304
0
        static const double aanscalefactor[DCTSIZE] = {
305
0
          1.0, 1.387039845, 1.306562965, 1.175875602,
306
0
          1.0, 0.785694958, 0.541196100, 0.275899379
307
0
        };
308
309
0
        i = 0;
310
0
        for (row = 0; row < DCTSIZE; row++) {
311
0
          for (col = 0; col < DCTSIZE; col++) {
312
0
            fmtbl[i] = (FLOAT_MULT_TYPE)
313
0
              ((double)qtbl->quantval[i] *
314
0
               aanscalefactor[row] * aanscalefactor[col]);
315
0
            i++;
316
0
          }
317
0
        }
318
0
      }
319
0
      break;
320
0
#endif
321
0
    default:
322
0
      ERREXIT(cinfo, JERR_NOT_COMPILED);
323
0
      break;
324
6.71k
    }
325
6.71k
  }
326
6.29k
}
jddctmgr-12.c:start_pass
Line
Count
Source
102
5.46k
{
103
5.46k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
5.46k
  int ci, i;
105
5.46k
  jpeg_component_info *compptr;
106
5.46k
  int method = 0;
107
5.46k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
5.46k
  JQUANT_TBL *qtbl;
109
110
14.3k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
8.85k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
8.85k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
1.63k
    case 1:
116
1.63k
      method_ptr = _jpeg_idct_1x1;
117
1.63k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
1.63k
      break;
119
348
    case 2:
120
#ifdef WITH_SIMD
121
      if (jsimd_set_idct_2x2(cinfo))
122
        method_ptr = jsimd_idct_2x2;
123
      else
124
#endif
125
348
        method_ptr = _jpeg_idct_2x2;
126
348
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
348
      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
1.64k
    case 4:
133
#ifdef WITH_SIMD
134
      if (jsimd_set_idct_4x4(cinfo))
135
        method_ptr = jsimd_idct_4x4;
136
      else
137
#endif
138
1.64k
        method_ptr = _jpeg_idct_4x4;
139
1.64k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
1.64k
      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
0
    case 6:
146
0
      method_ptr = _jpeg_idct_6x6;
147
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
0
      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
5.22k
    case DCTSIZE:
155
5.22k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
3.22k
      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
3.22k
          method_ptr = _jpeg_idct_islow;
164
3.22k
        method = JDCT_ISLOW;
165
3.22k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
2.00k
      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
2.00k
          method_ptr = _jpeg_idct_ifast;
175
2.00k
        method = JDCT_IFAST;
176
2.00k
        break;
177
0
#endif
178
0
#ifdef DCT_FLOAT_SUPPORTED
179
0
      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
0
          method_ptr = _jpeg_idct_float;
186
0
        method = JDCT_FLOAT;
187
0
        break;
188
0
#endif
189
0
      default:
190
0
        ERREXIT(cinfo, JERR_NOT_COMPILED);
191
0
        break;
192
5.22k
      }
193
5.22k
      break;
194
5.22k
#ifdef IDCT_SCALING_SUPPORTED
195
5.22k
    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
0
    case 12:
208
0
      method_ptr = _jpeg_idct_12x12;
209
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
0
      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
8.85k
    }
232
8.85k
    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
8.85k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
1.06k
      continue;
242
7.78k
    qtbl = compptr->quant_table;
243
7.78k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
1.99k
      continue;
245
5.79k
    idct->cur_method[ci] = method;
246
5.79k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
4.29k
    case JDCT_ISLOW:
249
4.29k
      {
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
4.29k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
279k
        for (i = 0; i < DCTSIZE2; i++) {
255
274k
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
274k
        }
257
4.29k
      }
258
4.29k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
1.50k
    case JDCT_IFAST:
262
1.50k
      {
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
1.50k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
1.50k
#define CONST_BITS  14
272
1.50k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
1.50k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
1.50k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
1.50k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
1.50k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
1.50k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
1.50k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
1.50k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
1.50k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
1.50k
        };
283
1.50k
        SHIFT_TEMPS
284
285
97.5k
        for (i = 0; i < DCTSIZE2; i++) {
286
96.0k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
96.0k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
96.0k
                                  (JLONG)aanscales[i]),
289
96.0k
                    CONST_BITS - IFAST_SCALE_BITS);
290
96.0k
        }
291
1.50k
      }
292
1.50k
      break;
293
0
#endif
294
0
#ifdef DCT_FLOAT_SUPPORTED
295
0
    case JDCT_FLOAT:
296
0
      {
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
0
        FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *)compptr->dct_table;
303
0
        int row, col;
304
0
        static const double aanscalefactor[DCTSIZE] = {
305
0
          1.0, 1.387039845, 1.306562965, 1.175875602,
306
0
          1.0, 0.785694958, 0.541196100, 0.275899379
307
0
        };
308
309
0
        i = 0;
310
0
        for (row = 0; row < DCTSIZE; row++) {
311
0
          for (col = 0; col < DCTSIZE; col++) {
312
0
            fmtbl[i] = (FLOAT_MULT_TYPE)
313
0
              ((double)qtbl->quantval[i] *
314
0
               aanscalefactor[row] * aanscalefactor[col]);
315
0
            i++;
316
0
          }
317
0
        }
318
0
      }
319
0
      break;
320
0
#endif
321
0
    default:
322
0
      ERREXIT(cinfo, JERR_NOT_COMPILED);
323
0
      break;
324
5.79k
    }
325
5.79k
  }
326
5.46k
}
327
328
329
/*
330
 * Initialize IDCT manager.
331
 */
332
333
GLOBAL(void)
334
_jinit_inverse_dct(j_decompress_ptr cinfo)
335
16.1k
{
336
16.1k
  my_idct_ptr idct;
337
16.1k
  int ci;
338
16.1k
  jpeg_component_info *compptr;
339
340
16.1k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
16.1k
  idct = (my_idct_ptr)
344
16.1k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
16.1k
                                sizeof(my_idct_controller));
346
16.1k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
16.1k
  idct->pub.start_pass = start_pass;
348
349
41.1k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
25.0k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
25.0k
    compptr->dct_table =
353
25.0k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
25.0k
                                  sizeof(multiplier_table));
355
25.0k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
25.0k
    idct->cur_method[ci] = -1;
358
25.0k
  }
359
16.1k
}
jinit_inverse_dct
Line
Count
Source
335
9.48k
{
336
9.48k
  my_idct_ptr idct;
337
9.48k
  int ci;
338
9.48k
  jpeg_component_info *compptr;
339
340
9.48k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
9.48k
  idct = (my_idct_ptr)
344
9.48k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
9.48k
                                sizeof(my_idct_controller));
346
9.48k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
9.48k
  idct->pub.start_pass = start_pass;
348
349
23.3k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
13.8k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
13.8k
    compptr->dct_table =
353
13.8k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
13.8k
                                  sizeof(multiplier_table));
355
13.8k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
13.8k
    idct->cur_method[ci] = -1;
358
13.8k
  }
359
9.48k
}
j12init_inverse_dct
Line
Count
Source
335
6.63k
{
336
6.63k
  my_idct_ptr idct;
337
6.63k
  int ci;
338
6.63k
  jpeg_component_info *compptr;
339
340
6.63k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
6.63k
  idct = (my_idct_ptr)
344
6.63k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
6.63k
                                sizeof(my_idct_controller));
346
6.63k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
6.63k
  idct->pub.start_pass = start_pass;
348
349
17.8k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
11.1k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
11.1k
    compptr->dct_table =
353
11.1k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
11.1k
                                  sizeof(multiplier_table));
355
11.1k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
11.1k
    idct->cur_method[ci] = -1;
358
11.1k
  }
359
6.63k
}
360
361
#endif /* defined(DCT_ISLOW_SUPPORTED) || defined(DCT_IFAST_SUPPORTED) ||
362
          defined(DCT_FLOAT_SUPPORTED) */