Coverage Report

Created: 2026-08-31 06:54

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
7.00k
{
51
7.00k
  cinfo->input_iMCU_row = 0;
52
7.00k
  start_iMCU_row(cinfo);
53
7.00k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
50
4.90k
{
51
4.90k
  cinfo->input_iMCU_row = 0;
52
4.90k
  start_iMCU_row(cinfo);
53
4.90k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
50
2.09k
{
51
2.09k
  cinfo->input_iMCU_row = 0;
52
2.09k
  start_iMCU_row(cinfo);
53
2.09k
}
54
55
56
/*
57
 * Initialize for an output processing pass.
58
 */
59
60
METHODDEF(void)
61
start_output_pass(j_decompress_ptr cinfo)
62
1.69k
{
63
1.69k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
1.69k
  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
1.69k
  if (coef->pub.coef_arrays != NULL) {
68
761
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
465
      coef->pub._decompress_data = decompress_smooth_data;
70
296
    else
71
296
      coef->pub._decompress_data = decompress_data;
72
761
  }
73
1.69k
#endif
74
1.69k
  cinfo->output_iMCU_row = 0;
75
1.69k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
62
1.60k
{
63
1.60k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
1.60k
  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
1.60k
  if (coef->pub.coef_arrays != NULL) {
68
676
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
423
      coef->pub._decompress_data = decompress_smooth_data;
70
253
    else
71
253
      coef->pub._decompress_data = decompress_data;
72
676
  }
73
1.60k
#endif
74
1.60k
  cinfo->output_iMCU_row = 0;
75
1.60k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
62
92
{
63
92
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
92
  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
92
  if (coef->pub.coef_arrays != NULL) {
68
85
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
42
      coef->pub._decompress_data = decompress_smooth_data;
70
43
    else
71
43
      coef->pub._decompress_data = decompress_data;
72
85
  }
73
92
#endif
74
92
  cinfo->output_iMCU_row = 0;
75
92
}
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
100k
{
91
100k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
100k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
100k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
100k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
100k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
100k
  _JSAMPARRAY output_ptr;
97
100k
  JDIMENSION start_col, output_col;
98
100k
  jpeg_component_info *compptr;
99
100k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
271k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
171k
       yoffset++) {
104
825k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
654k
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
654k
      jzero_far((void *)coef->MCU_buffer[0],
108
654k
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
654k
      if (!cinfo->entropy->insufficient_data)
110
654k
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
654k
      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
654k
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
653k
          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
653k
        blkn = 0;               /* index of current DCT block within MCU */
142
1.36M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
710k
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
710k
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
710k
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
710k
          useful_width = (MCU_col_num < last_MCU_col) ?
151
527k
                         compptr->MCU_width : compptr->last_col_width;
152
710k
          output_ptr = output_buf[compptr->component_index] +
153
710k
                       yoffset * compptr->_DCT_scaled_size;
154
710k
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
710k
                      compptr->MCU_sample_width;
156
1.44M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
738k
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
719k
                yoffset + yindex < compptr->last_row_height) {
159
719k
              output_col = start_col;
160
1.51M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
797k
                (*inverse_DCT) (cinfo, compptr,
165
797k
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
797k
                                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
797k
                output_col += compptr->_DCT_scaled_size;
173
797k
              }
174
719k
            }
175
738k
            blkn += compptr->MCU_width;
176
738k
            output_ptr += compptr->_DCT_scaled_size;
177
738k
          }
178
710k
        }
179
653k
      }
180
654k
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
171k
    coef->MCU_ctr = 0;
183
171k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
100k
  cinfo->output_iMCU_row++;
186
100k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
99.2k
    start_iMCU_row(cinfo);
188
99.2k
    return JPEG_ROW_COMPLETED;
189
99.2k
  }
190
  /* Completed the scan */
191
927
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
927
  return JPEG_SCAN_COMPLETED;
193
100k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
90
100k
{
91
100k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
100k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
100k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
100k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
100k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
100k
  _JSAMPARRAY output_ptr;
97
100k
  JDIMENSION start_col, output_col;
98
100k
  jpeg_component_info *compptr;
99
100k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
271k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
171k
       yoffset++) {
104
825k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
654k
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
654k
      jzero_far((void *)coef->MCU_buffer[0],
108
654k
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
654k
      if (!cinfo->entropy->insufficient_data)
110
654k
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
654k
      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
654k
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
653k
          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
653k
        blkn = 0;               /* index of current DCT block within MCU */
142
1.36M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
710k
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
710k
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
710k
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
710k
          useful_width = (MCU_col_num < last_MCU_col) ?
151
527k
                         compptr->MCU_width : compptr->last_col_width;
152
710k
          output_ptr = output_buf[compptr->component_index] +
153
710k
                       yoffset * compptr->_DCT_scaled_size;
154
710k
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
710k
                      compptr->MCU_sample_width;
156
1.44M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
738k
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
719k
                yoffset + yindex < compptr->last_row_height) {
159
719k
              output_col = start_col;
160
1.51M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
797k
                (*inverse_DCT) (cinfo, compptr,
165
797k
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
797k
                                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
797k
                output_col += compptr->_DCT_scaled_size;
173
797k
              }
174
719k
            }
175
738k
            blkn += compptr->MCU_width;
176
738k
            output_ptr += compptr->_DCT_scaled_size;
177
738k
          }
178
710k
        }
179
653k
      }
180
654k
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
171k
    coef->MCU_ctr = 0;
183
171k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
100k
  cinfo->output_iMCU_row++;
186
100k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
99.2k
    start_iMCU_row(cinfo);
188
99.2k
    return JPEG_ROW_COMPLETED;
189
99.2k
  }
190
  /* Completed the scan */
191
927
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
927
  return JPEG_SCAN_COMPLETED;
