Coverage Report

Created: 2026-06-09 06:59

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
11.1k
{
51
11.1k
  cinfo->input_iMCU_row = 0;
52
11.1k
  start_iMCU_row(cinfo);
53
11.1k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
50
10.0k
{
51
10.0k
  cinfo->input_iMCU_row = 0;
52
10.0k
  start_iMCU_row(cinfo);
53
10.0k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
50
1.04k
{
51
1.04k
  cinfo->input_iMCU_row = 0;
52
1.04k
  start_iMCU_row(cinfo);
53
1.04k
}
54
55
56
/*
57
 * Initialize for an output processing pass.
58
 */
59
60
METHODDEF(void)
61
start_output_pass(j_decompress_ptr cinfo)
62
3.35k
{
63
3.35k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
3.35k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
65
66
  /* If multipass, check to see whether to use block smoothing on this pass */
67
3.35k
  if (coef->pub.coef_arrays != NULL) {
68
1.66k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
997
      coef->pub._decompress_data = decompress_smooth_data;
70
671
    else
71
671
      coef->pub._decompress_data = decompress_data;
72
1.66k
  }
73
3.35k
#endif
74
3.35k
  cinfo->output_iMCU_row = 0;
75
3.35k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
62
3.21k
{
63
3.21k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
3.21k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
65
66
  /* If multipass, check to see whether to use block smoothing on this pass */
67
3.21k
  if (coef->pub.coef_arrays != NULL) {
68
1.54k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
981
      coef->pub._decompress_data = decompress_smooth_data;
70
564
    else
71
564
      coef->pub._decompress_data = decompress_data;
72
1.54k
  }
73
3.21k
#endif
74
3.21k
  cinfo->output_iMCU_row = 0;
75
3.21k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
62
131
{
63
131
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
131
  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
131
  if (coef->pub.coef_arrays != NULL) {
68
123
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
16
      coef->pub._decompress_data = decompress_smooth_data;
70
107
    else
71
107
      coef->pub._decompress_data = decompress_data;
72
123
  }
73
131
#endif
74
131
  cinfo->output_iMCU_row = 0;
75
131
}
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
22.9k
{
91
22.9k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
22.9k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
22.9k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
22.9k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
22.9k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
22.9k
  _JSAMPARRAY output_ptr;
97
22.9k
  JDIMENSION start_col, output_col;
98
22.9k
  jpeg_component_info *compptr;
99
22.9k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
49.1k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
26.2k
       yoffset++) {
104
1.86M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
1.83M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
1.83M
      jzero_far((void *)coef->MCU_buffer[0],
108
1.83M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
1.83M
      if (!cinfo->entropy->insufficient_data)
110
1.83M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
1.83M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
115
        /* Suspension forced; update state counters and exit */
116
0
        coef->MCU_vert_offset = yoffset;
117
0
        coef->MCU_ctr = MCU_col_num;
118
#ifdef WITH_PROFILE
119
        cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
120
        cinfo->master->entropy_mcoeffs +=
121
          (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
122
#endif
123
0
        return JPEG_SUSPENDED;
124
0
      }
125
#ifdef WITH_PROFILE
126
      cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
127
      cinfo->master->entropy_mcoeffs +=
128
        (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
129
#endif
130
131
      /* Only perform the IDCT on blocks that are contained within the desired
132
       * cropping region.
133
       */
134
1.83M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
1.83M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
136
        /* Determine where data should go in output_buf and do the IDCT thing.
137
         * We skip dummy blocks at the right and bottom edges (but blkn gets
138
         * incremented past them!).  Note the inner loop relies on having
139
         * allocated the MCU_buffer[] blocks sequentially.
140
         */
141
1.83M
        blkn = 0;               /* index of current DCT block within MCU */
142
5.53M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
3.69M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
3.69M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
3.69M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
3.69M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
3.65M
                         compptr->MCU_width : compptr->last_col_width;
152
3.69M
          output_ptr = output_buf[compptr->component_index] +
153
3.69M
                       yoffset * compptr->_DCT_scaled_size;
154
3.69M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
3.69M
                      compptr->MCU_sample_width;
156
7.57M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
3.87M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
3.74M
                yoffset + yindex < compptr->last_row_height) {
159
3.74M
              output_col = start_col;
160
7.57M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
3.82M
                (*inverse_DCT) (cinfo, compptr,
165
3.82M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
3.82M
                                output_ptr, output_col);
167
#ifdef WITH_PROFILE
168
                cinfo->master->idct_elapsed +=
169
                  getTime() - cinfo->master->start;
170
                cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
171
#endif
172
3.82M
                output_col += compptr->_DCT_scaled_size;
173
3.82M
              }
174
3.74M
            }
175
3.87M
            blkn += compptr->MCU_width;
176
3.87M
            output_ptr += compptr->_DCT_scaled_size;
177
3.87M
          }
178
3.69M
        }
179
1.83M
      }
180
1.83M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
26.2k
    coef->MCU_ctr = 0;
183
26.2k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
22.9k
  cinfo->output_iMCU_row++;
186
22.9k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
21.2k
    start_iMCU_row(cinfo);
188
21.2k
    return JPEG_ROW_COMPLETED;
189
21.2k
  }
190
  /* Completed the scan */
191
1.67k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
1.67k
  return JPEG_SCAN_COMPLETED;
193
22.9k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
90
22.9k
{
91
22.9k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
22.9k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
22.9k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
22.9k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
22.9k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
22.9k
  _JSAMPARRAY output_ptr;
97
22.9k
  JDIMENSION start_col, output_col;
98
22.9k
  jpeg_component_info *compptr;
99
22.9k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
49.1k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
26.2k
       yoffset++) {
104
1.86M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
1.83M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
1.83M
      jzero_far((void *)coef->MCU_buffer[0],
108
1.83M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
1.83M
      if (!cinfo->entropy->insufficient_data)
110
1.83M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
1.83M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
115
        /* Suspension forced; update state counters and exit */
116
0
        coef->MCU_vert_offset = yoffset;
117
0
        coef->MCU_ctr = MCU_col_num;
118
#ifdef WITH_PROFILE
119
        cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
120
        cinfo->master->entropy_mcoeffs +=
121
          (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
122
#endif
123
0
        return JPEG_SUSPENDED;
124
0
      }
125
#ifdef WITH_PROFILE
126
      cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
127
      cinfo->master->entropy_mcoeffs +=
128
        (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
129
#endif
130
131
      /* Only perform the IDCT on blocks that are contained within the desired
132
       * cropping region.
133
       */
134
1.83M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
1.83M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
136
        /* Determine where data should go in output_buf and do the IDCT thing.
137
         * We skip dummy blocks at the right and bottom edges (but blkn gets
138
         * incremented past them!).  Note the inner loop relies on having
139
         * allocated the MCU_buffer[] blocks sequentially.
140
         */
141
1.83M
        blkn = 0;               /* index of current DCT block within MCU */
142
5.53M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
3.69M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
3.69M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
3.69M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
3.69M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
3.65M
                         compptr->MCU_width : compptr->last_col_width;
152
3.69M
          output_ptr = output_buf[compptr->component_index] +
153
3.69M
                       yoffset * compptr->_DCT_scaled_size;
154
3.69M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
3.69M
                      compptr->MCU_sample_width;
156
7.57M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
3.87M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
3.74M
                yoffset + yindex < compptr->last_row_height) {
159
3.74M
              output_col = start_col;
160
7.57M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
3.82M
                (*inverse_DCT) (cinfo, compptr,
165
3.82M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
3.82M
                                output_ptr, output_col);
167
#ifdef WITH_PROFILE
168
                cinfo->master->idct_elapsed +=
169
                  getTime() - cinfo->master->start;
170
                cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
171
#endif
172
3.82M
                output_col += compptr->_DCT_scaled_size;
173
3.82M
              }
174
3.74M
            }
175
3.87M
            blkn += compptr->MCU_width;
176
3.87M
            output_ptr += compptr->_DCT_scaled_size;
177
3.87M
          }
178
3.69M
        }
