Coverage Report

Created: 2026-08-31 07:17

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
7.48k
{
103
7.48k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
7.48k
  int ci, i;
105
7.48k
  jpeg_component_info *compptr;
106
7.48k
  int method = 0;
107
7.48k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
7.48k
  JQUANT_TBL *qtbl;
109
110
18.8k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
11.3k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
11.3k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
0
    case 1:
116
0
      method_ptr = _jpeg_idct_1x1;
117
0
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
0
      break;
119
2.11k
    case 2:
120
#ifdef WITH_SIMD
121
1.82k
      if (jsimd_set_idct_2x2(cinfo))
122
1.82k
        method_ptr = jsimd_idct_2x2;
123
0
      else
124
0
#endif
125
291
        method_ptr = _jpeg_idct_2x2;
126
2.11k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
2.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
372
    case 4:
133
#ifdef WITH_SIMD
134
278
      if (jsimd_set_idct_4x4(cinfo))
135
278
        method_ptr = jsimd_idct_4x4;
136
0
      else
137
0
#endif
138
94
        method_ptr = _jpeg_idct_4x4;
139
372
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
372
      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
2.12k
    case 6:
146
2.12k
      method_ptr = _jpeg_idct_6x6;
147
2.12k
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
2.12k
      break;
149
0
    case 7:
150
0
      method_ptr = _jpeg_idct_7x7;
151
0
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
152
0
      break;
153
0
#endif
154
6.33k
    case DCTSIZE:
155
6.33k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
2.48k
      case JDCT_ISLOW:
158
#ifdef WITH_SIMD
159
2.10k
        if (jsimd_set_idct_islow(cinfo))
160
2.10k
          method_ptr = jsimd_idct_islow;
161
0
        else
162
0
#endif
163
385
          method_ptr = _jpeg_idct_islow;
164
2.48k
        method = JDCT_ISLOW;
165
2.48k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
3.84k
      case JDCT_IFAST:
169
#ifdef WITH_SIMD
170
3.40k
        if (jsimd_set_idct_ifast(cinfo))
171
3.40k
          method_ptr = jsimd_idct_ifast;
172
0
        else
173
0
#endif
174
436
          method_ptr = _jpeg_idct_ifast;
175
3.84k
        method = JDCT_IFAST;
176
3.84k
        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
6.33k
      }
193
6.33k
      break;
194
6.33k
#ifdef IDCT_SCALING_SUPPORTED
195
6.33k
    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
382
    case 12:
208
382
      method_ptr = _jpeg_idct_12x12;
209
382
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
382
      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
11.3k
    }
232
11.3k
    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
11.3k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
0
      continue;
242
11.3k
    qtbl = compptr->quant_table;
243
11.3k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
2.37k
      continue;
245
8.94k
    idct->cur_method[ci] = method;
246
8.94k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
5.93k
    case JDCT_ISLOW:
249
5.93k
      {
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
5.93k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
385k
        for (i = 0; i < DCTSIZE2; i++) {
255
379k
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
379k
        }
257
5.93k
      }
258
5.93k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
3.01k
    case JDCT_IFAST:
262
3.01k
      {
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.01k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
3.01k
#define CONST_BITS  14
272
3.01k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
3.01k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
3.01k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
3.01k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
3.01k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
3.01k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
3.01k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
3.01k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
3.01k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
3.01k
        };
283
3.01k
        SHIFT_TEMPS
284
285
195k
        for (i = 0; i < DCTSIZE2; i++) {
286
192k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
192k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
192k
                                  (JLONG)aanscales[i]),
289
192k
                    CONST_BITS - IFAST_SCALE_BITS);
290
192k
        }
291
3.01k
      }
292
3.01k
      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
8.94k
    }
325
8.94k
  }
