Coverage Report

Created: 2026-10-17 06:57

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
6.58k
{
51
6.58k
  cinfo->input_iMCU_row = 0;
52
6.58k
  start_iMCU_row(cinfo);
53
6.58k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
50
5.61k
{
51
5.61k
  cinfo->input_iMCU_row = 0;
52
5.61k
  start_iMCU_row(cinfo);
53
5.61k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
50
966
{
51
966
  cinfo->input_iMCU_row = 0;
52
966
  start_iMCU_row(cinfo);
53
966
}
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.39k
{
63
2.39k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
2.39k
  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.39k
  if (coef->pub.coef_arrays != NULL) {
68
765
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
544
      coef->pub._decompress_data = decompress_smooth_data;
70
221
    else
71
221
      coef->pub._decompress_data = decompress_data;
72
765
  }
73
2.39k
#endif
74
2.39k
  cinfo->output_iMCU_row = 0;
75
2.39k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
62
2.32k
{
63
2.32k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
2.32k
  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.32k
  if (coef->pub.coef_arrays != NULL) {
68
703
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
524
      coef->pub._decompress_data = decompress_smooth_data;
70
179
    else
71
179
      coef->pub._decompress_data = decompress_data;
72
703
  }
73
2.32k
#endif
74
2.32k
  cinfo->output_iMCU_row = 0;
75
2.32k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
62
72
{
63
72
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
72
  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
72
  if (coef->pub.coef_arrays != NULL) {
68
62
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
20
      coef->pub._decompress_data = decompress_smooth_data;
70
42
    else
71
42
      coef->pub._decompress_data = decompress_data;
72
62
  }
73
72
#endif
74
72
  cinfo->output_iMCU_row = 0;
75
72
}
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
48.0k
{
91
48.0k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
48.0k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
48.0k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
48.0k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
48.0k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
48.0k
  _JSAMPARRAY output_ptr;
97
48.0k
  JDIMENSION start_col, output_col;
98
48.0k
  jpeg_component_info *compptr;
99
48.0k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
102k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
54.8k
       yoffset++) {
104
1.43M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
1.38M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
1.38M
      jzero_far((void *)coef->MCU_buffer[0],
108
1.38M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
1.38M
      if (!cinfo->entropy->insufficient_data)
110
1.38M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
1.38M
      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.38M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
1.37M
          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.37M
        blkn = 0;               /* index of current DCT block within MCU */
142
3.35M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
1.98M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
1.98M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
1.98M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
1.98M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
1.86M
                         compptr->MCU_width : compptr->last_col_width;
152
1.98M
          output_ptr = output_buf[compptr->component_index] +
153
1.98M
                       yoffset * compptr->_DCT_scaled_size;
154
1.98M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
1.98M
                      compptr->MCU_sample_width;
156
4.19M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
2.21M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
2.02M
                yoffset + yindex < compptr->last_row_height) {
159
2.02M
              output_col = start_col;
160
4.23M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
2.21M
                (*inverse_DCT) (cinfo, compptr,
165
2.21M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
2.21M
                                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.21M
                output_col += compptr->_DCT_scaled_size;
173
2.21M
              }
174
2.02M
            }
175
2.21M
            blkn += compptr->MCU_width;
176
2.21M
            output_ptr += compptr->_DCT_scaled_size;
177
2.21M
          }
178
1.98M
        }
179
1.37M
      }
180
1.38M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
54.8k
    coef->MCU_ctr = 0;
183
54.8k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
48.0k
  cinfo->output_iMCU_row++;
186
48.0k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
46.4k
    start_iMCU_row(cinfo);
188
46.4k
    return JPEG_ROW_COMPLETED;
189
46.4k
  }
190
  /* Completed the scan */
191
1.62k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
1.62k
  return JPEG_SCAN_COMPLETED;
193
48.0k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
90
48.0k
{
91
48.0k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
48.0k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
48.0k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
48.0k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
48.0k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
48.0k
  _JSAMPARRAY output_ptr;
97
48.0k
  JDIMENSION start_col, output_col;
98
48.0k
  jpeg_component_info *compptr;
99
48.0k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
102k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
54.8k
       yoffset++) {
104
1.43M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
1.38M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
1.38M
      jzero_far((void *)coef->MCU_buffer[0],
108
1.38M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
1.38M
      if (!cinfo->entropy->insufficient_data)
110
1.38M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
1.38M
      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.38M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
1.37M
          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.37M
        blkn = 0;               /* index of current DCT block within MCU */
142
3.35M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
1.98M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
1.98M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
1.98M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
1.98M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
1.86M
                         compptr->MCU_width : compptr->last_col_width;
152
1.98M
          output_ptr = output_buf[compptr->component_index] +
153
1.98M
                       yoffset * compptr->_DCT_scaled_size;
154
1.98M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
1.98M
                      compptr->MCU_sample_width;
156
4.19M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
2.21M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
2.02M
                yoffset + yindex < compptr->last_row_height) {
159
2.02M
              output_col = start_col;
160
4.23M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
2.21M
                (*inverse_DCT) (cinfo, compptr,
165
2.21M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
2.21M
                                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.21M
                output_col += compptr->_DCT_scaled_size;
173
2.21M
              }
174
2.02M
            }
175
2.21M
            blkn += compptr->MCU_width;
176
2.21M
            output_ptr += compptr->_DCT_scaled_size;
177
2.21M
          }
178
1.98M
        }
179
1.37M
      }
180
1.38M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
54.8k
    coef->MCU_ctr = 0;
183
54.8k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
48.0k
  cinfo->output_iMCU_row++;
186
48.0k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
46.4k
    start_iMCU_row(cinfo);
188
46.4k
    return JPEG_ROW_COMPLETED;
189
46.4k
  }
190
  /* Completed the scan */
191
1.62k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
1.62k
  return JPEG_SCAN_COMPLETED;
