Coverage Report

Created: 2026-09-03 06:20

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.3k
{
51
13.3k
  cinfo->input_iMCU_row = 0;
52
13.3k
  start_iMCU_row(cinfo);
53
13.3k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
50
12.2k
{
51
12.2k
  cinfo->input_iMCU_row = 0;
52
12.2k
  start_iMCU_row(cinfo);
53
12.2k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
50
1.10k
{
51
1.10k
  cinfo->input_iMCU_row = 0;
52
1.10k
  start_iMCU_row(cinfo);
53
1.10k
}
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.26k
{
63
4.26k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
4.26k
  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.26k
  if (coef->pub.coef_arrays != NULL) {
68
2.35k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
1.51k
      coef->pub._decompress_data = decompress_smooth_data;
70
843
    else
71
843
      coef->pub._decompress_data = decompress_data;
72
2.35k
  }
73
4.26k
#endif
74
4.26k
  cinfo->output_iMCU_row = 0;
75
4.26k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
62
4.09k
{
63
4.09k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
4.09k
  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.09k
  if (coef->pub.coef_arrays != NULL) {
68
2.20k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
1.47k
      coef->pub._decompress_data = decompress_smooth_data;
70
725
    else
71
725
      coef->pub._decompress_data = decompress_data;
72
2.20k
  }
73
4.09k
#endif
74
4.09k
  cinfo->output_iMCU_row = 0;
75
4.09k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
62
170
{
63
170
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
170
  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
170
  if (coef->pub.coef_arrays != NULL) {
68
153
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
35
      coef->pub._decompress_data = decompress_smooth_data;
70
118
    else
71
118
      coef->pub._decompress_data = decompress_data;
72
153
  }
73
170
#endif
74
170
  cinfo->output_iMCU_row = 0;
75
170
}
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
84.1k
{
91
84.1k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
84.1k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
84.1k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
84.1k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
84.1k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
84.1k
  _JSAMPARRAY output_ptr;
97
84.1k
  JDIMENSION start_col, output_col;
98
84.1k
  jpeg_component_info *compptr;
99
84.1k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
182k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
97.9k
       yoffset++) {
104
547k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
449k
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
449k
      jzero_far((void *)coef->MCU_buffer[0],
108
449k
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
449k
      if (!cinfo->entropy->insufficient_data)
110
449k
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
449k
      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
449k
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
448k
          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
448k
        blkn = 0;               /* index of current DCT block within MCU */
142
1.23M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
782k
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
782k
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
782k
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
782k
          useful_width = (MCU_col_num < last_MCU_col) ?
151
458k
                         compptr->MCU_width : compptr->last_col_width;
152
782k
          output_ptr = output_buf[compptr->component_index] +
153
782k
                       yoffset * compptr->_DCT_scaled_size;
154
782k
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
782k
                      compptr->MCU_sample_width;
156
1.82M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
1.03M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
975k
                yoffset + yindex < compptr->last_row_height) {
159
975k
              output_col = start_col;
160
2.11M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
1.14M
                (*inverse_DCT) (cinfo, compptr,
165
1.14M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
1.14M
                                output_ptr, output_col);
167
#ifdef WITH_PROFILE
168
                cinfo->master->idct_elapsed +=
169
                  getTime() - cinfo->master->start;
170
                cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
171
#endif
172
1.14M
                output_col += compptr->_DCT_scaled_size;
173
1.14M
              }
174
975k
            }
175
1.03M
            blkn += compptr->MCU_width;
176
1.03M
            output_ptr += compptr->_DCT_scaled_size;
177
1.03M
          }
178
782k
        }
179
448k
      }
180
449k
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
97.9k
    coef->MCU_ctr = 0;
183
97.9k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
84.1k
  cinfo->output_iMCU_row++;
186
84.1k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
82.2k
    start_iMCU_row(cinfo);
188
82.2k
    return JPEG_ROW_COMPLETED;
189
82.2k
  }
190
  /* Completed the scan */
191
1.89k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
1.89k
  return JPEG_SCAN_COMPLETED;
193
84.1k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
90
84.1k
{
91
84.1k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
84.1k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
84.1k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
84.1k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
84.1k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
84.1k
  _JSAMPARRAY output_ptr;
97
84.1k
  JDIMENSION start_col, output_col;
98
84.1k
  jpeg_component_info *compptr;
99
84.1k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
182k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
97.9k
       yoffset++) {
104
547k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
449k
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
449k
      jzero_far((void *)coef->MCU_buffer[0],
108
449k
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
449k
      if (!cinfo->entropy->insufficient_data)
110
449k
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
449k
      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
449k
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
448k
          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
448k
        blkn = 0;               /* index of current DCT block within MCU */
142
1.23M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
782k
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
782k
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
782k
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
782k
          useful_width = (MCU_col_num < last_MCU_col) ?
151
458k
                         compptr->MCU_width : compptr->last_col_width;
152
782k
          output_ptr = output_buf[compptr->component_index] +
153
782k
                       yoffset * compptr->_DCT_scaled_size;
154
782k
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
782k
                      compptr->MCU_sample_width;
156
1.82M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
1.03M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
975k
                yoffset + yindex < compptr->last_row_height) {
159
975k
              output_col = start_col;
160
2.11M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
1.14M
                (*inverse_DCT) (cinfo, compptr,
165
1.14M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
1.14M
                                output_ptr, output_col);
167
#ifdef WITH_PROFILE
168
                cinfo->master->idct_elapsed +=
169
                  getTime() - cinfo->master->start;
170
                cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
171
#endif
172
1.14M
                output_col += compptr->_DCT_scaled_size;
173
1.14M
              }
174
975k
            }
175
1.03M
            blkn += compptr->MCU_width;
176
1.03M
            output_ptr += compptr->_DCT_scaled_size;
177
1.03M
          }
178
782k
        }
179
448k
      }
180
449k
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
97.9k
    coef->MCU_ctr = 0;
183
97.9k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
84.1k
  cinfo->output_iMCU_row++;
