Coverage Report

Created: 2025-07-18 07:03

/src/libjpeg-turbo/src/jdcoefct.c
Line
Count
Source (jump to first uncovered line)
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
16.0k
{
48
16.0k
  cinfo->input_iMCU_row = 0;
49
16.0k
  start_iMCU_row(cinfo);
50
16.0k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
47
15.5k
{
48
15.5k
  cinfo->input_iMCU_row = 0;
49
15.5k
  start_iMCU_row(cinfo);
50
15.5k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
47
510
{
48
510
  cinfo->input_iMCU_row = 0;
49
510
  start_iMCU_row(cinfo);
50
510
}
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.65k
{
60
4.65k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
4.65k
  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.65k
  if (coef->pub.coef_arrays != NULL) {
65
2.62k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.53k
      coef->pub._decompress_data = decompress_smooth_data;
67
1.08k
    else
68
1.08k
      coef->pub._decompress_data = decompress_data;
69
2.62k
  }
70
4.65k
#endif
71
4.65k
  cinfo->output_iMCU_row = 0;
72
4.65k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
59
4.54k
{
60
4.54k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
4.54k
  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.54k
  if (coef->pub.coef_arrays != NULL) {
65
2.53k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.50k
      coef->pub._decompress_data = decompress_smooth_data;
67
1.03k
    else
68
1.03k
      coef->pub._decompress_data = decompress_data;
69
2.53k
  }
70
4.54k
#endif
71
4.54k
  cinfo->output_iMCU_row = 0;
72
4.54k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
59
105
{
60
105
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
105
  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
105
  if (coef->pub.coef_arrays != NULL) {
65
83
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
28
      coef->pub._decompress_data = decompress_smooth_data;
67
55
    else
68
55
      coef->pub._decompress_data = decompress_data;
69
83
  }
70
105
#endif
71
105
  cinfo->output_iMCU_row = 0;
72
105
}
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
53.8k
{
88
53.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
53.8k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
53.8k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
53.8k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
53.8k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
53.8k
  _JSAMPARRAY output_ptr;
94
53.8k
  JDIMENSION start_col, output_col;
95
53.8k
  jpeg_component_info *compptr;
96
53.8k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
112k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
58.3k
       yoffset++) {
101
5.02M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
4.96M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
4.96M
      jzero_far((void *)coef->MCU_buffer[0],
105
4.96M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
4.96M
      if (!cinfo->entropy->insufficient_data)
107
4.96M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
4.96M
      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
4.96M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
4.96M
          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
4.96M
        blkn = 0;               /* index of current DCT block within MCU */
126
15.6M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
10.7M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
10.7M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
10.7M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
10.7M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
10.5M
                         compptr->MCU_width : compptr->last_col_width;
136
10.7M
          output_ptr = output_buf[compptr->component_index] +
137
10.7M
                       yoffset * compptr->_DCT_scaled_size;
138
10.7M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
10.7M
                      compptr->MCU_sample_width;
140
22.8M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
12.1M
            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
27.0M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
14.9M
                (*inverse_DCT) (cinfo, compptr,
146
14.9M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
14.9M
                                output_ptr, output_col);
148
14.9M
                output_col += compptr->_DCT_scaled_size;
149
14.9M
              }
150
12.1M
            }
151
12.1M
            blkn += compptr->MCU_width;
152
12.1M
            output_ptr += compptr->_DCT_scaled_size;
153
12.1M
          }
154
10.7M
        }
155
4.96M
      }
156
4.96M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
58.3k
    coef->MCU_ctr = 0;
159
58.3k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
53.8k
  cinfo->output_iMCU_row++;
162
53.8k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
51.8k
    start_iMCU_row(cinfo);
164
51.8k
    return JPEG_ROW_COMPLETED;
165
51.8k
  }
166
  /* Completed the scan */
167
2.00k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
2.00k
  return JPEG_SCAN_COMPLETED;
169
53.8k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
87
53.8k
{
88
53.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
53.8k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
53.8k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
53.8k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
53.8k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
53.8k
  _JSAMPARRAY output_ptr;
94
53.8k
  JDIMENSION start_col, output_col;
95
53.8k
  jpeg_component_info *compptr;
96
53.8k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
112k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
58.3k
       yoffset++) {
101
5.02M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
4.96M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
4.96M
      jzero_far((void *)coef->MCU_buffer[0],
105
4.96M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
4.96M
      if (!cinfo->entropy->insufficient_data)
107
4.96M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
4.96M
      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
4.96M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
4.96M
          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
4.96M
        blkn = 0;               /* index of current DCT block within MCU */
126
15.6M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
10.7M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
10.7M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
10.7M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
10.7M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
10.5M
                         compptr->MCU_width : compptr->last_col_width;
136
10.7M
          output_ptr = output_buf[compptr->component_index] +
137
10.7M
                       yoffset * compptr->_DCT_scaled_size;
138
10.7M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
10.7M
                      compptr->MCU_sample_width;
140
22.8M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
12.1M
            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
27.0M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
14.9M
                (*inverse_DCT) (cinfo, compptr,
146
14.9M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
14.9M
                                output_ptr, output_col);
148
14.9M
                output_col += compptr->_DCT_scaled_size;
149
14.9M
              }
150
12.1M
            }
151
12.1M
            blkn += compptr->MCU_width;
152
12.1M
            output_ptr += compptr->_DCT_scaled_size;
153
12.1M
          }
154
10.7M
        }
155
4.96M
      }
156
4.96M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
58.3k
    coef->MCU_ctr = 0;
159
58.3k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
53.8k
  cinfo->output_iMCU_row++;
162
53.8k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
51.8k
    start_iMCU_row(cinfo);
164
51.8k
    return JPEG_ROW_COMPLETED;
165
51.8k
  }
166
  /* Completed the scan */
167
2.00k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
2.00k
  return JPEG_SCAN_COMPLETED;
