Coverage Report

Created: 2026-04-12 06:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libjpeg-turbo.main/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
77.9k
{
51
77.9k
  cinfo->input_iMCU_row = 0;
52
77.9k
  start_iMCU_row(cinfo);
53
77.9k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
50
74.5k
{
51
74.5k
  cinfo->input_iMCU_row = 0;
52
74.5k
  start_iMCU_row(cinfo);
53
74.5k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
50
3.35k
{
51
3.35k
  cinfo->input_iMCU_row = 0;
52
3.35k
  start_iMCU_row(cinfo);
53
3.35k
}
54
55
56
/*
57
 * Initialize for an output processing pass.
58
 */
59
60
METHODDEF(void)
61
start_output_pass(j_decompress_ptr cinfo)
62
7.12k
{
63
7.12k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
7.12k
  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
7.12k
  if (coef->pub.coef_arrays != NULL) {
68
4.89k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
1.70k
      coef->pub._decompress_data = decompress_smooth_data;
70
3.19k
    else
71
3.19k
      coef->pub._decompress_data = decompress_data;
72
4.89k
  }
73
7.12k
#endif
74
7.12k
  cinfo->output_iMCU_row = 0;
75
7.12k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
62
6.24k
{
63
6.24k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
6.24k
  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
6.24k
  if (coef->pub.coef_arrays != NULL) {
68
4.06k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
1.55k
      coef->pub._decompress_data = decompress_smooth_data;
70
2.50k
    else
71
2.50k
      coef->pub._decompress_data = decompress_data;
72
4.06k
  }
73
6.24k
#endif
74
6.24k
  cinfo->output_iMCU_row = 0;
75
6.24k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
62
881
{
63
881
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
881
  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
881
  if (coef->pub.coef_arrays != NULL) {
68
833
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
144
      coef->pub._decompress_data = decompress_smooth_data;
70
689
    else
71
689
      coef->pub._decompress_data = decompress_data;
72
833
  }
73
881
#endif
74
881
  cinfo->output_iMCU_row = 0;
75
881
}
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
472k
{
91
472k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
472k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
472k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
472k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
472k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
472k
  _JSAMPARRAY output_ptr;
97
472k
  JDIMENSION start_col, output_col;
98
472k
  jpeg_component_info *compptr;
99
472k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
1.15M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
683k
       yoffset++) {
104
12.4M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
11.7M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
11.7M
      jzero_far((void *)coef->MCU_buffer[0],
108
11.7M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
11.7M
      if (!cinfo->entropy->insufficient_data)
110
1.83M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
11.7M
      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
11.7M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
11.7M
          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
11.7M
        blkn = 0;               /* index of current DCT block within MCU */
142
23.6M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
11.9M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
11.9M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
11.9M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
11.9M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
11.2M
                         compptr->MCU_width : compptr->last_col_width;
152
11.9M
          output_ptr = output_buf[compptr->component_index] +
153
11.9M
                       yoffset * compptr->_DCT_scaled_size;
154
11.9M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
11.9M
                      compptr->MCU_sample_width;
156
24.0M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
12.0M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
12.0M
                yoffset + yindex < compptr->last_row_height) {
159
12.0M
              output_col = start_col;
160
24.2M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
12.1M
                (*inverse_DCT) (cinfo, compptr,
165
12.1M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
12.1M
                                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
12.1M
                output_col += compptr->_DCT_scaled_size;
173
12.1M
              }
174
12.0M
            }
175
12.0M
            blkn += compptr->MCU_width;
176
12.0M
            output_ptr += compptr->_DCT_scaled_size;
177
12.0M
          }
178
11.9M
        }
179
11.7M
      }
180
11.7M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
683k
    coef->MCU_ctr = 0;
183
683k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
472k
  cinfo->output_iMCU_row++;
186
472k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
470k
    start_iMCU_row(cinfo);
188
470k
    return JPEG_ROW_COMPLETED;
189
470k
  }
190
  /* Completed the scan */
191
2.18k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
2.18k
  return JPEG_SCAN_COMPLETED;
193
472k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
90
472k
{
91
472k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
472k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
472k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
472k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
472k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
472k
  _JSAMPARRAY output_ptr;
97
472k
  JDIMENSION start_col, output_col;
98
472k
  jpeg_component_info *compptr;
99
472k
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
1.15M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
683k
       yoffset++) {
104
12.4M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
11.7M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
11.7M
      jzero_far((void *)coef->MCU_buffer[0],
108
11.7M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
11.7M
      if (!cinfo->entropy->insufficient_data)
110
1.83M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
11.7M
      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
11.7M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
11.7M
          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
11.7M
        blkn = 0;               /* index of current DCT block within MCU */
142
23.6M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
11.9M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
11.9M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
11.9M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
11.9M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
11.2M
                         compptr->MCU_width : compptr->last_col_width;
152
11.9M
          output_ptr = output_buf[compptr->component_index] +
153
11.9M
                       yoffset * compptr->_DCT_scaled_size;
154
11.9M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
11.9M
                      compptr->MCU_sample_width;
156
24.0M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
12.0M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
12.0M
                yoffset + yindex < compptr->last_row_height) {
159
12.0M
              output_col = start_col;
160
24.2M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
12.1M
                (*inverse_DCT) (cinfo, compptr,
165
12.1M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
12.1M
                                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
12.1M
                output_col += compptr->_DCT_scaled_size;
173
12.1M
              }
174
12.0M
            }
175
12.0M
            blkn += compptr->MCU_width;
176
12.0M
            output_ptr += compptr->_DCT_scaled_size;
177
12.0M
          }
178
11.9M
        }
179
11.7M
      }
180
11.7M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
683k
    coef->MCU_ctr = 0;
183
683k
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
472k
  cinfo->output_iMCU_row++;
186
472k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
470k
    start_iMCU_row(cinfo);
188
470k
    return JPEG_ROW_COMPLETED;
189
470k
  }
190
  /* Completed the scan */
191
2.18k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
2.18k
  return JPEG_SCAN_COMPLETED;
