Coverage Report

Created: 2026-06-09 07:01

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.87k
{
51
9.87k
  cinfo->input_iMCU_row = 0;
52
9.87k
  start_iMCU_row(cinfo);
53
9.87k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
50
719
{
51
719
  cinfo->input_iMCU_row = 0;
52
719
  start_iMCU_row(cinfo);
53
719
}
54
55
56
/*
57
 * Initialize for an output processing pass.
58
 */
59
60
METHODDEF(void)
61
start_output_pass(j_decompress_ptr cinfo)
62
2.99k
{
63
2.99k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
2.99k
  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
2.99k
  if (coef->pub.coef_arrays != NULL) {
68
1.44k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
757
      coef->pub._decompress_data = decompress_smooth_data;
70
683
    else
71
683
      coef->pub._decompress_data = decompress_data;
72
1.44k
  }
73
2.99k
#endif
74
2.99k
  cinfo->output_iMCU_row = 0;
75
2.99k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
62
2.81k
{
63
2.81k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
2.81k
  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
2.81k
  if (coef->pub.coef_arrays != NULL) {
68
1.26k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
686
      coef->pub._decompress_data = decompress_smooth_data;
70
576
    else
71
576
      coef->pub._decompress_data = decompress_data;
72
1.26k
  }
73
2.81k
#endif
74
2.81k
  cinfo->output_iMCU_row = 0;
75
2.81k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
62
183
{
63
183
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
183
  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
183
  if (coef->pub.coef_arrays != NULL) {
68
178
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
71
      coef->pub._decompress_data = decompress_smooth_data;
70
107
    else
71
107
      coef->pub._decompress_data = decompress_data;
72
178
  }
73
183
#endif
74
183
  cinfo->output_iMCU_row = 0;
75
183
}
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
34.8k
{
91
34.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
34.8k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
34.8k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
34.8k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
34.8k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
34.8k
  _JSAMPARRAY output_ptr;
97
34.8k
  JDIMENSION start_col, output_col;
98
34.8k
  jpeg_component_info *compptr;
99
34.8k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
71.2k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
36.4k
       yoffset++) {
104
1.09M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
1.05M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
1.05M
      jzero_far((void *)coef->MCU_buffer[0],
108
1.05M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
1.05M
      if (!cinfo->entropy->insufficient_data)
110
1.05M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
1.05M
      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
1.05M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
1.05M
          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
1.05M
        blkn = 0;               /* index of current DCT block within MCU */
142
3.57M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
2.51M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
2.51M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
2.51M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
2.51M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
2.44M
                         compptr->MCU_width : compptr->last_col_width;
152
2.51M
          output_ptr = output_buf[compptr->component_index] +
153
2.51M
                       yoffset * compptr->_DCT_scaled_size;
154
2.51M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
2.51M
                      compptr->MCU_sample_width;
156
5.05M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
2.53M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
2.53M
                yoffset + yindex < compptr->last_row_height) {
159
2.53M
              output_col = start_col;
160
5.09M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
2.56M
                (*inverse_DCT) (cinfo, compptr,
165
2.56M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
2.56M
                                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
2.56M
                output_col += compptr->_DCT_scaled_size;
173
2.56M
              }
174
2.53M
            }
175
2.53M
            blkn += compptr->MCU_width;
176
2.53M
            output_ptr += compptr->_DCT_scaled_size;
177
2.53M
          }
178
2.51M
        }
179
1.05M
      }
180
1.05M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
36.4k
    coef->MCU_ctr = 0;
183
36.4k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
34.8k
  cinfo->output_iMCU_row++;
186
34.8k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
33.2k
    start_iMCU_row(cinfo);
188
33.2k
    return JPEG_ROW_COMPLETED;
189
33.2k
  }
190
  /* Completed the scan */
191
1.55k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
1.55k
  return JPEG_SCAN_COMPLETED;
193
34.8k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
90
34.8k
{
91
34.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
34.8k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
34.8k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
34.8k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
34.8k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
34.8k
  _JSAMPARRAY output_ptr;
97
34.8k
  JDIMENSION start_col, output_col;
98
34.8k
  jpeg_component_info *compptr;
99
34.8k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
71.2k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
36.4k
       yoffset++) {
104
1.09M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
1.05M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
1.05M
      jzero_far((void *)coef->MCU_buffer[0],
108
1.05M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
1.05M
      if (!cinfo->entropy->insufficient_data)
110
1.05M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
1.05M
      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
1.05M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
1.05M
          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
1.05M
        blkn = 0;               /* index of current DCT block within MCU */
142
3.57M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
2.51M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
2.51M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
2.51M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
2.51M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
2.44M
                         compptr->MCU_width : compptr->last_col_width;
152
2.51M
          output_ptr = output_buf[compptr->component_index] +
153
2.51M
                       yoffset * compptr->_DCT_scaled_size;
154
2.51M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
2.51M
                      compptr->MCU_sample_width;
156
5.05M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
2.53M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
2.53M
                yoffset + yindex < compptr->last_row_height) {
159
2.53M
              output_col = start_col;
160
5.09M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
2.56M
                (*inverse_DCT) (cinfo, compptr,
165
2.56M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
2.56M
                                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
2.56M
                output_col += compptr->_DCT_scaled_size;
173
2.56M
              }
174
2.53M
            }
175
2.53M
            blkn += compptr->MCU_width;
176
2.53M
            output_ptr += compptr->_DCT_scaled_size;
177
2.53M
          }
178
2.51M
        }
179
1.05M
      }
180
1.05M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
36.4k
    coef->MCU_ctr = 0;
183
36.4k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
34.8k
  cinfo->output_iMCU_row++;
186
34.8k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
33.2k
    start_iMCU_row(cinfo);
188
33.2k
    return JPEG_ROW_COMPLETED;
189
33.2k
  }
190
  /* Completed the scan */
