Coverage Report

Created: 2026-09-14 06:15

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.6k
{
51
13.6k
  cinfo->input_iMCU_row = 0;
52
13.6k
  start_iMCU_row(cinfo);
53
13.6k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
50
11.9k
{
51
11.9k
  cinfo->input_iMCU_row = 0;
52
11.9k
  start_iMCU_row(cinfo);
53
11.9k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
50
1.73k
{
51
1.73k
  cinfo->input_iMCU_row = 0;
52
1.73k
  start_iMCU_row(cinfo);
53
1.73k
}
54
55
56
/*
57
 * Initialize for an output processing pass.
58
 */
59
60
METHODDEF(void)
61
start_output_pass(j_decompress_ptr cinfo)
62
5.25k
{
63
5.25k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
5.25k
  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
5.25k
  if (coef->pub.coef_arrays != NULL) {
68
2.32k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
1.61k
      coef->pub._decompress_data = decompress_smooth_data;
70
704
    else
71
704
      coef->pub._decompress_data = decompress_data;
72
2.32k
  }
73
5.25k
#endif
74
5.25k
  cinfo->output_iMCU_row = 0;
75
5.25k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
62
5.03k
{
63
5.03k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
5.03k
  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
5.03k
  if (coef->pub.coef_arrays != NULL) {
68
2.13k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
1.58k
      coef->pub._decompress_data = decompress_smooth_data;
70
546
    else
71
546
      coef->pub._decompress_data = decompress_data;
72
2.13k
  }
73
5.03k
#endif
74
5.03k
  cinfo->output_iMCU_row = 0;
75
5.03k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
62
219
{
63
219
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
219
  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
219
  if (coef->pub.coef_arrays != NULL) {
68
191
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
33
      coef->pub._decompress_data = decompress_smooth_data;
70
158
    else
71
158
      coef->pub._decompress_data = decompress_data;
72
191
  }
73
219
#endif
74
219
  cinfo->output_iMCU_row = 0;
75
219
}
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
78.8k
{
91
78.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
78.8k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
78.8k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
78.8k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
78.8k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
78.8k
  _JSAMPARRAY output_ptr;
97
78.8k
  JDIMENSION start_col, output_col;
98
78.8k
  jpeg_component_info *compptr;
99
78.8k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
164k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
85.2k
       yoffset++) {
104
2.91M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
2.82M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
2.82M
      jzero_far((void *)coef->MCU_buffer[0],
108
2.82M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
2.82M
      if (!cinfo->entropy->insufficient_data)
110
2.82M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
2.82M
      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
2.82M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
2.82M
          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
2.82M
        blkn = 0;               /* index of current DCT block within MCU */
142
7.41M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
4.59M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
4.59M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
4.59M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
4.59M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
4.47M
                         compptr->MCU_width : compptr->last_col_width;
152
4.59M
          output_ptr = output_buf[compptr->component_index] +
153
4.59M
                       yoffset * compptr->_DCT_scaled_size;
154
4.59M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
4.59M
                      compptr->MCU_sample_width;
156
10.5M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
5.95M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
4.77M
                yoffset + yindex < compptr->last_row_height) {
159
4.77M
              output_col = start_col;
160
10.2M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
5.43M
                (*inverse_DCT) (cinfo, compptr,
165
5.43M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
5.43M
                                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
5.43M
                output_col += compptr->_DCT_scaled_size;
173
5.43M
              }
174
4.77M
            }
175
5.95M
            blkn += compptr->MCU_width;
176
5.95M
            output_ptr += compptr->_DCT_scaled_size;
177
5.95M
          }
178
4.59M
        }
179
2.82M
      }
180
2.82M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
85.2k
    coef->MCU_ctr = 0;
183
85.2k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
78.8k
  cinfo->output_iMCU_row++;
186
78.8k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
75.9k
    start_iMCU_row(cinfo);
188
75.9k
    return JPEG_ROW_COMPLETED;
189
75.9k
  }
190
  /* Completed the scan */
191
2.90k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
2.90k
  return JPEG_SCAN_COMPLETED;
193
78.8k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
90
78.8k
{
91
78.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
78.8k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
78.8k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
78.8k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
78.8k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
78.8k
  _JSAMPARRAY output_ptr;
97
78.8k
  JDIMENSION start_col, output_col;
98
78.8k
  jpeg_component_info *compptr;
99
78.8k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
164k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
85.2k
       yoffset++) {
104
2.91M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
2.82M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
2.82M
      jzero_far((void *)coef->MCU_buffer[0],
108
2.82M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
2.82M
      if (!cinfo->entropy->insufficient_data)
110
2.82M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
2.82M
      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
2.82M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
2.82M
          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
2.82M
        blkn = 0;               /* index of current DCT block within MCU */
142
7.41M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
4.59M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
4.59M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
4.59M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
4.59M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
4.47M
                         compptr->MCU_width : compptr->last_col_width;
152
4.59M
          output_ptr = output_buf[compptr->component_index] +
153
4.59M
                       yoffset * compptr->_DCT_scaled_size;
154
4.59M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
4.59M
                      compptr->MCU_sample_width;
156
10.5M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
5.95M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
4.77M
                yoffset + yindex < compptr->last_row_height) {
159
4.77M
              output_col = start_col;
160
10.2M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
5.43M
                (*inverse_DCT) (cinfo, compptr,
165
5.43M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
5.43M
                                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
5.43M
                output_col += compptr->_DCT_scaled_size;
173
5.43M
              }
174
4.77M
            }
175
5.95M
            blkn += compptr->MCU_width;
176
5.95M
            output_ptr += compptr->_DCT_scaled_size;
177
5.95M
          }
178
4.59M
        }
179
2.82M
      }
180
2.82M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
85.2k
    coef->MCU_ctr = 0;
183
85.2k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
78.8k
  cinfo->output_iMCU_row++;
186
78.8k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
75.9k
    start_iMCU_row(cinfo);
188
75.9k
    return JPEG_ROW_COMPLETED;
