Coverage Report

Created: 2026-07-30 07:17

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libjpeg-turbo/src/jdcoefct.c
Line
Count
Source
1
/*
2
 * jdcoefct.c
3
 *
4
 * This file was part of the Independent JPEG Group's software:
5
 * Copyright (C) 1994-1997, Thomas G. Lane.
6
 * libjpeg-turbo Modifications:
7
 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
8
 * Copyright (C) 2010, 2015-2016, 2019-2020, 2022-2026, D. R. Commander.
9
 * Copyright (C) 2015, 2020, Google, Inc.
10
 * For conditions of distribution and use, see the accompanying README.ijg
11
 * file.
12
 *
13
 * This file contains the coefficient buffer controller for decompression.
14
 * This controller is the top level of the lossy JPEG decompressor proper.
15
 * The coefficient buffer lies between entropy decoding and inverse-DCT steps.
16
 *
17
 * In buffered-image mode, this controller is the interface between
18
 * input-oriented processing and output-oriented processing.
19
 * Also, the input side (only) is used when reading a file for transcoding.
20
 */
21
22
#include "jinclude.h"
23
#include "jdcoefct.h"
24
#include "jpegapicomp.h"
25
#include "jsamplecomp.h"
26
#ifdef WITH_PROFILE
27
#include "tjutil.h"
28
#endif
29
30
31
/* Forward declarations */
32
METHODDEF(int) decompress_onepass(j_decompress_ptr cinfo,
33
                                  _JSAMPIMAGE output_buf);
34
#ifdef D_MULTISCAN_FILES_SUPPORTED
35
METHODDEF(int) decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf);
36
#endif
37
#ifdef BLOCK_SMOOTHING_SUPPORTED
38
LOCAL(boolean) smoothing_ok(j_decompress_ptr cinfo);
39
METHODDEF(int) decompress_smooth_data(j_decompress_ptr cinfo,
40
                                      _JSAMPIMAGE output_buf);
41
#endif
42
43
44
/*
45
 * Initialize for an input processing pass.
46
 */
47
48
METHODDEF(void)
49
start_input_pass(j_decompress_ptr cinfo)
50
12.8k
{
51
12.8k
  cinfo->input_iMCU_row = 0;
52
12.8k
  start_iMCU_row(cinfo);
53
12.8k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
50
11.9k
{
51
11.9k
  cinfo->input_iMCU_row = 0;
52
11.9k
  start_iMCU_row(cinfo);
53
11.9k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
50
874
{
51
874
  cinfo->input_iMCU_row = 0;
52
874
  start_iMCU_row(cinfo);
53
874
}
54
55
56
/*
57
 * Initialize for an output processing pass.
58
 */
59
60
METHODDEF(void)
61
start_output_pass(j_decompress_ptr cinfo)
62
4.13k
{
63
4.13k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
4.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
4.13k
  if (coef->pub.coef_arrays != NULL) {
68
1.81k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
970
      coef->pub._decompress_data = decompress_smooth_data;
70
840
    else
71
840
      coef->pub._decompress_data = decompress_data;
72
1.81k
  }
73
4.13k
#endif
74
4.13k
  cinfo->output_iMCU_row = 0;
75
4.13k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
62
3.96k
{
63
3.96k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
3.96k
  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.96k
  if (coef->pub.coef_arrays != NULL) {
68
1.63k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
915
      coef->pub._decompress_data = decompress_smooth_data;
70
722
    else
71
722
      coef->pub._decompress_data = decompress_data;
72
1.63k
  }
73
3.96k
#endif
74
3.96k
  cinfo->output_iMCU_row = 0;
75
3.96k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
62
178
{
63
178
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
178
  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
178
  if (coef->pub.coef_arrays != NULL) {
68
173
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
55
      coef->pub._decompress_data = decompress_smooth_data;
70
118
    else
71
118
      coef->pub._decompress_data = decompress_data;
72
173
  }
73
178
#endif
74
178
  cinfo->output_iMCU_row = 0;
75
178
}
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
128k
{
91
128k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
128k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
128k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
128k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
128k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
128k
  _JSAMPARRAY output_ptr;
97
128k
  JDIMENSION start_col, output_col;
98
128k
  jpeg_component_info *compptr;
99
128k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
258k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
130k
       yoffset++) {
104
1.62M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
1.49M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
1.49M
      jzero_far((void *)coef->MCU_buffer[0],
108
1.49M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
1.49M
      if (!cinfo->entropy->insufficient_data)
110
1.49M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
1.49M
      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.49M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
1.49M
          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.49M
        blkn = 0;               /* index of current DCT block within MCU */
142
5.75M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
4.25M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
4.25M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
4.25M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
4.25M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
3.80M
                         compptr->MCU_width : compptr->last_col_width;
152
4.25M
          output_ptr = output_buf[compptr->component_index] +
153
4.25M
                       yoffset * compptr->_DCT_scaled_size;
154
4.25M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
4.25M
                      compptr->MCU_sample_width;
156
8.54M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
4.28M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
4.28M
                yoffset + yindex < compptr->last_row_height) {
159
4.28M
              output_col = start_col;
160
8.61M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
4.33M
                (*inverse_DCT) (cinfo, compptr,
165
4.33M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
4.33M
                                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
4.33M
                output_col += compptr->_DCT_scaled_size;
173
4.33M
              }
174
4.28M
            }
175
4.28M
            blkn += compptr->MCU_width;
176
4.28M
            output_ptr += compptr->_DCT_scaled_size;
177
4.28M
          }
178
4.25M
        }
179
1.49M
      }
180
1.49M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
130k
    coef->MCU_ctr = 0;
183
130k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
128k
  cinfo->output_iMCU_row++;
186
128k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
126k
    start_iMCU_row(cinfo);
188
126k
    return JPEG_ROW_COMPLETED;
189
126k
  }
190
  /* Completed the scan */
191
2.32k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
2.32k
  return JPEG_SCAN_COMPLETED;
193
128k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
90
128k
{
91
128k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
128k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
128k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
128k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
128k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
128k
  _JSAMPARRAY output_ptr;
97
128k
  JDIMENSION start_col, output_col;
98
128k
  jpeg_component_info *compptr;
99
128k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
258k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
130k
       yoffset++) {
104
1.62M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
1.49M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
1.49M
      jzero_far((void *)coef->MCU_buffer[0],
108
1.49M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
1.49M
      if (!cinfo->entropy->insufficient_data)
110
1.49M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
1.49M
      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.49M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
1.49M
          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.49M
        blkn = 0;               /* index of current DCT block within MCU */
142
5.75M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
4.25M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
4.25M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
4.25M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
4.25M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
3.80M
                         compptr->MCU_width : compptr->last_col_width;
152
4.25M
          output_ptr = output_buf[compptr->component_index] +
153
4.25M
                       yoffset * compptr->_DCT_scaled_size;
154
4.25M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
4.25M
                      compptr->MCU_sample_width;
156
8.54M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
4.28M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
4.28M
                yoffset + yindex < compptr->last_row_height) {
159
4.28M
              output_col = start_col;
160
8.61M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
4.33M
                (*inverse_DCT) (cinfo, compptr,
165
4.33M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
4.33M
                                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
4.33M
                output_col += compptr->_DCT_scaled_size;
173
4.33M
              }
174
4.28M
            }
175
4.28M
            blkn += compptr->MCU_width;
176
4.28M
            output_ptr += compptr->_DCT_scaled_size;
177
4.28M
          }
178
4.25M
        }