193
472k
}
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
8.42M
{
219
8.42M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
8.42M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
8.42M
  int blkn, ci, xindex, yindex, yoffset;
222
8.42M
  JDIMENSION start_col;
223
8.42M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
8.42M
  JBLOCKROW buffer_ptr;
225
8.42M
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
17.3M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
8.90M
    compptr = cinfo->cur_comp_info[ci];
230
8.90M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
8.90M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
8.90M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
8.90M
       (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
8.90M
  }
239
240
  /* Loop to process one whole iMCU row */
241
18.4M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
10.0M
       yoffset++) {
243
178M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
168M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
168M
      blkn = 0;                 /* index of current DCT block within MCU */
247
353M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
185M
        compptr = cinfo->cur_comp_info[ci];
249
185M
        start_col = MCU_col_num * compptr->MCU_width;
250
389M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
203M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
448M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
244M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
244M
          }
255
203M
        }
256
185M
      }
257
168M
      if (!cinfo->entropy->insufficient_data)
258
89.7M
        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
168M
      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
168M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
10.0M
    coef->MCU_ctr = 0;
282
10.0M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
8.42M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
8.35M
    start_iMCU_row(cinfo);
286
8.35M
    return JPEG_ROW_COMPLETED;
287
8.35M
  }
288
  /* Completed the scan */
289
74.4k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
74.4k
  return JPEG_SCAN_COMPLETED;
291
8.42M
}
jdcoefct-8.c:consume_data
Line
Count
Source
218
6.99M
{
219
6.99M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
6.99M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
6.99M
  int blkn, ci, xindex, yindex, yoffset;
222
6.99M
  JDIMENSION start_col;
223
6.99M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
6.99M
  JBLOCKROW buffer_ptr;
225
6.99M
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
14.4M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
7.43M
    compptr = cinfo->cur_comp_info[ci];
230
7.43M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
7.43M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
7.43M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
7.43M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
234
    /* Note: entropy decoder expects buffer to be zeroed,
235
     * but this is handled automatically by the memory manager
236
     * because we requested a pre-zeroed array.
237
     */
238
7.43M
  }
239
240
  /* Loop to process one whole iMCU row */
241
15.5M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
8.56M
       yoffset++) {
243
165M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
156M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
156M
      blkn = 0;                 /* index of current DCT block within MCU */
247
330M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
173M
        compptr = cinfo->cur_comp_info[ci];
249
173M
        start_col = MCU_col_num * compptr->MCU_width;
250
363M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
190M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
421M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
230M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
230M
          }
255
190M
        }
256
173M
      }
257
156M
      if (!cinfo->entropy->insufficient_data)
258
85.0M
        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
156M
      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
156M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
8.56M
    coef->MCU_ctr = 0;
282
8.56M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
6.99M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
6.92M
    start_iMCU_row(cinfo);
286
6.92M
    return JPEG_ROW_COMPLETED;
287
6.92M
  }
288
  /* Completed the scan */
289
71.1k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
71.1k
  return JPEG_SCAN_COMPLETED;
291
6.99M
}
jdcoefct-12.c:consume_data
Line
Count
Source
218
1.43M
{
219
1.43M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
1.43M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
1.43M
  int blkn, ci, xindex, yindex, yoffset;
222
1.43M
  JDIMENSION start_col;
223
1.43M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
1.43M
  JBLOCKROW buffer_ptr;
225
1.43M
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
2.90M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
1.47M
    compptr = cinfo->cur_comp_info[ci];
230
1.47M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
1.47M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
1.47M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
1.47M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
234
    /* Note: entropy decoder expects buffer to be zeroed,
235
     * but this is handled automatically by the memory manager
236
     * because we requested a pre-zeroed array.
237
     */
238
1.47M
  }
239
240
  /* Loop to process one whole iMCU row */
241
2.91M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
1.47M
       yoffset++) {
243
12.5M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
11.0M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
11.0M
      blkn = 0;                 /* index of current DCT block within MCU */
247
23.3M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
12.3M
        compptr = cinfo->cur_comp_info[ci];
249
12.3M
        start_col = MCU_col_num * compptr->MCU_width;
250
25.3M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
13.0M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
27.0M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
14.0M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
14.0M
          }
255
13.0M
        }
256
12.3M
      }
257
11.0M
      if (!cinfo->entropy->insufficient_data)
258
4.70M
        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
11.0M
      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
11.0M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
1.47M
    coef->MCU_ctr = 0;
282
1.47M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
1.43M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
1.42M
    start_iMCU_row(cinfo);
286
1.42M
    return JPEG_ROW_COMPLETED;
287
1.42M
  }
288
  /* Completed the scan */
289
3.30k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
3.30k
  return JPEG_SCAN_COMPLETED;
291
1.43M
}
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
1.00M
{
305
1.00M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
1.00M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
1.00M
  JDIMENSION block_num;
308
1.00M
  int ci, block_row, block_rows;
309
1.00M
  JBLOCKARRAY buffer;
310
1.00M
  JBLOCKROW buffer_ptr;
311
1.00M
  _JSAMPARRAY output_ptr;
312
1.00M
  JDIMENSION output_col;
313
1.00M
  jpeg_component_info *compptr;
314
1.00M
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
1.00M
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
1.00M
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
1.00M
          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
3.01M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
2.01M
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
2.01M
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
2.01M
    buffer = (*cinfo->mem->access_virt_barray)
332
2.01M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
2.01M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
2.01M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
2.01M
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
2.00M
      block_rows = compptr->v_samp_factor;
338
4.70k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
4.70k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
4.70k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
4.70k
    }
343
2.01M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
2.01M
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
4.34M
    for (block_row = 0; block_row < block_rows; block_row++) {
347
2.33M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
2.33M
      output_col = 0;
349
2.33M
      for (block_num = cinfo->master->first_MCU_col[ci];
350
23.1M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
20.8M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
20.8M
                        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
20.8M
        buffer_ptr++;
361
20.8M
        output_col += compptr->_DCT_scaled_size;
362
20.8M
      }
363
2.33M
      output_ptr += compptr->_DCT_scaled_size;
364
2.33M
    }
365
2.01M
  }
366
367
1.00M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
997k
    return JPEG_ROW_COMPLETED;
369
2.50k
  return JPEG_SCAN_COMPLETED;