189
75.9k
  }
190
  /* Completed the scan */
191
2.90k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
2.90k
  return JPEG_SCAN_COMPLETED;
193
78.8k
}
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
142k
{
219
142k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
142k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
142k
  int blkn, ci, xindex, yindex, yoffset;
222
142k
  JDIMENSION start_col;
223
142k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
142k
  JBLOCKROW buffer_ptr;
225
142k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
429k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
287k
    compptr = cinfo->cur_comp_info[ci];
230
287k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
287k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
287k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
287k
       (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
287k
  }
239
240
  /* Loop to process one whole iMCU row */
241
327k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
185k
       yoffset++) {
243
8.41M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
8.23M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
8.23M
      blkn = 0;                 /* index of current DCT block within MCU */
247
20.1M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
11.9M
        compptr = cinfo->cur_comp_info[ci];
249
11.9M
        start_col = MCU_col_num * compptr->MCU_width;
250
28.7M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
16.7M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
38.4M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
21.6M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
21.6M
          }
255
16.7M
        }
256
11.9M
      }
257
8.23M
      if (!cinfo->entropy->insufficient_data)
258
8.23M
        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
8.23M
      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
8.23M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
185k
    coef->MCU_ctr = 0;
282
185k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
142k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
131k
    start_iMCU_row(cinfo);
286
131k
    return JPEG_ROW_COMPLETED;
287
131k
  }
288
  /* Completed the scan */
289
10.7k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
10.7k
  return JPEG_SCAN_COMPLETED;
291
142k
}
jdcoefct-8.c:consume_data
Line
Count
Source
218
136k
{
219
136k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
136k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
136k
  int blkn, ci, xindex, yindex, yoffset;
222
136k
  JDIMENSION start_col;
223
136k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
136k
  JBLOCKROW buffer_ptr;
225
136k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
410k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
273k
    compptr = cinfo->cur_comp_info[ci];
230
273k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
273k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
273k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
273k
       (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
273k
  }
239
240
  /* Loop to process one whole iMCU row */
241
315k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
178k
       yoffset++) {
243
7.28M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
7.10M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
7.10M
      blkn = 0;                 /* index of current DCT block within MCU */
247
16.6M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
9.53M
        compptr = cinfo->cur_comp_info[ci];
249
9.53M
        start_col = MCU_col_num * compptr->MCU_width;
250
23.0M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
13.5M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
29.8M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
16.3M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
16.3M
          }
255
13.5M
        }
256
9.53M
      }
257
7.10M
      if (!cinfo->entropy->insufficient_data)
258
7.10M
        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
7.10M
      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
7.10M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
178k
    coef->MCU_ctr = 0;
282
178k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
136k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
127k
    start_iMCU_row(cinfo);
286
127k
    return JPEG_ROW_COMPLETED;
287
127k
  }
288
  /* Completed the scan */
289
9.02k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
9.02k
  return JPEG_SCAN_COMPLETED;
291
136k
}
jdcoefct-12.c:consume_data
Line
Count
Source
218
5.73k
{
219
5.73k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
5.73k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
5.73k
  int blkn, ci, xindex, yindex, yoffset;
222
5.73k
  JDIMENSION start_col;
223
5.73k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
5.73k
  JBLOCKROW buffer_ptr;
225
5.73k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
19.0k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
13.3k
    compptr = cinfo->cur_comp_info[ci];
230
13.3k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
13.3k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
13.3k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
13.3k
       (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
13.3k
  }
239
240
  /* Loop to process one whole iMCU row */
241
12.5k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
6.84k
       yoffset++) {
243
1.13M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
1.12M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
1.12M
      blkn = 0;                 /* index of current DCT block within MCU */
247
3.52M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
2.39M
        compptr = cinfo->cur_comp_info[ci];
249
2.39M
        start_col = MCU_col_num * compptr->MCU_width;
250
5.66M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
3.27M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
8.58M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
5.31M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
5.31M
          }
255
3.27M
        }
256
2.39M
      }
257
1.12M
      if (!cinfo->entropy->insufficient_data)
258
1.12M
        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.12M
      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.12M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
6.84k
    coef->MCU_ctr = 0;
282
6.84k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
5.73k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
4.02k
    start_iMCU_row(cinfo);
286
4.02k
    return JPEG_ROW_COMPLETED;
287
4.02k
  }
288
  /* Completed the scan */
289
1.70k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
1.70k
  return JPEG_SCAN_COMPLETED;
291
5.73k
}
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
16.6k
{
305
16.6k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
16.6k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
16.6k
  JDIMENSION block_num;
308
16.6k
  int ci, block_row, block_rows;
309
16.6k
  JBLOCKARRAY buffer;
310
16.6k
  JBLOCKROW buffer_ptr;
311
16.6k
  _JSAMPARRAY output_ptr;
312
16.6k
  JDIMENSION output_col;
313
16.6k
  jpeg_component_info *compptr;
314
16.6k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
16.6k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
16.6k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
16.6k
          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
65.9k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
49.3k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
49.3k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
49.3k
    buffer = (*cinfo->mem->access_virt_barray)
332
49.3k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
49.3k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
49.3k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
49.3k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
47.7k
      block_rows = compptr->v_samp_factor;
338
1.62k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.62k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.62k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.62k
    }
343
49.3k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
49.3k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
159k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
110k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
110k
      output_col = 0;
349
110k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
882k
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
772k
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
772k
                        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
772k
        buffer_ptr++;
361
772k
        output_col += compptr->_DCT_scaled_size;
362
772k
      }
363
110k
      output_ptr += compptr->_DCT_scaled_size;
364
110k
    }
365
49.3k
  }
366
367
16.6k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
16.1k
    return JPEG_ROW_COMPLETED;
369
546
  return JPEG_SCAN_COMPLETED;