186
84.1k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
82.2k
    start_iMCU_row(cinfo);
188
82.2k
    return JPEG_ROW_COMPLETED;
189
82.2k
  }
190
  /* Completed the scan */
191
1.89k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
1.89k
  return JPEG_SCAN_COMPLETED;
193
84.1k
}
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
509k
{
219
509k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
509k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
509k
  int blkn, ci, xindex, yindex, yoffset;
222
509k
  JDIMENSION start_col;
223
509k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
509k
  JBLOCKROW buffer_ptr;
225
509k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
1.72M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
1.21M
    compptr = cinfo->cur_comp_info[ci];
230
1.21M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
1.21M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
1.21M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
1.21M
       (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.21M
  }
239
240
  /* Loop to process one whole iMCU row */
241
1.04M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
533k
       yoffset++) {
243
13.4M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
12.8M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
12.8M
      blkn = 0;                 /* index of current DCT block within MCU */
247
39.5M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
26.6M
        compptr = cinfo->cur_comp_info[ci];
249
26.6M
        start_col = MCU_col_num * compptr->MCU_width;
250
55.4M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
28.8M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
58.8M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
30.0M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
30.0M
          }
255
28.8M
        }
256
26.6M
      }
257
12.8M
      if (!cinfo->entropy->insufficient_data)
258
12.8M
        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
12.8M
      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
12.8M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
533k
    coef->MCU_ctr = 0;
282
533k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
509k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
497k
    start_iMCU_row(cinfo);
286
497k
    return JPEG_ROW_COMPLETED;
287
497k
  }
288
  /* Completed the scan */
289
11.4k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
11.4k
  return JPEG_SCAN_COMPLETED;
291
509k
}
jdcoefct-8.c:consume_data
Line
Count
Source
218
503k
{
219
503k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
503k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
503k
  int blkn, ci, xindex, yindex, yoffset;
222
503k
  JDIMENSION start_col;
223
503k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
503k
  JBLOCKROW buffer_ptr;
225
503k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
1.70M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
1.20M
    compptr = cinfo->cur_comp_info[ci];
230
1.20M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
1.20M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
1.20M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
1.20M
       (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.20M
  }
239
240
  /* Loop to process one whole iMCU row */
241
1.03M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
528k
       yoffset++) {
243
11.7M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
11.1M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
11.1M
      blkn = 0;                 /* index of current DCT block within MCU */
247
33.6M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
22.4M
        compptr = cinfo->cur_comp_info[ci];
249
22.4M
        start_col = MCU_col_num * compptr->MCU_width;
250
45.9M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
23.4M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
48.1M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
24.7M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
24.7M
          }
255
23.4M
        }
256
22.4M
      }
257
11.1M
      if (!cinfo->entropy->insufficient_data)
258
11.1M
        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
11.1M
      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
11.1M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
528k
    coef->MCU_ctr = 0;
282
528k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
503k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
493k
    start_iMCU_row(cinfo);
286
493k
    return JPEG_ROW_COMPLETED;
287
493k
  }
288
  /* Completed the scan */
289
10.3k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
10.3k
  return JPEG_SCAN_COMPLETED;
291
503k
}
jdcoefct-12.c:consume_data
Line
Count
Source
218
5.23k
{
219
5.23k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
5.23k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
5.23k
  int blkn, ci, xindex, yindex, yoffset;
222
5.23k
  JDIMENSION start_col;
223
5.23k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
5.23k
  JBLOCKROW buffer_ptr;
225
5.23k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
16.3k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
11.1k
    compptr = cinfo->cur_comp_info[ci];
230
11.1k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
11.1k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
11.1k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
11.1k
       (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
11.1k
  }
239
240
  /* Loop to process one whole iMCU row */
241
10.6k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
5.38k
       yoffset++) {
243
1.72M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
1.71M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
1.71M
      blkn = 0;                 /* index of current DCT block within MCU */
247
5.98M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
4.27M
        compptr = cinfo->cur_comp_info[ci];
249
4.27M
        start_col = MCU_col_num * compptr->MCU_width;
250
9.59M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
5.32M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
10.7M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
5.38M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
5.38M
          }
255
5.32M
        }
256
4.27M
      }
257
1.71M
      if (!cinfo->entropy->insufficient_data)
258
1.71M
        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.71M
      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.71M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
5.38k
    coef->MCU_ctr = 0;
282
5.38k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
5.23k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
4.15k
    start_iMCU_row(cinfo);
286
4.15k
    return JPEG_ROW_COMPLETED;
287
4.15k
  }
288
  /* Completed the scan */
289
1.08k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
1.08k
  return JPEG_SCAN_COMPLETED;
291
5.23k
}
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
32.0k
{
305
32.0k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
32.0k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
32.0k
  JDIMENSION block_num;
308
32.0k
  int ci, block_row, block_rows;
309
32.0k
  JBLOCKARRAY buffer;
310
32.0k
  JBLOCKROW buffer_ptr;
311
32.0k
  _JSAMPARRAY output_ptr;
312
32.0k
  JDIMENSION output_col;
313
32.0k
  jpeg_component_info *compptr;
314
32.0k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
32.0k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
32.0k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
32.0k
          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
128k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
96.1k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
96.1k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
96.1k
    buffer = (*cinfo->mem->access_virt_barray)
332
96.1k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
96.1k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
96.1k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
96.1k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
93.9k
      block_rows = compptr->v_samp_factor;
338
2.17k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
2.17k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
2.17k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
2.17k
    }
343
96.1k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
96.1k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
205k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
109k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
109k
      output_col = 0;
349
109k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
2.69M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
2.59M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
2.59M
                        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
2.59M
        buffer_ptr++;
361
2.59M
        output_col += compptr->_DCT_scaled_size;
362
2.59M
      }
363
109k
      output_ptr += compptr->_DCT_scaled_size;
364
109k
    }
365
96.1k
  }
366
367
32.0k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
31.3k
    return JPEG_ROW_COMPLETED;