193
100k
}
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
846k
{
219
846k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
846k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
846k
  int blkn, ci, xindex, yindex, yoffset;
222
846k
  JDIMENSION start_col;
223
846k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
846k
  JBLOCKROW buffer_ptr;
225
846k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
1.82M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
976k
    compptr = cinfo->cur_comp_info[ci];
230
976k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
976k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
976k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
976k
       (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
976k
  }
239
240
  /* Loop to process one whole iMCU row */
241
2.18M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
1.34M
       yoffset++) {
243
8.33M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
6.99M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
6.99M
      blkn = 0;                 /* index of current DCT block within MCU */
247
15.7M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
8.79M
        compptr = cinfo->cur_comp_info[ci];
249
8.79M
        start_col = MCU_col_num * compptr->MCU_width;
250
19.1M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
10.4M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
23.0M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
12.5M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
12.5M
          }
255
10.4M
        }
256
8.79M
      }
257
6.99M
      if (!cinfo->entropy->insufficient_data)
258
6.99M
        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.99M
      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.99M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
1.34M
    coef->MCU_ctr = 0;
282
1.34M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
846k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
840k
    start_iMCU_row(cinfo);
286
840k
    return JPEG_ROW_COMPLETED;
287
840k
  }
288
  /* Completed the scan */
289
6.06k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
6.06k
  return JPEG_SCAN_COMPLETED;
291
846k
}
jdcoefct-8.c:consume_data
Line
Count
Source
218
576k
{
219
576k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
576k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
576k
  int blkn, ci, xindex, yindex, yoffset;
222
576k
  JDIMENSION start_col;
223
576k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
576k
  JBLOCKROW buffer_ptr;
225
576k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
1.18M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
604k
    compptr = cinfo->cur_comp_info[ci];
230
604k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
604k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
604k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
604k
       (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
604k
  }
239
240
  /* Loop to process one whole iMCU row */
241
1.48M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
904k
       yoffset++) {
243
6.51M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
5.61M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
5.61M
      blkn = 0;                 /* index of current DCT block within MCU */
247
12.5M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
6.92M
        compptr = cinfo->cur_comp_info[ci];
249
6.92M
        start_col = MCU_col_num * compptr->MCU_width;
250
14.8M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
7.87M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
17.1M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
9.26M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
9.26M
          }
255
7.87M
        }
256
6.92M
      }
257
5.61M
      if (!cinfo->entropy->insufficient_data)
258
5.61M
        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
5.61M
      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
5.61M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
904k
    coef->MCU_ctr = 0;
282
904k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
576k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
572k
    start_iMCU_row(cinfo);
286
572k
    return JPEG_ROW_COMPLETED;
287
572k
  }
288
  /* Completed the scan */
289
3.97k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
3.97k
  return JPEG_SCAN_COMPLETED;
291
576k
}
jdcoefct-12.c:consume_data
Line
Count
Source
218
269k
{
219
269k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
269k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
269k
  int blkn, ci, xindex, yindex, yoffset;
222
269k
  JDIMENSION start_col;
223
269k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
269k
  JBLOCKROW buffer_ptr;
225
269k
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
642k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
372k
    compptr = cinfo->cur_comp_info[ci];
230
372k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
372k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
372k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
372k
       (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
372k
  }
239
240
  /* Loop to process one whole iMCU row */
241
705k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
435k
       yoffset++) {
243
1.81M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
1.37M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
1.37M
      blkn = 0;                 /* index of current DCT block within MCU */
247
3.24M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
1.87M
        compptr = cinfo->cur_comp_info[ci];
249
1.87M
        start_col = MCU_col_num * compptr->MCU_width;
250
4.39M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
2.52M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
5.85M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
3.33M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
3.33M
          }
255
2.52M
        }
256
1.87M
      }
257
1.37M
      if (!cinfo->entropy->insufficient_data)
258
1.37M
        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.37M
      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.37M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
435k
    coef->MCU_ctr = 0;
282
435k
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
269k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
267k
    start_iMCU_row(cinfo);
286
267k
    return JPEG_ROW_COMPLETED;
287
267k
  }
288
  /* Completed the scan */
289
2.09k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
2.09k
  return JPEG_SCAN_COMPLETED;
291
269k
}
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
66.1k
{
305
66.1k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
66.1k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
66.1k
  JDIMENSION block_num;
308
66.1k
  int ci, block_row, block_rows;
309
66.1k
  JBLOCKARRAY buffer;
310
66.1k
  JBLOCKROW buffer_ptr;
311
66.1k
  _JSAMPARRAY output_ptr;
312
66.1k
  JDIMENSION output_col;
313
66.1k
  jpeg_component_info *compptr;
314
66.1k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
66.1k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
66.1k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
66.1k
          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
191k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
124k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
124k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
124k
    buffer = (*cinfo->mem->access_virt_barray)
332
124k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
124k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
124k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
124k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
124k
      block_rows = compptr->v_samp_factor;
338
558
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
558
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
558
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
558
    }
343
124k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
124k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
344k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
219k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
219k
      output_col = 0;
349
219k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
1.38M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
1.16M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.16M
                        output_col);
356
#ifdef WITH_PROFILE
357
        cinfo->master->idct_elapsed += getTime() - cinfo->master->start;
358
        cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
359
#endif
360
1.16M
        buffer_ptr++;
361
1.16M
        output_col += compptr->_DCT_scaled_size;
362
1.16M
      }
363
219k
      output_ptr += compptr->_DCT_scaled_size;
364
219k
    }
365
124k
  }
366
367
66.1k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
65.9k
    return JPEG_ROW_COMPLETED;
369
253
  return JPEG_SCAN_COMPLETED;