370
1.00M
}
jdcoefct-8.c:decompress_data
Line
Count
Source
304
1.00M
{
305
1.00M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
1.00M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
1.00M
  JDIMENSION block_num;
308
1.00M
  int ci, block_row, block_rows;
309
1.00M
  JBLOCKARRAY buffer;
310
1.00M
  JBLOCKROW buffer_ptr;
311
1.00M
  _JSAMPARRAY output_ptr;
312
1.00M
  JDIMENSION output_col;
313
1.00M
  jpeg_component_info *compptr;
314
1.00M
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
1.00M
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
1.00M
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
1.00M
          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
3.01M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
2.01M
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
2.01M
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
2.01M
    buffer = (*cinfo->mem->access_virt_barray)
332
2.01M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
2.01M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
2.01M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
2.01M
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
2.00M
      block_rows = compptr->v_samp_factor;
338
4.70k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
4.70k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
4.70k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
4.70k
    }
343
2.01M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
2.01M
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
4.34M
    for (block_row = 0; block_row < block_rows; block_row++) {
347
2.33M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
2.33M
      output_col = 0;
349
2.33M
      for (block_num = cinfo->master->first_MCU_col[ci];
350
23.1M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
20.8M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
20.8M
                        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
20.8M
        buffer_ptr++;
361
20.8M
        output_col += compptr->_DCT_scaled_size;
362
20.8M
      }
363
2.33M
      output_ptr += compptr->_DCT_scaled_size;
364
2.33M
    }
365
2.01M
  }
366
367
1.00M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
997k
    return JPEG_ROW_COMPLETED;
369
2.50k
  return JPEG_SCAN_COMPLETED;
370
1.00M
}
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
1.13M
#define Q01_POS  1
386
1.13M
#define Q10_POS  8
387
1.13M
#define Q20_POS  16
388
1.13M
#define Q11_POS  9
389
1.13M
#define Q02_POS  2
390
877k
#define Q03_POS  3
391
877k
#define Q12_POS  10
392
876k
#define Q21_POS  17
393
876k
#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
4.89k
{
406
4.89k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
4.89k
  boolean smoothing_useful = FALSE;
408
4.89k
  int ci, coefi;
409
4.89k
  jpeg_component_info *compptr;
410
4.89k
  JQUANT_TBL *qtable;
411
4.89k
  int *coef_bits, *prev_coef_bits;
412
4.89k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
4.89k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
644
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
4.25k
  if (coef->coef_bits_latch == NULL)
419
4.25k
    coef->coef_bits_latch = (int *)
420
4.25k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
4.25k
                                  cinfo->num_components * 2 *
422
4.25k
                                  (SAVED_COEFS * sizeof(int)));
423
4.25k
  coef_bits_latch = coef->coef_bits_latch;
424
4.25k
  prev_coef_bits_latch =
425
4.25k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
6.36k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
4.66k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
4.66k
    if ((qtable = compptr->quant_table) == NULL)
431
416
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
4.24k
    if (qtable->quantval[0] == 0 ||
434
3.99k
        qtable->quantval[Q01_POS] == 0 ||
435
3.82k
        qtable->quantval[Q10_POS] == 0 ||
436
3.54k
        qtable->quantval[Q20_POS] == 0 ||
437
3.37k
        qtable->quantval[Q11_POS] == 0 ||
438
3.14k
        qtable->quantval[Q02_POS] == 0 ||
439
2.99k
        qtable->quantval[Q03_POS] == 0 ||
440
2.74k
        qtable->quantval[Q12_POS] == 0 ||
441
2.62k
        qtable->quantval[Q21_POS] == 0 ||
442
2.50k
        qtable->quantval[Q30_POS] == 0)
443
1.84k
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
2.40k
    coef_bits = cinfo->coef_bits[ci];
446
2.40k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
2.40k
    if (coef_bits[0] < 0)
448
292
      return FALSE;
449
2.11k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
21.1k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
19.0k
      if (cinfo->input_scan_number > 1)
453
9.20k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
9.82k
      else
455
9.82k
        prev_coef_bits_latch[coefi] = -1;
456
19.0k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
19.0k
      if (coef_bits[coefi] != 0)
458
18.1k
        smoothing_useful = TRUE;
459
19.0k
    }
460
2.11k
    coef_bits_latch += SAVED_COEFS;
461
2.11k
    prev_coef_bits_latch += SAVED_COEFS;
462
2.11k
  }
463
464
1.70k
  return smoothing_useful;
465
4.25k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
405
4.06k
{
406
4.06k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
4.06k
  boolean smoothing_useful = FALSE;
408
4.06k
  int ci, coefi;
409
4.06k
  jpeg_component_info *compptr;
410
4.06k
  JQUANT_TBL *qtable;
411
4.06k
  int *coef_bits, *prev_coef_bits;
412
4.06k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
4.06k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
535
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
3.52k
  if (coef->coef_bits_latch == NULL)
419
3.52k
    coef->coef_bits_latch = (int *)
420
3.52k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
3.52k
                                  cinfo->num_components * 2 *
422
3.52k
                                  (SAVED_COEFS * sizeof(int)));
423
3.52k
  coef_bits_latch = coef->coef_bits_latch;
424
3.52k
  prev_coef_bits_latch =
425
3.52k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
5.42k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
3.87k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
3.87k
    if ((qtable = compptr->quant_table) == NULL)
431
380
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
3.49k
    if (qtable->quantval[0] == 0 ||
434
3.32k
        qtable->quantval[Q01_POS] == 0 ||
435
3.18k
        qtable->quantval[Q10_POS] == 0 ||
436
3.04k
        qtable->quantval[Q20_POS] == 0 ||
437
2.88k
        qtable->quantval[Q11_POS] == 0 ||
438
2.70k
        qtable->quantval[Q02_POS] == 0 ||
439
2.58k
        qtable->quantval[Q03_POS] == 0 ||
440
2.37k
        qtable->quantval[Q12_POS] == 0 ||
441
2.28k
        qtable->quantval[Q21_POS] == 0 ||
442
2.21k
        qtable->quantval[Q30_POS] == 0)
443
1.34k
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
2.14k
    coef_bits = cinfo->coef_bits[ci];
446
2.14k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
2.14k
    if (coef_bits[0] < 0)
