Coverage Report

Created: 2026-10-17 07:02

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.0k
{
51
13.0k
  cinfo->input_iMCU_row = 0;
52
13.0k
  start_iMCU_row(cinfo);
53
13.0k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
50
12.1k
{
51
12.1k
  cinfo->input_iMCU_row = 0;
52
12.1k
  start_iMCU_row(cinfo);
53
12.1k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
50
878
{
51
878
  cinfo->input_iMCU_row = 0;
52
878
  start_iMCU_row(cinfo);
53
878
}
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.58k
{
63
4.58k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
4.58k
  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.58k
  if (coef->pub.coef_arrays != NULL) {
68
1.92k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
1.02k
      coef->pub._decompress_data = decompress_smooth_data;
70
904
    else
71
904
      coef->pub._decompress_data = decompress_data;
72
1.92k
  }
73
4.58k
#endif
74
4.58k
  cinfo->output_iMCU_row = 0;
75
4.58k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
62
4.37k
{
63
4.37k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
4.37k
  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.37k
  if (coef->pub.coef_arrays != NULL) {
68
1.72k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
965
      coef->pub._decompress_data = decompress_smooth_data;
70
763
    else
71
763
      coef->pub._decompress_data = decompress_data;
72
1.72k
  }
73
4.37k
#endif
74
4.37k
  cinfo->output_iMCU_row = 0;
75
4.37k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
62
206
{
63
206
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
206
  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
206
  if (coef->pub.coef_arrays != NULL) {
68
199
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
58
      coef->pub._decompress_data = decompress_smooth_data;
70
141
    else
71
141
      coef->pub._decompress_data = decompress_data;
72
199
  }
73
206
#endif
74
206
  cinfo->output_iMCU_row = 0;
75
206
}
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
132k
{
91
132k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
132k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
132k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
132k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
132k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
132k
  _JSAMPARRAY output_ptr;
97
132k
  JDIMENSION start_col, output_col;
98
132k
  jpeg_component_info *compptr;
99
132k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
266k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
133k
       yoffset++) {
104
1.37M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
1.24M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
1.24M
      jzero_far((void *)coef->MCU_buffer[0],
108
1.24M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
1.24M
      if (!cinfo->entropy->insufficient_data)
110
1.24M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
1.24M
      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.24M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
1.24M
          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.24M
        blkn = 0;               /* index of current DCT block within MCU */
142
4.68M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
3.44M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
3.44M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
3.44M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
3.44M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
2.99M
                         compptr->MCU_width : compptr->last_col_width;
152
3.44M
          output_ptr = output_buf[compptr->component_index] +
153
3.44M
                       yoffset * compptr->_DCT_scaled_size;
154
3.44M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
3.44M
                      compptr->MCU_sample_width;
156
6.91M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
3.47M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
3.46M
                yoffset + yindex < compptr->last_row_height) {
159
3.46M
              output_col = start_col;
160
6.99M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
3.52M
                (*inverse_DCT) (cinfo, compptr,
165
3.52M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
3.52M
                                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
3.52M
                output_col += compptr->_DCT_scaled_size;
173
3.52M
              }
174
3.46M
            }
175
3.47M
            blkn += compptr->MCU_width;
176
3.47M
            output_ptr += compptr->_DCT_scaled_size;
177
3.47M
          }
178
3.44M
        }
179
1.24M
      }
180
1.24M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
133k
    coef->MCU_ctr = 0;
183
133k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
132k
  cinfo->output_iMCU_row++;
186
132k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
129k
    start_iMCU_row(cinfo);
188
129k
    return JPEG_ROW_COMPLETED;
189
129k
  }
190
  /* Completed the scan */
191
2.64k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
2.64k
  return JPEG_SCAN_COMPLETED;
193
132k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
90
132k
{
91
132k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
132k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
132k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
132k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
132k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
132k
  _JSAMPARRAY output_ptr;
97
132k
  JDIMENSION start_col, output_col;
98
132k
  jpeg_component_info *compptr;
99
132k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
266k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
133k
       yoffset++) {
104
1.37M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
1.24M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
1.24M
      jzero_far((void *)coef->MCU_buffer[0],
108
1.24M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
1.24M
      if (!cinfo->entropy->insufficient_data)
110
1.24M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
1.24M
      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.24M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
1.24M
          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.24M
        blkn = 0;               /* index of current DCT block within MCU */
142
4.68M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
3.44M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
3.44M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
3.44M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
3.44M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
2.99M
                         compptr->MCU_width : compptr->last_col_width;
152
3.44M
          output_ptr = output_buf[compptr->component_index] +
153
3.44M
                       yoffset * compptr->_DCT_scaled_size;
154
3.44M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
3.44M
                      compptr->MCU_sample_width;
156
6.91M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
3.47M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
3.46M
                yoffset + yindex < compptr->last_row_height) {
159
3.46M
              output_col = start_col;
160
6.99M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
3.52M
                (*inverse_DCT) (cinfo, compptr,
165
3.52M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
3.52M
                                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
3.52M
                output_col += compptr->_DCT_scaled_size;
173
3.52M
              }
174
3.46M
            }
175
3.47M
            blkn += compptr->MCU_width;
176
3.47M
            output_ptr += compptr->_DCT_scaled_size;
177
3.47M
          }
178
3.44M
        }
179
1.24M
      }
180
1.24M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
133k
    coef->MCU_ctr = 0;
183
133k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
132k
  cinfo->output_iMCU_row++;
186
132k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
129k
    start_iMCU_row(cinfo);
188
129k
    return JPEG_ROW_COMPLETED;
189
129k
  }
190
  /* Completed the scan */
191
2.64k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
2.64k
  return JPEG_SCAN_COMPLETED;
193
132k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_onepass
194
195
196
/*
197
 * Dummy consume-input routine for single-pass operation.
198
 */
199
200
METHODDEF(int)
201
dummy_consume_data(j_decompress_ptr cinfo)
202
0
{
203
0
  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
204
0
}
Unexecuted instantiation: jdcoefct-8.c:dummy_consume_data
Unexecuted instantiation: jdcoefct-12.c:dummy_consume_data
205
206
207
#ifdef D_MULTISCAN_FILES_SUPPORTED
208
209
/*
210
 * Consume input data and store it in the full-image coefficient buffer.
211
 * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
212
 * ie, v_samp_factor block rows for each component in the scan.
213
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
214
 */
