Coverage Report

Created: 2025-08-03 06:19

/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
11.1k
{
48
11.1k
  cinfo->input_iMCU_row = 0;
49
11.1k
  start_iMCU_row(cinfo);
50
11.1k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
47
10.6k
{
48
10.6k
  cinfo->input_iMCU_row = 0;
49
10.6k
  start_iMCU_row(cinfo);
50
10.6k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
47
500
{
48
500
  cinfo->input_iMCU_row = 0;
49
500
  start_iMCU_row(cinfo);
50
500
}
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.35k
{
60
4.35k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
4.35k
  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.35k
  if (coef->pub.coef_arrays != NULL) {
65
2.43k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.91k
      coef->pub._decompress_data = decompress_smooth_data;
67
517
    else
68
517
      coef->pub._decompress_data = decompress_data;
69
2.43k
  }
70
4.35k
#endif
71
4.35k
  cinfo->output_iMCU_row = 0;
72
4.35k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
59
4.26k
{
60
4.26k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
4.26k
  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.26k
  if (coef->pub.coef_arrays != NULL) {
65
2.35k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.89k
      coef->pub._decompress_data = decompress_smooth_data;
67
456
    else
68
456
      coef->pub._decompress_data = decompress_data;
69
2.35k
  }
70
4.26k
#endif
71
4.26k
  cinfo->output_iMCU_row = 0;
72
4.26k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
59
84
{
60
84
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
84
  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
84
  if (coef->pub.coef_arrays != NULL) {
65
79
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
18
      coef->pub._decompress_data = decompress_smooth_data;
67
61
    else
68
61
      coef->pub._decompress_data = decompress_data;
69
79
  }
70
84
#endif
71
84
  cinfo->output_iMCU_row = 0;
72
84
}
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
557k
{
88
557k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
557k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
557k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
557k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
557k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
557k
  _JSAMPARRAY output_ptr;
94
557k
  JDIMENSION start_col, output_col;
95
557k
  jpeg_component_info *compptr;
96
557k
  _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
557k
       yoffset++) {
101
4.14M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
3.58M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
3.58M
      jzero_far((void *)coef->MCU_buffer[0],
105
3.58M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
3.58M
      if (!cinfo->entropy->insufficient_data)
107
3.58M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
3.58M
      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.58M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
3.58M
          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.58M
        blkn = 0;               /* index of current DCT block within MCU */
126
16.2M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
12.6M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
12.6M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
12.6M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
12.6M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
10.5M
                         compptr->MCU_width : compptr->last_col_width;
136
12.6M
          output_ptr = output_buf[compptr->component_index] +
137
12.6M
                       yoffset * compptr->_DCT_scaled_size;
138
12.6M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
12.6M
                      compptr->MCU_sample_width;
140
25.4M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
12.8M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
12.8M
                yoffset + yindex < compptr->last_row_height) {
143
12.8M
              output_col = start_col;
144
25.8M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
12.9M
                (*inverse_DCT) (cinfo, compptr,
146
12.9M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
12.9M
                                output_ptr, output_col);
148
12.9M
                output_col += compptr->_DCT_scaled_size;
149
12.9M
              }
150
12.8M
            }
151
12.8M
            blkn += compptr->MCU_width;
152
12.8M
            output_ptr += compptr->_DCT_scaled_size;
153
12.8M
          }
154
12.6M
        }
155
3.58M
      }
156
3.58M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
557k
    coef->MCU_ctr = 0;
159
557k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
557k
  cinfo->output_iMCU_row++;
162
557k
  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
1.91k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
1.91k
  return JPEG_SCAN_COMPLETED;
169
557k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
87
557k
{
88
557k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
557k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
557k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
557k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
557k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
557k
  _JSAMPARRAY output_ptr;
94
557k
  JDIMENSION start_col, output_col;
95
557k
  jpeg_component_info *compptr;
96
557k
  _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
557k
       yoffset++) {
101
4.14M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
3.58M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
3.58M
      jzero_far((void *)coef->MCU_buffer[0],
105
3.58M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
3.58M
      if (!cinfo->entropy->insufficient_data)
107
3.58M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
3.58M
      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.58M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
3.58M
          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.58M
        blkn = 0;               /* index of current DCT block within MCU */
126
16.2M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
12.6M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
12.6M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
12.6M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
12.6M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
10.5M
                         compptr->MCU_width : compptr->last_col_width;
136
12.6M
          output_ptr = output_buf[compptr->component_index] +
137
12.6M
                       yoffset * compptr->_DCT_scaled_size;
138
12.6M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
12.6M
                      compptr->MCU_sample_width;
140
25.4M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
12.8M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
12.8M
                yoffset + yindex < compptr->last_row_height) {
143
12.8M
              output_col = start_col;
144
25.8M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
12.9M
                (*inverse_DCT) (cinfo, compptr,
146
12.9M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
12.9M
                                output_ptr, output_col);
148
12.9M
                output_col += compptr->_DCT_scaled_size;
149
12.9M
              }
150
12.8M
            }
151
12.8M
            blkn += compptr->MCU_width;
152
12.8M
            output_ptr += compptr->_DCT_scaled_size;
153
12.8M
          }
154
12.6M
        }
155
3.58M
      }
156
3.58M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
557k
    coef->MCU_ctr = 0;
159
557k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
557k
  cinfo->output_iMCU_row++;
162
557k
  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
1.91k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
1.91k
  return JPEG_SCAN_COMPLETED;