179
1.49M
      }
180
1.49M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
130k
    coef->MCU_ctr = 0;
183
130k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
128k
  cinfo->output_iMCU_row++;
186
128k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
126k
    start_iMCU_row(cinfo);
188
126k
    return JPEG_ROW_COMPLETED;
189
126k
  }
190
  /* Completed the scan */
191
2.32k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
2.32k
  return JPEG_SCAN_COMPLETED;
193
128k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_onepass
194
195
196
/*
197
 * Dummy consume-input routine for single-pass operation.
198
 */
199
200
METHODDEF(int)
201
dummy_consume_data(j_decompress_ptr cinfo)
202
0
{
203
0
  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
204
0
}
Unexecuted instantiation: jdcoefct-8.c:dummy_consume_data
Unexecuted instantiation: jdcoefct-12.c:dummy_consume_data
205
206
207
#ifdef D_MULTISCAN_FILES_SUPPORTED
208
209
/*
210
 * Consume input data and store it in the full-image coefficient buffer.
211
 * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
212
 * ie, v_samp_factor block rows for each component in the scan.
213
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
214
 */
215
216
METHODDEF(int)
217
consume_data(j_decompress_ptr cinfo)
218
1.27M
{
219
1.27M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
1.27M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
1.27M
  int blkn, ci, xindex, yindex, yoffset;
222
1.27M
  JDIMENSION start_col;
223
1.27M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
1.27M
  JBLOCKROW buffer_ptr;
225
1.27M
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
2.79M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
1.52M
    compptr = cinfo->cur_comp_info[ci];
230
1.52M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
1.52M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
1.52M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
1.52M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
234
    /* Note: entropy decoder expects buffer to be zeroed,
235
     * but this is handled automatically by the memory manager
236
     * because we requested a pre-zeroed array.
237
     */
238
1.52M
  }
239
240
  /* Loop to process one whole iMCU row */
241
3.64M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
2.37M
       yoffset++) {
243
19.7M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
17.3M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
17.3M
      blkn = 0;                 /* index of current DCT block within MCU */
247
37.3M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
19.9M
        compptr = cinfo->cur_comp_info[ci];
249
19.9M
        start_col = MCU_col_num * compptr->MCU_width;
250
40.5M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
20.5M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
42.7M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
22.1M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
22.1M
          }
255
20.5M
        }
256
19.9M
      }
257
17.3M
      if (!cinfo->entropy->insufficient_data)
258
17.3M
        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
17.3M
      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
17.3M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
2.37M
    coef->MCU_ctr = 0;
282
2.37M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
1.27M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
1.26M
    start_iMCU_row(cinfo);
286
1.26M
    return JPEG_ROW_COMPLETED;
287
1.26M
  }
288
  /* Completed the scan */
289
10.4k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
10.4k
  return JPEG_SCAN_COMPLETED;
291
1.27M
}
jdcoefct-8.c:consume_data
Line
Count
Source
218
1.21M
{
219
1.21M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
1.21M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
1.21M
  int blkn, ci, xindex, yindex, yoffset;
222
1.21M
  JDIMENSION start_col;
223
1.21M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
1.21M
  JBLOCKROW buffer_ptr;
225
1.21M
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
2.67M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
1.45M
    compptr = cinfo->cur_comp_info[ci];
230
1.45M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
1.45M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
1.45M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
1.45M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
234
    /* Note: entropy decoder expects buffer to be zeroed,
235
     * but this is handled automatically by the memory manager
236
     * because we requested a pre-zeroed array.
237
     */
238
1.45M
  }
239
240
  /* Loop to process one whole iMCU row */
241
3.49M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
2.27M
       yoffset++) {
243
18.7M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
16.5M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
16.5M
      blkn = 0;                 /* index of current DCT block within MCU */
247
35.4M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
18.9M
        compptr = cinfo->cur_comp_info[ci];
249
18.9M
        start_col = MCU_col_num * compptr->MCU_width;
250
38.4M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
19.5M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
40.5M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
21.0M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
21.0M
          }
255
19.5M
        }
256
18.9M
      }
257
16.5M
      if (!cinfo->entropy->insufficient_data)
258
16.5M
        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
16.5M
      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
16.5M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
2.27M
    coef->MCU_ctr = 0;
282
2.27M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
1.21M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
1.20M
    start_iMCU_row(cinfo);
286
1.20M
    return JPEG_ROW_COMPLETED;
287
1.20M
  }
288
  /* Completed the scan */
289
9.60k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
9.60k
  return JPEG_SCAN_COMPLETED;
291
1.21M
}
jdcoefct-12.c:consume_data
Line
Count
Source
218
55.2k
{
219
55.2k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
55.2k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
55.2k
  int blkn, ci, xindex, yindex, yoffset;
222
55.2k
  JDIMENSION start_col;
223
55.2k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
55.2k
  JBLOCKROW buffer_ptr;
225
55.2k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
126k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
71.4k
    compptr = cinfo->cur_comp_info[ci];
230
71.4k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
71.4k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
71.4k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
71.4k
       (JDIMENSION)compptr->v_samp_factor, TRUE);
234
    /* Note: entropy decoder expects buffer to be zeroed,
235
     * but this is handled automatically by the memory manager
236
     * because we requested a pre-zeroed array.
237
     */