215
216
METHODDEF(int)
217
consume_data(j_decompress_ptr cinfo)
218
1.24M
{
219
1.24M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
1.24M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
1.24M
  int blkn, ci, xindex, yindex, yoffset;
222
1.24M
  JDIMENSION start_col;
223
1.24M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
1.24M
  JBLOCKROW buffer_ptr;
225
1.24M
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
2.69M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
1.44M
    compptr = cinfo->cur_comp_info[ci];
230
1.44M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
1.44M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
1.44M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
1.44M
       (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.44M
  }
239
240
  /* Loop to process one whole iMCU row */
241
3.60M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
2.36M
       yoffset++) {
243
18.5M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
16.1M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
16.1M
      blkn = 0;                 /* index of current DCT block within MCU */
247
34.5M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
18.3M
        compptr = cinfo->cur_comp_info[ci];
249
18.3M
        start_col = MCU_col_num * compptr->MCU_width;
250
37.4M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
19.0M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
39.7M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
20.6M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
20.6M
          }
255
19.0M
        }
256
18.3M
      }
257
16.1M
      if (!cinfo->entropy->insufficient_data)
258
16.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
16.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
16.1M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
2.36M
    coef->MCU_ctr = 0;
282
2.36M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
1.24M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
1.23M
    start_iMCU_row(cinfo);
286
1.23M
    return JPEG_ROW_COMPLETED;
287
1.23M
  }
288
  /* Completed the scan */
289
10.4k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
10.4k
  return JPEG_SCAN_COMPLETED;
291
1.24M
}
jdcoefct-8.c:consume_data
Line
Count
Source
218
1.19M
{
219
1.19M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
1.19M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
1.19M
  int blkn, ci, xindex, yindex, yoffset;
222
1.19M
  JDIMENSION start_col;
223
1.19M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
1.19M
  JBLOCKROW buffer_ptr;
225
1.19M
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
2.57M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
1.38M
    compptr = cinfo->cur_comp_info[ci];
230
1.38M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
1.38M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
1.38M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
1.38M
       (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.38M
  }
239
240
  /* Loop to process one whole iMCU row */
241
3.46M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
2.26M
       yoffset++) {
243
17.6M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
15.4M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
15.4M
      blkn = 0;                 /* index of current DCT block within MCU */
247
32.9M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
17.4M
        compptr = cinfo->cur_comp_info[ci];
249
17.4M
        start_col = MCU_col_num * compptr->MCU_width;
250
35.6M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
18.1M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
37.8M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
19.7M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
19.7M
          }
255
18.1M
        }
256
17.4M
      }
257
15.4M
      if (!cinfo->entropy->insufficient_data)
258
15.4M
        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.4M
      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.4M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
2.26M
    coef->MCU_ctr = 0;
282
2.26M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
1.19M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
1.18M
    start_iMCU_row(cinfo);
286
1.18M
    return JPEG_ROW_COMPLETED;
287
1.18M
  }
288
  /* Completed the scan */
289
9.54k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
9.54k
  return JPEG_SCAN_COMPLETED;
291
1.19M
}
jdcoefct-12.c:consume_data
Line
Count
Source
218
47.3k
{
219
47.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
47.3k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
47.3k
  int blkn, ci, xindex, yindex, yoffset;
222
47.3k
  JDIMENSION start_col;
223
47.3k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
47.3k
  JBLOCKROW buffer_ptr;
225
47.3k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
115k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
68.0k
    compptr = cinfo->cur_comp_info[ci];
230
68.0k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
68.0k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
68.0k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
68.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
68.0k
  }
239
240
  /* Loop to process one whole iMCU row */
241
139k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
91.8k
       yoffset++) {
243
815k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
723k
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
723k
      blkn = 0;                 /* index of current DCT block within MCU */
247
1.61M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
888k
        compptr = cinfo->cur_comp_info[ci];
249
888k
        start_col = MCU_col_num * compptr->MCU_width;
250
1.82M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
933k
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
1.89M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
961k
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
961k
          }
255
933k
        }
256
888k
      }
257
723k
      if (!cinfo->entropy->insufficient_data)
258
723k
        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
723k
      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
723k
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
91.8k
    coef->MCU_ctr = 0;
282
91.8k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
47.3k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
46.4k
    start_iMCU_row(cinfo);
286
46.4k
    return JPEG_ROW_COMPLETED;
287
46.4k
  }
288
  /* Completed the scan */
289
870
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
870
  return JPEG_SCAN_COMPLETED;
291
47.3k
}
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
86.3k
{
305
86.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
86.3k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
86.3k
  JDIMENSION block_num;
308
86.3k
  int ci, block_row, block_rows;
309
86.3k
  JBLOCKARRAY buffer;
310
86.3k
  JBLOCKROW buffer_ptr;
311
86.3k
  _JSAMPARRAY output_ptr;
312
86.3k
  JDIMENSION output_col;
313
86.3k
  jpeg_component_info *compptr;
314
86.3k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
86.3k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
86.3k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
86.3k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
320
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
321
0
      return JPEG_SUSPENDED;
322
0
  }
323
324
  /* OK, output from the virtual arrays. */
325
223k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
137k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
137k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
137k
    buffer = (*cinfo->mem->access_virt_barray)
332
137k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
137k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
137k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
137k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
135k
      block_rows = compptr->v_samp_factor;
338
2.06k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
2.06k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
2.06k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
2.06k
    }
343
137k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
137k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
394k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
257k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
257k
      output_col = 0;
349
257k
      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.51M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.51M
                        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.51M
        buffer_ptr++;
361
1.51M
        output_col += compptr->_DCT_scaled_size;
362
1.51M
      }
363
257k
      output_ptr += compptr->_DCT_scaled_size;
364
257k
    }
365
137k
  }
366
367
86.3k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
85.5k
    return JPEG_ROW_COMPLETED;
369
763
  return JPEG_SCAN_COMPLETED;