326
7.48k
}
jddctmgr-8.c:start_pass
Line
Count
Source
102
6.48k
{
103
6.48k
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
6.48k
  int ci, i;
105
6.48k
  jpeg_component_info *compptr;
106
6.48k
  int method = 0;
107
6.48k
  _inverse_DCT_method_ptr method_ptr = NULL;
108
6.48k
  JQUANT_TBL *qtbl;
109
110
16.2k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
9.73k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
9.73k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
0
    case 1:
116
0
      method_ptr = _jpeg_idct_1x1;
117
0
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
0
      break;
119
1.82k
    case 2:
120
1.82k
#ifdef WITH_SIMD
121
1.82k
      if (jsimd_set_idct_2x2(cinfo))
122
1.82k
        method_ptr = jsimd_idct_2x2;
123
0
      else
124
0
#endif
125
0
        method_ptr = _jpeg_idct_2x2;
126
1.82k
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
1.82k
      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
278
    case 4:
133
278
#ifdef WITH_SIMD
134
278
      if (jsimd_set_idct_4x4(cinfo))
135
278
        method_ptr = jsimd_idct_4x4;
136
0
      else
137
0
#endif
138
0
        method_ptr = _jpeg_idct_4x4;
139
278
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
278
      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
1.83k
    case 6:
146
1.83k
      method_ptr = _jpeg_idct_6x6;
147
1.83k
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
1.83k
      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.51k
    case DCTSIZE:
155
5.51k
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
2.10k
      case JDCT_ISLOW:
158
2.10k
#ifdef WITH_SIMD
159
2.10k
        if (jsimd_set_idct_islow(cinfo))
160
2.10k
          method_ptr = jsimd_idct_islow;
161
0
        else
162
0
#endif
163
0
          method_ptr = _jpeg_idct_islow;
164
2.10k
        method = JDCT_ISLOW;
165
2.10k
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
3.40k
      case JDCT_IFAST:
169
3.40k
#ifdef WITH_SIMD
170
3.40k
        if (jsimd_set_idct_ifast(cinfo))
171
3.40k
          method_ptr = jsimd_idct_ifast;
172
0
        else
173
0
#endif
174
0
          method_ptr = _jpeg_idct_ifast;
175
3.40k
        method = JDCT_IFAST;
176
3.40k
        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.51k
      }
193
5.51k
      break;
194
5.51k
#ifdef IDCT_SCALING_SUPPORTED
195
5.51k
    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
288
    case 12:
208
288
      method_ptr = _jpeg_idct_12x12;
209
288
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
288
      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.73k
    }
232
9.73k
    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.73k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
0
      continue;
242
9.73k
    qtbl = compptr->quant_table;
243
9.73k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
2.08k
      continue;
245
7.64k
    idct->cur_method[ci] = method;
246
7.64k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
4.97k
    case JDCT_ISLOW:
249
4.97k
      {
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.97k
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
323k
        for (i = 0; i < DCTSIZE2; i++) {
255
318k
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
318k
        }
257
4.97k
      }
258
4.97k
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
2.66k
    case JDCT_IFAST:
262
2.66k
      {
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
2.66k
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
2.66k
#define CONST_BITS  14
272
2.66k
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
2.66k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
2.66k
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
2.66k
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
2.66k
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
2.66k
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
2.66k
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
2.66k
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
2.66k
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
2.66k
        };
283
2.66k
        SHIFT_TEMPS
284
285
173k
        for (i = 0; i < DCTSIZE2; i++) {
286
170k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
170k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
170k
                                  (JLONG)aanscales[i]),
289
170k
                    CONST_BITS - IFAST_SCALE_BITS);
290
170k
        }
291
2.66k
      }
292
2.66k
      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
7.64k
    }
325
7.64k
  }
326
6.48k
}
jddctmgr-12.c:start_pass
Line
Count
Source
102
997
{
103
997
  my_idct_ptr idct = (my_idct_ptr)cinfo->idct;
104
997
  int ci, i;
105
997
  jpeg_component_info *compptr;
106
997
  int method = 0;
107
997
  _inverse_DCT_method_ptr method_ptr = NULL;
108
997
  JQUANT_TBL *qtbl;
109
110
2.58k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
111
1.59k
       ci++, compptr++) {
112
    /* Select the proper IDCT routine for this component's scaling */
113
1.59k
    switch (compptr->_DCT_scaled_size) {
114
0
#ifdef IDCT_SCALING_SUPPORTED
115
0
    case 1:
116
0
      method_ptr = _jpeg_idct_1x1;
117
0
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
118
0
      break;
119
291
    case 2:
120
#ifdef WITH_SIMD
121
      if (jsimd_set_idct_2x2(cinfo))
122
        method_ptr = jsimd_idct_2x2;
123
      else
124
#endif
125
291
        method_ptr = _jpeg_idct_2x2;
126
291
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
127
291
      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
94
    case 4:
133
#ifdef WITH_SIMD
134
      if (jsimd_set_idct_4x4(cinfo))
135
        method_ptr = jsimd_idct_4x4;
136
      else
137
#endif
138
94
        method_ptr = _jpeg_idct_4x4;
139
94
      method = JDCT_ISLOW;      /* jidctred uses islow-style table */
140
94
      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
291
    case 6:
146
291
      method_ptr = _jpeg_idct_6x6;
147
291
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
148
291
      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
821
    case DCTSIZE:
155
821
      switch (cinfo->dct_method) {
156
0
#ifdef DCT_ISLOW_SUPPORTED
157
385
      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
385
          method_ptr = _jpeg_idct_islow;
164
385
        method = JDCT_ISLOW;
165
385
        break;
166
0
#endif
167
0
#ifdef DCT_IFAST_SUPPORTED
168
436
      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
436
          method_ptr = _jpeg_idct_ifast;
175
436
        method = JDCT_IFAST;
176
436
        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
821
      }
193
821
      break;
194
821
#ifdef IDCT_SCALING_SUPPORTED
195
821
    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
94
    case 12:
208
94
      method_ptr = _jpeg_idct_12x12;
209
94
      method = JDCT_ISLOW;      /* jidctint uses islow-style table */
210
94
      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
1.59k
    }
232
1.59k
    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
1.59k
    if (!compptr->component_needed || idct->cur_method[ci] == method)
241
0
      continue;
242
1.59k
    qtbl = compptr->quant_table;
243
1.59k
    if (qtbl == NULL)           /* happens if no data yet for component */
244
288
      continue;
245
1.30k
    idct->cur_method[ci] = method;
246
1.30k
    switch (method) {
247
0
#ifdef PROVIDE_ISLOW_TABLES
248
957
    case JDCT_ISLOW:
249
957
      {
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
957
        ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *)compptr->dct_table;
254
62.2k
        for (i = 0; i < DCTSIZE2; i++) {
255
61.2k
          ismtbl[i] = (ISLOW_MULT_TYPE)qtbl->quantval[i];
256
61.2k
        }
257
957
      }
258
957
      break;
259
0
#endif
260
0
#ifdef DCT_IFAST_SUPPORTED
261
346
    case JDCT_IFAST:
262
346
      {
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
346
        IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *)compptr->dct_table;
271
346
#define CONST_BITS  14
272
346
        static const INT16 aanscales[DCTSIZE2] = {
273
          /* precomputed values scaled up by 14 bits */
274
346
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
275
346
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
276
346
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
277
346
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
278
346
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
279
346
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
280
346
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
281
346
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
282
346
        };
283
346
        SHIFT_TEMPS
284
285
22.4k
        for (i = 0; i < DCTSIZE2; i++) {
286
22.1k
          ifmtbl[i] = (IFAST_MULT_TYPE)
287
22.1k
            DESCALE(MULTIPLY16V16((JLONG)qtbl->quantval[i],
288
22.1k
                                  (JLONG)aanscales[i]),
289
22.1k
                    CONST_BITS - IFAST_SCALE_BITS);
290
22.1k
        }
291
346
      }