238
71.4k
  }
239
240
  /* Loop to process one whole iMCU row */
241
158k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
103k
       yoffset++) {
243
968k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
864k
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
864k
      blkn = 0;                 /* index of current DCT block within MCU */
247
1.88M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
1.01M
        compptr = cinfo->cur_comp_info[ci];
249
1.01M
        start_col = MCU_col_num * compptr->MCU_width;
250
2.09M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
1.07M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
2.17M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
1.09M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
1.09M
          }
255
1.07M
        }
256
1.01M
      }
257
864k
      if (!cinfo->entropy->insufficient_data)
258
864k
        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
864k
      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
864k
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
103k
    coef->MCU_ctr = 0;
282
103k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
55.2k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
54.4k
    start_iMCU_row(cinfo);
286
54.4k
    return JPEG_ROW_COMPLETED;
287
54.4k
  }
288
  /* Completed the scan */
289
868
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
868
  return JPEG_SCAN_COMPLETED;
291
55.2k
}
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
78.8k
{
305
78.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
78.8k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
78.8k
  JDIMENSION block_num;
308
78.8k
  int ci, block_row, block_rows;
309
78.8k
  JBLOCKARRAY buffer;
310
78.8k
  JBLOCKROW buffer_ptr;
311
78.8k
  _JSAMPARRAY output_ptr;
312
78.8k
  JDIMENSION output_col;
313
78.8k
  jpeg_component_info *compptr;
314
78.8k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
78.8k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
78.8k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
78.8k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
320
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
321
0
      return JPEG_SUSPENDED;
322
0
  }
323
324
  /* OK, output from the virtual arrays. */
325
220k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
141k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
141k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
141k
    buffer = (*cinfo->mem->access_virt_barray)
332
141k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
141k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
141k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
141k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
139k
      block_rows = compptr->v_samp_factor;
338
1.92k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.92k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.92k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.92k
    }
343
141k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
141k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
412k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
271k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
271k
      output_col = 0;
349
271k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
1.79M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
1.52M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.52M
                        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.52M
        buffer_ptr++;
361
1.52M
        output_col += compptr->_DCT_scaled_size;
362
1.52M
      }
363
271k
      output_ptr += compptr->_DCT_scaled_size;
364
271k
    }
365
141k
  }
366
367
78.8k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
78.1k
    return JPEG_ROW_COMPLETED;
369
722
  return JPEG_SCAN_COMPLETED;
370
78.8k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
304
78.8k
{
305
78.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
78.8k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
78.8k
  JDIMENSION block_num;
308
78.8k
  int ci, block_row, block_rows;
309
78.8k
  JBLOCKARRAY buffer;
310
78.8k
  JBLOCKROW buffer_ptr;
311
78.8k
  _JSAMPARRAY output_ptr;
312
78.8k
  JDIMENSION output_col;
313
78.8k
  jpeg_component_info *compptr;
314
78.8k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
78.8k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
78.8k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
78.8k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
320
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
321
0
      return JPEG_SUSPENDED;
322
0
  }
323
324
  /* OK, output from the virtual arrays. */
325
220k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
141k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
141k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
141k
    buffer = (*cinfo->mem->access_virt_barray)
332
141k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
141k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
141k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
141k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
139k
      block_rows = compptr->v_samp_factor;
338
1.92k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.92k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.92k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.92k
    }
343
141k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
141k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
412k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
271k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
271k
      output_col = 0;
349
271k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
1.79M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
1.52M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.52M
                        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.52M
        buffer_ptr++;
361
1.52M
        output_col += compptr->_DCT_scaled_size;
362
1.52M
      }
363
271k
      output_ptr += compptr->_DCT_scaled_size;
364
271k
    }
365
141k
  }
366
367
78.8k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
78.1k
    return JPEG_ROW_COMPLETED;
369
722
  return JPEG_SCAN_COMPLETED;
370
78.8k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_data
371
372
#endif /* D_MULTISCAN_FILES_SUPPORTED */
373
374
375
#ifdef BLOCK_SMOOTHING_SUPPORTED
376
377
/*
378
 * This code applies interblock smoothing; the first 9 AC coefficients are
379
 * estimated from the DC values of a DCT block and its 24 neighboring blocks.
380
 * We apply smoothing only for progressive JPEG decoding, and only if
381
 * the coefficients it can estimate are not yet known to full precision.
382
 */
383
384
/* Natural-order array positions of the first 9 zigzag-order coefficients */
385
263k
#define Q01_POS  1
386
263k
#define Q10_POS  8
387
263k
#define Q20_POS  16
388
263k
#define Q11_POS  9
389
263k
#define Q02_POS  2
390
125k
#define Q03_POS  3
391
125k
#define Q12_POS  10
392
125k
#define Q21_POS  17
393
124k
#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.81k
{
406
1.81k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.81k
  boolean smoothing_useful = FALSE;
408
1.81k
  int ci, coefi;
409
1.81k
  jpeg_component_info *compptr;
410
1.81k
  JQUANT_TBL *qtable;
411
1.81k
  int *coef_bits, *prev_coef_bits;
412
1.81k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.81k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
21
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.78k
  if (coef->coef_bits_latch == NULL)
419
1.78k
    coef->coef_bits_latch = (int *)
420
1.78k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.78k
                                  cinfo->num_components * 2 *
422
1.78k
                                  (SAVED_COEFS * sizeof(int)));
423
1.78k
  coef_bits_latch = coef->coef_bits_latch;
424
1.78k
  prev_coef_bits_latch =
425
1.78k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
4.76k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
3.37k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
3.37k
    if ((qtable = compptr->quant_table) == NULL)
431
37
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
3.33k
    if (qtable->quantval[0] == 0 ||
434
3.31k
        qtable->quantval[Q01_POS] == 0 ||
435
3.29k
        qtable->quantval[Q10_POS] == 0 ||
436
3.23k
        qtable->quantval[Q20_POS] == 0 ||
437
3.16k
        qtable->quantval[Q11_POS] == 0 ||
438
3.10k
        qtable->quantval[Q02_POS] == 0 ||
439
3.05k
        qtable->quantval[Q03_POS] == 0 ||
440
3.03k
        qtable->quantval[Q12_POS] == 0 ||
441
3.02k
        qtable->quantval[Q21_POS] == 0 ||
442
3.01k
        qtable->quantval[Q30_POS] == 0)
