Coverage Report

Created: 2025-10-10 06:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libjpeg-turbo/src/jdcoefct.c
Line
Count
Source
1
/*
2
 * jdcoefct.c
3
 *
4
 * This file was part of the Independent JPEG Group's software:
5
 * Copyright (C) 1994-1997, Thomas G. Lane.
6
 * libjpeg-turbo Modifications:
7
 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
8
 * Copyright (C) 2010, 2015-2016, 2019-2020, 2022-2024, 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
27
28
/* Forward declarations */
29
METHODDEF(int) decompress_onepass(j_decompress_ptr cinfo,
30
                                  _JSAMPIMAGE output_buf);
31
#ifdef D_MULTISCAN_FILES_SUPPORTED
32
METHODDEF(int) decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf);
33
#endif
34
#ifdef BLOCK_SMOOTHING_SUPPORTED
35
LOCAL(boolean) smoothing_ok(j_decompress_ptr cinfo);
36
METHODDEF(int) decompress_smooth_data(j_decompress_ptr cinfo,
37
                                      _JSAMPIMAGE output_buf);
38
#endif
39
40
41
/*
42
 * Initialize for an input processing pass.
43
 */
44
45
METHODDEF(void)
46
start_input_pass(j_decompress_ptr cinfo)
47
13.9k
{
48
13.9k
  cinfo->input_iMCU_row = 0;
49
13.9k
  start_iMCU_row(cinfo);
50
13.9k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
47
13.3k
{
48
13.3k
  cinfo->input_iMCU_row = 0;
49
13.3k
  start_iMCU_row(cinfo);
50
13.3k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
47
624
{
48
624
  cinfo->input_iMCU_row = 0;
49
624
  start_iMCU_row(cinfo);
50
624
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
4.58k
{
60
4.58k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
4.58k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
62
63
  /* If multipass, check to see whether to use block smoothing on this pass */
64
4.58k
  if (coef->pub.coef_arrays != NULL) {
65
2.29k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.40k
      coef->pub._decompress_data = decompress_smooth_data;
67
889
    else
68
889
      coef->pub._decompress_data = decompress_data;
69
2.29k
  }
70
4.58k
#endif
71
4.58k
  cinfo->output_iMCU_row = 0;
72
4.58k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
59
4.47k
{
60
4.47k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
4.47k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
62
63
  /* If multipass, check to see whether to use block smoothing on this pass */
64
4.47k
  if (coef->pub.coef_arrays != NULL) {
65
2.18k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.38k
      coef->pub._decompress_data = decompress_smooth_data;
67
798
    else
68
798
      coef->pub._decompress_data = decompress_data;
69
2.18k
  }
70
4.47k
#endif
71
4.47k
  cinfo->output_iMCU_row = 0;
72
4.47k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
59
115
{
60
115
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
115
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
62
63
  /* If multipass, check to see whether to use block smoothing on this pass */
64
115
  if (coef->pub.coef_arrays != NULL) {
65
103
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
12
      coef->pub._decompress_data = decompress_smooth_data;
67
91
    else
68
91
      coef->pub._decompress_data = decompress_data;
69
103
  }
70
115
#endif
71
115
  cinfo->output_iMCU_row = 0;
72
115
}
73
74
75
/*
76
 * Decompress and return some data in the single-pass case.
77
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
78
 * Input and output must run in lockstep since we have only a one-MCU buffer.
79
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
80
 *
81
 * NB: output_buf contains a plane for each component in image,
82
 * which we index according to the component's SOF position.
83
 */
84
85
METHODDEF(int)
86
decompress_onepass(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
87
558k
{
88
558k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
558k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
558k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
558k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
558k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
558k
  _JSAMPARRAY output_ptr;
94
558k
  JDIMENSION start_col, output_col;
95
558k
  jpeg_component_info *compptr;
96
558k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
1.11M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
558k
       yoffset++) {
101
3.77M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
3.21M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
3.21M
      jzero_far((void *)coef->MCU_buffer[0],
105
3.21M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
3.21M
      if (!cinfo->entropy->insufficient_data)
107
3.21M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
3.21M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
109
        /* Suspension forced; update state counters and exit */
110
0
        coef->MCU_vert_offset = yoffset;
111
0
        coef->MCU_ctr = MCU_col_num;
112
0
        return JPEG_SUSPENDED;
113
0
      }
114
115
      /* Only perform the IDCT on blocks that are contained within the desired
116
       * cropping region.
117
       */
118
3.21M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
3.21M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
120
        /* Determine where data should go in output_buf and do the IDCT thing.
121
         * We skip dummy blocks at the right and bottom edges (but blkn gets
122
         * incremented past them!).  Note the inner loop relies on having
123
         * allocated the MCU_buffer[] blocks sequentially.
124
         */
125
3.21M
        blkn = 0;               /* index of current DCT block within MCU */
126
15.1M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
11.9M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
11.9M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
11.9M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
11.9M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
9.76M
                         compptr->MCU_width : compptr->last_col_width;
136
11.9M
          output_ptr = output_buf[compptr->component_index] +
137
11.9M
                       yoffset * compptr->_DCT_scaled_size;
138
11.9M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
11.9M
                      compptr->MCU_sample_width;
140
24.1M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
12.2M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
12.1M
                yoffset + yindex < compptr->last_row_height) {
143
12.1M
              output_col = start_col;
144
24.7M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
12.5M
                (*inverse_DCT) (cinfo, compptr,
146
12.5M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
12.5M
                                output_ptr, output_col);
148
12.5M
                output_col += compptr->_DCT_scaled_size;
149
12.5M
              }
150
12.1M
            }
151
12.2M
            blkn += compptr->MCU_width;
152
12.2M
            output_ptr += compptr->_DCT_scaled_size;
153
12.2M
          }
154
11.9M
        }
155
3.21M
      }
156
3.21M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
558k
    coef->MCU_ctr = 0;
159
558k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
558k
  cinfo->output_iMCU_row++;
162
558k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
555k
    start_iMCU_row(cinfo);
164
555k
    return JPEG_ROW_COMPLETED;
165
555k
  }
166
  /* Completed the scan */
167
2.28k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
2.28k
  return JPEG_SCAN_COMPLETED;
169
558k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
87
558k
{
88
558k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
558k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
558k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
558k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
558k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
558k
  _JSAMPARRAY output_ptr;
94
558k
  JDIMENSION start_col, output_col;
95
558k
  jpeg_component_info *compptr;
96
558k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
1.11M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
558k
       yoffset++) {
101
3.77M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
3.21M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
3.21M
      jzero_far((void *)coef->MCU_buffer[0],
105
3.21M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
3.21M
      if (!cinfo->entropy->insufficient_data)
107
3.21M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
3.21M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
109
        /* Suspension forced; update state counters and exit */
110
0
        coef->MCU_vert_offset = yoffset;
111
0
        coef->MCU_ctr = MCU_col_num;
112
0
        return JPEG_SUSPENDED;
113
0
      }
114
115
      /* Only perform the IDCT on blocks that are contained within the desired
116
       * cropping region.
117
       */
118
3.21M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
3.21M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
120
        /* Determine where data should go in output_buf and do the IDCT thing.
121
         * We skip dummy blocks at the right and bottom edges (but blkn gets
122
         * incremented past them!).  Note the inner loop relies on having
123
         * allocated the MCU_buffer[] blocks sequentially.
124
         */
125
3.21M
        blkn = 0;               /* index of current DCT block within MCU */
126
15.1M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
11.9M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
11.9M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
11.9M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
11.9M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
9.76M
                         compptr->MCU_width : compptr->last_col_width;
136
11.9M
          output_ptr = output_buf[compptr->component_index] +
137
11.9M
                       yoffset * compptr->_DCT_scaled_size;
138
11.9M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
11.9M
                      compptr->MCU_sample_width;
140
24.1M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
12.2M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
12.1M
                yoffset + yindex < compptr->last_row_height) {
143
12.1M
              output_col = start_col;
144
24.7M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
12.5M
                (*inverse_DCT) (cinfo, compptr,
146
12.5M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
12.5M
                                output_ptr, output_col);
148
12.5M
                output_col += compptr->_DCT_scaled_size;
149
12.5M
              }
150
12.1M
            }