179
1.83M
      }
180
1.83M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
26.2k
    coef->MCU_ctr = 0;
183
26.2k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
22.9k
  cinfo->output_iMCU_row++;
186
22.9k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
21.2k
    start_iMCU_row(cinfo);
188
21.2k
    return JPEG_ROW_COMPLETED;
189
21.2k
  }
190
  /* Completed the scan */
191
1.67k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
1.67k
  return JPEG_SCAN_COMPLETED;
193
22.9k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_onepass
194
195
196
/*
197
 * Dummy consume-input routine for single-pass operation.
198
 */
199
200
METHODDEF(int)
201
dummy_consume_data(j_decompress_ptr cinfo)
202
0
{
203
0
  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
204
0
}
Unexecuted instantiation: jdcoefct-8.c:dummy_consume_data
Unexecuted instantiation: jdcoefct-12.c:dummy_consume_data
205
206
207
#ifdef D_MULTISCAN_FILES_SUPPORTED
208
209
/*
210
 * Consume input data and store it in the full-image coefficient buffer.
211
 * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
212
 * ie, v_samp_factor block rows for each component in the scan.
213
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
214
 */
215
216
METHODDEF(int)
217
consume_data(j_decompress_ptr cinfo)
218
128k
{
219
128k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
128k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
128k
  int blkn, ci, xindex, yindex, yoffset;
222
128k
  JDIMENSION start_col;
223
128k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
128k
  JBLOCKROW buffer_ptr;
225
128k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
364k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
236k
    compptr = cinfo->cur_comp_info[ci];
230
236k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
236k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
236k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
236k
       (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
236k
  }
239
240
  /* Loop to process one whole iMCU row */
241
301k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
173k
       yoffset++) {
243
6.48M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
6.31M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
6.31M
      blkn = 0;                 /* index of current DCT block within MCU */
247
15.0M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
8.72M
        compptr = cinfo->cur_comp_info[ci];
249
8.72M
        start_col = MCU_col_num * compptr->MCU_width;
250
20.1M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
11.4M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
25.7M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
14.3M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
14.3M
          }
255
11.4M
        }
256
8.72M
      }
257
6.31M
      if (!cinfo->entropy->insufficient_data)
258
6.31M
        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
6.31M
      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
6.31M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
173k
    coef->MCU_ctr = 0;
282
173k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
128k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
118k
    start_iMCU_row(cinfo);
286
118k
    return JPEG_ROW_COMPLETED;
287
118k
  }
288
  /* Completed the scan */
289
9.41k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
9.41k
  return JPEG_SCAN_COMPLETED;
291
128k
}
jdcoefct-8.c:consume_data
Line
Count
Source
218
124k
{
219
124k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
124k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
124k
  int blkn, ci, xindex, yindex, yoffset;
222
124k
  JDIMENSION start_col;
223
124k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
124k
  JBLOCKROW buffer_ptr;
225
124k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
353k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
228k
    compptr = cinfo->cur_comp_info[ci];
230
228k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
228k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
228k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
228k
       (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
228k
  }
239
240
  /* Loop to process one whole iMCU row */
241
293k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
168k
       yoffset++) {
243
4.90M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
4.73M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
4.73M
      blkn = 0;                 /* index of current DCT block within MCU */
247
11.4M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
6.76M
        compptr = cinfo->cur_comp_info[ci];
249
6.76M
        start_col = MCU_col_num * compptr->MCU_width;
250
16.0M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
9.24M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
21.0M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
11.7M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
11.7M
          }
255
9.24M
        }
256
6.76M
      }
257
4.73M
      if (!cinfo->entropy->insufficient_data)
258
4.73M
        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
4.73M
      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
4.73M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
168k
    coef->MCU_ctr = 0;
282
168k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
124k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
116k
    start_iMCU_row(cinfo);
286
116k
    return JPEG_ROW_COMPLETED;
287
116k
  }
288
  /* Completed the scan */
289
8.38k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
8.38k
  return JPEG_SCAN_COMPLETED;
291
124k
}
jdcoefct-12.c:consume_data
Line
Count
Source
218
3.74k
{
219
3.74k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
3.74k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
3.74k
  int blkn, ci, xindex, yindex, yoffset;
222
3.74k
  JDIMENSION start_col;
223
3.74k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
3.74k
  JBLOCKROW buffer_ptr;
225
3.74k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
11.3k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
7.55k
    compptr = cinfo->cur_comp_info[ci];
230
7.55k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
7.55k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
7.55k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
7.55k
       (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
7.55k
  }
239
240
  /* Loop to process one whole iMCU row */
241
8.26k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
4.52k
       yoffset++) {
243
1.58M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
1.58M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
1.58M
      blkn = 0;                 /* index of current DCT block within MCU */
247
3.54M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
1.96M
        compptr = cinfo->cur_comp_info[ci];
249
1.96M
        start_col = MCU_col_num * compptr->MCU_width;
250
4.12M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
2.16M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
4.76M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
2.60M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
2.60M
          }