443
356
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
2.97k
    coef_bits = cinfo->coef_bits[ci];
446
2.97k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
2.97k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
2.97k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
29.7k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
26.8k
      if (cinfo->input_scan_number > 1)
453
20.5k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
6.21k
      else
455
6.21k
        prev_coef_bits_latch[coefi] = -1;
456
26.8k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
26.8k
      if (coef_bits[coefi] != 0)
458
14.7k
        smoothing_useful = TRUE;
459
26.8k
    }
460
2.97k
    coef_bits_latch += SAVED_COEFS;
461
2.97k
    prev_coef_bits_latch += SAVED_COEFS;
462
2.97k
  }
463
464
1.39k
  return smoothing_useful;
465
1.78k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
405
1.63k
{
406
1.63k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.63k
  boolean smoothing_useful = FALSE;
408
1.63k
  int ci, coefi;
409
1.63k
  jpeg_component_info *compptr;
410
1.63k
  JQUANT_TBL *qtable;
411
1.63k
  int *coef_bits, *prev_coef_bits;
412
1.63k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.63k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
17
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.62k
  if (coef->coef_bits_latch == NULL)
419
1.62k
    coef->coef_bits_latch = (int *)
420
1.62k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.62k
                                  cinfo->num_components * 2 *
422
1.62k
                                  (SAVED_COEFS * sizeof(int)));
423
1.62k
  coef_bits_latch = coef->coef_bits_latch;
424
1.62k
  prev_coef_bits_latch =
425
1.62k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
4.38k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
3.05k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
3.05k
    if ((qtable = compptr->quant_table) == NULL)
431
37
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
3.01k
    if (qtable->quantval[0] == 0 ||
434
3.00k
        qtable->quantval[Q01_POS] == 0 ||
435
2.98k
        qtable->quantval[Q10_POS] == 0 ||
436
2.96k
        qtable->quantval[Q20_POS] == 0 ||
437
2.90k
        qtable->quantval[Q11_POS] == 0 ||
438
2.86k
        qtable->quantval[Q02_POS] == 0 ||
439
2.81k
        qtable->quantval[Q03_POS] == 0 ||
440
2.80k
        qtable->quantval[Q12_POS] == 0 ||
441
2.79k
        qtable->quantval[Q21_POS] == 0 ||
442
2.78k
        qtable->quantval[Q30_POS] == 0)
443
246
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
2.76k
    coef_bits = cinfo->coef_bits[ci];
446
2.76k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
2.76k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
2.76k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
27.6k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
24.9k
      if (cinfo->input_scan_number > 1)
453
19.7k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
5.13k
      else
455
5.13k
        prev_coef_bits_latch[coefi] = -1;
456
24.9k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
24.9k
      if (coef_bits[coefi] != 0)
458
12.9k
        smoothing_useful = TRUE;
459
24.9k
    }
460
2.76k
    coef_bits_latch += SAVED_COEFS;
461
2.76k
    prev_coef_bits_latch += SAVED_COEFS;
462
2.76k
  }
463
464
1.33k
  return smoothing_useful;
465
1.62k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
405
173
{
406
173
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
173
  boolean smoothing_useful = FALSE;
408
173
  int ci, coefi;
409
173
  jpeg_component_info *compptr;
410
173
  JQUANT_TBL *qtable;
411
173
  int *coef_bits, *prev_coef_bits;
412
173
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
173
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
4
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
169
  if (coef->coef_bits_latch == NULL)
419
169
    coef->coef_bits_latch = (int *)
420
169
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
169
                                  cinfo->num_components * 2 *
422
169
                                  (SAVED_COEFS * sizeof(int)));
423
169
  coef_bits_latch = coef->coef_bits_latch;
424
169
  prev_coef_bits_latch =
425
169
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
378
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
319
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
319
    if ((qtable = compptr->quant_table) == NULL)
431
0
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
319
    if (qtable->quantval[0] == 0 ||
434
313
        qtable->quantval[Q01_POS] == 0 ||
435
309
        qtable->quantval[Q10_POS] == 0 ||
436
269
        qtable->quantval[Q20_POS] == 0 ||
437
257
        qtable->quantval[Q11_POS] == 0 ||
438
248
        qtable->quantval[Q02_POS] == 0 ||
439
236
        qtable->quantval[Q03_POS] == 0 ||
440
230
        qtable->quantval[Q12_POS] == 0 ||
441
226
        qtable->quantval[Q21_POS] == 0 ||
442
222
        qtable->quantval[Q30_POS] == 0)
443
110
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
209
    coef_bits = cinfo->coef_bits[ci];
446
209
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
209
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
209
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
2.09k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
1.88k
      if (cinfo->input_scan_number > 1)
453
810
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
1.07k
      else
455
1.07k
        prev_coef_bits_latch[coefi] = -1;
456
1.88k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
1.88k
      if (coef_bits[coefi] != 0)
458
1.75k
        smoothing_useful = TRUE;
459
1.88k
    }
460
209
    coef_bits_latch += SAVED_COEFS;
461
209
    prev_coef_bits_latch += SAVED_COEFS;
462
209
  }
463
464
59
  return smoothing_useful;
465
169
}
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
188k
{
475
188k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
188k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
188k
  JDIMENSION block_num, last_block_column;
478
188k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
188k
    image_block_rows;
480
188k
  JBLOCKARRAY buffer;
481
188k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
188k
  JBLOCKROW next_block_row, next_next_block_row;
483
188k
  _JSAMPARRAY output_ptr;
484
188k
  JDIMENSION output_col;
485
188k
  jpeg_component_info *compptr;
486
188k
  _inverse_DCT_method_ptr inverse_DCT;
487
188k
  boolean change_dc;
488
188k
  JCOEF *workspace;
489
188k
  int *coef_bits;
490
188k
  JQUANT_TBL *quanttbl;
491
188k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
188k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
188k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
188k
      DC25;
495
188k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
188k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
188k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
188k
         !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
448k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
260k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
260k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
260k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
257k
      block_rows = compptr->v_samp_factor;
526
257k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
257k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
1.18k
      block_rows = compptr->v_samp_factor;
529
1.18k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
1.53k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
1.53k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
1.53k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
1.53k
      access_rows = block_rows; /* this iMCU row only */
535
1.53k
    }
536
    /* Align the virtual buffer for this component. */