370
66.1k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
304
66.1k
{
305
66.1k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
66.1k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
66.1k
  JDIMENSION block_num;
308
66.1k
  int ci, block_row, block_rows;
309
66.1k
  JBLOCKARRAY buffer;
310
66.1k
  JBLOCKROW buffer_ptr;
311
66.1k
  _JSAMPARRAY output_ptr;
312
66.1k
  JDIMENSION output_col;
313
66.1k
  jpeg_component_info *compptr;
314
66.1k
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
66.1k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
66.1k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
66.1k
          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
191k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
124k
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
124k
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
124k
    buffer = (*cinfo->mem->access_virt_barray)
332
124k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
124k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
124k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
124k
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
124k
      block_rows = compptr->v_samp_factor;
338
558
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
558
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
558
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
558
    }
343
124k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
124k
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
344k
    for (block_row = 0; block_row < block_rows; block_row++) {
347
219k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
219k
      output_col = 0;
349
219k
      for (block_num = cinfo->master->first_MCU_col[ci];
350
1.38M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
1.16M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
1.16M
                        output_col);
356
#ifdef WITH_PROFILE
357
        cinfo->master->idct_elapsed += getTime() - cinfo->master->start;
358
        cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
359
#endif
360
1.16M
        buffer_ptr++;
361
1.16M
        output_col += compptr->_DCT_scaled_size;
362
1.16M
      }
363
219k
      output_ptr += compptr->_DCT_scaled_size;
364
219k
    }
365
124k
  }
366
367
66.1k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
65.9k
    return JPEG_ROW_COMPLETED;
369
253
  return JPEG_SCAN_COMPLETED;
370
66.1k
}
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
125k
#define Q01_POS  1
386
125k
#define Q10_POS  8
387
124k
#define Q20_POS  16
388
124k
#define Q11_POS  9
389
124k
#define Q02_POS  2
390
68.0k
#define Q03_POS  3
391
67.9k
#define Q12_POS  10
392
67.9k
#define Q21_POS  17
393
67.9k
#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
761
{
406
761
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
761
  boolean smoothing_useful = FALSE;
408
761
  int ci, coefi;
409
761
  jpeg_component_info *compptr;
410
761
  JQUANT_TBL *qtable;
411
761
  int *coef_bits, *prev_coef_bits;
412
761
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
761
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
47
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
714
  if (coef->coef_bits_latch == NULL)
419
714
    coef->coef_bits_latch = (int *)
420
714
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
714
                                  cinfo->num_components * 2 *
422
714
                                  (SAVED_COEFS * sizeof(int)));
423
714
  coef_bits_latch = coef->coef_bits_latch;
424
714
  prev_coef_bits_latch =
425
714
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
1.25k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
782
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
782
    if ((qtable = compptr->quant_table) == NULL)
431
62
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
720
    if (qtable->quantval[0] == 0 ||
434
700
        qtable->quantval[Q01_POS] == 0 ||
435
654
        qtable->quantval[Q10_POS] == 0 ||
436
633
        qtable->quantval[Q20_POS] == 0 ||
437
606
        qtable->quantval[Q11_POS] == 0 ||
438
596
        qtable->quantval[Q02_POS] == 0 ||
439
577
        qtable->quantval[Q03_POS] == 0 ||
440
565
        qtable->quantval[Q12_POS] == 0 ||
441
559
        qtable->quantval[Q21_POS] == 0 ||
442
548
        qtable->quantval[Q30_POS] == 0)
443
183
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
537
    coef_bits = cinfo->coef_bits[ci];
446
537
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
537
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
537
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
5.37k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
4.83k
      if (cinfo->input_scan_number > 1)
453
2.34k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
2.48k
      else
455
2.48k
        prev_coef_bits_latch[coefi] = -1;
456
4.83k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
4.83k
      if (coef_bits[coefi] != 0)
458
4.52k
        smoothing_useful = TRUE;
459
4.83k
    }
460
537
    coef_bits_latch += SAVED_COEFS;
461
537
    prev_coef_bits_latch += SAVED_COEFS;
462
537
  }
463
464
469
  return smoothing_useful;
465
714
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
405
676
{
406
676
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
676
  boolean smoothing_useful = FALSE;
408
676
  int ci, coefi;
409
676
  jpeg_component_info *compptr;
410
676
  JQUANT_TBL *qtable;
411
676
  int *coef_bits, *prev_coef_bits;
412
676
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
676
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
42
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
634
  if (coef->coef_bits_latch == NULL)
419
634
    coef->coef_bits_latch = (int *)
420
634
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
634
                                  cinfo->num_components * 2 *
422
634
                                  (SAVED_COEFS * sizeof(int)));
423
634
  coef_bits_latch = coef->coef_bits_latch;
424
634
  prev_coef_bits_latch =
425
634
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
1.10k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
682
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
682
    if ((qtable = compptr->quant_table) == NULL)
431
56
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
626
    if (qtable->quantval[0] == 0 ||
434
607
        qtable->quantval[Q01_POS] == 0 ||
435
564
        qtable->quantval[Q10_POS] == 0 ||
436
549
        qtable->quantval[Q20_POS] == 0 ||
437
525
        qtable->quantval[Q11_POS] == 0 ||
438
517
        qtable->quantval[Q02_POS] == 0 ||
439
503
        qtable->quantval[Q03_POS] == 0 ||
440
493
        qtable->quantval[Q12_POS] == 0 ||
441
489
        qtable->quantval[Q21_POS] == 0 ||
442
481
        qtable->quantval[Q30_POS] == 0)
443
153
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
473
    coef_bits = cinfo->coef_bits[ci];
446
473
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
473
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
473
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
4.73k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
4.25k
      if (cinfo->input_scan_number > 1)
453
2.10k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
2.15k
      else