255
2.16M
        }
256
1.96M
      }
257
1.58M
      if (!cinfo->entropy->insufficient_data)
258
1.58M
        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.58M
      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.58M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
4.52k
    coef->MCU_ctr = 0;
282
4.52k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
3.74k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
2.70k
    start_iMCU_row(cinfo);
286
2.70k
    return JPEG_ROW_COMPLETED;
287
2.70k
  }
288
  /* Completed the scan */
289
1.03k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
1.03k
  return JPEG_SCAN_COMPLETED;
291
3.74k
}
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
12.0k
{
305
12.0k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
12.0k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
12.0k
  JDIMENSION block_num;
308
12.0k
  int ci, block_row, block_rows;
309
12.0k
  JBLOCKARRAY buffer;
310
12.0k
  JBLOCKROW buffer_ptr;
311
12.0k
  _JSAMPARRAY output_ptr;
312
12.0k
  JDIMENSION output_col;
313
12.0k
  jpeg_component_info *compptr;
314
12.0k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
12.0k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
12.0k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
12.0k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
320
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
321
0
      return JPEG_SUSPENDED;
322
0
  }
323
324
  /* OK, output from the virtual arrays. */
325
47.5k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
35.5k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
35.5k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
35.5k
    buffer = (*cinfo->mem->access_virt_barray)
332
35.5k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
35.5k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
35.5k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
35.5k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
33.8k
      block_rows = compptr->v_samp_factor;
338
1.68k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.68k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.68k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.68k
    }
343
35.5k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
35.5k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
104k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
69.3k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
69.3k
      output_col = 0;
349
69.3k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
695k
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
626k
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
626k
                        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
626k
        buffer_ptr++;
361
626k
        output_col += compptr->_DCT_scaled_size;
362
626k
      }
363
69.3k
      output_ptr += compptr->_DCT_scaled_size;
364
69.3k
    }
365
35.5k
  }
366
367
12.0k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
11.4k
    return JPEG_ROW_COMPLETED;
369
564
  return JPEG_SCAN_COMPLETED;
370
12.0k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
304
12.0k
{
305
12.0k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
12.0k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
12.0k
  JDIMENSION block_num;
308
12.0k
  int ci, block_row, block_rows;
309
12.0k
  JBLOCKARRAY buffer;
310
12.0k
  JBLOCKROW buffer_ptr;
311
12.0k
  _JSAMPARRAY output_ptr;
312
12.0k
  JDIMENSION output_col;
313
12.0k
  jpeg_component_info *compptr;
314
12.0k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
12.0k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
12.0k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
12.0k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
320
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
321
0
      return JPEG_SUSPENDED;
322
0
  }
323
324
  /* OK, output from the virtual arrays. */
325
47.5k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
35.5k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
35.5k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
35.5k
    buffer = (*cinfo->mem->access_virt_barray)
332
35.5k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
35.5k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
35.5k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
35.5k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
33.8k
      block_rows = compptr->v_samp_factor;
338
1.68k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
1.68k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
1.68k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
1.68k
    }
343
35.5k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
35.5k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
104k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
69.3k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
69.3k
      output_col = 0;
349
69.3k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
695k
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
626k
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
626k
                        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
626k
        buffer_ptr++;
361
626k
        output_col += compptr->_DCT_scaled_size;
362
626k
      }
363
69.3k
      output_ptr += compptr->_DCT_scaled_size;
364
69.3k
    }
365
35.5k
  }
366
367
12.0k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
11.4k
    return JPEG_ROW_COMPLETED;
369
564
  return JPEG_SCAN_COMPLETED;
370
12.0k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_data
371
372
#endif /* D_MULTISCAN_FILES_SUPPORTED */
373
374
375
#ifdef BLOCK_SMOOTHING_SUPPORTED
376
377
/*
378
 * This code applies interblock smoothing; the first 9 AC coefficients are
379
 * estimated from the DC values of a DCT block and its 24 neighboring blocks.
380
 * We apply smoothing only for progressive JPEG decoding, and only if
381
 * the coefficients it can estimate are not yet known to full precision.
382
 */
383
384
/* Natural-order array positions of the first 9 zigzag-order coefficients */
385
70.7k
#define Q01_POS  1
386
70.7k
#define Q10_POS  8
387
70.7k
#define Q20_POS  16
388
70.7k
#define Q11_POS  9
389
70.6k
#define Q02_POS  2
390
58.5k
#define Q03_POS  3
391
58.5k
#define Q12_POS  10
392
58.5k
#define Q21_POS  17
393
58.5k
#define Q30_POS  24
394
395
/*
396
 * Determine whether block smoothing is applicable and safe.
397
 * We also latch the current states of the coef_bits[] entries for the
398
 * AC coefficients; otherwise, if the input side of the decompressor
399
 * advances into a new scan, we might think the coefficients are known
400
 * more accurately than they really are.
401
 */
402
403
LOCAL(boolean)
404
smoothing_ok(j_decompress_ptr cinfo)
405
1.66k
{
406
1.66k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.66k
  boolean smoothing_useful = FALSE;
408
1.66k
  int ci, coefi;
409
1.66k
  jpeg_component_info *compptr;
410
1.66k
  JQUANT_TBL *qtable;
411
1.66k
  int *coef_bits, *prev_coef_bits;
412
1.66k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.66k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
0
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.66k
  if (coef->coef_bits_latch == NULL)
419
1.66k
    coef->coef_bits_latch = (int *)
420
1.66k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.66k
                                  cinfo->num_components * 2 *
422
1.66k
                                  (SAVED_COEFS * sizeof(int)));
423
1.66k
  coef_bits_latch = coef->coef_bits_latch;
424
1.66k
  prev_coef_bits_latch =
425
1.66k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
6.01k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
4.59k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
4.59k
    if ((qtable = compptr->quant_table) == NULL)
431
34
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
4.55k
    if (qtable->quantval[0] == 0 ||
434
4.52k
        qtable->quantval[Q01_POS] == 0 ||
435
4.51k
        qtable->quantval[Q10_POS] == 0 ||
436
4.47k
        qtable->quantval[Q20_POS] == 0 ||
437
4.45k
        qtable->quantval[Q11_POS] == 0 ||
438
4.43k
        qtable->quantval[Q02_POS] == 0 ||
439
4.42k
        qtable->quantval[Q03_POS] == 0 ||
440
4.40k
        qtable->quantval[Q12_POS] == 0 ||
441
4.38k
        qtable->quantval[Q21_POS] == 0 ||
442
4.37k
        qtable->quantval[Q30_POS] == 0)