537
260k
    if (cinfo->output_iMCU_row > 1) {
538
257k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
257k
      buffer = (*cinfo->mem->access_virt_barray)
540
257k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
257k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
257k
         (JDIMENSION)access_rows, FALSE);
543
257k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
257k
    } else if (cinfo->output_iMCU_row > 0) {
545
1.18k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
1.18k
      buffer = (*cinfo->mem->access_virt_barray)
547
1.18k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
1.18k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
1.18k
         (JDIMENSION)access_rows, FALSE);
550
1.18k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
1.53k
    } else {
552
1.53k
      buffer = (*cinfo->mem->access_virt_barray)
553
1.53k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
1.53k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
1.53k
    }
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
260k
    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
260k
    else
564
260k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
260k
    change_dc =
568
260k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
136k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
129k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
260k
    quanttbl = compptr->quant_table;
573
260k
    Q00 = quanttbl->quantval[0];
574
260k
    Q01 = quanttbl->quantval[Q01_POS];
575
260k
    Q10 = quanttbl->quantval[Q10_POS];
576
260k
    Q20 = quanttbl->quantval[Q20_POS];
577
260k
    Q11 = quanttbl->quantval[Q11_POS];
578
260k
    Q02 = quanttbl->quantval[Q02_POS];
579
260k
    if (change_dc) {
580
121k
      Q03 = quanttbl->quantval[Q03_POS];
581
121k
      Q12 = quanttbl->quantval[Q12_POS];
582
121k
      Q21 = quanttbl->quantval[Q21_POS];
583
121k
      Q30 = quanttbl->quantval[Q30_POS];
584
121k
    }
585
260k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
260k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
260k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
726k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
466k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
466k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
466k
      if (image_block_row > 0)
594
464k
        prev_block_row =
595
464k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
1.53k
      else
597
1.53k
        prev_block_row = buffer_ptr;
598
599
466k
      if (image_block_row > 1)
600
463k
        prev_prev_block_row =
601
463k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
2.92k
      else
603
2.92k
        prev_prev_block_row = prev_block_row;
604
605
466k
      if (image_block_row < image_block_rows - 1)
606
464k
        next_block_row =
607
464k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
1.53k
      else
609
1.53k
        next_block_row = buffer_ptr;
610
611
466k
      if (image_block_row < image_block_rows - 2)
612
464k
        next_next_block_row =
613
464k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
2.37k
      else
615
2.37k
        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
466k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
466k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
466k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
466k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
466k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
466k
      output_col = 0;
626
466k
      last_block_column = compptr->width_in_blocks - 1;
627
466k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
4.83M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
4.36M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
4.36M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
466k
            block_num < last_block_column) {
634
321k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
321k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
321k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
321k
          DC19 = DC20 = (int)next_block_row[1][0];
638
321k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
321k
        }
640
4.36M
        if (block_num + 1 < last_block_column) {
641
3.58M
          DC05 = (int)prev_prev_block_row[2][0];
642
3.58M
          DC10 = (int)prev_block_row[2][0];
643
3.58M
          DC15 = (int)buffer_ptr[2][0];
644
3.58M
          DC20 = (int)next_block_row[2][0];
645
3.58M
          DC25 = (int)next_next_block_row[2][0];
646
3.58M
        }
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
4.36M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
3.51M
          num = Q00 * (change_dc ?
660
2.39M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
2.39M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
2.39M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
2.39M
                 DC21 - DC22 + DC24 + DC25) :
664
3.51M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
3.51M
          if (num >= 0) {
666
2.32M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
2.32M
            if (Al > 0 && pred >= (1 << Al))
668
82.4k
              pred = (1 << Al) - 1;
669
2.32M
          } else {
670
1.18M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
1.18M
            if (Al > 0 && pred >= (1 << Al))
672
53.0k
              pred = (1 << Al) - 1;
673
1.18M
            pred = -pred;
674
1.18M
          }
675
3.51M
          workspace[1] = (JCOEF)pred;
676
3.51M
        }
677
        /* AC10 */
678
4.36M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
3.60M
          num = Q00 * (change_dc ?
680
2.39M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
2.39M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
2.39M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
2.39M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
3.60M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
3.60M
          if (num >= 0) {
686
2.64M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
2.64M
            if (Al > 0 && pred >= (1 << Al))
688
87.0k
              pred = (1 << Al) - 1;
689
2.64M
          } else {
690
967k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
967k
            if (Al > 0 && pred >= (1 << Al))
692
84.7k
              pred = (1 << Al) - 1;
693
967k
            pred = -pred;
694
967k
          }
695
3.60M
          workspace[8] = (JCOEF)pred;
696
3.60M
        }
697
        /* AC20 */
698
4.36M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
3.43M
          num = Q00 * (change_dc ?
700
2.39M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
2.39M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
3.43M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
3.43M
          if (num >= 0) {
704
2.26M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
2.26M
            if (Al > 0 && pred >= (1 << Al))
706
76.6k
              pred = (1 << Al) - 1;
707
2.26M
          } else {
708
1.17M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
1.17M
            if (Al > 0 && pred >= (1 << Al))
710
77.8k
              pred = (1 << Al) - 1;
711
1.17M
            pred = -pred;
712
1.17M
          }
713
3.43M
          workspace[16] = (JCOEF)pred;
714
3.43M
        }
715
        /* AC11 */
716
4.36M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
3.33M
          num = Q00 * (change_dc ?
718
2.39M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
2.39M
                 9 * DC19 + DC21 - DC25) :
720
3.33M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
941k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
3.33M
          if (num >= 0) {
723
2.37M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
2.37M
            if (Al > 0 && pred >= (1 << Al))
725
64.9k
              pred = (1 << Al) - 1;
726
2.37M
          } else {
727
958k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
958k
            if (Al > 0 && pred >= (1 << Al))
729
64.6k
              pred = (1 << Al) - 1;
730
958k
            pred = -pred;
731
958k
          }
732
3.33M
          workspace[9] = (JCOEF)pred;
733
3.33M
        }
734
        /* AC02 */
735
4.36M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
3.31M
          num = Q00 * (change_dc ?
737
2.39M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
2.39M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
3.31M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
3.31M
          if (num >= 0) {
741
2.08M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
2.08M
            if (Al > 0 && pred >= (1 << Al))
743
64.6k
              pred = (1 << Al) - 1;
744
2.08M
          } else {
745
1.22M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
1.22M
            if (Al > 0 && pred >= (1 << Al))
747
67.1k
              pred = (1 << Al) - 1;
748
1.22M
            pred = -pred;
749
1.22M
          }
750
3.31M
          workspace[2] = (JCOEF)pred;
751
3.31M
        }
