Coverage Report

Created: 2026-05-30 06:17

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libjpeg-turbo/src/jdcoefct.c
Line
Count
Source
1
/*
2
 * jdcoefct.c
3
 *
4
 * This file was part of the Independent JPEG Group's software:
5
 * Copyright (C) 1994-1997, Thomas G. Lane.
6
 * libjpeg-turbo Modifications:
7
 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
8
 * Copyright (C) 2010, 2015-2016, 2019-2020, 2022-2026, D. R. Commander.
9
 * Copyright (C) 2015, 2020, Google, Inc.
10
 * For conditions of distribution and use, see the accompanying README.ijg
11
 * file.
12
 *
13
 * This file contains the coefficient buffer controller for decompression.
14
 * This controller is the top level of the lossy JPEG decompressor proper.
15
 * The coefficient buffer lies between entropy decoding and inverse-DCT steps.
16
 *
17
 * In buffered-image mode, this controller is the interface between
18
 * input-oriented processing and output-oriented processing.
19
 * Also, the input side (only) is used when reading a file for transcoding.
20
 */
21
22
#include "jinclude.h"
23
#include "jdcoefct.h"
24
#include "jpegapicomp.h"
25
#include "jsamplecomp.h"
26
#ifdef WITH_PROFILE
27
#include "tjutil.h"
28
#endif
29
30
31
/* Forward declarations */
32
METHODDEF(int) decompress_onepass(j_decompress_ptr cinfo,
33
                                  _JSAMPIMAGE output_buf);
34
#ifdef D_MULTISCAN_FILES_SUPPORTED
35
METHODDEF(int) decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf);
36
#endif
37
#ifdef BLOCK_SMOOTHING_SUPPORTED
38
LOCAL(boolean) smoothing_ok(j_decompress_ptr cinfo);
39
METHODDEF(int) decompress_smooth_data(j_decompress_ptr cinfo,
40
                                      _JSAMPIMAGE output_buf);
41
#endif
42
43
44
/*
45
 * Initialize for an input processing pass.
46
 */
47
48
METHODDEF(void)
49
start_input_pass(j_decompress_ptr cinfo)
50
10.5k
{
51
10.5k
  cinfo->input_iMCU_row = 0;
52
10.5k
  start_iMCU_row(cinfo);
53
10.5k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
50
9.89k
{
51
9.89k
  cinfo->input_iMCU_row = 0;
52
9.89k
  start_iMCU_row(cinfo);
53
9.89k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
50
704
{
51
704
  cinfo->input_iMCU_row = 0;
52
704
  start_iMCU_row(cinfo);
53
704
}
54
55
56
/*
57
 * Initialize for an output processing pass.
58
 */
59
60
METHODDEF(void)
61
start_output_pass(j_decompress_ptr cinfo)
62
3.29k
{
63
3.29k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
3.29k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
65
66
  /* If multipass, check to see whether to use block smoothing on this pass */
67
3.29k
  if (coef->pub.coef_arrays != NULL) {
68
1.86k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
1.18k
      coef->pub._decompress_data = decompress_smooth_data;
70
678
    else
71
678
      coef->pub._decompress_data = decompress_data;
72
1.86k
  }
73
3.29k
#endif
74
3.29k
  cinfo->output_iMCU_row = 0;
75
3.29k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
62
3.15k
{
63
3.15k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
3.15k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
65
66
  /* If multipass, check to see whether to use block smoothing on this pass */
67
3.15k
  if (coef->pub.coef_arrays != NULL) {
68
1.73k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
1.16k
      coef->pub._decompress_data = decompress_smooth_data;
70
569
    else
71
569
      coef->pub._decompress_data = decompress_data;
72
1.73k
  }
73
3.15k
#endif
74
3.15k
  cinfo->output_iMCU_row = 0;
75
3.15k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
62
147
{
63
147
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
147
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
65
66
  /* If multipass, check to see whether to use block smoothing on this pass */
67
147
  if (coef->pub.coef_arrays != NULL) {
68
137
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
28
      coef->pub._decompress_data = decompress_smooth_data;
70
109
    else
71
109
      coef->pub._decompress_data = decompress_data;
72
137
  }
73
147
#endif
74
147
  cinfo->output_iMCU_row = 0;
75
147
}
76
77
78
/*
79
 * Decompress and return some data in the single-pass case.
80
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
81
 * Input and output must run in lockstep since we have only a one-MCU buffer.
82
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
83
 *
84
 * NB: output_buf contains a plane for each component in image,
85
 * which we index according to the component's SOF position.
86
 */
87
88
METHODDEF(int)
89
decompress_onepass(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
90
66.4k
{
91
66.4k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
66.4k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
66.4k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
66.4k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
66.4k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
66.4k
  _JSAMPARRAY output_ptr;
97
66.4k
  JDIMENSION start_col, output_col;
98
66.4k
  jpeg_component_info *compptr;
99
66.4k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
154k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
88.4k
       yoffset++) {
104
486k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
397k
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
397k
      jzero_far((void *)coef->MCU_buffer[0],
108
397k
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
397k
      if (!cinfo->entropy->insufficient_data)
110
397k
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
397k
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
115
        /* Suspension forced; update state counters and exit */
116
0
        coef->MCU_vert_offset = yoffset;
117
0
        coef->MCU_ctr = MCU_col_num;
118
#ifdef WITH_PROFILE
119
        cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
120
        cinfo->master->entropy_mcoeffs +=
121
          (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
122
#endif
123
0
        return JPEG_SUSPENDED;
124
0
      }
125
#ifdef WITH_PROFILE
126
      cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
127
      cinfo->master->entropy_mcoeffs +=
128
        (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
129
#endif
130
131
      /* Only perform the IDCT on blocks that are contained within the desired
132
       * cropping region.
133
       */
134
397k
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
397k
          MCU_col_num <= cinfo->master->last_iMCU_col) {
136
        /* Determine where data should go in output_buf and do the IDCT thing.
137
         * We skip dummy blocks at the right and bottom edges (but blkn gets
138
         * incremented past them!).  Note the inner loop relies on having
139
         * allocated the MCU_buffer[] blocks sequentially.
140
         */
141
397k
        blkn = 0;               /* index of current DCT block within MCU */
142
1.12M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
731k
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
731k
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
731k
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
731k
          useful_width = (MCU_col_num < last_MCU_col) ?
151
476k
                         compptr->MCU_width : compptr->last_col_width;
152
731k
          output_ptr = output_buf[compptr->component_index] +
153
731k
                       yoffset * compptr->_DCT_scaled_size;
154
731k
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
731k
                      compptr->MCU_sample_width;
156
1.67M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
943k
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
855k
                yoffset + yindex < compptr->last_row_height) {
159
855k
              output_col = start_col;
160
1.85M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
1.00M
                (*inverse_DCT) (cinfo, compptr,
165
1.00M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
1.00M
                                output_ptr, output_col);
167
#ifdef WITH_PROFILE
168
                cinfo->master->idct_elapsed +=
169
                  getTime() - cinfo->master->start;
170
                cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
171
#endif
172
1.00M
                output_col += compptr->_DCT_scaled_size;
173
1.00M
              }
174
855k
            }
175
943k
            blkn += compptr->MCU_width;
176
943k
            output_ptr += compptr->_DCT_scaled_size;
177
943k
          }
178
731k
        }
179
397k
      }
180
397k
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
88.4k
    coef->MCU_ctr = 0;
183
88.4k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
66.4k
  cinfo->output_iMCU_row++;
186
66.4k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
65.0k
    start_iMCU_row(cinfo);
188
65.0k
    return JPEG_ROW_COMPLETED;
189
65.0k
  }
190
  /* Completed the scan */
191
1.42k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
1.42k
  return JPEG_SCAN_COMPLETED;
193
66.4k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
90
66.4k
{
91
66.4k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
66.4k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
66.4k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
66.4k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
66.4k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
66.4k
  _JSAMPARRAY output_ptr;
97
66.4k
  JDIMENSION start_col, output_col;
98
66.4k
  jpeg_component_info *compptr;
99
66.4k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
154k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
88.4k
       yoffset++) {
104
486k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
397k
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
397k
      jzero_far((void *)coef->MCU_buffer[0],
108
397k
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
397k
      if (!cinfo->entropy->insufficient_data)
110
397k
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
397k
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
115
        /* Suspension forced; update state counters and exit */
116
0
        coef->MCU_vert_offset = yoffset;
117
0
        coef->MCU_ctr = MCU_col_num;
118
#ifdef WITH_PROFILE
119
        cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
120
        cinfo->master->entropy_mcoeffs +=
121
          (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
122
#endif
123
0
        return JPEG_SUSPENDED;
124
0
      }
125
#ifdef WITH_PROFILE
126
      cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
127
      cinfo->master->entropy_mcoeffs +=
128
        (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
129
#endif
130
131
      /* Only perform the IDCT on blocks that are contained within the desired
132
       * cropping region.
133
       */
134
397k
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
397k
          MCU_col_num <= cinfo->master->last_iMCU_col) {
136
        /* Determine where data should go in output_buf and do the IDCT thing.
137
         * We skip dummy blocks at the right and bottom edges (but blkn gets
138
         * incremented past them!).  Note the inner loop relies on having
139
         * allocated the MCU_buffer[] blocks sequentially.
140
         */
141
397k
        blkn = 0;               /* index of current DCT block within MCU */
142
1.12M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
731k
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
731k
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
731k
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
731k
          useful_width = (MCU_col_num < last_MCU_col) ?
151
476k
                         compptr->MCU_width : compptr->last_col_width;
152
731k
          output_ptr = output_buf[compptr->component_index] +
153
731k
                       yoffset * compptr->_DCT_scaled_size;
154
731k
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
731k
                      compptr->MCU_sample_width;
156
1.67M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
943k
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
855k
                yoffset + yindex < compptr->last_row_height) {
159
855k
              output_col = start_col;
160
1.85M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
1.00M
                (*inverse_DCT) (cinfo, compptr,
165
1.00M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
1.00M
                                output_ptr, output_col);
167
#ifdef WITH_PROFILE
168
                cinfo->master->idct_elapsed +=
169
                  getTime() - cinfo->master->start;
170
                cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
171
#endif
172
1.00M
                output_col += compptr->_DCT_scaled_size;
173
1.00M
              }
174
855k
            }
175
943k
            blkn += compptr->MCU_width;
176
943k
            output_ptr += compptr->_DCT_scaled_size;
177
943k
          }
178
731k
        }
179
397k
      }