193
48.0k
}
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
87.2k
{
219
87.2k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
87.2k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
87.2k
  int blkn, ci, xindex, yindex, yoffset;
222
87.2k
  JDIMENSION start_col;
223
87.2k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
87.2k
  JBLOCKROW buffer_ptr;
225
87.2k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
279k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
192k
    compptr = cinfo->cur_comp_info[ci];
230
192k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
192k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
192k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
192k
       (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
192k
  }
239
240
  /* Loop to process one whole iMCU row */
241
191k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
104k
       yoffset++) {
243
3.52M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
3.42M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
3.42M
      blkn = 0;                 /* index of current DCT block within MCU */
247
9.01M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
5.59M
        compptr = cinfo->cur_comp_info[ci];
249
5.59M
        start_col = MCU_col_num * compptr->MCU_width;
250
12.2M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
6.65M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
14.5M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
7.88M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
7.88M
          }
255
6.65M
        }
256
5.59M
      }
257
3.42M
      if (!cinfo->entropy->insufficient_data)
258
3.42M
        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
3.42M
      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
3.42M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
104k
    coef->MCU_ctr = 0;
282
104k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
87.2k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
82.3k
    start_iMCU_row(cinfo);
286
82.3k
    return JPEG_ROW_COMPLETED;
287
82.3k
  }
288
  /* Completed the scan */
289
4.95k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
4.95k
  return JPEG_SCAN_COMPLETED;
291
87.2k
}
jdcoefct-8.c:consume_data
Line
Count
Source
218
78.3k
{
219
78.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
78.3k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
78.3k
  int blkn, ci, xindex, yindex, yoffset;
222
78.3k
  JDIMENSION start_col;
223
78.3k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
78.3k
  JBLOCKROW buffer_ptr;
225
78.3k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
253k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
175k
    compptr = cinfo->cur_comp_info[ci];
230
175k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
175k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
175k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
175k
       (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
175k
  }
239
240
  /* Loop to process one whole iMCU row */
241
171k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
92.7k
       yoffset++) {
243
2.47M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
2.37M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
2.37M
      blkn = 0;                 /* index of current DCT block within MCU */
247
6.44M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
4.06M
        compptr = cinfo->cur_comp_info[ci];
249
4.06M
        start_col = MCU_col_num * compptr->MCU_width;
250
8.86M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
4.80M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
10.4M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
5.66M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
5.66M
          }
255
4.80M
        }
256
4.06M
      }
257
2.37M
      if (!cinfo->entropy->insufficient_data)
258
2.37M
        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
2.37M
      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
2.37M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
92.7k
    coef->MCU_ctr = 0;
282
92.7k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
78.3k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
74.3k
    start_iMCU_row(cinfo);
286
74.3k
    return JPEG_ROW_COMPLETED;
287
74.3k
  }
288
  /* Completed the scan */
289
3.99k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
3.99k
  return JPEG_SCAN_COMPLETED;
291
78.3k
}
jdcoefct-12.c:consume_data
Line
Count
Source
218
8.96k
{
219
8.96k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
8.96k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
8.96k
  int blkn, ci, xindex, yindex, yoffset;
222
8.96k
  JDIMENSION start_col;
223
8.96k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
8.96k
  JBLOCKROW buffer_ptr;
225
8.96k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
26.1k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
17.2k
    compptr = cinfo->cur_comp_info[ci];
230
17.2k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
17.2k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
17.2k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
17.2k
       (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
17.2k
  }
239
240
  /* Loop to process one whole iMCU row */
241
20.3k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
11.4k
       yoffset++) {
243
1.05M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
1.04M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
1.04M
      blkn = 0;                 /* index of current DCT block within MCU */
247
2.56M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
1.52M
        compptr = cinfo->cur_comp_info[ci];
249
1.52M
        start_col = MCU_col_num * compptr->MCU_width;
250
3.38M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
1.85M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
4.08M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
2.22M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
2.22M
          }
255
1.85M
        }
256
1.52M
      }
257
1.04M
      if (!cinfo->entropy->insufficient_data)
258
1.04M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
259
      /* Try to fetch the MCU. */
260
#ifdef WITH_PROFILE
261
      cinfo->master->start = getTime();
262
#endif
263
1.04M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
264
        /* Suspension forced; update state counters and exit */
265
0
        coef->MCU_vert_offset = yoffset;
266
0
        coef->MCU_ctr = MCU_col_num;
267
#ifdef WITH_PROFILE
268
        cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
269
        cinfo->master->entropy_mcoeffs +=
270
          (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
271
#endif
272
0
        return JPEG_SUSPENDED;
273
0
      }
274
#ifdef WITH_PROFILE
275
      cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
276
      cinfo->master->entropy_mcoeffs +=
277
        (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
278
#endif
279
1.04M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
11.4k
    coef->MCU_ctr = 0;
282
11.4k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
8.96k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
8.00k
    start_iMCU_row(cinfo);
286
8.00k
    return JPEG_ROW_COMPLETED;
287
8.00k
  }
288
  /* Completed the scan */
289
956
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
956
  return JPEG_SCAN_COMPLETED;
291
8.96k
}
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
13.3k
{
305
13.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
13.3k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
13.3k
  JDIMENSION block_num;
308
13.3k
  int ci, block_row, block_rows;
309
13.3k
  JBLOCKARRAY buffer;
310
13.3k
  JBLOCKROW buffer_ptr;
311
13.3k
  _JSAMPARRAY output_ptr;
312
13.3k
  JDIMENSION output_col;
313
13.3k
  jpeg_component_info *compptr;
314
13.3k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
13.3k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
13.3k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
13.3k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
320
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
321
0
      return JPEG_SUSPENDED;
322
0
  }
323
324
  /* OK, output from the virtual arrays. */
325
53.6k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
40.3k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
40.3k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
40.3k
    buffer = (*cinfo->mem->access_virt_barray)
332
40.3k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
40.3k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
40.3k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
40.3k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
39.7k
      block_rows = compptr->v_samp_factor;
338
570
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
570
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
570
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
570
    }
343
40.3k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
40.3k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
99.0k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
58.6k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
58.6k
      output_col = 0;
349
58.6k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
608k
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
550k
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
550k
                        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
550k
        buffer_ptr++;
361
550k
        output_col += compptr->_DCT_scaled_size;
362
550k
      }