369
725
  return JPEG_SCAN_COMPLETED;
370
32.0k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
304
32.0k
{
305
32.0k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
32.0k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
32.0k
  JDIMENSION block_num;
308
32.0k
  int ci, block_row, block_rows;
309
32.0k
  JBLOCKARRAY buffer;
310
32.0k
  JBLOCKROW buffer_ptr;
311
32.0k
  _JSAMPARRAY output_ptr;
312
32.0k
  JDIMENSION output_col;
313
32.0k
  jpeg_component_info *compptr;
314
32.0k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
32.0k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
32.0k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
32.0k
          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
128k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
96.1k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
96.1k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
96.1k
    buffer = (*cinfo->mem->access_virt_barray)
332
96.1k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
96.1k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
96.1k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
96.1k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
93.9k
      block_rows = compptr->v_samp_factor;
338
2.17k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
2.17k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
2.17k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
2.17k
    }
343
96.1k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
96.1k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
205k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
109k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
109k
      output_col = 0;
349
109k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
2.69M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
2.59M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
2.59M
                        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
2.59M
        buffer_ptr++;
361
2.59M
        output_col += compptr->_DCT_scaled_size;
362
2.59M
      }
363
109k
      output_ptr += compptr->_DCT_scaled_size;
364
109k
    }
365
96.1k
  }
366
367
32.0k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
31.3k
    return JPEG_ROW_COMPLETED;
369
725
  return JPEG_SCAN_COMPLETED;
370
32.0k
}
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
714k
#define Q01_POS  1
386
714k
#define Q10_POS  8
387
714k
#define Q20_POS  16
388
714k
#define Q11_POS  9
389
714k
#define Q02_POS  2
390
664k
#define Q03_POS  3
391
664k
#define Q12_POS  10
392
664k
#define Q21_POS  17
393
664k
#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
2.35k
{
406
2.35k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
2.35k
  boolean smoothing_useful = FALSE;
408
2.35k
  int ci, coefi;
409
2.35k
  jpeg_component_info *compptr;
410
2.35k
  JQUANT_TBL *qtable;
411
2.35k
  int *coef_bits, *prev_coef_bits;
412
2.35k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
2.35k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
29
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
2.32k
  if (coef->coef_bits_latch == NULL)
419
2.32k
    coef->coef_bits_latch = (int *)
420
2.32k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
2.32k
                                  cinfo->num_components * 2 *
422
2.32k
                                  (SAVED_COEFS * sizeof(int)));
423
2.32k
  coef_bits_latch = coef->coef_bits_latch;
424
2.32k
  prev_coef_bits_latch =
425
2.32k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
8.46k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
6.45k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
6.45k
    if ((qtable = compptr->quant_table) == NULL)
431
6
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
6.45k
    if (qtable->quantval[0] == 0 ||
434
6.43k
        qtable->quantval[Q01_POS] == 0 ||
435
6.39k
        qtable->quantval[Q10_POS] == 0 ||
436
6.36k
        qtable->quantval[Q20_POS] == 0 ||
437
6.33k
        qtable->quantval[Q11_POS] == 0 ||
438
6.31k
        qtable->quantval[Q02_POS] == 0 ||
439
6.29k
        qtable->quantval[Q03_POS] == 0 ||
440
6.26k
        qtable->quantval[Q12_POS] == 0 ||
441
6.22k
        qtable->quantval[Q21_POS] == 0 ||
442
6.20k
        qtable->quantval[Q30_POS] == 0)
443
317
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
6.13k
    coef_bits = cinfo->coef_bits[ci];
446
6.13k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
6.13k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
6.13k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
61.3k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
55.2k
      if (cinfo->input_scan_number > 1)
453
36.9k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
18.2k
      else
455
18.2k
        prev_coef_bits_latch[coefi] = -1;
456
55.2k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
55.2k
      if (coef_bits[coefi] != 0)
458
40.8k
        smoothing_useful = TRUE;
459
55.2k
    }
460
6.13k
    coef_bits_latch += SAVED_COEFS;
461
6.13k
    prev_coef_bits_latch += SAVED_COEFS;
462
6.13k
  }
463
464
2.00k
  return smoothing_useful;
465
2.32k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
405
2.20k
{
406
2.20k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
2.20k
  boolean smoothing_useful = FALSE;
408
2.20k
  int ci, coefi;
409
2.20k
  jpeg_component_info *compptr;
410
2.20k
  JQUANT_TBL *qtable;
411
2.20k
  int *coef_bits, *prev_coef_bits;
412
2.20k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
2.20k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
8
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
2.19k
  if (coef->coef_bits_latch == NULL)
419
2.19k
    coef->coef_bits_latch = (int *)
420
2.19k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
2.19k
                                  cinfo->num_components * 2 *
422
2.19k
                                  (SAVED_COEFS * sizeof(int)));
423
2.19k
  coef_bits_latch = coef->coef_bits_latch;
424
2.19k
  prev_coef_bits_latch =
425
2.19k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
8.18k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
6.22k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
6.22k
    if ((qtable = compptr->quant_table) == NULL)
431
6
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
6.21k
    if (qtable->quantval[0] == 0 ||
434
6.20k
        qtable->quantval[Q01_POS] == 0 ||
435
6.17k
        qtable->quantval[Q10_POS] == 0 ||
436
6.15k
        qtable->quantval[Q20_POS] == 0 ||
437
6.12k
        qtable->quantval[Q11_POS] == 0 ||
438
6.11k
        qtable->quantval[Q02_POS] == 0 ||
439
6.09k
        qtable->quantval[Q03_POS] == 0 ||
440
6.07k
        qtable->quantval[Q12_POS] == 0 ||
441
6.05k
        qtable->quantval[Q21_POS] == 0 ||
442
6.04k
        qtable->quantval[Q30_POS] == 0)
443
221
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
5.99k
    coef_bits = cinfo->coef_bits[ci];
446
5.99k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
5.99k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
5.99k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
59.9k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
53.9k
      if (cinfo->input_scan_number > 1)