191
1.55k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
1.55k
  return JPEG_SCAN_COMPLETED;
193
34.8k
}
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
1.22M
{
219
1.22M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
1.22M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
1.22M
  int blkn, ci, xindex, yindex, yoffset;
222
1.22M
  JDIMENSION start_col;
223
1.22M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
1.22M
  JBLOCKROW buffer_ptr;
225
1.22M
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
2.66M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
1.43M
    compptr = cinfo->cur_comp_info[ci];
230
1.43M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
1.43M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
1.43M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
1.43M
       (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
1.43M
  }
239
240
  /* Loop to process one whole iMCU row */
241
3.53M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
2.30M
       yoffset++) {
243
17.5M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
15.2M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
15.2M
      blkn = 0;                 /* index of current DCT block within MCU */
247
32.6M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
17.4M
        compptr = cinfo->cur_comp_info[ci];
249
17.4M
        start_col = MCU_col_num * compptr->MCU_width;
250
35.2M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
17.8M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
36.9M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
19.0M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
19.0M
          }
255
17.8M
        }
256
17.4M
      }
257
15.2M
      if (!cinfo->entropy->insufficient_data)
258
15.2M
        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
15.2M
      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
15.2M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
2.30M
    coef->MCU_ctr = 0;
282
2.30M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
1.22M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
1.21M
    start_iMCU_row(cinfo);
286
1.21M
    return JPEG_ROW_COMPLETED;
287
1.21M
  }
288
  /* Completed the scan */
289
9.03k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
9.03k
  return JPEG_SCAN_COMPLETED;
291
1.22M
}
jdcoefct-8.c:consume_data
Line
Count
Source
218
1.18M
{
219
1.18M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
1.18M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
1.18M
  int blkn, ci, xindex, yindex, yoffset;
222
1.18M
  JDIMENSION start_col;
223
1.18M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
1.18M
  JBLOCKROW buffer_ptr;
225
1.18M
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
2.56M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
1.38M
    compptr = cinfo->cur_comp_info[ci];
230
1.38M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
1.38M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
1.38M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
1.38M
       (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
1.38M
  }
239
240
  /* Loop to process one whole iMCU row */
241
3.41M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
2.22M
       yoffset++) {
243
16.8M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
14.6M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
14.6M
      blkn = 0;                 /* index of current DCT block within MCU */
247
31.3M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
16.6M
        compptr = cinfo->cur_comp_info[ci];
249
16.6M
        start_col = MCU_col_num * compptr->MCU_width;
250
33.8M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
17.1M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
35.4M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
18.3M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
18.3M
          }
255
17.1M
        }
256
16.6M
      }
257
14.6M
      if (!cinfo->entropy->insufficient_data)
258
14.6M
        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
14.6M
      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
14.6M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
2.22M
    coef->MCU_ctr = 0;
282
2.22M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
1.18M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
1.17M
    start_iMCU_row(cinfo);
286
1.17M
    return JPEG_ROW_COMPLETED;
287
1.17M
  }
288
  /* Completed the scan */
289
8.32k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
8.32k
  return JPEG_SCAN_COMPLETED;
291
1.18M
}
jdcoefct-12.c:consume_data
Line
Count
Source
218
42.5k
{
219
42.5k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
42.5k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
42.5k
  int blkn, ci, xindex, yindex, yoffset;
222
42.5k
  JDIMENSION start_col;
223
42.5k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
42.5k
  JBLOCKROW buffer_ptr;
225
42.5k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
98.0k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
55.4k
    compptr = cinfo->cur_comp_info[ci];
230
55.4k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
55.4k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
55.4k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
55.4k
       (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
55.4k
  }
239
240
  /* Loop to process one whole iMCU row */
241
119k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
77.1k
       yoffset++) {
243
683k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
606k
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
606k
      blkn = 0;                 /* index of current DCT block within MCU */
247
1.32M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
720k
        compptr = cinfo->cur_comp_info[ci];
249
720k
        start_col = MCU_col_num * compptr->MCU_width;
250
1.45M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
733k
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
1.47M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
738k
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
738k
          }
255
733k
        }
256
720k
      }
257
606k
      if (!cinfo->entropy->insufficient_data)
258
606k
        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
606k
      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
606k
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
77.1k
    coef->MCU_ctr = 0;
282
77.1k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
42.5k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
41.8k
    start_iMCU_row(cinfo);
286
41.8k
    return JPEG_ROW_COMPLETED;
287
41.8k
  }
288
  /* Completed the scan */
289
713
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
713
  return JPEG_SCAN_COMPLETED;
291
42.5k
}
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
51.8k
{
305
51.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
51.8k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
51.8k
  JDIMENSION block_num;
308
51.8k
  int ci, block_row, block_rows;
309
51.8k
  JBLOCKARRAY buffer;
310
51.8k
  JBLOCKROW buffer_ptr;
311
51.8k
  _JSAMPARRAY output_ptr;
312
51.8k
  JDIMENSION output_col;
313
51.8k
  jpeg_component_info *compptr;
314
51.8k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
51.8k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
51.8k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
51.8k
          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
157k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
106k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
106k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
106k
    buffer = (*cinfo->mem->access_virt_barray)
332
106k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
106k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
106k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
106k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
104k
      block_rows = compptr->v_samp_factor;
338
1.58k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.58k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.58k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.58k
    }
343
106k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
106k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
320k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
214k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
214k
      output_col = 0;
349
214k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
1.30M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
1.09M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.09M
                        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.09M
        buffer_ptr++;
361
1.09M
        output_col += compptr->_DCT_scaled_size;
362
1.09M
      }
363
214k
      output_ptr += compptr->_DCT_scaled_size;
364
214k
    }
365
106k
  }
366
367
51.8k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
51.2k
    return JPEG_ROW_COMPLETED;
369
576
  return JPEG_SCAN_COMPLETED;