448
244
      return FALSE;
449
1.90k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
19.0k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
17.1k
      if (cinfo->input_scan_number > 1)
453
8.59k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
8.53k
      else
455
8.53k
        prev_coef_bits_latch[coefi] = -1;
456
17.1k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
17.1k
      if (coef_bits[coefi] != 0)
458
16.3k
        smoothing_useful = TRUE;
459
17.1k
    }
460
1.90k
    coef_bits_latch += SAVED_COEFS;
461
1.90k
    prev_coef_bits_latch += SAVED_COEFS;
462
1.90k
  }
463
464
1.55k
  return smoothing_useful;
465
3.52k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
405
833
{
406
833
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
833
  boolean smoothing_useful = FALSE;
408
833
  int ci, coefi;
409
833
  jpeg_component_info *compptr;
410
833
  JQUANT_TBL *qtable;
411
833
  int *coef_bits, *prev_coef_bits;
412
833
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
833
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
109
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
724
  if (coef->coef_bits_latch == NULL)
419
724
    coef->coef_bits_latch = (int *)
420
724
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
724
                                  cinfo->num_components * 2 *
422
724
                                  (SAVED_COEFS * sizeof(int)));
423
724
  coef_bits_latch = coef->coef_bits_latch;
424
724
  prev_coef_bits_latch =
425
724
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
936
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
792
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
792
    if ((qtable = compptr->quant_table) == NULL)
431
36
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
756
    if (qtable->quantval[0] == 0 ||
434
672
        qtable->quantval[Q01_POS] == 0 ||
435
636
        qtable->quantval[Q10_POS] == 0 ||
436
508
        qtable->quantval[Q20_POS] == 0 ||
437
484
        qtable->quantval[Q11_POS] == 0 ||
438
440
        qtable->quantval[Q02_POS] == 0 ||
439
412
        qtable->quantval[Q03_POS] == 0 ||
440
372
        qtable->quantval[Q12_POS] == 0 ||
441
336
        qtable->quantval[Q21_POS] == 0 ||
442
284
        qtable->quantval[Q30_POS] == 0)
443
496
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
260
    coef_bits = cinfo->coef_bits[ci];
446
260
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
260
    if (coef_bits[0] < 0)
448
48
      return FALSE;
449
212
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
2.12k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
1.90k
      if (cinfo->input_scan_number > 1)
453
612
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
1.29k
      else
455
1.29k
        prev_coef_bits_latch[coefi] = -1;
456
1.90k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
1.90k
      if (coef_bits[coefi] != 0)
458
1.74k
        smoothing_useful = TRUE;
459
1.90k
    }
460
212
    coef_bits_latch += SAVED_COEFS;
461
212
    prev_coef_bits_latch += SAVED_COEFS;
462
212
  }
463
464
144
  return smoothing_useful;
465
724
}
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
870k
{
475
870k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
870k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
870k
  JDIMENSION block_num, last_block_column;
478
870k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
870k
    image_block_rows;
480
870k
  JBLOCKARRAY buffer;
481
870k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
870k
  JBLOCKROW next_block_row, next_next_block_row;
483
870k
  _JSAMPARRAY output_ptr;
484
870k
  JDIMENSION output_col;
485
870k
  jpeg_component_info *compptr;
486
870k
  _inverse_DCT_method_ptr inverse_DCT;
487
870k
  boolean change_dc;
488
870k
  JCOEF *workspace;
489
870k
  int *coef_bits;
490
870k
  JQUANT_TBL *quanttbl;
491
870k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
870k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
870k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
870k
      DC25;
495
870k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
870k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
870k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
870k
         !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
2.00M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
1.13M
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
1.13M
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
1.13M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
1.13M
      block_rows = compptr->v_samp_factor;
526
1.13M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
1.13M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
1.68k
      block_rows = compptr->v_samp_factor;
529
1.68k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
1.81k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
1.81k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
1.81k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
1.81k
      access_rows = block_rows; /* this iMCU row only */
535
1.81k
    }
536
    /* Align the virtual buffer for this component. */
537
1.13M
    if (cinfo->output_iMCU_row > 1) {
538
1.13M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
1.13M
      buffer = (*cinfo->mem->access_virt_barray)
540
1.13M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
1.13M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
1.13M
         (JDIMENSION)access_rows, FALSE);
543
1.13M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
1.13M
    } else if (cinfo->output_iMCU_row > 0) {
545
1.68k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
1.68k
      buffer = (*cinfo->mem->access_virt_barray)
547
1.68k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
1.68k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
1.68k
         (JDIMENSION)access_rows, FALSE);
550
1.68k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
1.81k
    } else {
552
1.81k
      buffer = (*cinfo->mem->access_virt_barray)
553
1.81k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
1.81k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
1.81k
    }
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
1.13M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
561
594k
      coef_bits =
562
594k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
563
540k
    else
564
540k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
1.13M
    change_dc =
568
1.13M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
961k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
906k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
1.13M
    quanttbl = compptr->quant_table;
573
1.13M
    Q00 = quanttbl->quantval[0];
574
1.13M
    Q01 = quanttbl->quantval[Q01_POS];
575
1.13M
    Q10 = quanttbl->quantval[Q10_POS];
576
1.13M
    Q20 = quanttbl->quantval[Q20_POS];
577
1.13M
    Q11 = quanttbl->quantval[Q11_POS];
578
1.13M
    Q02 = quanttbl->quantval[Q02_POS];
579
1.13M
    if (change_dc) {
580
874k
      Q03 = quanttbl->quantval[Q03_POS];
581
874k
      Q12 = quanttbl->quantval[Q12_POS];
582
874k
      Q21 = quanttbl->quantval[Q21_POS];
583
874k
      Q30 = quanttbl->quantval[Q30_POS];
584
874k
    }