453
36.3k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
17.5k
      else
455
17.5k
        prev_coef_bits_latch[coefi] = -1;
456
53.9k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
53.9k
      if (coef_bits[coefi] != 0)
458
39.7k
        smoothing_useful = TRUE;
459
53.9k
    }
460
5.99k
    coef_bits_latch += SAVED_COEFS;
461
5.99k
    prev_coef_bits_latch += SAVED_COEFS;
462
5.99k
  }
463
464
1.96k
  return smoothing_useful;
465
2.19k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
405
153
{
406
153
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
153
  boolean smoothing_useful = FALSE;
408
153
  int ci, coefi;
409
153
  jpeg_component_info *compptr;
410
153
  JQUANT_TBL *qtable;
411
153
  int *coef_bits, *prev_coef_bits;
412
153
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
153
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
21
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
132
  if (coef->coef_bits_latch == NULL)
419
132
    coef->coef_bits_latch = (int *)
420
132
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
132
                                  cinfo->num_components * 2 *
422
132
                                  (SAVED_COEFS * sizeof(int)));
423
132
  coef_bits_latch = coef->coef_bits_latch;
424
132
  prev_coef_bits_latch =
425
132
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
274
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
238
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
238
    if ((qtable = compptr->quant_table) == NULL)
431
0
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
238
    if (qtable->quantval[0] == 0 ||
434
227
        qtable->quantval[Q01_POS] == 0 ||
435
221
        qtable->quantval[Q10_POS] == 0 ||
436
215
        qtable->quantval[Q20_POS] == 0 ||
437
209
        qtable->quantval[Q11_POS] == 0 ||
438
201
        qtable->quantval[Q02_POS] == 0 ||
439
195
        qtable->quantval[Q03_POS] == 0 ||
440
188
        qtable->quantval[Q12_POS] == 0 ||
441
172
        qtable->quantval[Q21_POS] == 0 ||
442
166
        qtable->quantval[Q30_POS] == 0)
443
96
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
142
    coef_bits = cinfo->coef_bits[ci];
446
142
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
142
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
142
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
1.42k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
1.27k
      if (cinfo->input_scan_number > 1)
453
567
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
711
      else
455
711
        prev_coef_bits_latch[coefi] = -1;
456
1.27k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
1.27k
      if (coef_bits[coefi] != 0)
458
1.10k
        smoothing_useful = TRUE;
459
1.27k
    }
460
142
    coef_bits_latch += SAVED_COEFS;
461
142
    prev_coef_bits_latch += SAVED_COEFS;
462
142
  }
463
464
36
  return smoothing_useful;
465
132
}
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
236k
{
475
236k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
236k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
236k
  JDIMENSION block_num, last_block_column;
478
236k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
236k
    image_block_rows;
480
236k
  JBLOCKARRAY buffer;
481
236k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
236k
  JBLOCKROW next_block_row, next_next_block_row;
483
236k
  _JSAMPARRAY output_ptr;
484
236k
  JDIMENSION output_col;
485
236k
  jpeg_component_info *compptr;
486
236k
  _inverse_DCT_method_ptr inverse_DCT;
487
236k
  boolean change_dc;
488
236k
  JCOEF *workspace;
489
236k
  int *coef_bits;
490
236k
  JQUANT_TBL *quanttbl;
491
236k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
236k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
236k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
236k
      DC25;
495
236k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
236k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
236k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
236k
         !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
944k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
708k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
708k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
708k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
700k
      block_rows = compptr->v_samp_factor;
526
700k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
700k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
3.46k
      block_rows = compptr->v_samp_factor;
529
3.46k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
4.42k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
4.42k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
4.42k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
4.42k
      access_rows = block_rows; /* this iMCU row only */
535
4.42k
    }
536
    /* Align the virtual buffer for this component. */
537
708k
    if (cinfo->output_iMCU_row > 1) {
538
700k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
700k
      buffer = (*cinfo->mem->access_virt_barray)
540
700k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
700k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
700k
         (JDIMENSION)access_rows, FALSE);
543
700k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
700k
    } else if (cinfo->output_iMCU_row > 0) {
545
3.46k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
3.46k
      buffer = (*cinfo->mem->access_virt_barray)
547
3.46k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
3.46k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
3.46k
         (JDIMENSION)access_rows, FALSE);
550
3.46k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
4.42k
    } else {
552
4.42k
      buffer = (*cinfo->mem->access_virt_barray)
553
4.42k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
4.42k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
4.42k
    }
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
708k
    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
708k
    else
564
708k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
708k
    change_dc =
568
708k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
669k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
659k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
708k
    quanttbl = compptr->quant_table;
573
708k
    Q00 = quanttbl->quantval[0];
574
708k
    Q01 = quanttbl->quantval[Q01_POS];
575
708k
    Q10 = quanttbl->quantval[Q10_POS];
576
708k
    Q20 = quanttbl->quantval[Q20_POS];
577
708k
    Q11 = quanttbl->quantval[Q11_POS];
578
708k
    Q02 = quanttbl->quantval[Q02_POS];
579
708k
    if (change_dc) {
580
658k
      Q03 = quanttbl->quantval[Q03_POS];
581
658k
      Q12 = quanttbl->quantval[Q12_POS];
582
658k
      Q21 = quanttbl->quantval[Q21_POS];
583
658k
      Q30 = quanttbl->quantval[Q30_POS];
584
658k
    }