180
397k
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
88.4k
    coef->MCU_ctr = 0;
183
88.4k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
66.4k
  cinfo->output_iMCU_row++;
186
66.4k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
65.0k
    start_iMCU_row(cinfo);
188
65.0k
    return JPEG_ROW_COMPLETED;
189
65.0k
  }
190
  /* Completed the scan */
191
1.42k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
1.42k
  return JPEG_SCAN_COMPLETED;
193
66.4k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_onepass
194
195
196
/*
197
 * Dummy consume-input routine for single-pass operation.
198
 */
199
200
METHODDEF(int)
201
dummy_consume_data(j_decompress_ptr cinfo)
202
0
{
203
0
  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
204
0
}
Unexecuted instantiation: jdcoefct-8.c:dummy_consume_data
Unexecuted instantiation: jdcoefct-12.c:dummy_consume_data
205
206
207
#ifdef D_MULTISCAN_FILES_SUPPORTED
208
209
/*
210
 * Consume input data and store it in the full-image coefficient buffer.
211
 * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
212
 * ie, v_samp_factor block rows for each component in the scan.
213
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
214
 */
215
216
METHODDEF(int)
217
consume_data(j_decompress_ptr cinfo)
218
377k
{
219
377k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
377k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
377k
  int blkn, ci, xindex, yindex, yoffset;
222
377k
  JDIMENSION start_col;
223
377k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
377k
  JBLOCKROW buffer_ptr;
225
377k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
1.21M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
840k
    compptr = cinfo->cur_comp_info[ci];
230
840k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
840k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
840k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
840k
       (JDIMENSION)compptr->v_samp_factor, TRUE);
234
    /* Note: entropy decoder expects buffer to be zeroed,
235
     * but this is handled automatically by the memory manager
236
     * because we requested a pre-zeroed array.
237
     */
238
840k
  }
239
240
  /* Loop to process one whole iMCU row */
241
774k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
397k
       yoffset++) {
243
10.8M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
10.4M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
10.4M
      blkn = 0;                 /* index of current DCT block within MCU */
247
31.4M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
20.9M
        compptr = cinfo->cur_comp_info[ci];
249
20.9M
        start_col = MCU_col_num * compptr->MCU_width;
250
43.2M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
22.2M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
45.3M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
23.1M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
23.1M
          }
255
22.2M
        }
256
20.9M
      }
257
10.4M
      if (!cinfo->entropy->insufficient_data)
258
10.4M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
259
      /* Try to fetch the MCU. */
260
#ifdef WITH_PROFILE
261
      cinfo->master->start = getTime();
262
#endif
263
10.4M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
264
        /* Suspension forced; update state counters and exit */
265
0
        coef->MCU_vert_offset = yoffset;
266
0
        coef->MCU_ctr = MCU_col_num;
267
#ifdef WITH_PROFILE
268
        cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
269
        cinfo->master->entropy_mcoeffs +=
270
          (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
271
#endif
272
0
        return JPEG_SUSPENDED;
273
0
      }
274
#ifdef WITH_PROFILE
275
      cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
276
      cinfo->master->entropy_mcoeffs +=
277
        (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
278
#endif
279
10.4M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
397k
    coef->MCU_ctr = 0;
282
397k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
377k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
368k
    start_iMCU_row(cinfo);
286
368k
    return JPEG_ROW_COMPLETED;
287
368k
  }
288
  /* Completed the scan */
289
9.16k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
9.16k
  return JPEG_SCAN_COMPLETED;
291
377k
}
jdcoefct-8.c:consume_data
Line
Count
Source
218
374k
{
219
374k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
374k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
374k
  int blkn, ci, xindex, yindex, yoffset;
222
374k
  JDIMENSION start_col;
223
374k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
374k
  JBLOCKROW buffer_ptr;
225
374k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
1.21M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
835k
    compptr = cinfo->cur_comp_info[ci];
230
835k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
835k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
835k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
835k
       (JDIMENSION)compptr->v_samp_factor, TRUE);
234
    /* Note: entropy decoder expects buffer to be zeroed,
235
     * but this is handled automatically by the memory manager
236
     * because we requested a pre-zeroed array.
237
     */
238
835k
  }
239
240
  /* Loop to process one whole iMCU row */
241
770k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
395k
       yoffset++) {
243
9.76M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
9.36M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
9.36M
      blkn = 0;                 /* index of current DCT block within MCU */
247
27.5M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
18.1M
        compptr = cinfo->cur_comp_info[ci];
249
18.1M
        start_col = MCU_col_num * compptr->MCU_width;
250
36.9M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
18.7M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
38.4M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
19.6M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
19.6M
          }
255
18.7M
        }
256
18.1M
      }
257
9.36M
      if (!cinfo->entropy->insufficient_data)
258
9.36M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
259
      /* Try to fetch the MCU. */