370
86.3k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
304
86.3k
{
305
86.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
86.3k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
86.3k
  JDIMENSION block_num;
308
86.3k
  int ci, block_row, block_rows;
309
86.3k
  JBLOCKARRAY buffer;
310
86.3k
  JBLOCKROW buffer_ptr;
311
86.3k
  _JSAMPARRAY output_ptr;
312
86.3k
  JDIMENSION output_col;
313
86.3k
  jpeg_component_info *compptr;
314
86.3k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
86.3k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
86.3k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
86.3k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
320
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
321
0
      return JPEG_SUSPENDED;
322
0
  }
323
324
  /* OK, output from the virtual arrays. */
325
223k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
137k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
137k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
137k
    buffer = (*cinfo->mem->access_virt_barray)
332
137k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
137k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
137k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
137k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
135k
      block_rows = compptr->v_samp_factor;
338
2.06k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
2.06k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
2.06k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
2.06k
    }
343
137k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
137k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
394k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
257k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
257k
      output_col = 0;
349
257k
      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.51M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.51M
                        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.51M
        buffer_ptr++;
361
1.51M
        output_col += compptr->_DCT_scaled_size;
362
1.51M
      }
363
257k
      output_ptr += compptr->_DCT_scaled_size;
364
257k
    }
365
137k
  }
366
367
86.3k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
85.5k
    return JPEG_ROW_COMPLETED;
369
763
  return JPEG_SCAN_COMPLETED;
370
86.3k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_data
371
372
#endif /* D_MULTISCAN_FILES_SUPPORTED */
373
374
375
#ifdef BLOCK_SMOOTHING_SUPPORTED
376
377
/*
378
 * This code applies interblock smoothing; the first 9 AC coefficients are
379
 * estimated from the DC values of a DCT block and its 24 neighboring blocks.
380
 * We apply smoothing only for progressive JPEG decoding, and only if
381
 * the coefficients it can estimate are not yet known to full precision.
382
 */
383
384
/* Natural-order array positions of the first 9 zigzag-order coefficients */
385
267k
#define Q01_POS  1
386
267k
#define Q10_POS  8
387
267k
#define Q20_POS  16
388
267k
#define Q11_POS  9
389
267k
#define Q02_POS  2
390
118k
#define Q03_POS  3
391
118k
#define Q12_POS  10
392
118k
#define Q21_POS  17
393
118k
#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.92k
{
406
1.92k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.92k
  boolean smoothing_useful = FALSE;
408
1.92k
  int ci, coefi;
409
1.92k
  jpeg_component_info *compptr;
410
1.92k
  JQUANT_TBL *qtable;
411
1.92k
  int *coef_bits, *prev_coef_bits;
412
1.92k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.92k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
21
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.90k
  if (coef->coef_bits_latch == NULL)
419
1.90k
    coef->coef_bits_latch = (int *)
420
1.90k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.90k
                                  cinfo->num_components * 2 *
422
1.90k
                                  (SAVED_COEFS * sizeof(int)));
423
1.90k
  coef_bits_latch = coef->coef_bits_latch;
424
1.90k
  prev_coef_bits_latch =
425
1.90k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
5.01k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
3.56k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
3.56k
    if ((qtable = compptr->quant_table) == NULL)
431
35
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
3.53k
    if (qtable->quantval[0] == 0 ||
434
3.51k
        qtable->quantval[Q01_POS] == 0 ||
435
3.47k
        qtable->quantval[Q10_POS] == 0 ||
436
3.40k
        qtable->quantval[Q20_POS] == 0 ||
437
3.32k
        qtable->quantval[Q11_POS] == 0 ||
438
3.26k
        qtable->quantval[Q02_POS] == 0 ||
439
3.20k
        qtable->quantval[Q03_POS] == 0 ||
440
3.18k
        qtable->quantval[Q12_POS] == 0 ||
441
3.15k
        qtable->quantval[Q21_POS] == 0 ||
442
3.14k
        qtable->quantval[Q30_POS] == 0)
443
429
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
3.10k
    coef_bits = cinfo->coef_bits[ci];
446
3.10k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
3.10k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
3.10k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
31.0k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
27.9k
      if (cinfo->input_scan_number > 1)
453
20.7k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
7.18k
      else
455
7.18k
        prev_coef_bits_latch[coefi] = -1;
456
27.9k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
27.9k
      if (coef_bits[coefi] != 0)
458
15.8k
        smoothing_useful = TRUE;
459
27.9k
    }
460
3.10k
    coef_bits_latch += SAVED_COEFS;
461
3.10k
    prev_coef_bits_latch += SAVED_COEFS;
462
3.10k
  }
463
464
1.44k
  return smoothing_useful;
465
1.90k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
405
1.72k
{
406
1.72k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.72k
  boolean smoothing_useful = FALSE;
408
1.72k
  int ci, coefi;
409
1.72k
  jpeg_component_info *compptr;
410
1.72k
  JQUANT_TBL *qtable;
411
1.72k
  int *coef_bits, *prev_coef_bits;
412
1.72k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.72k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
17
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.71k
  if (coef->coef_bits_latch == NULL)
419
1.71k
    coef->coef_bits_latch = (int *)
420
1.71k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.71k
                                  cinfo->num_components * 2 *
422
1.71k
                                  (SAVED_COEFS * sizeof(int)));
423
1.71k
  coef_bits_latch = coef->coef_bits_latch;
424
1.71k
  prev_coef_bits_latch =
425
1.71k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
4.59k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
3.21k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
3.21k
    if ((qtable = compptr->quant_table) == NULL)
431
34
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
3.17k
    if (qtable->quantval[0] == 0 ||
434
3.16k
        qtable->quantval[Q01_POS] == 0 ||
435
3.13k
        qtable->quantval[Q10_POS] == 0 ||
436
3.10k
        qtable->quantval[Q20_POS] == 0 ||
437
3.04k
        qtable->quantval[Q11_POS] == 0 ||
438
2.99k
        qtable->quantval[Q02_POS] == 0 ||
439
2.95k
        qtable->quantval[Q03_POS] == 0 ||
440
2.93k
        qtable->quantval[Q12_POS] == 0 ||
441
2.91k
        qtable->quantval[Q21_POS] == 0 ||
442
2.90k
        qtable->quantval[Q30_POS] == 0)