169
53.8k
}
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
905k
{
195
905k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
905k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
905k
  int blkn, ci, xindex, yindex, yoffset;
198
905k
  JDIMENSION start_col;
199
905k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
905k
  JBLOCKROW buffer_ptr;
201
905k
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
3.69M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
2.78M
    compptr = cinfo->cur_comp_info[ci];
206
2.78M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
2.78M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
2.78M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
2.78M
       (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
2.78M
  }
215
216
  /* Loop to process one whole iMCU row */
217
1.97M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
1.06M
       yoffset++) {
219
22.7M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
21.6M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
21.6M
      blkn = 0;                 /* index of current DCT block within MCU */
223
63.8M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
42.1M
        compptr = cinfo->cur_comp_info[ci];
225
42.1M
        start_col = MCU_col_num * compptr->MCU_width;
226
99.2M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
57.0M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
124M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
67.5M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
67.5M
          }
231
57.0M
        }
232
42.1M
      }
233
21.6M
      if (!cinfo->entropy->insufficient_data)
234
21.6M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
21.6M
      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
21.6M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
1.06M
    coef->MCU_ctr = 0;
245
1.06M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
905k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
891k
    start_iMCU_row(cinfo);
249
891k
    return JPEG_ROW_COMPLETED;
250
891k
  }
251
  /* Completed the scan */
252
14.0k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
14.0k
  return JPEG_SCAN_COMPLETED;
254
905k
}
jdcoefct-8.c:consume_data
Line
Count
Source
194
405k
{
195
405k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
405k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
405k
  int blkn, ci, xindex, yindex, yoffset;
198
405k
  JDIMENSION start_col;
199
405k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
405k
  JBLOCKROW buffer_ptr;
201
405k
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
1.22M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
816k
    compptr = cinfo->cur_comp_info[ci];
206
816k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
816k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
816k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
816k
       (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
816k
  }
215
216
  /* Loop to process one whole iMCU row */
217
968k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
562k
       yoffset++) {
219
19.7M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
19.1M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
19.1M
      blkn = 0;                 /* index of current DCT block within MCU */
223
51.9M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
32.7M
        compptr = cinfo->cur_comp_info[ci];
225
32.7M
        start_col = MCU_col_num * compptr->MCU_width;
226
78.0M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
45.2M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
100M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
55.2M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
55.2M
          }
231
45.2M
        }
232
32.7M
      }
233
19.1M
      if (!cinfo->entropy->insufficient_data)
234
19.1M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
19.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
19.1M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
562k
    coef->MCU_ctr = 0;
245
562k
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
405k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
392k
    start_iMCU_row(cinfo);
249
392k
    return JPEG_ROW_COMPLETED;
250
392k
  }
251
  /* Completed the scan */
252
13.5k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
13.5k
  return JPEG_SCAN_COMPLETED;
254
405k
}
jdcoefct-12.c:consume_data
Line
Count
Source
194
499k
{
195
499k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
499k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
499k
  int blkn, ci, xindex, yindex, yoffset;
198
499k
  JDIMENSION start_col;
199
499k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
499k
  JBLOCKROW buffer_ptr;
201
499k
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
2.47M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
1.97M
    compptr = cinfo->cur_comp_info[ci];
206
1.97M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
1.97M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
1.97M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
1.97M
       (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
1.97M
  }
215
216
  /* Loop to process one whole iMCU row */
217
1.00M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
505k
       yoffset++) {
219
3.02M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
2.51M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
2.51M
      blkn = 0;                 /* index of current DCT block within MCU */
223
11.9M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
9.39M
        compptr = cinfo->cur_comp_info[ci];
225
9.39M
        start_col = MCU_col_num * compptr->MCU_width;
226
21.1M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
11.7M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
24.0M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
12.2M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
12.2M
          }
231
11.7M
        }
232
9.39M
      }
233
2.51M
      if (!cinfo->entropy->insufficient_data)
234
2.51M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
2.51M
      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
2.51M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
505k
    coef->MCU_ctr = 0;
245
505k
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
499k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
499k
    start_iMCU_row(cinfo);
249
499k
    return JPEG_ROW_COMPLETED;
250
499k
  }
251
  /* Completed the scan */
252
487
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
487
  return JPEG_SCAN_COMPLETED;
254
499k
}
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
34.2k
{
268
34.2k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
34.2k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
34.2k
  JDIMENSION block_num;
271
34.2k
  int ci, block_row, block_rows;
272
34.2k
  JBLOCKARRAY buffer;
273
34.2k
  JBLOCKROW buffer_ptr;
274
34.2k
  _JSAMPARRAY output_ptr;
275
34.2k
  JDIMENSION output_col;
276
34.2k
  jpeg_component_info *compptr;
277
34.2k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
34.2k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
34.2k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
34.2k
          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
136k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
102k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
102k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
102k
    buffer = (*cinfo->mem->access_virt_barray)
295
102k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
102k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
102k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
102k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
99.3k
      block_rows = compptr->v_samp_factor;
301
3.08k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
3.08k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
3.08k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
3.08k
    }
306
102k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
102k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
326k
    for (block_row = 0; block_row < block_rows; block_row++) {
310
223k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
223k
      output_col = 0;
312
223k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
3.83M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
3.60M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
3.60M
                        output_col);
316
3.60M
        buffer_ptr++;
317
3.60M
        output_col += compptr->_DCT_scaled_size;
318
3.60M
      }
319
223k
      output_ptr += compptr->_DCT_scaled_size;
320
223k
    }
321
102k
  }
322
323
34.2k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
33.2k
    return JPEG_ROW_COMPLETED;
325
1.03k
  return JPEG_SCAN_COMPLETED;