363
58.6k
      output_ptr += compptr->_DCT_scaled_size;
364
58.6k
    }
365
40.3k
  }
366
367
13.3k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
13.1k
    return JPEG_ROW_COMPLETED;
369
179
  return JPEG_SCAN_COMPLETED;
370
13.3k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
304
13.3k
{
305
13.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
13.3k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
13.3k
  JDIMENSION block_num;
308
13.3k
  int ci, block_row, block_rows;
309
13.3k
  JBLOCKARRAY buffer;
310
13.3k
  JBLOCKROW buffer_ptr;
311
13.3k
  _JSAMPARRAY output_ptr;
312
13.3k
  JDIMENSION output_col;
313
13.3k
  jpeg_component_info *compptr;
314
13.3k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
13.3k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
13.3k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
13.3k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
320
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
321
0
      return JPEG_SUSPENDED;
322
0
  }
323
324
  /* OK, output from the virtual arrays. */
325
53.6k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
40.3k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
40.3k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
40.3k
    buffer = (*cinfo->mem->access_virt_barray)
332
40.3k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
40.3k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
40.3k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
40.3k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
39.7k
      block_rows = compptr->v_samp_factor;
338
570
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
570
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
570
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
570
    }
343
40.3k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
40.3k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
99.0k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
58.6k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
58.6k
      output_col = 0;
349
58.6k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
608k
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
550k
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
550k
                        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
550k
        buffer_ptr++;
361
550k
        output_col += compptr->_DCT_scaled_size;
362
550k
      }
363
58.6k
      output_ptr += compptr->_DCT_scaled_size;
364
58.6k
    }
365
40.3k
  }
366
367
13.3k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
13.1k
    return JPEG_ROW_COMPLETED;
369
179
  return JPEG_SCAN_COMPLETED;
370
13.3k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_data
371
372
#endif /* D_MULTISCAN_FILES_SUPPORTED */
373
374
375
#ifdef BLOCK_SMOOTHING_SUPPORTED
376
377
/*
378
 * This code applies interblock smoothing; the first 9 AC coefficients are
379
 * estimated from the DC values of a DCT block and its 24 neighboring blocks.
380
 * We apply smoothing only for progressive JPEG decoding, and only if
381
 * the coefficients it can estimate are not yet known to full precision.
382
 */
383
384
/* Natural-order array positions of the first 9 zigzag-order coefficients */
385
67.7k
#define Q01_POS  1
386
67.7k
#define Q10_POS  8
387
67.7k
#define Q20_POS  16
388
67.7k
#define Q11_POS  9
389
67.7k
#define Q02_POS  2
390
58.1k
#define Q03_POS  3
391
58.0k
#define Q12_POS  10
392
58.0k
#define Q21_POS  17
393
58.0k
#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
765
{
406
765
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
765
  boolean smoothing_useful = FALSE;
408
765
  int ci, coefi;
409
765
  jpeg_component_info *compptr;
410
765
  JQUANT_TBL *qtable;
411
765
  int *coef_bits, *prev_coef_bits;
412
765
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
765
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
2
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
763
  if (coef->coef_bits_latch == NULL)
419
763
    coef->coef_bits_latch = (int *)
420
763
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
763
                                  cinfo->num_components * 2 *
422
763
                                  (SAVED_COEFS * sizeof(int)));
423
763
  coef_bits_latch = coef->coef_bits_latch;
424
763
  prev_coef_bits_latch =
425
763
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
2.52k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
1.97k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
1.97k
    if ((qtable = compptr->quant_table) == NULL)
431
8
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
1.96k
    if (qtable->quantval[0] == 0 ||
434
1.92k
        qtable->quantval[Q01_POS] == 0 ||
435
1.91k
        qtable->quantval[Q10_POS] == 0 ||
436
1.90k
        qtable->quantval[Q20_POS] == 0 ||
437
1.89k
        qtable->quantval[Q11_POS] == 0 ||
438
1.84k
        qtable->quantval[Q02_POS] == 0 ||
439
1.83k
        qtable->quantval[Q03_POS] == 0 ||
440
1.82k
        qtable->quantval[Q12_POS] == 0 ||
441
1.81k
        qtable->quantval[Q21_POS] == 0 ||
442
1.77k
        qtable->quantval[Q30_POS] == 0)
443
206
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
1.75k
    coef_bits = cinfo->coef_bits[ci];
446
1.75k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
1.75k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
1.75k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
17.5k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
15.8k
      if (cinfo->input_scan_number > 1)
453
8.61k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
7.21k
      else
455
7.21k
        prev_coef_bits_latch[coefi] = -1;
456
15.8k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
15.8k
      if (coef_bits[coefi] != 0)
458
15.3k
        smoothing_useful = TRUE;
459
15.8k
    }
460
1.75k
    coef_bits_latch += SAVED_COEFS;
461
1.75k
    prev_coef_bits_latch += SAVED_COEFS;
462
1.75k
  }
463
464
549
  return smoothing_useful;
465
763
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
405
703
{
406
703
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
703
  boolean smoothing_useful = FALSE;
408
703
  int ci, coefi;
409
703
  jpeg_component_info *compptr;
410
703
  JQUANT_TBL *qtable;
411
703
  int *coef_bits, *prev_coef_bits;
412
703
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
703
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
1
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
702
  if (coef->coef_bits_latch == NULL)
419
702
    coef->coef_bits_latch = (int *)
420
702
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
702
                                  cinfo->num_components * 2 *
422
702
                                  (SAVED_COEFS * sizeof(int)));
423
702
  coef_bits_latch = coef->coef_bits_latch;
424
702
  prev_coef_bits_latch =
425
702
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
2.38k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
1.85k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
1.85k
    if ((qtable = compptr->quant_table) == NULL)
431
6
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
1.84k
    if (qtable->quantval[0] == 0 ||
434
1.80k
        qtable->quantval[Q01_POS] == 0 ||
435
1.80k
        qtable->quantval[Q10_POS] == 0 ||
436
1.79k
        qtable->quantval[Q20_POS] == 0 ||
437
1.79k
        qtable->quantval[Q11_POS] == 0 ||
438
1.74k
        qtable->quantval[Q02_POS] == 0 ||
439
1.74k
        qtable->quantval[Q03_POS] == 0 ||
440
1.73k
        qtable->quantval[Q12_POS] == 0 ||
441
1.72k
        qtable->quantval[Q21_POS] == 0 ||
442
1.69k
        qtable->quantval[Q30_POS] == 0)