260
#ifdef WITH_PROFILE
261
      cinfo->master->start = getTime();
262
#endif
263
9.36M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
264
        /* Suspension forced; update state counters and exit */
265
0
        coef->MCU_vert_offset = yoffset;
266
0
        coef->MCU_ctr = MCU_col_num;
267
#ifdef WITH_PROFILE
268
        cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
269
        cinfo->master->entropy_mcoeffs +=
270
          (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
271
#endif
272
0
        return JPEG_SUSPENDED;
273
0
      }
274
#ifdef WITH_PROFILE
275
      cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
276
      cinfo->master->entropy_mcoeffs +=
277
        (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
278
#endif
279
9.36M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
395k
    coef->MCU_ctr = 0;
282
395k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
374k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
366k
    start_iMCU_row(cinfo);
286
366k
    return JPEG_ROW_COMPLETED;
287
366k
  }
288
  /* Completed the scan */
289
8.47k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
8.47k
  return JPEG_SCAN_COMPLETED;
291
374k
}
jdcoefct-12.c:consume_data
Line
Count
Source
218
2.23k
{
219
2.23k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
2.23k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
2.23k
  int blkn, ci, xindex, yindex, yoffset;
222
2.23k
  JDIMENSION start_col;
223
2.23k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
2.23k
  JBLOCKROW buffer_ptr;
225
2.23k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
7.07k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
4.84k
    compptr = cinfo->cur_comp_info[ci];
230
4.84k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
4.84k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
4.84k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
4.84k
       (JDIMENSION)compptr->v_samp_factor, TRUE);
234
    /* Note: entropy decoder expects buffer to be zeroed,
235
     * but this is handled automatically by the memory manager
236
     * because we requested a pre-zeroed array.
237
     */
238
4.84k
  }
239
240
  /* Loop to process one whole iMCU row */
241
4.50k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
2.27k
       yoffset++) {
243
1.13M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
1.13M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
1.13M
      blkn = 0;                 /* index of current DCT block within MCU */
247
3.93M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
2.80M
        compptr = cinfo->cur_comp_info[ci];
249
2.80M
        start_col = MCU_col_num * compptr->MCU_width;
250
6.25M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
3.45M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
6.95M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
3.50M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
3.50M
          }
255
3.45M
        }
256
2.80M
      }
257
1.13M
      if (!cinfo->entropy->insufficient_data)
258
1.13M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
259
      /* Try to fetch the MCU. */
260
#ifdef WITH_PROFILE
261
      cinfo->master->start = getTime();
262
#endif
263
1.13M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
264
        /* Suspension forced; update state counters and exit */
265
0
        coef->MCU_vert_offset = yoffset;
266
0
        coef->MCU_ctr = MCU_col_num;
267
#ifdef WITH_PROFILE
268
        cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
269
        cinfo->master->entropy_mcoeffs +=
270
          (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
271
#endif
272
0
        return JPEG_SUSPENDED;
273
0
      }
274
#ifdef WITH_PROFILE
275
      cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
276
      cinfo->master->entropy_mcoeffs +=
277
        (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
278
#endif
279
1.13M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
2.27k
    coef->MCU_ctr = 0;
282
2.27k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
2.23k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
1.54k
    start_iMCU_row(cinfo);
286
1.54k
    return JPEG_ROW_COMPLETED;
287
1.54k
  }
288
  /* Completed the scan */
289
691
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
691
  return JPEG_SCAN_COMPLETED;
291
2.23k
}
292
293
294
/*
295
 * Decompress and return some data in the multi-pass case.
296
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
297
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
298
 *
299
 * NB: output_buf contains a plane for each component in image.
300
 */
301
302
METHODDEF(int)
303
decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
304
42.3k
{
305
42.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
42.3k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
42.3k
  JDIMENSION block_num;
308
42.3k
  int ci, block_row, block_rows;
309
42.3k
  JBLOCKARRAY buffer;
310
42.3k
  JBLOCKROW buffer_ptr;
311
42.3k
  _JSAMPARRAY output_ptr;
312
42.3k
  JDIMENSION output_col;
313
42.3k
  jpeg_component_info *compptr;
314
42.3k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
42.3k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
42.3k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
42.3k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
320
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
321
0
      return JPEG_SUSPENDED;
322
0
  }
323
324
  /* OK, output from the virtual arrays. */
325
169k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
127k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
127k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
127k
    buffer = (*cinfo->mem->access_virt_barray)
332
127k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
127k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
127k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
127k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
125k
      block_rows = compptr->v_samp_factor;
338
1.70k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.70k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.70k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.70k
    }
343
127k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
127k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
277k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
150k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
150k
      output_col = 0;
349
150k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
2.02M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
1.87M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.87M
                        output_col);
356
#ifdef WITH_PROFILE
357
        cinfo->master->idct_elapsed += getTime() - cinfo->master->start;
358
        cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
359
#endif
360
1.87M
        buffer_ptr++;
361
1.87M
        output_col += compptr->_DCT_scaled_size;
362
1.87M
      }
363
150k
      output_ptr += compptr->_DCT_scaled_size;
364
150k
    }
365
127k
  }
366
367
42.3k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
41.7k
    return JPEG_ROW_COMPLETED;
369
569
  return JPEG_SCAN_COMPLETED;
370
42.3k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
304
42.3k
{
305
42.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
42.3k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
42.3k
  JDIMENSION block_num;
308
42.3k
  int ci, block_row, block_rows;
309
42.3k
  JBLOCKARRAY buffer;
310
42.3k
  JBLOCKROW buffer_ptr;
311
42.3k
  _JSAMPARRAY output_ptr;
312
42.3k
  JDIMENSION output_col;
313
42.3k
  jpeg_component_info *compptr;
314
42.3k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
42.3k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
42.3k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
42.3k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
320
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
321
0
      return JPEG_SUSPENDED;
322
0
  }
323
324
  /* OK, output from the virtual arrays. */
325
169k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
127k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
127k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
127k
    buffer = (*cinfo->mem->access_virt_barray)
332
127k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
127k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
127k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
127k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
125k
      block_rows = compptr->v_samp_factor;
338
1.70k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.70k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.70k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.70k
    }
343
127k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
127k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
277k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
150k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
150k
      output_col = 0;
349
150k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
2.02M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
1.87M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.87M
                        output_col);
356
#ifdef WITH_PROFILE
357
        cinfo->master->idct_elapsed += getTime() - cinfo->master->start;
358
        cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
359
#endif
360
1.87M
        buffer_ptr++;
361
1.87M
        output_col += compptr->_DCT_scaled_size;
362
1.87M
      }
363
150k
      output_ptr += compptr->_DCT_scaled_size;
364
150k
    }
365
127k
  }
366
367
42.3k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
41.7k
    return JPEG_ROW_COMPLETED;
369
569
  return JPEG_SCAN_COMPLETED;
370
42.3k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_data
371
372
#endif /* D_MULTISCAN_FILES_SUPPORTED */
373
374
375
#ifdef BLOCK_SMOOTHING_SUPPORTED
376
377
/*
378
 * This code applies interblock smoothing; the first 9 AC coefficients are
379
 * estimated from the DC values of a DCT block and its 24 neighboring blocks.
380
 * We apply smoothing only for progressive JPEG decoding, and only if
381
 * the coefficients it can estimate are not yet known to full precision.
382
 */