370
51.8k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
304
51.8k
{
305
51.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
51.8k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
51.8k
  JDIMENSION block_num;
308
51.8k
  int ci, block_row, block_rows;
309
51.8k
  JBLOCKARRAY buffer;
310
51.8k
  JBLOCKROW buffer_ptr;
311
51.8k
  _JSAMPARRAY output_ptr;
312
51.8k
  JDIMENSION output_col;
313
51.8k
  jpeg_component_info *compptr;
314
51.8k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
51.8k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
51.8k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
51.8k
          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
157k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
106k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
106k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
106k
    buffer = (*cinfo->mem->access_virt_barray)
332
106k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
106k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
106k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
106k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
104k
      block_rows = compptr->v_samp_factor;
338
1.58k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.58k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.58k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.58k
    }
343
106k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
106k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
320k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
214k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
214k
      output_col = 0;
349
214k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
1.30M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
1.09M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.09M
                        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.09M
        buffer_ptr++;
361
1.09M
        output_col += compptr->_DCT_scaled_size;
362
1.09M
      }
363
214k
      output_ptr += compptr->_DCT_scaled_size;
364
214k
    }
365
106k
  }
366
367
51.8k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
51.2k
    return JPEG_ROW_COMPLETED;
369
576
  return JPEG_SCAN_COMPLETED;
370
51.8k
}
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
222k
#define Q01_POS  1
386
222k
#define Q10_POS  8
387
222k
#define Q20_POS  16
388
222k
#define Q11_POS  9
389
222k
#define Q02_POS  2
390
95.6k
#define Q03_POS  3
391
95.5k
#define Q12_POS  10
392
95.5k
#define Q21_POS  17
393
95.5k
#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.44k
{
406
1.44k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.44k
  boolean smoothing_useful = FALSE;
408
1.44k
  int ci, coefi;
409
1.44k
  jpeg_component_info *compptr;
410
1.44k
  JQUANT_TBL *qtable;
411
1.44k
  int *coef_bits, *prev_coef_bits;
412
1.44k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.44k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
22
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.41k
  if (coef->coef_bits_latch == NULL)
419
1.41k
    coef->coef_bits_latch = (int *)
420
1.41k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.41k
                                  cinfo->num_components * 2 *
422
1.41k
                                  (SAVED_COEFS * sizeof(int)));
423
1.41k
  coef_bits_latch = coef->coef_bits_latch;
424
1.41k
  prev_coef_bits_latch =
425
1.41k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
3.93k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
2.81k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
2.81k
    if ((qtable = compptr->quant_table) == NULL)
431
24
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
2.79k
    if (qtable->quantval[0] == 0 ||
434
2.78k
        qtable->quantval[Q01_POS] == 0 ||
435
2.77k
        qtable->quantval[Q10_POS] == 0 ||
436
2.71k
        qtable->quantval[Q20_POS] == 0 ||
437
2.67k
        qtable->quantval[Q11_POS] == 0 ||
438
2.62k
        qtable->quantval[Q02_POS] == 0 ||
439
2.58k
        qtable->quantval[Q03_POS] == 0 ||
440
2.56k
        qtable->quantval[Q12_POS] == 0 ||
441
2.56k
        qtable->quantval[Q21_POS] == 0 ||
442
2.55k
        qtable->quantval[Q30_POS] == 0)
443
279
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
2.51k
    coef_bits = cinfo->coef_bits[ci];
446
2.51k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
2.51k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
2.51k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
25.1k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
22.6k
      if (cinfo->input_scan_number > 1)
453
16.8k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
5.83k
      else
455
5.83k
        prev_coef_bits_latch[coefi] = -1;
456
22.6k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
22.6k
      if (coef_bits[coefi] != 0)
458
12.5k
        smoothing_useful = TRUE;
459
22.6k
    }
460
2.51k
    coef_bits_latch += SAVED_COEFS;
461
2.51k
    prev_coef_bits_latch += SAVED_COEFS;
462
2.51k
  }
463
464
1.11k
  return smoothing_useful;
465
1.41k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
405
1.26k
{
406
1.26k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.26k
  boolean smoothing_useful = FALSE;
408
1.26k
  int ci, coefi;
409
1.26k
  jpeg_component_info *compptr;
410
1.26k
  JQUANT_TBL *qtable;
411
1.26k
  int *coef_bits, *prev_coef_bits;
412
1.26k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.26k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
16
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.24k
  if (coef->coef_bits_latch == NULL)
419
1.24k
    coef->coef_bits_latch = (int *)
420
1.24k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.24k
                                  cinfo->num_components * 2 *
422
1.24k
                                  (SAVED_COEFS * sizeof(int)));
423
1.24k
  coef_bits_latch = coef->coef_bits_latch;
424
1.24k
  prev_coef_bits_latch =
425
1.24k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
3.49k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
2.45k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
2.45k
    if ((qtable = compptr->quant_table) == NULL)
431
23
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
2.43k
    if (qtable->quantval[0] == 0 ||
434
2.42k
        qtable->quantval[Q01_POS] == 0 ||
435
2.41k
        qtable->quantval[Q10_POS] == 0 ||
436
2.39k
        qtable->quantval[Q20_POS] == 0 ||
437
2.36k
        qtable->quantval[Q11_POS] == 0 ||
438
2.31k
        qtable->quantval[Q02_POS] == 0 ||
439
2.28k
        qtable->quantval[Q03_POS] == 0 ||
440
2.27k
        qtable->quantval[Q12_POS] == 0 ||
441
2.27k
        qtable->quantval[Q21_POS] == 0 ||
442
2.26k
        qtable->quantval[Q30_POS] == 0)
443
186
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
2.24k
    coef_bits = cinfo->coef_bits[ci];
446
2.24k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
2.24k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
2.24k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
22.4k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
20.2k
      if (cinfo->input_scan_number > 1)
453
16.0k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
4.14k
      else