443
168
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
1.67k
    coef_bits = cinfo->coef_bits[ci];
446
1.67k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
1.67k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
1.67k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
16.7k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
15.1k
      if (cinfo->input_scan_number > 1)
453
8.30k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
6.80k
      else
455
6.80k
        prev_coef_bits_latch[coefi] = -1;
456
15.1k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
15.1k
      if (coef_bits[coefi] != 0)
458
14.7k
        smoothing_useful = TRUE;
459
15.1k
    }
460
1.67k
    coef_bits_latch += SAVED_COEFS;
461
1.67k
    prev_coef_bits_latch += SAVED_COEFS;
462
1.67k
  }
463
464
528
  return smoothing_useful;
465
702
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
405
62
{
406
62
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
62
  boolean smoothing_useful = FALSE;
408
62
  int ci, coefi;
409
62
  jpeg_component_info *compptr;
410
62
  JQUANT_TBL *qtable;
411
62
  int *coef_bits, *prev_coef_bits;
412
62
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
62
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
1
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
61
  if (coef->coef_bits_latch == NULL)
419
61
    coef->coef_bits_latch = (int *)
420
61
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
61
                                  cinfo->num_components * 2 *
422
61
                                  (SAVED_COEFS * sizeof(int)));
423
61
  coef_bits_latch = coef->coef_bits_latch;
424
61
  prev_coef_bits_latch =
425
61
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
141
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
120
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
120
    if ((qtable = compptr->quant_table) == NULL)
431
2
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
118
    if (qtable->quantval[0] == 0 ||
434
114
        qtable->quantval[Q01_POS] == 0 ||
435
110
        qtable->quantval[Q10_POS] == 0 ||
436
104
        qtable->quantval[Q20_POS] == 0 ||
437
101
        qtable->quantval[Q11_POS] == 0 ||
438
98
        qtable->quantval[Q02_POS] == 0 ||
439
95
        qtable->quantval[Q03_POS] == 0 ||
440
92
        qtable->quantval[Q12_POS] == 0 ||
441
88
        qtable->quantval[Q21_POS] == 0 ||
442
85
        qtable->quantval[Q30_POS] == 0)
443
38
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
80
    coef_bits = cinfo->coef_bits[ci];
446
80
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
80
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
80
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
800
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
720
      if (cinfo->input_scan_number > 1)
453
306
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
414
      else
455
414
        prev_coef_bits_latch[coefi] = -1;
456
720
      coef_bits_latch[coefi] = coef_bits[coefi];
457
720
      if (coef_bits[coefi] != 0)
458
657
        smoothing_useful = TRUE;
459
720
    }
460
80
    coef_bits_latch += SAVED_COEFS;
461
80
    prev_coef_bits_latch += SAVED_COEFS;
462
80
  }
463
464
21
  return smoothing_useful;
465
61
}
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
21.9k
{
475
21.9k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
21.9k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
21.9k
  JDIMENSION block_num, last_block_column;
478
21.9k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
21.9k
    image_block_rows;
480
21.9k
  JBLOCKARRAY buffer;
481
21.9k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
21.9k
  JBLOCKROW next_block_row, next_next_block_row;
483
21.9k
  _JSAMPARRAY output_ptr;
484
21.9k
  JDIMENSION output_col;
485
21.9k
  jpeg_component_info *compptr;
486
21.9k
  _inverse_DCT_method_ptr inverse_DCT;
487
21.9k
  boolean change_dc;
488
21.9k
  JCOEF *workspace;
489
21.9k
  int *coef_bits;
490
21.9k
  JQUANT_TBL *quanttbl;
491
21.9k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
21.9k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
21.9k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
21.9k
      DC25;
495
21.9k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
21.9k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
21.9k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
21.9k
         !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
87.8k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
65.8k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
65.8k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
65.8k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
62.8k
      block_rows = compptr->v_samp_factor;
526
62.8k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
62.8k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
1.45k
      block_rows = compptr->v_samp_factor;
529
1.45k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
1.57k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
1.57k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
1.57k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
1.57k
      access_rows = block_rows; /* this iMCU row only */
535
1.57k
    }
536
    /* Align the virtual buffer for this component. */
537
65.8k
    if (cinfo->output_iMCU_row > 1) {
538
62.8k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
62.8k
      buffer = (*cinfo->mem->access_virt_barray)
540
62.8k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
62.8k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
62.8k
         (JDIMENSION)access_rows, FALSE);
543
62.8k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
62.8k
    } else if (cinfo->output_iMCU_row > 0) {
545
1.45k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
1.45k
      buffer = (*cinfo->mem->access_virt_barray)
547
1.45k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
1.45k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
1.45k
         (JDIMENSION)access_rows, FALSE);
550
1.45k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
1.57k
    } else {
552
1.57k
      buffer = (*cinfo->mem->access_virt_barray)
553
1.57k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
1.57k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
1.57k
    }
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
65.8k
    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
65.8k
    else
564
65.8k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
65.8k
    change_dc =
568
65.8k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
58.4k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
57.3k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
65.8k
    quanttbl = compptr->quant_table;
573
65.8k
    Q00 = quanttbl->quantval[0];
574
65.8k
    Q01 = quanttbl->quantval[Q01_POS];
575
65.8k
    Q10 = quanttbl->quantval[Q10_POS];
576
65.8k
    Q20 = quanttbl->quantval[Q20_POS];
577
65.8k
    Q11 = quanttbl->quantval[Q11_POS];
578
65.8k
    Q02 = quanttbl->quantval[Q02_POS];
579
65.8k
    if (change_dc) {
580
56.2k
      Q03 = quanttbl->quantval[Q03_POS];
581
56.2k
      Q12 = quanttbl->quantval[Q12_POS];
582
56.2k
      Q21 = quanttbl->quantval[Q21_POS];
583
56.2k
      Q30 = quanttbl->quantval[Q30_POS];
584
56.2k
    }