370
16.6k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
304
16.6k
{
305
16.6k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
16.6k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
16.6k
  JDIMENSION block_num;
308
16.6k
  int ci, block_row, block_rows;
309
16.6k
  JBLOCKARRAY buffer;
310
16.6k
  JBLOCKROW buffer_ptr;
311
16.6k
  _JSAMPARRAY output_ptr;
312
16.6k
  JDIMENSION output_col;
313
16.6k
  jpeg_component_info *compptr;
314
16.6k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
16.6k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
16.6k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
16.6k
          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
65.9k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
49.3k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
49.3k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
49.3k
    buffer = (*cinfo->mem->access_virt_barray)
332
49.3k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
49.3k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
49.3k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
49.3k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
47.7k
      block_rows = compptr->v_samp_factor;
338
1.62k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.62k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.62k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.62k
    }
343
49.3k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
49.3k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
159k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
110k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
110k
      output_col = 0;
349
110k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
882k
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
772k
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
772k
                        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
772k
        buffer_ptr++;
361
772k
        output_col += compptr->_DCT_scaled_size;
362
772k
      }
363
110k
      output_ptr += compptr->_DCT_scaled_size;
364
110k
    }
365
49.3k
  }
366
367
16.6k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
16.1k
    return JPEG_ROW_COMPLETED;
369
546
  return JPEG_SCAN_COMPLETED;
370
16.6k
}
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
112k
#define Q01_POS  1
386
112k
#define Q10_POS  8
387
112k
#define Q20_POS  16
388
112k
#define Q11_POS  9
389
112k
#define Q02_POS  2
390
99.3k
#define Q03_POS  3
391
99.3k
#define Q12_POS  10
392
99.2k
#define Q21_POS  17
393
99.2k
#define Q30_POS  24
394
395
/*
396
 * Determine whether block smoothing is applicable and safe.
397
 * We also latch the current states of the coef_bits[] entries for the
398
 * AC coefficients; otherwise, if the input side of the decompressor
399
 * advances into a new scan, we might think the coefficients are known
400
 * more accurately than they really are.
401
 */
402
403
LOCAL(boolean)
404
smoothing_ok(j_decompress_ptr cinfo)
405
2.32k
{
406
2.32k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
2.32k
  boolean smoothing_useful = FALSE;
408
2.32k
  int ci, coefi;
409
2.32k
  jpeg_component_info *compptr;
410
2.32k
  JQUANT_TBL *qtable;
411
2.32k
  int *coef_bits, *prev_coef_bits;
412
2.32k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
2.32k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
0
    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.32k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
6.35k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
6.35k
    if ((qtable = compptr->quant_table) == NULL)
431
40
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
6.31k
    if (qtable->quantval[0] == 0 ||
434
6.28k
        qtable->quantval[Q01_POS] == 0 ||
435
6.27k
        qtable->quantval[Q10_POS] == 0 ||
436
6.20k
        qtable->quantval[Q20_POS] == 0 ||
437
6.15k
        qtable->quantval[Q11_POS] == 0 ||
438
6.12k
        qtable->quantval[Q02_POS] == 0 ||
439
6.10k
        qtable->quantval[Q03_POS] == 0 ||
440
6.08k
        qtable->quantval[Q12_POS] == 0 ||
441
6.05k
        qtable->quantval[Q21_POS] == 0 ||
442
6.02k
        qtable->quantval[Q30_POS] == 0)
443
313
      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
38.0k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
15.9k
      else
455
15.9k
        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
43.0k
        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.97k
  return smoothing_useful;
465
2.32k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
405
2.13k
{
406
2.13k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
2.13k
  boolean smoothing_useful = FALSE;
408
2.13k
  int ci, coefi;
409
2.13k
  jpeg_component_info *compptr;
410
2.13k
  JQUANT_TBL *qtable;
411
2.13k
  int *coef_bits, *prev_coef_bits;
412
2.13k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
2.13k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
0
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
2.13k
  if (coef->coef_bits_latch == NULL)
419
2.13k
    coef->coef_bits_latch = (int *)
420
2.13k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
2.13k
                                  cinfo->num_components * 2 *
422
2.13k
                                  (SAVED_COEFS * sizeof(int)));
423
2.13k
  coef_bits_latch = coef->coef_bits_latch;
424
2.13k
  prev_coef_bits_latch =
425
2.13k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
7.97k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
6.04k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
6.04k
    if ((qtable = compptr->quant_table) == NULL)
431
26
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
6.01k
    if (qtable->quantval[0] == 0 ||
434
5.99k
        qtable->quantval[Q01_POS] == 0 ||
435
5.99k
        qtable->quantval[Q10_POS] == 0 ||
436
5.98k
        qtable->quantval[Q20_POS] == 0 ||
437
5.93k
        qtable->quantval[Q11_POS] == 0 ||
438
5.91k
        qtable->quantval[Q02_POS] == 0 ||
439
5.90k
        qtable->quantval[Q03_POS] == 0 ||
440
5.89k
        qtable->quantval[Q12_POS] == 0 ||
441
5.88k
        qtable->quantval[Q21_POS] == 0 ||
442
5.86k
        qtable->quantval[Q30_POS] == 0)
443
170
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
5.84k
    coef_bits = cinfo->coef_bits[ci];
446
5.84k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
5.84k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
5.84k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
58.4k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
52.5k
      if (cinfo->input_scan_number > 1)
453
37.4k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
15.1k
      else
455
15.1k
        prev_coef_bits_latch[coefi] = -1;
456
52.5k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
52.5k
      if (coef_bits[coefi] != 0)
458
41.8k
        smoothing_useful = TRUE;
459
52.5k
    }
460
5.84k
    coef_bits_latch += SAVED_COEFS;
461
5.84k
    prev_coef_bits_latch += SAVED_COEFS;
462
5.84k
  }
463
464
1.93k
  return smoothing_useful;
