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
9.76k
{
51
9.76k
  cinfo->input_iMCU_row = 0;
52
9.76k
  start_iMCU_row(cinfo);
53
9.76k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
50
9.11k
{
51
9.11k
  cinfo->input_iMCU_row = 0;
52
9.11k
  start_iMCU_row(cinfo);
53
9.11k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
50
651
{
51
651
  cinfo->input_iMCU_row = 0;
52
651
  start_iMCU_row(cinfo);
53
651
}
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.13k
{
63
3.13k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
3.13k
  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.13k
  if (coef->pub.coef_arrays != NULL) {
68
1.68k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
1.07k
      coef->pub._decompress_data = decompress_smooth_data;
70
601
    else
71
601
      coef->pub._decompress_data = decompress_data;
72
1.68k
  }
73
3.13k
#endif
74
3.13k
  cinfo->output_iMCU_row = 0;
75
3.13k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
62
3.01k
{
63
3.01k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
3.01k
  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.01k
  if (coef->pub.coef_arrays != NULL) {
68
1.56k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
1.06k
      coef->pub._decompress_data = decompress_smooth_data;
70
505
    else
71
505
      coef->pub._decompress_data = decompress_data;
72
1.56k
  }
73
3.01k
#endif
74
3.01k
  cinfo->output_iMCU_row = 0;
75
3.01k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
62
124
{
63
124
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
124
  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
124
  if (coef->pub.coef_arrays != NULL) {
68
111
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
15
      coef->pub._decompress_data = decompress_smooth_data;
70
96
    else
71
96
      coef->pub._decompress_data = decompress_data;
72
111
  }
73
124
#endif
74
124
  cinfo->output_iMCU_row = 0;
75
124
}
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
72.2k
{
91
72.2k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
72.2k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
72.2k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
72.2k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
72.2k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
72.2k
  _JSAMPARRAY output_ptr;
97
72.2k
  JDIMENSION start_col, output_col;
98
72.2k
  jpeg_component_info *compptr;
99
72.2k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
163k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
91.3k
       yoffset++) {
104
466k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
375k
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
375k
      jzero_far((void *)coef->MCU_buffer[0],
108
375k
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
375k
      if (!cinfo->entropy->insufficient_data)
110
375k
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
375k
      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
375k
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
374k
          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
374k
        blkn = 0;               /* index of current DCT block within MCU */
142
1.10M
        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
452k
                         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.68M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
957k
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
869k
                yoffset + yindex < compptr->last_row_height) {
159
869k
              output_col = start_col;
160
1.90M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
1.03M
                (*inverse_DCT) (cinfo, compptr,
165
1.03M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
1.03M
                                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.03M
                output_col += compptr->_DCT_scaled_size;
173
1.03M
              }
174
869k
            }
175
957k
            blkn += compptr->MCU_width;
176
957k
            output_ptr += compptr->_DCT_scaled_size;
177
957k
          }
178
731k
        }
179
374k
      }
180
375k
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
91.3k
    coef->MCU_ctr = 0;
183
91.3k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
72.2k
  cinfo->output_iMCU_row++;
186
72.2k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
70.8k
    start_iMCU_row(cinfo);
188
70.8k
    return JPEG_ROW_COMPLETED;
189
70.8k
  }
190
  /* Completed the scan */
191
1.44k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
1.44k
  return JPEG_SCAN_COMPLETED;
193
72.2k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
90
72.2k
{
91
72.2k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
72.2k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
72.2k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
72.2k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
72.2k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
72.2k
  _JSAMPARRAY output_ptr;
97
72.2k
  JDIMENSION start_col, output_col;
98
72.2k
  jpeg_component_info *compptr;
99
72.2k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
163k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
91.3k
       yoffset++) {
104
466k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
375k
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
375k
      jzero_far((void *)coef->MCU_buffer[0],
108
375k
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
375k
      if (!cinfo->entropy->insufficient_data)
110
375k
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
375k
      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
375k
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
374k
          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
374k
        blkn = 0;               /* index of current DCT block within MCU */
142
1.10M
        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
452k
                         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.68M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
957k
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
869k
                yoffset + yindex < compptr->last_row_height) {
159
869k
              output_col = start_col;
160
1.90M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
1.03M
                (*inverse_DCT) (cinfo, compptr,
165
1.03M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
1.03M
                                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.03M
                output_col += compptr->_DCT_scaled_size;
173
1.03M
              }
174
869k
            }
175
957k
            blkn += compptr->MCU_width;
176
957k
            output_ptr += compptr->_DCT_scaled_size;
177
957k
          }
178
731k
        }
179
374k
      }
180
375k
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
91.3k
    coef->MCU_ctr = 0;
183
91.3k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
72.2k
  cinfo->output_iMCU_row++;
186
72.2k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
70.8k
    start_iMCU_row(cinfo);
188
70.8k
    return JPEG_ROW_COMPLETED;
189
70.8k
  }
190
  /* Completed the scan */
191
1.44k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
1.44k
  return JPEG_SCAN_COMPLETED;
193
72.2k
}
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
385k
{
219
385k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
385k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
385k
  int blkn, ci, xindex, yindex, yoffset;
222
385k
  JDIMENSION start_col;
223
385k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
385k
  JBLOCKROW buffer_ptr;
225
385k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
1.25M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
871k
    compptr = cinfo->cur_comp_info[ci];
230
871k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
871k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
871k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
871k
       (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
871k
  }
239
240
  /* Loop to process one whole iMCU row */
241
788k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
403k
       yoffset++) {
243
10.3M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
9.91M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
9.91M
      blkn = 0;                 /* index of current DCT block within MCU */
247
29.6M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
19.7M
        compptr = cinfo->cur_comp_info[ci];
249
19.7M
        start_col = MCU_col_num * compptr->MCU_width;
250
40.3M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
20.5M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
42.0M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
21.4M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
21.4M
          }