585
65.8k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
65.8k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
65.8k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
155k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
89.7k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
89.7k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
89.7k
      if (image_block_row > 0)
594
88.1k
        prev_block_row =
595
88.1k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
1.57k
      else
597
1.57k
        prev_block_row = buffer_ptr;
598
599
89.7k
      if (image_block_row > 1)
600
86.6k
        prev_prev_block_row =
601
86.6k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
3.04k
      else
603
3.04k
        prev_prev_block_row = prev_block_row;
604
605
89.7k
      if (image_block_row < image_block_rows - 1)
606
88.1k
        next_block_row =
607
88.1k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
1.57k
      else
609
1.57k
        next_block_row = buffer_ptr;
610
611
89.7k
      if (image_block_row < image_block_rows - 2)
612
86.9k
        next_next_block_row =
613
86.9k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
2.80k
      else
615
2.80k
        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
89.7k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
89.7k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
89.7k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
89.7k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
89.7k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
89.7k
      output_col = 0;
626
89.7k
      last_block_column = compptr->width_in_blocks - 1;
627
89.7k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
1.51M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
1.42M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
1.42M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
89.7k
            block_num < last_block_column) {
634
56.3k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
56.3k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
56.3k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
56.3k
          DC19 = DC20 = (int)next_block_row[1][0];
638
56.3k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
56.3k
        }
640
1.42M
        if (block_num + 1 < last_block_column) {
641
1.27M
          DC05 = (int)prev_prev_block_row[2][0];
642
1.27M
          DC10 = (int)prev_block_row[2][0];
643
1.27M
          DC15 = (int)buffer_ptr[2][0];
644
1.27M
          DC20 = (int)next_block_row[2][0];
645
1.27M
          DC25 = (int)next_next_block_row[2][0];
646
1.27M
        }
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
1.42M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
1.38M
          num = Q00 * (change_dc ?
660
1.17M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
1.17M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
1.17M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
1.17M
                 DC21 - DC22 + DC24 + DC25) :
664
1.38M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
1.38M
          if (num >= 0) {
666
886k
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
886k
            if (Al > 0 && pred >= (1 << Al))
668
22.2k
              pred = (1 << Al) - 1;
669
886k
          } else {
670
499k
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
499k
            if (Al > 0 && pred >= (1 << Al))
672
26.2k
              pred = (1 << Al) - 1;
673
499k
            pred = -pred;
674
499k
          }
675
1.38M
          workspace[1] = (JCOEF)pred;
676
1.38M
        }
677
        /* AC10 */
678
1.42M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
1.34M
          num = Q00 * (change_dc ?
680
1.17M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
1.17M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
1.17M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
1.17M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
1.34M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
1.34M
          if (num >= 0) {
686
888k
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
888k
            if (Al > 0 && pred >= (1 << Al))
688
30.8k
              pred = (1 << Al) - 1;
689
888k
          } else {
690
459k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
459k
            if (Al > 0 && pred >= (1 << Al))
692
37.1k
              pred = (1 << Al) - 1;
693
459k
            pred = -pred;
694
459k
          }
695
1.34M
          workspace[8] = (JCOEF)pred;
696
1.34M
        }
697
        /* AC20 */
698
1.42M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
1.36M
          num = Q00 * (change_dc ?
700
1.17M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
1.17M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
1.36M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
1.36M
          if (num >= 0) {
704
794k
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
794k
            if (Al > 0 && pred >= (1 << Al))
706
41.6k
              pred = (1 << Al) - 1;
707
794k
          } else {
708
565k
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
565k
            if (Al > 0 && pred >= (1 << Al))
710
40.3k
              pred = (1 << Al) - 1;
711
565k
            pred = -pred;
712
565k
          }
713
1.36M
          workspace[16] = (JCOEF)pred;
714
1.36M
        }
715
        /* AC11 */
716
1.42M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
1.36M
          num = Q00 * (change_dc ?
718
1.17M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
1.17M
                 9 * DC19 + DC21 - DC25) :
720
1.36M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
191k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
1.36M
          if (num >= 0) {
723
925k
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
925k
            if (Al > 0 && pred >= (1 << Al))
725
19.1k
              pred = (1 << Al) - 1;
726
925k
          } else {
727
437k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
437k
            if (Al > 0 && pred >= (1 << Al))
729
19.0k
              pred = (1 << Al) - 1;
730
437k
            pred = -pred;
731
437k
          }
732
1.36M
          workspace[9] = (JCOEF)pred;
733
1.36M
        }
734
        /* AC02 */
735
1.42M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
1.35M
          num = Q00 * (change_dc ?
737
1.17M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
1.17M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
1.35M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
1.35M
          if (num >= 0) {
741
813k
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
813k
            if (Al > 0 && pred >= (1 << Al))
743
22.4k
              pred = (1 << Al) - 1;
744
813k
          } else {
745
544k
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
544k
            if (Al > 0 && pred >= (1 << Al))
747
22.5k
              pred = (1 << Al) - 1;
748
544k
            pred = -pred;
749
544k
          }
750
1.35M
          workspace[2] = (JCOEF)pred;
751
1.35M
        }
752
1.42M
        if (change_dc) {
753
          /* AC03 */
754
1.17M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
1.17M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
1.17M
            if (num >= 0) {
757
805k
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
805k
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
805k
            } else {
761
365k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
365k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
365k
              pred = -pred;
765
365k
            }
766
1.17M
            workspace[3] = (JCOEF)pred;
767
1.17M
          }
768
          /* AC12 */
769
1.17M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
1.17M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
1.17M
            if (num >= 0) {
772
644k
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
644k
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
644k
            } else {
776
526k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
526k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
526k
              pred = -pred;
780
526k
            }
781
1.17M
            workspace[10] = (JCOEF)pred;
782
1.17M
          }
783
          /* AC21 */
784
1.17M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
1.17M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
1.17M
            if (num >= 0) {
787
680k
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
680k
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
680k
            } else {
791
490k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
490k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
490k
              pred = -pred;
795
490k
            }
