Coverage Report

Created: 2026-07-16 06:55

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
13.5k
{
51
13.5k
  cinfo->input_iMCU_row = 0;
52
13.5k
  start_iMCU_row(cinfo);
53
13.5k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
50
12.3k
{
51
12.3k
  cinfo->input_iMCU_row = 0;
52
12.3k
  start_iMCU_row(cinfo);
53
12.3k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
50
1.17k
{
51
1.17k
  cinfo->input_iMCU_row = 0;
52
1.17k
  start_iMCU_row(cinfo);
53
1.17k
}
54
55
56
/*
57
 * Initialize for an output processing pass.
58
 */
59
60
METHODDEF(void)
61
start_output_pass(j_decompress_ptr cinfo)
62
3.97k
{
63
3.97k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
3.97k
  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.97k
  if (coef->pub.coef_arrays != NULL) {
68
1.88k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
987
      coef->pub._decompress_data = decompress_smooth_data;
70
895
    else
71
895
      coef->pub._decompress_data = decompress_data;
72
1.88k
  }
73
3.97k
#endif
74
3.97k
  cinfo->output_iMCU_row = 0;
75
3.97k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
62
3.76k
{
63
3.76k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
3.76k
  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.76k
  if (coef->pub.coef_arrays != NULL) {
68
1.68k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
897
      coef->pub._decompress_data = decompress_smooth_data;
70
786
    else
71
786
      coef->pub._decompress_data = decompress_data;
72
1.68k
  }
73
3.76k
#endif
74
3.76k
  cinfo->output_iMCU_row = 0;
75
3.76k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
62
207
{
63
207
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
207
  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
207
  if (coef->pub.coef_arrays != NULL) {
68
199
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
90
      coef->pub._decompress_data = decompress_smooth_data;
70
109
    else
71
109
      coef->pub._decompress_data = decompress_data;
72
199
  }
73
207
#endif
74
207
  cinfo->output_iMCU_row = 0;
75
207
}
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
42.9k
{
91
42.9k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
42.9k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
42.9k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
42.9k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
42.9k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
42.9k
  _JSAMPARRAY output_ptr;
97
42.9k
  JDIMENSION start_col, output_col;
98
42.9k
  jpeg_component_info *compptr;
99
42.9k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
87.4k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
44.4k
       yoffset++) {
104
1.12M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
1.08M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
1.08M
      jzero_far((void *)coef->MCU_buffer[0],
108
1.08M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
1.08M
      if (!cinfo->entropy->insufficient_data)
110
1.08M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
1.08M
      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.08M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
1.08M
          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.08M
        blkn = 0;               /* index of current DCT block within MCU */
142
3.63M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
2.55M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
2.55M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
2.55M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
2.55M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
2.40M
                         compptr->MCU_width : compptr->last_col_width;
152
2.55M
          output_ptr = output_buf[compptr->component_index] +
153
2.55M
                       yoffset * compptr->_DCT_scaled_size;
154
2.55M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
2.55M
                      compptr->MCU_sample_width;
156
5.32M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
2.76M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
2.68M
                yoffset + yindex < compptr->last_row_height) {
159
2.68M
              output_col = start_col;
160
5.49M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
2.81M
                (*inverse_DCT) (cinfo, compptr,
165
2.81M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
2.81M
                                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.81M
                output_col += compptr->_DCT_scaled_size;
173
2.81M
              }
174
2.68M
            }
175
2.76M
            blkn += compptr->MCU_width;
176
2.76M
            output_ptr += compptr->_DCT_scaled_size;
177
2.76M
          }
178
2.55M
        }
179
1.08M
      }
180
1.08M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
44.4k
    coef->MCU_ctr = 0;
183
44.4k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
42.9k
  cinfo->output_iMCU_row++;
186
42.9k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
40.8k
    start_iMCU_row(cinfo);
188
40.8k
    return JPEG_ROW_COMPLETED;
189
40.8k
  }
190
  /* Completed the scan */
191
2.08k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
2.08k
  return JPEG_SCAN_COMPLETED;
193
42.9k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
90
42.9k
{
91
42.9k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
42.9k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
42.9k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
42.9k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
42.9k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
42.9k
  _JSAMPARRAY output_ptr;
97
42.9k
  JDIMENSION start_col, output_col;
98
42.9k
  jpeg_component_info *compptr;
99
42.9k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
87.4k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
44.4k
       yoffset++) {
104
1.12M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
1.08M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
1.08M
      jzero_far((void *)coef->MCU_buffer[0],
108
1.08M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
1.08M
      if (!cinfo->entropy->insufficient_data)
110
1.08M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
1.08M
      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.08M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
1.08M
          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.08M
        blkn = 0;               /* index of current DCT block within MCU */
142
3.63M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
2.55M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
2.55M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
2.55M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
2.55M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
2.40M
                         compptr->MCU_width : compptr->last_col_width;
152
2.55M
          output_ptr = output_buf[compptr->component_index] +
153
2.55M
                       yoffset * compptr->_DCT_scaled_size;
154
2.55M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
2.55M
                      compptr->MCU_sample_width;
156
5.32M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
2.76M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
2.68M
                yoffset + yindex < compptr->last_row_height) {
159
2.68M
              output_col = start_col;
160
5.49M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
2.81M
                (*inverse_DCT) (cinfo, compptr,
165
2.81M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
2.81M
                                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.81M
                output_col += compptr->_DCT_scaled_size;
173
2.81M
              }
174
2.68M
            }
175
2.76M
            blkn += compptr->MCU_width;
176
2.76M
            output_ptr += compptr->_DCT_scaled_size;
177
2.76M
          }
178
2.55M
        }
179
1.08M
      }
180
1.08M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
44.4k
    coef->MCU_ctr = 0;
183
44.4k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
42.9k
  cinfo->output_iMCU_row++;
186
42.9k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
40.8k
    start_iMCU_row(cinfo);
188
40.8k
    return JPEG_ROW_COMPLETED;
189
40.8k
  }
190
  /* Completed the scan */
191
2.08k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
2.08k
  return JPEG_SCAN_COMPLETED;