326
34.2k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
267
34.2k
{
268
34.2k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
34.2k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
34.2k
  JDIMENSION block_num;
271
34.2k
  int ci, block_row, block_rows;
272
34.2k
  JBLOCKARRAY buffer;
273
34.2k
  JBLOCKROW buffer_ptr;
274
34.2k
  _JSAMPARRAY output_ptr;
275
34.2k
  JDIMENSION output_col;
276
34.2k
  jpeg_component_info *compptr;
277
34.2k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
34.2k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
34.2k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
34.2k
          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
136k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
102k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
102k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
102k
    buffer = (*cinfo->mem->access_virt_barray)
295
102k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
102k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
102k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
102k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
99.3k
      block_rows = compptr->v_samp_factor;
301
3.08k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
3.08k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
3.08k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
3.08k
    }
306
102k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
102k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
326k
    for (block_row = 0; block_row < block_rows; block_row++) {
310
223k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
223k
      output_col = 0;
312
223k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
3.83M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
3.60M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
3.60M
                        output_col);
316
3.60M
        buffer_ptr++;
317
3.60M
        output_col += compptr->_DCT_scaled_size;
318
3.60M
      }
319
223k
      output_ptr += compptr->_DCT_scaled_size;
320
223k
    }
321
102k
  }
322
323
34.2k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
33.2k
    return JPEG_ROW_COMPLETED;
325
1.03k
  return JPEG_SCAN_COMPLETED;
326
34.2k
}
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
365k
#define Q01_POS  1
342
365k
#define Q10_POS  8
343
365k
#define Q20_POS  16
344
365k
#define Q11_POS  9
345
365k
#define Q02_POS  2
346
293k
#define Q03_POS  3
347
293k
#define Q12_POS  10
348
293k
#define Q21_POS  17
349
293k
#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.62k
{
362
2.62k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
2.62k
  boolean smoothing_useful = FALSE;
364
2.62k
  int ci, coefi;
365
2.62k
  jpeg_component_info *compptr;
366
2.62k
  JQUANT_TBL *qtable;
367
2.62k
  int *coef_bits, *prev_coef_bits;
368
2.62k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
2.62k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
1
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
2.62k
  if (coef->coef_bits_latch == NULL)
375
2.62k
    coef->coef_bits_latch = (int *)
376
2.62k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
2.62k
                                  cinfo->num_components * 2 *
378
2.62k
                                  (SAVED_COEFS * sizeof(int)));
379
2.62k
  coef_bits_latch = coef->coef_bits_latch;
380
2.62k
  prev_coef_bits_latch =
381
2.62k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
9.75k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
7.43k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
7.43k
    if ((qtable = compptr->quant_table) == NULL)
387
21
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
7.41k
    if (qtable->quantval[0] == 0 ||
390
7.41k
        qtable->quantval[Q01_POS] == 0 ||
391
7.41k
        qtable->quantval[Q10_POS] == 0 ||
392
7.41k
        qtable->quantval[Q20_POS] == 0 ||
393
7.41k
        qtable->quantval[Q11_POS] == 0 ||
394
7.41k
        qtable->quantval[Q02_POS] == 0 ||
395
7.41k
        qtable->quantval[Q03_POS] == 0 ||
396
7.41k
        qtable->quantval[Q12_POS] == 0 ||
397
7.41k
        qtable->quantval[Q21_POS] == 0 ||
398
7.41k
        qtable->quantval[Q30_POS] == 0)
399
277
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
7.13k
    coef_bits = cinfo->coef_bits[ci];
402
7.13k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
7.13k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
7.13k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
71.3k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
64.2k
      if (cinfo->input_scan_number > 1)
409
46.7k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
17.5k
      else
411
17.5k
        prev_coef_bits_latch[coefi] = -1;
412
64.2k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
64.2k
      if (coef_bits[coefi] != 0)
414
42.1k
        smoothing_useful = TRUE;
415
64.2k
    }
416
7.13k
    coef_bits_latch += SAVED_COEFS;
417
7.13k
    prev_coef_bits_latch += SAVED_COEFS;
418
7.13k
  }
419
420
2.32k
  return smoothing_useful;
421
2.62k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
361
2.53k
{
362
2.53k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
2.53k
  boolean smoothing_useful = FALSE;
364
2.53k
  int ci, coefi;
365
2.53k
  jpeg_component_info *compptr;
366
2.53k
  JQUANT_TBL *qtable;
367
2.53k
  int *coef_bits, *prev_coef_bits;
368
2.53k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
2.53k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
0
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
2.53k
  if (coef->coef_bits_latch == NULL)
375
2.53k
    coef->coef_bits_latch = (int *)
376
2.53k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
2.53k
                                  cinfo->num_components * 2 *
378
2.53k
                                  (SAVED_COEFS * sizeof(int)));
379
2.53k
  coef_bits_latch = coef->coef_bits_latch;
380
2.53k
  prev_coef_bits_latch =
381
2.53k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
9.54k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
7.24k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
7.24k
    if ((qtable = compptr->quant_table) == NULL)
387
21
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
7.22k
    if (qtable->quantval[0] == 0 ||
390
7.22k
        qtable->quantval[Q01_POS] == 0 ||
391
7.22k
        qtable->quantval[Q10_POS] == 0 ||
392
7.22k
        qtable->quantval[Q20_POS] == 0 ||
393
7.22k
        qtable->quantval[Q11_POS] == 0 ||
394
7.22k
        qtable->quantval[Q02_POS] == 0 ||
395
7.22k
        qtable->quantval[Q03_POS] == 0 ||
396
7.22k
        qtable->quantval[Q12_POS] == 0 ||
397
7.22k
        qtable->quantval[Q21_POS] == 0 ||
398
7.22k
        qtable->quantval[Q30_POS] == 0)
399
224
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
7.00k
    coef_bits = cinfo->coef_bits[ci];
402
7.00k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
7.00k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
7.00k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
70.0k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
63.0k
      if (cinfo->input_scan_number > 1)
409
46.4k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
16.5k
      else
411
16.5k
        prev_coef_bits_latch[coefi] = -1;
412
63.0k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
63.0k
      if (coef_bits[coefi] != 0)
414
41.0k
        smoothing_useful = TRUE;
415
63.0k
    }