443
297
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
2.88k
    coef_bits = cinfo->coef_bits[ci];
446
2.88k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
2.88k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
2.88k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
28.8k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
25.9k
      if (cinfo->input_scan_number > 1)
453
19.8k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
6.10k
      else
455
6.10k
        prev_coef_bits_latch[coefi] = -1;
456
25.9k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
25.9k
      if (coef_bits[coefi] != 0)
458
14.0k
        smoothing_useful = TRUE;
459
25.9k
    }
460
2.88k
    coef_bits_latch += SAVED_COEFS;
461
2.88k
    prev_coef_bits_latch += SAVED_COEFS;
462
2.88k
  }
463
464
1.38k
  return smoothing_useful;
465
1.71k
}
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
4
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
195
  if (coef->coef_bits_latch == NULL)
419
195
    coef->coef_bits_latch = (int *)
420
195
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
195
                                  cinfo->num_components * 2 *
422
195
                                  (SAVED_COEFS * sizeof(int)));
423
195
  coef_bits_latch = coef->coef_bits_latch;
424
195
  prev_coef_bits_latch =
425
195
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
418
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
356
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
356
    if ((qtable = compptr->quant_table) == NULL)
431
1
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
355
    if (qtable->quantval[0] == 0 ||
434
348
        qtable->quantval[Q01_POS] == 0 ||
435
341
        qtable->quantval[Q10_POS] == 0 ||
436
293
        qtable->quantval[Q20_POS] == 0 ||
437
275
        qtable->quantval[Q11_POS] == 0 ||
438
265
        qtable->quantval[Q02_POS] == 0 ||
439
253
        qtable->quantval[Q03_POS] == 0 ||
440
247
        qtable->quantval[Q12_POS] == 0 ||
441
241
        qtable->quantval[Q21_POS] == 0 ||
442
237
        qtable->quantval[Q30_POS] == 0)
443
132
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
223
    coef_bits = cinfo->coef_bits[ci];
446
223
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
223
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
223
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
2.23k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
2.00k
      if (cinfo->input_scan_number > 1)
453
927
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
1.08k
      else
455
1.08k
        prev_coef_bits_latch[coefi] = -1;
456
2.00k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
2.00k
      if (coef_bits[coefi] != 0)
458
1.85k
        smoothing_useful = TRUE;
459
2.00k
    }
460
223
    coef_bits_latch += SAVED_COEFS;
461
223
    prev_coef_bits_latch += SAVED_COEFS;
462
223
  }
463
464
62
  return smoothing_useful;
465
195
}
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
227k
{
475
227k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
227k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
227k
  JDIMENSION block_num, last_block_column;
478
227k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
227k
    image_block_rows;
480
227k
  JBLOCKARRAY buffer;
481
227k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
227k
  JBLOCKROW next_block_row, next_next_block_row;
483
227k
  _JSAMPARRAY output_ptr;
484
227k
  JDIMENSION output_col;
485
227k
  jpeg_component_info *compptr;
486
227k
  _inverse_DCT_method_ptr inverse_DCT;
487
227k
  boolean change_dc;
488
227k
  JCOEF *workspace;
489
227k
  int *coef_bits;
490
227k
  JQUANT_TBL *quanttbl;
491
227k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
227k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
227k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
227k
      DC25;
495
227k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
227k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
227k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
227k
         !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
492k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
264k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
264k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
264k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
261k
      block_rows = compptr->v_samp_factor;
526
261k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
261k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
1.33k
      block_rows = compptr->v_samp_factor;
529
1.33k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
1.61k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
1.61k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
1.61k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
1.61k
      access_rows = block_rows; /* this iMCU row only */
535
1.61k
    }
536
    /* Align the virtual buffer for this component. */
537
264k
    if (cinfo->output_iMCU_row > 1) {
538
261k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
261k
      buffer = (*cinfo->mem->access_virt_barray)
540
261k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
261k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
261k
         (JDIMENSION)access_rows, FALSE);
543
261k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
261k
    } else if (cinfo->output_iMCU_row > 0) {
545
1.33k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
1.33k
      buffer = (*cinfo->mem->access_virt_barray)
547
1.33k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
1.33k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
1.33k
         (JDIMENSION)access_rows, FALSE);
550
1.33k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
1.61k
    } else {
552
1.61k
      buffer = (*cinfo->mem->access_virt_barray)
553
1.61k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
1.61k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
1.61k
    }
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
264k
    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
264k
    else
564
264k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
264k
    change_dc =
568
264k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
145k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
141k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
264k
    quanttbl = compptr->quant_table;
573
264k
    Q00 = quanttbl->quantval[0];
574
264k
    Q01 = quanttbl->quantval[Q01_POS];
575
264k
    Q10 = quanttbl->quantval[Q10_POS];
576
264k
    Q20 = quanttbl->quantval[Q20_POS];
577
264k
    Q11 = quanttbl->quantval[Q11_POS];
578
264k
    Q02 = quanttbl->quantval[Q02_POS];
579
264k
    if (change_dc) {
580
115k
      Q03 = quanttbl->quantval[Q03_POS];
581
115k
      Q12 = quanttbl->quantval[Q12_POS];
582
115k
      Q21 = quanttbl->quantval[Q21_POS];
583
115k
      Q30 = quanttbl->quantval[Q30_POS];
584
115k
    }
585
264k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
264k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
264k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
753k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
489k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
489k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
489k
      if (image_block_row > 0)
594
487k
        prev_block_row =
595
487k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
1.61k
      else
597
1.61k
        prev_block_row = buffer_ptr;
598
599
489k
      if (image_block_row > 1)
600
486k
        prev_prev_block_row =
601
486k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
3.12k
      else
603
3.12k
        prev_prev_block_row = prev_block_row;
604
605
489k
      if (image_block_row < image_block_rows - 1)
606
487k
        next_block_row =
607
487k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
1.61k
      else
609
1.61k
        next_block_row = buffer_ptr;
610
611
489k
      if (image_block_row < image_block_rows - 2)
612
486k
        next_next_block_row =
613
486k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
2.57k
      else
615
2.57k
        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