169
557k
}
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.76M
{
195
1.76M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
1.76M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
1.76M
  int blkn, ci, xindex, yindex, yoffset;
198
1.76M
  JDIMENSION start_col;
199
1.76M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
1.76M
  JBLOCKROW buffer_ptr;
201
1.76M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
6.07M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
4.31M
    compptr = cinfo->cur_comp_info[ci];
206
4.31M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
4.31M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
4.31M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
4.31M
       (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.31M
  }
215
216
  /* Loop to process one whole iMCU row */
217
3.69M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
1.93M
       yoffset++) {
219
48.7M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
46.8M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
46.8M
      blkn = 0;                 /* index of current DCT block within MCU */
223
132M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
85.6M
        compptr = cinfo->cur_comp_info[ci];
225
85.6M
        start_col = MCU_col_num * compptr->MCU_width;
226
183M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
97.6M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
203M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
105M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
105M
          }
231
97.6M
        }
232
85.6M
      }
233
46.8M
      if (!cinfo->entropy->insufficient_data)
234
46.8M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
46.8M
      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
46.8M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
1.93M
    coef->MCU_ctr = 0;
245
1.93M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
1.76M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
1.75M
    start_iMCU_row(cinfo);
249
1.75M
    return JPEG_ROW_COMPLETED;
250
1.75M
  }
251
  /* Completed the scan */
252
9.19k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
9.19k
  return JPEG_SCAN_COMPLETED;
254
1.76M
}
jdcoefct-8.c:consume_data
Line
Count
Source
194
1.72M
{
195
1.72M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
1.72M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
1.72M
  int blkn, ci, xindex, yindex, yoffset;
198
1.72M
  JDIMENSION start_col;
199
1.72M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
1.72M
  JBLOCKROW buffer_ptr;
201
1.72M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
5.93M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
4.21M
    compptr = cinfo->cur_comp_info[ci];
206
4.21M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
4.21M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
4.21M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
4.21M
       (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.21M
  }
215
216
  /* Loop to process one whole iMCU row */
217
3.61M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
1.89M
       yoffset++) {
219
48.0M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
46.1M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
46.1M
      blkn = 0;                 /* index of current DCT block within MCU */
223
130M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
84.1M
        compptr = cinfo->cur_comp_info[ci];
225
84.1M
        start_col = MCU_col_num * compptr->MCU_width;
226
180M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
95.9M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
200M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
104M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
104M
          }
231
95.9M
        }
232
84.1M
      }
233
46.1M
      if (!cinfo->entropy->insufficient_data)
234
46.1M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
46.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
46.1M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
1.89M
    coef->MCU_ctr = 0;
245
1.89M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
1.72M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
1.71M
    start_iMCU_row(cinfo);
249
1.71M
    return JPEG_ROW_COMPLETED;
250
1.71M
  }
251
  /* Completed the scan */
252
8.69k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
8.69k
  return JPEG_SCAN_COMPLETED;
254
1.72M
}
jdcoefct-12.c:consume_data
Line
Count
Source
194
40.5k
{
195
40.5k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
40.5k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
40.5k
  int blkn, ci, xindex, yindex, yoffset;
198
40.5k
  JDIMENSION start_col;
199
40.5k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
40.5k
  JBLOCKROW buffer_ptr;
201
40.5k
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
139k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
98.9k
    compptr = cinfo->cur_comp_info[ci];
206
98.9k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
98.9k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
98.9k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
98.9k
       (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
98.9k
  }
215
216
  /* Loop to process one whole iMCU row */
217
81.3k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
40.7k
       yoffset++) {
219
713k
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
673k
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
673k
      blkn = 0;                 /* index of current DCT block within MCU */
223
2.24M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
1.57M
        compptr = cinfo->cur_comp_info[ci];
225
1.57M
        start_col = MCU_col_num * compptr->MCU_width;
226
3.28M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
1.70M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
3.46M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
1.75M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
1.75M
          }
231
1.70M
        }
232
1.57M
      }
233
673k
      if (!cinfo->entropy->insufficient_data)
234
673k
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
673k
      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
673k
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
40.7k
    coef->MCU_ctr = 0;
245
40.7k
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
40.5k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
40.0k
    start_iMCU_row(cinfo);
249
40.0k
    return JPEG_ROW_COMPLETED;
250
40.0k
  }
251
  /* Completed the scan */
252
495
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
495
  return JPEG_SCAN_COMPLETED;
254
40.5k
}
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
326k
{
268
326k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
326k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
326k
  JDIMENSION block_num;
271
326k
  int ci, block_row, block_rows;
272
326k
  JBLOCKARRAY buffer;
273
326k
  JBLOCKROW buffer_ptr;
274
326k
  _JSAMPARRAY output_ptr;
275
326k
  JDIMENSION output_col;
276
326k
  jpeg_component_info *compptr;
277
326k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
326k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
326k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
326k
          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
1.30M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
978k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
978k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
978k
    buffer = (*cinfo->mem->access_virt_barray)
295
978k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
978k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
978k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
978k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
977k
      block_rows = compptr->v_samp_factor;
301
1.36k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
1.36k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
1.36k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
1.36k
    }
306
978k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
978k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
2.08M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
1.10M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
1.10M
      output_col = 0;
312
1.10M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
11.6M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
10.5M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
10.5M
                        output_col);
316
10.5M
        buffer_ptr++;
317
10.5M
        output_col += compptr->_DCT_scaled_size;
318
10.5M
      }
319
1.10M
      output_ptr += compptr->_DCT_scaled_size;
320
1.10M
    }
321
978k
  }
322
323
326k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
325k
    return JPEG_ROW_COMPLETED;
325
456
  return JPEG_SCAN_COMPLETED;
326
326k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
267
326k
{
268
326k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
326k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
326k
  JDIMENSION block_num;
271
326k
  int ci, block_row, block_rows;
272
326k
  JBLOCKARRAY buffer;
273
326k
  JBLOCKROW buffer_ptr;
274
326k
  _JSAMPARRAY output_ptr;
275
326k
  JDIMENSION output_col;
276
326k
  jpeg_component_info *compptr;
277
326k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
326k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
326k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
326k
          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
1.30M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
978k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
978k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
978k
    buffer = (*cinfo->mem->access_virt_barray)
295
978k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
978k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
978k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
978k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
977k
      block_rows = compptr->v_samp_factor;
301
1.36k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
1.36k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
1.36k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
1.36k
    }