455
2.15k
        prev_coef_bits_latch[coefi] = -1;
456
4.25k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
4.25k
      if (coef_bits[coefi] != 0)
458
4.03k
        smoothing_useful = TRUE;
459
4.25k
    }
460
473
    coef_bits_latch += SAVED_COEFS;
461
473
    prev_coef_bits_latch += SAVED_COEFS;
462
473
  }
463
464
425
  return smoothing_useful;
465
634
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
405
85
{
406
85
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
85
  boolean smoothing_useful = FALSE;
408
85
  int ci, coefi;
409
85
  jpeg_component_info *compptr;
410
85
  JQUANT_TBL *qtable;
411
85
  int *coef_bits, *prev_coef_bits;
412
85
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
85
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
5
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
80
  if (coef->coef_bits_latch == NULL)
419
80
    coef->coef_bits_latch = (int *)
420
80
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
80
                                  cinfo->num_components * 2 *
422
80
                                  (SAVED_COEFS * sizeof(int)));
423
80
  coef_bits_latch = coef->coef_bits_latch;
424
80
  prev_coef_bits_latch =
425
80
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
144
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
100
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
100
    if ((qtable = compptr->quant_table) == NULL)
431
6
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
94
    if (qtable->quantval[0] == 0 ||
434
93
        qtable->quantval[Q01_POS] == 0 ||
435
90
        qtable->quantval[Q10_POS] == 0 ||
436
84
        qtable->quantval[Q20_POS] == 0 ||
437
81
        qtable->quantval[Q11_POS] == 0 ||
438
79
        qtable->quantval[Q02_POS] == 0 ||
439
74
        qtable->quantval[Q03_POS] == 0 ||
440
72
        qtable->quantval[Q12_POS] == 0 ||
441
70
        qtable->quantval[Q21_POS] == 0 ||
442
67
        qtable->quantval[Q30_POS] == 0)
443
30
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
64
    coef_bits = cinfo->coef_bits[ci];
446
64
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
64
    if (coef_bits[0] < 0)
448
0
      return FALSE;
449
64
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
640
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
576
      if (cinfo->input_scan_number > 1)
453
243
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
333
      else
455
333
        prev_coef_bits_latch[coefi] = -1;
456
576
      coef_bits_latch[coefi] = coef_bits[coefi];
457
576
      if (coef_bits[coefi] != 0)
458
493
        smoothing_useful = TRUE;
459
576
    }
460
64
    coef_bits_latch += SAVED_COEFS;
461
64
    prev_coef_bits_latch += SAVED_COEFS;
462
64
  }
463
464
44
  return smoothing_useful;
465
80
}
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
120k
{
475
120k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
120k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
120k
  JDIMENSION block_num, last_block_column;
478
120k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
120k
    image_block_rows;
480
120k
  JBLOCKARRAY buffer;
481
120k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
120k
  JBLOCKROW next_block_row, next_next_block_row;
483
120k
  _JSAMPARRAY output_ptr;
484
120k
  JDIMENSION output_col;
485
120k
  jpeg_component_info *compptr;
486
120k
  _inverse_DCT_method_ptr inverse_DCT;
487
120k
  boolean change_dc;
488
120k
  JCOEF *workspace;
489
120k
  int *coef_bits;
490
120k
  JQUANT_TBL *quanttbl;
491
120k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
120k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
120k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
120k
      DC25;
495
120k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
120k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
120k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
120k
         !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
245k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
124k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
124k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
124k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
123k
      block_rows = compptr->v_samp_factor;
526
123k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
123k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
398
      block_rows = compptr->v_samp_factor;
529
398
      access_rows = block_rows * 2; /* this and next iMCU row */
530
452
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
452
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
452
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
452
      access_rows = block_rows; /* this iMCU row only */
535
452
    }
536
    /* Align the virtual buffer for this component. */
537
124k
    if (cinfo->output_iMCU_row > 1) {
538
123k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
123k
      buffer = (*cinfo->mem->access_virt_barray)
540
123k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
123k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
123k
         (JDIMENSION)access_rows, FALSE);
543
123k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
123k
    } else if (cinfo->output_iMCU_row > 0) {
545
398
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
398
      buffer = (*cinfo->mem->access_virt_barray)
547
398
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
398
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
398
         (JDIMENSION)access_rows, FALSE);
550
398
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
452
    } else {
552
452
      buffer = (*cinfo->mem->access_virt_barray)
553
452
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
452
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
452
    }
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
124k
    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
124k
    else
564
124k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
124k
    change_dc =
568
124k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
101k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
73.8k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
124k
    quanttbl = compptr->quant_table;
573
124k
    Q00 = quanttbl->quantval[0];
574
124k
    Q01 = quanttbl->quantval[Q01_POS];
575
124k
    Q10 = quanttbl->quantval[Q10_POS];
576
124k
    Q20 = quanttbl->quantval[Q20_POS];
577
124k
    Q11 = quanttbl->quantval[Q11_POS];
578
124k
    Q02 = quanttbl->quantval[Q02_POS];
579
124k
    if (change_dc) {
580
67.4k
      Q03 = quanttbl->quantval[Q03_POS];
581
67.4k
      Q12 = quanttbl->quantval[Q12_POS];
582
67.4k
      Q21 = quanttbl->quantval[Q21_POS];
583
67.4k
      Q30 = quanttbl->quantval[Q30_POS];
584
67.4k
    }
585
124k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
124k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
124k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
345k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
221k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
221k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
221k
      if (image_block_row > 0)
594
221k
        prev_block_row =
595
221k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
452
      else
597
452
        prev_block_row = buffer_ptr;
598
599
221k
      if (image_block_row > 1)
600
220k
        prev_prev_block_row =
601
220k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
912
      else
603
912
        prev_prev_block_row = prev_block_row;