193
42.9k
}
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
966k
{
219
966k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
966k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
966k
  int blkn, ci, xindex, yindex, yoffset;
222
966k
  JDIMENSION start_col;
223
966k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
966k
  JBLOCKROW buffer_ptr;
225
966k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
2.00M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
1.03M
    compptr = cinfo->cur_comp_info[ci];
230
1.03M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
1.03M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
1.03M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
1.03M
       (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.03M
  }
239
240
  /* Loop to process one whole iMCU row */
241
2.47M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
1.51M
       yoffset++) {
243
18.5M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
17.0M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
17.0M
      blkn = 0;                 /* index of current DCT block within MCU */
247
36.9M
      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
42.2M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
22.3M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
46.4M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
24.1M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
24.1M
          }
255
22.3M
        }
256
19.9M
      }
257
17.0M
      if (!cinfo->entropy->insufficient_data)
258
17.0M
        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.0M
      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.0M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
1.51M
    coef->MCU_ctr = 0;
282
1.51M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
966k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
955k
    start_iMCU_row(cinfo);
286
955k
    return JPEG_ROW_COMPLETED;
287
955k
  }
288
  /* Completed the scan */
289
11.4k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
11.4k
  return JPEG_SCAN_COMPLETED;
291
966k
}
jdcoefct-8.c:consume_data
Line
Count
Source
218
885k
{
219
885k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
885k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
885k
  int blkn, ci, xindex, yindex, yoffset;
222
885k
  JDIMENSION start_col;
223
885k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
885k
  JBLOCKROW buffer_ptr;
225
885k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
1.82M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
939k
    compptr = cinfo->cur_comp_info[ci];
230
939k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
939k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
939k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
939k
       (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
939k
  }
239
240
  /* Loop to process one whole iMCU row */
241
2.24M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
1.35M
       yoffset++) {
243
17.0M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
15.6M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
15.6M
      blkn = 0;                 /* index of current DCT block within MCU */
247
33.8M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
18.1M
        compptr = cinfo->cur_comp_info[ci];
249
18.1M
        start_col = MCU_col_num * compptr->MCU_width;
250
38.6M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
20.4M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
42.3M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
21.8M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
21.8M
          }
255
20.4M
        }
256
18.1M
      }
257
15.6M
      if (!cinfo->entropy->insufficient_data)
258
15.6M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
259
      /* Try to fetch the MCU. */
260
#ifdef WITH_PROFILE
261
      cinfo->master->start = getTime();
262
#endif
263
15.6M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
264
        /* Suspension forced; update state counters and exit */
265
0
        coef->MCU_vert_offset = yoffset;
266
0
        coef->MCU_ctr = MCU_col_num;
267
#ifdef WITH_PROFILE
268
        cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
269
        cinfo->master->entropy_mcoeffs +=
270
          (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
271
#endif
272
0
        return JPEG_SUSPENDED;
273
0
      }
274
#ifdef WITH_PROFILE
275
      cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
276
      cinfo->master->entropy_mcoeffs +=
277
        (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
278
#endif
279
15.6M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
1.35M
    coef->MCU_ctr = 0;
282
1.35M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
885k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
875k
    start_iMCU_row(cinfo);
286
875k
    return JPEG_ROW_COMPLETED;
287
875k
  }
288
  /* Completed the scan */
289
10.2k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
10.2k
  return JPEG_SCAN_COMPLETED;
291
885k
}
jdcoefct-12.c:consume_data
Line
Count
Source
218
81.1k
{
219
81.1k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
81.1k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
81.1k
  int blkn, ci, xindex, yindex, yoffset;
222
81.1k
  JDIMENSION start_col;
223
81.1k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
81.1k
  JBLOCKROW buffer_ptr;
225
81.1k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
177k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
96.0k
    compptr = cinfo->cur_comp_info[ci];
230
96.0k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
96.0k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
96.0k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
96.0k
       (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
96.0k
  }
239
240
  /* Loop to process one whole iMCU row */
241
236k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
155k
       yoffset++) {
243
1.53M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
1.38M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
1.38M
      blkn = 0;                 /* index of current DCT block within MCU */
247
3.14M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
1.76M
        compptr = cinfo->cur_comp_info[ci];
249
1.76M
        start_col = MCU_col_num * compptr->MCU_width;
250
3.68M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
1.92M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
4.15M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
2.23M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
2.23M
          }
255
1.92M
        }
256
1.76M
      }
257
1.38M
      if (!cinfo->entropy->insufficient_data)
258
1.38M
        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.38M
      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.38M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
155k
    coef->MCU_ctr = 0;
282
155k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
81.1k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
79.9k
    start_iMCU_row(cinfo);
286
79.9k
    return JPEG_ROW_COMPLETED;
287
79.9k
  }
288
  /* Completed the scan */
289
1.15k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
1.15k
  return JPEG_SCAN_COMPLETED;
291
81.1k
}
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
107k
{
305
107k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
107k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
107k
  JDIMENSION block_num;
308
107k
  int ci, block_row, block_rows;
309
107k
  JBLOCKARRAY buffer;
310
107k
  JBLOCKROW buffer_ptr;
311
107k
  _JSAMPARRAY output_ptr;
312
107k
  JDIMENSION output_col;
313
107k
  jpeg_component_info *compptr;
314
107k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
107k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
107k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
107k
          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
231k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
123k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
123k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
123k
    buffer = (*cinfo->mem->access_virt_barray)
332
123k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
123k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
123k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
123k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
121k
      block_rows = compptr->v_samp_factor;
338
1.96k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.96k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.96k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.96k
    }
343
123k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
123k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
287k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
164k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
164k
      output_col = 0;
349
164k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
1.77M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
1.61M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.61M
                        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.61M
        buffer_ptr++;
361
1.61M
        output_col += compptr->_DCT_scaled_size;
362
1.61M
      }
363
164k
      output_ptr += compptr->_DCT_scaled_size;
364
164k
    }
365
123k
  }
366
367
107k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
107k
    return JPEG_ROW_COMPLETED;