585
708k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
708k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
708k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
1.46M
    for (block_row = 0; block_row < block_rows; block_row++) {
590
759k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
759k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
759k
      if (image_block_row > 0)
594
755k
        prev_block_row =
595
755k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
4.42k
      else
597
4.42k
        prev_block_row = buffer_ptr;
598
599
759k
      if (image_block_row > 1)
600
752k
        prev_prev_block_row =
601
752k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
7.93k
      else
603
7.93k
        prev_prev_block_row = prev_block_row;
604
605
759k
      if (image_block_row < image_block_rows - 1)
606
755k
        next_block_row =
607
755k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
4.42k
      else
609
4.42k
        next_block_row = buffer_ptr;
610
611
759k
      if (image_block_row < image_block_rows - 2)
612
752k
        next_next_block_row =
613
752k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
7.75k
      else
615
7.75k
        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
759k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
759k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
759k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
759k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
759k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
759k
      output_col = 0;
626
759k
      last_block_column = compptr->width_in_blocks - 1;
627
759k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
10.9M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
10.2M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
10.2M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
759k
            block_num < last_block_column) {
634
255k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
255k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
255k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
255k
          DC19 = DC20 = (int)next_block_row[1][0];
638
255k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
255k
        }
640
10.2M
        if (block_num + 1 < last_block_column) {
641
9.19M
          DC05 = (int)prev_prev_block_row[2][0];
642
9.19M
          DC10 = (int)prev_block_row[2][0];
643
9.19M
          DC15 = (int)buffer_ptr[2][0];
644
9.19M
          DC20 = (int)next_block_row[2][0];
645
9.19M
          DC25 = (int)next_next_block_row[2][0];
646
9.19M
        }
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
10.2M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
9.47M
          num = Q00 * (change_dc ?
660
8.45M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
8.45M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
8.45M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
8.45M
                 DC21 - DC22 + DC24 + DC25) :
664
9.47M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
9.47M
          if (num >= 0) {
666
5.65M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
5.65M
            if (Al > 0 && pred >= (1 << Al))
668
39.7k
              pred = (1 << Al) - 1;
669
5.65M
          } else {
670
3.82M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
3.82M
            if (Al > 0 && pred >= (1 << Al))
672
38.2k
              pred = (1 << Al) - 1;
673
3.82M
            pred = -pred;
674
3.82M
          }
675
9.47M
          workspace[1] = (JCOEF)pred;
676
9.47M
        }
677
        /* AC10 */
678
10.2M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
9.48M
          num = Q00 * (change_dc ?
680
8.45M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
8.45M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
8.45M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
8.45M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
9.48M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
9.48M
          if (num >= 0) {
686
7.43M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
7.43M
            if (Al > 0 && pred >= (1 << Al))
688
172k
              pred = (1 << Al) - 1;
689
7.43M
          } else {
690
2.05M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
2.05M
            if (Al > 0 && pred >= (1 << Al))
692
156k
              pred = (1 << Al) - 1;
693
2.05M
            pred = -pred;
694
2.05M
          }
695
9.48M
          workspace[8] = (JCOEF)pred;
696
9.48M
        }
697
        /* AC20 */
698
10.2M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
9.38M
          num = Q00 * (change_dc ?
700
8.45M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
8.45M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
9.38M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
9.38M
          if (num >= 0) {
704
6.07M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
6.07M
            if (Al > 0 && pred >= (1 << Al))
706
29.9k
              pred = (1 << Al) - 1;
707
6.07M
          } else {
708
3.31M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
3.31M
            if (Al > 0 && pred >= (1 << Al))
710
28.5k
              pred = (1 << Al) - 1;
711
3.31M
            pred = -pred;
712
3.31M
          }
713
9.38M
          workspace[16] = (JCOEF)pred;
714
9.38M
        }
715
        /* AC11 */
716
10.2M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
9.52M
          num = Q00 * (change_dc ?
718
8.45M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
8.45M
                 9 * DC19 + DC21 - DC25) :
720
9.52M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
1.07M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
9.52M
          if (num >= 0) {
723
8.01M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
8.01M
            if (Al > 0 && pred >= (1 << Al))
725
11.5k
              pred = (1 << Al) - 1;
726
8.01M
          } else {
727
1.51M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
1.51M
            if (Al > 0 && pred >= (1 << Al))
729
11.9k
              pred = (1 << Al) - 1;
730
1.51M
            pred = -pred;
731
1.51M
          }
732
9.52M
          workspace[9] = (JCOEF)pred;
733
9.52M
        }
734
        /* AC02 */
735
10.2M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
9.47M
          num = Q00 * (change_dc ?
737
8.45M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
8.45M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
9.47M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
9.47M
          if (num >= 0) {
741
6.00M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
6.00M
            if (Al > 0 && pred >= (1 << Al))
743
7.04k
              pred = (1 << Al) - 1;
744
6.00M
          } else {
745
3.46M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
3.46M
            if (Al > 0 && pred >= (1 << Al))
747
7.10k
              pred = (1 << Al) - 1;
748
3.46M
            pred = -pred;
749
3.46M
          }
750
9.47M
          workspace[2] = (JCOEF)pred;
751
9.47M
        }
752
10.2M
        if (change_dc) {
753
          /* AC03 */
754
8.45M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
8.45M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
8.45M
            if (num >= 0) {
757
5.29M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
5.29M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
5.29M
            } else {
761
3.15M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
3.15M
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
3.15M
              pred = -pred;
765
3.15M
            }
766
8.45M
            workspace[3] = (JCOEF)pred;
767
8.45M
          }
768
          /* AC12 */
769
8.45M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
8.45M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
8.45M
            if (num >= 0) {
772
6.84M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
6.84M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
6.84M
            } else {
776
1.60M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
1.60M
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
1.60M
              pred = -pred;
780
1.60M
            }
781
8.45M
            workspace[10] = (JCOEF)pred;
782
8.45M
          }
783
          /* AC21 */
784
8.45M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
8.45M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
8.45M
            if (num >= 0) {
787
5.67M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
5.67M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
5.67M
            } else {
791
2.77M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
2.77M
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
2.77M
              pred = -pred;
795
2.77M
            }
796
8.45M
            workspace[17] = (JCOEF)pred;
797
8.45M
          }
798
          /* AC30 */
799
8.45M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
8.45M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
8.45M
            if (num >= 0) {
802
6.70M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
6.70M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
6.70M
            } else {
806
1.74M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
1.74M
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
1.74M
              pred = -pred;
810
1.74M
            }