604
605
221k
      if (image_block_row < image_block_rows - 1)
606
221k
        next_block_row =
607
221k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
452
      else
609
452
        next_block_row = buffer_ptr;
610
611
221k
      if (image_block_row < image_block_rows - 2)
612
220k
        next_next_block_row =
613
220k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
772
      else
615
772
        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
221k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
221k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
221k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
221k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
221k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
221k
      output_col = 0;
626
221k
      last_block_column = compptr->width_in_blocks - 1;
627
221k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
1.81M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
1.59M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
1.59M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
221k
            block_num < last_block_column) {
634
92.1k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
92.1k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
92.1k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
92.1k
          DC19 = DC20 = (int)next_block_row[1][0];
638
92.1k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
92.1k
        }
640
1.59M
        if (block_num + 1 < last_block_column) {
641
1.28M
          DC05 = (int)prev_prev_block_row[2][0];
642
1.28M
          DC10 = (int)prev_block_row[2][0];
643
1.28M
          DC15 = (int)buffer_ptr[2][0];
644
1.28M
          DC20 = (int)next_block_row[2][0];
645
1.28M
          DC25 = (int)next_next_block_row[2][0];
646
1.28M
        }
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
1.59M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
1.53M
          num = Q00 * (change_dc ?
660
912k
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
912k
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
912k
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
912k
                 DC21 - DC22 + DC24 + DC25) :
664
1.53M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
1.53M
          if (num >= 0) {
666
1.12M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
1.12M
            if (Al > 0 && pred >= (1 << Al))
668
128k
              pred = (1 << Al) - 1;
669
1.12M
          } else {
670
405k
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
405k
            if (Al > 0 && pred >= (1 << Al))
672
70.1k
              pred = (1 << Al) - 1;
673
405k
            pred = -pred;
674
405k
          }
675
1.53M
          workspace[1] = (JCOEF)pred;
676
1.53M
        }
677
        /* AC10 */
678
1.59M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
1.53M
          num = Q00 * (change_dc ?
680
912k
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
912k
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
912k
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
912k
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
1.53M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
1.53M
          if (num >= 0) {
686
1.02M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
1.02M
            if (Al > 0 && pred >= (1 << Al))
688
153k
              pred = (1 << Al) - 1;
689
1.02M
          } else {
690
507k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
507k
            if (Al > 0 && pred >= (1 << Al))
692
141k
              pred = (1 << Al) - 1;
693
507k
            pred = -pred;
694
507k
          }
695
1.53M
          workspace[8] = (JCOEF)pred;
696
1.53M
        }
697
        /* AC20 */
698
1.59M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
1.54M
          num = Q00 * (change_dc ?
700
912k
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
912k
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
1.54M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
1.54M
          if (num >= 0) {
704
826k
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
826k
            if (Al > 0 && pred >= (1 << Al))
706
139k
              pred = (1 << Al) - 1;
707
826k
          } else {
708
715k
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
715k
            if (Al > 0 && pred >= (1 << Al))
710
139k
              pred = (1 << Al) - 1;
711
715k
            pred = -pred;
712
715k
          }
713
1.54M
          workspace[16] = (JCOEF)pred;
714
1.54M
        }
715
        /* AC11 */
716
1.59M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
1.54M
          num = Q00 * (change_dc ?
718
912k
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
912k
                 9 * DC19 + DC21 - DC25) :
720
1.54M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
631k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
1.54M
          if (num >= 0) {
723
1.10M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
1.10M
            if (Al > 0 && pred >= (1 << Al))
725
80.3k
              pred = (1 << Al) - 1;
726
1.10M
          } else {
727
435k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
435k
            if (Al > 0 && pred >= (1 << Al))
729
80.8k
              pred = (1 << Al) - 1;
730
435k
            pred = -pred;
731
435k
          }
732
1.54M
          workspace[9] = (JCOEF)pred;
733
1.54M
        }
734
        /* AC02 */
735
1.59M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
1.53M
          num = Q00 * (change_dc ?
737
912k
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
912k
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
1.53M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
1.53M
          if (num >= 0) {
741
839k
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
839k
            if (Al > 0 && pred >= (1 << Al))
743
117k
              pred = (1 << Al) - 1;
744
839k
          } else {
745
697k
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
697k
            if (Al > 0 && pred >= (1 << Al))
747
116k
              pred = (1 << Al) - 1;
748
697k
            pred = -pred;
749
697k
          }
750
1.53M
          workspace[2] = (JCOEF)pred;
751
1.53M
        }
752
1.59M
        if (change_dc) {
753
          /* AC03 */
754
912k
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
912k
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
912k
            if (num >= 0) {
757
686k
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
686k
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
686k
            } else {
761
226k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
226k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
226k
              pred = -pred;
765
226k
            }
766
912k
            workspace[3] = (JCOEF)pred;
767
912k
          }
768
          /* AC12 */
769
912k
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
912k
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
912k
            if (num >= 0) {
772
373k
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
373k
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
538k
            } else {
776
538k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
538k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
538k
              pred = -pred;
780
538k
            }
781
912k
            workspace[10] = (JCOEF)pred;
782
912k
          }
783
          /* AC21 */
784
912k
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
912k
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
912k
            if (num >= 0) {
787
367k
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
367k
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
544k
            } else {
791
544k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
544k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
544k
              pred = -pred;
795
544k
            }
796
912k
            workspace[17] = (JCOEF)pred;
797
912k
          }
798
          /* AC30 */
799
912k
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
912k
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
912k
            if (num >= 0) {
802
628k
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
628k
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
628k
            } else {
806
283k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
283k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
283k
              pred = -pred;
810
283k
            }
811
912k
            workspace[24] = (JCOEF)pred;
812
912k
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
912k
          num = Q00 *