306
978k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
978k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
2.08M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
1.10M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
1.10M
      output_col = 0;
312
1.10M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
11.6M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
10.5M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
10.5M
                        output_col);
316
10.5M
        buffer_ptr++;
317
10.5M
        output_col += compptr->_DCT_scaled_size;
318
10.5M
      }
319
1.10M
      output_ptr += compptr->_DCT_scaled_size;
320
1.10M
    }
321
978k
  }
322
323
326k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
325k
    return JPEG_ROW_COMPLETED;
325
456
  return JPEG_SCAN_COMPLETED;
326
326k
}
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
2.07M
#define Q01_POS  1
342
2.07M
#define Q10_POS  8
343
2.07M
#define Q20_POS  16
344
2.07M
#define Q11_POS  9
345
2.07M
#define Q02_POS  2
346
1.76M
#define Q03_POS  3
347
1.76M
#define Q12_POS  10
348
1.76M
#define Q21_POS  17
349
1.76M
#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.43k
{
362
2.43k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
2.43k
  boolean smoothing_useful = FALSE;
364
2.43k
  int ci, coefi;
365
2.43k
  jpeg_component_info *compptr;
366
2.43k
  JQUANT_TBL *qtable;
367
2.43k
  int *coef_bits, *prev_coef_bits;
368
2.43k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
2.43k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
4
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
2.42k
  if (coef->coef_bits_latch == NULL)
375
2.42k
    coef->coef_bits_latch = (int *)
376
2.42k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
2.42k
                                  cinfo->num_components * 2 *
378
2.42k
                                  (SAVED_COEFS * sizeof(int)));
379
2.42k
  coef_bits_latch = coef->coef_bits_latch;
380
2.42k
  prev_coef_bits_latch =
381
2.42k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
8.99k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
6.87k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
6.87k
    if ((qtable = compptr->quant_table) == NULL)
387
0
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
6.87k
    if (qtable->quantval[0] == 0 ||
390
6.87k
        qtable->quantval[Q01_POS] == 0 ||
391
6.87k
        qtable->quantval[Q10_POS] == 0 ||
392
6.87k
        qtable->quantval[Q20_POS] == 0 ||
393
6.87k
        qtable->quantval[Q11_POS] == 0 ||
394
6.87k
        qtable->quantval[Q02_POS] == 0 ||
395
6.87k
        qtable->quantval[Q03_POS] == 0 ||
396
6.87k
        qtable->quantval[Q12_POS] == 0 ||
397
6.87k
        qtable->quantval[Q21_POS] == 0 ||
398
6.87k
        qtable->quantval[Q30_POS] == 0)
399
303
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
6.57k
    coef_bits = cinfo->coef_bits[ci];
402
6.57k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
6.57k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
6.57k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
65.7k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
59.1k
      if (cinfo->input_scan_number > 1)
409
39.3k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
19.8k
      else
411
19.8k
        prev_coef_bits_latch[coefi] = -1;
412
59.1k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
59.1k
      if (coef_bits[coefi] != 0)
414
51.2k
        smoothing_useful = TRUE;
415
59.1k
    }
416
6.57k
    coef_bits_latch += SAVED_COEFS;
417
6.57k
    prev_coef_bits_latch += SAVED_COEFS;
418
6.57k
  }
419
420
2.12k
  return smoothing_useful;
421
2.42k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
361
2.35k
{
362
2.35k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
2.35k
  boolean smoothing_useful = FALSE;
364
2.35k
  int ci, coefi;
365
2.35k
  jpeg_component_info *compptr;
366
2.35k
  JQUANT_TBL *qtable;
367
2.35k
  int *coef_bits, *prev_coef_bits;
368
2.35k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
2.35k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
4
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
2.34k
  if (coef->coef_bits_latch == NULL)
375
2.34k
    coef->coef_bits_latch = (int *)
376
2.34k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
2.34k
                                  cinfo->num_components * 2 *
378
2.34k
                                  (SAVED_COEFS * sizeof(int)));
379
2.34k
  coef_bits_latch = coef->coef_bits_latch;
380
2.34k
  prev_coef_bits_latch =
381
2.34k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
8.83k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
6.72k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
6.72k
    if ((qtable = compptr->quant_table) == NULL)
387
0
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
6.72k
    if (qtable->quantval[0] == 0 ||
390
6.72k
        qtable->quantval[Q01_POS] == 0 ||
391
6.72k
        qtable->quantval[Q10_POS] == 0 ||
392
6.72k
        qtable->quantval[Q20_POS] == 0 ||
393
6.72k
        qtable->quantval[Q11_POS] == 0 ||
394
6.72k
        qtable->quantval[Q02_POS] == 0 ||
395
6.72k
        qtable->quantval[Q03_POS] == 0 ||
396
6.72k
        qtable->quantval[Q12_POS] == 0 ||
397
6.72k
        qtable->quantval[Q21_POS] == 0 ||
398
6.72k
        qtable->quantval[Q30_POS] == 0)
399
242
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
6.48k
    coef_bits = cinfo->coef_bits[ci];
402
6.48k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
6.48k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
6.48k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
64.8k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
58.3k
      if (cinfo->input_scan_number > 1)
409
38.7k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
19.5k
      else
411
19.5k
        prev_coef_bits_latch[coefi] = -1;
412
58.3k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
58.3k
      if (coef_bits[coefi] != 0)
414
50.5k
        smoothing_useful = TRUE;
415
58.3k
    }
416
6.48k
    coef_bits_latch += SAVED_COEFS;
417
6.48k
    prev_coef_bits_latch += SAVED_COEFS;
418
6.48k
  }
419
420
2.10k
  return smoothing_useful;