443
210
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
4.34k
    coef_bits = cinfo->coef_bits[ci];
446
4.34k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
4.34k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
4.34k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
43.4k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
39.1k
      if (cinfo->input_scan_number > 1)
453
34.2k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
4.86k
      else
455
4.86k
        prev_coef_bits_latch[coefi] = -1;
456
39.1k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
39.1k
      if (coef_bits[coefi] != 0)
458
26.4k
        smoothing_useful = TRUE;
459
39.1k
    }
460
4.34k
    coef_bits_latch += SAVED_COEFS;
461
4.34k
    prev_coef_bits_latch += SAVED_COEFS;
462
4.34k
  }
463
464
1.42k
  return smoothing_useful;
465
1.66k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
405
1.54k
{
406
1.54k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
1.54k
  boolean smoothing_useful = FALSE;
408
1.54k
  int ci, coefi;
409
1.54k
  jpeg_component_info *compptr;
410
1.54k
  JQUANT_TBL *qtable;
411
1.54k
  int *coef_bits, *prev_coef_bits;
412
1.54k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
1.54k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
0
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
1.54k
  if (coef->coef_bits_latch == NULL)
419
1.54k
    coef->coef_bits_latch = (int *)
420
1.54k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
1.54k
                                  cinfo->num_components * 2 *
422
1.54k
                                  (SAVED_COEFS * sizeof(int)));
423
1.54k
  coef_bits_latch = coef->coef_bits_latch;
424
1.54k
  prev_coef_bits_latch =
425
1.54k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
5.79k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
4.38k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
4.38k
    if ((qtable = compptr->quant_table) == NULL)
431
27
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
4.35k
    if (qtable->quantval[0] == 0 ||
434
4.33k
        qtable->quantval[Q01_POS] == 0 ||
435
4.32k
        qtable->quantval[Q10_POS] == 0 ||
436
4.31k
        qtable->quantval[Q20_POS] == 0 ||
437
4.29k
        qtable->quantval[Q11_POS] == 0 ||
438
4.28k
        qtable->quantval[Q02_POS] == 0 ||
439
4.28k
        qtable->quantval[Q03_POS] == 0 ||
440
4.27k
        qtable->quantval[Q12_POS] == 0 ||
441
4.27k
        qtable->quantval[Q21_POS] == 0 ||
442
4.26k
        qtable->quantval[Q30_POS] == 0)
443
111
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
4.24k
    coef_bits = cinfo->coef_bits[ci];
446
4.24k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
4.24k
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
4.24k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
42.4k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
38.2k
      if (cinfo->input_scan_number > 1)
453
33.9k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
4.25k
      else
455
4.25k
        prev_coef_bits_latch[coefi] = -1;
456
38.2k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
38.2k
      if (coef_bits[coefi] != 0)
458
25.6k
        smoothing_useful = TRUE;
459
38.2k
    }
460
4.24k
    coef_bits_latch += SAVED_COEFS;
461
4.24k
    prev_coef_bits_latch += SAVED_COEFS;
462
4.24k
  }
463
464
1.40k
  return smoothing_useful;
465
1.54k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
405
123
{
406
123
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
123
  boolean smoothing_useful = FALSE;
408
123
  int ci, coefi;
409
123
  jpeg_component_info *compptr;
410
123
  JQUANT_TBL *qtable;
411
123
  int *coef_bits, *prev_coef_bits;
412
123
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
123
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
0
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
123
  if (coef->coef_bits_latch == NULL)
419
123
    coef->coef_bits_latch = (int *)
420
123
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
123
                                  cinfo->num_components * 2 *
422
123
                                  (SAVED_COEFS * sizeof(int)));
423
123
  coef_bits_latch = coef->coef_bits_latch;
424
123
  prev_coef_bits_latch =
425
123
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
225
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
208
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
208
    if ((qtable = compptr->quant_table) == NULL)
431
7
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
201
    if (qtable->quantval[0] == 0 ||
434
192
        qtable->quantval[Q01_POS] == 0 ||
435
187
        qtable->quantval[Q10_POS] == 0 ||
436
160
        qtable->quantval[Q20_POS] == 0 ||
437
156
        qtable->quantval[Q11_POS] == 0 ||
438
146
        qtable->quantval[Q02_POS] == 0 ||
439
142
        qtable->quantval[Q03_POS] == 0 ||
440
130
        qtable->quantval[Q12_POS] == 0 ||
441
115
        qtable->quantval[Q21_POS] == 0 ||
442
108
        qtable->quantval[Q30_POS] == 0)
443
99
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
102
    coef_bits = cinfo->coef_bits[ci];
446
102
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
102
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
102
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
1.02k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
918
      if (cinfo->input_scan_number > 1)
453
306
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
612
      else
455
612
        prev_coef_bits_latch[coefi] = -1;
456
918
      coef_bits_latch[coefi] = coef_bits[coefi];
457
918
      if (coef_bits[coefi] != 0)
458
801
        smoothing_useful = TRUE;
459
918
    }
460
102
    coef_bits_latch += SAVED_COEFS;
461
102
    prev_coef_bits_latch += SAVED_COEFS;
462
102
  }
463
464
17
  return smoothing_useful;
465
123
}
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
22.1k
{
475
22.1k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
22.1k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
22.1k
  JDIMENSION block_num, last_block_column;
478
22.1k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
22.1k
    image_block_rows;
480
22.1k
  JBLOCKARRAY buffer;
481
22.1k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
22.1k
  JBLOCKROW next_block_row, next_next_block_row;
483
22.1k
  _JSAMPARRAY output_ptr;
484
22.1k
  JDIMENSION output_col;
485
22.1k
  jpeg_component_info *compptr;
486
22.1k
  _inverse_DCT_method_ptr inverse_DCT;
487
22.1k
  boolean change_dc;
488
22.1k
  JCOEF *workspace;
489
22.1k
  int *coef_bits;
490
22.1k
  JQUANT_TBL *quanttbl;
491
22.1k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
22.1k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
22.1k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
22.1k
      DC25;
495
22.1k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
22.1k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
22.1k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
22.1k
         !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
88.3k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
66.2k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
66.2k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
66.2k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
60.8k
      block_rows = compptr->v_samp_factor;
526
60.8k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
60.8k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
2.44k
      block_rows = compptr->v_samp_factor;
529
2.44k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
2.94k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
2.94k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
2.94k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
2.94k
      access_rows = block_rows; /* this iMCU row only */
535
2.94k
    }