255
20.5M
        }
256
19.7M
      }
257
9.91M
      if (!cinfo->entropy->insufficient_data)
258
9.91M
        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.91M
      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.91M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
403k
    coef->MCU_ctr = 0;
282
403k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
385k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
377k
    start_iMCU_row(cinfo);
286
377k
    return JPEG_ROW_COMPLETED;
287
377k
  }
288
  /* Completed the scan */
289
8.31k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
8.31k
  return JPEG_SCAN_COMPLETED;
291
385k
}
jdcoefct-8.c:consume_data
Line
Count
Source
218
383k
{
219
383k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
383k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
383k
  int blkn, ci, xindex, yindex, yoffset;
222
383k
  JDIMENSION start_col;
223
383k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
383k
  JBLOCKROW buffer_ptr;
225
383k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
1.24M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
866k
    compptr = cinfo->cur_comp_info[ci];
230
866k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
866k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
866k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
866k
       (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
866k
  }
239
240
  /* Loop to process one whole iMCU row */
241
783k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
400k
       yoffset++) {
243
9.41M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
9.01M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
9.01M
      blkn = 0;                 /* index of current DCT block within MCU */
247
26.7M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
17.7M
        compptr = cinfo->cur_comp_info[ci];
249
17.7M
        start_col = MCU_col_num * compptr->MCU_width;
250
35.9M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
18.1M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
37.1M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
18.9M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
18.9M
          }
255
18.1M
        }
256
17.7M
      }
257
9.01M
      if (!cinfo->entropy->insufficient_data)
258
9.01M
        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.01M
      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.01M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
400k
    coef->MCU_ctr = 0;
282
400k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
383k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
375k
    start_iMCU_row(cinfo);
286
375k
    return JPEG_ROW_COMPLETED;
287
375k
  }
288
  /* Completed the scan */
289
7.67k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
7.67k
  return JPEG_SCAN_COMPLETED;
291
383k
}
jdcoefct-12.c:consume_data
Line
Count
Source
218
2.52k
{
219
2.52k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
2.52k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
2.52k
  int blkn, ci, xindex, yindex, yoffset;
222
2.52k
  JDIMENSION start_col;
223
2.52k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
2.52k
  JBLOCKROW buffer_ptr;
225
2.52k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
7.33k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
4.81k
    compptr = cinfo->cur_comp_info[ci];
230
4.81k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
4.81k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
4.81k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
4.81k
       (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.81k
  }
239
240
  /* Loop to process one whole iMCU row */
241
5.13k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
2.60k
       yoffset++) {
243
901k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
898k
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
898k
      blkn = 0;                 /* index of current DCT block within MCU */
247
2.88M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
1.98M
        compptr = cinfo->cur_comp_info[ci];
249
1.98M
        start_col = MCU_col_num * compptr->MCU_width;
250
4.39M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
2.40M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
4.86M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
2.45M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
2.45M
          }
255
2.40M
        }
256
1.98M
      }
257
898k
      if (!cinfo->entropy->insufficient_data)
258
898k
        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
898k
      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
898k
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
2.60k
    coef->MCU_ctr = 0;
282
2.60k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
2.52k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
1.89k
    start_iMCU_row(cinfo);
286
1.89k
    return JPEG_ROW_COMPLETED;
287
1.89k
  }
288
  /* Completed the scan */
289
638
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
638
  return JPEG_SCAN_COMPLETED;
291
2.52k
}
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
46.9k
{
305
46.9k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
46.9k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
46.9k
  JDIMENSION block_num;
308
46.9k
  int ci, block_row, block_rows;
309
46.9k
  JBLOCKARRAY buffer;
310
46.9k
  JBLOCKROW buffer_ptr;
311
46.9k
  _JSAMPARRAY output_ptr;
312
46.9k
  JDIMENSION output_col;
313
46.9k
  jpeg_component_info *compptr;
314
46.9k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
46.9k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
46.9k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
46.9k
          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
187k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
140k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
140k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
140k
    buffer = (*cinfo->mem->access_virt_barray)
332
140k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
140k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
140k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
140k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
139k
      block_rows = compptr->v_samp_factor;
338
1.51k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.51k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.51k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.51k
    }
343
140k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
140k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
310k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
169k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
169k
      output_col = 0;
349
169k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
1.95M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
1.78M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.78M
                        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.78M
        buffer_ptr++;
361
1.78M
        output_col += compptr->_DCT_scaled_size;
362
1.78M
      }
363
169k
      output_ptr += compptr->_DCT_scaled_size;
364
169k
    }
365
140k
  }
366
367
46.9k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
46.4k
    return JPEG_ROW_COMPLETED;
369
505
  return JPEG_SCAN_COMPLETED;
370
46.9k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
304
46.9k
{
305
46.9k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
46.9k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
46.9k
  JDIMENSION block_num;
308
46.9k
  int ci, block_row, block_rows;
309
46.9k
  JBLOCKARRAY buffer;
310
46.9k
  JBLOCKROW buffer_ptr;
311
46.9k
  _JSAMPARRAY output_ptr;
312
46.9k
  JDIMENSION output_col;
313
46.9k
  jpeg_component_info *compptr;
314
46.9k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
46.9k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
46.9k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
46.9k
          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
187k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
140k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
140k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
140k
    buffer = (*cinfo->mem->access_virt_barray)
332
140k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
140k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
140k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
140k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
139k
      block_rows = compptr->v_samp_factor;
338
1.51k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.51k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.51k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.51k
    }