796
1.17M
            workspace[17] = (JCOEF)pred;
797
1.17M
          }
798
          /* AC30 */
799
1.17M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
1.17M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
1.17M
            if (num >= 0) {
802
817k
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
817k
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
817k
            } else {
806
353k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
353k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
353k
              pred = -pred;
810
353k
            }
811
1.17M
            workspace[24] = (JCOEF)pred;
812
1.17M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
1.17M
          num = Q00 *
817
1.17M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
1.17M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
1.17M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
1.17M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
1.17M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
1.17M
          if (num >= 0) {
823
508k
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
662k
          } else {
825
662k
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
662k
            pred = -pred;
827
662k
          }
828
1.17M
          workspace[0] = (JCOEF)pred;
829
1.17M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
1.42M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
1.42M
                        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
1.42M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
1.42M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
1.42M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
1.42M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
1.42M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
1.42M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
1.42M
          prev_prev_block_row++, next_next_block_row++;
849
1.42M
        output_col += compptr->_DCT_scaled_size;
850
1.42M
      }
851
89.7k
      output_ptr += compptr->_DCT_scaled_size;
852
89.7k
    }
853
65.8k
  }
854
855
21.9k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
21.4k
    return JPEG_ROW_COMPLETED;
857
524
  return JPEG_SCAN_COMPLETED;
858
21.9k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
474
21.9k
{
475
21.9k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
21.9k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
21.9k
  JDIMENSION block_num, last_block_column;
478
21.9k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
21.9k
    image_block_rows;
480
21.9k
  JBLOCKARRAY buffer;
481
21.9k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
21.9k
  JBLOCKROW next_block_row, next_next_block_row;
483
21.9k
  _JSAMPARRAY output_ptr;
484
21.9k
  JDIMENSION output_col;
485
21.9k
  jpeg_component_info *compptr;
486
21.9k
  _inverse_DCT_method_ptr inverse_DCT;
487
21.9k
  boolean change_dc;
488
21.9k
  JCOEF *workspace;
489
21.9k
  int *coef_bits;
490
21.9k
  JQUANT_TBL *quanttbl;
491
21.9k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
21.9k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
21.9k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
21.9k
      DC25;
495
21.9k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
21.9k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
21.9k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
21.9k
         !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
87.8k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
65.8k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
65.8k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
65.8k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
62.8k
      block_rows = compptr->v_samp_factor;
526
62.8k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
62.8k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
1.45k
      block_rows = compptr->v_samp_factor;
529
1.45k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
1.57k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
1.57k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
1.57k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
1.57k
      access_rows = block_rows; /* this iMCU row only */
535
1.57k
    }
536
    /* Align the virtual buffer for this component. */
537
65.8k
    if (cinfo->output_iMCU_row > 1) {
538
62.8k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
62.8k
      buffer = (*cinfo->mem->access_virt_barray)
540
62.8k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
62.8k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
62.8k
         (JDIMENSION)access_rows, FALSE);
543
62.8k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
62.8k
    } else if (cinfo->output_iMCU_row > 0) {
545
1.45k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
1.45k
      buffer = (*cinfo->mem->access_virt_barray)
547
1.45k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
1.45k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
1.45k
         (JDIMENSION)access_rows, FALSE);
550
1.45k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
1.57k
    } else {
552
1.57k
      buffer = (*cinfo->mem->access_virt_barray)
553
1.57k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
1.57k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
1.57k
    }
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
65.8k
    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
65.8k
    else
564
65.8k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
65.8k
    change_dc =
568
65.8k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
58.4k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
57.3k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
65.8k
    quanttbl = compptr->quant_table;
573
65.8k
    Q00 = quanttbl->quantval[0];
574
65.8k
    Q01 = quanttbl->quantval[Q01_POS];
575
65.8k
    Q10 = quanttbl->quantval[Q10_POS];
576
65.8k
    Q20 = quanttbl->quantval[Q20_POS];
577
65.8k
    Q11 = quanttbl->quantval[Q11_POS];
578
65.8k
    Q02 = quanttbl->quantval[Q02_POS];
579
65.8k
    if (change_dc) {
580
56.2k
      Q03 = quanttbl->quantval[Q03_POS];
581
56.2k
      Q12 = quanttbl->quantval[Q12_POS];
582
56.2k
      Q21 = quanttbl->quantval[Q21_POS];
583
56.2k
      Q30 = quanttbl->quantval[Q30_POS];
584
56.2k
    }
585
65.8k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
65.8k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
65.8k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
155k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
89.7k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
89.7k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
89.7k
      if (image_block_row > 0)
594
88.1k
        prev_block_row =
595
88.1k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
1.57k
      else
597
1.57k
        prev_block_row = buffer_ptr;
598
599
89.7k
      if (image_block_row > 1)
600
86.6k
        prev_prev_block_row =
601
86.6k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
3.04k
      else
603
3.04k
        prev_prev_block_row = prev_block_row;
604
605
89.7k
      if (image_block_row < image_block_rows - 1)
606
88.1k
        next_block_row =
607
88.1k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
1.57k
      else
609
1.57k
        next_block_row = buffer_ptr;
610
611
89.7k
      if (image_block_row < image_block_rows - 2)
612
86.9k
        next_next_block_row =
613
86.9k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
2.80k
      else
615
2.80k
        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
89.7k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
89.7k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
89.7k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
89.7k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
89.7k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
89.7k
      output_col = 0;
626
89.7k
      last_block_column = compptr->width_in_blocks - 1;
627
89.7k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
1.51M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
1.42M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
1.42M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
89.7k
            block_num < last_block_column) {
634
56.3k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
56.3k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
56.3k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
56.3k
          DC19 = DC20 = (int)next_block_row[1][0];
638
56.3k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
56.3k
        }