536
    /* Align the virtual buffer for this component. */
537
66.2k
    if (cinfo->output_iMCU_row > 1) {
538
60.8k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
60.8k
      buffer = (*cinfo->mem->access_virt_barray)
540
60.8k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
60.8k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
60.8k
         (JDIMENSION)access_rows, FALSE);
543
60.8k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
60.8k
    } else if (cinfo->output_iMCU_row > 0) {
545
2.44k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
2.44k
      buffer = (*cinfo->mem->access_virt_barray)
547
2.44k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
2.44k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
2.44k
         (JDIMENSION)access_rows, FALSE);
550
2.44k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
2.94k
    } else {
552
2.94k
      buffer = (*cinfo->mem->access_virt_barray)
553
2.94k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
2.94k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
2.94k
    }
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
66.2k
    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
66.2k
    else
564
66.2k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
66.2k
    change_dc =
568
66.2k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
57.4k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
55.0k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
66.2k
    quanttbl = compptr->quant_table;
573
66.2k
    Q00 = quanttbl->quantval[0];
574
66.2k
    Q01 = quanttbl->quantval[Q01_POS];
575
66.2k
    Q10 = quanttbl->quantval[Q10_POS];
576
66.2k
    Q20 = quanttbl->quantval[Q20_POS];
577
66.2k
    Q11 = quanttbl->quantval[Q11_POS];
578
66.2k
    Q02 = quanttbl->quantval[Q02_POS];
579
66.2k
    if (change_dc) {
580
54.1k
      Q03 = quanttbl->quantval[Q03_POS];
581
54.1k
      Q12 = quanttbl->quantval[Q12_POS];
582
54.1k
      Q21 = quanttbl->quantval[Q21_POS];
583
54.1k
      Q30 = quanttbl->quantval[Q30_POS];
584
54.1k
    }
585
66.2k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
66.2k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
66.2k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
208k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
142k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
142k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
142k
      if (image_block_row > 0)
594
139k
        prev_block_row =
595
139k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
2.94k
      else
597
2.94k
        prev_block_row = buffer_ptr;
598
599
142k
      if (image_block_row > 1)
600
136k
        prev_prev_block_row =
601
136k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
5.59k
      else
603
5.59k
        prev_prev_block_row = prev_block_row;
604
605
142k
      if (image_block_row < image_block_rows - 1)
606
139k
        next_block_row =
607
139k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
2.94k
      else
609
2.94k
        next_block_row = buffer_ptr;
610
611
142k
      if (image_block_row < image_block_rows - 2)
612
137k
        next_next_block_row =
613
137k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
4.45k
      else
615
4.45k
        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
142k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
142k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
142k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
142k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
142k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
142k
      output_col = 0;
626
142k
      last_block_column = compptr->width_in_blocks - 1;
627
142k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
3.05M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
2.91M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
2.91M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
142k
            block_num < last_block_column) {
634
88.1k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
88.1k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
88.1k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
88.1k
          DC19 = DC20 = (int)next_block_row[1][0];
638
88.1k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
88.1k
        }
640
2.91M
        if (block_num + 1 < last_block_column) {
641
2.68M
          DC05 = (int)prev_prev_block_row[2][0];
642
2.68M
          DC10 = (int)prev_block_row[2][0];
643
2.68M
          DC15 = (int)buffer_ptr[2][0];
644
2.68M
          DC20 = (int)next_block_row[2][0];
645
2.68M
          DC25 = (int)next_next_block_row[2][0];
646
2.68M
        }
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
2.91M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
2.48M
          num = Q00 * (change_dc ?
660
1.97M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
1.97M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
1.97M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
1.97M
                 DC21 - DC22 + DC24 + DC25) :
664
2.48M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
2.48M
          if (num >= 0) {
666
1.39M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
1.39M
            if (Al > 0 && pred >= (1 << Al))
668
3.60k
              pred = (1 << Al) - 1;
669
1.39M
          } else {
670
1.09M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
1.09M
            if (Al > 0 && pred >= (1 << Al))
672
3.36k
              pred = (1 << Al) - 1;
673
1.09M
            pred = -pred;
674
1.09M
          }
675
2.48M
          workspace[1] = (JCOEF)pred;
676
2.48M
        }
677
        /* AC10 */
678
2.91M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
2.43M
          num = Q00 * (change_dc ?
680
1.97M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
1.97M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
1.97M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
1.97M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
2.43M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
2.43M
          if (num >= 0) {
686
1.77M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
1.77M
            if (Al > 0 && pred >= (1 << Al))
688
5.11k
              pred = (1 << Al) - 1;
689
1.77M
          } else {
690
657k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
657k
            if (Al > 0 && pred >= (1 << Al))
692
2.87k
              pred = (1 << Al) - 1;
693
657k
            pred = -pred;
694
657k
          }
695
2.43M
          workspace[8] = (JCOEF)pred;
696
2.43M
        }
697
        /* AC20 */
698
2.91M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
2.46M
          num = Q00 * (change_dc ?
700
1.97M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
1.97M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
2.46M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
2.46M
          if (num >= 0) {
704
1.55M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
1.55M
            if (Al > 0 && pred >= (1 << Al))
706
9.91k
              pred = (1 << Al) - 1;
707
1.55M
          } else {
708
904k
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
904k
            if (Al > 0 && pred >= (1 << Al))
710
10.1k
              pred = (1 << Al) - 1;
711
904k
            pred = -pred;
712
904k
          }
713
2.46M
          workspace[16] = (JCOEF)pred;
714
2.46M
        }
715
        /* AC11 */
716
2.91M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
2.43M
          num = Q00 * (change_dc ?
718
1.97M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
1.97M
                 9 * DC19 + DC21 - DC25) :
720
2.43M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
456k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
2.43M
          if (num >= 0) {
723
1.84M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
1.84M
            if (Al > 0 && pred >= (1 << Al))
725
4.82k
              pred = (1 << Al) - 1;
726
1.84M
          } else {
727
590k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
590k
            if (Al > 0 && pred >= (1 << Al))
729
4.46k
              pred = (1 << Al) - 1;
730
590k
            pred = -pred;
731
590k
          }
732
2.43M
          workspace[9] = (JCOEF)pred;
733
2.43M
        }
734
        /* AC02 */