369
786
  return JPEG_SCAN_COMPLETED;
370
107k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
304
107k
{
305
107k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
107k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
107k
  JDIMENSION block_num;
308
107k
  int ci, block_row, block_rows;
309
107k
  JBLOCKARRAY buffer;
310
107k
  JBLOCKROW buffer_ptr;
311
107k
  _JSAMPARRAY output_ptr;
312
107k
  JDIMENSION output_col;
313
107k
  jpeg_component_info *compptr;
314
107k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
107k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
107k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
107k
          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
231k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
123k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
123k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
123k
    buffer = (*cinfo->mem->access_virt_barray)
332
123k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
123k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
123k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
123k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
121k
      block_rows = compptr->v_samp_factor;
338
1.96k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.96k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.96k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.96k
    }
343
123k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
123k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
287k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
164k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
164k
      output_col = 0;
349
164k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
1.77M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
1.61M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.61M
                        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.61M
        buffer_ptr++;
361
1.61M
        output_col += compptr->_DCT_scaled_size;
362
1.61M
      }
363
164k
      output_ptr += compptr->_DCT_scaled_size;
364
164k
    }
365
123k
  }
366
367
107k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
107k
    return JPEG_ROW_COMPLETED;
369
786
  return JPEG_SCAN_COMPLETED;
370
107k
}
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
108k
#define Q01_POS  1
386
108k
#define Q10_POS  8
387
108k
#define Q20_POS  16
388
108k
#define Q11_POS  9
389
108k
#define Q02_POS  2
390
49.3k
#define Q03_POS  3
391
49.2k
#define Q12_POS  10
392
49.2k
#define Q21_POS  17
393
49.2k
#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.88k
{
406
1.88k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.88k
  boolean smoothing_useful = FALSE;
408
1.88k
  int ci, coefi;
409
1.88k
  jpeg_component_info *compptr;
410
1.88k
  JQUANT_TBL *qtable;
411
1.88k
  int *coef_bits, *prev_coef_bits;
412
1.88k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.88k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
13
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.86k
  if (coef->coef_bits_latch == NULL)
419
1.86k
    coef->coef_bits_latch = (int *)
420
1.86k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.86k
                                  cinfo->num_components * 2 *
422
1.86k
                                  (SAVED_COEFS * sizeof(int)));
423
1.86k
  coef_bits_latch = coef->coef_bits_latch;
424
1.86k
  prev_coef_bits_latch =
425
1.86k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
4.69k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
3.26k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
3.26k
    if ((qtable = compptr->quant_table) == NULL)
431
38
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
3.22k
    if (qtable->quantval[0] == 0 ||
434
3.19k
        qtable->quantval[Q01_POS] == 0 ||
435
3.18k
        qtable->quantval[Q10_POS] == 0 ||
436
3.14k
        qtable->quantval[Q20_POS] == 0 ||
437
3.09k
        qtable->quantval[Q11_POS] == 0 ||
438
2.99k
        qtable->quantval[Q02_POS] == 0 ||
439
2.95k
        qtable->quantval[Q03_POS] == 0 ||
440
2.92k
        qtable->quantval[Q12_POS] == 0 ||
441
2.89k
        qtable->quantval[Q21_POS] == 0 ||
442
2.84k
        qtable->quantval[Q30_POS] == 0)
443
399
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
2.83k
    coef_bits = cinfo->coef_bits[ci];
446
2.83k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
2.83k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
2.83k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
28.3k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
25.4k
      if (cinfo->input_scan_number > 1)
453
19.1k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
6.31k
      else
455
6.31k
        prev_coef_bits_latch[coefi] = -1;
456
25.4k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
25.4k
      if (coef_bits[coefi] != 0)
458
13.2k
        smoothing_useful = TRUE;
459
25.4k
    }
460
2.83k
    coef_bits_latch += SAVED_COEFS;
461
2.83k
    prev_coef_bits_latch += SAVED_COEFS;
462
2.83k
  }
463
464
1.43k
  return smoothing_useful;
465
1.86k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
405
1.68k
{
406
1.68k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.68k
  boolean smoothing_useful = FALSE;
408
1.68k
  int ci, coefi;
409
1.68k
  jpeg_component_info *compptr;
410
1.68k
  JQUANT_TBL *qtable;
411
1.68k
  int *coef_bits, *prev_coef_bits;
412
1.68k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.68k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
7
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.67k
  if (coef->coef_bits_latch == NULL)
419
1.67k
    coef->coef_bits_latch = (int *)
420
1.67k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.67k
                                  cinfo->num_components * 2 *
422
1.67k
                                  (SAVED_COEFS * sizeof(int)));
423
1.67k
  coef_bits_latch = coef->coef_bits_latch;
424
1.67k
  prev_coef_bits_latch =
425
1.67k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
4.21k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
2.87k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
2.87k
    if ((qtable = compptr->quant_table) == NULL)
431
36
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
2.84k
    if (qtable->quantval[0] == 0 ||
434
2.81k
        qtable->quantval[Q01_POS] == 0 ||
435
2.80k
        qtable->quantval[Q10_POS] == 0 ||
436
2.79k
        qtable->quantval[Q20_POS] == 0 ||
437
2.75k
        qtable->quantval[Q11_POS] == 0 ||
438
2.66k
        qtable->quantval[Q02_POS] == 0 ||
439
2.64k
        qtable->quantval[Q03_POS] == 0 ||
440
2.61k
        qtable->quantval[Q12_POS] == 0 ||
441
2.59k
        qtable->quantval[Q21_POS] == 0 ||
442
2.55k
        qtable->quantval[Q30_POS] == 0)
443
299
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
2.54k
    coef_bits = cinfo->coef_bits[ci];
446
2.54k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
2.54k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
2.54k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
25.4k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
22.8k
      if (cinfo->input_scan_number > 1)
453
17.8k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
5.04k
      else
455
5.04k
        prev_coef_bits_latch[coefi] = -1;
456
22.8k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
22.8k
      if (coef_bits[coefi] != 0)
458
10.8k
        smoothing_useful = TRUE;
459
22.8k
    }