465
2.13k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
405
191
{
406
191
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
191
  boolean smoothing_useful = FALSE;
408
191
  int ci, coefi;
409
191
  jpeg_component_info *compptr;
410
191
  JQUANT_TBL *qtable;
411
191
  int *coef_bits, *prev_coef_bits;
412
191
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
191
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
0
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
191
  if (coef->coef_bits_latch == NULL)
419
191
    coef->coef_bits_latch = (int *)
420
191
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
191
                                  cinfo->num_components * 2 *
422
191
                                  (SAVED_COEFS * sizeof(int)));
423
191
  coef_bits_latch = coef->coef_bits_latch;
424
191
  prev_coef_bits_latch =
425
191
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
345
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
311
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
311
    if ((qtable = compptr->quant_table) == NULL)
431
14
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
297
    if (qtable->quantval[0] == 0 ||
434
285
        qtable->quantval[Q01_POS] == 0 ||
435
279
        qtable->quantval[Q10_POS] == 0 ||
436
223
        qtable->quantval[Q20_POS] == 0 ||
437
217
        qtable->quantval[Q11_POS] == 0 ||
438
209
        qtable->quantval[Q02_POS] == 0 ||
439
202
        qtable->quantval[Q03_POS] == 0 ||
440
186
        qtable->quantval[Q12_POS] == 0 ||
441
175
        qtable->quantval[Q21_POS] == 0 ||
442
161
        qtable->quantval[Q30_POS] == 0)
443
143
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
154
    coef_bits = cinfo->coef_bits[ci];
446
154
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
154
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
154
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
1.54k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
1.38k
      if (cinfo->input_scan_number > 1)
453
621
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
765
      else
455
765
        prev_coef_bits_latch[coefi] = -1;
456
1.38k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
1.38k
      if (coef_bits[coefi] != 0)
458
1.15k
        smoothing_useful = TRUE;
459
1.38k
    }
460
154
    coef_bits_latch += SAVED_COEFS;
461
154
    prev_coef_bits_latch += SAVED_COEFS;
462
154
  }
463
464
34
  return smoothing_useful;
465
191
}
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
35.3k
{
475
35.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
35.3k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
35.3k
  JDIMENSION block_num, last_block_column;
478
35.3k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
35.3k
    image_block_rows;
480
35.3k
  JBLOCKARRAY buffer;
481
35.3k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
35.3k
  JBLOCKROW next_block_row, next_next_block_row;
483
35.3k
  _JSAMPARRAY output_ptr;
484
35.3k
  JDIMENSION output_col;
485
35.3k
  jpeg_component_info *compptr;
486
35.3k
  _inverse_DCT_method_ptr inverse_DCT;
487
35.3k
  boolean change_dc;
488
35.3k
  JCOEF *workspace;
489
35.3k
  int *coef_bits;
490
35.3k
  JQUANT_TBL *quanttbl;
491
35.3k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
35.3k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
35.3k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
35.3k
      DC25;
495
35.3k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
35.3k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
35.3k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
35.3k
         !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
141k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
105k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
105k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
105k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
97.2k
      block_rows = compptr->v_samp_factor;
526
97.2k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
97.2k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
3.94k
      block_rows = compptr->v_samp_factor;
529
3.94k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
4.75k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
4.75k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
4.75k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
4.75k
      access_rows = block_rows; /* this iMCU row only */
535
4.75k
    }
536
    /* Align the virtual buffer for this component. */
537
105k
    if (cinfo->output_iMCU_row > 1) {
538
97.2k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
97.2k
      buffer = (*cinfo->mem->access_virt_barray)
540
97.2k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
97.2k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
97.2k
         (JDIMENSION)access_rows, FALSE);
543
97.2k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
97.2k
    } else if (cinfo->output_iMCU_row > 0) {
545
3.94k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
3.94k
      buffer = (*cinfo->mem->access_virt_barray)
547
3.94k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
3.94k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
3.94k
         (JDIMENSION)access_rows, FALSE);
550
3.94k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
4.75k
    } else {
552
4.75k
      buffer = (*cinfo->mem->access_virt_barray)
553
4.75k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
4.75k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
4.75k
    }
556
    /* Fetch component-dependent info.
557
     * If the current scan is incomplete, then we use the component-dependent
558
     * info from the previous scan.
559
     */
560
105k
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
561
0
      coef_bits =
562
0
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
563
105k
    else
564
105k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
105k
    change_dc =
568
105k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
97.6k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
94.2k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
105k
    quanttbl = compptr->quant_table;
573
105k
    Q00 = quanttbl->quantval[0];
574
105k
    Q01 = quanttbl->quantval[Q01_POS];
575
105k
    Q10 = quanttbl->quantval[Q10_POS];
576
105k
    Q20 = quanttbl->quantval[Q20_POS];
577
105k
    Q11 = quanttbl->quantval[Q11_POS];
578
105k
    Q02 = quanttbl->quantval[Q02_POS];
579
105k
    if (change_dc) {
580
93.2k
      Q03 = quanttbl->quantval[Q03_POS];
581
93.2k
      Q12 = quanttbl->quantval[Q12_POS];
582
93.2k
      Q21 = quanttbl->quantval[Q21_POS];
583
93.2k
      Q30 = quanttbl->quantval[Q30_POS];
584
93.2k
    }
585
105k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
105k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
105k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
359k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
253k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
253k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
253k
      if (image_block_row > 0)
594
248k
        prev_block_row =
595
248k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
4.75k
      else
597
4.75k
        prev_block_row = buffer_ptr;
598
599
253k
      if (image_block_row > 1)
600
244k
        prev_prev_block_row =
601
244k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
9.01k
      else
603
9.01k
        prev_prev_block_row = prev_block_row;
604
605
253k
      if (image_block_row < image_block_rows - 1)
606
248k
        next_block_row =
607
248k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
4.75k
      else
609
4.75k
        next_block_row = buffer_ptr;
610
611
253k
      if (image_block_row < image_block_rows - 2)
612
245k
        next_next_block_row =
613
245k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
8.10k
      else
615
8.10k
        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
253k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
253k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
253k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
253k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
253k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
253k
      output_col = 0;
626
253k
      last_block_column = compptr->width_in_blocks - 1;