383
384
/* Natural-order array positions of the first 9 zigzag-order coefficients */
385
420k
#define Q01_POS  1
386
420k
#define Q10_POS  8
387
420k
#define Q20_POS  16
388
420k
#define Q11_POS  9
389
420k
#define Q02_POS  2
390
368k
#define Q03_POS  3
391
368k
#define Q12_POS  10
392
368k
#define Q21_POS  17
393
368k
#define Q30_POS  24
394
395
/*
396
 * Determine whether block smoothing is applicable and safe.
397
 * We also latch the current states of the coef_bits[] entries for the
398
 * AC coefficients; otherwise, if the input side of the decompressor
399
 * advances into a new scan, we might think the coefficients are known
400
 * more accurately than they really are.
401
 */
402
403
LOCAL(boolean)
404
smoothing_ok(j_decompress_ptr cinfo)
405
1.86k
{
406
1.86k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.86k
  boolean smoothing_useful = FALSE;
408
1.86k
  int ci, coefi;
409
1.86k
  jpeg_component_info *compptr;
410
1.86k
  JQUANT_TBL *qtable;
411
1.86k
  int *coef_bits, *prev_coef_bits;
412
1.86k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.86k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
21
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.84k
  if (coef->coef_bits_latch == NULL)
419
1.84k
    coef->coef_bits_latch = (int *)
420
1.84k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.84k
                                  cinfo->num_components * 2 *
422
1.84k
                                  (SAVED_COEFS * sizeof(int)));
423
1.84k
  coef_bits_latch = coef->coef_bits_latch;
424
1.84k
  prev_coef_bits_latch =
425
1.84k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
6.72k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
5.12k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
5.12k
    if ((qtable = compptr->quant_table) == NULL)
431
4
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
5.12k
    if (qtable->quantval[0] == 0 ||
434
5.11k
        qtable->quantval[Q01_POS] == 0 ||
435
5.09k
        qtable->quantval[Q10_POS] == 0 ||
436
5.07k
        qtable->quantval[Q20_POS] == 0 ||
437
5.03k
        qtable->quantval[Q11_POS] == 0 ||
438
5.01k
        qtable->quantval[Q02_POS] == 0 ||
439
5.00k
        qtable->quantval[Q03_POS] == 0 ||
440
4.96k
        qtable->quantval[Q12_POS] == 0 ||
441
4.93k
        qtable->quantval[Q21_POS] == 0 ||
442
4.91k
        qtable->quantval[Q30_POS] == 0)
443
248
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
4.87k
    coef_bits = cinfo->coef_bits[ci];
446
4.87k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
4.87k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
4.87k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
48.7k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
43.8k
      if (cinfo->input_scan_number > 1)
453
35.7k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
8.10k
      else
455
8.10k
        prev_coef_bits_latch[coefi] = -1;
456
43.8k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
43.8k
      if (coef_bits[coefi] != 0)
458
31.9k
        smoothing_useful = TRUE;
459
43.8k
    }
460
4.87k
    coef_bits_latch += SAVED_COEFS;
461
4.87k
    prev_coef_bits_latch += SAVED_COEFS;
462
4.87k
  }
463
464
1.59k
  return smoothing_useful;
465
1.84k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
405
1.73k
{
406
1.73k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.73k
  boolean smoothing_useful = FALSE;
408
1.73k
  int ci, coefi;
409
1.73k
  jpeg_component_info *compptr;
410
1.73k
  JQUANT_TBL *qtable;
411
1.73k
  int *coef_bits, *prev_coef_bits;
412
1.73k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.73k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
3
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.72k
  if (coef->coef_bits_latch == NULL)
419
1.72k
    coef->coef_bits_latch = (int *)
420
1.72k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.72k
                                  cinfo->num_components * 2 *
422
1.72k
                                  (SAVED_COEFS * sizeof(int)));
423
1.72k
  coef_bits_latch = coef->coef_bits_latch;
424
1.72k
  prev_coef_bits_latch =
425
1.72k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
6.48k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
4.92k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
4.92k
    if ((qtable = compptr->quant_table) == NULL)
431
4
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
4.91k
    if (qtable->quantval[0] == 0 ||
434
4.91k
        qtable->quantval[Q01_POS] == 0 ||
435
4.89k
        qtable->quantval[Q10_POS] == 0 ||
436
4.88k
        qtable->quantval[Q20_POS] == 0 ||
437
4.85k
        qtable->quantval[Q11_POS] == 0 ||
438
4.84k
        qtable->quantval[Q02_POS] == 0 ||
439
4.83k
        qtable->quantval[Q03_POS] == 0 ||
440
4.80k
        qtable->quantval[Q12_POS] == 0 ||
441
4.79k
        qtable->quantval[Q21_POS] == 0 ||
442
4.77k
        qtable->quantval[Q30_POS] == 0)
443
158
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
4.75k
    coef_bits = cinfo->coef_bits[ci];
446
4.75k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
4.75k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
4.75k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
47.5k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
42.8k
      if (cinfo->input_scan_number > 1)
453
35.3k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
7.49k
      else
455
7.49k
        prev_coef_bits_latch[coefi] = -1;
456
42.8k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
42.8k
      if (coef_bits[coefi] != 0)
458
31.0k
        smoothing_useful = TRUE;
459
42.8k
    }
460
4.75k
    coef_bits_latch += SAVED_COEFS;
461
4.75k
    prev_coef_bits_latch += SAVED_COEFS;
462
4.75k
  }
463
464
1.56k
  return smoothing_useful;
465
1.72k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
405
137
{
406
137
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
137
  boolean smoothing_useful = FALSE;
408
137
  int ci, coefi;
409
137
  jpeg_component_info *compptr;
410
137
  JQUANT_TBL *qtable;
411
137
  int *coef_bits, *prev_coef_bits;
412
137
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
137
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
18
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
119
  if (coef->coef_bits_latch == NULL)
419
119
    coef->coef_bits_latch = (int *)
420
119
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
119
                                  cinfo->num_components * 2 *
422
119
                                  (SAVED_COEFS * sizeof(int)));
423
119
  coef_bits_latch = coef->coef_bits_latch;
424
119
  prev_coef_bits_latch =
425
119
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
238
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
209
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
209
    if ((qtable = compptr->quant_table) == NULL)
431
0
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
209
    if (qtable->quantval[0] == 0 ||
434
202
        qtable->quantval[Q01_POS] == 0 ||
435
196
        qtable->quantval[Q10_POS] == 0 ||
436
192
        qtable->quantval[Q20_POS] == 0 ||
437
183
        qtable->quantval[Q11_POS] == 0 ||
438
176
        qtable->quantval[Q02_POS] == 0 ||
439
170
        qtable->quantval[Q03_POS] == 0 ||
440
157
        qtable->quantval[Q12_POS] == 0 ||
441
143
        qtable->quantval[Q21_POS] == 0 ||
442
137
        qtable->quantval[Q30_POS] == 0)
443
90
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
119
    coef_bits = cinfo->coef_bits[ci];
446
119
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
119
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
119
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
1.19k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
1.07k
      if (cinfo->input_scan_number > 1)
453
459
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
612
      else
455
612
        prev_coef_bits_latch[coefi] = -1;
456
1.07k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
1.07k
      if (coef_bits[coefi] != 0)
458
931
        smoothing_useful = TRUE;
459
1.07k
    }
460
119
    coef_bits_latch += SAVED_COEFS;
461
119
    prev_coef_bits_latch += SAVED_COEFS;
462
119
  }
463
464
29
  return smoothing_useful;
465
119
}
466
467
468
/*
469
 * Variant of decompress_data for use when doing block smoothing.
470
 */