343
140k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
140k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
310k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
169k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
169k
      output_col = 0;
349
169k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
1.95M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
1.78M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.78M
                        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.78M
        buffer_ptr++;
361
1.78M
        output_col += compptr->_DCT_scaled_size;
362
1.78M
      }
363
169k
      output_ptr += compptr->_DCT_scaled_size;
364
169k
    }
365
140k
  }
366
367
46.9k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
46.4k
    return JPEG_ROW_COMPLETED;
369
505
  return JPEG_SCAN_COMPLETED;
370
46.9k
}
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
443k
#define Q01_POS  1
386
443k
#define Q10_POS  8
387
443k
#define Q20_POS  16
388
443k
#define Q11_POS  9
389
443k
#define Q02_POS  2
390
401k
#define Q03_POS  3
391
401k
#define Q12_POS  10
392
401k
#define Q21_POS  17
393
401k
#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.68k
{
406
1.68k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.68k
  boolean smoothing_useful = FALSE;
408
1.68k
  int ci, coefi;
409
1.68k
  jpeg_component_info *compptr;
410
1.68k
  JQUANT_TBL *qtable;
411
1.68k
  int *coef_bits, *prev_coef_bits;
412
1.68k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.68k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
24
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.65k
  if (coef->coef_bits_latch == NULL)
419
1.65k
    coef->coef_bits_latch = (int *)
420
1.65k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.65k
                                  cinfo->num_components * 2 *
422
1.65k
                                  (SAVED_COEFS * sizeof(int)));
423
1.65k
  coef_bits_latch = coef->coef_bits_latch;
424
1.65k
  prev_coef_bits_latch =
425
1.65k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
6.04k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
4.61k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
4.61k
    if ((qtable = compptr->quant_table) == NULL)
431
7
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
4.60k
    if (qtable->quantval[0] == 0 ||
434
4.60k
        qtable->quantval[Q01_POS] == 0 ||
435
4.57k
        qtable->quantval[Q10_POS] == 0 ||
436
4.55k
        qtable->quantval[Q20_POS] == 0 ||
437
4.52k
        qtable->quantval[Q11_POS] == 0 ||
438
4.51k
        qtable->quantval[Q02_POS] == 0 ||
439
4.50k
        qtable->quantval[Q03_POS] == 0 ||
440
4.47k
        qtable->quantval[Q12_POS] == 0 ||
441
4.44k
        qtable->quantval[Q21_POS] == 0 ||
442
4.43k
        qtable->quantval[Q30_POS] == 0)
443
217
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
4.39k
    coef_bits = cinfo->coef_bits[ci];
446
4.39k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
4.39k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
4.39k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
43.9k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
39.5k
      if (cinfo->input_scan_number > 1)
453
31.3k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
8.21k
      else
455
8.21k
        prev_coef_bits_latch[coefi] = -1;
456
39.5k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
39.5k
      if (coef_bits[coefi] != 0)
458
28.9k
        smoothing_useful = TRUE;
459
39.5k
    }
460
4.39k
    coef_bits_latch += SAVED_COEFS;
461
4.39k
    prev_coef_bits_latch += SAVED_COEFS;
462
4.39k
  }
463
464
1.43k
  return smoothing_useful;
465
1.65k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
405
1.56k
{
406
1.56k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.56k
  boolean smoothing_useful = FALSE;
408
1.56k
  int ci, coefi;
409
1.56k
  jpeg_component_info *compptr;
410
1.56k
  JQUANT_TBL *qtable;
411
1.56k
  int *coef_bits, *prev_coef_bits;
412
1.56k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.56k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
3
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.56k
  if (coef->coef_bits_latch == NULL)
419
1.56k
    coef->coef_bits_latch = (int *)
420
1.56k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.56k
                                  cinfo->num_components * 2 *
422
1.56k
                                  (SAVED_COEFS * sizeof(int)));
423
1.56k
  coef_bits_latch = coef->coef_bits_latch;
424
1.56k
  prev_coef_bits_latch =
425
1.56k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
5.88k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
4.46k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
4.46k
    if ((qtable = compptr->quant_table) == NULL)
431
7
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
4.45k
    if (qtable->quantval[0] == 0 ||
434
4.45k
        qtable->quantval[Q01_POS] == 0 ||
435
4.43k
        qtable->quantval[Q10_POS] == 0 ||
436
4.42k
        qtable->quantval[Q20_POS] == 0 ||
437
4.39k
        qtable->quantval[Q11_POS] == 0 ||
438
4.39k
        qtable->quantval[Q02_POS] == 0 ||
439
4.38k
        qtable->quantval[Q03_POS] == 0 ||
440
4.36k
        qtable->quantval[Q12_POS] == 0 ||
441
4.34k
        qtable->quantval[Q21_POS] == 0 ||
442
4.33k
        qtable->quantval[Q30_POS] == 0)
443
144
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
4.31k
    coef_bits = cinfo->coef_bits[ci];
446
4.31k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
4.31k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
4.31k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
43.1k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
38.8k
      if (cinfo->input_scan_number > 1)
453
30.9k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
7.87k
      else
455
7.87k
        prev_coef_bits_latch[coefi] = -1;
456
38.8k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
38.8k
      if (coef_bits[coefi] != 0)
458
28.4k
        smoothing_useful = TRUE;
459
38.8k
    }
460
4.31k
    coef_bits_latch += SAVED_COEFS;
461
4.31k
    prev_coef_bits_latch += SAVED_COEFS;
462
4.31k
  }
463
464
1.41k
  return smoothing_useful;