489k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
489k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
489k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
489k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
489k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
489k
      output_col = 0;
626
489k
      last_block_column = compptr->width_in_blocks - 1;
627
489k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
4.76M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
4.27M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
4.27M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
489k
            block_num < last_block_column) {
634
389k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
389k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
389k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
389k
          DC19 = DC20 = (int)next_block_row[1][0];
638
389k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
389k
        }
640
4.27M
        if (block_num + 1 < last_block_column) {
641
3.39M
          DC05 = (int)prev_prev_block_row[2][0];
642
3.39M
          DC10 = (int)prev_block_row[2][0];
643
3.39M
          DC15 = (int)buffer_ptr[2][0];
644
3.39M
          DC20 = (int)next_block_row[2][0];
645
3.39M
          DC25 = (int)next_next_block_row[2][0];
646
3.39M
        }
647
        /* If DC interpolation is enabled, compute coefficient estimates using
648
         * a Gaussian-like kernel, keeping the averages of the DC values.
649
         *
650
         * If DC interpolation is disabled, compute coefficient estimates using
651
         * an algorithm similar to the one described in Section K.8 of the JPEG
652
         * standard, except applied to a 5x5 window rather than a 3x3 window.
653
         *
654
         * An estimate is applied only if the coefficient is still zero and is
655
         * not known to be fully accurate.
656
         */
657
        /* AC01 */
658
4.27M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
3.49M
          num = Q00 * (change_dc ?
660
2.41M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
2.41M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
2.41M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
2.41M
                 DC21 - DC22 + DC24 + DC25) :
664
3.49M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
3.49M
          if (num >= 0) {
666
2.13M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
2.13M
            if (Al > 0 && pred >= (1 << Al))
668
57.5k
              pred = (1 << Al) - 1;
669
2.13M
          } else {
670
1.36M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
1.36M
            if (Al > 0 && pred >= (1 << Al))
672
40.0k
              pred = (1 << Al) - 1;
673
1.36M
            pred = -pred;
674
1.36M
          }
675
3.49M
          workspace[1] = (JCOEF)pred;
676
3.49M
        }
677
        /* AC10 */
678
4.27M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
3.53M
          num = Q00 * (change_dc ?
680
2.41M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
2.41M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
2.41M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
2.41M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
3.53M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
3.53M
          if (num >= 0) {
686
2.39M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
2.39M
            if (Al > 0 && pred >= (1 << Al))
688
72.6k
              pred = (1 << Al) - 1;
689
2.39M
          } else {
690
1.14M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
1.14M
            if (Al > 0 && pred >= (1 << Al))
692
55.9k
              pred = (1 << Al) - 1;
693
1.14M
            pred = -pred;
694
1.14M
          }
695
3.53M
          workspace[8] = (JCOEF)pred;
696
3.53M
        }
697
        /* AC20 */
698
4.27M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
3.50M
          num = Q00 * (change_dc ?
700
2.41M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
2.41M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
3.50M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
3.50M
          if (num >= 0) {
704
2.14M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
2.14M
            if (Al > 0 && pred >= (1 << Al))
706
56.1k
              pred = (1 << Al) - 1;
707
2.14M
          } else {
708
1.35M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
1.35M
            if (Al > 0 && pred >= (1 << Al))
710
57.8k
              pred = (1 << Al) - 1;
711
1.35M
            pred = -pred;
712
1.35M
          }
713
3.50M
          workspace[16] = (JCOEF)pred;
714
3.50M
        }
715
        /* AC11 */
716
4.27M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
3.39M
          num = Q00 * (change_dc ?
718
2.41M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
2.41M
                 9 * DC19 + DC21 - DC25) :
720
3.39M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
978k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
3.39M
          if (num >= 0) {
723
2.33M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
2.33M
            if (Al > 0 && pred >= (1 << Al))
725
48.7k
              pred = (1 << Al) - 1;
726
2.33M
          } else {
727
1.05M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
1.05M
            if (Al > 0 && pred >= (1 << Al))
729
48.6k
              pred = (1 << Al) - 1;
730
1.05M
            pred = -pred;
731
1.05M
          }
732
3.39M
          workspace[9] = (JCOEF)pred;
733
3.39M
        }
734
        /* AC02 */
735
4.27M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
3.33M
          num = Q00 * (change_dc ?
737
2.41M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
2.41M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
3.33M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
3.33M
          if (num >= 0) {
741
1.99M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
1.99M
            if (Al > 0 && pred >= (1 << Al))
743
46.6k
              pred = (1 << Al) - 1;
744
1.99M
          } else {
745
1.33M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
1.33M
            if (Al > 0 && pred >= (1 << Al))
747
49.0k
              pred = (1 << Al) - 1;
748
1.33M
            pred = -pred;
749
1.33M
          }
750
3.33M
          workspace[2] = (JCOEF)pred;
751
3.33M
        }
752
4.27M
        if (change_dc) {
753
          /* AC03 */
754
2.41M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
2.41M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
2.41M
            if (num >= 0) {
757
1.53M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
1.53M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
1.53M
            } else {
761
880k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
880k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
880k
              pred = -pred;
765
880k
            }
766
2.41M
            workspace[3] = (JCOEF)pred;
767
2.41M
          }
768
          /* AC12 */
769
2.41M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
2.41M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
2.41M
            if (num >= 0) {
772
1.59M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
1.59M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
1.59M
            } else {
776
825k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
825k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
825k
              pred = -pred;
780
825k
            }
781
2.41M
            workspace[10] = (JCOEF)pred;
782
2.41M
          }
783
          /* AC21 */
784
2.41M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
2.41M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
2.41M
            if (num >= 0) {
787
1.46M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
1.46M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
1.46M
            } else {
791
945k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
945k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
945k
              pred = -pred;
795
945k
            }
796
2.41M
            workspace[17] = (JCOEF)pred;
797
2.41M
          }
798
          /* AC30 */
799
2.41M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
2.41M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
2.41M
            if (num >= 0) {
802
1.62M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
1.62M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
1.62M
            } else {
806
786k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
786k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
786k
              pred = -pred;
810
786k
            }
811
2.41M
            workspace[24] = (JCOEF)pred;
812
2.41M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
2.41M
          num = Q00 *