416
7.00k
    coef_bits_latch += SAVED_COEFS;
417
7.00k
    prev_coef_bits_latch += SAVED_COEFS;
418
7.00k
  }
419
420
2.29k
  return smoothing_useful;
421
2.53k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
361
83
{
362
83
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
83
  boolean smoothing_useful = FALSE;
364
83
  int ci, coefi;
365
83
  jpeg_component_info *compptr;
366
83
  JQUANT_TBL *qtable;
367
83
  int *coef_bits, *prev_coef_bits;
368
83
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
83
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
1
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
82
  if (coef->coef_bits_latch == NULL)
375
82
    coef->coef_bits_latch = (int *)
376
82
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
82
                                  cinfo->num_components * 2 *
378
82
                                  (SAVED_COEFS * sizeof(int)));
379
82
  coef_bits_latch = coef->coef_bits_latch;
380
82
  prev_coef_bits_latch =
381
82
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
216
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
187
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
187
    if ((qtable = compptr->quant_table) == NULL)
387
0
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
187
    if (qtable->quantval[0] == 0 ||
390
187
        qtable->quantval[Q01_POS] == 0 ||
391
187
        qtable->quantval[Q10_POS] == 0 ||
392
187
        qtable->quantval[Q20_POS] == 0 ||
393
187
        qtable->quantval[Q11_POS] == 0 ||
394
187
        qtable->quantval[Q02_POS] == 0 ||
395
187
        qtable->quantval[Q03_POS] == 0 ||
396
187
        qtable->quantval[Q12_POS] == 0 ||
397
187
        qtable->quantval[Q21_POS] == 0 ||
398
187
        qtable->quantval[Q30_POS] == 0)
399
53
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
134
    coef_bits = cinfo->coef_bits[ci];
402
134
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
134
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
134
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
1.34k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
1.20k
      if (cinfo->input_scan_number > 1)
409
234
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
972
      else
411
972
        prev_coef_bits_latch[coefi] = -1;
412
1.20k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
1.20k
      if (coef_bits[coefi] != 0)
414
1.13k
        smoothing_useful = TRUE;
415
1.20k
    }
416
134
    coef_bits_latch += SAVED_COEFS;
417
134
    prev_coef_bits_latch += SAVED_COEFS;
418
134
  }
419
420
29
  return smoothing_useful;
421
82
}
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
119k
{
431
119k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
119k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
119k
  JDIMENSION block_num, last_block_column;
434
119k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
119k
    image_block_rows;
436
119k
  JBLOCKARRAY buffer;
437
119k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
119k
  JBLOCKROW next_block_row, next_next_block_row;
439
119k
  _JSAMPARRAY output_ptr;
440
119k
  JDIMENSION output_col;
441
119k
  jpeg_component_info *compptr;
442
119k
  _inverse_DCT_method_ptr inverse_DCT;
443
119k
  boolean change_dc;
444
119k
  JCOEF *workspace;
445
119k
  int *coef_bits;
446
119k
  JQUANT_TBL *quanttbl;
447
119k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
119k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
119k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
119k
      DC25;
451
119k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
119k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
119k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
119k
         !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
477k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
358k
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
358k
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
358k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
349k
      block_rows = compptr->v_samp_factor;
482
349k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
349k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
4.22k
      block_rows = compptr->v_samp_factor;
485
4.22k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
4.52k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
4.52k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
4.52k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
4.52k
      access_rows = block_rows; /* this iMCU row only */
491
4.52k
    }
492
    /* Align the virtual buffer for this component. */
493
358k
    if (cinfo->output_iMCU_row > 1) {
494
349k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
349k
      buffer = (*cinfo->mem->access_virt_barray)
496
349k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
349k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
349k
         (JDIMENSION)access_rows, FALSE);
499
349k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
349k
    } else if (cinfo->output_iMCU_row > 0) {
501
4.22k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
4.22k
      buffer = (*cinfo->mem->access_virt_barray)
503
4.22k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
4.22k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
4.22k
         (JDIMENSION)access_rows, FALSE);
506
4.22k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
4.52k
    } else {
508
4.52k
      buffer = (*cinfo->mem->access_virt_barray)
509
4.52k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
4.52k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
4.52k
    }
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
358k
    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
358k
    else
520
358k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
358k
    change_dc =
524
358k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
358k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
358k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
358k
    quanttbl = compptr->quant_table;
529
358k
    Q00 = quanttbl->quantval[0];
530
358k
    Q01 = quanttbl->quantval[Q01_POS];
531
358k
    Q10 = quanttbl->quantval[Q10_POS];
532
358k
    Q20 = quanttbl->quantval[Q20_POS];
533
358k
    Q11 = quanttbl->quantval[Q11_POS];
534
358k
    Q02 = quanttbl->quantval[Q02_POS];
535
358k
    if (change_dc) {
536
285k
      Q03 = quanttbl->quantval[Q03_POS];
537
285k
      Q12 = quanttbl->quantval[Q12_POS];
538
285k
      Q21 = quanttbl->quantval[Q21_POS];
539
285k
      Q30 = quanttbl->quantval[Q30_POS];
540
285k
    }
541
358k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
358k
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
358k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
1.24M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
888k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
888k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
888k
      if (image_block_row > 0)
550
884k
        prev_block_row =
551
884k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
4.52k
      else
553
4.52k
        prev_block_row = buffer_ptr;
554
555
888k
      if (image_block_row > 1)
556
880k
        prev_prev_block_row =
557
880k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
8.89k
      else
559
8.89k
        prev_prev_block_row = prev_block_row;
560
561
888k
      if (image_block_row < image_block_rows - 1)
562
884k
        next_block_row =
563
884k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
4.52k
      else
565
4.52k
        next_block_row = buffer_ptr;
566
567
888k
      if (image_block_row < image_block_rows - 2)
568
882k
        next_next_block_row =
569
882k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
6.03k
      else
571
6.03k
        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