465
1.56k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
405
111
{
406
111
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
111
  boolean smoothing_useful = FALSE;
408
111
  int ci, coefi;
409
111
  jpeg_component_info *compptr;
410
111
  JQUANT_TBL *qtable;
411
111
  int *coef_bits, *prev_coef_bits;
412
111
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
111
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
21
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
90
  if (coef->coef_bits_latch == NULL)
419
90
    coef->coef_bits_latch = (int *)
420
90
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
90
                                  cinfo->num_components * 2 *
422
90
                                  (SAVED_COEFS * sizeof(int)));
423
90
  coef_bits_latch = coef->coef_bits_latch;
424
90
  prev_coef_bits_latch =
425
90
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
167
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
150
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
150
    if ((qtable = compptr->quant_table) == NULL)
431
0
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
150
    if (qtable->quantval[0] == 0 ||
434
144
        qtable->quantval[Q01_POS] == 0 ||
435
139
        qtable->quantval[Q10_POS] == 0 ||
436
135
        qtable->quantval[Q20_POS] == 0 ||
437
129
        qtable->quantval[Q11_POS] == 0 ||
438
123
        qtable->quantval[Q02_POS] == 0 ||
439
117
        qtable->quantval[Q03_POS] == 0 ||
440
112
        qtable->quantval[Q12_POS] == 0 ||
441
98
        qtable->quantval[Q21_POS] == 0 ||
442
95
        qtable->quantval[Q30_POS] == 0)
443
73
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
77
    coef_bits = cinfo->coef_bits[ci];
446
77
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
77
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
77
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
770
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
693
      if (cinfo->input_scan_number > 1)
453
351
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
342
      else
455
342
        prev_coef_bits_latch[coefi] = -1;
456
693
      coef_bits_latch[coefi] = coef_bits[coefi];
457
693
      if (coef_bits[coefi] != 0)
458
549
        smoothing_useful = TRUE;
459
693
    }
460
77
    coef_bits_latch += SAVED_COEFS;
461
77
    prev_coef_bits_latch += SAVED_COEFS;
462
77
  }
463
464
17
  return smoothing_useful;
465
90
}
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
146k
{
475
146k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
146k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
146k
  JDIMENSION block_num, last_block_column;
478
146k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
146k
    image_block_rows;
480
146k
  JBLOCKARRAY buffer;
481
146k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
146k
  JBLOCKROW next_block_row, next_next_block_row;
483
146k
  _JSAMPARRAY output_ptr;
484
146k
  JDIMENSION output_col;
485
146k
  jpeg_component_info *compptr;
486
146k
  _inverse_DCT_method_ptr inverse_DCT;
487
146k
  boolean change_dc;
488
146k
  JCOEF *workspace;
489
146k
  int *coef_bits;
490
146k
  JQUANT_TBL *quanttbl;
491
146k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
146k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
146k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
146k
      DC25;
495
146k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
146k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
146k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
146k
         !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
584k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
438k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
438k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
438k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
433k
      block_rows = compptr->v_samp_factor;
526
433k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
433k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
2.17k
      block_rows = compptr->v_samp_factor;
529
2.17k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
3.18k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
3.18k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
3.18k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
3.18k
      access_rows = block_rows; /* this iMCU row only */
535
3.18k
    }
536
    /* Align the virtual buffer for this component. */
537
438k
    if (cinfo->output_iMCU_row > 1) {
538
433k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
433k
      buffer = (*cinfo->mem->access_virt_barray)
540
433k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
433k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
433k
         (JDIMENSION)access_rows, FALSE);
543
433k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
433k
    } else if (cinfo->output_iMCU_row > 0) {
545
2.17k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
2.17k
      buffer = (*cinfo->mem->access_virt_barray)
547
2.17k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
2.17k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
2.17k
         (JDIMENSION)access_rows, FALSE);
550
2.17k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
3.18k
    } else {
552
3.18k
      buffer = (*cinfo->mem->access_virt_barray)
553
3.18k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
3.18k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
3.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
438k
    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
438k
    else
564
438k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
438k
    change_dc =
568
438k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
399k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
398k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
438k
    quanttbl = compptr->quant_table;
573
438k
    Q00 = quanttbl->quantval[0];
574
438k
    Q01 = quanttbl->quantval[Q01_POS];
575
438k
    Q10 = quanttbl->quantval[Q10_POS];
576
438k
    Q20 = quanttbl->quantval[Q20_POS];
577
438k
    Q11 = quanttbl->quantval[Q11_POS];
578
438k
    Q02 = quanttbl->quantval[Q02_POS];
579
438k
    if (change_dc) {
580
397k
      Q03 = quanttbl->quantval[Q03_POS];
581
397k
      Q12 = quanttbl->quantval[Q12_POS];
582
397k
      Q21 = quanttbl->quantval[Q21_POS];
583
397k
      Q30 = quanttbl->quantval[Q30_POS];
584
397k
    }
585
438k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
438k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
438k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
892k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
453k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
453k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
453k
      if (image_block_row > 0)
594
450k
        prev_block_row =
595
450k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
3.18k
      else
597
3.18k
        prev_block_row = buffer_ptr;
598
599
453k
      if (image_block_row > 1)
600
448k
        prev_prev_block_row =
601
448k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
5.37k
      else
603
5.37k
        prev_prev_block_row = prev_block_row;
604
605
453k
      if (image_block_row < image_block_rows - 1)
606
450k
        next_block_row =
607
450k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
3.18k
      else
609
3.18k
        next_block_row = buffer_ptr;
610
611
453k
      if (image_block_row < image_block_rows - 2)
612
448k
        next_next_block_row =
613
448k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
5.30k
      else
615
5.30k
        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
453k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
453k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
453k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
453k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
453k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
453k
      output_col = 0;
626
453k
      last_block_column = compptr->width_in_blocks - 1;
627
453k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
9.03M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
8.58M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
8.58M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
453k
            block_num < last_block_column) {
634
156k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
156k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
156k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
156k
          DC19 = DC20 = (int)next_block_row[1][0];
638
156k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
156k
        }