735
2.91M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
2.49M
          num = Q00 * (change_dc ?
737
1.97M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
1.97M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
2.49M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
2.49M
          if (num >= 0) {
741
1.56M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
1.56M
            if (Al > 0 && pred >= (1 << Al))
743
6.05k
              pred = (1 << Al) - 1;
744
1.56M
          } else {
745
934k
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
934k
            if (Al > 0 && pred >= (1 << Al))
747
6.19k
              pred = (1 << Al) - 1;
748
934k
            pred = -pred;
749
934k
          }
750
2.49M
          workspace[2] = (JCOEF)pred;
751
2.49M
        }
752
2.91M
        if (change_dc) {
753
          /* AC03 */
754
1.97M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
1.97M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
1.97M
            if (num >= 0) {
757
1.13M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
1.13M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
1.13M
            } else {
761
841k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
841k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
841k
              pred = -pred;
765
841k
            }
766
1.97M
            workspace[3] = (JCOEF)pred;
767
1.97M
          }
768
          /* AC12 */
769
1.97M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
1.97M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
1.97M
            if (num >= 0) {
772
1.42M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
1.42M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
1.42M
            } else {
776
554k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
554k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
554k
              pred = -pred;
780
554k
            }
781
1.97M
            workspace[10] = (JCOEF)pred;
782
1.97M
          }
783
          /* AC21 */
784
1.97M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
1.97M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
1.97M
            if (num >= 0) {
787
1.33M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
1.33M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
1.33M
            } else {
791
646k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
646k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
646k
              pred = -pred;
795
646k
            }
796
1.97M
            workspace[17] = (JCOEF)pred;
797
1.97M
          }
798
          /* AC30 */
799
1.97M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
1.97M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
1.97M
            if (num >= 0) {
802
1.55M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
1.55M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
1.55M
            } else {
806
417k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
417k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
417k
              pred = -pred;
810
417k
            }
811
1.97M
            workspace[24] = (JCOEF)pred;
812
1.97M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
1.97M
          num = Q00 *
817
1.97M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
1.97M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
1.97M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
1.97M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
1.97M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
1.97M
          if (num >= 0) {
823
921k
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
1.05M
          } else {
825
1.05M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
1.05M
            pred = -pred;
827
1.05M
          }
828
1.97M
          workspace[0] = (JCOEF)pred;
829
1.97M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
2.91M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
2.91M
                        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
2.91M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
2.91M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
2.91M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
2.91M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
2.91M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
2.91M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
2.91M
          prev_prev_block_row++, next_next_block_row++;
849
2.91M
        output_col += compptr->_DCT_scaled_size;
850
2.91M
      }
851
142k
      output_ptr += compptr->_DCT_scaled_size;
852
142k
    }
853
66.2k
  }
854
855
22.1k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
21.1k
    return JPEG_ROW_COMPLETED;
857
981
  return JPEG_SCAN_COMPLETED;
858
22.1k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
474
22.1k
{
475
22.1k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
22.1k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
22.1k
  JDIMENSION block_num, last_block_column;
478
22.1k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
22.1k
    image_block_rows;
480
22.1k
  JBLOCKARRAY buffer;
481
22.1k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
22.1k
  JBLOCKROW next_block_row, next_next_block_row;
483
22.1k
  _JSAMPARRAY output_ptr;
484
22.1k
  JDIMENSION output_col;
485
22.1k
  jpeg_component_info *compptr;
486
22.1k
  _inverse_DCT_method_ptr inverse_DCT;
487
22.1k
  boolean change_dc;
488
22.1k
  JCOEF *workspace;
489
22.1k
  int *coef_bits;
490
22.1k
  JQUANT_TBL *quanttbl;
491
22.1k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
22.1k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
22.1k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
22.1k
      DC25;
495
22.1k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
22.1k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
22.1k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
22.1k
         !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
88.3k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
66.2k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
66.2k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
66.2k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
60.8k
      block_rows = compptr->v_samp_factor;
526
60.8k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
60.8k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
2.44k
      block_rows = compptr->v_samp_factor;
529
2.44k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
2.94k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
2.94k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
2.94k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
2.94k
      access_rows = block_rows; /* this iMCU row only */
535
2.94k
    }
536
    /* Align the virtual buffer for this component. */
537
66.2k
    if (cinfo->output_iMCU_row > 1) {
538
60.8k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
60.8k
      buffer = (*cinfo->mem->access_virt_barray)
540
60.8k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
60.8k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
60.8k
         (JDIMENSION)access_rows, FALSE);
543
60.8k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
60.8k
    } else if (cinfo->output_iMCU_row > 0) {
545
2.44k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
2.44k
      buffer = (*cinfo->mem->access_virt_barray)
547
2.44k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
2.44k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
2.44k
         (JDIMENSION)access_rows, FALSE);
550
2.44k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
2.94k
    } else {
552
2.94k
      buffer = (*cinfo->mem->access_virt_barray)
553
2.94k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
2.94k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
2.94k
    }
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
66.2k
    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
66.2k
    else
564
66.2k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
66.2k
    change_dc =
568
66.2k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
57.4k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
55.0k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
66.2k
    quanttbl = compptr->quant_table;
573
66.2k
    Q00 = quanttbl->quantval[0];
574
66.2k
    Q01 = quanttbl->quantval[Q01_POS];
575
66.2k
    Q10 = quanttbl->quantval[Q10_POS];
576
66.2k
    Q20 = quanttbl->quantval[Q20_POS];
577
66.2k
    Q11 = quanttbl->quantval[Q11_POS];
578
66.2k
    Q02 = quanttbl->quantval[Q02_POS];
579
66.2k
    if (change_dc) {
580
54.1k
      Q03 = quanttbl->quantval[Q03_POS];
581
54.1k
      Q12 = quanttbl->quantval[Q12_POS];
582
54.1k
      Q21 = quanttbl->quantval[Q21_POS];
583
54.1k
      Q30 = quanttbl->quantval[Q30_POS];
584
54.1k
    }
585
66.2k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
66.2k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
66.2k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
208k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
142k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
142k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
142k
      if (image_block_row > 0)
594
139k
        prev_block_row =
595
139k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
2.94k
      else
597
2.94k
        prev_block_row = buffer_ptr;
598
599
142k
      if (image_block_row > 1)
600
136k
        prev_prev_block_row =
601
136k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
5.59k
      else
603
5.59k
        prev_prev_block_row = prev_block_row;
604
605
142k
      if (image_block_row < image_block_rows - 1)
606
139k
        next_block_row =
607
139k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
2.94k
      else
609
2.94k
        next_block_row = buffer_ptr;
610
611
142k
      if (image_block_row < image_block_rows - 2)
612
137k
        next_next_block_row =
613
137k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
4.45k
      else
615
4.45k
        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