627
253k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
4.59M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
4.34M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
4.34M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
253k
            block_num < last_block_column) {
634
89.3k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
89.3k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
89.3k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
89.3k
          DC19 = DC20 = (int)next_block_row[1][0];
638
89.3k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
89.3k
        }
640
4.34M
        if (block_num + 1 < last_block_column) {
641
3.99M
          DC05 = (int)prev_prev_block_row[2][0];
642
3.99M
          DC10 = (int)prev_block_row[2][0];
643
3.99M
          DC15 = (int)buffer_ptr[2][0];
644
3.99M
          DC20 = (int)next_block_row[2][0];
645
3.99M
          DC25 = (int)next_next_block_row[2][0];
646
3.99M
        }
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.34M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
3.96M
          num = Q00 * (change_dc ?
660
3.34M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
3.34M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
3.34M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
3.34M
                 DC21 - DC22 + DC24 + DC25) :
664
3.96M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
3.96M
          if (num >= 0) {
666
2.59M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
2.59M
            if (Al > 0 && pred >= (1 << Al))
668
13.8k
              pred = (1 << Al) - 1;
669
2.59M
          } else {
670
1.36M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
1.36M
            if (Al > 0 && pred >= (1 << Al))
672
13.2k
              pred = (1 << Al) - 1;
673
1.36M
            pred = -pred;
674
1.36M
          }
675
3.96M
          workspace[1] = (JCOEF)pred;
676
3.96M
        }
677
        /* AC10 */
678
4.34M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
3.90M
          num = Q00 * (change_dc ?
680
3.34M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
3.34M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
3.34M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
3.34M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
3.90M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
3.90M
          if (num >= 0) {
686
2.97M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
2.97M
            if (Al > 0 && pred >= (1 << Al))
688
25.7k
              pred = (1 << Al) - 1;
689
2.97M
          } else {
690
927k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
927k
            if (Al > 0 && pred >= (1 << Al))
692
33.8k
              pred = (1 << Al) - 1;
693
927k
            pred = -pred;
694
927k
          }
695
3.90M
          workspace[8] = (JCOEF)pred;
696
3.90M
        }
697
        /* AC20 */
698
4.34M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
3.91M
          num = Q00 * (change_dc ?
700
3.34M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
3.34M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
3.91M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
3.91M
          if (num >= 0) {
704
2.67M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
2.67M
            if (Al > 0 && pred >= (1 << Al))
706
15.9k
              pred = (1 << Al) - 1;
707
2.67M
          } else {
708
1.23M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
1.23M
            if (Al > 0 && pred >= (1 << Al))
710
15.6k
              pred = (1 << Al) - 1;
711
1.23M
            pred = -pred;
712
1.23M
          }
713
3.91M
          workspace[16] = (JCOEF)pred;
714
3.91M
        }
715
        /* AC11 */
716
4.34M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
3.87M
          num = Q00 * (change_dc ?
718
3.34M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
3.34M
                 9 * DC19 + DC21 - DC25) :
720
3.87M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
530k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
3.87M
          if (num >= 0) {
723
3.07M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
3.07M
            if (Al > 0 && pred >= (1 << Al))
725
11.2k
              pred = (1 << Al) - 1;
726
3.07M
          } else {
727
798k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
798k
            if (Al > 0 && pred >= (1 << Al))
729
11.1k
              pred = (1 << Al) - 1;
730
798k
            pred = -pred;
731
798k
          }
732
3.87M
          workspace[9] = (JCOEF)pred;
733
3.87M
        }
734
        /* AC02 */
735
4.34M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
3.93M
          num = Q00 * (change_dc ?
737
3.34M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
3.34M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
3.93M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
3.93M
          if (num >= 0) {
741
2.65M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
2.65M
            if (Al > 0 && pred >= (1 << Al))
743
20.6k
              pred = (1 << Al) - 1;
744
2.65M
          } else {
745
1.28M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
1.28M
            if (Al > 0 && pred >= (1 << Al))
747
20.9k
              pred = (1 << Al) - 1;
748
1.28M
            pred = -pred;
749
1.28M
          }
750
3.93M
          workspace[2] = (JCOEF)pred;
751
3.93M
        }
752
4.34M
        if (change_dc) {
753
          /* AC03 */
754
3.34M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
3.34M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
3.34M
            if (num >= 0) {
757
2.28M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
2.28M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
2.28M
            } else {
761
1.05M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
1.05M
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
1.05M
              pred = -pred;
765
1.05M
            }
766
3.34M
            workspace[3] = (JCOEF)pred;
767
3.34M
          }
768
          /* AC12 */
769
3.34M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
3.34M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
3.34M
            if (num >= 0) {
772
2.45M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
2.45M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
2.45M
            } else {
776
895k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
895k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
895k
              pred = -pred;
780
895k
            }
781
3.34M
            workspace[10] = (JCOEF)pred;
782
3.34M
          }
783
          /* AC21 */
784
3.34M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
3.34M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
3.34M
            if (num >= 0) {
787
2.08M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
2.08M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
2.08M
            } else {
791
1.26M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
1.26M
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
1.26M
              pred = -pred;
795
1.26M
            }
796
3.34M
            workspace[17] = (JCOEF)pred;
797
3.34M
          }
798
          /* AC30 */
799
3.34M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
3.34M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
3.34M
            if (num >= 0) {
802
2.69M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
2.69M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
2.69M
            } else {
806
649k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
649k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
649k
              pred = -pred;
810
649k
            }
811
3.34M
            workspace[24] = (JCOEF)pred;
812
3.34M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
3.34M
          num = Q00 *
817
3.34M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
3.34M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
3.34M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
3.34M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
3.34M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
3.34M
          if (num >= 0) {
823
1.50M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
1.84M
          } else {
825
1.84M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
1.84M
            pred = -pred;
827
1.84M
          }
828
3.34M
          workspace[0] = (JCOEF)pred;
829
3.34M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
4.34M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
4.34M
                        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.34M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