455
4.14k
        prev_coef_bits_latch[coefi] = -1;
456
20.2k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
20.2k
      if (coef_bits[coefi] != 0)
458
10.3k
        smoothing_useful = TRUE;
459
20.2k
    }
460
2.24k
    coef_bits_latch += SAVED_COEFS;
461
2.24k
    prev_coef_bits_latch += SAVED_COEFS;
462
2.24k
  }
463
464
1.03k
  return smoothing_useful;
465
1.24k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
405
178
{
406
178
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
178
  boolean smoothing_useful = FALSE;
408
178
  int ci, coefi;
409
178
  jpeg_component_info *compptr;
410
178
  JQUANT_TBL *qtable;
411
178
  int *coef_bits, *prev_coef_bits;
412
178
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
178
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
6
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
172
  if (coef->coef_bits_latch == NULL)
419
172
    coef->coef_bits_latch = (int *)
420
172
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
172
                                  cinfo->num_components * 2 *
422
172
                                  (SAVED_COEFS * sizeof(int)));
423
172
  coef_bits_latch = coef->coef_bits_latch;
424
172
  prev_coef_bits_latch =
425
172
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
442
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
364
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
364
    if ((qtable = compptr->quant_table) == NULL)
431
1
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
363
    if (qtable->quantval[0] == 0 ||
434
359
        qtable->quantval[Q01_POS] == 0 ||
435
358
        qtable->quantval[Q10_POS] == 0 ||
436
316
        qtable->quantval[Q20_POS] == 0 ||
437
313
        qtable->quantval[Q11_POS] == 0 ||
438
306
        qtable->quantval[Q02_POS] == 0 ||
439
302
        qtable->quantval[Q03_POS] == 0 ||
440
292
        qtable->quantval[Q12_POS] == 0 ||
441
288
        qtable->quantval[Q21_POS] == 0 ||
442
284
        qtable->quantval[Q30_POS] == 0)
443
93
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
270
    coef_bits = cinfo->coef_bits[ci];
446
270
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
270
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
270
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
2.70k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
2.43k
      if (cinfo->input_scan_number > 1)
453
738
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
1.69k
      else
455
1.69k
        prev_coef_bits_latch[coefi] = -1;
456
2.43k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
2.43k
      if (coef_bits[coefi] != 0)
458
2.26k
        smoothing_useful = TRUE;
459
2.43k
    }
460
270
    coef_bits_latch += SAVED_COEFS;
461
270
    prev_coef_bits_latch += SAVED_COEFS;
462
270
  }
463
464
78
  return smoothing_useful;
465
172
}
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
151k
{
475
151k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
151k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
151k
  JDIMENSION block_num, last_block_column;
478
151k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
151k
    image_block_rows;
480
151k
  JBLOCKARRAY buffer;
481
151k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
151k
  JBLOCKROW next_block_row, next_next_block_row;
483
151k
  _JSAMPARRAY output_ptr;
484
151k
  JDIMENSION output_col;
485
151k
  jpeg_component_info *compptr;
486
151k
  _inverse_DCT_method_ptr inverse_DCT;
487
151k
  boolean change_dc;
488
151k
  JCOEF *workspace;
489
151k
  int *coef_bits;
490
151k
  JQUANT_TBL *quanttbl;
491
151k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
151k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
151k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
151k
      DC25;
495
151k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
151k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
151k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
151k
         !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
371k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
220k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
220k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
220k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
217k
      block_rows = compptr->v_samp_factor;
526
217k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
217k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
979
      block_rows = compptr->v_samp_factor;
529
979
      access_rows = block_rows * 2; /* this and next iMCU row */
530
1.18k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
1.18k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
1.18k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
1.18k
      access_rows = block_rows; /* this iMCU row only */
535
1.18k
    }
536
    /* Align the virtual buffer for this component. */
537
220k
    if (cinfo->output_iMCU_row > 1) {
538
217k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
217k
      buffer = (*cinfo->mem->access_virt_barray)
540
217k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
217k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
217k
         (JDIMENSION)access_rows, FALSE);
543
217k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
217k
    } else if (cinfo->output_iMCU_row > 0) {
545
979
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
979
      buffer = (*cinfo->mem->access_virt_barray)
547
979
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
979
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
979
         (JDIMENSION)access_rows, FALSE);
550
979
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
1.18k
    } else {
552
1.18k
      buffer = (*cinfo->mem->access_virt_barray)
553
1.18k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
1.18k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
1.18k
    }
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
220k
    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
220k
    else
564
220k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
220k
    change_dc =
568
220k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
106k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
104k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
220k
    quanttbl = compptr->quant_table;
573
220k
    Q00 = quanttbl->quantval[0];
574
220k
    Q01 = quanttbl->quantval[Q01_POS];
575
220k
    Q10 = quanttbl->quantval[Q10_POS];
576
220k
    Q20 = quanttbl->quantval[Q20_POS];
577
220k
    Q11 = quanttbl->quantval[Q11_POS];
578
220k
    Q02 = quanttbl->quantval[Q02_POS];
579
220k
    if (change_dc) {
580
93.0k
      Q03 = quanttbl->quantval[Q03_POS];
581
93.0k
      Q12 = quanttbl->quantval[Q12_POS];
582
93.0k
      Q21 = quanttbl->quantval[Q21_POS];
583
93.0k
      Q30 = quanttbl->quantval[Q30_POS];
584
93.0k
    }
585
220k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
220k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
220k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
597k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
377k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
377k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
377k
      if (image_block_row > 0)
594
376k
        prev_block_row =
595
376k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
1.18k
      else
597
1.18k
        prev_block_row = buffer_ptr;
598
599
377k
      if (image_block_row > 1)
600
375k
        prev_prev_block_row =
601
375k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
2.33k
      else
603
2.33k
        prev_prev_block_row = prev_block_row;
604
605
377k
      if (image_block_row < image_block_rows - 1)