471
472
METHODDEF(int)
473
decompress_smooth_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
474
138k
{
475
138k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
138k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
138k
  JDIMENSION block_num, last_block_column;
478
138k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
138k
    image_block_rows;
480
138k
  JBLOCKARRAY buffer;
481
138k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
138k
  JBLOCKROW next_block_row, next_next_block_row;
483
138k
  _JSAMPARRAY output_ptr;
484
138k
  JDIMENSION output_col;
485
138k
  jpeg_component_info *compptr;
486
138k
  _inverse_DCT_method_ptr inverse_DCT;
487
138k
  boolean change_dc;
488
138k
  JCOEF *workspace;
489
138k
  int *coef_bits;
490
138k
  JQUANT_TBL *quanttbl;
491
138k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
138k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
138k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
138k
      DC25;
495
138k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
138k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
138k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
138k
         !cinfo->inputctl->eoi_reached) {
503
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
504
      /* If input is working on current scan, we ordinarily want it to
505
       * have completed the current row.  But if input scan is DC,
506
       * we want it to keep two rows ahead so that next two block rows' DC
507
       * values are up to date.
508
       */
509
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
510
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
511
0
        break;
512
0
    }
513
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
514
0
      return JPEG_SUSPENDED;
515
0
  }
516
517
  /* OK, output from the virtual arrays. */
518
554k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
415k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
415k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
415k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
409k
      block_rows = compptr->v_samp_factor;
526
409k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
409k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
2.51k
      block_rows = compptr->v_samp_factor;
529
2.51k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
3.47k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
3.47k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
3.47k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
3.47k
      access_rows = block_rows; /* this iMCU row only */
535
3.47k
    }
536
    /* Align the virtual buffer for this component. */
537
415k
    if (cinfo->output_iMCU_row > 1) {
538
409k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
409k
      buffer = (*cinfo->mem->access_virt_barray)
540
409k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
409k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
409k
         (JDIMENSION)access_rows, FALSE);
543
409k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
409k
    } else if (cinfo->output_iMCU_row > 0) {
545
2.51k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
2.51k
      buffer = (*cinfo->mem->access_virt_barray)
547
2.51k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
2.51k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
2.51k
         (JDIMENSION)access_rows, FALSE);
550
2.51k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
3.47k
    } else {
552
3.47k
      buffer = (*cinfo->mem->access_virt_barray)
553
3.47k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
3.47k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
3.47k
    }
556
    /* Fetch component-dependent info.
557
     * If the current scan is incomplete, then we use the component-dependent
558
     * info from the previous scan.
559
     */
560
415k
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
561
0
      coef_bits =
562
0
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
563
415k
    else
564
415k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
415k
    change_dc =
568
415k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
366k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
364k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
415k
    quanttbl = compptr->quant_table;
573
415k
    Q00 = quanttbl->quantval[0];
574
415k
    Q01 = quanttbl->quantval[Q01_POS];
575
415k
    Q10 = quanttbl->quantval[Q10_POS];
576
415k
    Q20 = quanttbl->quantval[Q20_POS];
577
415k
    Q11 = quanttbl->quantval[Q11_POS];
578
415k
    Q02 = quanttbl->quantval[Q02_POS];
579
415k
    if (change_dc) {
580
363k
      Q03 = quanttbl->quantval[Q03_POS];
581
363k
      Q12 = quanttbl->quantval[Q12_POS];
582
363k
      Q21 = quanttbl->quantval[Q21_POS];
583
363k
      Q30 = quanttbl->quantval[Q30_POS];
584
363k
    }
585
415k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
415k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
415k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
839k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
423k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
423k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
423k
      if (image_block_row > 0)
594
420k
        prev_block_row =
595
420k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
3.47k
      else
597
3.47k
        prev_block_row = buffer_ptr;
598
599
423k
      if (image_block_row > 1)
600
417k
        prev_prev_block_row =
601
417k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
6.02k
      else
603
6.02k
        prev_prev_block_row = prev_block_row;
604
605
423k
      if (image_block_row < image_block_rows - 1)
606
420k
        next_block_row =
607
420k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
3.47k
      else
609
3.47k
        next_block_row = buffer_ptr;
610
611
423k
      if (image_block_row < image_block_rows - 2)
612
418k
        next_next_block_row =
613
418k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
5.95k
      else
615
5.95k
        next_next_block_row = next_block_row;
616
617
      /* We fetch the surrounding DC values using a sliding-register approach.
618
       * Initialize all 25 here so as to do the right thing on narrow pics.
619
       */
620
423k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
423k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
423k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
423k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
423k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
423k
      output_col = 0;
626
423k
      last_block_column = compptr->width_in_blocks - 1;
627
423k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
9.07M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
8.65M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
8.65M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
423k
            block_num < last_block_column) {
634
188k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
188k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
188k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
188k
          DC19 = DC20 = (int)next_block_row[1][0];
638
188k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
188k
        }
640
8.65M
        if (block_num + 1 < last_block_column) {
641
8.03M
          DC05 = (int)prev_prev_block_row[2][0];
642
8.03M
          DC10 = (int)prev_block_row[2][0];
643
8.03M
          DC15 = (int)buffer_ptr[2][0];
644
8.03M
          DC20 = (int)next_block_row[2][0];
645
8.03M
          DC25 = (int)next_next_block_row[2][0];
646
8.03M
        }
647
        /* If DC interpolation is enabled, compute coefficient estimates using
648
         * a Gaussian-like kernel, keeping the averages of the DC values.
649
         *
650
         * If DC interpolation is disabled, compute coefficient estimates using
651
         * an algorithm similar to the one described in Section K.8 of the JPEG
652
         * standard, except applied to a 5x5 window rather than a 3x3 window.
653
         *
654
         * An estimate is applied only if the coefficient is still zero and is
655
         * not known to be fully accurate.
656
         */
657
        /* AC01 */
658
8.65M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
7.89M
          num = Q00 * (change_dc ?
660
6.69M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
6.69M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
6.69M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
6.69M
                 DC21 - DC22 + DC24 + DC25) :
664
7.89M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
7.89M
          if (num >= 0) {
666
4.31M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
4.31M
            if (Al > 0 && pred >= (1 << Al))
668
32.5k
              pred = (1 << Al) - 1;
669
4.31M
          } else {
670
3.57M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
3.57M
            if (Al > 0 && pred >= (1 << Al))
672
59.3k
              pred = (1 << Al) - 1;
673
3.57M
            pred = -pred;
674
3.57M
          }
675
7.89M
          workspace[1] = (JCOEF)pred;
676
7.89M
        }
677
        /* AC10 */
678
8.65M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
7.96M
          num = Q00 * (change_dc ?
680
6.69M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
6.69M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
6.69M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
6.69M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
7.96M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
7.96M
          if (num >= 0) {
686
6.35M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
6.35M
            if (Al > 0 && pred >= (1 << Al))
688
107k
              pred = (1 << Al) - 1;
689
6.35M
          } else {
690
1.60M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
1.60M
            if (Al > 0 && pred >= (1 << Al))
692
340k
              pred = (1 << Al) - 1;
693
1.60M
            pred = -pred;
694
1.60M
          }
695
7.96M
          workspace[8] = (JCOEF)pred;
696
7.96M
        }
697
        /* AC20 */
698
8.65M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
7.85M
          num = Q00 * (change_dc ?
700
6.69M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
6.69M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
7.85M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
7.85M
          if (num >= 0) {
704
5.48M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
5.48M
            if (Al > 0 && pred >= (1 << Al))
706
26.0k
              pred = (1 << Al) - 1;
707
5.48M
          } else {
708
2.36M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
2.36M
            if (Al > 0 && pred >= (1 << Al))
710
25.5k
              pred = (1 << Al) - 1;
711
2.36M
            pred = -pred;
712
2.36M
          }
713
7.85M
          workspace[16] = (JCOEF)pred;
714
7.85M
        }
715
        /* AC11 */