811
8.45M
            workspace[24] = (JCOEF)pred;
812
8.45M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
8.45M
          num = Q00 *
817
8.45M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
8.45M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
8.45M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
8.45M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
8.45M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
8.45M
          if (num >= 0) {
823
4.42M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
4.42M
          } else {
825
4.02M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
4.02M
            pred = -pred;
827
4.02M
          }
828
8.45M
          workspace[0] = (JCOEF)pred;
829
8.45M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
10.2M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
10.2M
                        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
10.2M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
10.2M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
10.2M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
10.2M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
10.2M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
10.2M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
10.2M
          prev_prev_block_row++, next_next_block_row++;
849
10.2M
        output_col += compptr->_DCT_scaled_size;
850
10.2M
      }
851
759k
      output_ptr += compptr->_DCT_scaled_size;
852
759k
    }
853
708k
  }
854
855
236k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
234k
    return JPEG_ROW_COMPLETED;
857
1.47k
  return JPEG_SCAN_COMPLETED;
858
236k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
474
236k
{
475
236k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
236k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
236k
  JDIMENSION block_num, last_block_column;
478
236k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
236k
    image_block_rows;
480
236k
  JBLOCKARRAY buffer;
481
236k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
236k
  JBLOCKROW next_block_row, next_next_block_row;
483
236k
  _JSAMPARRAY output_ptr;
484
236k
  JDIMENSION output_col;
485
236k
  jpeg_component_info *compptr;
486
236k
  _inverse_DCT_method_ptr inverse_DCT;
487
236k
  boolean change_dc;
488
236k
  JCOEF *workspace;
489
236k
  int *coef_bits;
490
236k
  JQUANT_TBL *quanttbl;
491
236k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
236k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
236k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
236k
      DC25;
495
236k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
236k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
236k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
236k
         !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
944k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
708k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
708k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
708k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
700k
      block_rows = compptr->v_samp_factor;
526
700k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
700k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
3.46k
      block_rows = compptr->v_samp_factor;
529
3.46k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
4.42k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
4.42k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
4.42k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
4.42k
      access_rows = block_rows; /* this iMCU row only */
535
4.42k
    }
536
    /* Align the virtual buffer for this component. */
537
708k
    if (cinfo->output_iMCU_row > 1) {
538
700k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
700k
      buffer = (*cinfo->mem->access_virt_barray)
540
700k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
700k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
700k
         (JDIMENSION)access_rows, FALSE);
543
700k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
700k
    } else if (cinfo->output_iMCU_row > 0) {
545
3.46k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
3.46k
      buffer = (*cinfo->mem->access_virt_barray)
547
3.46k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
3.46k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
3.46k
         (JDIMENSION)access_rows, FALSE);
550
3.46k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
4.42k
    } else {
552
4.42k
      buffer = (*cinfo->mem->access_virt_barray)
553
4.42k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
4.42k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
4.42k
    }
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
708k
    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
708k
    else
564
708k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
708k
    change_dc =
568
708k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
669k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
659k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
708k
    quanttbl = compptr->quant_table;
573
708k
    Q00 = quanttbl->quantval[0];
574
708k
    Q01 = quanttbl->quantval[Q01_POS];
575
708k
    Q10 = quanttbl->quantval[Q10_POS];
576
708k
    Q20 = quanttbl->quantval[Q20_POS];
577
708k
    Q11 = quanttbl->quantval[Q11_POS];
578
708k
    Q02 = quanttbl->quantval[Q02_POS];
579
708k
    if (change_dc) {
580
658k
      Q03 = quanttbl->quantval[Q03_POS];
581
658k
      Q12 = quanttbl->quantval[Q12_POS];
582
658k
      Q21 = quanttbl->quantval[Q21_POS];
583
658k
      Q30 = quanttbl->quantval[Q30_POS];
584
658k
    }
585
708k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
708k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
708k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
1.46M
    for (block_row = 0; block_row < block_rows; block_row++) {
590
759k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
759k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
759k
      if (image_block_row > 0)
594
755k
        prev_block_row =
595
755k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
4.42k
      else
597
4.42k
        prev_block_row = buffer_ptr;
598
599
759k
      if (image_block_row > 1)
600
752k
        prev_prev_block_row =
601
752k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
7.93k
      else
603
7.93k
        prev_prev_block_row = prev_block_row;
604
605
759k
      if (image_block_row < image_block_rows - 1)
606
755k
        next_block_row =
607
755k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
4.42k
      else
609
4.42k
        next_block_row = buffer_ptr;
610
611
759k
      if (image_block_row < image_block_rows - 2)
612
752k
        next_next_block_row =
613
752k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
7.75k
      else
615
7.75k
        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
759k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
759k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
759k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
759k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
759k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
759k
      output_col = 0;
626
759k
      last_block_column = compptr->width_in_blocks - 1;
627
759k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
10.9M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
10.2M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
10.2M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
759k
            block_num < last_block_column) {
634
255k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
255k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
255k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
255k
          DC19 = DC20 = (int)next_block_row[1][0];
638
255k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
255k
        }
640
10.2M
        if (block_num + 1 < last_block_column) {
641
9.19M
          DC05 = (int)prev_prev_block_row[2][0];
642
9.19M
          DC10 = (int)prev_block_row[2][0];
643
9.19M
          DC15 = (int)buffer_ptr[2][0];
644
9.19M
          DC20 = (int)next_block_row[2][0];
645
9.19M
          DC25 = (int)next_next_block_row[2][0];
646
9.19M
        }
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
10.2M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
9.47M
          num = Q00 * (change_dc ?
660
8.45M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
8.45M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
8.45M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
8.45M
                 DC21 - DC22 + DC24 + DC25) :
664
9.47M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
9.47M
          if (num >= 0) {
666
5.65M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
5.65M
            if (Al > 0 && pred >= (1 << Al))
668
39.7k
              pred = (1 << Al) - 1;
669
5.65M
          } else {
670
3.82M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
3.82M
            if (Al > 0 && pred >= (1 << Al))
672
38.2k
              pred = (1 << Al) - 1;
673
3.82M
            pred = -pred;
674
3.82M
          }