817
2.41M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
2.41M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
2.41M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
2.41M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
2.41M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
2.41M
          if (num >= 0) {
823
1.09M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
1.32M
          } else {
825
1.32M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
1.32M
            pred = -pred;
827
1.32M
          }
828
2.41M
          workspace[0] = (JCOEF)pred;
829
2.41M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
4.27M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
4.27M
                        output_col);
837
#ifdef WITH_PROFILE
838
        cinfo->master->idct_elapsed += getTime() - cinfo->master->start;
839
        cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
840
#endif
841
        /* Advance for next column */
842
4.27M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
4.27M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
4.27M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
4.27M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
4.27M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
4.27M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
4.27M
          prev_prev_block_row++, next_next_block_row++;
849
4.27M
        output_col += compptr->_DCT_scaled_size;
850
4.27M
      }
851
489k
      output_ptr += compptr->_DCT_scaled_size;
852
489k
    }
853
264k
  }
854
855
227k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
226k
    return JPEG_ROW_COMPLETED;
857
965
  return JPEG_SCAN_COMPLETED;
858
227k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
474
227k
{
475
227k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
227k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
227k
  JDIMENSION block_num, last_block_column;
478
227k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
227k
    image_block_rows;
480
227k
  JBLOCKARRAY buffer;
481
227k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
227k
  JBLOCKROW next_block_row, next_next_block_row;
483
227k
  _JSAMPARRAY output_ptr;
484
227k
  JDIMENSION output_col;
485
227k
  jpeg_component_info *compptr;
486
227k
  _inverse_DCT_method_ptr inverse_DCT;
487
227k
  boolean change_dc;
488
227k
  JCOEF *workspace;
489
227k
  int *coef_bits;
490
227k
  JQUANT_TBL *quanttbl;
491
227k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
227k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
227k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
227k
      DC25;
495
227k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
227k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
227k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
227k
         !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
492k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
264k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
264k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
264k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
261k
      block_rows = compptr->v_samp_factor;
526
261k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
261k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
1.33k
      block_rows = compptr->v_samp_factor;
529
1.33k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
1.61k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
1.61k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
1.61k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
1.61k
      access_rows = block_rows; /* this iMCU row only */
535
1.61k
    }
536
    /* Align the virtual buffer for this component. */
537
264k
    if (cinfo->output_iMCU_row > 1) {
538
261k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
261k
      buffer = (*cinfo->mem->access_virt_barray)
540
261k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
261k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
261k
         (JDIMENSION)access_rows, FALSE);
543
261k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
261k
    } else if (cinfo->output_iMCU_row > 0) {
545
1.33k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
1.33k
      buffer = (*cinfo->mem->access_virt_barray)
547
1.33k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
1.33k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
1.33k
         (JDIMENSION)access_rows, FALSE);
550
1.33k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
1.61k
    } else {
552
1.61k
      buffer = (*cinfo->mem->access_virt_barray)
553
1.61k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
1.61k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
1.61k
    }
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
264k
    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
264k
    else
564
264k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
264k
    change_dc =
568
264k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
145k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
141k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
264k
    quanttbl = compptr->quant_table;
573
264k
    Q00 = quanttbl->quantval[0];
574
264k
    Q01 = quanttbl->quantval[Q01_POS];
575
264k
    Q10 = quanttbl->quantval[Q10_POS];
576
264k
    Q20 = quanttbl->quantval[Q20_POS];
577
264k
    Q11 = quanttbl->quantval[Q11_POS];
578
264k
    Q02 = quanttbl->quantval[Q02_POS];
579
264k
    if (change_dc) {
580
115k
      Q03 = quanttbl->quantval[Q03_POS];
581
115k
      Q12 = quanttbl->quantval[Q12_POS];
582
115k
      Q21 = quanttbl->quantval[Q21_POS];
583
115k
      Q30 = quanttbl->quantval[Q30_POS];
584
115k
    }
585
264k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
264k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
264k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
753k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
489k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
489k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
489k
      if (image_block_row > 0)
594
487k
        prev_block_row =
595
487k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
1.61k
      else
597
1.61k
        prev_block_row = buffer_ptr;
598
599
489k
      if (image_block_row > 1)
600
486k
        prev_prev_block_row =
601
486k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
3.12k
      else
603
3.12k
        prev_prev_block_row = prev_block_row;
604
605
489k
      if (image_block_row < image_block_rows - 1)
606
487k
        next_block_row =
607
487k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
1.61k
      else
609
1.61k
        next_block_row = buffer_ptr;
610
611
489k
      if (image_block_row < image_block_rows - 2)
612
486k
        next_next_block_row =
613
486k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
2.57k
      else
615
2.57k
        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
489k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
489k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
489k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
489k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
489k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
489k
      output_col = 0;
626
489k
      last_block_column = compptr->width_in_blocks - 1;
627
489k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
4.76M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
4.27M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
4.27M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
489k
            block_num < last_block_column) {
634
389k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
389k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
389k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
389k
          DC19 = DC20 = (int)next_block_row[1][0];
638
389k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
389k
        }
640
4.27M
        if (block_num + 1 < last_block_column) {
641
3.39M
          DC05 = (int)prev_prev_block_row[2][0];
642
3.39M
          DC10 = (int)prev_block_row[2][0];
643
3.39M
          DC15 = (int)buffer_ptr[2][0];
644
3.39M
          DC20 = (int)next_block_row[2][0];
645
3.39M
          DC25 = (int)next_next_block_row[2][0];
646
3.39M
        }
647
        /* If DC interpolation is enabled, compute coefficient estimates using
648
         * a Gaussian-like kernel, keeping the averages of the DC values.
649
         *
650
         * If DC interpolation is disabled, compute coefficient estimates using
651
         * an algorithm similar to the one described in Section K.8 of the JPEG
652
         * standard, except applied to a 5x5 window rather than a 3x3 window.
653
         *
654
         * An estimate is applied only if the coefficient is still zero and is
655
         * not known to be fully accurate.
656
         */
657
        /* AC01 */
658
4.27M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
3.49M
          num = Q00 * (change_dc ?
660
2.41M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
2.41M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
2.41M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
2.41M
                 DC21 - DC22 + DC24 + DC25) :