151
12.2M
            blkn += compptr->MCU_width;
152
12.2M
            output_ptr += compptr->_DCT_scaled_size;
153
12.2M
          }
154
11.9M
        }
155
3.21M
      }
156
3.21M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
558k
    coef->MCU_ctr = 0;
159
558k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
558k
  cinfo->output_iMCU_row++;
162
558k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
555k
    start_iMCU_row(cinfo);
164
555k
    return JPEG_ROW_COMPLETED;
165
555k
  }
166
  /* Completed the scan */
167
2.28k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
2.28k
  return JPEG_SCAN_COMPLETED;
169
558k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_onepass
170
171
172
/*
173
 * Dummy consume-input routine for single-pass operation.
174
 */
175
176
METHODDEF(int)
177
dummy_consume_data(j_decompress_ptr cinfo)
178
0
{
179
0
  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
180
0
}
Unexecuted instantiation: jdcoefct-8.c:dummy_consume_data
Unexecuted instantiation: jdcoefct-12.c:dummy_consume_data
181
182
183
#ifdef D_MULTISCAN_FILES_SUPPORTED
184
185
/*
186
 * Consume input data and store it in the full-image coefficient buffer.
187
 * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
188
 * ie, v_samp_factor block rows for each component in the scan.
189
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
190
 */
191
192
METHODDEF(int)
193
consume_data(j_decompress_ptr cinfo)
194
1.64M
{
195
1.64M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
1.64M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
1.64M
  int blkn, ci, xindex, yindex, yoffset;
198
1.64M
  JDIMENSION start_col;
199
1.64M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
1.64M
  JBLOCKROW buffer_ptr;
201
1.64M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
6.26M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
4.62M
    compptr = cinfo->cur_comp_info[ci];
206
4.62M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
4.62M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
4.62M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
4.62M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
210
    /* Note: entropy decoder expects buffer to be zeroed,
211
     * but this is handled automatically by the memory manager
212
     * because we requested a pre-zeroed array.
213
     */
214
4.62M
  }
215
216
  /* Loop to process one whole iMCU row */
217
3.36M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
1.72M
       yoffset++) {
219
33.7M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
32.0M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
32.0M
      blkn = 0;                 /* index of current DCT block within MCU */
223
97.1M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
65.0M
        compptr = cinfo->cur_comp_info[ci];
225
65.0M
        start_col = MCU_col_num * compptr->MCU_width;
226
144M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
79.6M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
170M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
91.1M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
91.1M
          }
231
79.6M
        }
232
65.0M
      }
233
32.0M
      if (!cinfo->entropy->insufficient_data)
234
32.0M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
32.0M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
237
        /* Suspension forced; update state counters and exit */
238
0
        coef->MCU_vert_offset = yoffset;
239
0
        coef->MCU_ctr = MCU_col_num;
240
0
        return JPEG_SUSPENDED;
241
0
      }
242
32.0M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
1.72M
    coef->MCU_ctr = 0;
245
1.72M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
1.64M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
1.63M
    start_iMCU_row(cinfo);
249
1.63M
    return JPEG_ROW_COMPLETED;
250
1.63M
  }
251
  /* Completed the scan */
252
11.6k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
11.6k
  return JPEG_SCAN_COMPLETED;
254
1.64M
}
jdcoefct-8.c:consume_data
Line
Count
Source
194
1.60M
{
195
1.60M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
1.60M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
1.60M
  int blkn, ci, xindex, yindex, yoffset;
198
1.60M
  JDIMENSION start_col;
199
1.60M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
1.60M
  JBLOCKROW buffer_ptr;
201
1.60M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
6.12M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
4.52M
    compptr = cinfo->cur_comp_info[ci];
206
4.52M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
4.52M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
4.52M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
4.52M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
210
    /* Note: entropy decoder expects buffer to be zeroed,
211
     * but this is handled automatically by the memory manager
212
     * because we requested a pre-zeroed array.
213
     */
214
4.52M
  }
215
216
  /* Loop to process one whole iMCU row */
217
3.28M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
1.68M
       yoffset++) {
219
32.8M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
31.1M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
31.1M
      blkn = 0;                 /* index of current DCT block within MCU */
223
94.4M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
63.2M
        compptr = cinfo->cur_comp_info[ci];
225
63.2M
        start_col = MCU_col_num * compptr->MCU_width;
226
140M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
77.5M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
166M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
88.9M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
88.9M
          }
231
77.5M
        }
232
63.2M
      }
233
31.1M
      if (!cinfo->entropy->insufficient_data)
234
31.1M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
31.1M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
237
        /* Suspension forced; update state counters and exit */
238
0
        coef->MCU_vert_offset = yoffset;
239
0
        coef->MCU_ctr = MCU_col_num;
240
0
        return JPEG_SUSPENDED;
241
0
      }
242
31.1M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
1.68M
    coef->MCU_ctr = 0;
245
1.68M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
1.60M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
1.59M
    start_iMCU_row(cinfo);
249
1.59M
    return JPEG_ROW_COMPLETED;
250
1.59M
  }
251
  /* Completed the scan */
252
11.0k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
11.0k
  return JPEG_SCAN_COMPLETED;
254
1.60M
}
jdcoefct-12.c:consume_data
Line
Count
Source
194
39.2k
{
195
39.2k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
39.2k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
39.2k
  int blkn, ci, xindex, yindex, yoffset;
198
39.2k
  JDIMENSION start_col;
199
39.2k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
39.2k
  JBLOCKROW buffer_ptr;
201
39.2k
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
144k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
105k
    compptr = cinfo->cur_comp_info[ci];
206
105k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
105k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
105k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
105k
       (JDIMENSION)compptr->v_samp_factor, TRUE);
210
    /* Note: entropy decoder expects buffer to be zeroed,
211
     * but this is handled automatically by the memory manager
212
     * because we requested a pre-zeroed array.
213
     */
214
105k
  }
215
216
  /* Loop to process one whole iMCU row */
217
78.6k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
39.4k
       yoffset++) {
219
862k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
823k
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
823k
      blkn = 0;                 /* index of current DCT block within MCU */
223
2.64M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
1.82M
        compptr = cinfo->cur_comp_info[ci];
225
1.82M
        start_col = MCU_col_num * compptr->MCU_width;
226
3.87M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
2.05M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
4.18M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
2.13M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
2.13M
          }