460
2.54k
    coef_bits_latch += SAVED_COEFS;
461
2.54k
    prev_coef_bits_latch += SAVED_COEFS;
462
2.54k
  }
463
464
1.34k
  return smoothing_useful;
465
1.67k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
405
199
{
406
199
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
199
  boolean smoothing_useful = FALSE;
408
199
  int ci, coefi;
409
199
  jpeg_component_info *compptr;
410
199
  JQUANT_TBL *qtable;
411
199
  int *coef_bits, *prev_coef_bits;
412
199
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
199
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
6
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
193
  if (coef->coef_bits_latch == NULL)
419
193
    coef->coef_bits_latch = (int *)
420
193
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
193
                                  cinfo->num_components * 2 *
422
193
                                  (SAVED_COEFS * sizeof(int)));
423
193
  coef_bits_latch = coef->coef_bits_latch;
424
193
  prev_coef_bits_latch =
425
193
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
481
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
390
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
390
    if ((qtable = compptr->quant_table) == NULL)
431
2
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
388
    if (qtable->quantval[0] == 0 ||
434
381
        qtable->quantval[Q01_POS] == 0 ||
435
374
        qtable->quantval[Q10_POS] == 0 ||
436
352
        qtable->quantval[Q20_POS] == 0 ||
437
340
        qtable->quantval[Q11_POS] == 0 ||
438
327
        qtable->quantval[Q02_POS] == 0 ||
439
317
        qtable->quantval[Q03_POS] == 0 ||
440
311
        qtable->quantval[Q12_POS] == 0 ||
441
304
        qtable->quantval[Q21_POS] == 0 ||
442
298
        qtable->quantval[Q30_POS] == 0)
443
100
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
288
    coef_bits = cinfo->coef_bits[ci];
446
288
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
288
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
288
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
2.88k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
2.59k
      if (cinfo->input_scan_number > 1)
453
1.32k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
1.26k
      else
455
1.26k
        prev_coef_bits_latch[coefi] = -1;
456
2.59k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
2.59k
      if (coef_bits[coefi] != 0)
458
2.35k
        smoothing_useful = TRUE;
459
2.59k
    }
460
288
    coef_bits_latch += SAVED_COEFS;
461
288
    prev_coef_bits_latch += SAVED_COEFS;
462
288
  }
463
464
91
  return smoothing_useful;
465
193
}
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
101k
{
475
101k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
101k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
101k
  JDIMENSION block_num, last_block_column;
478
101k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
101k
    image_block_rows;
480
101k
  JBLOCKARRAY buffer;
481
101k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
101k
  JBLOCKROW next_block_row, next_next_block_row;
483
101k
  _JSAMPARRAY output_ptr;
484
101k
  JDIMENSION output_col;
485
101k
  jpeg_component_info *compptr;
486
101k
  _inverse_DCT_method_ptr inverse_DCT;
487
101k
  boolean change_dc;
488
101k
  JCOEF *workspace;
489
101k
  int *coef_bits;
490
101k
  JQUANT_TBL *quanttbl;
491
101k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
101k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
101k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
101k
      DC25;
495
101k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
101k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
101k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
101k
         !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
207k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
105k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
105k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
105k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
103k
      block_rows = compptr->v_samp_factor;
526
103k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
103k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
1.08k
      block_rows = compptr->v_samp_factor;
529
1.08k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
1.26k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
1.26k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
1.26k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
1.26k
      access_rows = block_rows; /* this iMCU row only */
535
1.26k
    }
536
    /* Align the virtual buffer for this component. */
537
105k
    if (cinfo->output_iMCU_row > 1) {
538
103k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
103k
      buffer = (*cinfo->mem->access_virt_barray)
540
103k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
103k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
103k
         (JDIMENSION)access_rows, FALSE);
543
103k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
103k
    } else if (cinfo->output_iMCU_row > 0) {
545
1.08k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
1.08k
      buffer = (*cinfo->mem->access_virt_barray)
547
1.08k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
1.08k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
1.08k
         (JDIMENSION)access_rows, FALSE);
550
1.08k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
1.26k
    } else {
552
1.26k
      buffer = (*cinfo->mem->access_virt_barray)
553
1.26k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
1.26k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
1.26k
    }
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
105k
    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
105k
    else
564
105k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
105k
    change_dc =
568
105k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
67.9k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
65.0k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
105k
    quanttbl = compptr->quant_table;
573
105k
    Q00 = quanttbl->quantval[0];
574
105k
    Q01 = quanttbl->quantval[Q01_POS];
575
105k
    Q10 = quanttbl->quantval[Q10_POS];
576
105k
    Q20 = quanttbl->quantval[Q20_POS];
577
105k
    Q11 = quanttbl->quantval[Q11_POS];
578
105k
    Q02 = quanttbl->quantval[Q02_POS];
579
105k
    if (change_dc) {
580
46.3k
      Q03 = quanttbl->quantval[Q03_POS];
581
46.3k
      Q12 = quanttbl->quantval[Q12_POS];
582
46.3k
      Q21 = quanttbl->quantval[Q21_POS];
583
46.3k
      Q30 = quanttbl->quantval[Q30_POS];
584
46.3k
    }
585
105k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
105k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
105k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
307k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
201k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
201k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
201k
      if (image_block_row > 0)
594
200k
        prev_block_row =
595
200k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
1.26k
      else
597
1.26k
        prev_block_row = buffer_ptr;
598
599
201k
      if (image_block_row > 1)
600
199k
        prev_prev_block_row =
601
199k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
2.43k
      else
603
2.43k
        prev_prev_block_row = prev_block_row;
604
605
201k
      if (image_block_row < image_block_rows - 1)
606
200k
        next_block_row =
607
200k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
1.26k
      else
609
1.26k
        next_block_row = buffer_ptr;
610
611
201k
      if (image_block_row < image_block_rows - 2)
612
200k
        next_next_block_row =
613
200k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
1.87k
      else
615
1.87k
        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
201k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
201k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
201k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
201k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
201k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
201k
      output_col = 0;
626
201k
      last_block_column = compptr->width_in_blocks - 1;