640
8.58M
        if (block_num + 1 < last_block_column) {
641
7.97M
          DC05 = (int)prev_prev_block_row[2][0];
642
7.97M
          DC10 = (int)prev_block_row[2][0];
643
7.97M
          DC15 = (int)buffer_ptr[2][0];
644
7.97M
          DC20 = (int)next_block_row[2][0];
645
7.97M
          DC25 = (int)next_next_block_row[2][0];
646
7.97M
        }
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.58M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
7.79M
          num = Q00 * (change_dc ?
660
6.85M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
6.85M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
6.85M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
6.85M
                 DC21 - DC22 + DC24 + DC25) :
664
7.79M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
7.79M
          if (num >= 0) {
666
4.33M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
4.33M
            if (Al > 0 && pred >= (1 << Al))
668
37.0k
              pred = (1 << Al) - 1;
669
4.33M
          } else {
670
3.45M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
3.45M
            if (Al > 0 && pred >= (1 << Al))
672
55.2k
              pred = (1 << Al) - 1;
673
3.45M
            pred = -pred;
674
3.45M
          }
675
7.79M
          workspace[1] = (JCOEF)pred;
676
7.79M
        }
677
        /* AC10 */
678
8.58M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
7.86M
          num = Q00 * (change_dc ?
680
6.85M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
6.85M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
6.85M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
6.85M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
7.86M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
7.86M
          if (num >= 0) {
686
6.50M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
6.50M
            if (Al > 0 && pred >= (1 << Al))
688
116k
              pred = (1 << Al) - 1;
689
6.50M
          } else {
690
1.36M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
1.36M
            if (Al > 0 && pred >= (1 << Al))
692
254k
              pred = (1 << Al) - 1;
693
1.36M
            pred = -pred;
694
1.36M
          }
695
7.86M
          workspace[8] = (JCOEF)pred;
696
7.86M
        }
697
        /* AC20 */
698
8.58M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
7.76M
          num = Q00 * (change_dc ?
700
6.85M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
6.85M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
7.76M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
7.76M
          if (num >= 0) {
704
5.31M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
5.31M
            if (Al > 0 && pred >= (1 << Al))
706
28.3k
              pred = (1 << Al) - 1;
707
5.31M
          } else {
708
2.45M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
2.45M
            if (Al > 0 && pred >= (1 << Al))
710
27.9k
              pred = (1 << Al) - 1;
711
2.45M
            pred = -pred;
712
2.45M
          }
713
7.76M
          workspace[16] = (JCOEF)pred;
714
7.76M
        }
715
        /* AC11 */
716
8.58M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
7.94M
          num = Q00 * (change_dc ?
718
6.85M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
6.85M
                 9 * DC19 + DC21 - DC25) :
720
7.94M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
1.09M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
7.94M
          if (num >= 0) {
723
7.03M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
7.03M
            if (Al > 0 && pred >= (1 << Al))
725
12.6k
              pred = (1 << Al) - 1;
726
7.03M
          } else {
727
909k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
909k
            if (Al > 0 && pred >= (1 << Al))
729
12.8k
              pred = (1 << Al) - 1;
730
909k
            pred = -pred;
731
909k
          }
732
7.94M
          workspace[9] = (JCOEF)pred;
733
7.94M
        }
734
        /* AC02 */
735
8.58M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
7.89M
          num = Q00 * (change_dc ?
737
6.85M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
6.85M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
7.89M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
7.89M
          if (num >= 0) {
741
5.15M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
5.15M
            if (Al > 0 && pred >= (1 << Al))
743
10.2k
              pred = (1 << Al) - 1;
744
5.15M
          } else {
745
2.73M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
2.73M
            if (Al > 0 && pred >= (1 << Al))
747
9.97k
              pred = (1 << Al) - 1;
748
2.73M
            pred = -pred;
749
2.73M
          }
750
7.89M
          workspace[2] = (JCOEF)pred;
751
7.89M
        }
752
8.58M
        if (change_dc) {
753
          /* AC03 */
754
6.85M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
6.85M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
6.85M
            if (num >= 0) {
757
3.95M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
3.95M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
3.95M
            } else {
761
2.89M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
2.89M
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
2.89M
              pred = -pred;
765
2.89M
            }
766
6.85M
            workspace[3] = (JCOEF)pred;
767
6.85M
          }
768
          /* AC12 */
769
6.85M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
6.85M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
6.85M
            if (num >= 0) {
772
6.09M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
6.09M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
6.09M
            } else {
776
757k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
757k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
757k
              pred = -pred;
780
757k
            }
781
6.85M
            workspace[10] = (JCOEF)pred;
782
6.85M
          }
783
          /* AC21 */
784
6.85M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
6.85M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
6.85M
            if (num >= 0) {
787
4.86M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
4.86M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
4.86M
            } else {
791
1.98M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
1.98M
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
1.98M
              pred = -pred;
795
1.98M
            }
796
6.85M
            workspace[17] = (JCOEF)pred;
797
6.85M
          }
798
          /* AC30 */
799
6.85M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
6.85M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
6.85M
            if (num >= 0) {
802
5.81M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
5.81M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
5.81M
            } else {
806
1.03M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
1.03M
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
1.03M
              pred = -pred;
810
1.03M
            }
811
6.85M
            workspace[24] = (JCOEF)pred;
812
6.85M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
6.85M
          num = Q00 *