231
2.05M
        }
232
1.82M
      }
233
823k
      if (!cinfo->entropy->insufficient_data)
234
823k
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
823k
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
237
        /* Suspension forced; update state counters and exit */
238
0
        coef->MCU_vert_offset = yoffset;
239
0
        coef->MCU_ctr = MCU_col_num;
240
0
        return JPEG_SUSPENDED;
241
0
      }
242
823k
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
39.4k
    coef->MCU_ctr = 0;
245
39.4k
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
39.2k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
38.5k
    start_iMCU_row(cinfo);
249
38.5k
    return JPEG_ROW_COMPLETED;
250
38.5k
  }
251
  /* Completed the scan */
252
612
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
612
  return JPEG_SCAN_COMPLETED;
254
39.2k
}
255
256
257
/*
258
 * Decompress and return some data in the multi-pass case.
259
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
260
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
261
 *
262
 * NB: output_buf contains a plane for each component in image.
263
 */
264
265
METHODDEF(int)
266
decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
267
216k
{
268
216k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
216k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
216k
  JDIMENSION block_num;
271
216k
  int ci, block_row, block_rows;
272
216k
  JBLOCKARRAY buffer;
273
216k
  JBLOCKROW buffer_ptr;
274
216k
  _JSAMPARRAY output_ptr;
275
216k
  JDIMENSION output_col;
276
216k
  jpeg_component_info *compptr;
277
216k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
216k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
216k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
216k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
283
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
284
0
      return JPEG_SUSPENDED;
285
0
  }
286
287
  /* OK, output from the virtual arrays. */
288
892k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
675k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
675k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
675k
    buffer = (*cinfo->mem->access_virt_barray)
295
675k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
675k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
675k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
675k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
673k
      block_rows = compptr->v_samp_factor;
301
2.41k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
2.41k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
2.41k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
2.41k
    }
306
675k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
675k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
1.47M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
803k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
803k
      output_col = 0;
312
803k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
9.10M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
8.29M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
8.29M
                        output_col);
316
8.29M
        buffer_ptr++;
317
8.29M
        output_col += compptr->_DCT_scaled_size;
318
8.29M
      }
319
803k
      output_ptr += compptr->_DCT_scaled_size;
320
803k
    }
321
675k
  }
322
323
216k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
215k
    return JPEG_ROW_COMPLETED;
325
798
  return JPEG_SCAN_COMPLETED;
326
216k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
267
216k
{
268
216k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
216k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
216k
  JDIMENSION block_num;
271
216k
  int ci, block_row, block_rows;
272
216k
  JBLOCKARRAY buffer;
273
216k
  JBLOCKROW buffer_ptr;
274
216k
  _JSAMPARRAY output_ptr;
275
216k
  JDIMENSION output_col;
276
216k
  jpeg_component_info *compptr;
277
216k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
216k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
216k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
216k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
283
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
284
0
      return JPEG_SUSPENDED;
285
0
  }
286
287
  /* OK, output from the virtual arrays. */
288
892k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
675k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
675k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
675k
    buffer = (*cinfo->mem->access_virt_barray)
295
675k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
675k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
675k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
675k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
673k
      block_rows = compptr->v_samp_factor;
301
2.41k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
2.41k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
2.41k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
2.41k
    }
306
675k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
675k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
1.47M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
803k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
803k
      output_col = 0;
312
803k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
9.10M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
8.29M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
8.29M
                        output_col);
316
8.29M
        buffer_ptr++;
317
8.29M
        output_col += compptr->_DCT_scaled_size;
318
8.29M
      }
319
803k
      output_ptr += compptr->_DCT_scaled_size;
320
803k
    }
321
675k
  }
322
323
216k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
215k
    return JPEG_ROW_COMPLETED;
325
798
  return JPEG_SCAN_COMPLETED;
326
216k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_data
327
328
#endif /* D_MULTISCAN_FILES_SUPPORTED */
329
330
331
#ifdef BLOCK_SMOOTHING_SUPPORTED
332
333
/*
334
 * This code applies interblock smoothing; the first 9 AC coefficients are
335
 * estimated from the DC values of a DCT block and its 24 neighboring blocks.
336
 * We apply smoothing only for progressive JPEG decoding, and only if
337
 * the coefficients it can estimate are not yet known to full precision.
338
 */
339
340
/* Natural-order array positions of the first 9 zigzag-order coefficients */
341
1.20M
#define Q01_POS  1
342
1.20M
#define Q10_POS  8
343
1.20M
#define Q20_POS  16
344
1.20M
#define Q11_POS  9
345
1.20M
#define Q02_POS  2
346
1.05M
#define Q03_POS  3
347
1.05M
#define Q12_POS  10
348
1.05M
#define Q21_POS  17
349
1.05M
#define Q30_POS  24
350
351
/*
352
 * Determine whether block smoothing is applicable and safe.
353
 * We also latch the current states of the coef_bits[] entries for the
354
 * AC coefficients; otherwise, if the input side of the decompressor
355
 * advances into a new scan, we might think the coefficients are known
356
 * more accurately than they really are.
357
 */
358
359
LOCAL(boolean)
360
smoothing_ok(j_decompress_ptr cinfo)
361
2.29k
{
362
2.29k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
2.29k
  boolean smoothing_useful = FALSE;
364
2.29k
  int ci, coefi;
365
2.29k
  jpeg_component_info *compptr;
366
2.29k
  JQUANT_TBL *qtable;
367
2.29k
  int *coef_bits, *prev_coef_bits;
368
2.29k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
2.29k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
4
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
2.28k
  if (coef->coef_bits_latch == NULL)
375
2.28k
    coef->coef_bits_latch = (int *)
376
2.28k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
2.28k
                                  cinfo->num_components * 2 *
378
2.28k
                                  (SAVED_COEFS * sizeof(int)));
379
2.28k
  coef_bits_latch = coef->coef_bits_latch;
380
2.28k
  prev_coef_bits_latch =
381
2.28k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
8.13k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
6.25k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
6.25k
    if ((qtable = compptr->quant_table) == NULL)
387
9
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
6.24k
    if (qtable->quantval[0] == 0 ||
390
6.23k
        qtable->quantval[Q01_POS] == 0 ||
391
6.20k
        qtable->quantval[Q10_POS] == 0 ||
392
6.18k
        qtable->quantval[Q20_POS] == 0 ||
393
6.15k
        qtable->quantval[Q11_POS] == 0 ||
394
6.12k
        qtable->quantval[Q02_POS] == 0 ||
395
6.08k
        qtable->quantval[Q03_POS] == 0 ||
396
6.01k
        qtable->quantval[Q12_POS] == 0 ||
397
5.97k
        qtable->quantval[Q21_POS] == 0 ||
398
5.94k
        qtable->quantval[Q30_POS] == 0)
399
398
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
5.84k
    coef_bits = cinfo->coef_bits[ci];
402
5.84k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
5.84k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
5.84k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
58.4k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
52.6k
      if (cinfo->input_scan_number > 1)
409
35.0k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
17.6k
      else
411
17.6k
        prev_coef_bits_latch[coefi] = -1;
412
52.6k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
52.6k
      if (coef_bits[coefi] != 0)