292
346
      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
1.30k
    }
325
1.30k
  }
326
997
}
327
328
329
/*
330
 * Initialize IDCT manager.
331
 */
332
333
GLOBAL(void)
334
_jinit_inverse_dct(j_decompress_ptr cinfo)
335
12.8k
{
336
12.8k
  my_idct_ptr idct;
337
12.8k
  int ci;
338
12.8k
  jpeg_component_info *compptr;
339
340
12.8k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
12.8k
  idct = (my_idct_ptr)
344
12.8k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
12.8k
                                sizeof(my_idct_controller));
346
12.8k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
12.8k
  idct->pub.start_pass = start_pass;
348
349
33.1k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
20.3k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
20.3k
    compptr->dct_table =
353
20.3k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
20.3k
                                  sizeof(multiplier_table));
355
20.3k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
20.3k
    idct->cur_method[ci] = -1;
358
20.3k
  }
359
12.8k
}
jinit_inverse_dct
Line
Count
Source
335
11.3k
{
336
11.3k
  my_idct_ptr idct;
337
11.3k
  int ci;
338
11.3k
  jpeg_component_info *compptr;
339
340
11.3k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
11.3k
  idct = (my_idct_ptr)
344
11.3k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
11.3k
                                sizeof(my_idct_controller));
346
11.3k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
11.3k
  idct->pub.start_pass = start_pass;
348
349
28.9k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
17.5k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
17.5k
    compptr->dct_table =
353
17.5k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
17.5k
                                  sizeof(multiplier_table));
355
17.5k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
17.5k
    idct->cur_method[ci] = -1;
358
17.5k
  }
359
11.3k
}
j12init_inverse_dct
Line
Count
Source
335
1.48k
{
336
1.48k
  my_idct_ptr idct;
337
1.48k
  int ci;
338
1.48k
  jpeg_component_info *compptr;
339
340
1.48k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
341
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
342
343
1.48k
  idct = (my_idct_ptr)
344
1.48k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
345
1.48k
                                sizeof(my_idct_controller));
346
1.48k
  cinfo->idct = (struct jpeg_inverse_dct *)idct;
347
1.48k
  idct->pub.start_pass = start_pass;
348
349
4.21k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
350
2.73k
       ci++, compptr++) {
351
    /* Allocate and pre-zero a multiplier table for each component */
352
2.73k
    compptr->dct_table =
353
2.73k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
354
2.73k
                                  sizeof(multiplier_table));
355
2.73k
    memset(compptr->dct_table, 0, sizeof(multiplier_table));
356
    /* Mark multiplier table not yet set up for any method */
357
2.73k
    idct->cur_method[ci] = -1;
358
2.73k
  }
359
1.48k
}
360
361
#endif /* defined(DCT_ISLOW_SUPPORTED) || defined(DCT_IFAST_SUPPORTED) ||
362
          defined(DCT_FLOAT_SUPPORTED) */