888k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
888k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
888k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
888k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
888k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
888k
      output_col = 0;
582
888k
      last_block_column = compptr->width_in_blocks - 1;
583
888k
      for (block_num = cinfo->master->first_MCU_col[ci];
584
19.8M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
19.0M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
19.0M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
19.0M
            block_num < last_block_column) {
590
623k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
623k
          DC09 = DC10 = (int)prev_block_row[1][0];
592
623k
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
623k
          DC19 = DC20 = (int)next_block_row[1][0];
594
623k
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
623k
        }
596
19.0M
        if (block_num + 1 < last_block_column) {
597
17.4M
          DC05 = (int)prev_prev_block_row[2][0];
598
17.4M
          DC10 = (int)prev_block_row[2][0];
599
17.4M
          DC15 = (int)buffer_ptr[2][0];
600
17.4M
          DC20 = (int)next_block_row[2][0];
601
17.4M
          DC25 = (int)next_next_block_row[2][0];
602
17.4M
        }
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
19.0M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
17.7M
          num = Q00 * (change_dc ?
616
15.2M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
15.2M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
15.2M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
15.2M
                 DC21 - DC22 + DC24 + DC25) :
620
17.7M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
17.7M
          if (num >= 0) {
622
11.0M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
11.0M
            if (Al > 0 && pred >= (1 << Al))
624
70.9k
              pred = (1 << Al) - 1;
625
11.0M
          } else {
626
6.67M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
6.67M
            if (Al > 0 && pred >= (1 << Al))
628
53.7k
              pred = (1 << Al) - 1;
629
6.67M
            pred = -pred;
630
6.67M
          }
631
17.7M
          workspace[1] = (JCOEF)pred;
632
17.7M
        }
633
        /* AC10 */
634
19.0M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
18.4M
          num = Q00 * (change_dc ?
636
15.2M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
15.2M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
15.2M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
15.2M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
18.4M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
18.4M
          if (num >= 0) {
642
11.3M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
11.3M
            if (Al > 0 && pred >= (1 << Al))
644
720k
              pred = (1 << Al) - 1;
645
11.3M
          } else {
646
7.14M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
7.14M
            if (Al > 0 && pred >= (1 << Al))
648
752k
              pred = (1 << Al) - 1;
649
7.14M
            pred = -pred;
650
7.14M
          }
651
18.4M
          workspace[8] = (JCOEF)pred;
652
18.4M
        }
653
        /* AC20 */
654
19.0M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
18.4M
          num = Q00 * (change_dc ?
656
15.2M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
15.2M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
18.4M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
18.4M
          if (num >= 0) {
660
10.7M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
10.7M
            if (Al > 0 && pred >= (1 << Al))
662
524k
              pred = (1 << Al) - 1;
663
10.7M
          } else {
664
7.70M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
7.70M
            if (Al > 0 && pred >= (1 << Al))
666
555k
              pred = (1 << Al) - 1;
667
7.70M
            pred = -pred;
668
7.70M
          }
669
18.4M
          workspace[16] = (JCOEF)pred;
670
18.4M
        }
671
        /* AC11 */
672
19.0M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
18.5M
          num = Q00 * (change_dc ?
674
15.2M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
15.2M
                 9 * DC19 + DC21 - DC25) :
676
18.5M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
3.21M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
18.5M
          if (num >= 0) {
679
13.2M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
13.2M
            if (Al > 0 && pred >= (1 << Al))
681
22.9k
              pred = (1 << Al) - 1;
682
13.2M
          } else {
683
5.24M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
5.24M
            if (Al > 0 && pred >= (1 << Al))
685
23.5k
              pred = (1 << Al) - 1;
686
5.24M
            pred = -pred;
687
5.24M
          }
688
18.5M
          workspace[9] = (JCOEF)pred;
689
18.5M
        }
690
        /* AC02 */
691
19.0M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
18.5M
          num = Q00 * (change_dc ?
693
15.2M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
15.2M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
18.5M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
18.5M
          if (num >= 0) {
697
11.4M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
11.4M
            if (Al > 0 && pred >= (1 << Al))
699
170k
              pred = (1 << Al) - 1;
700
11.4M
          } else {
701
7.01M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
7.01M
            if (Al > 0 && pred >= (1 << Al))
703
170k
              pred = (1 << Al) - 1;
704
7.01M
            pred = -pred;
705
7.01M
          }
706
18.5M
          workspace[2] = (JCOEF)pred;
707
18.5M
        }
708
19.0M
        if (change_dc) {
709
          /* AC03 */
710
15.2M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
15.2M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
15.2M
            if (num >= 0) {
713
9.71M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
9.71M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
9.71M
            } else {
717
5.58M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
5.58M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
5.58M
              pred = -pred;
721
5.58M
            }
722
15.2M
            workspace[3] = (JCOEF)pred;
723
15.2M
          }
724
          /* AC12 */
725
15.2M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
15.2M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
15.2M
            if (num >= 0) {
728
9.03M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
9.03M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
9.03M
            } else {
732
6.25M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
6.25M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
6.25M
              pred = -pred;
736
6.25M
            }
737
15.2M
            workspace[10] = (JCOEF)pred;
738
15.2M
          }
739
          /* AC21 */
740
15.2M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
15.2M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
15.2M
            if (num >= 0) {
743
9.50M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
9.50M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
9.50M
            } else {
747
5.79M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
5.79M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
5.79M
              pred = -pred;
751
5.79M
            }
752
15.2M
            workspace[17] = (JCOEF)pred;
753
15.2M
          }
754
          /* AC30 */
755
15.2M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
15.2M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
15.2M
            if (num >= 0) {
758
9.54M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
9.54M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
9.54M
            } else {
762
5.74M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
5.74M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
5.74M
              pred = -pred;
766
5.74M
            }
767
15.2M
            workspace[24] = (JCOEF)pred;
768
15.2M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
15.2M
          num = Q00 *