675
9.47M
          workspace[1] = (JCOEF)pred;
676
9.47M
        }
677
        /* AC10 */
678
10.2M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
9.48M
          num = Q00 * (change_dc ?
680
8.45M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
8.45M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
8.45M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
8.45M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
9.48M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
9.48M
          if (num >= 0) {
686
7.43M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
7.43M
            if (Al > 0 && pred >= (1 << Al))
688
172k
              pred = (1 << Al) - 1;
689
7.43M
          } else {
690
2.05M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
2.05M
            if (Al > 0 && pred >= (1 << Al))
692
156k
              pred = (1 << Al) - 1;
693
2.05M
            pred = -pred;
694
2.05M
          }
695
9.48M
          workspace[8] = (JCOEF)pred;
696
9.48M
        }
697
        /* AC20 */
698
10.2M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
9.38M
          num = Q00 * (change_dc ?
700
8.45M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
8.45M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
9.38M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
9.38M
          if (num >= 0) {
704
6.07M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
6.07M
            if (Al > 0 && pred >= (1 << Al))
706
29.9k
              pred = (1 << Al) - 1;
707
6.07M
          } else {
708
3.31M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
3.31M
            if (Al > 0 && pred >= (1 << Al))
710
28.5k
              pred = (1 << Al) - 1;
711
3.31M
            pred = -pred;
712
3.31M
          }
713
9.38M
          workspace[16] = (JCOEF)pred;
714
9.38M
        }
715
        /* AC11 */
716
10.2M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
9.52M
          num = Q00 * (change_dc ?
718
8.45M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
8.45M
                 9 * DC19 + DC21 - DC25) :
720
9.52M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
1.07M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
9.52M
          if (num >= 0) {
723
8.01M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
8.01M
            if (Al > 0 && pred >= (1 << Al))
725
11.5k
              pred = (1 << Al) - 1;
726
8.01M
          } else {
727
1.51M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
1.51M
            if (Al > 0 && pred >= (1 << Al))
729
11.9k
              pred = (1 << Al) - 1;
730
1.51M
            pred = -pred;
731
1.51M
          }
732
9.52M
          workspace[9] = (JCOEF)pred;
733
9.52M
        }
734
        /* AC02 */
735
10.2M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
9.47M
          num = Q00 * (change_dc ?
737
8.45M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
8.45M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
9.47M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
9.47M
          if (num >= 0) {
741
6.00M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
6.00M
            if (Al > 0 && pred >= (1 << Al))
743
7.04k
              pred = (1 << Al) - 1;
744
6.00M
          } else {
745
3.46M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
3.46M
            if (Al > 0 && pred >= (1 << Al))
747
7.10k
              pred = (1 << Al) - 1;
748
3.46M
            pred = -pred;
749
3.46M
          }
750
9.47M
          workspace[2] = (JCOEF)pred;
751
9.47M
        }
752
10.2M
        if (change_dc) {
753
          /* AC03 */
754
8.45M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
8.45M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
8.45M
            if (num >= 0) {
757
5.29M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
5.29M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
5.29M
            } else {
761
3.15M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
3.15M
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
3.15M
              pred = -pred;
765
3.15M
            }
766
8.45M
            workspace[3] = (JCOEF)pred;
767
8.45M
          }
768
          /* AC12 */
769
8.45M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
8.45M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
8.45M
            if (num >= 0) {
772
6.84M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
6.84M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
6.84M
            } else {
776
1.60M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
1.60M
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
1.60M
              pred = -pred;
780
1.60M
            }
781
8.45M
            workspace[10] = (JCOEF)pred;
782
8.45M
          }
783
          /* AC21 */
784
8.45M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
8.45M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
8.45M
            if (num >= 0) {
787
5.67M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
5.67M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
5.67M
            } else {
791
2.77M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
2.77M
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
2.77M
              pred = -pred;
795
2.77M
            }
796
8.45M
            workspace[17] = (JCOEF)pred;
797
8.45M
          }
798
          /* AC30 */
799
8.45M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
8.45M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
8.45M
            if (num >= 0) {
802
6.70M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
6.70M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
6.70M
            } else {
806
1.74M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
1.74M
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
1.74M
              pred = -pred;
810
1.74M
            }
811
8.45M
            workspace[24] = (JCOEF)pred;
812
8.45M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
8.45M
          num = Q00 *
817
8.45M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
8.45M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
8.45M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
8.45M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
8.45M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
8.45M
          if (num >= 0) {
823
4.42M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
4.42M
          } else {
825
4.02M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
4.02M
            pred = -pred;
827
4.02M
          }
828
8.45M
          workspace[0] = (JCOEF)pred;
829
8.45M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
10.2M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
10.2M
                        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
10.2M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
10.2M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
10.2M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
10.2M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
10.2M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
10.2M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
10.2M
          prev_prev_block_row++, next_next_block_row++;
849
10.2M
        output_col += compptr->_DCT_scaled_size;
850
10.2M
      }
851
759k
      output_ptr += compptr->_DCT_scaled_size;
852
759k
    }
853
708k
  }
854
855
236k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
234k
    return JPEG_ROW_COMPLETED;
857
1.47k
  return JPEG_SCAN_COMPLETED;
858
236k
}
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.30k
{
870
5.30k
  my_coef_ptr coef;
871
872
5.30k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
5.30k
  coef = (my_coef_ptr)
876
5.30k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
5.30k
                                sizeof(my_coef_controller));
878
5.30k
  memset(coef, 0, sizeof(my_coef_controller));
879
5.30k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
5.30k
  coef->pub.start_input_pass = start_input_pass;
881
5.30k
  coef->pub.start_output_pass = start_output_pass;
882
5.30k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
5.30k
  coef->coef_bits_latch = NULL;
884
5.30k
#endif
885
886
  /* Create the coefficient buffer. */