752
4.36M
        if (change_dc) {
753
          /* AC03 */
754
2.39M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
2.39M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
2.39M
            if (num >= 0) {
757
1.72M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
1.72M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
1.72M
            } else {
761
669k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
669k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
669k
              pred = -pred;
765
669k
            }
766
2.39M
            workspace[3] = (JCOEF)pred;
767
2.39M
          }
768
          /* AC12 */
769
2.39M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
2.39M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
2.39M
            if (num >= 0) {
772
1.55M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
1.55M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
1.55M
            } else {
776
843k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
843k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
843k
              pred = -pred;
780
843k
            }
781
2.39M
            workspace[10] = (JCOEF)pred;
782
2.39M
          }
783
          /* AC21 */
784
2.39M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
2.39M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
2.39M
            if (num >= 0) {
787
1.53M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
1.53M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
1.53M
            } else {
791
858k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
858k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
858k
              pred = -pred;
795
858k
            }
796
2.39M
            workspace[17] = (JCOEF)pred;
797
2.39M
          }
798
          /* AC30 */
799
2.39M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
2.39M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
2.39M
            if (num >= 0) {
802
1.79M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
1.79M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
1.79M
            } else {
806
595k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
595k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
595k
              pred = -pred;
810
595k
            }
811
2.39M
            workspace[24] = (JCOEF)pred;
812
2.39M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
2.39M
          num = Q00 *
817
2.39M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
2.39M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
2.39M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
2.39M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
2.39M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
2.39M
          if (num >= 0) {
823
1.03M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
1.35M
          } else {
825
1.35M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
1.35M
            pred = -pred;
827
1.35M
          }
828
2.39M
          workspace[0] = (JCOEF)pred;
829
2.39M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
4.36M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
4.36M
                        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
4.36M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
4.36M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
4.36M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
4.36M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
4.36M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
4.36M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
4.36M
          prev_prev_block_row++, next_next_block_row++;
849
4.36M
        output_col += compptr->_DCT_scaled_size;
850
4.36M
      }
851
466k
      output_ptr += compptr->_DCT_scaled_size;
852
466k
    }
853
260k
  }
854
855
188k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
187k
    return JPEG_ROW_COMPLETED;
857
915
  return JPEG_SCAN_COMPLETED;
858
188k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
474
188k
{
475
188k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
188k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
188k
  JDIMENSION block_num, last_block_column;
478
188k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
188k
    image_block_rows;
480
188k
  JBLOCKARRAY buffer;
481
188k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
188k
  JBLOCKROW next_block_row, next_next_block_row;
483
188k
  _JSAMPARRAY output_ptr;
484
188k
  JDIMENSION output_col;
485
188k
  jpeg_component_info *compptr;
486
188k
  _inverse_DCT_method_ptr inverse_DCT;
487
188k
  boolean change_dc;
488
188k
  JCOEF *workspace;
489
188k
  int *coef_bits;
490
188k
  JQUANT_TBL *quanttbl;
491
188k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
188k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
188k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
188k
      DC25;
495
188k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
188k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
188k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
188k
         !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
448k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
260k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
260k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
260k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
257k
      block_rows = compptr->v_samp_factor;
526
257k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
257k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
1.18k
      block_rows = compptr->v_samp_factor;
529
1.18k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
1.53k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
1.53k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
1.53k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
1.53k
      access_rows = block_rows; /* this iMCU row only */
535
1.53k
    }
536
    /* Align the virtual buffer for this component. */
537
260k
    if (cinfo->output_iMCU_row > 1) {
538
257k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
257k
      buffer = (*cinfo->mem->access_virt_barray)
540
257k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
257k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
257k
         (JDIMENSION)access_rows, FALSE);
543
257k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
257k
    } else if (cinfo->output_iMCU_row > 0) {
545
1.18k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
1.18k
      buffer = (*cinfo->mem->access_virt_barray)
547
1.18k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
1.18k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
1.18k
         (JDIMENSION)access_rows, FALSE);
550
1.18k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
1.53k
    } else {
552
1.53k
      buffer = (*cinfo->mem->access_virt_barray)
553
1.53k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
1.53k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
1.53k
    }
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
260k
    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
260k
    else
564
260k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
260k
    change_dc =
568
260k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
136k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
129k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
260k
    quanttbl = compptr->quant_table;
573
260k
    Q00 = quanttbl->quantval[0];
574
260k
    Q01 = quanttbl->quantval[Q01_POS];
575
260k
    Q10 = quanttbl->quantval[Q10_POS];
576
260k
    Q20 = quanttbl->quantval[Q20_POS];
577
260k
    Q11 = quanttbl->quantval[Q11_POS];
578
260k
    Q02 = quanttbl->quantval[Q02_POS];
579
260k
    if (change_dc) {
580
121k
      Q03 = quanttbl->quantval[Q03_POS];
581
121k
      Q12 = quanttbl->quantval[Q12_POS];
582
121k
      Q21 = quanttbl->quantval[Q21_POS];
583
121k
      Q30 = quanttbl->quantval[Q30_POS];
584
121k
    }
585
260k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
260k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
260k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
726k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
466k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
466k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
466k
      if (image_block_row > 0)
594
464k
        prev_block_row =
595
464k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
1.53k
      else
597
1.53k
        prev_block_row = buffer_ptr;
598
599
466k
      if (image_block_row > 1)
600
463k
        prev_prev_block_row =
601
463k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
2.92k
      else
603
2.92k
        prev_prev_block_row = prev_block_row;
604
605
466k
      if (image_block_row < image_block_rows - 1)
606
464k
        next_block_row =
607
464k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
1.53k
      else
609
1.53k
        next_block_row = buffer_ptr;
610
611
466k
      if (image_block_row < image_block_rows - 2)
612
464k
        next_next_block_row =
613
464k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
2.37k
      else
615
2.37k
        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
466k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
466k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
466k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
466k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
466k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
466k
      output_col = 0;
626
466k
      last_block_column = compptr->width_in_blocks - 1;
627
466k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
4.83M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
4.36M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
4.36M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
466k
            block_num < last_block_column) {
634
321k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
321k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
321k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
321k
          DC19 = DC20 = (int)next_block_row[1][0];
638
321k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
321k
        }