817
912k
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
912k
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
912k
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
912k
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
912k
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
912k
          if (num >= 0) {
823
346k
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
565k
          } else {
825
565k
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
565k
            pred = -pred;
827
565k
          }
828
912k
          workspace[0] = (JCOEF)pred;
829
912k
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
1.59M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
1.59M
                        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
1.59M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
1.59M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
1.59M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
1.59M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
1.59M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
1.59M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
1.59M
          prev_prev_block_row++, next_next_block_row++;
849
1.59M
        output_col += compptr->_DCT_scaled_size;
850
1.59M
      }
851
221k
      output_ptr += compptr->_DCT_scaled_size;
852
221k
    }
853
124k
  }
854
855
120k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
120k
    return JPEG_ROW_COMPLETED;
857
423
  return JPEG_SCAN_COMPLETED;
858
120k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
474
120k
{
475
120k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
120k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
120k
  JDIMENSION block_num, last_block_column;
478
120k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
120k
    image_block_rows;
480
120k
  JBLOCKARRAY buffer;
481
120k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
120k
  JBLOCKROW next_block_row, next_next_block_row;
483
120k
  _JSAMPARRAY output_ptr;
484
120k
  JDIMENSION output_col;
485
120k
  jpeg_component_info *compptr;
486
120k
  _inverse_DCT_method_ptr inverse_DCT;
487
120k
  boolean change_dc;
488
120k
  JCOEF *workspace;
489
120k
  int *coef_bits;
490
120k
  JQUANT_TBL *quanttbl;
491
120k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
120k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
120k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
120k
      DC25;
495
120k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
120k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
120k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
120k
         !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
245k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
124k
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
124k
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
124k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
123k
      block_rows = compptr->v_samp_factor;
526
123k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
123k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
398
      block_rows = compptr->v_samp_factor;
529
398
      access_rows = block_rows * 2; /* this and next iMCU row */
530
452
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
452
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
452
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
452
      access_rows = block_rows; /* this iMCU row only */
535
452
    }
536
    /* Align the virtual buffer for this component. */
537
124k
    if (cinfo->output_iMCU_row > 1) {
538
123k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
123k
      buffer = (*cinfo->mem->access_virt_barray)
540
123k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
123k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
123k
         (JDIMENSION)access_rows, FALSE);
543
123k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
123k
    } else if (cinfo->output_iMCU_row > 0) {
545
398
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
398
      buffer = (*cinfo->mem->access_virt_barray)
547
398
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
398
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
398
         (JDIMENSION)access_rows, FALSE);
550
398
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
452
    } else {
552
452
      buffer = (*cinfo->mem->access_virt_barray)
553
452
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
452
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
452
    }
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
124k
    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
124k
    else
564
124k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
124k
    change_dc =
568
124k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
101k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
73.8k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
124k
    quanttbl = compptr->quant_table;
573
124k
    Q00 = quanttbl->quantval[0];
574
124k
    Q01 = quanttbl->quantval[Q01_POS];
575
124k
    Q10 = quanttbl->quantval[Q10_POS];
576
124k
    Q20 = quanttbl->quantval[Q20_POS];
577
124k
    Q11 = quanttbl->quantval[Q11_POS];
578
124k
    Q02 = quanttbl->quantval[Q02_POS];
579
124k
    if (change_dc) {
580
67.4k
      Q03 = quanttbl->quantval[Q03_POS];
581
67.4k
      Q12 = quanttbl->quantval[Q12_POS];
582
67.4k
      Q21 = quanttbl->quantval[Q21_POS];
583
67.4k
      Q30 = quanttbl->quantval[Q30_POS];
584
67.4k
    }
585
124k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
124k
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
124k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
345k
    for (block_row = 0; block_row < block_rows; block_row++) {
590
221k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
221k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
221k
      if (image_block_row > 0)
594
221k
        prev_block_row =
595
221k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
452
      else
597
452
        prev_block_row = buffer_ptr;
598
599
221k
      if (image_block_row > 1)
600
220k
        prev_prev_block_row =
601
220k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
912
      else
603
912
        prev_prev_block_row = prev_block_row;
604
605
221k
      if (image_block_row < image_block_rows - 1)
606
221k
        next_block_row =
607
221k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
452
      else
609
452
        next_block_row = buffer_ptr;
610
611
221k
      if (image_block_row < image_block_rows - 2)
612
220k
        next_next_block_row =
613
220k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
772
      else
615
772
        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
221k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
221k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
221k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
221k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
221k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
221k
      output_col = 0;
626
221k
      last_block_column = compptr->width_in_blocks - 1;
627
221k
      for (block_num = cinfo->master->first_MCU_col[ci];
628
1.81M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
1.59M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
1.59M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
221k
            block_num < last_block_column) {
634
92.1k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
92.1k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
92.1k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
92.1k
          DC19 = DC20 = (int)next_block_row[1][0];
638
92.1k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
92.1k
        }
640
1.59M
        if (block_num + 1 < last_block_column) {
641
1.28M
          DC05 = (int)prev_prev_block_row[2][0];
642
1.28M
          DC10 = (int)prev_block_row[2][0];
643
1.28M
          DC15 = (int)buffer_ptr[2][0];
644
1.28M
          DC20 = (int)next_block_row[2][0];
645
1.28M
          DC25 = (int)next_next_block_row[2][0];
646
1.28M
        }
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
1.59M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
1.53M
          num = Q00 * (change_dc ?
660
912k
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
912k
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
912k
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
912k
                 DC21 - DC22 + DC24 + DC25) :
664
1.53M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
1.53M
          if (num >= 0) {
666
1.12M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
1.12M
            if (Al > 0 && pred >= (1 << Al))
668
128k
              pred = (1 << Al) - 1;
669
1.12M
          } else {
670
405k
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
405k
            if (Al > 0 && pred >= (1 << Al))
672
70.1k
              pred = (1 << Al) - 1;
673
405k
            pred = -pred;
674
405k
          }
675
1.53M
          workspace[1] = (JCOEF)pred;
676
1.53M
        }