4.34M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
4.34M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
4.34M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
4.34M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
4.34M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
4.34M
          prev_prev_block_row++, next_next_block_row++;
849
4.34M
        output_col += compptr->_DCT_scaled_size;
850
4.34M
      }
851
253k
      output_ptr += compptr->_DCT_scaled_size;
852
253k
    }
853
105k
  }
854
855
35.3k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
33.7k
    return JPEG_ROW_COMPLETED;
857
1.58k
  return JPEG_SCAN_COMPLETED;
858
35.3k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
474
35.3k
{
475
35.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
35.3k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
35.3k
  JDIMENSION block_num, last_block_column;
478
35.3k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
35.3k
    image_block_rows;
480
35.3k
  JBLOCKARRAY buffer;
481
35.3k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
35.3k
  JBLOCKROW next_block_row, next_next_block_row;
483
35.3k
  _JSAMPARRAY output_ptr;
484
35.3k
  JDIMENSION output_col;
485
35.3k
  jpeg_component_info *compptr;
486
35.3k
  _inverse_DCT_method_ptr inverse_DCT;
487
35.3k
  boolean change_dc;
488
35.3k
  JCOEF *workspace;
489
35.3k
  int *coef_bits;
490
35.3k
  JQUANT_TBL *quanttbl;
491
35.3k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
35.3k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
35.3k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
35.3k
      DC25;
495
35.3k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
35.3k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
35.3k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
35.3k
         !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
141k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
105k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
105k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
105k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
97.2k
      block_rows = compptr->v_samp_factor;
526
97.2k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
97.2k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
3.94k
      block_rows = compptr->v_samp_factor;
529
3.94k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
4.75k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
4.75k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
4.75k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
4.75k
      access_rows = block_rows; /* this iMCU row only */
535
4.75k
    }
536
    /* Align the virtual buffer for this component. */
537
105k
    if (cinfo->output_iMCU_row > 1) {
538
97.2k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
97.2k
      buffer = (*cinfo->mem->access_virt_barray)
540
97.2k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
97.2k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
97.2k
         (JDIMENSION)access_rows, FALSE);
543
97.2k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
97.2k
    } else if (cinfo->output_iMCU_row > 0) {
545
3.94k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
3.94k
      buffer = (*cinfo->mem->access_virt_barray)
547
3.94k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
3.94k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
3.94k
         (JDIMENSION)access_rows, FALSE);
550
3.94k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
4.75k
    } else {
552
4.75k
      buffer = (*cinfo->mem->access_virt_barray)
553
4.75k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
4.75k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
4.75k
    }
556
    /* Fetch component-dependent info.
557
     * If the current scan is incomplete, then we use the component-dependent
558
     * info from the previous scan.
559
     */
560
105k
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
561
0
      coef_bits =
562
0
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
563
105k
    else
564
105k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
105k
    change_dc =
568
105k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
97.6k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
94.2k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
105k
    quanttbl = compptr->quant_table;
573
105k
    Q00 = quanttbl->quantval[0];
574
105k
    Q01 = quanttbl->quantval[Q01_POS];
575
105k
    Q10 = quanttbl->quantval[Q10_POS];
576
105k
    Q20 = quanttbl->quantval[Q20_POS];
577
105k
    Q11 = quanttbl->quantval[Q11_POS];
578
105k
    Q02 = quanttbl->quantval[Q02_POS];
579
105k
    if (change_dc) {
580
93.2k
      Q03 = quanttbl->quantval[Q03_POS];
581
93.2k
      Q12 = quanttbl->quantval[Q12_POS];
582
93.2k
      Q21 = quanttbl->quantval[Q21_POS];
583
93.2k
      Q30 = quanttbl->quantval[Q30_POS];
584
93.2k
    }
585
105k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
105k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
105k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
359k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
253k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
253k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
253k
      if (image_block_row > 0)
594
248k
        prev_block_row =
595
248k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
4.75k
      else
597
4.75k
        prev_block_row = buffer_ptr;
598
599
253k
      if (image_block_row > 1)
600
244k
        prev_prev_block_row =
601
244k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
9.01k
      else
603
9.01k
        prev_prev_block_row = prev_block_row;
604
605
253k
      if (image_block_row < image_block_rows - 1)
606
248k
        next_block_row =
607
248k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
4.75k
      else
609
4.75k
        next_block_row = buffer_ptr;
610
611
253k
      if (image_block_row < image_block_rows - 2)
612
245k
        next_next_block_row =
613
245k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
8.10k
      else
615
8.10k
        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
253k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
253k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
253k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
253k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
253k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
253k
      output_col = 0;
626
253k
      last_block_column = compptr->width_in_blocks - 1;
627
253k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
4.59M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
4.34M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
4.34M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
253k
            block_num < last_block_column) {
634
89.3k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
89.3k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
89.3k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
89.3k
          DC19 = DC20 = (int)next_block_row[1][0];
638
89.3k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
89.3k
        }
640
4.34M
        if (block_num + 1 < last_block_column) {
641
3.99M
          DC05 = (int)prev_prev_block_row[2][0];
642
3.99M
          DC10 = (int)prev_block_row[2][0];
643
3.99M
          DC15 = (int)buffer_ptr[2][0];
644
3.99M
          DC20 = (int)next_block_row[2][0];
645
3.99M
          DC25 = (int)next_next_block_row[2][0];
646
3.99M
        }
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.34M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
3.96M
          num = Q00 * (change_dc ?
660
3.34M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
3.34M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
3.34M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
3.34M
                 DC21 - DC22 + DC24 + DC25) :
664
3.96M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
3.96M
          if (num >= 0) {
666
2.59M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
2.59M
            if (Al > 0 && pred >= (1 << Al))
668
13.8k
              pred = (1 << Al) - 1;
669
2.59M
          } else {
670
1.36M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
1.36M
            if (Al > 0 && pred >= (1 << Al))
672
13.2k
              pred = (1 << Al) - 1;
673
1.36M
            pred = -pred;
674
1.36M
          }