606
376k
        next_block_row =
607
376k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
1.18k
      else
609
1.18k
        next_block_row = buffer_ptr;
610
611
377k
      if (image_block_row < image_block_rows - 2)
612
375k
        next_next_block_row =
613
375k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
1.90k
      else
615
1.90k
        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
377k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
377k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
377k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
377k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
377k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
377k
      output_col = 0;
626
377k
      last_block_column = compptr->width_in_blocks - 1;
627
377k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
3.22M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
2.84M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
2.84M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
377k
            block_num < last_block_column) {
634
245k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
245k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
245k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
245k
          DC19 = DC20 = (int)next_block_row[1][0];
638
245k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
245k
        }
640
2.84M
        if (block_num + 1 < last_block_column) {
641
2.22M
          DC05 = (int)prev_prev_block_row[2][0];
642
2.22M
          DC10 = (int)prev_block_row[2][0];
643
2.22M
          DC15 = (int)buffer_ptr[2][0];
644
2.22M
          DC20 = (int)next_block_row[2][0];
645
2.22M
          DC25 = (int)next_next_block_row[2][0];
646
2.22M
        }
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
2.84M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
2.06M
          num = Q00 * (change_dc ?
660
1.45M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
1.45M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
1.45M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
1.45M
                 DC21 - DC22 + DC24 + DC25) :
664
2.06M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
2.06M
          if (num >= 0) {
666
1.42M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
1.42M
            if (Al > 0 && pred >= (1 << Al))
668
85.4k
              pred = (1 << Al) - 1;
669
1.42M
          } else {
670
646k
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
646k
            if (Al > 0 && pred >= (1 << Al))
672
48.5k
              pred = (1 << Al) - 1;
673
646k
            pred = -pred;
674
646k
          }
675
2.06M
          workspace[1] = (JCOEF)pred;
676
2.06M
        }
677
        /* AC10 */
678
2.84M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
2.14M
          num = Q00 * (change_dc ?
680
1.45M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
1.45M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
1.45M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
1.45M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
2.14M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
2.14M
          if (num >= 0) {
686
1.53M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
1.53M
            if (Al > 0 && pred >= (1 << Al))
688
77.8k
              pred = (1 << Al) - 1;
689
1.53M
          } else {
690
603k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
603k
            if (Al > 0 && pred >= (1 << Al))
692
71.9k
              pred = (1 << Al) - 1;
693
603k
            pred = -pred;
694
603k
          }
695
2.14M
          workspace[8] = (JCOEF)pred;
696
2.14M
        }
697
        /* AC20 */
698
2.84M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
2.11M
          num = Q00 * (change_dc ?
700
1.45M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
1.45M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
2.11M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
2.11M
          if (num >= 0) {
704
1.33M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
1.33M
            if (Al > 0 && pred >= (1 << Al))
706
74.2k
              pred = (1 << Al) - 1;
707
1.33M
          } else {
708
783k
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
783k
            if (Al > 0 && pred >= (1 << Al))
710
74.9k
              pred = (1 << Al) - 1;
711
783k
            pred = -pred;
712
783k
          }
713
2.11M
          workspace[16] = (JCOEF)pred;
714
2.11M
        }
715
        /* AC11 */
716
2.84M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
2.24M
          num = Q00 * (change_dc ?
718
1.45M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
1.45M
                 9 * DC19 + DC21 - DC25) :
720
2.24M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
780k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
2.24M
          if (num >= 0) {
723
1.56M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
1.56M
            if (Al > 0 && pred >= (1 << Al))
725
63.8k
              pred = (1 << Al) - 1;
726
1.56M
          } else {
727
675k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
675k
            if (Al > 0 && pred >= (1 << Al))
729
63.3k
              pred = (1 << Al) - 1;
730
675k
            pred = -pred;
731
675k
          }
732
2.24M
          workspace[9] = (JCOEF)pred;
733
2.24M
        }
734
        /* AC02 */
735
2.84M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
2.19M
          num = Q00 * (change_dc ?
737
1.45M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
1.45M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
2.19M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
2.19M
          if (num >= 0) {
741
1.39M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
1.39M
            if (Al > 0 && pred >= (1 << Al))
743
66.1k
              pred = (1 << Al) - 1;
744
1.39M
          } else {
745
805k
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
805k
            if (Al > 0 && pred >= (1 << Al))
747
65.5k
              pred = (1 << Al) - 1;
748
805k
            pred = -pred;
749
805k
          }
750
2.19M
          workspace[2] = (JCOEF)pred;
751
2.19M
        }
752
2.84M
        if (change_dc) {
753
          /* AC03 */
754
1.45M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
1.45M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
1.45M
            if (num >= 0) {
757
1.08M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
1.08M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
1.08M
            } else {
761
375k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
375k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
375k
              pred = -pred;
765
375k
            }
766
1.45M
            workspace[3] = (JCOEF)pred;
767
1.45M
          }
768
          /* AC12 */
769
1.45M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
1.45M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
1.45M
            if (num >= 0) {
772
946k
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
946k
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
946k
            } else {
776
513k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
513k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
513k
              pred = -pred;
780
513k
            }
781
1.45M
            workspace[10] = (JCOEF)pred;
782
1.45M
          }
783
          /* AC21 */
784
1.45M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
1.45M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
1.45M
            if (num >= 0) {
787
961k
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
961k
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
961k
            } else {
791
498k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
498k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
498k
              pred = -pred;
795
498k
            }
796
1.45M
            workspace[17] = (JCOEF)pred;
797
1.45M
          }
798
          /* AC30 */
799
1.45M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
1.45M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
1.45M
            if (num >= 0) {
802
1.14M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
1.14M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
1.14M
            } else {
806
319k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
319k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
319k
              pred = -pred;
810
319k
            }
811
1.45M
            workspace[24] = (JCOEF)pred;