640
1.42M
        if (block_num + 1 < last_block_column) {
641
1.27M
          DC05 = (int)prev_prev_block_row[2][0];
642
1.27M
          DC10 = (int)prev_block_row[2][0];
643
1.27M
          DC15 = (int)buffer_ptr[2][0];
644
1.27M
          DC20 = (int)next_block_row[2][0];
645
1.27M
          DC25 = (int)next_next_block_row[2][0];
646
1.27M
        }
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
1.42M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
1.38M
          num = Q00 * (change_dc ?
660
1.17M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
1.17M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
1.17M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
1.17M
                 DC21 - DC22 + DC24 + DC25) :
664
1.38M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
1.38M
          if (num >= 0) {
666
886k
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
886k
            if (Al > 0 && pred >= (1 << Al))
668
22.2k
              pred = (1 << Al) - 1;
669
886k
          } else {
670
499k
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
499k
            if (Al > 0 && pred >= (1 << Al))
672
26.2k
              pred = (1 << Al) - 1;
673
499k
            pred = -pred;
674
499k
          }
675
1.38M
          workspace[1] = (JCOEF)pred;
676
1.38M
        }
677
        /* AC10 */
678
1.42M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
1.34M
          num = Q00 * (change_dc ?
680
1.17M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
1.17M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
1.17M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
1.17M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
1.34M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
1.34M
          if (num >= 0) {
686
888k
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
888k
            if (Al > 0 && pred >= (1 << Al))
688
30.8k
              pred = (1 << Al) - 1;
689
888k
          } else {
690
459k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
459k
            if (Al > 0 && pred >= (1 << Al))
692
37.1k
              pred = (1 << Al) - 1;
693
459k
            pred = -pred;
694
459k
          }
695
1.34M
          workspace[8] = (JCOEF)pred;
696
1.34M
        }
697
        /* AC20 */
698
1.42M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
1.36M
          num = Q00 * (change_dc ?
700
1.17M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
1.17M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
1.36M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
1.36M
          if (num >= 0) {
704
794k
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
794k
            if (Al > 0 && pred >= (1 << Al))
706
41.6k
              pred = (1 << Al) - 1;
707
794k
          } else {
708
565k
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
565k
            if (Al > 0 && pred >= (1 << Al))
710
40.3k
              pred = (1 << Al) - 1;
711
565k
            pred = -pred;
712
565k
          }
713
1.36M
          workspace[16] = (JCOEF)pred;
714
1.36M
        }
715
        /* AC11 */
716
1.42M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
1.36M
          num = Q00 * (change_dc ?
718
1.17M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
1.17M
                 9 * DC19 + DC21 - DC25) :
720
1.36M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
191k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
1.36M
          if (num >= 0) {
723
925k
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
925k
            if (Al > 0 && pred >= (1 << Al))
725
19.1k
              pred = (1 << Al) - 1;
726
925k
          } else {
727
437k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
437k
            if (Al > 0 && pred >= (1 << Al))
729
19.0k
              pred = (1 << Al) - 1;
730
437k
            pred = -pred;
731
437k
          }
732
1.36M
          workspace[9] = (JCOEF)pred;
733
1.36M
        }
734
        /* AC02 */
735
1.42M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
1.35M
          num = Q00 * (change_dc ?
737
1.17M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
1.17M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
1.35M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
1.35M
          if (num >= 0) {
741
813k
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
813k
            if (Al > 0 && pred >= (1 << Al))
743
22.4k
              pred = (1 << Al) - 1;
744
813k
          } else {
745
544k
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
544k
            if (Al > 0 && pred >= (1 << Al))
747
22.5k
              pred = (1 << Al) - 1;
748
544k
            pred = -pred;
749
544k
          }
750
1.35M
          workspace[2] = (JCOEF)pred;
751
1.35M
        }
752
1.42M
        if (change_dc) {
753
          /* AC03 */
754
1.17M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
1.17M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
1.17M
            if (num >= 0) {
757
805k
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
805k
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
805k
            } else {
761
365k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
365k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
365k
              pred = -pred;
765
365k
            }
766
1.17M
            workspace[3] = (JCOEF)pred;
767
1.17M
          }
768
          /* AC12 */
769
1.17M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
1.17M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
1.17M
            if (num >= 0) {
772
644k
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
644k
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
644k
            } else {
776
526k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
526k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
526k
              pred = -pred;
780
526k
            }
781
1.17M
            workspace[10] = (JCOEF)pred;
782
1.17M
          }
783
          /* AC21 */
784
1.17M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
1.17M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
1.17M
            if (num >= 0) {
787
680k
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
680k
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
680k
            } else {
791
490k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
490k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
490k
              pred = -pred;
795
490k
            }
796
1.17M
            workspace[17] = (JCOEF)pred;
797
1.17M
          }
798
          /* AC30 */
799
1.17M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
1.17M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
1.17M
            if (num >= 0) {
802
817k
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
817k
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
817k
            } else {
806
353k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
353k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
353k
              pred = -pred;
810
353k
            }
811
1.17M
            workspace[24] = (JCOEF)pred;
812
1.17M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
1.17M
          num = Q00 *
817
1.17M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
1.17M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
1.17M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
1.17M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
1.17M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
1.17M
          if (num >= 0) {
823
508k
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
662k
          } else {
825
662k
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
662k
            pred = -pred;
827
662k
          }
828
1.17M
          workspace[0] = (JCOEF)pred;
829
1.17M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
1.42M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
1.42M
                        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
1.42M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
1.42M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
1.42M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
1.42M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
1.42M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
1.42M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
1.42M
          prev_prev_block_row++, next_next_block_row++;
849
1.42M
        output_col += compptr->_DCT_scaled_size;
850
1.42M
      }
851
89.7k
      output_ptr += compptr->_DCT_scaled_size;
852
89.7k
    }
853
65.8k
  }
854
855
21.9k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
21.4k
    return JPEG_ROW_COMPLETED;
857
524
  return JPEG_SCAN_COMPLETED;
858
21.9k
}
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.42k
{
870
3.42k
  my_coef_ptr coef;
871
872
3.42k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
3.42k
  coef = (my_coef_ptr)
876
3.42k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
3.42k
                                sizeof(my_coef_controller));
878
3.42k
  memset(coef, 0, sizeof(my_coef_controller));
879
3.42k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
3.42k
  coef->pub.start_input_pass = start_input_pass;