773
15.2M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
15.2M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
15.2M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
15.2M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
15.2M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
15.2M
          if (num >= 0) {
779
7.45M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
7.83M
          } else {
781
7.83M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
7.83M
            pred = -pred;
783
7.83M
          }
784
15.2M
          workspace[0] = (JCOEF)pred;
785
15.2M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
19.0M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
19.0M
                        output_col);
790
        /* Advance for next column */
791
19.0M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
19.0M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
19.0M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
19.0M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
19.0M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
19.0M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
19.0M
          prev_prev_block_row++, next_next_block_row++;
798
19.0M
        output_col += compptr->_DCT_scaled_size;
799
19.0M
      }
800
888k
      output_ptr += compptr->_DCT_scaled_size;
801
888k
    }
802
358k
  }
803
804
119k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
117k
    return JPEG_ROW_COMPLETED;
806
1.50k
  return JPEG_SCAN_COMPLETED;
807
119k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
430
119k
{
431
119k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
119k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
119k
  JDIMENSION block_num, last_block_column;
434
119k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
119k
    image_block_rows;
436
119k
  JBLOCKARRAY buffer;
437
119k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
119k
  JBLOCKROW next_block_row, next_next_block_row;
439
119k
  _JSAMPARRAY output_ptr;
440
119k
  JDIMENSION output_col;
441
119k
  jpeg_component_info *compptr;
442
119k
  _inverse_DCT_method_ptr inverse_DCT;
443
119k
  boolean change_dc;
444
119k
  JCOEF *workspace;
445
119k
  int *coef_bits;
446
119k
  JQUANT_TBL *quanttbl;
447
119k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
119k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
119k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
119k
      DC25;
451
119k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
119k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
119k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
119k
         !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
477k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
358k
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
358k
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
358k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
349k
      block_rows = compptr->v_samp_factor;
482
349k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
349k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
4.22k
      block_rows = compptr->v_samp_factor;
485
4.22k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
4.52k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
4.52k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
4.52k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
4.52k
      access_rows = block_rows; /* this iMCU row only */
491
4.52k
    }
492
    /* Align the virtual buffer for this component. */
493
358k
    if (cinfo->output_iMCU_row > 1) {
494
349k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
349k
      buffer = (*cinfo->mem->access_virt_barray)
496
349k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
349k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
349k
         (JDIMENSION)access_rows, FALSE);
499
349k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
349k
    } else if (cinfo->output_iMCU_row > 0) {
501
4.22k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
4.22k
      buffer = (*cinfo->mem->access_virt_barray)
503
4.22k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
4.22k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
4.22k
         (JDIMENSION)access_rows, FALSE);
506
4.22k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
4.52k
    } else {
508
4.52k
      buffer = (*cinfo->mem->access_virt_barray)
509
4.52k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
4.52k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
4.52k
    }
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
358k
    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
358k
    else
520
358k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
358k
    change_dc =
524
358k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
358k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
358k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
358k
    quanttbl = compptr->quant_table;
529
358k
    Q00 = quanttbl->quantval[0];
530
358k
    Q01 = quanttbl->quantval[Q01_POS];
531
358k
    Q10 = quanttbl->quantval[Q10_POS];
532
358k
    Q20 = quanttbl->quantval[Q20_POS];
533
358k
    Q11 = quanttbl->quantval[Q11_POS];
534
358k
    Q02 = quanttbl->quantval[Q02_POS];
535
358k
    if (change_dc) {
536
285k
      Q03 = quanttbl->quantval[Q03_POS];
537
285k
      Q12 = quanttbl->quantval[Q12_POS];
538
285k
      Q21 = quanttbl->quantval[Q21_POS];
539
285k
      Q30 = quanttbl->quantval[Q30_POS];
540
285k
    }
541
358k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
358k
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
358k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
1.24M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
888k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
888k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
888k
      if (image_block_row > 0)
550
884k
        prev_block_row =
551
884k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
4.52k
      else
553
4.52k
        prev_block_row = buffer_ptr;
554
555
888k
      if (image_block_row > 1)
556
880k
        prev_prev_block_row =
557
880k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
8.89k
      else
559
8.89k
        prev_prev_block_row = prev_block_row;
560
561
888k
      if (image_block_row < image_block_rows - 1)
562
884k
        next_block_row =
563
884k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
4.52k
      else
565
4.52k
        next_block_row = buffer_ptr;
566
567
888k
      if (image_block_row < image_block_rows - 2)
568
882k
        next_next_block_row =
569
882k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
6.03k
      else
571
6.03k
        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
888k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
888k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
888k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
888k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
888k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
888k
      output_col = 0;
582
888k
      last_block_column = compptr->width_in_blocks - 1;
583
888k
      for (block_num = cinfo->master->first_MCU_col[ci];
584
19.8M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
19.0M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
19.0M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
19.0M
            block_num < last_block_column) {
590
623k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
623k
          DC09 = DC10 = (int)prev_block_row[1][0];
592
623k
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
623k
          DC19 = DC20 = (int)next_block_row[1][0];
594
623k
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
623k
        }
596
19.0M
        if (block_num + 1 < last_block_column) {
597
17.4M
          DC05 = (int)prev_prev_block_row[2][0];
598
17.4M
          DC10 = (int)prev_block_row[2][0];
599
17.4M
          DC15 = (int)buffer_ptr[2][0];
600
17.4M
          DC20 = (int)next_block_row[2][0];
601
17.4M
          DC25 = (int)next_next_block_row[2][0];
602
17.4M
        }
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
19.0M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
17.7M
          num = Q00 * (change_dc ?
616
15.2M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
15.2M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
15.2M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
15.2M
                 DC21 - DC22 + DC24 + DC25) :
620
17.7M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
17.7M
          if (num >= 0) {
622
11.0M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
11.0M
            if (Al > 0 && pred >= (1 << Al))
624
70.9k
              pred = (1 << Al) - 1;
625
11.0M
          } else {
626
6.67M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
6.67M
            if (Al > 0 && pred >= (1 << Al))
628
53.7k
              pred = (1 << Al) - 1;
629
6.67M
            pred = -pred;
630
6.67M
          }