627
201k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
3.75M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
3.55M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
3.55M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
201k
            block_num < last_block_column) {
634
128k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
128k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
128k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
128k
          DC19 = DC20 = (int)next_block_row[1][0];
638
128k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
128k
        }
640
3.55M
        if (block_num + 1 < last_block_column) {
641
3.22M
          DC05 = (int)prev_prev_block_row[2][0];
642
3.22M
          DC10 = (int)prev_block_row[2][0];
643
3.22M
          DC15 = (int)buffer_ptr[2][0];
644
3.22M
          DC20 = (int)next_block_row[2][0];
645
3.22M
          DC25 = (int)next_next_block_row[2][0];
646
3.22M
        }
647
        /* If DC interpolation is enabled, compute coefficient estimates using
648
         * a Gaussian-like kernel, keeping the averages of the DC values.
649
         *
650
         * If DC interpolation is disabled, compute coefficient estimates using
651
         * an algorithm similar to the one described in Section K.8 of the JPEG
652
         * standard, except applied to a 5x5 window rather than a 3x3 window.
653
         *
654
         * An estimate is applied only if the coefficient is still zero and is
655
         * not known to be fully accurate.
656
         */
657
        /* AC01 */
658
3.55M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
3.05M
          num = Q00 * (change_dc ?
660
1.95M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
1.95M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
1.95M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
1.95M
                 DC21 - DC22 + DC24 + DC25) :
664
3.05M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
3.05M
          if (num >= 0) {
666
1.85M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
1.85M
            if (Al > 0 && pred >= (1 << Al))
668
21.7k
              pred = (1 << Al) - 1;
669
1.85M
          } else {
670
1.19M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
1.19M
            if (Al > 0 && pred >= (1 << Al))
672
17.2k
              pred = (1 << Al) - 1;
673
1.19M
            pred = -pred;
674
1.19M
          }
675
3.05M
          workspace[1] = (JCOEF)pred;
676
3.05M
        }
677
        /* AC10 */
678
3.55M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
3.17M
          num = Q00 * (change_dc ?
680
1.95M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
1.95M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
1.95M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
1.95M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
3.17M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
3.17M
          if (num >= 0) {
686
2.01M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
2.01M
            if (Al > 0 && pred >= (1 << Al))
688
220k
              pred = (1 << Al) - 1;
689
2.01M
          } else {
690
1.15M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
1.15M
            if (Al > 0 && pred >= (1 << Al))
692
168k
              pred = (1 << Al) - 1;
693
1.15M
            pred = -pred;
694
1.15M
          }
695
3.17M
          workspace[8] = (JCOEF)pred;
696
3.17M
        }
697
        /* AC20 */
698
3.55M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
3.28M
          num = Q00 * (change_dc ?
700
1.95M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
1.95M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
3.28M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
3.28M
          if (num >= 0) {
704
1.80M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
1.80M
            if (Al > 0 && pred >= (1 << Al))
706
83.3k
              pred = (1 << Al) - 1;
707
1.80M
          } else {
708
1.48M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
1.48M
            if (Al > 0 && pred >= (1 << Al))
710
84.7k
              pred = (1 << Al) - 1;
711
1.48M
            pred = -pred;
712
1.48M
          }
713
3.28M
          workspace[16] = (JCOEF)pred;
714
3.28M
        }
715
        /* AC11 */
716
3.55M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
3.11M
          num = Q00 * (change_dc ?
718
1.95M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
1.95M
                 9 * DC19 + DC21 - DC25) :
720
3.11M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
1.16M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
3.11M
          if (num >= 0) {
723
1.88M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
1.88M
            if (Al > 0 && pred >= (1 << Al))
725
31.7k
              pred = (1 << Al) - 1;
726
1.88M
          } else {
727
1.22M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
1.22M
            if (Al > 0 && pred >= (1 << Al))
729
31.5k
              pred = (1 << Al) - 1;
730
1.22M
            pred = -pred;
731
1.22M
          }
732
3.11M
          workspace[9] = (JCOEF)pred;
733
3.11M
        }
734
        /* AC02 */
735
3.55M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
3.15M
          num = Q00 * (change_dc ?
737
1.95M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
1.95M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
3.15M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
3.15M
          if (num >= 0) {
741
1.77M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
1.77M
            if (Al > 0 && pred >= (1 << Al))
743
35.3k
              pred = (1 << Al) - 1;
744
1.77M
          } else {
745
1.38M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
1.38M
            if (Al > 0 && pred >= (1 << Al))
747
34.0k
              pred = (1 << Al) - 1;
748
1.38M
            pred = -pred;
749
1.38M
          }
750
3.15M
          workspace[2] = (JCOEF)pred;
751
3.15M
        }
752
3.55M
        if (change_dc) {
753
          /* AC03 */
754
1.95M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
1.95M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
1.95M
            if (num >= 0) {
757
1.24M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
1.24M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
1.24M
            } else {
761
709k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
709k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
709k
              pred = -pred;
765
709k
            }
766
1.95M
            workspace[3] = (JCOEF)pred;
767
1.95M
          }
768
          /* AC12 */
769
1.95M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
1.95M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
1.95M
            if (num >= 0) {
772
1.02M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
1.02M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
1.02M
            } else {
776
927k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
927k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
927k
              pred = -pred;
780
927k
            }
781
1.95M
            workspace[10] = (JCOEF)pred;
782
1.95M
          }
783
          /* AC21 */
784
1.95M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
1.95M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
1.95M
            if (num >= 0) {
787
1.08M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
1.08M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
1.08M
            } else {
791
870k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
870k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
870k
              pred = -pred;
795
870k
            }
796
1.95M
            workspace[17] = (JCOEF)pred;
797
1.95M
          }
798
          /* AC30 */
799
1.95M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
1.95M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
1.95M
            if (num >= 0) {
802
1.22M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
1.22M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
1.22M
            } else {
806
731k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
731k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
731k
              pred = -pred;
810
731k
            }
811
1.95M
            workspace[24] = (JCOEF)pred;