640
4.36M
        if (block_num + 1 < last_block_column) {
641
3.58M
          DC05 = (int)prev_prev_block_row[2][0];
642
3.58M
          DC10 = (int)prev_block_row[2][0];
643
3.58M
          DC15 = (int)buffer_ptr[2][0];
644
3.58M
          DC20 = (int)next_block_row[2][0];
645
3.58M
          DC25 = (int)next_next_block_row[2][0];
646
3.58M
        }
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
4.36M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
3.51M
          num = Q00 * (change_dc ?
660
2.39M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
2.39M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
2.39M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
2.39M
                 DC21 - DC22 + DC24 + DC25) :
664
3.51M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
3.51M
          if (num >= 0) {
666
2.32M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
2.32M
            if (Al > 0 && pred >= (1 << Al))
668
82.4k
              pred = (1 << Al) - 1;
669
2.32M
          } else {
670
1.18M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
1.18M
            if (Al > 0 && pred >= (1 << Al))
672
53.0k
              pred = (1 << Al) - 1;
673
1.18M
            pred = -pred;
674
1.18M
          }
675
3.51M
          workspace[1] = (JCOEF)pred;
676
3.51M
        }
677
        /* AC10 */
678
4.36M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
3.60M
          num = Q00 * (change_dc ?
680
2.39M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
2.39M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
2.39M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
2.39M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
3.60M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
3.60M
          if (num >= 0) {
686
2.64M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
2.64M
            if (Al > 0 && pred >= (1 << Al))
688
87.0k
              pred = (1 << Al) - 1;
689
2.64M
          } else {
690
967k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
967k
            if (Al > 0 && pred >= (1 << Al))
692
84.7k
              pred = (1 << Al) - 1;
693
967k
            pred = -pred;
694
967k
          }
695
3.60M
          workspace[8] = (JCOEF)pred;
696
3.60M
        }
697
        /* AC20 */
698
4.36M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
3.43M
          num = Q00 * (change_dc ?
700
2.39M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
2.39M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
3.43M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
3.43M
          if (num >= 0) {
704
2.26M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
2.26M
            if (Al > 0 && pred >= (1 << Al))
706
76.6k
              pred = (1 << Al) - 1;
707
2.26M
          } else {
708
1.17M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
1.17M
            if (Al > 0 && pred >= (1 << Al))
710
77.8k
              pred = (1 << Al) - 1;
711
1.17M
            pred = -pred;
712
1.17M
          }
713
3.43M
          workspace[16] = (JCOEF)pred;
714
3.43M
        }
715
        /* AC11 */
716
4.36M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
3.33M
          num = Q00 * (change_dc ?
718
2.39M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
2.39M
                 9 * DC19 + DC21 - DC25) :
720
3.33M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
941k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
3.33M
          if (num >= 0) {
723
2.37M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
2.37M
            if (Al > 0 && pred >= (1 << Al))
725
64.9k
              pred = (1 << Al) - 1;
726
2.37M
          } else {
727
958k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
958k
            if (Al > 0 && pred >= (1 << Al))
729
64.6k
              pred = (1 << Al) - 1;
730
958k
            pred = -pred;
731
958k
          }
732
3.33M
          workspace[9] = (JCOEF)pred;
733
3.33M
        }
734
        /* AC02 */
735
4.36M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
3.31M
          num = Q00 * (change_dc ?
737
2.39M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
2.39M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
3.31M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
3.31M
          if (num >= 0) {
741
2.08M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
2.08M
            if (Al > 0 && pred >= (1 << Al))
743
64.6k
              pred = (1 << Al) - 1;
744
2.08M
          } else {
745
1.22M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
1.22M
            if (Al > 0 && pred >= (1 << Al))
747
67.1k
              pred = (1 << Al) - 1;
748
1.22M
            pred = -pred;
749
1.22M
          }
750
3.31M
          workspace[2] = (JCOEF)pred;
751
3.31M
        }
752
4.36M
        if (change_dc) {
753
          /* AC03 */
754
2.39M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
2.39M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
2.39M
            if (num >= 0) {
757
1.72M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
1.72M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
1.72M
            } else {
761
669k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
669k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
669k
              pred = -pred;
765
669k
            }
766
2.39M
            workspace[3] = (JCOEF)pred;
767
2.39M
          }
768
          /* AC12 */
769
2.39M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
2.39M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
2.39M
            if (num >= 0) {
772
1.55M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
1.55M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
1.55M
            } else {
776
843k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
843k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
843k
              pred = -pred;
780
843k
            }
781
2.39M
            workspace[10] = (JCOEF)pred;
782
2.39M
          }
783
          /* AC21 */
784
2.39M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
2.39M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
2.39M
            if (num >= 0) {
787
1.53M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
1.53M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
1.53M
            } else {
791
858k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
858k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
858k
              pred = -pred;
795
858k
            }
796
2.39M
            workspace[17] = (JCOEF)pred;
797
2.39M
          }
798
          /* AC30 */
799
2.39M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
2.39M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
2.39M
            if (num >= 0) {
802
1.79M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
1.79M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
1.79M
            } else {
806
595k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
595k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
595k
              pred = -pred;
810
595k
            }
811
2.39M
            workspace[24] = (JCOEF)pred;
812
2.39M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
2.39M
          num = Q00 *
817
2.39M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
2.39M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
2.39M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
2.39M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
2.39M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
2.39M
          if (num >= 0) {
823
1.03M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
1.35M
          } else {
825
1.35M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
1.35M
            pred = -pred;
827
1.35M
          }
828
2.39M
          workspace[0] = (JCOEF)pred;
829
2.39M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
4.36M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
4.36M
                        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
4.36M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
4.36M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
4.36M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
4.36M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
4.36M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
4.36M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
4.36M
          prev_prev_block_row++, next_next_block_row++;
849
4.36M
        output_col += compptr->_DCT_scaled_size;
850
4.36M
      }
851
466k
      output_ptr += compptr->_DCT_scaled_size;
852
466k
    }
853
260k
  }
854
855
188k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
187k
    return JPEG_ROW_COMPLETED;
857
915
  return JPEG_SCAN_COMPLETED;
858
188k
}
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
5.15k
{
870
5.15k
  my_coef_ptr coef;
871
872
5.15k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
5.15k
  coef = (my_coef_ptr)
876
5.15k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
5.15k
                                sizeof(my_coef_controller));