631
17.7M
          workspace[1] = (JCOEF)pred;
632
17.7M
        }
633
        /* AC10 */
634
19.0M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
18.4M
          num = Q00 * (change_dc ?
636
15.2M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
15.2M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
15.2M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
15.2M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
18.4M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
18.4M
          if (num >= 0) {
642
11.3M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
11.3M
            if (Al > 0 && pred >= (1 << Al))
644
720k
              pred = (1 << Al) - 1;
645
11.3M
          } else {
646
7.14M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
7.14M
            if (Al > 0 && pred >= (1 << Al))
648
752k
              pred = (1 << Al) - 1;
649
7.14M
            pred = -pred;
650
7.14M
          }
651
18.4M
          workspace[8] = (JCOEF)pred;
652
18.4M
        }
653
        /* AC20 */
654
19.0M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
18.4M
          num = Q00 * (change_dc ?
656
15.2M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
15.2M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
18.4M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
18.4M
          if (num >= 0) {
660
10.7M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
10.7M
            if (Al > 0 && pred >= (1 << Al))
662
524k
              pred = (1 << Al) - 1;
663
10.7M
          } else {
664
7.70M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
7.70M
            if (Al > 0 && pred >= (1 << Al))
666
555k
              pred = (1 << Al) - 1;
667
7.70M
            pred = -pred;
668
7.70M
          }
669
18.4M
          workspace[16] = (JCOEF)pred;
670
18.4M
        }
671
        /* AC11 */
672
19.0M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
18.5M
          num = Q00 * (change_dc ?
674
15.2M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
15.2M
                 9 * DC19 + DC21 - DC25) :
676
18.5M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
3.21M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
18.5M
          if (num >= 0) {
679
13.2M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
13.2M
            if (Al > 0 && pred >= (1 << Al))
681
22.9k
              pred = (1 << Al) - 1;
682
13.2M
          } else {
683
5.24M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
5.24M
            if (Al > 0 && pred >= (1 << Al))
685
23.5k
              pred = (1 << Al) - 1;
686
5.24M
            pred = -pred;
687
5.24M
          }
688
18.5M
          workspace[9] = (JCOEF)pred;
689
18.5M
        }
690
        /* AC02 */
691
19.0M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
18.5M
          num = Q00 * (change_dc ?
693
15.2M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
15.2M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
18.5M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
18.5M
          if (num >= 0) {
697
11.4M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
11.4M
            if (Al > 0 && pred >= (1 << Al))
699
170k
              pred = (1 << Al) - 1;
700
11.4M
          } else {
701
7.01M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
7.01M
            if (Al > 0 && pred >= (1 << Al))
703
170k
              pred = (1 << Al) - 1;
704
7.01M
            pred = -pred;
705
7.01M
          }
706
18.5M
          workspace[2] = (JCOEF)pred;
707
18.5M
        }
708
19.0M
        if (change_dc) {
709
          /* AC03 */
710
15.2M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
15.2M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
15.2M
            if (num >= 0) {
713
9.71M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
9.71M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
9.71M
            } else {
717
5.58M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
5.58M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
5.58M
              pred = -pred;
721
5.58M
            }
722
15.2M
            workspace[3] = (JCOEF)pred;
723
15.2M
          }
724
          /* AC12 */
725
15.2M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
15.2M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
15.2M
            if (num >= 0) {
728
9.03M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
9.03M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
9.03M
            } else {
732
6.25M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
6.25M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
6.25M
              pred = -pred;
736
6.25M
            }
737
15.2M
            workspace[10] = (JCOEF)pred;
738
15.2M
          }
739
          /* AC21 */
740
15.2M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
15.2M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
15.2M
            if (num >= 0) {
743
9.50M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
9.50M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
9.50M
            } else {
747
5.79M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
5.79M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
5.79M
              pred = -pred;
751
5.79M
            }
752
15.2M
            workspace[17] = (JCOEF)pred;
753
15.2M
          }
754
          /* AC30 */
755
15.2M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
15.2M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
15.2M
            if (num >= 0) {
758
9.54M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
9.54M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
9.54M
            } else {
762
5.74M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
5.74M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
5.74M
              pred = -pred;
766
5.74M
            }
767
15.2M
            workspace[24] = (JCOEF)pred;
768
15.2M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
15.2M
          num = Q00 *
773
15.2M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
15.2M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
15.2M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
15.2M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
15.2M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
15.2M
          if (num >= 0) {
779
7.45M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
7.83M
          } else {
781
7.83M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
7.83M
            pred = -pred;
783
7.83M
          }
784
15.2M
          workspace[0] = (JCOEF)pred;
785
15.2M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
19.0M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
19.0M
                        output_col);
790
        /* Advance for next column */
791
19.0M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
19.0M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
19.0M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
19.0M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
19.0M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
19.0M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
19.0M
          prev_prev_block_row++, next_next_block_row++;
798
19.0M
        output_col += compptr->_DCT_scaled_size;
799
19.0M
      }
800
888k
      output_ptr += compptr->_DCT_scaled_size;
801
888k
    }
802
358k
  }
803
804
119k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
117k
    return JPEG_ROW_COMPLETED;
806
1.50k
  return JPEG_SCAN_COMPLETED;
807
119k
}
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.69k
{
819
5.69k
  my_coef_ptr coef;
820
821
5.69k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
5.69k
  coef = (my_coef_ptr)
825
5.69k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
5.69k
                                sizeof(my_coef_controller));
827
5.69k
  memset(coef, 0, sizeof(my_coef_controller));
828
5.69k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
5.69k
  coef->pub.start_input_pass = start_input_pass;
830
5.69k
  coef->pub.start_output_pass = start_output_pass;
831
5.69k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
5.69k
  coef->coef_bits_latch = NULL;