677
        /* AC10 */
678
1.59M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
1.53M
          num = Q00 * (change_dc ?
680
912k
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
912k
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
912k
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
912k
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
1.53M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
1.53M
          if (num >= 0) {
686
1.02M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
1.02M
            if (Al > 0 && pred >= (1 << Al))
688
153k
              pred = (1 << Al) - 1;
689
1.02M
          } else {
690
507k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
507k
            if (Al > 0 && pred >= (1 << Al))
692
141k
              pred = (1 << Al) - 1;
693
507k
            pred = -pred;
694
507k
          }
695
1.53M
          workspace[8] = (JCOEF)pred;
696
1.53M
        }
697
        /* AC20 */
698
1.59M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
1.54M
          num = Q00 * (change_dc ?
700
912k
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
912k
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
1.54M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
1.54M
          if (num >= 0) {
704
826k
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
826k
            if (Al > 0 && pred >= (1 << Al))
706
139k
              pred = (1 << Al) - 1;
707
826k
          } else {
708
715k
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
715k
            if (Al > 0 && pred >= (1 << Al))
710
139k
              pred = (1 << Al) - 1;
711
715k
            pred = -pred;
712
715k
          }
713
1.54M
          workspace[16] = (JCOEF)pred;
714
1.54M
        }
715
        /* AC11 */
716
1.59M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
1.54M
          num = Q00 * (change_dc ?
718
912k
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
912k
                 9 * DC19 + DC21 - DC25) :
720
1.54M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
631k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
1.54M
          if (num >= 0) {
723
1.10M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
1.10M
            if (Al > 0 && pred >= (1 << Al))
725
80.3k
              pred = (1 << Al) - 1;
726
1.10M
          } else {
727
435k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
435k
            if (Al > 0 && pred >= (1 << Al))
729
80.8k
              pred = (1 << Al) - 1;
730
435k
            pred = -pred;
731
435k
          }
732
1.54M
          workspace[9] = (JCOEF)pred;
733
1.54M
        }
734
        /* AC02 */
735
1.59M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
1.53M
          num = Q00 * (change_dc ?
737
912k
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
912k
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
1.53M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
1.53M
          if (num >= 0) {
741
839k
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
839k
            if (Al > 0 && pred >= (1 << Al))
743
117k
              pred = (1 << Al) - 1;
744
839k
          } else {
745
697k
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
697k
            if (Al > 0 && pred >= (1 << Al))
747
116k
              pred = (1 << Al) - 1;
748
697k
            pred = -pred;
749
697k
          }
750
1.53M
          workspace[2] = (JCOEF)pred;
751
1.53M
        }
752
1.59M
        if (change_dc) {
753
          /* AC03 */
754
912k
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
912k
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
912k
            if (num >= 0) {
757
686k
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
686k
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
686k
            } else {
761
226k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
226k
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
226k
              pred = -pred;
765
226k
            }
766
912k
            workspace[3] = (JCOEF)pred;
767
912k
          }
768
          /* AC12 */
769
912k
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
912k
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
912k
            if (num >= 0) {
772
373k
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
373k
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
538k
            } else {
776
538k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
538k
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
538k
              pred = -pred;
780
538k
            }
781
912k
            workspace[10] = (JCOEF)pred;
782
912k
          }
783
          /* AC21 */
784
912k
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
912k
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
912k
            if (num >= 0) {
787
367k
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
367k
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
544k
            } else {
791
544k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
544k
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
544k
              pred = -pred;
795
544k
            }
796
912k
            workspace[17] = (JCOEF)pred;
797
912k
          }
798
          /* AC30 */
799
912k
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
912k
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
912k
            if (num >= 0) {
802
628k
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
628k
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
628k
            } else {
806
283k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
283k
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
283k
              pred = -pred;
810
283k
            }
811
912k
            workspace[24] = (JCOEF)pred;
812
912k
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
912k
          num = Q00 *
817
912k
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
912k
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
912k
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
912k
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
912k
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
912k
          if (num >= 0) {
823
346k
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
565k
          } else {
825
565k
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
565k
            pred = -pred;
827
565k
          }
828
912k
          workspace[0] = (JCOEF)pred;
829
912k
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
1.59M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
1.59M
                        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
1.59M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
1.59M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
1.59M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
1.59M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
1.59M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
1.59M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
1.59M
          prev_prev_block_row++, next_next_block_row++;
849
1.59M
        output_col += compptr->_DCT_scaled_size;
850
1.59M
      }
851
221k
      output_ptr += compptr->_DCT_scaled_size;
852
221k
    }
853
124k
  }
854
855
120k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
120k
    return JPEG_ROW_COMPLETED;
857
423
  return JPEG_SCAN_COMPLETED;
858
120k
}
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
3.27k
{
870
3.27k
  my_coef_ptr coef;
871
872
3.27k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
3.27k
  coef = (my_coef_ptr)
876
3.27k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
3.27k
                                sizeof(my_coef_controller));
878
3.27k
  memset(coef, 0, sizeof(my_coef_controller));
879
3.27k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
3.27k
  coef->pub.start_input_pass = start_input_pass;
881
3.27k
  coef->pub.start_output_pass = start_output_pass;
882
3.27k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
3.27k
  coef->coef_bits_latch = NULL;
884
3.27k
#endif
885
886
  /* Create the coefficient buffer. */