414
38.2k
        smoothing_useful = TRUE;
415
52.6k
    }
416
5.84k
    coef_bits_latch += SAVED_COEFS;
417
5.84k
    prev_coef_bits_latch += SAVED_COEFS;
418
5.84k
  }
419
420
1.87k
  return smoothing_useful;
421
2.28k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
361
2.18k
{
362
2.18k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
2.18k
  boolean smoothing_useful = FALSE;
364
2.18k
  int ci, coefi;
365
2.18k
  jpeg_component_info *compptr;
366
2.18k
  JQUANT_TBL *qtable;
367
2.18k
  int *coef_bits, *prev_coef_bits;
368
2.18k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
2.18k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
3
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
2.18k
  if (coef->coef_bits_latch == NULL)
375
2.18k
    coef->coef_bits_latch = (int *)
376
2.18k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
2.18k
                                  cinfo->num_components * 2 *
378
2.18k
                                  (SAVED_COEFS * sizeof(int)));
379
2.18k
  coef_bits_latch = coef->coef_bits_latch;
380
2.18k
  prev_coef_bits_latch =
381
2.18k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
7.93k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
6.06k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
6.06k
    if ((qtable = compptr->quant_table) == NULL)
387
9
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
6.05k
    if (qtable->quantval[0] == 0 ||
390
6.04k
        qtable->quantval[Q01_POS] == 0 ||
391
6.03k
        qtable->quantval[Q10_POS] == 0 ||
392
6.02k
        qtable->quantval[Q20_POS] == 0 ||
393
5.99k
        qtable->quantval[Q11_POS] == 0 ||
394
5.98k
        qtable->quantval[Q02_POS] == 0 ||
395
5.95k
        qtable->quantval[Q03_POS] == 0 ||
396
5.88k
        qtable->quantval[Q12_POS] == 0 ||
397
5.84k
        qtable->quantval[Q21_POS] == 0 ||
398
5.82k
        qtable->quantval[Q30_POS] == 0)
399
308
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
5.74k
    coef_bits = cinfo->coef_bits[ci];
402
5.74k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
5.74k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
5.74k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
57.4k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
51.7k
      if (cinfo->input_scan_number > 1)
409
34.4k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
17.2k
      else
411
17.2k
        prev_coef_bits_latch[coefi] = -1;
412
51.7k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
51.7k
      if (coef_bits[coefi] != 0)
414
37.4k
        smoothing_useful = TRUE;
415
51.7k
    }
416
5.74k
    coef_bits_latch += SAVED_COEFS;
417
5.74k
    prev_coef_bits_latch += SAVED_COEFS;
418
5.74k
  }
419
420
1.86k
  return smoothing_useful;
421
2.18k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
361
103
{
362
103
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
103
  boolean smoothing_useful = FALSE;
364
103
  int ci, coefi;
365
103
  jpeg_component_info *compptr;
366
103
  JQUANT_TBL *qtable;
367
103
  int *coef_bits, *prev_coef_bits;
368
103
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
103
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
1
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
102
  if (coef->coef_bits_latch == NULL)
375
102
    coef->coef_bits_latch = (int *)
376
102
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
102
                                  cinfo->num_components * 2 *
378
102
                                  (SAVED_COEFS * sizeof(int)));
379
102
  coef_bits_latch = coef->coef_bits_latch;
380
102
  prev_coef_bits_latch =
381
102
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
204
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
192
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
192
    if ((qtable = compptr->quant_table) == NULL)
387
0
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
192
    if (qtable->quantval[0] == 0 ||
390
185
        qtable->quantval[Q01_POS] == 0 ||
391
173
        qtable->quantval[Q10_POS] == 0 ||
392
166
        qtable->quantval[Q20_POS] == 0 ||
393
152
        qtable->quantval[Q11_POS] == 0 ||
394
137
        qtable->quantval[Q02_POS] == 0 ||
395
131
        qtable->quantval[Q03_POS] == 0 ||
396
125
        qtable->quantval[Q12_POS] == 0 ||
397
121
        qtable->quantval[Q21_POS] == 0 ||
398
117
        qtable->quantval[Q30_POS] == 0)
399
90
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
102
    coef_bits = cinfo->coef_bits[ci];
402
102
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
102
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
102
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
1.02k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
918
      if (cinfo->input_scan_number > 1)
409
567
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
351
      else
411
351
        prev_coef_bits_latch[coefi] = -1;
412
918
      coef_bits_latch[coefi] = coef_bits[coefi];
413
918
      if (coef_bits[coefi] != 0)
414
801
        smoothing_useful = TRUE;
415
918
    }
416
102
    coef_bits_latch += SAVED_COEFS;
417
102
    prev_coef_bits_latch += SAVED_COEFS;
418
102
  }
419
420
12
  return smoothing_useful;
421
102
}
422
423
424
/*
425
 * Variant of decompress_data for use when doing block smoothing.
426
 */
427
428
METHODDEF(int)
429
decompress_smooth_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
430
401k
{
431
401k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
401k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
401k
  JDIMENSION block_num, last_block_column;
434
401k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
401k
    image_block_rows;
436
401k
  JBLOCKARRAY buffer;
437
401k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
401k
  JBLOCKROW next_block_row, next_next_block_row;
439
401k
  _JSAMPARRAY output_ptr;
440
401k
  JDIMENSION output_col;
441
401k
  jpeg_component_info *compptr;
442
401k
  _inverse_DCT_method_ptr inverse_DCT;
443
401k
  boolean change_dc;
444
401k
  JCOEF *workspace;
445
401k
  int *coef_bits;
446
401k
  JQUANT_TBL *quanttbl;
447
401k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
401k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
401k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
401k
      DC25;
451
401k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
401k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
401k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
401k
         !cinfo->inputctl->eoi_reached) {
459
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
460
      /* If input is working on current scan, we ordinarily want it to
461
       * have completed the current row.  But if input scan is DC,
462
       * we want it to keep two rows ahead so that next two block rows' DC
463
       * values are up to date.
464
       */
465
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
466
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
467
0
        break;
468
0
    }
469
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
470
0
      return JPEG_SUSPENDED;
471
0
  }
472
473
  /* OK, output from the virtual arrays. */
474
1.60M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
1.20M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
1.20M
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
1.20M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
1.19M
      block_rows = compptr->v_samp_factor;
482
1.19M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
1.19M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
3.83k
      block_rows = compptr->v_samp_factor;
485
3.83k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
4.16k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
4.16k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
4.16k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
4.16k
      access_rows = block_rows; /* this iMCU row only */
491
4.16k
    }
492
    /* Align the virtual buffer for this component. */
493
1.20M
    if (cinfo->output_iMCU_row > 1) {
494
1.19M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
1.19M
      buffer = (*cinfo->mem->access_virt_barray)
496
1.19M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
1.19M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
1.19M
         (JDIMENSION)access_rows, FALSE);
499
1.19M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
1.19M
    } else if (cinfo->output_iMCU_row > 0) {
501
3.83k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
3.83k
      buffer = (*cinfo->mem->access_virt_barray)
503
3.83k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
3.83k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
3.83k
         (JDIMENSION)access_rows, FALSE);