812
1.45M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
1.45M
          num = Q00 *
817
1.45M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
1.45M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
1.45M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
1.45M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
1.45M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
1.45M
          if (num >= 0) {
823
606k
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
853k
          } else {
825
853k
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
853k
            pred = -pred;
827
853k
          }
828
1.45M
          workspace[0] = (JCOEF)pred;
829
1.45M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
2.84M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
2.84M
                        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
2.84M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
2.84M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
2.84M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
2.84M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
2.84M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
2.84M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
2.84M
          prev_prev_block_row++, next_next_block_row++;
849
2.84M
        output_col += compptr->_DCT_scaled_size;
850
2.84M
      }
851
377k
      output_ptr += compptr->_DCT_scaled_size;
852
377k
    }
853
220k
  }
854
855
151k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
150k
    return JPEG_ROW_COMPLETED;
857
686
  return JPEG_SCAN_COMPLETED;
858
151k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
474
151k
{
475
151k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
151k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
151k
  JDIMENSION block_num, last_block_column;
478
151k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
151k
    image_block_rows;
480
151k
  JBLOCKARRAY buffer;
481
151k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
151k
  JBLOCKROW next_block_row, next_next_block_row;
483
151k
  _JSAMPARRAY output_ptr;
484
151k
  JDIMENSION output_col;
485
151k
  jpeg_component_info *compptr;
486
151k
  _inverse_DCT_method_ptr inverse_DCT;
487
151k
  boolean change_dc;
488
151k
  JCOEF *workspace;
489
151k
  int *coef_bits;
490
151k
  JQUANT_TBL *quanttbl;
491
151k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
151k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
151k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
151k
      DC25;
495
151k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
151k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
151k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
151k
         !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
371k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
220k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
220k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
220k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
217k
      block_rows = compptr->v_samp_factor;
526
217k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
217k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
979
      block_rows = compptr->v_samp_factor;
529
979
      access_rows = block_rows * 2; /* this and next iMCU row */
530
1.18k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
1.18k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
1.18k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
1.18k
      access_rows = block_rows; /* this iMCU row only */
535
1.18k
    }
536
    /* Align the virtual buffer for this component. */
537
220k
    if (cinfo->output_iMCU_row > 1) {
538
217k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
217k
      buffer = (*cinfo->mem->access_virt_barray)
540
217k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
217k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
217k
         (JDIMENSION)access_rows, FALSE);
543
217k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
217k
    } else if (cinfo->output_iMCU_row > 0) {
545
979
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
979
      buffer = (*cinfo->mem->access_virt_barray)
547
979
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
979
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
979
         (JDIMENSION)access_rows, FALSE);
550
979
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
1.18k
    } else {
552
1.18k
      buffer = (*cinfo->mem->access_virt_barray)
553
1.18k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
1.18k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
1.18k
    }
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
220k
    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
220k
    else
564
220k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
220k
    change_dc =
568
220k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
106k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
104k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
220k
    quanttbl = compptr->quant_table;
573
220k
    Q00 = quanttbl->quantval[0];
574
220k
    Q01 = quanttbl->quantval[Q01_POS];
575
220k
    Q10 = quanttbl->quantval[Q10_POS];
576
220k
    Q20 = quanttbl->quantval[Q20_POS];
577
220k
    Q11 = quanttbl->quantval[Q11_POS];
578
220k
    Q02 = quanttbl->quantval[Q02_POS];
579
220k
    if (change_dc) {
580
93.0k
      Q03 = quanttbl->quantval[Q03_POS];
581
93.0k
      Q12 = quanttbl->quantval[Q12_POS];
582
93.0k
      Q21 = quanttbl->quantval[Q21_POS];
583
93.0k
      Q30 = quanttbl->quantval[Q30_POS];
584
93.0k
    }
585
220k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
220k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
220k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
597k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
377k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
377k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
377k
      if (image_block_row > 0)
594
376k
        prev_block_row =
595
376k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
1.18k
      else
597
1.18k
        prev_block_row = buffer_ptr;
598
599
377k
      if (image_block_row > 1)
600
375k
        prev_prev_block_row =
601
375k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
2.33k
      else
603
2.33k
        prev_prev_block_row = prev_block_row;
604
605
377k
      if (image_block_row < image_block_rows - 1)
606
376k
        next_block_row =
607
376k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
1.18k
      else
609
1.18k
        next_block_row = buffer_ptr;
610
611
377k
      if (image_block_row < image_block_rows - 2)
612
375k
        next_next_block_row =
613
375k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
1.90k
      else
615
1.90k
        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
377k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
377k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
377k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
377k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
377k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
377k
      output_col = 0;
626
377k
      last_block_column = compptr->width_in_blocks - 1;
627
377k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
3.22M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
2.84M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
2.84M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
377k
            block_num < last_block_column) {
634
245k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
245k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
245k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
245k
          DC19 = DC20 = (int)next_block_row[1][0];
638
245k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
245k
        }
640
2.84M
        if (block_num + 1 < last_block_column) {
641
2.22M
          DC05 = (int)prev_prev_block_row[2][0];
642
2.22M
          DC10 = (int)prev_block_row[2][0];
643
2.22M
          DC15 = (int)buffer_ptr[2][0];
644
2.22M
          DC20 = (int)next_block_row[2][0];
645
2.22M
          DC25 = (int)next_next_block_row[2][0];
646
2.22M
        }
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
2.84M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
2.06M
          num = Q00 * (change_dc ?
660
1.45M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
1.45M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
1.45M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
1.45M
                 DC21 - DC22 + DC24 + DC25) :
664
2.06M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
2.06M
          if (num >= 0) {
666
1.42M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
1.42M
            if (Al > 0 && pred >= (1 << Al))
668
85.4k
              pred = (1 << Al) - 1;
669
1.42M
          } else {
670
646k
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
646k
            if (Al > 0 && pred >= (1 << Al))
672
48.5k
              pred = (1 << Al) - 1;
673
646k
            pred = -pred;
674
646k
          }