421
2.34k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
361
79
{
362
79
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
79
  boolean smoothing_useful = FALSE;
364
79
  int ci, coefi;
365
79
  jpeg_component_info *compptr;
366
79
  JQUANT_TBL *qtable;
367
79
  int *coef_bits, *prev_coef_bits;
368
79
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
79
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
0
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
79
  if (coef->coef_bits_latch == NULL)
375
79
    coef->coef_bits_latch = (int *)
376
79
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
79
                                  cinfo->num_components * 2 *
378
79
                                  (SAVED_COEFS * sizeof(int)));
379
79
  coef_bits_latch = coef->coef_bits_latch;
380
79
  prev_coef_bits_latch =
381
79
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
167
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
149
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
149
    if ((qtable = compptr->quant_table) == NULL)
387
0
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
149
    if (qtable->quantval[0] == 0 ||
390
149
        qtable->quantval[Q01_POS] == 0 ||
391
149
        qtable->quantval[Q10_POS] == 0 ||
392
149
        qtable->quantval[Q20_POS] == 0 ||
393
149
        qtable->quantval[Q11_POS] == 0 ||
394
149
        qtable->quantval[Q02_POS] == 0 ||
395
149
        qtable->quantval[Q03_POS] == 0 ||
396
149
        qtable->quantval[Q12_POS] == 0 ||
397
149
        qtable->quantval[Q21_POS] == 0 ||
398
149
        qtable->quantval[Q30_POS] == 0)
399
61
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
88
    coef_bits = cinfo->coef_bits[ci];
402
88
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
88
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
88
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
880
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
792
      if (cinfo->input_scan_number > 1)
409
522
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
270
      else
411
270
        prev_coef_bits_latch[coefi] = -1;
412
792
      coef_bits_latch[coefi] = coef_bits[coefi];
413
792
      if (coef_bits[coefi] != 0)
414
702
        smoothing_useful = TRUE;
415
792
    }
416
88
    coef_bits_latch += SAVED_COEFS;
417
88
    prev_coef_bits_latch += SAVED_COEFS;
418
88
  }
419
420
18
  return smoothing_useful;
421
79
}
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
690k
{
431
690k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
690k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
690k
  JDIMENSION block_num, last_block_column;
434
690k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
690k
    image_block_rows;
436
690k
  JBLOCKARRAY buffer;
437
690k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
690k
  JBLOCKROW next_block_row, next_next_block_row;
439
690k
  _JSAMPARRAY output_ptr;
440
690k
  JDIMENSION output_col;
441
690k
  jpeg_component_info *compptr;
442
690k
  _inverse_DCT_method_ptr inverse_DCT;
443
690k
  boolean change_dc;
444
690k
  JCOEF *workspace;
445
690k
  int *coef_bits;
446
690k
  JQUANT_TBL *quanttbl;
447
690k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
690k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
690k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
690k
      DC25;
451
690k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
690k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
690k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
690k
         !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
2.76M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
2.07M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
2.07M
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
2.07M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
2.05M
      block_rows = compptr->v_samp_factor;
482
2.05M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
2.05M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
5.16k
      block_rows = compptr->v_samp_factor;
485
5.16k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
5.69k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
5.69k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
5.69k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
5.69k
      access_rows = block_rows; /* this iMCU row only */
491
5.69k
    }
492
    /* Align the virtual buffer for this component. */
493
2.07M
    if (cinfo->output_iMCU_row > 1) {
494
2.05M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
2.05M
      buffer = (*cinfo->mem->access_virt_barray)
496
2.05M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
2.05M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
2.05M
         (JDIMENSION)access_rows, FALSE);
499
2.05M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
2.05M
    } else if (cinfo->output_iMCU_row > 0) {
501
5.16k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
5.16k
      buffer = (*cinfo->mem->access_virt_barray)
503
5.16k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
5.16k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
5.16k
         (JDIMENSION)access_rows, FALSE);
506
5.16k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
5.69k
    } else {
508
5.69k
      buffer = (*cinfo->mem->access_virt_barray)
509
5.69k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
5.69k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
5.69k
    }
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
2.07M
    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
2.07M
    else
520
2.07M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
2.07M
    change_dc =
524
2.07M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
2.07M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
2.07M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
2.07M
    quanttbl = compptr->quant_table;
529
2.07M
    Q00 = quanttbl->quantval[0];
530
2.07M
    Q01 = quanttbl->quantval[Q01_POS];
531
2.07M
    Q10 = quanttbl->quantval[Q10_POS];
532
2.07M
    Q20 = quanttbl->quantval[Q20_POS];
533
2.07M
    Q11 = quanttbl->quantval[Q11_POS];
534
2.07M
    Q02 = quanttbl->quantval[Q02_POS];
535
2.07M
    if (change_dc) {
536
1.75M
      Q03 = quanttbl->quantval[Q03_POS];
537
1.75M
      Q12 = quanttbl->quantval[Q12_POS];
538
1.75M
      Q21 = quanttbl->quantval[Q21_POS];
539
1.75M
      Q30 = quanttbl->quantval[Q30_POS];
540
1.75M
    }
541
2.07M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
2.07M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
2.07M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
4.68M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
2.61M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
2.61M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
2.61M
      if (image_block_row > 0)
550
2.61M
        prev_block_row =
551
2.61M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
5.69k
      else
553
5.69k
        prev_block_row = buffer_ptr;
554
555
2.61M
      if (image_block_row > 1)
556
2.60M
        prev_prev_block_row =
557
2.60M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
10.9k
      else
559
10.9k
        prev_prev_block_row = prev_block_row;
560
561
2.61M
      if (image_block_row < image_block_rows - 1)
562
2.61M
        next_block_row =
563
2.61M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
5.69k
      else
565
5.69k
        next_block_row = buffer_ptr;
566
567
2.61M
      if (image_block_row < image_block_rows - 2)