887
5.30k
  if (need_full_buffer) {
888
3.34k
#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
3.34k
    int ci, access_rows;
893
3.34k
    jpeg_component_info *compptr;
894
895
13.3k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
9.99k
         ci++, compptr++) {
897
9.99k
      access_rows = compptr->v_samp_factor;
898
9.99k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
9.99k
      if (cinfo->progressive_mode)
901
9.78k
        access_rows *= 5;
902
9.99k
#endif
903
9.99k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
9.99k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
9.99k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
9.99k
                               (long)compptr->h_samp_factor),
907
9.99k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
9.99k
                               (long)compptr->v_samp_factor),
909
9.99k
         (JDIMENSION)access_rows);
910
9.99k
    }
911
3.34k
    coef->pub.consume_data = consume_data;
912
3.34k
    coef->pub._decompress_data = decompress_data;
913
3.34k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
3.34k
  } else {
918
    /* We only need a single-MCU buffer. */
919
1.96k
    JBLOCKROW buffer;
920
1.96k
    int i;
921
922
1.96k
    buffer = (JBLOCKROW)
923
1.96k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
1.96k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
21.6k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
19.6k
      coef->MCU_buffer[i] = buffer + i;
927
19.6k
    }
928
1.96k
    coef->pub.consume_data = dummy_consume_data;
929
1.96k
    coef->pub._decompress_data = decompress_onepass;
930
1.96k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
1.96k
  }
932
933
  /* Allocate the workspace buffer */
934
5.30k
  coef->workspace = (JCOEF *)
935
5.30k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
5.30k
                                sizeof(JCOEF) * DCTSIZE2);
937
5.30k
}
jinit_d_coef_controller
Line
Count
Source
869
4.85k
{
870
4.85k
  my_coef_ptr coef;
871
872
4.85k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
4.85k
  coef = (my_coef_ptr)
876
4.85k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
4.85k
                                sizeof(my_coef_controller));
878
4.85k
  memset(coef, 0, sizeof(my_coef_controller));
879
4.85k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
4.85k
  coef->pub.start_input_pass = start_input_pass;
881
4.85k
  coef->pub.start_output_pass = start_output_pass;
882
4.85k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
4.85k
  coef->coef_bits_latch = NULL;
884
4.85k
#endif
885
886
  /* Create the coefficient buffer. */
887
4.85k
  if (need_full_buffer) {
888
2.91k
#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.91k
    int ci, access_rows;
893
2.91k
    jpeg_component_info *compptr;
894
895
11.6k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
8.70k
         ci++, compptr++) {
897
8.70k
      access_rows = compptr->v_samp_factor;
898
8.70k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
8.70k
      if (cinfo->progressive_mode)
901
8.65k
        access_rows *= 5;
902
8.70k
#endif
903
8.70k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
8.70k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
8.70k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
8.70k
                               (long)compptr->h_samp_factor),
907
8.70k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
8.70k
                               (long)compptr->v_samp_factor),
909
8.70k
         (JDIMENSION)access_rows);
910
8.70k
    }
911
2.91k
    coef->pub.consume_data = consume_data;
912
2.91k
    coef->pub._decompress_data = decompress_data;
913
2.91k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.91k
  } else {
918
    /* We only need a single-MCU buffer. */
919
1.93k
    JBLOCKROW buffer;
920
1.93k
    int i;
921
922
1.93k
    buffer = (JBLOCKROW)
923
1.93k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
1.93k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
21.3k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
19.3k
      coef->MCU_buffer[i] = buffer + i;
927
19.3k
    }
928
1.93k
    coef->pub.consume_data = dummy_consume_data;
929
1.93k
    coef->pub._decompress_data = decompress_onepass;
930
1.93k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
1.93k
  }
932
933
  /* Allocate the workspace buffer */
934
4.85k
  coef->workspace = (JCOEF *)
935
4.85k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
4.85k
                                sizeof(JCOEF) * DCTSIZE2);
937
4.85k
}
j12init_d_coef_controller
Line
Count
Source
869
458
{
870
458
  my_coef_ptr coef;
871
872
458
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
458
  coef = (my_coef_ptr)
876
458
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
458
                                sizeof(my_coef_controller));
878
458
  memset(coef, 0, sizeof(my_coef_controller));
879
458
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
458
  coef->pub.start_input_pass = start_input_pass;
881
458
  coef->pub.start_output_pass = start_output_pass;
882
458
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
458
  coef->coef_bits_latch = NULL;
884
458
#endif
885
886
  /* Create the coefficient buffer. */
887
458
  if (need_full_buffer) {
888
427
#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
427
    int ci, access_rows;
893
427
    jpeg_component_info *compptr;
894
895
1.71k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
1.28k
         ci++, compptr++) {
897
1.28k
      access_rows = compptr->v_samp_factor;
898
1.28k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
1.28k
      if (cinfo->progressive_mode)
901
1.13k
        access_rows *= 5;
902
1.28k
#endif
903
1.28k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
1.28k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
1.28k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
1.28k
                               (long)compptr->h_samp_factor),
907
1.28k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
1.28k
                               (long)compptr->v_samp_factor),
909
1.28k
         (JDIMENSION)access_rows);
910
1.28k
    }
911
427
    coef->pub.consume_data = consume_data;
912
427
    coef->pub._decompress_data = decompress_data;
913
427
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
427
  } else {
918
    /* We only need a single-MCU buffer. */
919
31
    JBLOCKROW buffer;
920
31
    int i;
921
922
31
    buffer = (JBLOCKROW)
923
31
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
31
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
341
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
310
      coef->MCU_buffer[i] = buffer + i;
927
310
    }
928
31
    coef->pub.consume_data = dummy_consume_data;
929
31
    coef->pub._decompress_data = decompress_onepass;
930
31
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
31
  }
932
933
  /* Allocate the workspace buffer */
934
458
  coef->workspace = (JCOEF *)
935
458
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
458
                                sizeof(JCOEF) * DCTSIZE2);
937
458
}