506
3.83k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
4.16k
    } else {
508
4.16k
      buffer = (*cinfo->mem->access_virt_barray)
509
4.16k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
4.16k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
4.16k
    }
512
    /* Fetch component-dependent info.
513
     * If the current scan is incomplete, then we use the component-dependent
514
     * info from the previous scan.
515
     */
516
1.20M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
0
      coef_bits =
518
0
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
1.20M
    else
520
1.20M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
1.20M
    change_dc =
524
1.20M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
1.07M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
1.05M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
1.20M
    quanttbl = compptr->quant_table;
529
1.20M
    Q00 = quanttbl->quantval[0];
530
1.20M
    Q01 = quanttbl->quantval[Q01_POS];
531
1.20M
    Q10 = quanttbl->quantval[Q10_POS];
532
1.20M
    Q20 = quanttbl->quantval[Q20_POS];
533
1.20M
    Q11 = quanttbl->quantval[Q11_POS];
534
1.20M
    Q02 = quanttbl->quantval[Q02_POS];
535
1.20M
    if (change_dc) {
536
1.04M
      Q03 = quanttbl->quantval[Q03_POS];
537
1.04M
      Q12 = quanttbl->quantval[Q12_POS];
538
1.04M
      Q21 = quanttbl->quantval[Q21_POS];
539
1.04M
      Q30 = quanttbl->quantval[Q30_POS];
540
1.04M
    }
541
1.20M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
1.20M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
1.20M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
2.79M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
1.59M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
1.59M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
1.59M
      if (image_block_row > 0)
550
1.59M
        prev_block_row =
551
1.59M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
4.16k
      else
553
4.16k
        prev_block_row = buffer_ptr;
554
555
1.59M
      if (image_block_row > 1)
556
1.58M
        prev_prev_block_row =
557
1.58M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
8.08k
      else
559
8.08k
        prev_prev_block_row = prev_block_row;
560
561
1.59M
      if (image_block_row < image_block_rows - 1)
562
1.59M
        next_block_row =
563
1.59M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
4.16k
      else
565
4.16k
        next_block_row = buffer_ptr;
566
567
1.59M
      if (image_block_row < image_block_rows - 2)
568
1.58M
        next_next_block_row =
569
1.58M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
7.88k
      else
571
7.88k
        next_next_block_row = next_block_row;
572
573
      /* We fetch the surrounding DC values using a sliding-register approach.
574
       * Initialize all 25 here so as to do the right thing on narrow pics.
575
       */
576
1.59M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
1.59M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
1.59M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
1.59M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
1.59M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
1.59M
      output_col = 0;
582
1.59M
      last_block_column = compptr->width_in_blocks - 1;
583
1.59M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
28.7M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
27.1M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
27.1M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
1.59M
            block_num < last_block_column) {
590
1.40M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
1.40M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
1.40M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
1.40M
          DC19 = DC20 = (int)next_block_row[1][0];
594
1.40M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
1.40M
        }
596
27.1M
        if (block_num + 1 < last_block_column) {
597
24.1M
          DC05 = (int)prev_prev_block_row[2][0];
598
24.1M
          DC10 = (int)prev_block_row[2][0];
599
24.1M
          DC15 = (int)buffer_ptr[2][0];
600
24.1M
          DC20 = (int)next_block_row[2][0];
601
24.1M
          DC25 = (int)next_next_block_row[2][0];
602
24.1M
        }
603
        /* If DC interpolation is enabled, compute coefficient estimates using
604
         * a Gaussian-like kernel, keeping the averages of the DC values.
605
         *
606
         * If DC interpolation is disabled, compute coefficient estimates using
607
         * an algorithm similar to the one described in Section K.8 of the JPEG
608
         * standard, except applied to a 5x5 window rather than a 3x3 window.
609
         *
610
         * An estimate is applied only if the coefficient is still zero and is
611
         * not known to be fully accurate.
612
         */
613
        /* AC01 */
614
27.1M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
25.8M
          num = Q00 * (change_dc ?
616
23.0M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
23.0M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
23.0M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
23.0M
                 DC21 - DC22 + DC24 + DC25) :
620
25.8M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
25.8M
          if (num >= 0) {
622
16.4M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
16.4M
            if (Al > 0 && pred >= (1 << Al))
624
200k
              pred = (1 << Al) - 1;
625
16.4M
          } else {
626
9.41M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
9.41M
            if (Al > 0 && pred >= (1 << Al))
628
169k
              pred = (1 << Al) - 1;
629
9.41M
            pred = -pred;
630
9.41M
          }
631
25.8M
          workspace[1] = (JCOEF)pred;
632
25.8M
        }
633
        /* AC10 */
634
27.1M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
25.7M
          num = Q00 * (change_dc ?
636
23.0M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
23.0M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
23.0M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
23.0M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
25.7M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
25.7M
          if (num >= 0) {
642
16.8M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
16.8M
            if (Al > 0 && pred >= (1 << Al))
644
274k
              pred = (1 << Al) - 1;
645
16.8M
          } else {
646
8.91M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
8.91M
            if (Al > 0 && pred >= (1 << Al))
648
272k
              pred = (1 << Al) - 1;
649
8.91M
            pred = -pred;
650
8.91M
          }
651
25.7M
          workspace[8] = (JCOEF)pred;
652
25.7M
        }
653
        /* AC20 */
654
27.1M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
25.5M
          num = Q00 * (change_dc ?
656
23.0M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
23.0M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
25.5M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
25.5M
          if (num >= 0) {
660
16.3M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
16.3M
            if (Al > 0 && pred >= (1 << Al))
662
152k
              pred = (1 << Al) - 1;
663
16.3M
          } else {
664
9.25M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
9.25M
            if (Al > 0 && pred >= (1 << Al))
666
145k
              pred = (1 << Al) - 1;
667
9.25M
            pred = -pred;
668
9.25M
          }
669
25.5M
          workspace[16] = (JCOEF)pred;
670
25.5M
        }
671
        /* AC11 */
672
27.1M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
25.5M
          num = Q00 * (change_dc ?
674
23.0M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
23.0M
                 9 * DC19 + DC21 - DC25) :
676
25.5M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
2.52M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
25.5M
          if (num >= 0) {
679
19.7M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
19.7M
            if (Al > 0 && pred >= (1 << Al))
681
45.5k
              pred = (1 << Al) - 1;
682
19.7M
          } else {
683
5.83M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
5.83M
            if (Al > 0 && pred >= (1 << Al))
685
46.1k
              pred = (1 << Al) - 1;
686
5.83M
            pred = -pred;
687
5.83M
          }
688
25.5M
          workspace[9] = (JCOEF)pred;
689
25.5M
        }
690
        /* AC02 */
691
27.1M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
25.5M
          num = Q00 * (change_dc ?
693
23.0M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
23.0M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
25.5M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
25.5M
          if (num >= 0) {
697
16.3M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
16.3M
            if (Al > 0 && pred >= (1 << Al))
699
105k
              pred = (1 << Al) - 1;
700
16.3M
          } else {
701
9.26M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
9.26M
            if (Al > 0 && pred >= (1 << Al))
703
111k
              pred = (1 << Al) - 1;
704
9.26M
            pred = -pred;
705
9.26M
          }
706
25.5M
          workspace[2] = (JCOEF)pred;
707
25.5M
        }