812
1.95M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
1.95M
          num = Q00 *
817
1.95M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
1.95M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
1.95M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
1.95M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
1.95M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
1.95M
          if (num >= 0) {
823
876k
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
1.07M
          } else {
825
1.07M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
1.07M
            pred = -pred;
827
1.07M
          }
828
1.95M
          workspace[0] = (JCOEF)pred;
829
1.95M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
3.55M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
3.55M
                        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
3.55M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
3.55M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
3.55M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
3.55M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
3.55M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
3.55M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
3.55M
          prev_prev_block_row++, next_next_block_row++;
849
3.55M
        output_col += compptr->_DCT_scaled_size;
850
3.55M
      }
851
201k
      output_ptr += compptr->_DCT_scaled_size;
852
201k
    }
853
105k
  }
854
855
101k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
100k
    return JPEG_ROW_COMPLETED;
857
897
  return JPEG_SCAN_COMPLETED;
858
101k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
474
101k
{
475
101k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
101k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
101k
  JDIMENSION block_num, last_block_column;
478
101k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
101k
    image_block_rows;
480
101k
  JBLOCKARRAY buffer;
481
101k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
101k
  JBLOCKROW next_block_row, next_next_block_row;
483
101k
  _JSAMPARRAY output_ptr;
484
101k
  JDIMENSION output_col;
485
101k
  jpeg_component_info *compptr;
486
101k
  _inverse_DCT_method_ptr inverse_DCT;
487
101k
  boolean change_dc;
488
101k
  JCOEF *workspace;
489
101k
  int *coef_bits;
490
101k
  JQUANT_TBL *quanttbl;
491
101k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
101k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
101k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
101k
      DC25;
495
101k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
101k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
101k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
101k
         !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
207k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
105k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
105k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
105k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
103k
      block_rows = compptr->v_samp_factor;
526
103k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
103k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
1.08k
      block_rows = compptr->v_samp_factor;
529
1.08k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
1.26k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
1.26k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
1.26k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
1.26k
      access_rows = block_rows; /* this iMCU row only */
535
1.26k
    }
536
    /* Align the virtual buffer for this component. */
537
105k
    if (cinfo->output_iMCU_row > 1) {
538
103k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
103k
      buffer = (*cinfo->mem->access_virt_barray)
540
103k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
103k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
103k
         (JDIMENSION)access_rows, FALSE);
543
103k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
103k
    } else if (cinfo->output_iMCU_row > 0) {
545
1.08k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
1.08k
      buffer = (*cinfo->mem->access_virt_barray)
547
1.08k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
1.08k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
1.08k
         (JDIMENSION)access_rows, FALSE);
550
1.08k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
1.26k
    } else {
552
1.26k
      buffer = (*cinfo->mem->access_virt_barray)
553
1.26k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
1.26k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
1.26k
    }
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
105k
    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
105k
    else
564
105k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
105k
    change_dc =
568
105k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
67.9k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
65.0k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
105k
    quanttbl = compptr->quant_table;
573
105k
    Q00 = quanttbl->quantval[0];
574
105k
    Q01 = quanttbl->quantval[Q01_POS];
575
105k
    Q10 = quanttbl->quantval[Q10_POS];
576
105k
    Q20 = quanttbl->quantval[Q20_POS];
577
105k
    Q11 = quanttbl->quantval[Q11_POS];
578
105k
    Q02 = quanttbl->quantval[Q02_POS];
579
105k
    if (change_dc) {
580
46.3k
      Q03 = quanttbl->quantval[Q03_POS];
581
46.3k
      Q12 = quanttbl->quantval[Q12_POS];
582
46.3k
      Q21 = quanttbl->quantval[Q21_POS];
583
46.3k
      Q30 = quanttbl->quantval[Q30_POS];
584
46.3k
    }
585
105k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
105k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
105k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
307k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
201k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
201k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
201k
      if (image_block_row > 0)
594
200k
        prev_block_row =
595
200k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
1.26k
      else
597
1.26k
        prev_block_row = buffer_ptr;
598
599
201k
      if (image_block_row > 1)
600
199k
        prev_prev_block_row =
601
199k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
2.43k
      else
603
2.43k
        prev_prev_block_row = prev_block_row;
604
605
201k
      if (image_block_row < image_block_rows - 1)
606
200k
        next_block_row =
607
200k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
1.26k
      else
609
1.26k
        next_block_row = buffer_ptr;
610
611
201k
      if (image_block_row < image_block_rows - 2)
612
200k
        next_next_block_row =
613
200k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
1.87k
      else
615
1.87k
        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
201k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
201k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
201k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
201k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
201k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
201k
      output_col = 0;
626
201k
      last_block_column = compptr->width_in_blocks - 1;
627
201k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
3.75M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
3.55M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
3.55M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
201k
            block_num < last_block_column) {
634
128k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
128k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
128k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
128k
          DC19 = DC20 = (int)next_block_row[1][0];
638
128k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
128k
        }
640
3.55M
        if (block_num + 1 < last_block_column) {
641
3.22M
          DC05 = (int)prev_prev_block_row[2][0];
642
3.22M
          DC10 = (int)prev_block_row[2][0];
643
3.22M
          DC15 = (int)buffer_ptr[2][0];
644
3.22M
          DC20 = (int)next_block_row[2][0];
645
3.22M
          DC25 = (int)next_next_block_row[2][0];
646
3.22M
        }
647
        /* If DC interpolation is enabled, compute coefficient estimates using
648
         * a Gaussian-like kernel, keeping the averages of the DC values.
649
         *
650
         * If DC interpolation is disabled, compute coefficient estimates using
651
         * an algorithm similar to the one described in Section K.8 of the JPEG
652
         * standard, except applied to a 5x5 window rather than a 3x3 window.
653
         *
654
         * An estimate is applied only if the coefficient is still zero and is
655
         * not known to be fully accurate.
656
         */
657
        /* AC01 */
658
3.55M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
3.05M
          num = Q00 * (change_dc ?
660
1.95M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
1.95M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
1.95M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
1.95M
                 DC21 - DC22 + DC24 + DC25) :