142k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
142k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
142k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
142k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
142k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
142k
      output_col = 0;
626
142k
      last_block_column = compptr->width_in_blocks - 1;
627
142k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
3.05M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
2.91M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
2.91M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
142k
            block_num < last_block_column) {
634
88.1k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
88.1k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
88.1k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
88.1k
          DC19 = DC20 = (int)next_block_row[1][0];
638
88.1k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
88.1k
        }
640
2.91M
        if (block_num + 1 < last_block_column) {
641
2.68M
          DC05 = (int)prev_prev_block_row[2][0];
642
2.68M
          DC10 = (int)prev_block_row[2][0];
643
2.68M
          DC15 = (int)buffer_ptr[2][0];
644
2.68M
          DC20 = (int)next_block_row[2][0];
645
2.68M
          DC25 = (int)next_next_block_row[2][0];
646
2.68M
        }
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
2.91M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
2.48M
          num = Q00 * (change_dc ?
660
1.97M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
1.97M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
1.97M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
1.97M
                 DC21 - DC22 + DC24 + DC25) :
664
2.48M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
2.48M
          if (num >= 0) {
666
1.39M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
1.39M
            if (Al > 0 && pred >= (1 << Al))
668
3.60k
              pred = (1 << Al) - 1;
669
1.39M
          } else {
670
1.09M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
1.09M
            if (Al > 0 && pred >= (1 << Al))
672
3.36k
              pred = (1 << Al) - 1;
673
1.09M
            pred = -pred;
674
1.09M
          }
675
2.48M
          workspace[1] = (JCOEF)pred;
676
2.48M
        }
677
        /* AC10 */
678
2.91M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
2.43M
          num = Q00 * (change_dc ?
680
1.97M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
1.97M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
1.97M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
1.97M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
2.43M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
2.43M
          if (num >= 0) {
686
1.77M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
1.77M
            if (Al > 0 && pred >= (1 << Al))
688
5.11k
              pred = (1 << Al) - 1;
689
1.77M
          } else {
690
657k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
657k
            if (Al > 0 && pred >= (1 << Al))
692
2.87k
              pred = (1 << Al) - 1;
693
657k
            pred = -pred;
694
657k
          }
695
2.43M
          workspace[8] = (JCOEF)pred;
696
2.43M
        }
697
        /* AC20 */
698
2.91M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
2.46M
          num = Q00 * (change_dc ?
700
1.97M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
1.97M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
2.46M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
2.46M
          if (num >= 0) {
704
1.55M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
1.55M
            if (Al > 0 && pred >= (1 << Al))
706
9.91k
              pred = (1 << Al) - 1;
707
1.55M
          } else {
708
904k
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
904k
            if (Al > 0 && pred >= (1 << Al))
710
10.1k
              pred = (1 << Al) - 1;
711
904k
            pred = -pred;
712
904k
          }
713
2.46M
          workspace[16] = (JCOEF)pred;
714
2.46M
        }
715
        /* AC11 */
716
2.91M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
2.43M
          num = Q00 * (change_dc ?
718
1.97M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
1.97M
                 9 * DC19 + DC21 - DC25) :
720
2.43M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
456k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
2.43M
          if (num >= 0) {
723
1.84M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
1.84M
            if (Al > 0 && pred >= (1 << Al))
725
4.82k
              pred = (1 << Al) - 1;
726
1.84M
          } else {
727
590k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
590k
            if (Al > 0 && pred >= (1 << Al))
729
4.46k
              pred = (1 << Al) - 1;
730
590k
            pred = -pred;
731
590k
          }
732
2.43M
          workspace[9] = (JCOEF)pred;
733
2.43M
        }
734
        /* AC02 */
735
2.91M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
2.49M
          num = Q00 * (change_dc ?
737
1.97M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
1.97M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
2.49M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
2.49M
          if (num >= 0) {
741
1.56M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
1.56M
            if (Al > 0 && pred >= (1 << Al))
743
6.05k
              pred = (1 << Al) - 1;
744
1.56M
          } else {
745
934k
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
934k
            if (Al > 0 && pred >= (1 << Al))
747
6.19k
              pred = (1 << Al) - 1;
748
934k
            pred = -pred;
749
934k
          }
750
2.49M
          workspace[2] = (JCOEF)pred;
751
2.49M
        }
752
2.91M
        if (change_dc) {
753
          /* AC03 */
754
1.97M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
1.97M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
1.97M
            if (num >= 0) {
757
1.13M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
1.13M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
1.13M
            } else {
761
841k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
841k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
841k
              pred = -pred;
765
841k
            }
766
1.97M
            workspace[3] = (JCOEF)pred;
767
1.97M
          }
768
          /* AC12 */
769
1.97M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
1.97M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
1.97M
            if (num >= 0) {
772
1.42M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
1.42M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
1.42M
            } else {
776
554k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
554k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
554k
              pred = -pred;
780
554k
            }
781
1.97M
            workspace[10] = (JCOEF)pred;
782
1.97M
          }
783
          /* AC21 */
784
1.97M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
1.97M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
1.97M
            if (num >= 0) {
787
1.33M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
1.33M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
1.33M
            } else {
791
646k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
646k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
646k
              pred = -pred;
795
646k
            }
796
1.97M
            workspace[17] = (JCOEF)pred;
797
1.97M
          }
798
          /* AC30 */
799
1.97M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
1.97M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
1.97M
            if (num >= 0) {
802
1.55M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
1.55M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
1.55M
            } else {
806
417k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
417k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
417k
              pred = -pred;
810
417k
            }
811
1.97M
            workspace[24] = (JCOEF)pred;
812
1.97M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
1.97M
          num = Q00 *
817
1.97M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
1.97M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
1.97M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
1.97M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
1.97M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
1.97M
          if (num >= 0) {
823
921k
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
1.05M
          } else {
825
1.05M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
1.05M
            pred = -pred;
827
1.05M
          }
828
1.97M
          workspace[0] = (JCOEF)pred;
829
1.97M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
2.91M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
2.91M
                        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
2.91M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
2.91M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
2.91M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
2.91M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
2.91M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
2.91M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
2.91M
          prev_prev_block_row++, next_next_block_row++;
849
2.91M
        output_col += compptr->_DCT_scaled_size;
850
2.91M
      }
851
142k
      output_ptr += compptr->_DCT_scaled_size;
852
142k
    }
853
66.2k
  }
854
855
22.1k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
21.1k
    return JPEG_ROW_COMPLETED;
857
981
  return JPEG_SCAN_COMPLETED;