675
3.96M
          workspace[1] = (JCOEF)pred;
676
3.96M
        }
677
        /* AC10 */
678
4.34M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
3.90M
          num = Q00 * (change_dc ?
680
3.34M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
3.34M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
3.34M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
3.34M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
3.90M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
3.90M
          if (num >= 0) {
686
2.97M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
2.97M
            if (Al > 0 && pred >= (1 << Al))
688
25.7k
              pred = (1 << Al) - 1;
689
2.97M
          } else {
690
927k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
927k
            if (Al > 0 && pred >= (1 << Al))
692
33.8k
              pred = (1 << Al) - 1;
693
927k
            pred = -pred;
694
927k
          }
695
3.90M
          workspace[8] = (JCOEF)pred;
696
3.90M
        }
697
        /* AC20 */
698
4.34M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
3.91M
          num = Q00 * (change_dc ?
700
3.34M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
3.34M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
3.91M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
3.91M
          if (num >= 0) {
704
2.67M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
2.67M
            if (Al > 0 && pred >= (1 << Al))
706
15.9k
              pred = (1 << Al) - 1;
707
2.67M
          } else {
708
1.23M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
1.23M
            if (Al > 0 && pred >= (1 << Al))
710
15.6k
              pred = (1 << Al) - 1;
711
1.23M
            pred = -pred;
712
1.23M
          }
713
3.91M
          workspace[16] = (JCOEF)pred;
714
3.91M
        }
715
        /* AC11 */
716
4.34M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
3.87M
          num = Q00 * (change_dc ?
718
3.34M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
3.34M
                 9 * DC19 + DC21 - DC25) :
720
3.87M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
530k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
3.87M
          if (num >= 0) {
723
3.07M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
3.07M
            if (Al > 0 && pred >= (1 << Al))
725
11.2k
              pred = (1 << Al) - 1;
726
3.07M
          } else {
727
798k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
798k
            if (Al > 0 && pred >= (1 << Al))
729
11.1k
              pred = (1 << Al) - 1;
730
798k
            pred = -pred;
731
798k
          }
732
3.87M
          workspace[9] = (JCOEF)pred;
733
3.87M
        }
734
        /* AC02 */
735
4.34M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
3.93M
          num = Q00 * (change_dc ?
737
3.34M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
3.34M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
3.93M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
3.93M
          if (num >= 0) {
741
2.65M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
2.65M
            if (Al > 0 && pred >= (1 << Al))
743
20.6k
              pred = (1 << Al) - 1;
744
2.65M
          } else {
745
1.28M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
1.28M
            if (Al > 0 && pred >= (1 << Al))
747
20.9k
              pred = (1 << Al) - 1;
748
1.28M
            pred = -pred;
749
1.28M
          }
750
3.93M
          workspace[2] = (JCOEF)pred;
751
3.93M
        }
752
4.34M
        if (change_dc) {
753
          /* AC03 */
754
3.34M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
3.34M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
3.34M
            if (num >= 0) {
757
2.28M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
2.28M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
2.28M
            } else {
761
1.05M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
1.05M
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
1.05M
              pred = -pred;
765
1.05M
            }
766
3.34M
            workspace[3] = (JCOEF)pred;
767
3.34M
          }
768
          /* AC12 */
769
3.34M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
3.34M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
3.34M
            if (num >= 0) {
772
2.45M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
2.45M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
2.45M
            } else {
776
895k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
895k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
895k
              pred = -pred;
780
895k
            }
781
3.34M
            workspace[10] = (JCOEF)pred;
782
3.34M
          }
783
          /* AC21 */
784
3.34M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
3.34M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
3.34M
            if (num >= 0) {
787
2.08M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
2.08M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
2.08M
            } else {
791
1.26M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
1.26M
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
1.26M
              pred = -pred;
795
1.26M
            }
796
3.34M
            workspace[17] = (JCOEF)pred;
797
3.34M
          }
798
          /* AC30 */
799
3.34M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
3.34M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
3.34M
            if (num >= 0) {
802
2.69M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
2.69M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
2.69M
            } else {
806
649k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
649k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
649k
              pred = -pred;
810
649k
            }
811
3.34M
            workspace[24] = (JCOEF)pred;
812
3.34M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
3.34M
          num = Q00 *
817
3.34M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
3.34M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
3.34M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
3.34M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
3.34M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
3.34M
          if (num >= 0) {
823
1.50M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
1.84M
          } else {
825
1.84M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
1.84M
            pred = -pred;
827
1.84M
          }
828
3.34M
          workspace[0] = (JCOEF)pred;
829
3.34M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
4.34M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
4.34M
                        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.34M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
4.34M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
4.34M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
4.34M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
4.34M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
4.34M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
4.34M
          prev_prev_block_row++, next_next_block_row++;
849
4.34M
        output_col += compptr->_DCT_scaled_size;
850
4.34M
      }
851
253k
      output_ptr += compptr->_DCT_scaled_size;
852
253k
    }
853
105k
  }
854
855
35.3k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
33.7k
    return JPEG_ROW_COMPLETED;
857
1.58k
  return JPEG_SCAN_COMPLETED;
858
35.3k
}
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
6.44k
{
870
6.44k
  my_coef_ptr coef;
871
872
6.44k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
6.44k
  coef = (my_coef_ptr)
876
6.44k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
6.44k
                                sizeof(my_coef_controller));
878
6.44k
  memset(coef, 0, sizeof(my_coef_controller));
879
6.44k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
6.44k
  coef->pub.start_input_pass = start_input_pass;
881
6.44k
  coef->pub.start_output_pass = start_output_pass;
882
6.44k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
6.44k
  coef->coef_bits_latch = NULL;
884
6.44k
#endif
885
886
  /* Create the coefficient buffer. */