833
5.69k
#endif
834
835
  /* Create the coefficient buffer. */
836
5.69k
  if (need_full_buffer) {
837
3.54k
#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.54k
    int ci, access_rows;
842
3.54k
    jpeg_component_info *compptr;
843
844
14.1k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
10.6k
         ci++, compptr++) {
846
10.6k
      access_rows = compptr->v_samp_factor;
847
10.6k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
10.6k
      if (cinfo->progressive_mode)
850
10.5k
        access_rows *= 5;
851
10.6k
#endif
852
10.6k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
10.6k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
10.6k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
10.6k
                               (long)compptr->h_samp_factor),
856
10.6k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
10.6k
                               (long)compptr->v_samp_factor),
858
10.6k
         (JDIMENSION)access_rows);
859
10.6k
    }
860
3.54k
    coef->pub.consume_data = consume_data;
861
3.54k
    coef->pub._decompress_data = decompress_data;
862
3.54k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
3.54k
  } else {
867
    /* We only need a single-MCU buffer. */
868
2.14k
    JBLOCKROW buffer;
869
2.14k
    int i;
870
871
2.14k
    buffer = (JBLOCKROW)
872
2.14k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
2.14k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
23.6k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
21.4k
      coef->MCU_buffer[i] = buffer + i;
876
21.4k
    }
877
2.14k
    coef->pub.consume_data = dummy_consume_data;
878
2.14k
    coef->pub._decompress_data = decompress_onepass;
879
2.14k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
2.14k
  }
881
882
  /* Allocate the workspace buffer */
883
5.69k
  coef->workspace = (JCOEF *)
884
5.69k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
5.69k
                                sizeof(JCOEF) * DCTSIZE2);
886
5.69k
}
jinit_d_coef_controller
Line
Count
Source
818
5.42k
{
819
5.42k
  my_coef_ptr coef;
820
821
5.42k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
5.42k
  coef = (my_coef_ptr)
825
5.42k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
5.42k
                                sizeof(my_coef_controller));
827
5.42k
  memset(coef, 0, sizeof(my_coef_controller));
828
5.42k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
5.42k
  coef->pub.start_input_pass = start_input_pass;
830
5.42k
  coef->pub.start_output_pass = start_output_pass;
831
5.42k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
5.42k
  coef->coef_bits_latch = NULL;
833
5.42k
#endif
834
835
  /* Create the coefficient buffer. */
836
5.42k
  if (need_full_buffer) {
837
3.31k
#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.31k
    int ci, access_rows;
842
3.31k
    jpeg_component_info *compptr;
843
844
13.1k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
9.86k
         ci++, compptr++) {
846
9.86k
      access_rows = compptr->v_samp_factor;
847
9.86k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
9.86k
      if (cinfo->progressive_mode)
850
9.86k
        access_rows *= 5;
851
9.86k
#endif
852
9.86k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
9.86k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
9.86k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
9.86k
                               (long)compptr->h_samp_factor),
856
9.86k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
9.86k
                               (long)compptr->v_samp_factor),
858
9.86k
         (JDIMENSION)access_rows);
859
9.86k
    }
860
3.31k
    coef->pub.consume_data = consume_data;
861
3.31k
    coef->pub._decompress_data = decompress_data;
862
3.31k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
3.31k
  } else {
867
    /* We only need a single-MCU buffer. */
868
2.10k
    JBLOCKROW buffer;
869
2.10k
    int i;
870
871
2.10k
    buffer = (JBLOCKROW)
872
2.10k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
2.10k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
23.1k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
21.0k
      coef->MCU_buffer[i] = buffer + i;
876
21.0k
    }
877
2.10k
    coef->pub.consume_data = dummy_consume_data;
878
2.10k
    coef->pub._decompress_data = decompress_onepass;
879
2.10k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
2.10k
  }
881
882
  /* Allocate the workspace buffer */
883
5.42k
  coef->workspace = (JCOEF *)
884
5.42k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
5.42k
                                sizeof(JCOEF) * DCTSIZE2);
886
5.42k
}
j12init_d_coef_controller
Line
Count
Source
818
268
{
819
268
  my_coef_ptr coef;
820
821
268
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
268
  coef = (my_coef_ptr)
825
268
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
268
                                sizeof(my_coef_controller));
827
268
  memset(coef, 0, sizeof(my_coef_controller));
828
268
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
268
  coef->pub.start_input_pass = start_input_pass;
830
268
  coef->pub.start_output_pass = start_output_pass;
831
268
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
268
  coef->coef_bits_latch = NULL;
833
268
#endif
834
835
  /* Create the coefficient buffer. */
836
268
  if (need_full_buffer) {
837
230
#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
230
    int ci, access_rows;
842
230
    jpeg_component_info *compptr;
843
844
970
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
740
         ci++, compptr++) {
846
740
      access_rows = compptr->v_samp_factor;
847
740
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
740
      if (cinfo->progressive_mode)
850
725
        access_rows *= 5;
851
740
#endif
852
740
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
740
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
740
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
740
                               (long)compptr->h_samp_factor),
856
740
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
740
                               (long)compptr->v_samp_factor),
858
740
         (JDIMENSION)access_rows);
859
740
    }
860
230
    coef->pub.consume_data = consume_data;
861
230
    coef->pub._decompress_data = decompress_data;
862
230
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
230
  } else {
867
    /* We only need a single-MCU buffer. */
868
38
    JBLOCKROW buffer;
869
38
    int i;
870
871
38
    buffer = (JBLOCKROW)
872
38
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
38
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
418
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
380
      coef->MCU_buffer[i] = buffer + i;
876
380
    }
877
38
    coef->pub.consume_data = dummy_consume_data;
878
38
    coef->pub._decompress_data = decompress_onepass;
879
38
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
38
  }
881
882
  /* Allocate the workspace buffer */
883
268
  coef->workspace = (JCOEF *)
884
268
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
268
                                sizeof(JCOEF) * DCTSIZE2);
886
268
}