675
2.06M
          workspace[1] = (JCOEF)pred;
676
2.06M
        }
677
        /* AC10 */
678
2.84M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
2.14M
          num = Q00 * (change_dc ?
680
1.45M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
1.45M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
1.45M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
1.45M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
2.14M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
2.14M
          if (num >= 0) {
686
1.53M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
1.53M
            if (Al > 0 && pred >= (1 << Al))
688
77.8k
              pred = (1 << Al) - 1;
689
1.53M
          } else {
690
603k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
603k
            if (Al > 0 && pred >= (1 << Al))
692
71.9k
              pred = (1 << Al) - 1;
693
603k
            pred = -pred;
694
603k
          }
695
2.14M
          workspace[8] = (JCOEF)pred;
696
2.14M
        }
697
        /* AC20 */
698
2.84M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
2.11M
          num = Q00 * (change_dc ?
700
1.45M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
1.45M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
2.11M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
2.11M
          if (num >= 0) {
704
1.33M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
1.33M
            if (Al > 0 && pred >= (1 << Al))
706
74.2k
              pred = (1 << Al) - 1;
707
1.33M
          } else {
708
783k
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
783k
            if (Al > 0 && pred >= (1 << Al))
710
74.9k
              pred = (1 << Al) - 1;
711
783k
            pred = -pred;
712
783k
          }
713
2.11M
          workspace[16] = (JCOEF)pred;
714
2.11M
        }
715
        /* AC11 */
716
2.84M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
2.24M
          num = Q00 * (change_dc ?
718
1.45M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
1.45M
                 9 * DC19 + DC21 - DC25) :
720
2.24M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
780k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
2.24M
          if (num >= 0) {
723
1.56M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
1.56M
            if (Al > 0 && pred >= (1 << Al))
725
63.8k
              pred = (1 << Al) - 1;
726
1.56M
          } else {
727
675k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
675k
            if (Al > 0 && pred >= (1 << Al))
729
63.3k
              pred = (1 << Al) - 1;
730
675k
            pred = -pred;
731
675k
          }
732
2.24M
          workspace[9] = (JCOEF)pred;
733
2.24M
        }
734
        /* AC02 */
735
2.84M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
2.19M
          num = Q00 * (change_dc ?
737
1.45M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
1.45M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
2.19M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
2.19M
          if (num >= 0) {
741
1.39M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
1.39M
            if (Al > 0 && pred >= (1 << Al))
743
66.1k
              pred = (1 << Al) - 1;
744
1.39M
          } else {
745
805k
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
805k
            if (Al > 0 && pred >= (1 << Al))
747
65.5k
              pred = (1 << Al) - 1;
748
805k
            pred = -pred;
749
805k
          }
750
2.19M
          workspace[2] = (JCOEF)pred;
751
2.19M
        }
752
2.84M
        if (change_dc) {
753
          /* AC03 */
754
1.45M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
1.45M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
1.45M
            if (num >= 0) {
757
1.08M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
1.08M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
1.08M
            } else {
761
375k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
375k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
375k
              pred = -pred;
765
375k
            }
766
1.45M
            workspace[3] = (JCOEF)pred;
767
1.45M
          }
768
          /* AC12 */
769
1.45M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
1.45M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
1.45M
            if (num >= 0) {
772
946k
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
946k
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
946k
            } else {
776
513k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
513k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
513k
              pred = -pred;
780
513k
            }
781
1.45M
            workspace[10] = (JCOEF)pred;
782
1.45M
          }
783
          /* AC21 */
784
1.45M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
1.45M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
1.45M
            if (num >= 0) {
787
961k
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
961k
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
961k
            } else {
791
498k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
498k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
498k
              pred = -pred;
795
498k
            }
796
1.45M
            workspace[17] = (JCOEF)pred;
797
1.45M
          }
798
          /* AC30 */
799
1.45M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
1.45M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
1.45M
            if (num >= 0) {
802
1.14M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
1.14M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
1.14M
            } else {
806
319k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
319k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
319k
              pred = -pred;
810
319k
            }
811
1.45M
            workspace[24] = (JCOEF)pred;
812
1.45M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
1.45M
          num = Q00 *
817
1.45M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
1.45M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
1.45M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
1.45M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
1.45M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
1.45M
          if (num >= 0) {
823
606k
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
853k
          } else {
825
853k
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
853k
            pred = -pred;
827
853k
          }
828
1.45M
          workspace[0] = (JCOEF)pred;
829
1.45M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
2.84M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
2.84M
                        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
2.84M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
2.84M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
2.84M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
2.84M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
2.84M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
2.84M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
2.84M
          prev_prev_block_row++, next_next_block_row++;
849
2.84M
        output_col += compptr->_DCT_scaled_size;
850
2.84M
      }
851
377k
      output_ptr += compptr->_DCT_scaled_size;
852
377k
    }
853
220k
  }
854
855
151k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
150k
    return JPEG_ROW_COMPLETED;
857
686
  return JPEG_SCAN_COMPLETED;
858
151k
}
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
3.84k
{
870
3.84k
  my_coef_ptr coef;
871
872
3.84k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
3.84k
  coef = (my_coef_ptr)
876
3.84k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
3.84k
                                sizeof(my_coef_controller));
878
3.84k
  memset(coef, 0, sizeof(my_coef_controller));
879
3.84k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
3.84k
  coef->pub.start_input_pass = start_input_pass;
881
3.84k
  coef->pub.start_output_pass = start_output_pass;
882
3.84k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
3.84k
  coef->coef_bits_latch = NULL;
884
3.84k
#endif
885
886
  /* Create the coefficient buffer. */