716
8.65M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
8.04M
          num = Q00 * (change_dc ?
718
6.69M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
6.69M
                 9 * DC19 + DC21 - DC25) :
720
8.04M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
1.34M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
8.04M
          if (num >= 0) {
723
6.99M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
6.99M
            if (Al > 0 && pred >= (1 << Al))
725
9.20k
              pred = (1 << Al) - 1;
726
6.99M
          } else {
727
1.04M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
1.04M
            if (Al > 0 && pred >= (1 << Al))
729
9.01k
              pred = (1 << Al) - 1;
730
1.04M
            pred = -pred;
731
1.04M
          }
732
8.04M
          workspace[9] = (JCOEF)pred;
733
8.04M
        }
734
        /* AC02 */
735
8.65M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
8.03M
          num = Q00 * (change_dc ?
737
6.69M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
6.69M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
8.03M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
8.03M
          if (num >= 0) {
741
5.36M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
5.36M
            if (Al > 0 && pred >= (1 << Al))
743
6.63k
              pred = (1 << Al) - 1;
744
5.36M
          } else {
745
2.67M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
2.67M
            if (Al > 0 && pred >= (1 << Al))
747
7.29k
              pred = (1 << Al) - 1;
748
2.67M
            pred = -pred;
749
2.67M
          }
750
8.03M
          workspace[2] = (JCOEF)pred;
751
8.03M
        }
752
8.65M
        if (change_dc) {
753
          /* AC03 */
754
6.69M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
6.69M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
6.69M
            if (num >= 0) {
757
3.82M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
3.82M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
3.82M
            } else {
761
2.86M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
2.86M
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
2.86M
              pred = -pred;
765
2.86M
            }
766
6.69M
            workspace[3] = (JCOEF)pred;
767
6.69M
          }
768
          /* AC12 */
769
6.69M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
6.69M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
6.69M
            if (num >= 0) {
772
5.86M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
5.86M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
5.86M
            } else {
776
837k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
837k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
837k
              pred = -pred;
780
837k
            }
781
6.69M
            workspace[10] = (JCOEF)pred;
782
6.69M
          }
783
          /* AC21 */
784
6.69M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
6.69M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
6.69M
            if (num >= 0) {
787
4.75M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
4.75M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
4.75M
            } else {
791
1.94M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
1.94M
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
1.94M
              pred = -pred;
795
1.94M
            }
796
6.69M
            workspace[17] = (JCOEF)pred;
797
6.69M
          }
798
          /* AC30 */
799
6.69M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
6.69M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
6.69M
            if (num >= 0) {
802
5.53M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
5.53M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
5.53M
            } else {
806
1.16M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
1.16M
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
1.16M
              pred = -pred;
810
1.16M
            }
811
6.69M
            workspace[24] = (JCOEF)pred;
812
6.69M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
6.69M
          num = Q00 *
817
6.69M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
6.69M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
6.69M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
6.69M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
6.69M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
6.69M
          if (num >= 0) {
823
3.79M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
3.79M
          } else {
825
2.90M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
2.90M
            pred = -pred;
827
2.90M
          }
828
6.69M
          workspace[0] = (JCOEF)pred;
829
6.69M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
8.65M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
8.65M
                        output_col);
837
#ifdef WITH_PROFILE
838
        cinfo->master->idct_elapsed += getTime() - cinfo->master->start;
839
        cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
840
#endif
841
        /* Advance for next column */
842
8.65M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
8.65M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
8.65M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
8.65M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
8.65M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
8.65M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
8.65M
          prev_prev_block_row++, next_next_block_row++;
849
8.65M
        output_col += compptr->_DCT_scaled_size;
850
8.65M
      }
851
423k
      output_ptr += compptr->_DCT_scaled_size;
852
423k
    }
853
415k
  }
854
855
138k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
137k
    return JPEG_ROW_COMPLETED;
857
1.16k
  return JPEG_SCAN_COMPLETED;
858
138k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
474
138k
{
475
138k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
138k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
138k
  JDIMENSION block_num, last_block_column;
478
138k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
138k
    image_block_rows;
480
138k
  JBLOCKARRAY buffer;
481
138k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
138k
  JBLOCKROW next_block_row, next_next_block_row;
483
138k
  _JSAMPARRAY output_ptr;
484
138k
  JDIMENSION output_col;
485
138k
  jpeg_component_info *compptr;
486
138k
  _inverse_DCT_method_ptr inverse_DCT;
487
138k
  boolean change_dc;
488
138k
  JCOEF *workspace;
489
138k
  int *coef_bits;
490
138k
  JQUANT_TBL *quanttbl;
491
138k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
138k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
138k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
138k
      DC25;
495
138k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
138k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
138k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
138k
         !cinfo->inputctl->eoi_reached) {
503
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
504
      /* If input is working on current scan, we ordinarily want it to
505
       * have completed the current row.  But if input scan is DC,
506
       * we want it to keep two rows ahead so that next two block rows' DC
507
       * values are up to date.
508
       */
509
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
510
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
511
0
        break;
512
0
    }
513
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
514
0
      return JPEG_SUSPENDED;
515
0
  }
516
517
  /* OK, output from the virtual arrays. */
518
554k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
415k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
415k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
415k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
409k
      block_rows = compptr->v_samp_factor;
526
409k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
409k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
2.51k
      block_rows = compptr->v_samp_factor;
529
2.51k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
3.47k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
3.47k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
3.47k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
3.47k
      access_rows = block_rows; /* this iMCU row only */
535
3.47k
    }
536
    /* Align the virtual buffer for this component. */
537
415k
    if (cinfo->output_iMCU_row > 1) {
538
409k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
409k
      buffer = (*cinfo->mem->access_virt_barray)
540
409k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
409k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
409k
         (JDIMENSION)access_rows, FALSE);
543
409k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
409k
    } else if (cinfo->output_iMCU_row > 0) {
545
2.51k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
2.51k
      buffer = (*cinfo->mem->access_virt_barray)
547
2.51k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
2.51k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
2.51k
         (JDIMENSION)access_rows, FALSE);
550
2.51k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
3.47k
    } else {
552
3.47k
      buffer = (*cinfo->mem->access_virt_barray)
553
3.47k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
3.47k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
3.47k
    }
556
    /* Fetch component-dependent info.
557
     * If the current scan is incomplete, then we use the component-dependent
558
     * info from the previous scan.
559
     */
560
415k
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
561
0
      coef_bits =
562
0
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
563
415k
    else
564
415k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
415k
    change_dc =
568
415k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
366k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
364k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
415k
    quanttbl = compptr->quant_table;
573
415k
    Q00 = quanttbl->quantval[0];
574
415k
    Q01 = quanttbl->quantval[Q01_POS];
575
415k
    Q10 = quanttbl->quantval[Q10_POS];
576
415k
    Q20 = quanttbl->quantval[Q20_POS];
577
415k
    Q11 = quanttbl->quantval[Q11_POS];
578
415k
    Q02 = quanttbl->quantval[Q02_POS];
579
415k
    if (change_dc) {
580
363k
      Q03 = quanttbl->quantval[Q03_POS];
581
363k
      Q12 = quanttbl->quantval[Q12_POS];
582
363k
      Q21 = quanttbl->quantval[Q21_POS];
583
363k
      Q30 = quanttbl->quantval[Q30_POS];
584
363k
    }
585
415k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
415k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
415k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
839k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
423k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
423k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
423k
      if (image_block_row > 0)
594
420k
        prev_block_row =
595
420k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
3.47k
      else
597
3.47k
        prev_block_row = buffer_ptr;
598
599
423k
      if (image_block_row > 1)
600
417k
        prev_prev_block_row =
601
417k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
6.02k
      else