568
2.60M
        next_next_block_row =
569
2.60M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
10.6k
      else
571
10.6k
        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
2.61M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
2.61M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
2.61M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
2.61M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
2.61M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
2.61M
      output_col = 0;
582
2.61M
      last_block_column = compptr->width_in_blocks - 1;
583
2.61M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
45.4M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
42.8M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
42.8M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
42.8M
            block_num < last_block_column) {
590
2.22M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
2.22M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
2.22M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
2.22M
          DC19 = DC20 = (int)next_block_row[1][0];
594
2.22M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
2.22M
        }
596
42.8M
        if (block_num + 1 < last_block_column) {
597
38.0M
          DC05 = (int)prev_prev_block_row[2][0];
598
38.0M
          DC10 = (int)prev_block_row[2][0];
599
38.0M
          DC15 = (int)buffer_ptr[2][0];
600
38.0M
          DC20 = (int)next_block_row[2][0];
601
38.0M
          DC25 = (int)next_next_block_row[2][0];
602
38.0M
        }
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
42.8M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
39.9M
          num = Q00 * (change_dc ?
616
33.9M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
33.9M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
33.9M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
33.9M
                 DC21 - DC22 + DC24 + DC25) :
620
39.9M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
39.9M
          if (num >= 0) {
622
25.2M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
25.2M
            if (Al > 0 && pred >= (1 << Al))
624
369k
              pred = (1 << Al) - 1;
625
25.2M
          } else {
626
14.6M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
14.6M
            if (Al > 0 && pred >= (1 << Al))
628
373k
              pred = (1 << Al) - 1;
629
14.6M
            pred = -pred;
630
14.6M
          }
631
39.9M
          workspace[1] = (JCOEF)pred;
632
39.9M
        }
633
        /* AC10 */
634
42.8M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
39.3M
          num = Q00 * (change_dc ?
636
33.9M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
33.9M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
33.9M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
33.9M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
39.3M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
39.3M
          if (num >= 0) {
642
25.5M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
25.5M
            if (Al > 0 && pred >= (1 << Al))
644
501k
              pred = (1 << Al) - 1;
645
25.5M
          } else {
646
13.7M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
13.7M
            if (Al > 0 && pred >= (1 << Al))
648
548k
              pred = (1 << Al) - 1;
649
13.7M
            pred = -pred;
650
13.7M
          }
651
39.3M
          workspace[8] = (JCOEF)pred;
652
39.3M
        }
653
        /* AC20 */
654
42.8M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
39.2M
          num = Q00 * (change_dc ?
656
33.9M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
33.9M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
39.2M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
39.2M
          if (num >= 0) {
660
25.3M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
25.3M
            if (Al > 0 && pred >= (1 << Al))
662
433k
              pred = (1 << Al) - 1;
663
25.3M
          } else {
664
13.9M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
13.9M
            if (Al > 0 && pred >= (1 << Al))
666
433k
              pred = (1 << Al) - 1;
667
13.9M
            pred = -pred;
668
13.9M
          }
669
39.2M
          workspace[16] = (JCOEF)pred;
670
39.2M
        }
671
        /* AC11 */
672
42.8M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
38.3M
          num = Q00 * (change_dc ?
674
33.9M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
33.9M
                 9 * DC19 + DC21 - DC25) :
676
38.3M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
4.41M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
38.3M
          if (num >= 0) {
679
30.2M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
30.2M
            if (Al > 0 && pred >= (1 << Al))
681
126k
              pred = (1 << Al) - 1;
682
30.2M
          } else {
683
8.09M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
8.09M
            if (Al > 0 && pred >= (1 << Al))
685
84.3k
              pred = (1 << Al) - 1;
686
8.09M
            pred = -pred;
687
8.09M
          }
688
38.3M
          workspace[9] = (JCOEF)pred;
689
38.3M
        }
690
        /* AC02 */
691
42.8M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
38.6M
          num = Q00 * (change_dc ?
693
33.9M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
33.9M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
38.6M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
38.6M
          if (num >= 0) {
697
25.0M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
25.0M
            if (Al > 0 && pred >= (1 << Al))
699
172k
              pred = (1 << Al) - 1;
700
25.0M
          } else {
701
13.6M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
13.6M
            if (Al > 0 && pred >= (1 << Al))
703
168k
              pred = (1 << Al) - 1;
704
13.6M
            pred = -pred;
705
13.6M
          }
706
38.6M
          workspace[2] = (JCOEF)pred;
707
38.6M
        }
708
42.8M
        if (change_dc) {
709
          /* AC03 */
710
33.9M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
33.9M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
33.9M
            if (num >= 0) {
713
21.9M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
21.9M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
21.9M
            } else {
717
11.9M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
11.9M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
11.9M
              pred = -pred;
721
11.9M
            }
722
33.9M
            workspace[3] = (JCOEF)pred;
723
33.9M
          }
724
          /* AC12 */
725
33.9M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
33.9M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
33.9M
            if (num >= 0) {
728
20.9M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
20.9M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
20.9M
            } else {
732
12.9M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
12.9M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
12.9M
              pred = -pred;
736
12.9M
            }
737
33.9M
            workspace[10] = (JCOEF)pred;
738
33.9M
          }
739
          /* AC21 */
740
33.9M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
33.9M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
33.9M
            if (num >= 0) {
743
21.5M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
21.5M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
21.5M
            } else {
747
12.3M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
12.3M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
12.3M
              pred = -pred;
751
12.3M
            }
752
33.9M
            workspace[17] = (JCOEF)pred;
753
33.9M
          }
754
          /* AC30 */
755
33.9M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
33.9M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
33.9M
            if (num >= 0) {
758
22.3M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
22.3M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
22.3M
            } else {
762
11.5M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
11.5M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
11.5M
              pred = -pred;
766
11.5M
            }
767
33.9M
            workspace[24] = (JCOEF)pred;