887
6.44k
  if (need_full_buffer) {
888
3.39k
#ifdef D_MULTISCAN_FILES_SUPPORTED
889
    /* Allocate a full-image virtual array for each component, */
890
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
891
    /* Note we ask for a pre-zeroed array. */
892
3.39k
    int ci, access_rows;
893
3.39k
    jpeg_component_info *compptr;
894
895
13.4k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
10.0k
         ci++, compptr++) {
897
10.0k
      access_rows = compptr->v_samp_factor;
898
10.0k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
10.0k
      if (cinfo->progressive_mode)
901
10.0k
        access_rows *= 5;
902
10.0k
#endif
903
10.0k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
10.0k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
10.0k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
10.0k
                               (long)compptr->h_samp_factor),
907
10.0k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
10.0k
                               (long)compptr->v_samp_factor),
909
10.0k
         (JDIMENSION)access_rows);
910
10.0k
    }
911
3.39k
    coef->pub.consume_data = consume_data;
912
3.39k
    coef->pub._decompress_data = decompress_data;
913
3.39k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
3.39k
  } else {
918
    /* We only need a single-MCU buffer. */
919
3.05k
    JBLOCKROW buffer;
920
3.05k
    int i;
921
922
3.05k
    buffer = (JBLOCKROW)
923
3.05k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
3.05k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
33.6k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
30.5k
      coef->MCU_buffer[i] = buffer + i;
927
30.5k
    }
928
3.05k
    coef->pub.consume_data = dummy_consume_data;
929
3.05k
    coef->pub._decompress_data = decompress_onepass;
930
3.05k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
3.05k
  }
932
933
  /* Allocate the workspace buffer */
934
6.44k
  coef->workspace = (JCOEF *)
935
6.44k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
6.44k
                                sizeof(JCOEF) * DCTSIZE2);
937
6.44k
}
jinit_d_coef_controller
Line
Count
Source
869
5.85k
{
870
5.85k
  my_coef_ptr coef;
871
872
5.85k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
5.85k
  coef = (my_coef_ptr)
876
5.85k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
5.85k
                                sizeof(my_coef_controller));
878
5.85k
  memset(coef, 0, sizeof(my_coef_controller));
879
5.85k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
5.85k
  coef->pub.start_input_pass = start_input_pass;
881
5.85k
  coef->pub.start_output_pass = start_output_pass;
882
5.85k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
5.85k
  coef->coef_bits_latch = NULL;
884
5.85k
#endif
885
886
  /* Create the coefficient buffer. */
887
5.85k
  if (need_full_buffer) {
888
2.84k
#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.84k
    int ci, access_rows;
893
2.84k
    jpeg_component_info *compptr;
894
895
11.2k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
8.44k
         ci++, compptr++) {
897
8.44k
      access_rows = compptr->v_samp_factor;
898
8.44k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
8.44k
      if (cinfo->progressive_mode)
901
8.40k
        access_rows *= 5;
902
8.44k
#endif
903
8.44k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
8.44k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
8.44k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
8.44k
                               (long)compptr->h_samp_factor),
907
8.44k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
8.44k
                               (long)compptr->v_samp_factor),
909
8.44k
         (JDIMENSION)access_rows);
910
8.44k
    }
911
2.84k
    coef->pub.consume_data = consume_data;
912
2.84k
    coef->pub._decompress_data = decompress_data;
913
2.84k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
3.00k
  } else {
918
    /* We only need a single-MCU buffer. */
919
3.00k
    JBLOCKROW buffer;
920
3.00k
    int i;
921
922
3.00k
    buffer = (JBLOCKROW)
923
3.00k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
3.00k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
33.0k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
30.0k
      coef->MCU_buffer[i] = buffer + i;
927
30.0k
    }
928
3.00k
    coef->pub.consume_data = dummy_consume_data;
929
3.00k
    coef->pub._decompress_data = decompress_onepass;
930
3.00k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
3.00k
  }
932
933
  /* Allocate the workspace buffer */
934
5.85k
  coef->workspace = (JCOEF *)
935
5.85k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
5.85k
                                sizeof(JCOEF) * DCTSIZE2);
937
5.85k
}
j12init_d_coef_controller
Line
Count
Source
869
594
{
870
594
  my_coef_ptr coef;
871
872
594
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
594
  coef = (my_coef_ptr)
876
594
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
594
                                sizeof(my_coef_controller));
878
594
  memset(coef, 0, sizeof(my_coef_controller));
879
594
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
594
  coef->pub.start_input_pass = start_input_pass;
881
594
  coef->pub.start_output_pass = start_output_pass;
882
594
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
594
  coef->coef_bits_latch = NULL;
884
594
#endif
885
886
  /* Create the coefficient buffer. */
887
594
  if (need_full_buffer) {
888
541
#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
541
    int ci, access_rows;
893
541
    jpeg_component_info *compptr;
894
895
2.16k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
1.62k
         ci++, compptr++) {
897
1.62k
      access_rows = compptr->v_samp_factor;
898
1.62k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
1.62k
      if (cinfo->progressive_mode)
901
1.60k
        access_rows *= 5;
902
1.62k
#endif
903
1.62k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
1.62k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
1.62k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
1.62k
                               (long)compptr->h_samp_factor),
907
1.62k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
1.62k
                               (long)compptr->v_samp_factor),
909
1.62k
         (JDIMENSION)access_rows);
910
1.62k
    }
911
541
    coef->pub.consume_data = consume_data;
912
541
    coef->pub._decompress_data = decompress_data;
913
541
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
541
  } else {
918
    /* We only need a single-MCU buffer. */
919
53
    JBLOCKROW buffer;
920
53
    int i;
921
922
53
    buffer = (JBLOCKROW)
923
53
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
53
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
583
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
530
      coef->MCU_buffer[i] = buffer + i;
927
530
    }
928
53
    coef->pub.consume_data = dummy_consume_data;
929
53
    coef->pub._decompress_data = decompress_onepass;
930
53
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
53
  }
932
933
  /* Allocate the workspace buffer */
934
594
  coef->workspace = (JCOEF *)
935
594
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
594
                                sizeof(JCOEF) * DCTSIZE2);
937
594
}