817
6.85M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
6.85M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
6.85M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
6.85M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
6.85M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
6.85M
          if (num >= 0) {
823
3.93M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
3.93M
          } else {
825
2.91M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
2.91M
            pred = -pred;
827
2.91M
          }
828
6.85M
          workspace[0] = (JCOEF)pred;
829
6.85M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
8.58M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
8.58M
                        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.58M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
8.58M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
8.58M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
8.58M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
8.58M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
8.58M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
8.58M
          prev_prev_block_row++, next_next_block_row++;
849
8.58M
        output_col += compptr->_DCT_scaled_size;
850
8.58M
      }
851
453k
      output_ptr += compptr->_DCT_scaled_size;
852
453k
    }
853
438k
  }
854
855
146k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
145k
    return JPEG_ROW_COMPLETED;
857
1.06k
  return JPEG_SCAN_COMPLETED;
858
146k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
474
146k
{
475
146k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
146k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
146k
  JDIMENSION block_num, last_block_column;
478
146k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
146k
    image_block_rows;
480
146k
  JBLOCKARRAY buffer;
481
146k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
146k
  JBLOCKROW next_block_row, next_next_block_row;
483
146k
  _JSAMPARRAY output_ptr;
484
146k
  JDIMENSION output_col;
485
146k
  jpeg_component_info *compptr;
486
146k
  _inverse_DCT_method_ptr inverse_DCT;
487
146k
  boolean change_dc;
488
146k
  JCOEF *workspace;
489
146k
  int *coef_bits;
490
146k
  JQUANT_TBL *quanttbl;
491
146k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
146k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
146k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
146k
      DC25;
495
146k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
146k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
146k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
146k
         !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
584k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
438k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
438k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
438k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
433k
      block_rows = compptr->v_samp_factor;
526
433k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
433k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
2.17k
      block_rows = compptr->v_samp_factor;
529
2.17k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
3.18k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
3.18k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
3.18k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
3.18k
      access_rows = block_rows; /* this iMCU row only */
535
3.18k
    }
536
    /* Align the virtual buffer for this component. */
537
438k
    if (cinfo->output_iMCU_row > 1) {
538
433k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
433k
      buffer = (*cinfo->mem->access_virt_barray)
540
433k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
433k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
433k
         (JDIMENSION)access_rows, FALSE);
543
433k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
433k
    } else if (cinfo->output_iMCU_row > 0) {
545
2.17k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
2.17k
      buffer = (*cinfo->mem->access_virt_barray)
547
2.17k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
2.17k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
2.17k
         (JDIMENSION)access_rows, FALSE);
550
2.17k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
3.18k
    } else {
552
3.18k
      buffer = (*cinfo->mem->access_virt_barray)
553
3.18k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
3.18k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
3.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
438k
    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
438k
    else
564
438k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
438k
    change_dc =
568
438k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
399k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
398k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
438k
    quanttbl = compptr->quant_table;
573
438k
    Q00 = quanttbl->quantval[0];
574
438k
    Q01 = quanttbl->quantval[Q01_POS];
575
438k
    Q10 = quanttbl->quantval[Q10_POS];
576
438k
    Q20 = quanttbl->quantval[Q20_POS];
577
438k
    Q11 = quanttbl->quantval[Q11_POS];
578
438k
    Q02 = quanttbl->quantval[Q02_POS];
579
438k
    if (change_dc) {
580
397k
      Q03 = quanttbl->quantval[Q03_POS];
581
397k
      Q12 = quanttbl->quantval[Q12_POS];
582
397k
      Q21 = quanttbl->quantval[Q21_POS];
583
397k
      Q30 = quanttbl->quantval[Q30_POS];
584
397k
    }
585
438k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
438k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
438k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
892k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
453k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
453k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
453k
      if (image_block_row > 0)
594
450k
        prev_block_row =
595
450k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
3.18k
      else
597
3.18k
        prev_block_row = buffer_ptr;
598
599
453k
      if (image_block_row > 1)
600
448k
        prev_prev_block_row =
601
448k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
5.37k
      else
603
5.37k
        prev_prev_block_row = prev_block_row;
604
605
453k
      if (image_block_row < image_block_rows - 1)
606
450k
        next_block_row =
607
450k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
3.18k
      else
609
3.18k
        next_block_row = buffer_ptr;
610
611
453k
      if (image_block_row < image_block_rows - 2)
612
448k
        next_next_block_row =
613
448k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
5.30k
      else
615
5.30k
        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
453k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
453k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
453k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
453k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
453k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
453k
      output_col = 0;
626
453k
      last_block_column = compptr->width_in_blocks - 1;
627
453k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
9.03M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
8.58M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
8.58M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
453k
            block_num < last_block_column) {
634
156k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
156k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
156k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
156k
          DC19 = DC20 = (int)next_block_row[1][0];
638
156k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
156k
        }
640
8.58M
        if (block_num + 1 < last_block_column) {
641
7.97M
          DC05 = (int)prev_prev_block_row[2][0];
642
7.97M
          DC10 = (int)prev_block_row[2][0];
643
7.97M
          DC15 = (int)buffer_ptr[2][0];
644
7.97M
          DC20 = (int)next_block_row[2][0];
645
7.97M
          DC25 = (int)next_next_block_row[2][0];
646
7.97M
        }
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.58M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
7.79M
          num = Q00 * (change_dc ?
660
6.85M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
6.85M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
6.85M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
6.85M
                 DC21 - DC22 + DC24 + DC25) :