603
6.02k
        prev_prev_block_row = prev_block_row;
604
605
423k
      if (image_block_row < image_block_rows - 1)
606
420k
        next_block_row =
607
420k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
3.47k
      else
609
3.47k
        next_block_row = buffer_ptr;
610
611
423k
      if (image_block_row < image_block_rows - 2)
612
418k
        next_next_block_row =
613
418k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
5.95k
      else
615
5.95k
        next_next_block_row = next_block_row;
616
617
      /* We fetch the surrounding DC values using a sliding-register approach.
618
       * Initialize all 25 here so as to do the right thing on narrow pics.
619
       */
620
423k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
423k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
423k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
423k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
423k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
423k
      output_col = 0;
626
423k
      last_block_column = compptr->width_in_blocks - 1;
627
423k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
9.07M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
8.65M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
8.65M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
423k
            block_num < last_block_column) {
634
188k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
188k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
188k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
188k
          DC19 = DC20 = (int)next_block_row[1][0];
638
188k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
188k
        }
640
8.65M
        if (block_num + 1 < last_block_column) {
641
8.03M
          DC05 = (int)prev_prev_block_row[2][0];
642
8.03M
          DC10 = (int)prev_block_row[2][0];
643
8.03M
          DC15 = (int)buffer_ptr[2][0];
644
8.03M
          DC20 = (int)next_block_row[2][0];
645
8.03M
          DC25 = (int)next_next_block_row[2][0];
646
8.03M
        }
647
        /* If DC interpolation is enabled, compute coefficient estimates using
648
         * a Gaussian-like kernel, keeping the averages of the DC values.
649
         *
650
         * If DC interpolation is disabled, compute coefficient estimates using
651
         * an algorithm similar to the one described in Section K.8 of the JPEG
652
         * standard, except applied to a 5x5 window rather than a 3x3 window.
653
         *
654
         * An estimate is applied only if the coefficient is still zero and is
655
         * not known to be fully accurate.
656
         */
657
        /* AC01 */
658
8.65M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
7.89M
          num = Q00 * (change_dc ?
660
6.69M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
6.69M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
6.69M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
6.69M
                 DC21 - DC22 + DC24 + DC25) :
664
7.89M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
7.89M
          if (num >= 0) {
666
4.31M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
4.31M
            if (Al > 0 && pred >= (1 << Al))
668
32.5k
              pred = (1 << Al) - 1;
669
4.31M
          } else {
670
3.57M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
3.57M
            if (Al > 0 && pred >= (1 << Al))
672
59.3k
              pred = (1 << Al) - 1;
673
3.57M
            pred = -pred;
674
3.57M
          }
675
7.89M
          workspace[1] = (JCOEF)pred;
676
7.89M
        }
677
        /* AC10 */
678
8.65M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
7.96M
          num = Q00 * (change_dc ?
680
6.69M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
6.69M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
6.69M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
6.69M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
7.96M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
7.96M
          if (num >= 0) {
686
6.35M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
6.35M
            if (Al > 0 && pred >= (1 << Al))
688
107k
              pred = (1 << Al) - 1;
689
6.35M
          } else {
690
1.60M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
1.60M
            if (Al > 0 && pred >= (1 << Al))
692
340k
              pred = (1 << Al) - 1;
693
1.60M
            pred = -pred;
694
1.60M
          }
695
7.96M
          workspace[8] = (JCOEF)pred;
696
7.96M
        }
697
        /* AC20 */
698
8.65M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
7.85M
          num = Q00 * (change_dc ?
700
6.69M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
6.69M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
7.85M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
7.85M
          if (num >= 0) {
704
5.48M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
5.48M
            if (Al > 0 && pred >= (1 << Al))
706
26.0k
              pred = (1 << Al) - 1;
707
5.48M
          } else {
708
2.36M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
2.36M
            if (Al > 0 && pred >= (1 << Al))
710
25.5k
              pred = (1 << Al) - 1;
711
2.36M
            pred = -pred;
712
2.36M
          }
713
7.85M
          workspace[16] = (JCOEF)pred;
714
7.85M
        }
715
        /* AC11 */
716
8.65M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
8.04M
          num = Q00 * (change_dc ?
718
6.69M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
6.69M
                 9 * DC19 + DC21 - DC25) :
720
8.04M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
1.34M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
8.04M
          if (num >= 0) {
723
6.99M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
6.99M
            if (Al > 0 && pred >= (1 << Al))
725
9.20k
              pred = (1 << Al) - 1;
726
6.99M
          } else {
727
1.04M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
1.04M
            if (Al > 0 && pred >= (1 << Al))
729
9.01k
              pred = (1 << Al) - 1;
730
1.04M
            pred = -pred;
731
1.04M
          }
732
8.04M
          workspace[9] = (JCOEF)pred;
733
8.04M
        }
734
        /* AC02 */
735
8.65M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
8.03M
          num = Q00 * (change_dc ?
737
6.69M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
6.69M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
8.03M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
8.03M
          if (num >= 0) {
741
5.36M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
5.36M
            if (Al > 0 && pred >= (1 << Al))
743
6.63k
              pred = (1 << Al) - 1;
744
5.36M
          } else {
745
2.67M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
2.67M
            if (Al > 0 && pred >= (1 << Al))
747
7.29k
              pred = (1 << Al) - 1;
748
2.67M
            pred = -pred;
749
2.67M
          }
750
8.03M
          workspace[2] = (JCOEF)pred;
751
8.03M
        }
752
8.65M
        if (change_dc) {
753
          /* AC03 */
754
6.69M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
6.69M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
6.69M
            if (num >= 0) {
757
3.82M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
3.82M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
3.82M
            } else {
761
2.86M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
2.86M
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
2.86M
              pred = -pred;
765
2.86M
            }
766
6.69M
            workspace[3] = (JCOEF)pred;
767
6.69M
          }
768
          /* AC12 */
769
6.69M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
6.69M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
6.69M
            if (num >= 0) {
772
5.86M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
5.86M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
5.86M
            } else {
776
837k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
837k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
837k
              pred = -pred;
780
837k
            }
781
6.69M
            workspace[10] = (JCOEF)pred;
782
6.69M
          }
783
          /* AC21 */
784
6.69M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
6.69M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
6.69M
            if (num >= 0) {
787
4.75M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
4.75M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
4.75M
            } else {
791
1.94M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
1.94M
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
1.94M
              pred = -pred;
795
1.94M
            }
796
6.69M
            workspace[17] = (JCOEF)pred;
797
6.69M
          }
798
          /* AC30 */
799
6.69M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
6.69M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
6.69M
            if (num >= 0) {
802
5.53M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
5.53M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
5.53M
            } else {
806
1.16M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
1.16M
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
1.16M
              pred = -pred;
810
1.16M
            }
811
6.69M
            workspace[24] = (JCOEF)pred;
812
6.69M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
6.69M
          num = Q00 *
817
6.69M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
6.69M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
6.69M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
6.69M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
6.69M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
6.69M
          if (num >= 0) {
823
3.79M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
3.79M
          } else {
825
2.90M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
2.90M
            pred = -pred;
827
2.90M
          }
828
6.69M
          workspace[0] = (JCOEF)pred;
829
6.69M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
8.65M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
8.65M
                        output_col);
837
#ifdef WITH_PROFILE
838
        cinfo->master->idct_elapsed += getTime() - cinfo->master->start;
839
        cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
840
#endif
841
        /* Advance for next column */
842
8.65M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
8.65M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
8.65M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
8.65M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
8.65M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
8.65M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
8.65M
          prev_prev_block_row++, next_next_block_row++;
849
8.65M
        output_col += compptr->_DCT_scaled_size;