887
3.27k
  if (need_full_buffer) {
888
2.29k
#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.29k
    int ci, access_rows;
893
2.29k
    jpeg_component_info *compptr;
894
895
6.90k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
4.60k
         ci++, compptr++) {
897
4.60k
      access_rows = compptr->v_samp_factor;
898
4.60k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
4.60k
      if (cinfo->progressive_mode)
901
3.43k
        access_rows *= 5;
902
4.60k
#endif
903
4.60k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
4.60k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
4.60k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
4.60k
                               (long)compptr->h_samp_factor),
907
4.60k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
4.60k
                               (long)compptr->v_samp_factor),
909
4.60k
         (JDIMENSION)access_rows);
910
4.60k
    }
911
2.29k
    coef->pub.consume_data = consume_data;
912
2.29k
    coef->pub._decompress_data = decompress_data;
913
2.29k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
2.29k
  } else {
918
    /* We only need a single-MCU buffer. */
919
973
    JBLOCKROW buffer;
920
973
    int i;
921
922
973
    buffer = (JBLOCKROW)
923
973
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
973
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
10.7k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
9.73k
      coef->MCU_buffer[i] = buffer + i;
927
9.73k
    }
928
973
    coef->pub.consume_data = dummy_consume_data;
929
973
    coef->pub._decompress_data = decompress_onepass;
930
973
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
973
  }
932
933
  /* Allocate the workspace buffer */
934
3.27k
  coef->workspace = (JCOEF *)
935
3.27k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
3.27k
                                sizeof(JCOEF) * DCTSIZE2);
937
3.27k
}
jinit_d_coef_controller
Line
Count
Source
869
2.64k
{
870
2.64k
  my_coef_ptr coef;
871
872
2.64k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
2.64k
  coef = (my_coef_ptr)
876
2.64k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
2.64k
                                sizeof(my_coef_controller));
878
2.64k
  memset(coef, 0, sizeof(my_coef_controller));
879
2.64k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
2.64k
  coef->pub.start_input_pass = start_input_pass;
881
2.64k
  coef->pub.start_output_pass = start_output_pass;
882
2.64k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
2.64k
  coef->coef_bits_latch = NULL;
884
2.64k
#endif
885
886
  /* Create the coefficient buffer. */
887
2.64k
  if (need_full_buffer) {
888
1.68k
#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
1.68k
    int ci, access_rows;
893
1.68k
    jpeg_component_info *compptr;
894
895
4.90k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
3.22k
         ci++, compptr++) {
897
3.22k
      access_rows = compptr->v_samp_factor;
898
3.22k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
3.22k
      if (cinfo->progressive_mode)
901
2.50k
        access_rows *= 5;
902
3.22k
#endif
903
3.22k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
3.22k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
3.22k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
3.22k
                               (long)compptr->h_samp_factor),
907
3.22k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
3.22k
                               (long)compptr->v_samp_factor),
909
3.22k
         (JDIMENSION)access_rows);
910
3.22k
    }
911
1.68k
    coef->pub.consume_data = consume_data;
912
1.68k
    coef->pub._decompress_data = decompress_data;
913
1.68k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
1.68k
  } else {
918
    /* We only need a single-MCU buffer. */
919
961
    JBLOCKROW buffer;
920
961
    int i;
921
922
961
    buffer = (JBLOCKROW)
923
961
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
961
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
10.5k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
9.61k
      coef->MCU_buffer[i] = buffer + i;
927
9.61k
    }
928
961
    coef->pub.consume_data = dummy_consume_data;
929
961
    coef->pub._decompress_data = decompress_onepass;
930
961
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
961
  }
932
933
  /* Allocate the workspace buffer */
934
2.64k
  coef->workspace = (JCOEF *)
935
2.64k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
2.64k
                                sizeof(JCOEF) * DCTSIZE2);
937
2.64k
}
j12init_d_coef_controller
Line
Count
Source
869
629
{
870
629
  my_coef_ptr coef;
871
872
629
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
629
  coef = (my_coef_ptr)
876
629
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
629
                                sizeof(my_coef_controller));
878
629
  memset(coef, 0, sizeof(my_coef_controller));
879
629
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
629
  coef->pub.start_input_pass = start_input_pass;
881
629
  coef->pub.start_output_pass = start_output_pass;
882
629
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
629
  coef->coef_bits_latch = NULL;
884
629
#endif
885
886
  /* Create the coefficient buffer. */
887
629
  if (need_full_buffer) {
888
617
#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
617
    int ci, access_rows;
893
617
    jpeg_component_info *compptr;
894
895
1.99k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
1.37k
         ci++, compptr++) {
897
1.37k
      access_rows = compptr->v_samp_factor;
898
1.37k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
1.37k
      if (cinfo->progressive_mode)
901
928
        access_rows *= 5;
902
1.37k
#endif
903
1.37k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
1.37k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
1.37k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
1.37k
                               (long)compptr->h_samp_factor),
907
1.37k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
1.37k
                               (long)compptr->v_samp_factor),
909
1.37k
         (JDIMENSION)access_rows);
910
1.37k
    }
911
617
    coef->pub.consume_data = consume_data;
912
617
    coef->pub._decompress_data = decompress_data;
913
617
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
617
  } else {
918
    /* We only need a single-MCU buffer. */
919
12
    JBLOCKROW buffer;
920
12
    int i;
921
922
12
    buffer = (JBLOCKROW)
923
12
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
12
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
132
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
120
      coef->MCU_buffer[i] = buffer + i;
927
120
    }
928
12
    coef->pub.consume_data = dummy_consume_data;
929
12
    coef->pub._decompress_data = decompress_onepass;
930
12
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
12
  }
932
933
  /* Allocate the workspace buffer */
934
629
  coef->workspace = (JCOEF *)
935
629
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
629
                                sizeof(JCOEF) * DCTSIZE2);
937
629
}