708
27.1M
        if (change_dc) {
709
          /* AC03 */
710
23.0M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
23.0M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
23.0M
            if (num >= 0) {
713
15.1M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
15.1M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
15.1M
            } else {
717
7.81M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
7.81M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
7.81M
              pred = -pred;
721
7.81M
            }
722
23.0M
            workspace[3] = (JCOEF)pred;
723
23.0M
          }
724
          /* AC12 */
725
23.0M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
23.0M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
23.0M
            if (num >= 0) {
728
14.1M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
14.1M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
14.1M
            } else {
732
8.89M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
8.89M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
8.89M
              pred = -pred;
736
8.89M
            }
737
23.0M
            workspace[10] = (JCOEF)pred;
738
23.0M
          }
739
          /* AC21 */
740
23.0M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
23.0M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
23.0M
            if (num >= 0) {
743
14.5M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
14.5M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
14.5M
            } else {
747
8.50M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
8.50M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
8.50M
              pred = -pred;
751
8.50M
            }
752
23.0M
            workspace[17] = (JCOEF)pred;
753
23.0M
          }
754
          /* AC30 */
755
23.0M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
23.0M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
23.0M
            if (num >= 0) {
758
15.4M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
15.4M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
15.4M
            } else {
762
7.51M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
7.51M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
7.51M
              pred = -pred;
766
7.51M
            }
767
23.0M
            workspace[24] = (JCOEF)pred;
768
23.0M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
23.0M
          num = Q00 *
773
23.0M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
23.0M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
23.0M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
23.0M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
23.0M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
23.0M
          if (num >= 0) {
779
11.3M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
11.6M
          } else {
781
11.6M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
11.6M
            pred = -pred;
783
11.6M
          }
784
23.0M
          workspace[0] = (JCOEF)pred;
785
23.0M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
27.1M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
27.1M
                        output_col);
790
        /* Advance for next column */
791
27.1M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
27.1M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
27.1M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
27.1M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
27.1M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
27.1M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
27.1M
          prev_prev_block_row++, next_next_block_row++;
798
27.1M
        output_col += compptr->_DCT_scaled_size;
799
27.1M
      }
800
1.59M
      output_ptr += compptr->_DCT_scaled_size;
801
1.59M
    }
802
1.20M
  }
803
804
401k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
399k
    return JPEG_ROW_COMPLETED;
806
1.38k
  return JPEG_SCAN_COMPLETED;
807
401k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
430
401k
{
431
401k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
401k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
401k
  JDIMENSION block_num, last_block_column;
434
401k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
401k
    image_block_rows;
436
401k
  JBLOCKARRAY buffer;
437
401k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
401k
  JBLOCKROW next_block_row, next_next_block_row;
439
401k
  _JSAMPARRAY output_ptr;
440
401k
  JDIMENSION output_col;
441
401k
  jpeg_component_info *compptr;
442
401k
  _inverse_DCT_method_ptr inverse_DCT;
443
401k
  boolean change_dc;
444
401k
  JCOEF *workspace;
445
401k
  int *coef_bits;
446
401k
  JQUANT_TBL *quanttbl;
447
401k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
401k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
401k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
401k
      DC25;
451
401k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
401k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
401k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
401k
         !cinfo->inputctl->eoi_reached) {
459
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
460
      /* If input is working on current scan, we ordinarily want it to
461
       * have completed the current row.  But if input scan is DC,
462
       * we want it to keep two rows ahead so that next two block rows' DC
463
       * values are up to date.
464
       */
465
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
466
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
467
0
        break;
468
0
    }
469
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
470
0
      return JPEG_SUSPENDED;
471
0
  }
472
473
  /* OK, output from the virtual arrays. */
474
1.60M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
1.20M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
1.20M
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
1.20M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
1.19M
      block_rows = compptr->v_samp_factor;
482
1.19M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
1.19M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
3.83k
      block_rows = compptr->v_samp_factor;
485
3.83k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
4.16k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
4.16k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
4.16k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
4.16k
      access_rows = block_rows; /* this iMCU row only */
491
4.16k
    }
492
    /* Align the virtual buffer for this component. */
493
1.20M
    if (cinfo->output_iMCU_row > 1) {
494
1.19M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
1.19M
      buffer = (*cinfo->mem->access_virt_barray)
496
1.19M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
1.19M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
1.19M
         (JDIMENSION)access_rows, FALSE);
499
1.19M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
1.19M
    } else if (cinfo->output_iMCU_row > 0) {
501
3.83k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
3.83k
      buffer = (*cinfo->mem->access_virt_barray)
503
3.83k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
3.83k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
3.83k
         (JDIMENSION)access_rows, FALSE);
506
3.83k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
4.16k
    } else {
508
4.16k
      buffer = (*cinfo->mem->access_virt_barray)
509
4.16k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
4.16k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
4.16k
    }
512
    /* Fetch component-dependent info.
513
     * If the current scan is incomplete, then we use the component-dependent
514
     * info from the previous scan.
515
     */
516
1.20M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
0
      coef_bits =
518
0
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
1.20M
    else
520
1.20M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
1.20M
    change_dc =
524
1.20M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
1.07M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
1.05M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
1.20M
    quanttbl = compptr->quant_table;
529
1.20M
    Q00 = quanttbl->quantval[0];
530
1.20M
    Q01 = quanttbl->quantval[Q01_POS];
531
1.20M
    Q10 = quanttbl->quantval[Q10_POS];
532
1.20M
    Q20 = quanttbl->quantval[Q20_POS];
533
1.20M
    Q11 = quanttbl->quantval[Q11_POS];
534
1.20M
    Q02 = quanttbl->quantval[Q02_POS];
535
1.20M
    if (change_dc) {
536
1.04M
      Q03 = quanttbl->quantval[Q03_POS];
537
1.04M
      Q12 = quanttbl->quantval[Q12_POS];
538
1.04M
      Q21 = quanttbl->quantval[Q21_POS];
539
1.04M
      Q30 = quanttbl->quantval[Q30_POS];
540
1.04M
    }
541
1.20M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
1.20M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
1.20M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
2.79M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
1.59M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
1.59M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
1.59M
      if (image_block_row > 0)
550
1.59M
        prev_block_row =
551
1.59M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
4.16k
      else
553
4.16k
        prev_block_row = buffer_ptr;
554
555
1.59M
      if (image_block_row > 1)
556
1.58M
        prev_prev_block_row =
557
1.58M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
8.08k
      else
559
8.08k
        prev_prev_block_row = prev_block_row;
560
561
1.59M
      if (image_block_row < image_block_rows - 1)
562
1.59M
        next_block_row =
563
1.59M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
4.16k
      else
565
4.16k
        next_block_row = buffer_ptr;
566
567
1.59M
      if (image_block_row < image_block_rows - 2)
568
1.58M
        next_next_block_row =
569
1.58M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
7.88k
      else
571
7.88k
        next_next_block_row = next_block_row;
572
573
      /* We fetch the surrounding DC values using a sliding-register approach.
574
       * Initialize all 25 here so as to do the right thing on narrow pics.
575
       */
576
1.59M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
1.59M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
1.59M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
1.59M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
1.59M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
1.59M
      output_col = 0;