878
5.15k
  memset(coef, 0, sizeof(my_coef_controller));
879
5.15k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
5.15k
  coef->pub.start_input_pass = start_input_pass;
881
5.15k
  coef->pub.start_output_pass = start_output_pass;
882
5.15k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
5.15k
  coef->coef_bits_latch = NULL;
884
5.15k
#endif
885
886
  /* Create the coefficient buffer. */
887
5.15k
  if (need_full_buffer) {
888
2.72k
#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.72k
    int ci, access_rows;
893
2.72k
    jpeg_component_info *compptr;
894
895
9.04k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
6.32k
         ci++, compptr++) {
897
6.32k
      access_rows = compptr->v_samp_factor;
898
6.32k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
6.32k
      if (cinfo->progressive_mode)
901
6.22k
        access_rows *= 5;
902
6.32k
#endif
903
6.32k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
6.32k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
6.32k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
6.32k
                               (long)compptr->h_samp_factor),
907
6.32k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
6.32k
                               (long)compptr->v_samp_factor),
909
6.32k
         (JDIMENSION)access_rows);
910
6.32k
    }
911
2.72k
    coef->pub.consume_data = consume_data;
912
2.72k
    coef->pub._decompress_data = decompress_data;
913
2.72k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.72k
  } else {
918
    /* We only need a single-MCU buffer. */
919
2.43k
    JBLOCKROW buffer;
920
2.43k
    int i;
921
922
2.43k
    buffer = (JBLOCKROW)
923
2.43k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
2.43k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
26.7k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
24.3k
      coef->MCU_buffer[i] = buffer + i;
927
24.3k
    }
928
2.43k
    coef->pub.consume_data = dummy_consume_data;
929
2.43k
    coef->pub._decompress_data = decompress_onepass;
930
2.43k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
2.43k
  }
932
933
  /* Allocate the workspace buffer */
934
5.15k
  coef->workspace = (JCOEF *)
935
5.15k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
5.15k
                                sizeof(JCOEF) * DCTSIZE2);
937
5.15k
}
jinit_d_coef_controller
Line
Count
Source
869
4.65k
{
870
4.65k
  my_coef_ptr coef;
871
872
4.65k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
4.65k
  coef = (my_coef_ptr)
876
4.65k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
4.65k
                                sizeof(my_coef_controller));
878
4.65k
  memset(coef, 0, sizeof(my_coef_controller));
879
4.65k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
4.65k
  coef->pub.start_input_pass = start_input_pass;
881
4.65k
  coef->pub.start_output_pass = start_output_pass;
882
4.65k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
4.65k
  coef->coef_bits_latch = NULL;
884
4.65k
#endif
885
886
  /* Create the coefficient buffer. */
887
4.65k
  if (need_full_buffer) {
888
2.24k
#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.24k
    int ci, access_rows;
893
2.24k
    jpeg_component_info *compptr;
894
895
7.21k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
4.97k
         ci++, compptr++) {
897
4.97k
      access_rows = compptr->v_samp_factor;
898
4.97k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
4.97k
      if (cinfo->progressive_mode)
901
4.92k
        access_rows *= 5;
902
4.97k
#endif
903
4.97k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
4.97k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
4.97k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
4.97k
                               (long)compptr->h_samp_factor),
907
4.97k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
4.97k
                               (long)compptr->v_samp_factor),
909
4.97k
         (JDIMENSION)access_rows);
910
4.97k
    }
911
2.24k
    coef->pub.consume_data = consume_data;
912
2.24k
    coef->pub._decompress_data = decompress_data;
913
2.24k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.40k
  } else {
918
    /* We only need a single-MCU buffer. */
919
2.40k
    JBLOCKROW buffer;
920
2.40k
    int i;
921
922
2.40k
    buffer = (JBLOCKROW)
923
2.40k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
2.40k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
26.4k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
24.0k
      coef->MCU_buffer[i] = buffer + i;
927
24.0k
    }
928
2.40k
    coef->pub.consume_data = dummy_consume_data;
929
2.40k
    coef->pub._decompress_data = decompress_onepass;
930
2.40k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
2.40k
  }
932
933
  /* Allocate the workspace buffer */
934
4.65k
  coef->workspace = (JCOEF *)
935
4.65k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
4.65k
                                sizeof(JCOEF) * DCTSIZE2);
937
4.65k
}
j12init_d_coef_controller
Line
Count
Source
869
500
{
870
500
  my_coef_ptr coef;
871
872
500
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
500
  coef = (my_coef_ptr)
876
500
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
500
                                sizeof(my_coef_controller));
878
500
  memset(coef, 0, sizeof(my_coef_controller));
879
500
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
500
  coef->pub.start_input_pass = start_input_pass;
881
500
  coef->pub.start_output_pass = start_output_pass;
882
500
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
500
  coef->coef_bits_latch = NULL;
884
500
#endif
885
886
  /* Create the coefficient buffer. */
887
500
  if (need_full_buffer) {
888
478
#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
478
    int ci, access_rows;
893
478
    jpeg_component_info *compptr;
894
895
1.82k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
1.35k
         ci++, compptr++) {
897
1.35k
      access_rows = compptr->v_samp_factor;
898
1.35k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
1.35k
      if (cinfo->progressive_mode)
901
1.30k
        access_rows *= 5;
902
1.35k
#endif
903
1.35k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
1.35k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
1.35k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
1.35k
                               (long)compptr->h_samp_factor),
907
1.35k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
1.35k
                               (long)compptr->v_samp_factor),
909
1.35k
         (JDIMENSION)access_rows);
910
1.35k
    }
911
478
    coef->pub.consume_data = consume_data;
912
478
    coef->pub._decompress_data = decompress_data;
913
478
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
478
  } else {
918
    /* We only need a single-MCU buffer. */
919
22
    JBLOCKROW buffer;
920
22
    int i;
921
922
22
    buffer = (JBLOCKROW)
923
22
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
22
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
242
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
220
      coef->MCU_buffer[i] = buffer + i;
927
220
    }
928
22
    coef->pub.consume_data = dummy_consume_data;
929
22
    coef->pub._decompress_data = decompress_onepass;
930
22
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
22
  }
932
933
  /* Allocate the workspace buffer */
934
500
  coef->workspace = (JCOEF *)
935
500
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
500
                                sizeof(JCOEF) * DCTSIZE2);
937
500
}