585
1.13M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
1.13M
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
1.13M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
2.57M
    for (block_row = 0; block_row < block_rows; block_row++) {
590
1.44M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
1.44M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
1.44M
      if (image_block_row > 0)
594
1.43M
        prev_block_row =
595
1.43M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
1.81k
      else
597
1.81k
        prev_block_row = buffer_ptr;
598
599
1.44M
      if (image_block_row > 1)
600
1.43M
        prev_prev_block_row =
601
1.43M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
3.65k
      else
603
3.65k
        prev_prev_block_row = prev_block_row;
604
605
1.44M
      if (image_block_row < image_block_rows - 1)
606
1.43M
        next_block_row =
607
1.43M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
1.81k
      else
609
1.81k
        next_block_row = buffer_ptr;
610
611
1.44M
      if (image_block_row < image_block_rows - 2)
612
1.43M
        next_next_block_row =
613
1.43M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
3.31k
      else
615
3.31k
        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
1.44M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
1.44M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
1.44M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
1.44M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
1.44M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
1.44M
      output_col = 0;
626
1.44M
      last_block_column = compptr->width_in_blocks - 1;
627
1.44M
      for (block_num = cinfo->master->first_MCU_col[ci];
628
13.4M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
11.9M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
11.9M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
1.44M
            block_num < last_block_column) {
634
946k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
946k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
946k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
946k
          DC19 = DC20 = (int)next_block_row[1][0];
638
946k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
946k
        }
640
11.9M
        if (block_num + 1 < last_block_column) {
641
9.58M
          DC05 = (int)prev_prev_block_row[2][0];
642
9.58M
          DC10 = (int)prev_block_row[2][0];
643
9.58M
          DC15 = (int)buffer_ptr[2][0];
644
9.58M
          DC20 = (int)next_block_row[2][0];
645
9.58M
          DC25 = (int)next_next_block_row[2][0];
646
9.58M
        }
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
11.9M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
11.5M
          num = Q00 * (change_dc ?
660
7.82M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
7.82M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
7.82M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
7.82M
                 DC21 - DC22 + DC24 + DC25) :
664
11.5M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
11.5M
          if (num >= 0) {
666
9.01M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
9.01M
            if (Al > 0 && pred >= (1 << Al))
668
741k
              pred = (1 << Al) - 1;
669
9.01M
          } else {
670
2.57M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
2.57M
            if (Al > 0 && pred >= (1 << Al))
672
604k
              pred = (1 << Al) - 1;
673
2.57M
            pred = -pred;
674
2.57M
          }
675
11.5M
          workspace[1] = (JCOEF)pred;
676
11.5M
        }
677
        /* AC10 */
678
11.9M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
11.6M
          num = Q00 * (change_dc ?
680
7.82M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
7.82M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
7.82M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
7.82M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
11.6M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
11.6M
          if (num >= 0) {
686
8.25M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
8.25M
            if (Al > 0 && pred >= (1 << Al))
688
1.12M
              pred = (1 << Al) - 1;
689
8.25M
          } else {
690
3.40M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
3.40M
            if (Al > 0 && pred >= (1 << Al))
692
960k
              pred = (1 << Al) - 1;
693
3.40M
            pred = -pred;
694
3.40M
          }
695
11.6M
          workspace[8] = (JCOEF)pred;
696
11.6M
        }
697
        /* AC20 */
698
11.9M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
11.7M
          num = Q00 * (change_dc ?
700
7.82M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
7.82M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
11.7M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
11.7M
          if (num >= 0) {
704
7.80M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
7.80M
            if (Al > 0 && pred >= (1 << Al))
706
977k
              pred = (1 << Al) - 1;
707
7.80M
          } else {
708
3.95M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
3.95M
            if (Al > 0 && pred >= (1 << Al))
710
991k
              pred = (1 << Al) - 1;
711
3.95M
            pred = -pred;
712
3.95M
          }
713
11.7M
          workspace[16] = (JCOEF)pred;
714
11.7M
        }
715
        /* AC11 */
716
11.9M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
11.7M
          num = Q00 * (change_dc ?
718
7.82M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
7.82M
                 9 * DC19 + DC21 - DC25) :
720
11.7M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
3.96M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
11.7M
          if (num >= 0) {
723
9.31M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
9.31M
            if (Al > 0 && pred >= (1 << Al))
725
445k
              pred = (1 << Al) - 1;
726
9.31M
          } else {
727
2.47M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
2.47M
            if (Al > 0 && pred >= (1 << Al))
729
481k
              pred = (1 << Al) - 1;
730
2.47M
            pred = -pred;
731
2.47M
          }
732
11.7M
          workspace[9] = (JCOEF)pred;
733
11.7M
        }
734
        /* AC02 */
735
11.9M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
11.7M
          num = Q00 * (change_dc ?
737
7.82M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
7.82M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
11.7M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
11.7M
          if (num >= 0) {
741
7.78M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
7.78M
            if (Al > 0 && pred >= (1 << Al))
743
543k
              pred = (1 << Al) - 1;
744
7.78M
          } else {
745
3.93M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
3.93M
            if (Al > 0 && pred >= (1 << Al))
747
550k
              pred = (1 << Al) - 1;
748
3.93M
            pred = -pred;
749
3.93M
          }
750
11.7M
          workspace[2] = (JCOEF)pred;
751
11.7M
        }
752
11.9M
        if (change_dc) {
753
          /* AC03 */
754
7.82M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
7.82M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
7.82M
            if (num >= 0) {
757
6.47M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
6.47M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
6.47M
            } else {
761
1.34M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
1.34M
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
1.34M
              pred = -pred;
765
1.34M
            }
766
7.82M
            workspace[3] = (JCOEF)pred;
767
7.82M
          }
768
          /* AC12 */
769
7.82M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
7.82M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
7.82M
            if (num >= 0) {
772
5.51M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
5.51M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
5.51M
            } else {
776
2.30M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
2.30M
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
2.30M
              pred = -pred;
780
2.30M
            }
781
7.82M
            workspace[10] = (JCOEF)pred;
782
7.82M
          }
783
          /* AC21 */
784
7.82M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
7.82M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
7.82M
            if (num >= 0) {
787
4.90M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
4.90M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
4.90M
            } else {
791
2.91M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
2.91M
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
2.91M
              pred = -pred;
795
2.91M
            }
796
7.82M
            workspace[17] = (JCOEF)pred;
797
7.82M
          }
798
          /* AC30 */
799
7.82M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
7.82M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
7.82M
            if (num >= 0) {
802
5.93M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
5.93M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
5.93M
            } else {
806
1.88M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
1.88M
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
1.88M
              pred = -pred;
810
1.88M
            }