850
8.65M
      }
851
423k
      output_ptr += compptr->_DCT_scaled_size;
852
423k
    }
853
415k
  }
854
855
138k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
137k
    return JPEG_ROW_COMPLETED;
857
1.16k
  return JPEG_SCAN_COMPLETED;
858
138k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_smooth_data
859
860
#endif /* BLOCK_SMOOTHING_SUPPORTED */
861
862
863
/*
864
 * Initialize coefficient buffer controller.
865
 */
866
867
GLOBAL(void)
868
_jinit_d_coef_controller(j_decompress_ptr cinfo, boolean need_full_buffer)
869
4.10k
{
870
4.10k
  my_coef_ptr coef;
871
872
4.10k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
4.10k
  coef = (my_coef_ptr)
876
4.10k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
4.10k
                                sizeof(my_coef_controller));
878
4.10k
  memset(coef, 0, sizeof(my_coef_controller));
879
4.10k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
4.10k
  coef->pub.start_input_pass = start_input_pass;
881
4.10k
  coef->pub.start_output_pass = start_output_pass;
882
4.10k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
4.10k
  coef->coef_bits_latch = NULL;
884
4.10k
#endif
885
886
  /* Create the coefficient buffer. */
887
4.10k
  if (need_full_buffer) {
888
2.63k
#ifdef D_MULTISCAN_FILES_SUPPORTED
889
    /* Allocate a full-image virtual array for each component, */
890
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
891
    /* Note we ask for a pre-zeroed array. */
892
2.63k
    int ci, access_rows;
893
2.63k
    jpeg_component_info *compptr;
894
895
10.5k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
7.87k
         ci++, compptr++) {
897
7.87k
      access_rows = compptr->v_samp_factor;
898
7.87k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
7.87k
      if (cinfo->progressive_mode)
901
7.72k
        access_rows *= 5;
902
7.87k
#endif
903
7.87k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
7.87k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
7.87k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
7.87k
                               (long)compptr->h_samp_factor),
907
7.87k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
7.87k
                               (long)compptr->v_samp_factor),
909
7.87k
         (JDIMENSION)access_rows);
910
7.87k
    }
911
2.63k
    coef->pub.consume_data = consume_data;
912
2.63k
    coef->pub._decompress_data = decompress_data;
913
2.63k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.63k
  } else {
918
    /* We only need a single-MCU buffer. */
919
1.47k
    JBLOCKROW buffer;
920
1.47k
    int i;
921
922
1.47k
    buffer = (JBLOCKROW)
923
1.47k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
1.47k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
16.2k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
14.7k
      coef->MCU_buffer[i] = buffer + i;
927
14.7k
    }
928
1.47k
    coef->pub.consume_data = dummy_consume_data;
929
1.47k
    coef->pub._decompress_data = decompress_onepass;
930
1.47k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
1.47k
  }
932
933
  /* Allocate the workspace buffer */
934
4.10k
  coef->workspace = (JCOEF *)
935
4.10k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
4.10k
                                sizeof(JCOEF) * DCTSIZE2);
937
4.10k
}
jinit_d_coef_controller
Line
Count
Source
869
3.75k
{
870
3.75k
  my_coef_ptr coef;
871
872
3.75k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
3.75k
  coef = (my_coef_ptr)
876
3.75k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
3.75k
                                sizeof(my_coef_controller));
878
3.75k
  memset(coef, 0, sizeof(my_coef_controller));
879
3.75k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
3.75k
  coef->pub.start_input_pass = start_input_pass;
881
3.75k
  coef->pub.start_output_pass = start_output_pass;
882
3.75k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
3.75k
  coef->coef_bits_latch = NULL;
884
3.75k
#endif
885
886
  /* Create the coefficient buffer. */
887
3.75k
  if (need_full_buffer) {
888
2.30k
#ifdef D_MULTISCAN_FILES_SUPPORTED
889
    /* Allocate a full-image virtual array for each component, */
890
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
891
    /* Note we ask for a pre-zeroed array. */
892
2.30k
    int ci, access_rows;
893
2.30k
    jpeg_component_info *compptr;
894
895
9.18k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
6.88k
         ci++, compptr++) {
897
6.88k
      access_rows = compptr->v_samp_factor;
898
6.88k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
6.88k
      if (cinfo->progressive_mode)
901
6.85k
        access_rows *= 5;
902
6.88k
#endif
903
6.88k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
6.88k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
6.88k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
6.88k
                               (long)compptr->h_samp_factor),
907
6.88k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
6.88k
                               (long)compptr->v_samp_factor),
909
6.88k
         (JDIMENSION)access_rows);
910
6.88k
    }
911
2.30k
    coef->pub.consume_data = consume_data;
912
2.30k
    coef->pub._decompress_data = decompress_data;
913
2.30k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.30k
  } else {
918
    /* We only need a single-MCU buffer. */
919
1.45k
    JBLOCKROW buffer;
920
1.45k
    int i;
921
922
1.45k
    buffer = (JBLOCKROW)
923
1.45k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
1.45k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
16.0k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
14.5k
      coef->MCU_buffer[i] = buffer + i;
927
14.5k
    }
928
1.45k
    coef->pub.consume_data = dummy_consume_data;
929
1.45k
    coef->pub._decompress_data = decompress_onepass;
930
1.45k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
1.45k
  }
932
933
  /* Allocate the workspace buffer */
934
3.75k
  coef->workspace = (JCOEF *)
935
3.75k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
3.75k
                                sizeof(JCOEF) * DCTSIZE2);
937
3.75k
}
j12init_d_coef_controller
Line
Count
Source
869
351
{
870
351
  my_coef_ptr coef;
871
872
351
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
351
  coef = (my_coef_ptr)
876
351
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
351
                                sizeof(my_coef_controller));
878
351
  memset(coef, 0, sizeof(my_coef_controller));
879
351
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
351
  coef->pub.start_input_pass = start_input_pass;
881
351
  coef->pub.start_output_pass = start_output_pass;
882
351
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
351
  coef->coef_bits_latch = NULL;
884
351
#endif
885
886
  /* Create the coefficient buffer. */
887
351
  if (need_full_buffer) {
888
329
#ifdef D_MULTISCAN_FILES_SUPPORTED
889
    /* Allocate a full-image virtual array for each component, */
890
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
891
    /* Note we ask for a pre-zeroed array. */
892
329
    int ci, access_rows;
893
329
    jpeg_component_info *compptr;
894
895
1.32k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
995
         ci++, compptr++) {
897
995
      access_rows = compptr->v_samp_factor;
898
995
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
995
      if (cinfo->progressive_mode)
901
875
        access_rows *= 5;
902
995
#endif
903
995
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
995
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
995
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
995
                               (long)compptr->h_samp_factor),
907
995
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
995
                               (long)compptr->v_samp_factor),
909
995
         (JDIMENSION)access_rows);
910
995
    }
911
329
    coef->pub.consume_data = consume_data;
912
329
    coef->pub._decompress_data = decompress_data;
913
329
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
329
  } else {
918
    /* We only need a single-MCU buffer. */
919
22
    JBLOCKROW buffer;
920
22
    int i;
921
922
22
    buffer = (JBLOCKROW)
923
22
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
22
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
242
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
220
      coef->MCU_buffer[i] = buffer + i;
927
220
    }
928
22
    coef->pub.consume_data = dummy_consume_data;
929
22
    coef->pub._decompress_data = decompress_onepass;
930
22
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
22
  }
932
933
  /* Allocate the workspace buffer */
934
351
  coef->workspace = (JCOEF *)
935
351
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
351
                                sizeof(JCOEF) * DCTSIZE2);
937
351
}