664
3.49M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
3.49M
          if (num >= 0) {
666
2.13M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
2.13M
            if (Al > 0 && pred >= (1 << Al))
668
57.5k
              pred = (1 << Al) - 1;
669
2.13M
          } else {
670
1.36M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
1.36M
            if (Al > 0 && pred >= (1 << Al))
672
40.0k
              pred = (1 << Al) - 1;
673
1.36M
            pred = -pred;
674
1.36M
          }
675
3.49M
          workspace[1] = (JCOEF)pred;
676
3.49M
        }
677
        /* AC10 */
678
4.27M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
3.53M
          num = Q00 * (change_dc ?
680
2.41M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
2.41M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
2.41M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
2.41M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
3.53M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
3.53M
          if (num >= 0) {
686
2.39M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
2.39M
            if (Al > 0 && pred >= (1 << Al))
688
72.6k
              pred = (1 << Al) - 1;
689
2.39M
          } else {
690
1.14M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
1.14M
            if (Al > 0 && pred >= (1 << Al))
692
55.9k
              pred = (1 << Al) - 1;
693
1.14M
            pred = -pred;
694
1.14M
          }
695
3.53M
          workspace[8] = (JCOEF)pred;
696
3.53M
        }
697
        /* AC20 */
698
4.27M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
3.50M
          num = Q00 * (change_dc ?
700
2.41M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
2.41M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
3.50M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
3.50M
          if (num >= 0) {
704
2.14M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
2.14M
            if (Al > 0 && pred >= (1 << Al))
706
56.1k
              pred = (1 << Al) - 1;
707
2.14M
          } else {
708
1.35M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
1.35M
            if (Al > 0 && pred >= (1 << Al))
710
57.8k
              pred = (1 << Al) - 1;
711
1.35M
            pred = -pred;
712
1.35M
          }
713
3.50M
          workspace[16] = (JCOEF)pred;
714
3.50M
        }
715
        /* AC11 */
716
4.27M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
3.39M
          num = Q00 * (change_dc ?
718
2.41M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
2.41M
                 9 * DC19 + DC21 - DC25) :
720
3.39M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
978k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
3.39M
          if (num >= 0) {
723
2.33M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
2.33M
            if (Al > 0 && pred >= (1 << Al))
725
48.7k
              pred = (1 << Al) - 1;
726
2.33M
          } else {
727
1.05M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
1.05M
            if (Al > 0 && pred >= (1 << Al))
729
48.6k
              pred = (1 << Al) - 1;
730
1.05M
            pred = -pred;
731
1.05M
          }
732
3.39M
          workspace[9] = (JCOEF)pred;
733
3.39M
        }
734
        /* AC02 */
735
4.27M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
3.33M
          num = Q00 * (change_dc ?
737
2.41M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
2.41M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
3.33M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
3.33M
          if (num >= 0) {
741
1.99M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
1.99M
            if (Al > 0 && pred >= (1 << Al))
743
46.6k
              pred = (1 << Al) - 1;
744
1.99M
          } else {
745
1.33M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
1.33M
            if (Al > 0 && pred >= (1 << Al))
747
49.0k
              pred = (1 << Al) - 1;
748
1.33M
            pred = -pred;
749
1.33M
          }
750
3.33M
          workspace[2] = (JCOEF)pred;
751
3.33M
        }
752
4.27M
        if (change_dc) {
753
          /* AC03 */
754
2.41M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
2.41M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
2.41M
            if (num >= 0) {
757
1.53M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
1.53M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
1.53M
            } else {
761
880k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
880k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
880k
              pred = -pred;
765
880k
            }
766
2.41M
            workspace[3] = (JCOEF)pred;
767
2.41M
          }
768
          /* AC12 */
769
2.41M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
2.41M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
2.41M
            if (num >= 0) {
772
1.59M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
1.59M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
1.59M
            } else {
776
825k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
825k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
825k
              pred = -pred;
780
825k
            }
781
2.41M
            workspace[10] = (JCOEF)pred;
782
2.41M
          }
783
          /* AC21 */
784
2.41M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
2.41M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
2.41M
            if (num >= 0) {
787
1.46M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
1.46M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
1.46M
            } else {
791
945k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
945k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
945k
              pred = -pred;
795
945k
            }
796
2.41M
            workspace[17] = (JCOEF)pred;
797
2.41M
          }
798
          /* AC30 */
799
2.41M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
2.41M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
2.41M
            if (num >= 0) {
802
1.62M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
1.62M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
1.62M
            } else {
806
786k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
786k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
786k
              pred = -pred;
810
786k
            }
811
2.41M
            workspace[24] = (JCOEF)pred;
812
2.41M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
2.41M
          num = Q00 *
817
2.41M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
2.41M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
2.41M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
2.41M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
2.41M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
2.41M
          if (num >= 0) {
823
1.09M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
1.32M
          } else {
825
1.32M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
1.32M
            pred = -pred;
827
1.32M
          }
828
2.41M
          workspace[0] = (JCOEF)pred;
829
2.41M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
4.27M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
4.27M
                        output_col);
837
#ifdef WITH_PROFILE
838
        cinfo->master->idct_elapsed += getTime() - cinfo->master->start;
839
        cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
840
#endif
841
        /* Advance for next column */
842
4.27M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
4.27M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
4.27M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
4.27M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
4.27M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
4.27M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
4.27M
          prev_prev_block_row++, next_next_block_row++;
849
4.27M
        output_col += compptr->_DCT_scaled_size;
850
4.27M
      }
851
489k
      output_ptr += compptr->_DCT_scaled_size;
852
489k
    }
853
264k
  }
854
855
227k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
226k
    return JPEG_ROW_COMPLETED;
857
965
  return JPEG_SCAN_COMPLETED;
858
227k
}
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.72k
{
870
5.72k
  my_coef_ptr coef;
871
872
5.72k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
5.72k
  coef = (my_coef_ptr)
876
5.72k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
5.72k
                                sizeof(my_coef_controller));
878
5.72k
  memset(coef, 0, sizeof(my_coef_controller));
879
5.72k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
5.72k
  coef->pub.start_input_pass = start_input_pass;