768
33.9M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
33.9M
          num = Q00 *
773
33.9M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
33.9M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
33.9M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
33.9M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
33.9M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
33.9M
          if (num >= 0) {
779
16.7M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
17.1M
          } else {
781
17.1M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
17.1M
            pred = -pred;
783
17.1M
          }
784
33.9M
          workspace[0] = (JCOEF)pred;
785
33.9M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
42.8M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
42.8M
                        output_col);
790
        /* Advance for next column */
791
42.8M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
42.8M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
42.8M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
42.8M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
42.8M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
42.8M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
42.8M
          prev_prev_block_row++, next_next_block_row++;
798
42.8M
        output_col += compptr->_DCT_scaled_size;
799
42.8M
      }
800
2.61M
      output_ptr += compptr->_DCT_scaled_size;
801
2.61M
    }
802
2.07M
  }
803
804
690k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
688k
    return JPEG_ROW_COMPLETED;
806
1.89k
  return JPEG_SCAN_COMPLETED;
807
690k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
430
690k
{
431
690k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
690k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
690k
  JDIMENSION block_num, last_block_column;
434
690k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
690k
    image_block_rows;
436
690k
  JBLOCKARRAY buffer;
437
690k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
690k
  JBLOCKROW next_block_row, next_next_block_row;
439
690k
  _JSAMPARRAY output_ptr;
440
690k
  JDIMENSION output_col;
441
690k
  jpeg_component_info *compptr;
442
690k
  _inverse_DCT_method_ptr inverse_DCT;
443
690k
  boolean change_dc;
444
690k
  JCOEF *workspace;
445
690k
  int *coef_bits;
446
690k
  JQUANT_TBL *quanttbl;
447
690k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
690k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
690k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
690k
      DC25;
451
690k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
690k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
690k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
690k
         !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
2.76M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
2.07M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
2.07M
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
2.07M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
2.05M
      block_rows = compptr->v_samp_factor;
482
2.05M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
2.05M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
5.16k
      block_rows = compptr->v_samp_factor;
485
5.16k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
5.69k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
5.69k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
5.69k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
5.69k
      access_rows = block_rows; /* this iMCU row only */
491
5.69k
    }
492
    /* Align the virtual buffer for this component. */
493
2.07M
    if (cinfo->output_iMCU_row > 1) {
494
2.05M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
2.05M
      buffer = (*cinfo->mem->access_virt_barray)
496
2.05M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
2.05M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
2.05M
         (JDIMENSION)access_rows, FALSE);
499
2.05M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
2.05M
    } else if (cinfo->output_iMCU_row > 0) {
501
5.16k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
5.16k
      buffer = (*cinfo->mem->access_virt_barray)
503
5.16k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
5.16k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
5.16k
         (JDIMENSION)access_rows, FALSE);
506
5.16k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
5.69k
    } else {
508
5.69k
      buffer = (*cinfo->mem->access_virt_barray)
509
5.69k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
5.69k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
5.69k
    }
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
2.07M
    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
2.07M
    else
520
2.07M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
2.07M
    change_dc =
524
2.07M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
2.07M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
2.07M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
2.07M
    quanttbl = compptr->quant_table;
529
2.07M
    Q00 = quanttbl->quantval[0];
530
2.07M
    Q01 = quanttbl->quantval[Q01_POS];
531
2.07M
    Q10 = quanttbl->quantval[Q10_POS];
532
2.07M
    Q20 = quanttbl->quantval[Q20_POS];
533
2.07M
    Q11 = quanttbl->quantval[Q11_POS];
534
2.07M
    Q02 = quanttbl->quantval[Q02_POS];
535
2.07M
    if (change_dc) {
536
1.75M
      Q03 = quanttbl->quantval[Q03_POS];
537
1.75M
      Q12 = quanttbl->quantval[Q12_POS];
538
1.75M
      Q21 = quanttbl->quantval[Q21_POS];
539
1.75M
      Q30 = quanttbl->quantval[Q30_POS];
540
1.75M
    }
541
2.07M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
2.07M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
2.07M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
4.68M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
2.61M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
2.61M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
2.61M
      if (image_block_row > 0)
550
2.61M
        prev_block_row =
551
2.61M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
5.69k
      else
553
5.69k
        prev_block_row = buffer_ptr;
554
555
2.61M
      if (image_block_row > 1)
556
2.60M
        prev_prev_block_row =
557
2.60M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
10.9k
      else
559
10.9k
        prev_prev_block_row = prev_block_row;
560
561
2.61M
      if (image_block_row < image_block_rows - 1)
562
2.61M
        next_block_row =
563
2.61M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
5.69k
      else
565
5.69k
        next_block_row = buffer_ptr;
566
567
2.61M
      if (image_block_row < image_block_rows - 2)
568
2.60M
        next_next_block_row =
569
2.60M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
10.6k
      else
571
10.6k
        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
2.61M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
2.61M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
2.61M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
2.61M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
2.61M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
2.61M
      output_col = 0;
582
2.61M
      last_block_column = compptr->width_in_blocks - 1;
583
2.61M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
45.4M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
42.8M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
42.8M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
42.8M
            block_num < last_block_column) {
590
2.22M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
2.22M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
2.22M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
2.22M
          DC19 = DC20 = (int)next_block_row[1][0];
594
2.22M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
2.22M
        }
596
42.8M
        if (block_num + 1 < last_block_column) {
597
38.0M
          DC05 = (int)prev_prev_block_row[2][0];
598
38.0M
          DC10 = (int)prev_block_row[2][0];
599
38.0M
          DC15 = (int)buffer_ptr[2][0];
600
38.0M
          DC20 = (int)next_block_row[2][0];
601
38.0M
          DC25 = (int)next_next_block_row[2][0];
602
38.0M
        }
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
42.8M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
39.9M
          num = Q00 * (change_dc ?
616
33.9M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
33.9M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
33.9M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
33.9M
                 DC21 - DC22 + DC24 + DC25) :
