Coverage Report

Created: 2026-06-09 06:58

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