881
5.72k
  coef->pub.start_output_pass = start_output_pass;
882
5.72k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
5.72k
  coef->coef_bits_latch = NULL;
884
5.72k
#endif
885
886
  /* Create the coefficient buffer. */
887
5.72k
  if (need_full_buffer) {
888
2.95k
#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.95k
    int ci, access_rows;
893
2.95k
    jpeg_component_info *compptr;
894
895
9.87k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
6.91k
         ci++, compptr++) {
897
6.91k
      access_rows = compptr->v_samp_factor;
898
6.91k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
6.91k
      if (cinfo->progressive_mode)
901
6.80k
        access_rows *= 5;
902
6.91k
#endif
903
6.91k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
6.91k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
6.91k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
6.91k
                               (long)compptr->h_samp_factor),
907
6.91k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
6.91k
                               (long)compptr->v_samp_factor),
909
6.91k
         (JDIMENSION)access_rows);
910
6.91k
    }
911
2.95k
    coef->pub.consume_data = consume_data;
912
2.95k
    coef->pub._decompress_data = decompress_data;
913
2.95k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.95k
  } else {
918
    /* We only need a single-MCU buffer. */
919
2.77k
    JBLOCKROW buffer;
920
2.77k
    int i;
921
922
2.77k
    buffer = (JBLOCKROW)
923
2.77k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
2.77k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
30.4k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
27.7k
      coef->MCU_buffer[i] = buffer + i;
927
27.7k
    }
928
2.77k
    coef->pub.consume_data = dummy_consume_data;
929
2.77k
    coef->pub._decompress_data = decompress_onepass;
930
2.77k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
2.77k
  }
932
933
  /* Allocate the workspace buffer */
934
5.72k
  coef->workspace = (JCOEF *)
935
5.72k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
5.72k
                                sizeof(JCOEF) * DCTSIZE2);
937
5.72k
}
jinit_d_coef_controller
Line
Count
Source
869
5.19k
{
870
5.19k
  my_coef_ptr coef;
871
872
5.19k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
5.19k
  coef = (my_coef_ptr)
876
5.19k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
5.19k
                                sizeof(my_coef_controller));
878
5.19k
  memset(coef, 0, sizeof(my_coef_controller));
879
5.19k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
5.19k
  coef->pub.start_input_pass = start_input_pass;
881
5.19k
  coef->pub.start_output_pass = start_output_pass;
882
5.19k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
5.19k
  coef->coef_bits_latch = NULL;
884
5.19k
#endif
885
886
  /* Create the coefficient buffer. */
887
5.19k
  if (need_full_buffer) {
888
2.44k
#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.44k
    int ci, access_rows;
893
2.44k
    jpeg_component_info *compptr;
894
895
7.86k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
5.41k
         ci++, compptr++) {
897
5.41k
      access_rows = compptr->v_samp_factor;
898
5.41k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
5.41k
      if (cinfo->progressive_mode)
901
5.36k
        access_rows *= 5;
902
5.41k
#endif
903
5.41k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
5.41k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
5.41k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
5.41k
                               (long)compptr->h_samp_factor),
907
5.41k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
5.41k
                               (long)compptr->v_samp_factor),
909
5.41k
         (JDIMENSION)access_rows);
910
5.41k
    }
911
2.44k
    coef->pub.consume_data = consume_data;
912
2.44k
    coef->pub._decompress_data = decompress_data;
913
2.44k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.74k
  } else {
918
    /* We only need a single-MCU buffer. */
919
2.74k
    JBLOCKROW buffer;
920
2.74k
    int i;
921
922
2.74k
    buffer = (JBLOCKROW)
923
2.74k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
2.74k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
30.2k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
27.4k
      coef->MCU_buffer[i] = buffer + i;
927
27.4k
    }
928
2.74k
    coef->pub.consume_data = dummy_consume_data;
929
2.74k
    coef->pub._decompress_data = decompress_onepass;
930
2.74k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
2.74k
  }
932
933
  /* Allocate the workspace buffer */
934
5.19k
  coef->workspace = (JCOEF *)
935
5.19k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
5.19k
                                sizeof(JCOEF) * DCTSIZE2);
937
5.19k
}
j12init_d_coef_controller
Line
Count
Source
869
530
{
870
530
  my_coef_ptr coef;
871
872
530
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
530
  coef = (my_coef_ptr)
876
530
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
530
                                sizeof(my_coef_controller));
878
530
  memset(coef, 0, sizeof(my_coef_controller));
879
530
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
530
  coef->pub.start_input_pass = start_input_pass;
881
530
  coef->pub.start_output_pass = start_output_pass;
882
530
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
530
  coef->coef_bits_latch = NULL;
884
530
#endif
885
886
  /* Create the coefficient buffer. */
887
530
  if (need_full_buffer) {
888
507
#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
507
    int ci, access_rows;
893
507
    jpeg_component_info *compptr;
894
895
2.00k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
1.49k
         ci++, compptr++) {
897
1.49k
      access_rows = compptr->v_samp_factor;
898
1.49k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
1.49k
      if (cinfo->progressive_mode)
901
1.44k
        access_rows *= 5;
902
1.49k
#endif
903
1.49k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
1.49k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
1.49k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
1.49k
                               (long)compptr->h_samp_factor),
907
1.49k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
1.49k
                               (long)compptr->v_samp_factor),
909
1.49k
         (JDIMENSION)access_rows);
910
1.49k
    }
911
507
    coef->pub.consume_data = consume_data;
912
507
    coef->pub._decompress_data = decompress_data;
913
507
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
507
  } else {
918
    /* We only need a single-MCU buffer. */
919
23
    JBLOCKROW buffer;
920
23
    int i;
921
922
23
    buffer = (JBLOCKROW)
923
23
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
23
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
253
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
230
      coef->MCU_buffer[i] = buffer + i;
927
230
    }
928
23
    coef->pub.consume_data = dummy_consume_data;
929
23
    coef->pub._decompress_data = decompress_onepass;
930
23
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
23
  }
932
933
  /* Allocate the workspace buffer */
934
530
  coef->workspace = (JCOEF *)
935
530
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
530
                                sizeof(JCOEF) * DCTSIZE2);
937
530
}