664
7.79M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
7.79M
          if (num >= 0) {
666
4.33M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
4.33M
            if (Al > 0 && pred >= (1 << Al))
668
37.0k
              pred = (1 << Al) - 1;
669
4.33M
          } else {
670
3.45M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
3.45M
            if (Al > 0 && pred >= (1 << Al))
672
55.2k
              pred = (1 << Al) - 1;
673
3.45M
            pred = -pred;
674
3.45M
          }
675
7.79M
          workspace[1] = (JCOEF)pred;
676
7.79M
        }
677
        /* AC10 */
678
8.58M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
7.86M
          num = Q00 * (change_dc ?
680
6.85M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
6.85M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
6.85M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
6.85M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
7.86M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
7.86M
          if (num >= 0) {
686
6.50M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
6.50M
            if (Al > 0 && pred >= (1 << Al))
688
116k
              pred = (1 << Al) - 1;
689
6.50M
          } else {
690
1.36M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
1.36M
            if (Al > 0 && pred >= (1 << Al))
692
254k
              pred = (1 << Al) - 1;
693
1.36M
            pred = -pred;
694
1.36M
          }
695
7.86M
          workspace[8] = (JCOEF)pred;
696
7.86M
        }
697
        /* AC20 */
698
8.58M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
7.76M
          num = Q00 * (change_dc ?
700
6.85M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
6.85M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
7.76M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
7.76M
          if (num >= 0) {
704
5.31M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
5.31M
            if (Al > 0 && pred >= (1 << Al))
706
28.3k
              pred = (1 << Al) - 1;
707
5.31M
          } else {
708
2.45M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
2.45M
            if (Al > 0 && pred >= (1 << Al))
710
27.9k
              pred = (1 << Al) - 1;
711
2.45M
            pred = -pred;
712
2.45M
          }
713
7.76M
          workspace[16] = (JCOEF)pred;
714
7.76M
        }
715
        /* AC11 */
716
8.58M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
7.94M
          num = Q00 * (change_dc ?
718
6.85M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
6.85M
                 9 * DC19 + DC21 - DC25) :
720
7.94M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
1.09M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
7.94M
          if (num >= 0) {
723
7.03M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
7.03M
            if (Al > 0 && pred >= (1 << Al))
725
12.6k
              pred = (1 << Al) - 1;
726
7.03M
          } else {
727
909k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
909k
            if (Al > 0 && pred >= (1 << Al))
729
12.8k
              pred = (1 << Al) - 1;
730
909k
            pred = -pred;
731
909k
          }
732
7.94M
          workspace[9] = (JCOEF)pred;
733
7.94M
        }
734
        /* AC02 */
735
8.58M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
7.89M
          num = Q00 * (change_dc ?
737
6.85M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
6.85M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
7.89M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
7.89M
          if (num >= 0) {
741
5.15M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
5.15M
            if (Al > 0 && pred >= (1 << Al))
743
10.2k
              pred = (1 << Al) - 1;
744
5.15M
          } else {
745
2.73M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
2.73M
            if (Al > 0 && pred >= (1 << Al))
747
9.97k
              pred = (1 << Al) - 1;
748
2.73M
            pred = -pred;
749
2.73M
          }
750
7.89M
          workspace[2] = (JCOEF)pred;
751
7.89M
        }
752
8.58M
        if (change_dc) {
753
          /* AC03 */
754
6.85M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
6.85M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
6.85M
            if (num >= 0) {
757
3.95M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
3.95M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
3.95M
            } else {
761
2.89M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
2.89M
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
2.89M
              pred = -pred;
765
2.89M
            }
766
6.85M
            workspace[3] = (JCOEF)pred;
767
6.85M
          }
768
          /* AC12 */
769
6.85M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
6.85M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
6.85M
            if (num >= 0) {
772
6.09M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
6.09M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
6.09M
            } else {
776
757k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
757k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
757k
              pred = -pred;
780
757k
            }
781
6.85M
            workspace[10] = (JCOEF)pred;
782
6.85M
          }
783
          /* AC21 */
784
6.85M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
6.85M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
6.85M
            if (num >= 0) {
787
4.86M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
4.86M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
4.86M
            } else {
791
1.98M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
1.98M
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
1.98M
              pred = -pred;
795
1.98M
            }
796
6.85M
            workspace[17] = (JCOEF)pred;
797
6.85M
          }
798
          /* AC30 */
799
6.85M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
6.85M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
6.85M
            if (num >= 0) {
802
5.81M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
5.81M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
5.81M
            } else {
806
1.03M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
1.03M
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
1.03M
              pred = -pred;
810
1.03M
            }
811
6.85M
            workspace[24] = (JCOEF)pred;
812
6.85M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
6.85M
          num = Q00 *
817
6.85M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
6.85M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
6.85M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
6.85M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
6.85M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
6.85M
          if (num >= 0) {
823
3.93M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
3.93M
          } else {
825
2.91M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
2.91M
            pred = -pred;
827
2.91M
          }
828
6.85M
          workspace[0] = (JCOEF)pred;
829
6.85M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
8.58M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
8.58M
                        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.58M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
8.58M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
8.58M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
8.58M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
8.58M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
8.58M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
8.58M
          prev_prev_block_row++, next_next_block_row++;
849
8.58M
        output_col += compptr->_DCT_scaled_size;
850
8.58M
      }
851
453k
      output_ptr += compptr->_DCT_scaled_size;
852
453k
    }
853
438k
  }
854
855
146k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
145k
    return JPEG_ROW_COMPLETED;
857
1.06k
  return JPEG_SCAN_COMPLETED;
858
146k
}
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.93k
{
870
3.93k
  my_coef_ptr coef;
871
872
3.93k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
3.93k
  coef = (my_coef_ptr)
876
3.93k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
3.93k
                                sizeof(my_coef_controller));
878
3.93k
  memset(coef, 0, sizeof(my_coef_controller));