582
1.59M
      last_block_column = compptr->width_in_blocks - 1;
583
1.59M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
28.7M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
27.1M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
27.1M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
1.59M
            block_num < last_block_column) {
590
1.40M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
1.40M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
1.40M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
1.40M
          DC19 = DC20 = (int)next_block_row[1][0];
594
1.40M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
1.40M
        }
596
27.1M
        if (block_num + 1 < last_block_column) {
597
24.1M
          DC05 = (int)prev_prev_block_row[2][0];
598
24.1M
          DC10 = (int)prev_block_row[2][0];
599
24.1M
          DC15 = (int)buffer_ptr[2][0];
600
24.1M
          DC20 = (int)next_block_row[2][0];
601
24.1M
          DC25 = (int)next_next_block_row[2][0];
602
24.1M
        }
603
        /* If DC interpolation is enabled, compute coefficient estimates using
604
         * a Gaussian-like kernel, keeping the averages of the DC values.
605
         *
606
         * If DC interpolation is disabled, compute coefficient estimates using
607
         * an algorithm similar to the one described in Section K.8 of the JPEG
608
         * standard, except applied to a 5x5 window rather than a 3x3 window.
609
         *
610
         * An estimate is applied only if the coefficient is still zero and is
611
         * not known to be fully accurate.
612
         */
613
        /* AC01 */
614
27.1M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
25.8M
          num = Q00 * (change_dc ?
616
23.0M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
23.0M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
23.0M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
23.0M
                 DC21 - DC22 + DC24 + DC25) :
620
25.8M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
25.8M
          if (num >= 0) {
622
16.4M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
16.4M
            if (Al > 0 && pred >= (1 << Al))
624
200k
              pred = (1 << Al) - 1;
625
16.4M
          } else {
626
9.41M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
9.41M
            if (Al > 0 && pred >= (1 << Al))
628
169k
              pred = (1 << Al) - 1;
629
9.41M
            pred = -pred;
630
9.41M
          }
631
25.8M
          workspace[1] = (JCOEF)pred;
632
25.8M
        }
633
        /* AC10 */
634
27.1M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
25.7M
          num = Q00 * (change_dc ?
636
23.0M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
23.0M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
23.0M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
23.0M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
25.7M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
25.7M
          if (num >= 0) {
642
16.8M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
16.8M
            if (Al > 0 && pred >= (1 << Al))
644
274k
              pred = (1 << Al) - 1;
645
16.8M
          } else {
646
8.91M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
8.91M
            if (Al > 0 && pred >= (1 << Al))
648
272k
              pred = (1 << Al) - 1;
649
8.91M
            pred = -pred;
650
8.91M
          }
651
25.7M
          workspace[8] = (JCOEF)pred;
652
25.7M
        }
653
        /* AC20 */
654
27.1M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
25.5M
          num = Q00 * (change_dc ?
656
23.0M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
23.0M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
25.5M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
25.5M
          if (num >= 0) {
660
16.3M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
16.3M
            if (Al > 0 && pred >= (1 << Al))
662
152k
              pred = (1 << Al) - 1;
663
16.3M
          } else {
664
9.25M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
9.25M
            if (Al > 0 && pred >= (1 << Al))
666
145k
              pred = (1 << Al) - 1;
667
9.25M
            pred = -pred;
668
9.25M
          }
669
25.5M
          workspace[16] = (JCOEF)pred;
670
25.5M
        }
671
        /* AC11 */
672
27.1M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
25.5M
          num = Q00 * (change_dc ?
674
23.0M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
23.0M
                 9 * DC19 + DC21 - DC25) :
676
25.5M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
2.52M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
25.5M
          if (num >= 0) {
679
19.7M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
19.7M
            if (Al > 0 && pred >= (1 << Al))
681
45.5k
              pred = (1 << Al) - 1;
682
19.7M
          } else {
683
5.83M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
5.83M
            if (Al > 0 && pred >= (1 << Al))
685
46.1k
              pred = (1 << Al) - 1;
686
5.83M
            pred = -pred;
687
5.83M
          }
688
25.5M
          workspace[9] = (JCOEF)pred;
689
25.5M
        }
690
        /* AC02 */
691
27.1M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
25.5M
          num = Q00 * (change_dc ?
693
23.0M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
23.0M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
25.5M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
25.5M
          if (num >= 0) {
697
16.3M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
16.3M
            if (Al > 0 && pred >= (1 << Al))
699
105k
              pred = (1 << Al) - 1;
700
16.3M
          } else {
701
9.26M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
9.26M
            if (Al > 0 && pred >= (1 << Al))
703
111k
              pred = (1 << Al) - 1;
704
9.26M
            pred = -pred;
705
9.26M
          }
706
25.5M
          workspace[2] = (JCOEF)pred;
707
25.5M
        }
708
27.1M
        if (change_dc) {
709
          /* AC03 */
710
23.0M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
23.0M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
23.0M
            if (num >= 0) {
713
15.1M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
15.1M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
15.1M
            } else {
717
7.81M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
7.81M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
7.81M
              pred = -pred;
721
7.81M
            }
722
23.0M
            workspace[3] = (JCOEF)pred;
723
23.0M
          }
724
          /* AC12 */
725
23.0M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
23.0M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
23.0M
            if (num >= 0) {
728
14.1M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
14.1M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
14.1M
            } else {
732
8.89M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
8.89M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
8.89M
              pred = -pred;
736
8.89M
            }
737
23.0M
            workspace[10] = (JCOEF)pred;
738
23.0M
          }
739
          /* AC21 */
740
23.0M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
23.0M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
23.0M
            if (num >= 0) {
743
14.5M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
14.5M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
14.5M
            } else {
747
8.50M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
8.50M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
8.50M
              pred = -pred;
751
8.50M
            }
752
23.0M
            workspace[17] = (JCOEF)pred;
753
23.0M
          }
754
          /* AC30 */
755
23.0M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
23.0M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
23.0M
            if (num >= 0) {
758
15.4M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
15.4M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
15.4M
            } else {
762
7.51M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
7.51M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
7.51M
              pred = -pred;
766
7.51M
            }
767
23.0M
            workspace[24] = (JCOEF)pred;
768
23.0M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
23.0M
          num = Q00 *
773
23.0M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
23.0M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
23.0M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
23.0M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
23.0M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
23.0M
          if (num >= 0) {
779
11.3M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
11.6M
          } else {
781
11.6M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
11.6M
            pred = -pred;
783
11.6M
          }
784
23.0M
          workspace[0] = (JCOEF)pred;
785
23.0M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
27.1M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
27.1M
                        output_col);
790
        /* Advance for next column */
791
27.1M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
27.1M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
27.1M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
27.1M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
27.1M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
27.1M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
27.1M
          prev_prev_block_row++, next_next_block_row++;
798
27.1M
        output_col += compptr->_DCT_scaled_size;
799
27.1M
      }
800
1.59M
      output_ptr += compptr->_DCT_scaled_size;
801
1.59M
    }
802
1.20M
  }
803
804
401k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
399k
    return JPEG_ROW_COMPLETED;
806
1.38k
  return JPEG_SCAN_COMPLETED;
807
401k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_smooth_data
808
809
#endif /* BLOCK_SMOOTHING_SUPPORTED */
810
811
812
/*
813
 * Initialize coefficient buffer controller.
814
 */