887
3.84k
  if (need_full_buffer) {
888
2.19k
#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.19k
    int ci, access_rows;
893
2.19k
    jpeg_component_info *compptr;
894
895
7.55k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
5.36k
         ci++, compptr++) {
897
5.36k
      access_rows = compptr->v_samp_factor;
898
5.36k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
5.36k
      if (cinfo->progressive_mode)
901
5.24k
        access_rows *= 5;
902
5.36k
#endif
903
5.36k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
5.36k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
5.36k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
5.36k
                               (long)compptr->h_samp_factor),
907
5.36k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
5.36k
                               (long)compptr->v_samp_factor),
909
5.36k
         (JDIMENSION)access_rows);
910
5.36k
    }
911
2.19k
    coef->pub.consume_data = consume_data;
912
2.19k
    coef->pub._decompress_data = decompress_data;
913
2.19k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.19k
  } else {
918
    /* We only need a single-MCU buffer. */
919
1.65k
    JBLOCKROW buffer;
920
1.65k
    int i;
921
922
1.65k
    buffer = (JBLOCKROW)
923
1.65k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
1.65k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
18.1k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
16.5k
      coef->MCU_buffer[i] = buffer + i;
927
16.5k
    }
928
1.65k
    coef->pub.consume_data = dummy_consume_data;
929
1.65k
    coef->pub._decompress_data = decompress_onepass;
930
1.65k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
1.65k
  }
932
933
  /* Allocate the workspace buffer */
934
3.84k
  coef->workspace = (JCOEF *)
935
3.84k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
3.84k
                                sizeof(JCOEF) * DCTSIZE2);
937
3.84k
}
jinit_d_coef_controller
Line
Count
Source
869
3.37k
{
870
3.37k
  my_coef_ptr coef;
871
872
3.37k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
3.37k
  coef = (my_coef_ptr)
876
3.37k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
3.37k
                                sizeof(my_coef_controller));
878
3.37k
  memset(coef, 0, sizeof(my_coef_controller));
879
3.37k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
3.37k
  coef->pub.start_input_pass = start_input_pass;
881
3.37k
  coef->pub.start_output_pass = start_output_pass;
882
3.37k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
3.37k
  coef->coef_bits_latch = NULL;
884
3.37k
#endif
885
886
  /* Create the coefficient buffer. */
887
3.37k
  if (need_full_buffer) {
888
1.75k
#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
1.75k
    int ci, access_rows;
893
1.75k
    jpeg_component_info *compptr;
894
895
5.82k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
4.06k
         ci++, compptr++) {
897
4.06k
      access_rows = compptr->v_samp_factor;
898
4.06k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
4.06k
      if (cinfo->progressive_mode)
901
4.01k
        access_rows *= 5;
902
4.06k
#endif
903
4.06k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
4.06k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
4.06k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
4.06k
                               (long)compptr->h_samp_factor),
907
4.06k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
4.06k
                               (long)compptr->v_samp_factor),
909
4.06k
         (JDIMENSION)access_rows);
910
4.06k
    }
911
1.75k
    coef->pub.consume_data = consume_data;
912
1.75k
    coef->pub._decompress_data = decompress_data;
913
1.75k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
1.75k
  } else {
918
    /* We only need a single-MCU buffer. */
919
1.62k
    JBLOCKROW buffer;
920
1.62k
    int i;
921
922
1.62k
    buffer = (JBLOCKROW)
923
1.62k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
1.62k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
17.8k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
16.2k
      coef->MCU_buffer[i] = buffer + i;
927
16.2k
    }
928
1.62k
    coef->pub.consume_data = dummy_consume_data;
929
1.62k
    coef->pub._decompress_data = decompress_onepass;
930
1.62k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
1.62k
  }
932
933
  /* Allocate the workspace buffer */
934
3.37k
  coef->workspace = (JCOEF *)
935
3.37k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
3.37k
                                sizeof(JCOEF) * DCTSIZE2);
937
3.37k
}
j12init_d_coef_controller
Line
Count
Source
869
466
{
870
466
  my_coef_ptr coef;
871
872
466
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
466
  coef = (my_coef_ptr)
876
466
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
466
                                sizeof(my_coef_controller));
878
466
  memset(coef, 0, sizeof(my_coef_controller));
879
466
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
466
  coef->pub.start_input_pass = start_input_pass;
881
466
  coef->pub.start_output_pass = start_output_pass;
882
466
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
466
  coef->coef_bits_latch = NULL;
884
466
#endif
885
886
  /* Create the coefficient buffer. */
887
466
  if (need_full_buffer) {
888
436
#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
436
    int ci, access_rows;
893
436
    jpeg_component_info *compptr;
894
895
1.73k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
1.30k
         ci++, compptr++) {
897
1.30k
      access_rows = compptr->v_samp_factor;
898
1.30k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
1.30k
      if (cinfo->progressive_mode)
901
1.22k
        access_rows *= 5;
902
1.30k
#endif
903
1.30k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
1.30k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
1.30k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
1.30k
                               (long)compptr->h_samp_factor),
907
1.30k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
1.30k
                               (long)compptr->v_samp_factor),
909
1.30k
         (JDIMENSION)access_rows);
910
1.30k
    }
911
436
    coef->pub.consume_data = consume_data;
912
436
    coef->pub._decompress_data = decompress_data;
913
436
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
436
  } else {
918
    /* We only need a single-MCU buffer. */
919
30
    JBLOCKROW buffer;
920
30
    int i;
921
922
30
    buffer = (JBLOCKROW)
923
30
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
30
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
330
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
300
      coef->MCU_buffer[i] = buffer + i;
927
300
    }
928
30
    coef->pub.consume_data = dummy_consume_data;
929
30
    coef->pub._decompress_data = decompress_onepass;
930
30
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
30
  }
932
933
  /* Allocate the workspace buffer */
934
466
  coef->workspace = (JCOEF *)
935
466
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
466
                                sizeof(JCOEF) * DCTSIZE2);
937
466
}