879
3.93k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
3.93k
  coef->pub.start_input_pass = start_input_pass;
881
3.93k
  coef->pub.start_output_pass = start_output_pass;
882
3.93k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
3.93k
  coef->coef_bits_latch = NULL;
884
3.93k
#endif
885
886
  /* Create the coefficient buffer. */
887
3.93k
  if (need_full_buffer) {
888
2.43k
#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.43k
    int ci, access_rows;
893
2.43k
    jpeg_component_info *compptr;
894
895
9.73k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
7.29k
         ci++, compptr++) {
897
7.29k
      access_rows = compptr->v_samp_factor;
898
7.29k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
7.29k
      if (cinfo->progressive_mode)
901
7.12k
        access_rows *= 5;
902
7.29k
#endif
903
7.29k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
7.29k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
7.29k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
7.29k
                               (long)compptr->h_samp_factor),
907
7.29k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
7.29k
                               (long)compptr->v_samp_factor),
909
7.29k
         (JDIMENSION)access_rows);
910
7.29k
    }
911
2.43k
    coef->pub.consume_data = consume_data;
912
2.43k
    coef->pub._decompress_data = decompress_data;
913
2.43k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.43k
  } else {
918
    /* We only need a single-MCU buffer. */
919
1.49k
    JBLOCKROW buffer;
920
1.49k
    int i;
921
922
1.49k
    buffer = (JBLOCKROW)
923
1.49k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
1.49k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
16.4k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
14.9k
      coef->MCU_buffer[i] = buffer + i;
927
14.9k
    }
928
1.49k
    coef->pub.consume_data = dummy_consume_data;
929
1.49k
    coef->pub._decompress_data = decompress_onepass;
930
1.49k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
1.49k
  }
932
933
  /* Allocate the workspace buffer */
934
3.93k
  coef->workspace = (JCOEF *)
935
3.93k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
3.93k
                                sizeof(JCOEF) * DCTSIZE2);
937
3.93k
}
jinit_d_coef_controller
Line
Count
Source
869
3.60k
{
870
3.60k
  my_coef_ptr coef;
871
872
3.60k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
3.60k
  coef = (my_coef_ptr)
876
3.60k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
3.60k
                                sizeof(my_coef_controller));
878
3.60k
  memset(coef, 0, sizeof(my_coef_controller));
879
3.60k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
3.60k
  coef->pub.start_input_pass = start_input_pass;
881
3.60k
  coef->pub.start_output_pass = start_output_pass;
882
3.60k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
3.60k
  coef->coef_bits_latch = NULL;
884
3.60k
#endif
885
886
  /* Create the coefficient buffer. */
887
3.60k
  if (need_full_buffer) {
888
2.13k
#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.13k
    int ci, access_rows;
893
2.13k
    jpeg_component_info *compptr;
894
895
8.49k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
6.36k
         ci++, compptr++) {
897
6.36k
      access_rows = compptr->v_samp_factor;
898
6.36k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
6.36k
      if (cinfo->progressive_mode)
901
6.33k
        access_rows *= 5;
902
6.36k
#endif
903
6.36k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
6.36k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
6.36k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
6.36k
                               (long)compptr->h_samp_factor),
907
6.36k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
6.36k
                               (long)compptr->v_samp_factor),
909
6.36k
         (JDIMENSION)access_rows);
910
6.36k
    }
911
2.13k
    coef->pub.consume_data = consume_data;
912
2.13k
    coef->pub._decompress_data = decompress_data;
913
2.13k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.13k
  } 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.1k
    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
3.60k
  coef->workspace = (JCOEF *)
935
3.60k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
3.60k
                                sizeof(JCOEF) * DCTSIZE2);
937
3.60k
}
j12init_d_coef_controller
Line
Count
Source
869
332
{
870
332
  my_coef_ptr coef;
871
872
332
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
332
  coef = (my_coef_ptr)
876
332
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
332
                                sizeof(my_coef_controller));
878
332
  memset(coef, 0, sizeof(my_coef_controller));
879
332
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
332
  coef->pub.start_input_pass = start_input_pass;
881
332
  coef->pub.start_output_pass = start_output_pass;
882
332
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
332
  coef->coef_bits_latch = NULL;
884
332
#endif
885
886
  /* Create the coefficient buffer. */
887
332
  if (need_full_buffer) {
888
309
#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
309
    int ci, access_rows;
893
309
    jpeg_component_info *compptr;
894
895
1.24k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
936
         ci++, compptr++) {
897
936
      access_rows = compptr->v_samp_factor;
898
936
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
936
      if (cinfo->progressive_mode)
901
798
        access_rows *= 5;
902
936
#endif
903
936
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
936
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
936
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
936
                               (long)compptr->h_samp_factor),
907
936
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
936
                               (long)compptr->v_samp_factor),
909
936
         (JDIMENSION)access_rows);
910
936
    }
911
309
    coef->pub.consume_data = consume_data;
912
309
    coef->pub._decompress_data = decompress_data;
913
309
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
309
  } else {
918
    /* We only need a single-MCU buffer. */
919
23
    JBLOCKROW buffer;
920
23
    int i;
921
922
23
    buffer = (JBLOCKROW)
923
23
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
23
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
253
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
230
      coef->MCU_buffer[i] = buffer + i;
927
230
    }
928
23
    coef->pub.consume_data = dummy_consume_data;
929
23
    coef->pub._decompress_data = decompress_onepass;
930
23
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
23
  }
932
933
  /* Allocate the workspace buffer */
934
332
  coef->workspace = (JCOEF *)
935
332
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
332
                                sizeof(JCOEF) * DCTSIZE2);
937
332
}