811
7.82M
            workspace[24] = (JCOEF)pred;
812
7.82M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
7.82M
          num = Q00 *
817
7.82M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
7.82M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
7.82M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
7.82M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
7.82M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
7.82M
          if (num >= 0) {
823
5.27M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
5.27M
          } else {
825
2.54M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
2.54M
            pred = -pred;
827
2.54M
          }
828
7.82M
          workspace[0] = (JCOEF)pred;
829
7.82M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
11.9M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
11.9M
                        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
11.9M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
11.9M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
11.9M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
11.9M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
11.9M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
11.9M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
11.9M
          prev_prev_block_row++, next_next_block_row++;
849
11.9M
        output_col += compptr->_DCT_scaled_size;
850
11.9M
      }
851
1.44M
      output_ptr += compptr->_DCT_scaled_size;
852
1.44M
    }
853
1.13M
  }
854
855
870k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
868k
    return JPEG_ROW_COMPLETED;
857
1.55k
  return JPEG_SCAN_COMPLETED;
858
870k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
474
870k
{
475
870k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
870k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
870k
  JDIMENSION block_num, last_block_column;
478
870k
  int ci, block_row, block_rows, access_rows, image_block_row,
479
870k
    image_block_rows;
480
870k
  JBLOCKARRAY buffer;
481
870k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
870k
  JBLOCKROW next_block_row, next_next_block_row;
483
870k
  _JSAMPARRAY output_ptr;
484
870k
  JDIMENSION output_col;
485
870k
  jpeg_component_info *compptr;
486
870k
  _inverse_DCT_method_ptr inverse_DCT;
487
870k
  boolean change_dc;
488
870k
  JCOEF *workspace;
489
870k
  int *coef_bits;
490
870k
  JQUANT_TBL *quanttbl;
491
870k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
870k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
870k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
870k
      DC25;
495
870k
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
870k
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
870k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
870k
         !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
2.00M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
1.13M
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
1.13M
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
1.13M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
1.13M
      block_rows = compptr->v_samp_factor;
526
1.13M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
1.13M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
1.68k
      block_rows = compptr->v_samp_factor;
529
1.68k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
1.81k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
1.81k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
1.81k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
1.81k
      access_rows = block_rows; /* this iMCU row only */
535
1.81k
    }
536
    /* Align the virtual buffer for this component. */
537
1.13M
    if (cinfo->output_iMCU_row > 1) {
538
1.13M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
1.13M
      buffer = (*cinfo->mem->access_virt_barray)
540
1.13M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
1.13M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
1.13M
         (JDIMENSION)access_rows, FALSE);
543
1.13M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
1.13M
    } else if (cinfo->output_iMCU_row > 0) {
545
1.68k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
1.68k
      buffer = (*cinfo->mem->access_virt_barray)
547
1.68k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
1.68k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
1.68k
         (JDIMENSION)access_rows, FALSE);
550
1.68k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
1.81k
    } else {
552
1.81k
      buffer = (*cinfo->mem->access_virt_barray)
553
1.81k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
1.81k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
1.81k
    }
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
1.13M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
561
594k
      coef_bits =
562
594k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
563
540k
    else
564
540k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
1.13M
    change_dc =
568
1.13M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
961k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
906k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
1.13M
    quanttbl = compptr->quant_table;
573
1.13M
    Q00 = quanttbl->quantval[0];
574
1.13M
    Q01 = quanttbl->quantval[Q01_POS];
575
1.13M
    Q10 = quanttbl->quantval[Q10_POS];
576
1.13M
    Q20 = quanttbl->quantval[Q20_POS];
577
1.13M
    Q11 = quanttbl->quantval[Q11_POS];
578
1.13M
    Q02 = quanttbl->quantval[Q02_POS];
579
1.13M
    if (change_dc) {
580
874k
      Q03 = quanttbl->quantval[Q03_POS];
581
874k
      Q12 = quanttbl->quantval[Q12_POS];
582
874k
      Q21 = quanttbl->quantval[Q21_POS];
583
874k
      Q30 = quanttbl->quantval[Q30_POS];
584
874k
    }
585
1.13M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
1.13M
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
1.13M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
2.57M
    for (block_row = 0; block_row < block_rows; block_row++) {
590
1.44M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
1.44M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
1.44M
      if (image_block_row > 0)
594
1.43M
        prev_block_row =
595
1.43M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
1.81k
      else
597
1.81k
        prev_block_row = buffer_ptr;
598
599
1.44M
      if (image_block_row > 1)
600
1.43M
        prev_prev_block_row =
601
1.43M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
3.65k
      else
603
3.65k
        prev_prev_block_row = prev_block_row;
604
605
1.44M
      if (image_block_row < image_block_rows - 1)
606
1.43M
        next_block_row =
607
1.43M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
1.81k
      else
609
1.81k
        next_block_row = buffer_ptr;
610
611
1.44M
      if (image_block_row < image_block_rows - 2)
612
1.43M
        next_next_block_row =
613
1.43M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
3.31k
      else
615
3.31k
        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
1.44M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
1.44M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
1.44M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
1.44M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
1.44M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
1.44M
      output_col = 0;
626
1.44M
      last_block_column = compptr->width_in_blocks - 1;
627
1.44M
      for (block_num = cinfo->master->first_MCU_col[ci];
628
13.4M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
11.9M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
11.9M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
1.44M
            block_num < last_block_column) {
634
946k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
946k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
946k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
946k
          DC19 = DC20 = (int)next_block_row[1][0];
638
946k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
946k
        }
640
11.9M
        if (block_num + 1 < last_block_column) {
641
9.58M
          DC05 = (int)prev_prev_block_row[2][0];
642
9.58M
          DC10 = (int)prev_block_row[2][0];
643
9.58M
          DC15 = (int)buffer_ptr[2][0];
644
9.58M
          DC20 = (int)next_block_row[2][0];
645
9.58M
          DC25 = (int)next_next_block_row[2][0];
646
9.58M
        }
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
11.9M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
11.5M
          num = Q00 * (change_dc ?
660
7.82M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
7.82M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
7.82M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
7.82M
                 DC21 - DC22 + DC24 + DC25) :
664
11.5M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
11.5M
          if (num >= 0) {
666
9.01M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
9.01M
            if (Al > 0 && pred >= (1 << Al))
668
741k
              pred = (1 << Al) - 1;
669
9.01M
          } else {
670
2.57M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
2.57M
            if (Al > 0 && pred >= (1 << Al))
672
604k
              pred = (1 << Al) - 1;
673
2.57M
            pred = -pred;
674
2.57M
          }
675
11.5M
          workspace[1] = (JCOEF)pred;
676
11.5M
        }