664
3.05M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
3.05M
          if (num >= 0) {
666
1.85M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
1.85M
            if (Al > 0 && pred >= (1 << Al))
668
21.7k
              pred = (1 << Al) - 1;
669
1.85M
          } else {
670
1.19M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
1.19M
            if (Al > 0 && pred >= (1 << Al))
672
17.2k
              pred = (1 << Al) - 1;
673
1.19M
            pred = -pred;
674
1.19M
          }
675
3.05M
          workspace[1] = (JCOEF)pred;
676
3.05M
        }
677
        /* AC10 */
678
3.55M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
3.17M
          num = Q00 * (change_dc ?
680
1.95M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
1.95M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
1.95M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
1.95M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
3.17M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
3.17M
          if (num >= 0) {
686
2.01M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
2.01M
            if (Al > 0 && pred >= (1 << Al))
688
220k
              pred = (1 << Al) - 1;
689
2.01M
          } else {
690
1.15M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
1.15M
            if (Al > 0 && pred >= (1 << Al))
692
168k
              pred = (1 << Al) - 1;
693
1.15M
            pred = -pred;
694
1.15M
          }
695
3.17M
          workspace[8] = (JCOEF)pred;
696
3.17M
        }
697
        /* AC20 */
698
3.55M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
3.28M
          num = Q00 * (change_dc ?
700
1.95M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
1.95M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
3.28M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
3.28M
          if (num >= 0) {
704
1.80M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
1.80M
            if (Al > 0 && pred >= (1 << Al))
706
83.3k
              pred = (1 << Al) - 1;
707
1.80M
          } else {
708
1.48M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
1.48M
            if (Al > 0 && pred >= (1 << Al))
710
84.7k
              pred = (1 << Al) - 1;
711
1.48M
            pred = -pred;
712
1.48M
          }
713
3.28M
          workspace[16] = (JCOEF)pred;
714
3.28M
        }
715
        /* AC11 */
716
3.55M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
3.11M
          num = Q00 * (change_dc ?
718
1.95M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
1.95M
                 9 * DC19 + DC21 - DC25) :
720
3.11M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
1.16M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
3.11M
          if (num >= 0) {
723
1.88M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
1.88M
            if (Al > 0 && pred >= (1 << Al))
725
31.7k
              pred = (1 << Al) - 1;
726
1.88M
          } else {
727
1.22M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
1.22M
            if (Al > 0 && pred >= (1 << Al))
729
31.5k
              pred = (1 << Al) - 1;
730
1.22M
            pred = -pred;
731
1.22M
          }
732
3.11M
          workspace[9] = (JCOEF)pred;
733
3.11M
        }
734
        /* AC02 */
735
3.55M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
3.15M
          num = Q00 * (change_dc ?
737
1.95M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
1.95M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
3.15M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
3.15M
          if (num >= 0) {
741
1.77M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
1.77M
            if (Al > 0 && pred >= (1 << Al))
743
35.3k
              pred = (1 << Al) - 1;
744
1.77M
          } else {
745
1.38M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
1.38M
            if (Al > 0 && pred >= (1 << Al))
747
34.0k
              pred = (1 << Al) - 1;
748
1.38M
            pred = -pred;
749
1.38M
          }
750
3.15M
          workspace[2] = (JCOEF)pred;
751
3.15M
        }
752
3.55M
        if (change_dc) {
753
          /* AC03 */
754
1.95M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
1.95M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
1.95M
            if (num >= 0) {
757
1.24M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
1.24M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
1.24M
            } else {
761
709k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
709k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
709k
              pred = -pred;
765
709k
            }
766
1.95M
            workspace[3] = (JCOEF)pred;
767
1.95M
          }
768
          /* AC12 */
769
1.95M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
1.95M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
1.95M
            if (num >= 0) {
772
1.02M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
1.02M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
1.02M
            } else {
776
927k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
927k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
927k
              pred = -pred;
780
927k
            }
781
1.95M
            workspace[10] = (JCOEF)pred;
782
1.95M
          }
783
          /* AC21 */
784
1.95M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
1.95M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
1.95M
            if (num >= 0) {
787
1.08M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
1.08M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
1.08M
            } else {
791
870k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
870k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
870k
              pred = -pred;
795
870k
            }
796
1.95M
            workspace[17] = (JCOEF)pred;
797
1.95M
          }
798
          /* AC30 */
799
1.95M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
1.95M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
1.95M
            if (num >= 0) {
802
1.22M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
1.22M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
1.22M
            } else {
806
731k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
731k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
731k
              pred = -pred;
810
731k
            }
811
1.95M
            workspace[24] = (JCOEF)pred;
812
1.95M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
1.95M
          num = Q00 *
817
1.95M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
1.95M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
1.95M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
1.95M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
1.95M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
1.95M
          if (num >= 0) {
823
876k
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
1.07M
          } else {
825
1.07M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
1.07M
            pred = -pred;
827
1.07M
          }
828
1.95M
          workspace[0] = (JCOEF)pred;
829
1.95M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
3.55M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
3.55M
                        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
3.55M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
3.55M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
3.55M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
3.55M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
3.55M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
3.55M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
3.55M
          prev_prev_block_row++, next_next_block_row++;
849
3.55M
        output_col += compptr->_DCT_scaled_size;
850
3.55M
      }
851
201k
      output_ptr += compptr->_DCT_scaled_size;
852
201k
    }
853
105k
  }
854
855
101k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
100k
    return JPEG_ROW_COMPLETED;
857
897
  return JPEG_SCAN_COMPLETED;
858
101k
}
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.18k
{
870
5.18k
  my_coef_ptr coef;
871
872
5.18k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
5.18k
  coef = (my_coef_ptr)
876
5.18k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
5.18k
                                sizeof(my_coef_controller));
878
5.18k
  memset(coef, 0, sizeof(my_coef_controller));
879
5.18k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
5.18k
  coef->pub.start_input_pass = start_input_pass;
881
5.18k
  coef->pub.start_output_pass = start_output_pass;
882
5.18k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
5.18k
  coef->coef_bits_latch = NULL;