858
22.1k
}
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
4.17k
{
870
4.17k
  my_coef_ptr coef;
871
872
4.17k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
4.17k
  coef = (my_coef_ptr)
876
4.17k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
4.17k
                                sizeof(my_coef_controller));
878
4.17k
  memset(coef, 0, sizeof(my_coef_controller));
879
4.17k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
4.17k
  coef->pub.start_input_pass = start_input_pass;
881
4.17k
  coef->pub.start_output_pass = start_output_pass;
882
4.17k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
4.17k
  coef->coef_bits_latch = NULL;
884
4.17k
#endif
885
886
  /* Create the coefficient buffer. */
887
4.17k
  if (need_full_buffer) {
888
2.41k
#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.41k
    int ci, access_rows;
893
2.41k
    jpeg_component_info *compptr;
894
895
9.58k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
7.17k
         ci++, compptr++) {
897
7.17k
      access_rows = compptr->v_samp_factor;
898
7.17k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
7.17k
      if (cinfo->progressive_mode)
901
7.12k
        access_rows *= 5;
902
7.17k
#endif
903
7.17k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
7.17k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
7.17k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
7.17k
                               (long)compptr->h_samp_factor),
907
7.17k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
7.17k
                               (long)compptr->v_samp_factor),
909
7.17k
         (JDIMENSION)access_rows);
910
7.17k
    }
911
2.41k
    coef->pub.consume_data = consume_data;
912
2.41k
    coef->pub._decompress_data = decompress_data;
913
2.41k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.41k
  } else {
918
    /* We only need a single-MCU buffer. */
919
1.76k
    JBLOCKROW buffer;
920
1.76k
    int i;
921
922
1.76k
    buffer = (JBLOCKROW)
923
1.76k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
1.76k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
19.4k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
17.6k
      coef->MCU_buffer[i] = buffer + i;
927
17.6k
    }
928
1.76k
    coef->pub.consume_data = dummy_consume_data;
929
1.76k
    coef->pub._decompress_data = decompress_onepass;
930
1.76k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
1.76k
  }
932
933
  /* Allocate the workspace buffer */
934
4.17k
  coef->workspace = (JCOEF *)
935
4.17k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
4.17k
                                sizeof(JCOEF) * DCTSIZE2);
937
4.17k
}
jinit_d_coef_controller
Line
Count
Source
869
3.81k
{
870
3.81k
  my_coef_ptr coef;
871
872
3.81k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
3.81k
  coef = (my_coef_ptr)
876
3.81k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
3.81k
                                sizeof(my_coef_controller));
878
3.81k
  memset(coef, 0, sizeof(my_coef_controller));
879
3.81k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
3.81k
  coef->pub.start_input_pass = start_input_pass;
881
3.81k
  coef->pub.start_output_pass = start_output_pass;
882
3.81k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
3.81k
  coef->coef_bits_latch = NULL;
884
3.81k
#endif
885
886
  /* Create the coefficient buffer. */
887
3.81k
  if (need_full_buffer) {
888
2.07k
#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.07k
    int ci, access_rows;
893
2.07k
    jpeg_component_info *compptr;
894
895
8.26k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
6.18k
         ci++, compptr++) {
897
6.18k
      access_rows = compptr->v_samp_factor;
898
6.18k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
6.18k
      if (cinfo->progressive_mode)
901
6.15k
        access_rows *= 5;
902
6.18k
#endif
903
6.18k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
6.18k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
6.18k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
6.18k
                               (long)compptr->h_samp_factor),
907
6.18k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
6.18k
                               (long)compptr->v_samp_factor),
909
6.18k
         (JDIMENSION)access_rows);
910
6.18k
    }
911
2.07k
    coef->pub.consume_data = consume_data;
912
2.07k
    coef->pub._decompress_data = decompress_data;
913
2.07k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.07k
  } else {
918
    /* We only need a single-MCU buffer. */
919
1.73k
    JBLOCKROW buffer;
920
1.73k
    int i;
921
922
1.73k
    buffer = (JBLOCKROW)
923
1.73k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
1.73k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
19.0k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
17.3k
      coef->MCU_buffer[i] = buffer + i;
927
17.3k
    }
928
1.73k
    coef->pub.consume_data = dummy_consume_data;
929
1.73k
    coef->pub._decompress_data = decompress_onepass;
930
1.73k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
1.73k
  }
932
933
  /* Allocate the workspace buffer */
934
3.81k
  coef->workspace = (JCOEF *)
935
3.81k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
3.81k
                                sizeof(JCOEF) * DCTSIZE2);
937
3.81k
}
j12init_d_coef_controller
Line
Count
Source
869
365
{
870
365
  my_coef_ptr coef;
871
872
365
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
365
  coef = (my_coef_ptr)
876
365
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
365
                                sizeof(my_coef_controller));
878
365
  memset(coef, 0, sizeof(my_coef_controller));
879
365
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
365
  coef->pub.start_input_pass = start_input_pass;
881
365
  coef->pub.start_output_pass = start_output_pass;
882
365
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
365
  coef->coef_bits_latch = NULL;
884
365
#endif
885
886
  /* Create the coefficient buffer. */
887
365
  if (need_full_buffer) {
888
331
#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
331
    int ci, access_rows;
893
331
    jpeg_component_info *compptr;
894
895
1.32k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
990
         ci++, compptr++) {
897
990
      access_rows = compptr->v_samp_factor;
898
990
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
990
      if (cinfo->progressive_mode)
901
972
        access_rows *= 5;
902
990
#endif
903
990
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
990
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
990
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
990
                               (long)compptr->h_samp_factor),
907
990
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
990
                               (long)compptr->v_samp_factor),
909
990
         (JDIMENSION)access_rows);
910
990
    }
911
331
    coef->pub.consume_data = consume_data;
912
331
    coef->pub._decompress_data = decompress_data;
913
331
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
331
  } else {
918
    /* We only need a single-MCU buffer. */
919
34
    JBLOCKROW buffer;
920
34
    int i;
921
922
34
    buffer = (JBLOCKROW)
923
34
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
34
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
374
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
340
      coef->MCU_buffer[i] = buffer + i;
927
340
    }
928
34
    coef->pub.consume_data = dummy_consume_data;
929
34
    coef->pub._decompress_data = decompress_onepass;
930
34
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
34
  }
932
933
  /* Allocate the workspace buffer */
934
365
  coef->workspace = (JCOEF *)
935
365
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
365
                                sizeof(JCOEF) * DCTSIZE2);
937
365
}