620
39.9M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
39.9M
          if (num >= 0) {
622
25.2M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
25.2M
            if (Al > 0 && pred >= (1 << Al))
624
369k
              pred = (1 << Al) - 1;
625
25.2M
          } else {
626
14.6M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
14.6M
            if (Al > 0 && pred >= (1 << Al))
628
373k
              pred = (1 << Al) - 1;
629
14.6M
            pred = -pred;
630
14.6M
          }
631
39.9M
          workspace[1] = (JCOEF)pred;
632
39.9M
        }
633
        /* AC10 */
634
42.8M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
39.3M
          num = Q00 * (change_dc ?
636
33.9M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
33.9M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
33.9M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
33.9M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
39.3M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
39.3M
          if (num >= 0) {
642
25.5M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
25.5M
            if (Al > 0 && pred >= (1 << Al))
644
501k
              pred = (1 << Al) - 1;
645
25.5M
          } else {
646
13.7M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
13.7M
            if (Al > 0 && pred >= (1 << Al))
648
548k
              pred = (1 << Al) - 1;
649
13.7M
            pred = -pred;
650
13.7M
          }
651
39.3M
          workspace[8] = (JCOEF)pred;
652
39.3M
        }
653
        /* AC20 */
654
42.8M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
39.2M
          num = Q00 * (change_dc ?
656
33.9M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
33.9M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
39.2M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
39.2M
          if (num >= 0) {
660
25.3M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
25.3M
            if (Al > 0 && pred >= (1 << Al))
662
433k
              pred = (1 << Al) - 1;
663
25.3M
          } else {
664
13.9M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
13.9M
            if (Al > 0 && pred >= (1 << Al))
666
433k
              pred = (1 << Al) - 1;
667
13.9M
            pred = -pred;
668
13.9M
          }
669
39.2M
          workspace[16] = (JCOEF)pred;
670
39.2M
        }
671
        /* AC11 */
672
42.8M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
38.3M
          num = Q00 * (change_dc ?
674
33.9M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
33.9M
                 9 * DC19 + DC21 - DC25) :
676
38.3M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
4.41M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
38.3M
          if (num >= 0) {
679
30.2M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
30.2M
            if (Al > 0 && pred >= (1 << Al))
681
126k
              pred = (1 << Al) - 1;
682
30.2M
          } else {
683
8.09M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
8.09M
            if (Al > 0 && pred >= (1 << Al))
685
84.3k
              pred = (1 << Al) - 1;
686
8.09M
            pred = -pred;
687
8.09M
          }
688
38.3M
          workspace[9] = (JCOEF)pred;
689
38.3M
        }
690
        /* AC02 */
691
42.8M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
38.6M
          num = Q00 * (change_dc ?
693
33.9M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
33.9M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
38.6M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
38.6M
          if (num >= 0) {
697
25.0M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
25.0M
            if (Al > 0 && pred >= (1 << Al))
699
172k
              pred = (1 << Al) - 1;
700
25.0M
          } else {
701
13.6M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
13.6M
            if (Al > 0 && pred >= (1 << Al))
703
168k
              pred = (1 << Al) - 1;
704
13.6M
            pred = -pred;
705
13.6M
          }
706
38.6M
          workspace[2] = (JCOEF)pred;
707
38.6M
        }
708
42.8M
        if (change_dc) {
709
          /* AC03 */
710
33.9M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
33.9M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
33.9M
            if (num >= 0) {
713
21.9M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
21.9M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
21.9M
            } else {
717
11.9M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
11.9M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
11.9M
              pred = -pred;
721
11.9M
            }
722
33.9M
            workspace[3] = (JCOEF)pred;
723
33.9M
          }
724
          /* AC12 */
725
33.9M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
33.9M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
33.9M
            if (num >= 0) {
728
20.9M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
20.9M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
20.9M
            } else {
732
12.9M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
12.9M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
12.9M
              pred = -pred;
736
12.9M
            }
737
33.9M
            workspace[10] = (JCOEF)pred;
738
33.9M
          }
739
          /* AC21 */
740
33.9M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
33.9M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
33.9M
            if (num >= 0) {
743
21.5M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
21.5M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
21.5M
            } else {
747
12.3M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
12.3M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
12.3M
              pred = -pred;
751
12.3M
            }
752
33.9M
            workspace[17] = (JCOEF)pred;
753
33.9M
          }
754
          /* AC30 */
755
33.9M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
33.9M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
33.9M
            if (num >= 0) {
758
22.3M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
22.3M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
22.3M
            } else {
762
11.5M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
11.5M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
11.5M
              pred = -pred;
766
11.5M
            }
767
33.9M
            workspace[24] = (JCOEF)pred;
768
33.9M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
33.9M
          num = Q00 *
773
33.9M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
33.9M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
33.9M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
33.9M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
33.9M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
33.9M
          if (num >= 0) {
779
16.7M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
17.1M
          } else {
781
17.1M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
17.1M
            pred = -pred;
783
17.1M
          }
784
33.9M
          workspace[0] = (JCOEF)pred;
785
33.9M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
42.8M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
42.8M
                        output_col);
790
        /* Advance for next column */
791
42.8M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
42.8M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
42.8M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
42.8M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
42.8M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
42.8M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
42.8M
          prev_prev_block_row++, next_next_block_row++;
798
42.8M
        output_col += compptr->_DCT_scaled_size;
799
42.8M
      }
800
2.61M
      output_ptr += compptr->_DCT_scaled_size;
801
2.61M
    }
802
2.07M
  }
803
804
690k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
688k
    return JPEG_ROW_COMPLETED;
806
1.89k
  return JPEG_SCAN_COMPLETED;