884
5.18k
#endif
885
886
  /* Create the coefficient buffer. */
887
5.18k
  if (need_full_buffer) {
888
2.97k
#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.97k
    int ci, access_rows;
893
2.97k
    jpeg_component_info *compptr;
894
895
9.66k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
6.69k
         ci++, compptr++) {
897
6.69k
      access_rows = compptr->v_samp_factor;
898
6.69k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
6.69k
      if (cinfo->progressive_mode)
901
6.55k
        access_rows *= 5;
902
6.69k
#endif
903
6.69k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
6.69k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
6.69k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
6.69k
                               (long)compptr->h_samp_factor),
907
6.69k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
6.69k
                               (long)compptr->v_samp_factor),
909
6.69k
         (JDIMENSION)access_rows);
910
6.69k
    }
911
2.97k
    coef->pub.consume_data = consume_data;
912
2.97k
    coef->pub._decompress_data = decompress_data;
913
2.97k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.97k
  } else {
918
    /* We only need a single-MCU buffer. */
919
2.21k
    JBLOCKROW buffer;
920
2.21k
    int i;
921
922
2.21k
    buffer = (JBLOCKROW)
923
2.21k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
2.21k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
24.3k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
22.1k
      coef->MCU_buffer[i] = buffer + i;
927
22.1k
    }
928
2.21k
    coef->pub.consume_data = dummy_consume_data;
929
2.21k
    coef->pub._decompress_data = decompress_onepass;
930
2.21k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
2.21k
  }
932
933
  /* Allocate the workspace buffer */
934
5.18k
  coef->workspace = (JCOEF *)
935
5.18k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
5.18k
                                sizeof(JCOEF) * DCTSIZE2);
937
5.18k
}
jinit_d_coef_controller
Line
Count
Source
869
4.57k
{
870
4.57k
  my_coef_ptr coef;
871
872
4.57k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
4.57k
  coef = (my_coef_ptr)
876
4.57k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
4.57k
                                sizeof(my_coef_controller));
878
4.57k
  memset(coef, 0, sizeof(my_coef_controller));
879
4.57k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
4.57k
  coef->pub.start_input_pass = start_input_pass;
881
4.57k
  coef->pub.start_output_pass = start_output_pass;
882
4.57k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
4.57k
  coef->coef_bits_latch = NULL;
884
4.57k
#endif
885
886
  /* Create the coefficient buffer. */
887
4.57k
  if (need_full_buffer) {
888
2.38k
#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.38k
    int ci, access_rows;
893
2.38k
    jpeg_component_info *compptr;
894
895
7.41k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
5.02k
         ci++, compptr++) {
897
5.02k
      access_rows = compptr->v_samp_factor;
898
5.02k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
5.02k
      if (cinfo->progressive_mode)
901
4.97k
        access_rows *= 5;
902
5.02k
#endif
903
5.02k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
5.02k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
5.02k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
5.02k
                               (long)compptr->h_samp_factor),
907
5.02k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
5.02k
                               (long)compptr->v_samp_factor),
909
5.02k
         (JDIMENSION)access_rows);
910
5.02k
    }
911
2.38k
    coef->pub.consume_data = consume_data;
912
2.38k
    coef->pub._decompress_data = decompress_data;
913
2.38k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.38k
  } else {
918
    /* We only need a single-MCU buffer. */
919
2.18k
    JBLOCKROW buffer;
920
2.18k
    int i;
921
922
2.18k
    buffer = (JBLOCKROW)
923
2.18k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
2.18k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
24.0k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
21.8k
      coef->MCU_buffer[i] = buffer + i;
927
21.8k
    }
928
2.18k
    coef->pub.consume_data = dummy_consume_data;
929
2.18k
    coef->pub._decompress_data = decompress_onepass;
930
2.18k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
2.18k
  }
932
933
  /* Allocate the workspace buffer */
934
4.57k
  coef->workspace = (JCOEF *)
935
4.57k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
4.57k
                                sizeof(JCOEF) * DCTSIZE2);
937
4.57k
}
j12init_d_coef_controller
Line
Count
Source
869
612
{
870
612
  my_coef_ptr coef;
871
872
612
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
612
  coef = (my_coef_ptr)
876
612
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
612
                                sizeof(my_coef_controller));
878
612
  memset(coef, 0, sizeof(my_coef_controller));
879
612
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
612
  coef->pub.start_input_pass = start_input_pass;
881
612
  coef->pub.start_output_pass = start_output_pass;
882
612
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
612
  coef->coef_bits_latch = NULL;
884
612
#endif
885
886
  /* Create the coefficient buffer. */
887
612
  if (need_full_buffer) {
888
588
#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
588
    int ci, access_rows;
893
588
    jpeg_component_info *compptr;
894
895
2.25k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
1.66k
         ci++, compptr++) {
897
1.66k
      access_rows = compptr->v_samp_factor;
898
1.66k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
1.66k
      if (cinfo->progressive_mode)
901
1.57k
        access_rows *= 5;
902
1.66k
#endif
903
1.66k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
1.66k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
1.66k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
1.66k
                               (long)compptr->h_samp_factor),
907
1.66k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
1.66k
                               (long)compptr->v_samp_factor),
909
1.66k
         (JDIMENSION)access_rows);
910
1.66k
    }
911
588
    coef->pub.consume_data = consume_data;
912
588
    coef->pub._decompress_data = decompress_data;
913
588
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
588
  } else {
918
    /* We only need a single-MCU buffer. */
919
24
    JBLOCKROW buffer;
920
24
    int i;
921
922
24
    buffer = (JBLOCKROW)
923
24
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
24
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
264
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
240
      coef->MCU_buffer[i] = buffer + i;
927
240
    }
928
24
    coef->pub.consume_data = dummy_consume_data;
929
24
    coef->pub._decompress_data = decompress_onepass;
930
24
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
24
  }
932
933
  /* Allocate the workspace buffer */
934
612
  coef->workspace = (JCOEF *)
935
612
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
612
                                sizeof(JCOEF) * DCTSIZE2);
937
612
}