677
        /* AC10 */
678
11.9M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
11.6M
          num = Q00 * (change_dc ?
680
7.82M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
7.82M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
7.82M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
7.82M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
11.6M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
11.6M
          if (num >= 0) {
686
8.25M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
8.25M
            if (Al > 0 && pred >= (1 << Al))
688
1.12M
              pred = (1 << Al) - 1;
689
8.25M
          } else {
690
3.40M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
3.40M
            if (Al > 0 && pred >= (1 << Al))
692
960k
              pred = (1 << Al) - 1;
693
3.40M
            pred = -pred;
694
3.40M
          }
695
11.6M
          workspace[8] = (JCOEF)pred;
696
11.6M
        }
697
        /* AC20 */
698
11.9M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
11.7M
          num = Q00 * (change_dc ?
700
7.82M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
7.82M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
11.7M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
11.7M
          if (num >= 0) {
704
7.80M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
7.80M
            if (Al > 0 && pred >= (1 << Al))
706
977k
              pred = (1 << Al) - 1;
707
7.80M
          } else {
708
3.95M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
3.95M
            if (Al > 0 && pred >= (1 << Al))
710
991k
              pred = (1 << Al) - 1;
711
3.95M
            pred = -pred;
712
3.95M
          }
713
11.7M
          workspace[16] = (JCOEF)pred;
714
11.7M
        }
715
        /* AC11 */
716
11.9M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
11.7M
          num = Q00 * (change_dc ?
718
7.82M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
7.82M
                 9 * DC19 + DC21 - DC25) :
720
11.7M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
3.96M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
11.7M
          if (num >= 0) {
723
9.31M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
9.31M
            if (Al > 0 && pred >= (1 << Al))
725
445k
              pred = (1 << Al) - 1;
726
9.31M
          } else {
727
2.47M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
2.47M
            if (Al > 0 && pred >= (1 << Al))
729
481k
              pred = (1 << Al) - 1;
730
2.47M
            pred = -pred;
731
2.47M
          }
732
11.7M
          workspace[9] = (JCOEF)pred;
733
11.7M
        }
734
        /* AC02 */
735
11.9M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
11.7M
          num = Q00 * (change_dc ?
737
7.82M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
7.82M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
11.7M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
11.7M
          if (num >= 0) {
741
7.78M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
7.78M
            if (Al > 0 && pred >= (1 << Al))
743
543k
              pred = (1 << Al) - 1;
744
7.78M
          } else {
745
3.93M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
3.93M
            if (Al > 0 && pred >= (1 << Al))
747
550k
              pred = (1 << Al) - 1;
748
3.93M
            pred = -pred;
749
3.93M
          }
750
11.7M
          workspace[2] = (JCOEF)pred;
751
11.7M
        }
752
11.9M
        if (change_dc) {
753
          /* AC03 */
754
7.82M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
7.82M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
7.82M
            if (num >= 0) {
757
6.47M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
6.47M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
6.47M
            } else {
761
1.34M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
1.34M
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
1.34M
              pred = -pred;
765
1.34M
            }
766
7.82M
            workspace[3] = (JCOEF)pred;
767
7.82M
          }
768
          /* AC12 */
769
7.82M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
7.82M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
7.82M
            if (num >= 0) {
772
5.51M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
5.51M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
5.51M
            } else {
776
2.30M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
2.30M
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
2.30M
              pred = -pred;
780
2.30M
            }
781
7.82M
            workspace[10] = (JCOEF)pred;
782
7.82M
          }
783
          /* AC21 */
784
7.82M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
7.82M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
7.82M
            if (num >= 0) {
787
4.90M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
4.90M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
4.90M
            } else {
791
2.91M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
2.91M
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
2.91M
              pred = -pred;
795
2.91M
            }
796
7.82M
            workspace[17] = (JCOEF)pred;
797
7.82M
          }
798
          /* AC30 */
799
7.82M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
7.82M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
7.82M
            if (num >= 0) {
802
5.93M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
5.93M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
5.93M
            } else {
806
1.88M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
1.88M
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
1.88M
              pred = -pred;
810
1.88M
            }
811
7.82M
            workspace[24] = (JCOEF)pred;
812
7.82M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
7.82M
          num = Q00 *
817
7.82M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
7.82M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
7.82M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
7.82M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
7.82M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
7.82M
          if (num >= 0) {
823
5.27M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
5.27M
          } else {
825
2.54M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
2.54M
            pred = -pred;
827
2.54M
          }
828
7.82M
          workspace[0] = (JCOEF)pred;
829
7.82M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
11.9M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
11.9M
                        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
11.9M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
11.9M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
11.9M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
11.9M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
11.9M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
11.9M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
11.9M
          prev_prev_block_row++, next_next_block_row++;
849
11.9M
        output_col += compptr->_DCT_scaled_size;
850
11.9M
      }
851
1.44M
      output_ptr += compptr->_DCT_scaled_size;
852
1.44M
    }
853
1.13M
  }
854
855
870k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
868k
    return JPEG_ROW_COMPLETED;
857
1.55k
  return JPEG_SCAN_COMPLETED;
858
870k
}
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
12.3k
{
870
12.3k
  my_coef_ptr coef;
871
872
12.3k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
12.3k
  coef = (my_coef_ptr)
876
12.3k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
12.3k
                                sizeof(my_coef_controller));
878
12.3k
  memset(coef, 0, sizeof(my_coef_controller));
879
12.3k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
12.3k
  coef->pub.start_input_pass = start_input_pass;
881
12.3k
  coef->pub.start_output_pass = start_output_pass;
882
12.3k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
12.3k
  coef->coef_bits_latch = NULL;