807
690k
}
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.30k
{
819
5.30k
  my_coef_ptr coef;
820
821
5.30k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
5.30k
  coef = (my_coef_ptr)
825
5.30k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
5.30k
                                sizeof(my_coef_controller));
827
5.30k
  memset(coef, 0, sizeof(my_coef_controller));
828
5.30k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
5.30k
  coef->pub.start_input_pass = start_input_pass;
830
5.30k
  coef->pub.start_output_pass = start_output_pass;
831
5.30k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
5.30k
  coef->coef_bits_latch = NULL;
833
5.30k
#endif
834
835
  /* Create the coefficient buffer. */
836
5.30k
  if (need_full_buffer) {
837
3.29k
#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.29k
    int ci, access_rows;
842
3.29k
    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.84k
        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.29k
    coef->pub.consume_data = consume_data;
861
3.29k
    coef->pub._decompress_data = decompress_data;
862
3.29k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
3.29k
  } else {
867
    /* We only need a single-MCU buffer. */
868
2.01k
    JBLOCKROW buffer;
869
2.01k
    int i;
870
871
2.01k
    buffer = (JBLOCKROW)
872
2.01k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
2.01k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
22.1k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
20.1k
      coef->MCU_buffer[i] = buffer + i;
876
20.1k
    }
877
2.01k
    coef->pub.consume_data = dummy_consume_data;
878
2.01k
    coef->pub._decompress_data = decompress_onepass;
879
2.01k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
2.01k
  }
881
882
  /* Allocate the workspace buffer */
883
5.30k
  coef->workspace = (JCOEF *)
884
5.30k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
5.30k
                                sizeof(JCOEF) * DCTSIZE2);
886
5.30k
}
jinit_d_coef_controller
Line
Count
Source
818
5.07k
{
819
5.07k
  my_coef_ptr coef;
820
821
5.07k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
5.07k
  coef = (my_coef_ptr)
825
5.07k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
5.07k
                                sizeof(my_coef_controller));
827
5.07k
  memset(coef, 0, sizeof(my_coef_controller));
828
5.07k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
5.07k
  coef->pub.start_input_pass = start_input_pass;
830
5.07k
  coef->pub.start_output_pass = start_output_pass;
831
5.07k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
5.07k
  coef->coef_bits_latch = NULL;
833
5.07k
#endif
834
835
  /* Create the coefficient buffer. */
836
5.07k
  if (need_full_buffer) {
837
3.07k
#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.07k
    int ci, access_rows;
842
3.07k
    jpeg_component_info *compptr;
843
844
12.3k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
9.22k
         ci++, compptr++) {
846
9.22k
      access_rows = compptr->v_samp_factor;
847
9.22k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
9.22k
      if (cinfo->progressive_mode)
850
9.20k
        access_rows *= 5;
851
9.22k
#endif
852
9.22k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
9.22k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
9.22k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
9.22k
                               (long)compptr->h_samp_factor),
856
9.22k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
9.22k
                               (long)compptr->v_samp_factor),
858
9.22k
         (JDIMENSION)access_rows);
859
9.22k
    }
860
3.07k
    coef->pub.consume_data = consume_data;
861
3.07k
    coef->pub._decompress_data = decompress_data;
862
3.07k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
3.07k
  } else {
867
    /* We only need a single-MCU buffer. */
868
1.99k
    JBLOCKROW buffer;
869
1.99k
    int i;
870
871
1.99k
    buffer = (JBLOCKROW)
872
1.99k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
1.99k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
21.9k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
19.9k
      coef->MCU_buffer[i] = buffer + i;
876
19.9k
    }
877
1.99k
    coef->pub.consume_data = dummy_consume_data;
878
1.99k
    coef->pub._decompress_data = decompress_onepass;
879
1.99k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
1.99k
  }
881
882
  /* Allocate the workspace buffer */
883
5.07k
  coef->workspace = (JCOEF *)
884
5.07k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
5.07k
                                sizeof(JCOEF) * DCTSIZE2);
886
5.07k
}
j12init_d_coef_controller
Line
Count
Source
818
231
{
819
231
  my_coef_ptr coef;
820
821
231
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
231
  coef = (my_coef_ptr)
825
231
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
231
                                sizeof(my_coef_controller));
827
231
  memset(coef, 0, sizeof(my_coef_controller));
828
231
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
231
  coef->pub.start_input_pass = start_input_pass;
830
231
  coef->pub.start_output_pass = start_output_pass;
831
231
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
231
  coef->coef_bits_latch = NULL;
833
231
#endif
834
835
  /* Create the coefficient buffer. */
836
231
  if (need_full_buffer) {
837
213
#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
213
    int ci, access_rows;
842
213
    jpeg_component_info *compptr;
843
844
850
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
637
         ci++, compptr++) {
846
637
      access_rows = compptr->v_samp_factor;
847
637
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
637
      if (cinfo->progressive_mode)
850
637
        access_rows *= 5;
851
637
#endif
852
637
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
637
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
637
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
637
                               (long)compptr->h_samp_factor),
856
637
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
637
                               (long)compptr->v_samp_factor),
858
637
         (JDIMENSION)access_rows);
859
637
    }
860
213
    coef->pub.consume_data = consume_data;
861
213
    coef->pub._decompress_data = decompress_data;
862
213
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
213
  } else {
867
    /* We only need a single-MCU buffer. */
868
18
    JBLOCKROW buffer;
869
18
    int i;
870
871
18
    buffer = (JBLOCKROW)
872
18
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
18
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
198
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
180
      coef->MCU_buffer[i] = buffer + i;
876
180
    }
877
18
    coef->pub.consume_data = dummy_consume_data;
878
18
    coef->pub._decompress_data = decompress_onepass;
879
18
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
18
  }
881
882
  /* Allocate the workspace buffer */
883
231
  coef->workspace = (JCOEF *)
884
231
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
231
                                sizeof(JCOEF) * DCTSIZE2);
886
231
}