881
3.42k
  coef->pub.start_output_pass = start_output_pass;
882
3.42k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
3.42k
  coef->coef_bits_latch = NULL;
884
3.42k
#endif
885
886
  /* Create the coefficient buffer. */
887
3.42k
  if (need_full_buffer) {
888
1.62k
#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.62k
    int ci, access_rows;
893
1.62k
    jpeg_component_info *compptr;
894
895
6.49k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
4.86k
         ci++, compptr++) {
897
4.86k
      access_rows = compptr->v_samp_factor;
898
4.86k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
4.86k
      if (cinfo->progressive_mode)
901
4.82k
        access_rows *= 5;
902
4.86k
#endif
903
4.86k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
4.86k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
4.86k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
4.86k
                               (long)compptr->h_samp_factor),
907
4.86k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
4.86k
                               (long)compptr->v_samp_factor),
909
4.86k
         (JDIMENSION)access_rows);
910
4.86k
    }
911
1.62k
    coef->pub.consume_data = consume_data;
912
1.62k
    coef->pub._decompress_data = decompress_data;
913
1.62k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
1.80k
  } else {
918
    /* We only need a single-MCU buffer. */
919
1.80k
    JBLOCKROW buffer;
920
1.80k
    int i;
921
922
1.80k
    buffer = (JBLOCKROW)
923
1.80k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
1.80k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
19.8k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
18.0k
      coef->MCU_buffer[i] = buffer + i;
927
18.0k
    }
928
1.80k
    coef->pub.consume_data = dummy_consume_data;
929
1.80k
    coef->pub._decompress_data = decompress_onepass;
930
1.80k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
1.80k
  }
932
933
  /* Allocate the workspace buffer */
934
3.42k
  coef->workspace = (JCOEF *)
935
3.42k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
3.42k
                                sizeof(JCOEF) * DCTSIZE2);
937
3.42k
}
jinit_d_coef_controller
Line
Count
Source
869
3.16k
{
870
3.16k
  my_coef_ptr coef;
871
872
3.16k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
3.16k
  coef = (my_coef_ptr)
876
3.16k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
3.16k
                                sizeof(my_coef_controller));
878
3.16k
  memset(coef, 0, sizeof(my_coef_controller));
879
3.16k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
3.16k
  coef->pub.start_input_pass = start_input_pass;
881
3.16k
  coef->pub.start_output_pass = start_output_pass;
882
3.16k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
3.16k
  coef->coef_bits_latch = NULL;
884
3.16k
#endif
885
886
  /* Create the coefficient buffer. */
887
3.16k
  if (need_full_buffer) {
888
1.39k
#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.39k
    int ci, access_rows;
893
1.39k
    jpeg_component_info *compptr;
894
895
5.50k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
4.10k
         ci++, compptr++) {
897
4.10k
      access_rows = compptr->v_samp_factor;
898
4.10k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
4.10k
      if (cinfo->progressive_mode)
901
4.08k
        access_rows *= 5;
902
4.10k
#endif
903
4.10k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
4.10k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
4.10k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
4.10k
                               (long)compptr->h_samp_factor),
907
4.10k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
4.10k
                               (long)compptr->v_samp_factor),
909
4.10k
         (JDIMENSION)access_rows);
910
4.10k
    }
911
1.39k
    coef->pub.consume_data = consume_data;
912
1.39k
    coef->pub._decompress_data = decompress_data;
913
1.39k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
1.76k
  } else {
918
    /* We only need a single-MCU buffer. */
919
1.76k
    JBLOCKROW buffer;
920
1.76k
    int i;
921
922
1.76k
    buffer = (JBLOCKROW)
923
1.76k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
1.76k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
19.4k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
17.6k
      coef->MCU_buffer[i] = buffer + i;
927
17.6k
    }
928
1.76k
    coef->pub.consume_data = dummy_consume_data;
929
1.76k
    coef->pub._decompress_data = decompress_onepass;
930
1.76k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
1.76k
  }
932
933
  /* Allocate the workspace buffer */
934
3.16k
  coef->workspace = (JCOEF *)
935
3.16k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
3.16k
                                sizeof(JCOEF) * DCTSIZE2);
937
3.16k
}
j12init_d_coef_controller
Line
Count
Source
869
265
{
870
265
  my_coef_ptr coef;
871
872
265
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
265
  coef = (my_coef_ptr)
876
265
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
265
                                sizeof(my_coef_controller));
878
265
  memset(coef, 0, sizeof(my_coef_controller));
879
265
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
265
  coef->pub.start_input_pass = start_input_pass;
881
265
  coef->pub.start_output_pass = start_output_pass;
882
265
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
265
  coef->coef_bits_latch = NULL;
884
265
#endif
885
886
  /* Create the coefficient buffer. */
887
265
  if (need_full_buffer) {
888
232
#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
232
    int ci, access_rows;
893
232
    jpeg_component_info *compptr;
894
895
996
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
764
         ci++, compptr++) {
897
764
      access_rows = compptr->v_samp_factor;
898
764
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
764
      if (cinfo->progressive_mode)
901
746
        access_rows *= 5;
902
764
#endif
903
764
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
764
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
764
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
764
                               (long)compptr->h_samp_factor),
907
764
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
764
                               (long)compptr->v_samp_factor),
909
764
         (JDIMENSION)access_rows);
910
764
    }
911
232
    coef->pub.consume_data = consume_data;
912
232
    coef->pub._decompress_data = decompress_data;
913
232
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
232
  } else {
918
    /* We only need a single-MCU buffer. */
919
33
    JBLOCKROW buffer;
920
33
    int i;
921
922
33
    buffer = (JBLOCKROW)
923
33
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
33
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
363
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
330
      coef->MCU_buffer[i] = buffer + i;
927
330
    }
928
33
    coef->pub.consume_data = dummy_consume_data;
929
33
    coef->pub._decompress_data = decompress_onepass;
930
33
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
33
  }
932
933
  /* Allocate the workspace buffer */
934
265
  coef->workspace = (JCOEF *)
935
265
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
265
                                sizeof(JCOEF) * DCTSIZE2);
937
265
}