815
816
GLOBAL(void)
817
_jinit_d_coef_controller(j_decompress_ptr cinfo, boolean need_full_buffer)
818
5.60k
{
819
5.60k
  my_coef_ptr coef;
820
821
5.60k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
5.60k
  coef = (my_coef_ptr)
825
5.60k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
5.60k
                                sizeof(my_coef_controller));
827
5.60k
  memset(coef, 0, sizeof(my_coef_controller));
828
5.60k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
5.60k
  coef->pub.start_input_pass = start_input_pass;
830
5.60k
  coef->pub.start_output_pass = start_output_pass;
831
5.60k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
5.60k
  coef->coef_bits_latch = NULL;
833
5.60k
#endif
834
835
  /* Create the coefficient buffer. */
836
5.60k
  if (need_full_buffer) {
837
3.21k
#ifdef D_MULTISCAN_FILES_SUPPORTED
838
    /* Allocate a full-image virtual array for each component, */
839
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
840
    /* Note we ask for a pre-zeroed array. */
841
3.21k
    int ci, access_rows;
842
3.21k
    jpeg_component_info *compptr;
843
844
12.8k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
9.67k
         ci++, compptr++) {
846
9.67k
      access_rows = compptr->v_samp_factor;
847
9.67k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
9.67k
      if (cinfo->progressive_mode)
850
9.65k
        access_rows *= 5;
851
9.67k
#endif
852
9.67k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
9.67k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
9.67k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
9.67k
                               (long)compptr->h_samp_factor),
856
9.67k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
9.67k
                               (long)compptr->v_samp_factor),
858
9.67k
         (JDIMENSION)access_rows);
859
9.67k
    }
860
3.21k
    coef->pub.consume_data = consume_data;
861
3.21k
    coef->pub._decompress_data = decompress_data;
862
3.21k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
3.21k
  } else {
867
    /* We only need a single-MCU buffer. */
868
2.38k
    JBLOCKROW buffer;
869
2.38k
    int i;
870
871
2.38k
    buffer = (JBLOCKROW)
872
2.38k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
2.38k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
26.2k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
23.8k
      coef->MCU_buffer[i] = buffer + i;
876
23.8k
    }
877
2.38k
    coef->pub.consume_data = dummy_consume_data;
878
2.38k
    coef->pub._decompress_data = decompress_onepass;
879
2.38k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
2.38k
  }
881
882
  /* Allocate the workspace buffer */
883
5.60k
  coef->workspace = (JCOEF *)
884
5.60k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
5.60k
                                sizeof(JCOEF) * DCTSIZE2);
886
5.60k
}
jinit_d_coef_controller
Line
Count
Source
818
5.29k
{
819
5.29k
  my_coef_ptr coef;
820
821
5.29k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
5.29k
  coef = (my_coef_ptr)
825
5.29k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
5.29k
                                sizeof(my_coef_controller));
827
5.29k
  memset(coef, 0, sizeof(my_coef_controller));
828
5.29k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
5.29k
  coef->pub.start_input_pass = start_input_pass;
830
5.29k
  coef->pub.start_output_pass = start_output_pass;
831
5.29k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
5.29k
  coef->coef_bits_latch = NULL;
833
5.29k
#endif
834
835
  /* Create the coefficient buffer. */
836
5.29k
  if (need_full_buffer) {
837
2.93k
#ifdef D_MULTISCAN_FILES_SUPPORTED
838
    /* Allocate a full-image virtual array for each component, */
839
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
840
    /* Note we ask for a pre-zeroed array. */
841
2.93k
    int ci, access_rows;
842
2.93k
    jpeg_component_info *compptr;
843
844
11.7k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
8.82k
         ci++, compptr++) {
846
8.82k
      access_rows = compptr->v_samp_factor;
847
8.82k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
8.82k
      if (cinfo->progressive_mode)
850
8.81k
        access_rows *= 5;
851
8.82k
#endif
852
8.82k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
8.82k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
8.82k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
8.82k
                               (long)compptr->h_samp_factor),
856
8.82k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
8.82k
                               (long)compptr->v_samp_factor),
858
8.82k
         (JDIMENSION)access_rows);
859
8.82k
    }
860
2.93k
    coef->pub.consume_data = consume_data;
861
2.93k
    coef->pub._decompress_data = decompress_data;
862
2.93k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
2.93k
  } else {
867
    /* We only need a single-MCU buffer. */
868
2.35k
    JBLOCKROW buffer;
869
2.35k
    int i;
870
871
2.35k
    buffer = (JBLOCKROW)
872
2.35k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
2.35k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
25.9k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
23.5k
      coef->MCU_buffer[i] = buffer + i;
876
23.5k
    }
877
2.35k
    coef->pub.consume_data = dummy_consume_data;
878
2.35k
    coef->pub._decompress_data = decompress_onepass;
879
2.35k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
2.35k
  }
881
882
  /* Allocate the workspace buffer */
883
5.29k
  coef->workspace = (JCOEF *)
884
5.29k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
5.29k
                                sizeof(JCOEF) * DCTSIZE2);
886
5.29k
}
j12init_d_coef_controller
Line
Count
Source
818
306
{
819
306
  my_coef_ptr coef;
820
821
306
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
306
  coef = (my_coef_ptr)
825
306
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
306
                                sizeof(my_coef_controller));
827
306
  memset(coef, 0, sizeof(my_coef_controller));
828
306
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
306
  coef->pub.start_input_pass = start_input_pass;
830
306
  coef->pub.start_output_pass = start_output_pass;
831
306
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
306
  coef->coef_bits_latch = NULL;
833
306
#endif
834
835
  /* Create the coefficient buffer. */
836
306
  if (need_full_buffer) {
837
281
#ifdef D_MULTISCAN_FILES_SUPPORTED
838
    /* Allocate a full-image virtual array for each component, */
839
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
840
    /* Note we ask for a pre-zeroed array. */
841
281
    int ci, access_rows;
842
281
    jpeg_component_info *compptr;
843
844
1.12k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
841
         ci++, compptr++) {
846
841
      access_rows = compptr->v_samp_factor;
847
841
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
841
      if (cinfo->progressive_mode)
850
835
        access_rows *= 5;
851
841
#endif
852
841
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
841
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
841
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
841
                               (long)compptr->h_samp_factor),
856
841
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
841
                               (long)compptr->v_samp_factor),
858
841
         (JDIMENSION)access_rows);
859
841
    }
860
281
    coef->pub.consume_data = consume_data;
861
281
    coef->pub._decompress_data = decompress_data;
862
281
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
281
  } else {
867
    /* We only need a single-MCU buffer. */
868
25
    JBLOCKROW buffer;
869
25
    int i;
870
871
25
    buffer = (JBLOCKROW)
872
25
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
25
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
275
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
250
      coef->MCU_buffer[i] = buffer + i;
876
250
    }
877
25
    coef->pub.consume_data = dummy_consume_data;
878
25
    coef->pub._decompress_data = decompress_onepass;
879
25
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
25
  }
881
882
  /* Allocate the workspace buffer */
883
306
  coef->workspace = (JCOEF *)
884
306
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
306
                                sizeof(JCOEF) * DCTSIZE2);
886
306
}