884
12.3k
#endif
885
886
  /* Create the coefficient buffer. */
887
12.3k
  if (need_full_buffer) {
888
8.57k
#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
8.57k
    int ci, access_rows;
893
8.57k
    jpeg_component_info *compptr;
894
895
23.4k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
14.8k
         ci++, compptr++) {
897
14.8k
      access_rows = compptr->v_samp_factor;
898
14.8k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
14.8k
      if (cinfo->progressive_mode)
901
9.43k
        access_rows *= 5;
902
14.8k
#endif
903
14.8k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
14.8k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
14.8k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
14.8k
                               (long)compptr->h_samp_factor),
907
14.8k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
14.8k
                               (long)compptr->v_samp_factor),
909
14.8k
         (JDIMENSION)access_rows);
910
14.8k
    }
911
8.57k
    coef->pub.consume_data = consume_data;
912
8.57k
    coef->pub._decompress_data = decompress_data;
913
8.57k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
8.57k
  } else {
918
    /* We only need a single-MCU buffer. */
919
3.77k
    JBLOCKROW buffer;
920
3.77k
    int i;
921
922
3.77k
    buffer = (JBLOCKROW)
923
3.77k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
3.77k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
41.5k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
37.7k
      coef->MCU_buffer[i] = buffer + i;
927
37.7k
    }
928
3.77k
    coef->pub.consume_data = dummy_consume_data;
929
3.77k
    coef->pub._decompress_data = decompress_onepass;
930
3.77k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
3.77k
  }
932
933
  /* Allocate the workspace buffer */
934
12.3k
  coef->workspace = (JCOEF *)
935
12.3k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
12.3k
                                sizeof(JCOEF) * DCTSIZE2);
937
12.3k
}
jinit_d_coef_controller
Line
Count
Source
869
11.0k
{
870
11.0k
  my_coef_ptr coef;
871
872
11.0k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
11.0k
  coef = (my_coef_ptr)
876
11.0k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
11.0k
                                sizeof(my_coef_controller));
878
11.0k
  memset(coef, 0, sizeof(my_coef_controller));
879
11.0k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
11.0k
  coef->pub.start_input_pass = start_input_pass;
881
11.0k
  coef->pub.start_output_pass = start_output_pass;
882
11.0k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
11.0k
  coef->coef_bits_latch = NULL;
884
11.0k
#endif
885
886
  /* Create the coefficient buffer. */
887
11.0k
  if (need_full_buffer) {
888
7.30k
#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
7.30k
    int ci, access_rows;
893
7.30k
    jpeg_component_info *compptr;
894
895
19.6k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
12.3k
         ci++, compptr++) {
897
12.3k
      access_rows = compptr->v_samp_factor;
898
12.3k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
12.3k
      if (cinfo->progressive_mode)
901
8.29k
        access_rows *= 5;
902
12.3k
#endif
903
12.3k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
12.3k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
12.3k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
12.3k
                               (long)compptr->h_samp_factor),
907
12.3k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
12.3k
                               (long)compptr->v_samp_factor),
909
12.3k
         (JDIMENSION)access_rows);
910
12.3k
    }
911
7.30k
    coef->pub.consume_data = consume_data;
912
7.30k
    coef->pub._decompress_data = decompress_data;
913
7.30k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
7.30k
  } else {
918
    /* We only need a single-MCU buffer. */
919
3.70k
    JBLOCKROW buffer;
920
3.70k
    int i;
921
922
3.70k
    buffer = (JBLOCKROW)
923
3.70k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
3.70k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
40.7k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
37.0k
      coef->MCU_buffer[i] = buffer + i;
927
37.0k
    }
928
3.70k
    coef->pub.consume_data = dummy_consume_data;
929
3.70k
    coef->pub._decompress_data = decompress_onepass;
930
3.70k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
3.70k
  }
932
933
  /* Allocate the workspace buffer */
934
11.0k
  coef->workspace = (JCOEF *)
935
11.0k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
11.0k
                                sizeof(JCOEF) * DCTSIZE2);
937
11.0k
}
j12init_d_coef_controller
Line
Count
Source
869
1.34k
{
870
1.34k
  my_coef_ptr coef;
871
872
1.34k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
1.34k
  coef = (my_coef_ptr)
876
1.34k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
1.34k
                                sizeof(my_coef_controller));
878
1.34k
  memset(coef, 0, sizeof(my_coef_controller));
879
1.34k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
1.34k
  coef->pub.start_input_pass = start_input_pass;
881
1.34k
  coef->pub.start_output_pass = start_output_pass;
882
1.34k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
1.34k
  coef->coef_bits_latch = NULL;
884
1.34k
#endif
885
886
  /* Create the coefficient buffer. */
887
1.34k
  if (need_full_buffer) {
888
1.27k
#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.27k
    int ci, access_rows;
893
1.27k
    jpeg_component_info *compptr;
894
895
3.77k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
2.50k
         ci++, compptr++) {
897
2.50k
      access_rows = compptr->v_samp_factor;
898
2.50k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
2.50k
      if (cinfo->progressive_mode)
901
1.14k
        access_rows *= 5;
902
2.50k
#endif
903
2.50k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
2.50k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
2.50k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
2.50k
                               (long)compptr->h_samp_factor),
907
2.50k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
2.50k
                               (long)compptr->v_samp_factor),
909
2.50k
         (JDIMENSION)access_rows);
910
2.50k
    }
911
1.27k
    coef->pub.consume_data = consume_data;
912
1.27k
    coef->pub._decompress_data = decompress_data;
913
1.27k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
1.27k
  } else {
918
    /* We only need a single-MCU buffer. */
919
72
    JBLOCKROW buffer;
920
72
    int i;
921
922
72
    buffer = (JBLOCKROW)
923
72
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
72
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
792
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
720
      coef->MCU_buffer[i] = buffer + i;
927
720
    }
928
72
    coef->pub.consume_data = dummy_consume_data;
929
72
    coef->pub._decompress_data = decompress_onepass;
930
72
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
72
  }
932
933
  /* Allocate the workspace buffer */
934
1.34k
  coef->workspace = (JCOEF *)
935
1.34k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
1.34k
                                sizeof(JCOEF) * DCTSIZE2);
937
1.34k
}