Coverage Report

Created: 2026-01-16 06:31

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libjpeg-turbo/src/jdcoefct.c
Line
Count
Source
1
/*
2
 * jdcoefct.c
3
 *
4
 * This file was part of the Independent JPEG Group's software:
5
 * Copyright (C) 1994-1997, Thomas G. Lane.
6
 * libjpeg-turbo Modifications:
7
 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
8
 * Copyright (C) 2010, 2015-2016, 2019-2020, 2022-2024, D. R. Commander.
9
 * Copyright (C) 2015, 2020, Google, Inc.
10
 * For conditions of distribution and use, see the accompanying README.ijg
11
 * file.
12
 *
13
 * This file contains the coefficient buffer controller for decompression.
14
 * This controller is the top level of the lossy JPEG decompressor proper.
15
 * The coefficient buffer lies between entropy decoding and inverse-DCT steps.
16
 *
17
 * In buffered-image mode, this controller is the interface between
18
 * input-oriented processing and output-oriented processing.
19
 * Also, the input side (only) is used when reading a file for transcoding.
20
 */
21
22
#include "jinclude.h"
23
#include "jdcoefct.h"
24
#include "jpegapicomp.h"
25
#include "jsamplecomp.h"
26
27
28
/* Forward declarations */
29
METHODDEF(int) decompress_onepass(j_decompress_ptr cinfo,
30
                                  _JSAMPIMAGE output_buf);
31
#ifdef D_MULTISCAN_FILES_SUPPORTED
32
METHODDEF(int) decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf);
33
#endif
34
#ifdef BLOCK_SMOOTHING_SUPPORTED
35
LOCAL(boolean) smoothing_ok(j_decompress_ptr cinfo);
36
METHODDEF(int) decompress_smooth_data(j_decompress_ptr cinfo,
37
                                      _JSAMPIMAGE output_buf);
38
#endif
39
40
41
/*
42
 * Initialize for an input processing pass.
43
 */
44
45
METHODDEF(void)
46
start_input_pass(j_decompress_ptr cinfo)
47
6.33k
{
48
6.33k
  cinfo->input_iMCU_row = 0;
49
6.33k
  start_iMCU_row(cinfo);
50
6.33k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
47
5.32k
{
48
5.32k
  cinfo->input_iMCU_row = 0;
49
5.32k
  start_iMCU_row(cinfo);
50
5.32k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
47
1.01k
{
48
1.01k
  cinfo->input_iMCU_row = 0;
49
1.01k
  start_iMCU_row(cinfo);
50
1.01k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
1.72k
{
60
1.72k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
1.72k
  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
1.72k
  if (coef->pub.coef_arrays != NULL) {
65
811
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
472
      coef->pub._decompress_data = decompress_smooth_data;
67
339
    else
68
339
      coef->pub._decompress_data = decompress_data;
69
811
  }
70
1.72k
#endif
71
1.72k
  cinfo->output_iMCU_row = 0;
72
1.72k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
59
1.63k
{
60
1.63k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
1.63k
  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
1.63k
  if (coef->pub.coef_arrays != NULL) {
65
719
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
434
      coef->pub._decompress_data = decompress_smooth_data;
67
285
    else
68
285
      coef->pub._decompress_data = decompress_data;
69
719
  }
70
1.63k
#endif
71
1.63k
  cinfo->output_iMCU_row = 0;
72
1.63k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
59
93
{
60
93
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
93
  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
93
  if (coef->pub.coef_arrays != NULL) {
65
92
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
38
      coef->pub._decompress_data = decompress_smooth_data;
67
54
    else
68
54
      coef->pub._decompress_data = decompress_data;
69
92
  }
70
93
#endif
71
93
  cinfo->output_iMCU_row = 0;
72
93
}
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
131k
{
88
131k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
131k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
131k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
131k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
131k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
131k
  _JSAMPARRAY output_ptr;
94
131k
  JDIMENSION start_col, output_col;
95
131k
  jpeg_component_info *compptr;
96
131k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
414k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
283k
       yoffset++) {
101
4.71M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
4.43M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
4.43M
      jzero_far((void *)coef->MCU_buffer[0],
105
4.43M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
4.43M
      if (!cinfo->entropy->insufficient_data)
107
4.43M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
4.43M
      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.43M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
4.43M
          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.43M
        blkn = 0;               /* index of current DCT block within MCU */
126
8.97M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
4.53M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
4.53M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
4.53M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
4.53M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
4.24M
                         compptr->MCU_width : compptr->last_col_width;
136
4.53M
          output_ptr = output_buf[compptr->component_index] +
137
4.53M
                       yoffset * compptr->_DCT_scaled_size;
138
4.53M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
4.53M
                      compptr->MCU_sample_width;
140
9.17M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
4.63M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
4.63M
                yoffset + yindex < compptr->last_row_height) {
143
4.63M
              output_col = start_col;
144
9.34M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
4.71M
                (*inverse_DCT) (cinfo, compptr,
146
4.71M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
4.71M
                                output_ptr, output_col);
148
4.71M
                output_col += compptr->_DCT_scaled_size;
149
4.71M
              }
150
4.63M
            }
151
4.63M
            blkn += compptr->MCU_width;
152
4.63M
            output_ptr += compptr->_DCT_scaled_size;
153
4.63M
          }
154
4.53M
        }
155
4.43M
      }
156
4.43M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
283k
    coef->MCU_ctr = 0;
159
283k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
131k
  cinfo->output_iMCU_row++;
162
131k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
130k
    start_iMCU_row(cinfo);
164
130k
    return JPEG_ROW_COMPLETED;
165
130k
  }
166
  /* Completed the scan */
167
911
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
911
  return JPEG_SCAN_COMPLETED;
169
131k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
87
131k
{
88
131k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
131k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
131k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
131k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
131k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
131k
  _JSAMPARRAY output_ptr;
94
131k
  JDIMENSION start_col, output_col;
95
131k
  jpeg_component_info *compptr;
96
131k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
414k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
283k
       yoffset++) {
101
4.71M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
4.43M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
4.43M
      jzero_far((void *)coef->MCU_buffer[0],
105
4.43M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
4.43M
      if (!cinfo->entropy->insufficient_data)
107
4.43M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
4.43M
      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.43M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
4.43M
          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.43M
        blkn = 0;               /* index of current DCT block within MCU */
126
8.97M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
4.53M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
4.53M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
4.53M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
4.53M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
4.24M
                         compptr->MCU_width : compptr->last_col_width;
136
4.53M
          output_ptr = output_buf[compptr->component_index] +
137
4.53M
                       yoffset * compptr->_DCT_scaled_size;
138
4.53M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
4.53M
                      compptr->MCU_sample_width;
140
9.17M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
4.63M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
4.63M
                yoffset + yindex < compptr->last_row_height) {
143
4.63M
              output_col = start_col;
144
9.34M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
4.71M
                (*inverse_DCT) (cinfo, compptr,
146
4.71M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
4.71M
                                output_ptr, output_col);
148
4.71M
                output_col += compptr->_DCT_scaled_size;
149
4.71M
              }
150
4.63M
            }
151
4.63M
            blkn += compptr->MCU_width;
152
4.63M
            output_ptr += compptr->_DCT_scaled_size;
153
4.63M
          }
154
4.53M
        }
155
4.43M
      }
156
4.43M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
283k
    coef->MCU_ctr = 0;
159
283k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
131k
  cinfo->output_iMCU_row++;
162
131k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
130k
    start_iMCU_row(cinfo);
164
130k
    return JPEG_ROW_COMPLETED;
165
130k
  }
166
  /* Completed the scan */
167
911
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
911
  return JPEG_SCAN_COMPLETED;
169
131k
}
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.61M
{
195
1.61M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
1.61M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
1.61M
  int blkn, ci, xindex, yindex, yoffset;
198
1.61M
  JDIMENSION start_col;
199
1.61M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
1.61M
  JBLOCKROW buffer_ptr;
201
1.61M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
3.33M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
1.71M
    compptr = cinfo->cur_comp_info[ci];
206
1.71M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
1.71M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
1.71M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
1.71M
       (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.71M
  }
215
216
  /* Loop to process one whole iMCU row */
217
3.75M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
2.13M
       yoffset++) {
219
73.1M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
70.9M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
70.9M
      blkn = 0;                 /* index of current DCT block within MCU */
223
144M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
73.9M
        compptr = cinfo->cur_comp_info[ci];
225
73.9M
        start_col = MCU_col_num * compptr->MCU_width;
226
149M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
75.6M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
155M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
79.8M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
79.8M
          }
231
75.6M
        }
232
73.9M
      }
233
70.9M
      if (!cinfo->entropy->insufficient_data)
234
70.9M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
70.9M
      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
70.9M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
2.13M
    coef->MCU_ctr = 0;
245
2.13M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
1.61M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
1.61M
    start_iMCU_row(cinfo);
249
1.61M
    return JPEG_ROW_COMPLETED;
250
1.61M
  }
251
  /* Completed the scan */
252
5.41k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
5.41k
  return JPEG_SCAN_COMPLETED;
254
1.61M
}
jdcoefct-8.c:consume_data
Line
Count
Source
194
1.38M
{
195
1.38M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
1.38M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
1.38M
  int blkn, ci, xindex, yindex, yoffset;
198
1.38M
  JDIMENSION start_col;
199
1.38M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
1.38M
  JBLOCKROW buffer_ptr;
201
1.38M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
2.81M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
1.42M
    compptr = cinfo->cur_comp_info[ci];
206
1.42M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
1.42M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
1.42M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
1.42M
       (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.42M
  }
215
216
  /* Loop to process one whole iMCU row */
217
3.15M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
1.76M
       yoffset++) {
219
63.6M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
61.8M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
61.8M
      blkn = 0;                 /* index of current DCT block within MCU */
223
126M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
64.5M
        compptr = cinfo->cur_comp_info[ci];
225
64.5M
        start_col = MCU_col_num * compptr->MCU_width;
226
130M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
66.0M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
135M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
69.2M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
69.2M
          }
231
66.0M
        }
232
64.5M
      }
233
61.8M
      if (!cinfo->entropy->insufficient_data)
234
61.8M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
61.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
61.8M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
1.76M
    coef->MCU_ctr = 0;
245
1.76M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
1.38M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
1.37M
    start_iMCU_row(cinfo);
249
1.37M
    return JPEG_ROW_COMPLETED;
250
1.37M
  }
251
  /* Completed the scan */
252
4.41k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
4.41k
  return JPEG_SCAN_COMPLETED;
254
1.38M
}
jdcoefct-12.c:consume_data
Line
Count
Source
194
235k
{
195
235k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
235k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
235k
  int blkn, ci, xindex, yindex, yoffset;
198
235k
  JDIMENSION start_col;
199
235k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
235k
  JBLOCKROW buffer_ptr;
201
235k
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
520k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
284k
    compptr = cinfo->cur_comp_info[ci];
206
284k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
284k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
284k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
284k
       (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
284k
  }
215
216
  /* Loop to process one whole iMCU row */
217
607k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
371k
       yoffset++) {
219
9.46M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
9.09M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
9.09M
      blkn = 0;                 /* index of current DCT block within MCU */
223
18.5M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
9.40M
        compptr = cinfo->cur_comp_info[ci];
225
9.40M
        start_col = MCU_col_num * compptr->MCU_width;
226
19.0M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
9.66M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
20.3M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
10.6M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
10.6M
          }
231
9.66M
        }
232
9.40M
      }
233
9.09M
      if (!cinfo->entropy->insufficient_data)
234
9.09M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
9.09M
      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
9.09M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
371k
    coef->MCU_ctr = 0;
245
371k
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
235k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
234k
    start_iMCU_row(cinfo);
249
234k
    return JPEG_ROW_COMPLETED;
250
234k
  }
251
  /* Completed the scan */
252
1.00k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
1.00k
  return JPEG_SCAN_COMPLETED;
254
235k
}
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
114k
{
268
114k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
114k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
114k
  JDIMENSION block_num;
271
114k
  int ci, block_row, block_rows;
272
114k
  JBLOCKARRAY buffer;
273
114k
  JBLOCKROW buffer_ptr;
274
114k
  _JSAMPARRAY output_ptr;
275
114k
  JDIMENSION output_col;
276
114k
  jpeg_component_info *compptr;
277
114k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
114k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
114k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
114k
          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
283k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
169k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
169k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
169k
    buffer = (*cinfo->mem->access_virt_barray)
295
169k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
169k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
169k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
169k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
168k
      block_rows = compptr->v_samp_factor;
301
613
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
613
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
613
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
613
    }
306
169k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
169k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
442k
    for (block_row = 0; block_row < block_rows; block_row++) {
310
273k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
273k
      output_col = 0;
312
273k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
6.55M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
6.28M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
6.28M
                        output_col);
316
6.28M
        buffer_ptr++;
317
6.28M
        output_col += compptr->_DCT_scaled_size;
318
6.28M
      }
319
273k
      output_ptr += compptr->_DCT_scaled_size;
320
273k
    }
321
169k
  }
322
323
114k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
114k
    return JPEG_ROW_COMPLETED;
325
285
  return JPEG_SCAN_COMPLETED;
326
114k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
267
114k
{
268
114k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
114k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
114k
  JDIMENSION block_num;
271
114k
  int ci, block_row, block_rows;
272
114k
  JBLOCKARRAY buffer;
273
114k
  JBLOCKROW buffer_ptr;
274
114k
  _JSAMPARRAY output_ptr;
275
114k
  JDIMENSION output_col;
276
114k
  jpeg_component_info *compptr;
277
114k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
114k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
114k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
114k
          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
283k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
169k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
169k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
169k
    buffer = (*cinfo->mem->access_virt_barray)
295
169k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
169k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
169k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
169k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
168k
      block_rows = compptr->v_samp_factor;
301
613
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
613
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
613
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
613
    }
306
169k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
169k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
442k
    for (block_row = 0; block_row < block_rows; block_row++) {
310
273k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
273k
      output_col = 0;
312
273k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
6.55M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
6.28M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
6.28M
                        output_col);
316
6.28M
        buffer_ptr++;
317
6.28M
        output_col += compptr->_DCT_scaled_size;
318
6.28M
      }
319
273k
      output_ptr += compptr->_DCT_scaled_size;
320
273k
    }
321
169k
  }
322
323
114k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
114k
    return JPEG_ROW_COMPLETED;
325
285
  return JPEG_SCAN_COMPLETED;
326
114k
}
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
226k
#define Q01_POS  1
342
226k
#define Q10_POS  8
343
226k
#define Q20_POS  16
344
225k
#define Q11_POS  9
345
225k
#define Q02_POS  2
346
142k
#define Q03_POS  3
347
142k
#define Q12_POS  10
348
142k
#define Q21_POS  17
349
142k
#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
811
{
362
811
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
811
  boolean smoothing_useful = FALSE;
364
811
  int ci, coefi;
365
811
  jpeg_component_info *compptr;
366
811
  JQUANT_TBL *qtable;
367
811
  int *coef_bits, *prev_coef_bits;
368
811
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
811
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
13
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
798
  if (coef->coef_bits_latch == NULL)
375
798
    coef->coef_bits_latch = (int *)
376
798
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
798
                                  cinfo->num_components * 2 *
378
798
                                  (SAVED_COEFS * sizeof(int)));
379
798
  coef_bits_latch = coef->coef_bits_latch;
380
798
  prev_coef_bits_latch =
381
798
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
1.37k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
902
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
902
    if ((qtable = compptr->quant_table) == NULL)
387
65
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
837
    if (qtable->quantval[0] == 0 ||
390
802
        qtable->quantval[Q01_POS] == 0 ||
391
755
        qtable->quantval[Q10_POS] == 0 ||
392
734
        qtable->quantval[Q20_POS] == 0 ||
393
706
        qtable->quantval[Q11_POS] == 0 ||
394
686
        qtable->quantval[Q02_POS] == 0 ||
395
671
        qtable->quantval[Q03_POS] == 0 ||
396
645
        qtable->quantval[Q12_POS] == 0 ||
397
626
        qtable->quantval[Q21_POS] == 0 ||
398
605
        qtable->quantval[Q30_POS] == 0)
399
256
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
581
    coef_bits = cinfo->coef_bits[ci];
402
581
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
581
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
581
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
5.81k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
5.22k
      if (cinfo->input_scan_number > 1)
409
2.79k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
2.43k
      else
411
2.43k
        prev_coef_bits_latch[coefi] = -1;
412
5.22k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
5.22k
      if (coef_bits[coefi] != 0)
414
5.00k
        smoothing_useful = TRUE;
415
5.22k
    }
416
581
    coef_bits_latch += SAVED_COEFS;
417
581
    prev_coef_bits_latch += SAVED_COEFS;
418
581
  }
419
420
477
  return smoothing_useful;
421
798
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
361
719
{
362
719
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
719
  boolean smoothing_useful = FALSE;
364
719
  int ci, coefi;
365
719
  jpeg_component_info *compptr;
366
719
  JQUANT_TBL *qtable;
367
719
  int *coef_bits, *prev_coef_bits;
368
719
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
719
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
11
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
708
  if (coef->coef_bits_latch == NULL)
375
708
    coef->coef_bits_latch = (int *)
376
708
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
708
                                  cinfo->num_components * 2 *
378
708
                                  (SAVED_COEFS * sizeof(int)));
379
708
  coef_bits_latch = coef->coef_bits_latch;
380
708
  prev_coef_bits_latch =
381
708
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
1.22k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
789
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
789
    if ((qtable = compptr->quant_table) == NULL)
387
60
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
729
    if (qtable->quantval[0] == 0 ||
390
698
        qtable->quantval[Q01_POS] == 0 ||
391
654
        qtable->quantval[Q10_POS] == 0 ||
392
635
        qtable->quantval[Q20_POS] == 0 ||
393
614
        qtable->quantval[Q11_POS] == 0 ||
394
598
        qtable->quantval[Q02_POS] == 0 ||
395
588
        qtable->quantval[Q03_POS] == 0 ||
396
567
        qtable->quantval[Q12_POS] == 0 ||
397
552
        qtable->quantval[Q21_POS] == 0 ||
398
534
        qtable->quantval[Q30_POS] == 0)
399
212
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
517
    coef_bits = cinfo->coef_bits[ci];
402
517
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
517
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
517
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
5.17k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
4.65k
      if (cinfo->input_scan_number > 1)
409
2.57k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
2.07k
      else
411
2.07k
        prev_coef_bits_latch[coefi] = -1;
412
4.65k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
4.65k
      if (coef_bits[coefi] != 0)
414
4.49k
        smoothing_useful = TRUE;
415
4.65k
    }
416
517
    coef_bits_latch += SAVED_COEFS;
417
517
    prev_coef_bits_latch += SAVED_COEFS;
418
517
  }
419
420
436
  return smoothing_useful;
421
708
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
361
92
{
362
92
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
92
  boolean smoothing_useful = FALSE;
364
92
  int ci, coefi;
365
92
  jpeg_component_info *compptr;
366
92
  JQUANT_TBL *qtable;
367
92
  int *coef_bits, *prev_coef_bits;
368
92
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
92
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
2
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
90
  if (coef->coef_bits_latch == NULL)
375
90
    coef->coef_bits_latch = (int *)
376
90
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
90
                                  cinfo->num_components * 2 *
378
90
                                  (SAVED_COEFS * sizeof(int)));
379
90
  coef_bits_latch = coef->coef_bits_latch;
380
90
  prev_coef_bits_latch =
381
90
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
154
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
113
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
113
    if ((qtable = compptr->quant_table) == NULL)
387
5
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
108
    if (qtable->quantval[0] == 0 ||
390
104
        qtable->quantval[Q01_POS] == 0 ||
391
101
        qtable->quantval[Q10_POS] == 0 ||
392
99
        qtable->quantval[Q20_POS] == 0 ||
393
92
        qtable->quantval[Q11_POS] == 0 ||
394
88
        qtable->quantval[Q02_POS] == 0 ||
395
83
        qtable->quantval[Q03_POS] == 0 ||
396
78
        qtable->quantval[Q12_POS] == 0 ||
397
74
        qtable->quantval[Q21_POS] == 0 ||
398
71
        qtable->quantval[Q30_POS] == 0)
399
44
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
64
    coef_bits = cinfo->coef_bits[ci];
402
64
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
64
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
64
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
640
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
576
      if (cinfo->input_scan_number > 1)
409
225
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
351
      else
411
351
        prev_coef_bits_latch[coefi] = -1;
412
576
      coef_bits_latch[coefi] = coef_bits[coefi];
413
576
      if (coef_bits[coefi] != 0)
414
517
        smoothing_useful = TRUE;
415
576
    }
416
64
    coef_bits_latch += SAVED_COEFS;
417
64
    prev_coef_bits_latch += SAVED_COEFS;
418
64
  }
419
420
41
  return smoothing_useful;
421
90
}
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
215k
{
431
215k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
215k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
215k
  JDIMENSION block_num, last_block_column;
434
215k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
215k
    image_block_rows;
436
215k
  JBLOCKARRAY buffer;
437
215k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
215k
  JBLOCKROW next_block_row, next_next_block_row;
439
215k
  _JSAMPARRAY output_ptr;
440
215k
  JDIMENSION output_col;
441
215k
  jpeg_component_info *compptr;
442
215k
  _inverse_DCT_method_ptr inverse_DCT;
443
215k
  boolean change_dc;
444
215k
  JCOEF *workspace;
445
215k
  int *coef_bits;
446
215k
  JQUANT_TBL *quanttbl;
447
215k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
215k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
215k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
215k
      DC25;
451
215k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
215k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
215k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
215k
         !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
440k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
225k
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
225k
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
225k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
224k
      block_rows = compptr->v_samp_factor;
482
224k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
224k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
459
      block_rows = compptr->v_samp_factor;
485
459
      access_rows = block_rows * 2; /* this and next iMCU row */
486
496
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
496
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
496
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
496
      access_rows = block_rows; /* this iMCU row only */
491
496
    }
492
    /* Align the virtual buffer for this component. */
493
225k
    if (cinfo->output_iMCU_row > 1) {
494
224k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
224k
      buffer = (*cinfo->mem->access_virt_barray)
496
224k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
224k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
224k
         (JDIMENSION)access_rows, FALSE);
499
224k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
224k
    } else if (cinfo->output_iMCU_row > 0) {
501
459
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
459
      buffer = (*cinfo->mem->access_virt_barray)
503
459
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
459
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
459
         (JDIMENSION)access_rows, FALSE);
506
459
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
496
    } else {
508
496
      buffer = (*cinfo->mem->access_virt_barray)
509
496
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
496
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
496
    }
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
225k
    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
225k
    else
520
225k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
225k
    change_dc =
524
225k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
177k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
156k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
225k
    quanttbl = compptr->quant_table;
529
225k
    Q00 = quanttbl->quantval[0];
530
225k
    Q01 = quanttbl->quantval[Q01_POS];
531
225k
    Q10 = quanttbl->quantval[Q10_POS];
532
225k
    Q20 = quanttbl->quantval[Q20_POS];
533
225k
    Q11 = quanttbl->quantval[Q11_POS];
534
225k
    Q02 = quanttbl->quantval[Q02_POS];
535
225k
    if (change_dc) {
536
141k
      Q03 = quanttbl->quantval[Q03_POS];
537
141k
      Q12 = quanttbl->quantval[Q12_POS];
538
141k
      Q21 = quanttbl->quantval[Q21_POS];
539
141k
      Q30 = quanttbl->quantval[Q30_POS];
540
141k
    }
541
225k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
225k
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
225k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
603k
    for (block_row = 0; block_row < block_rows; block_row++) {
546
378k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
378k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
378k
      if (image_block_row > 0)
550
378k
        prev_block_row =
551
378k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
496
      else
553
496
        prev_block_row = buffer_ptr;
554
555
378k
      if (image_block_row > 1)
556
377k
        prev_prev_block_row =
557
377k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
1.00k
      else
559
1.00k
        prev_prev_block_row = prev_block_row;
560
561
378k
      if (image_block_row < image_block_rows - 1)
562
378k
        next_block_row =
563
378k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
496
      else
565
496
        next_block_row = buffer_ptr;
566
567
378k
      if (image_block_row < image_block_rows - 2)
568
377k
        next_next_block_row =
569
377k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
869
      else
571
869
        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
378k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
378k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
378k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
378k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
378k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
378k
      output_col = 0;
582
378k
      last_block_column = compptr->width_in_blocks - 1;
583
378k
      for (block_num = cinfo->master->first_MCU_col[ci];
584
14.9M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
14.5M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
14.5M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
378k
            block_num < last_block_column) {
590
331k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
331k
          DC09 = DC10 = (int)prev_block_row[1][0];
592
331k
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
331k
          DC19 = DC20 = (int)next_block_row[1][0];
594
331k
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
331k
        }
596
14.5M
        if (block_num + 1 < last_block_column) {
597
13.8M
          DC05 = (int)prev_prev_block_row[2][0];
598
13.8M
          DC10 = (int)prev_block_row[2][0];
599
13.8M
          DC15 = (int)buffer_ptr[2][0];
600
13.8M
          DC20 = (int)next_block_row[2][0];
601
13.8M
          DC25 = (int)next_next_block_row[2][0];
602
13.8M
        }
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
14.5M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
14.3M
          num = Q00 * (change_dc ?
616
8.18M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
8.18M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
8.18M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
8.18M
                 DC21 - DC22 + DC24 + DC25) :
620
14.3M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
14.3M
          if (num >= 0) {
622
10.4M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
10.4M
            if (Al > 0 && pred >= (1 << Al))
624
709k
              pred = (1 << Al) - 1;
625
10.4M
          } else {
626
3.90M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
3.90M
            if (Al > 0 && pred >= (1 << Al))
628
779k
              pred = (1 << Al) - 1;
629
3.90M
            pred = -pred;
630
3.90M
          }
631
14.3M
          workspace[1] = (JCOEF)pred;
632
14.3M
        }
633
        /* AC10 */
634
14.5M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
14.0M
          num = Q00 * (change_dc ?
636
8.18M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
8.18M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
8.18M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
8.18M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
14.0M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
14.0M
          if (num >= 0) {
642
8.20M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
8.20M
            if (Al > 0 && pred >= (1 << Al))
644
1.72M
              pred = (1 << Al) - 1;
645
8.20M
          } else {
646
5.81M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
5.81M
            if (Al > 0 && pred >= (1 << Al))
648
1.63M
              pred = (1 << Al) - 1;
649
5.81M
            pred = -pred;
650
5.81M
          }
651
14.0M
          workspace[8] = (JCOEF)pred;
652
14.0M
        }
653
        /* AC20 */
654
14.5M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
14.0M
          num = Q00 * (change_dc ?
656
8.18M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
8.18M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
14.0M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
14.0M
          if (num >= 0) {
660
7.86M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
7.86M
            if (Al > 0 && pred >= (1 << Al))
662
1.12M
              pred = (1 << Al) - 1;
663
7.86M
          } else {
664
6.15M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
6.15M
            if (Al > 0 && pred >= (1 << Al))
666
1.13M
              pred = (1 << Al) - 1;
667
6.15M
            pred = -pred;
668
6.15M
          }
669
14.0M
          workspace[16] = (JCOEF)pred;
670
14.0M
        }
671
        /* AC11 */
672
14.5M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
14.2M
          num = Q00 * (change_dc ?
674
8.18M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
8.18M
                 9 * DC19 + DC21 - DC25) :
676
14.2M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
6.07M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
14.2M
          if (num >= 0) {
679
11.6M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
11.6M
            if (Al > 0 && pred >= (1 << Al))
681
370k
              pred = (1 << Al) - 1;
682
11.6M
          } else {
683
2.64M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
2.64M
            if (Al > 0 && pred >= (1 << Al))
685
347k
              pred = (1 << Al) - 1;
686
2.64M
            pred = -pred;
687
2.64M
          }
688
14.2M
          workspace[9] = (JCOEF)pred;
689
14.2M
        }
690
        /* AC02 */
691
14.5M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
14.3M
          num = Q00 * (change_dc ?
693
8.18M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
8.18M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
14.3M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
14.3M
          if (num >= 0) {
697
7.89M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
7.89M
            if (Al > 0 && pred >= (1 << Al))
699
812k
              pred = (1 << Al) - 1;
700
7.89M
          } else {
701
6.45M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
6.45M
            if (Al > 0 && pred >= (1 << Al))
703
820k
              pred = (1 << Al) - 1;
704
6.45M
            pred = -pred;
705
6.45M
          }
706
14.3M
          workspace[2] = (JCOEF)pred;
707
14.3M
        }
708
14.5M
        if (change_dc) {
709
          /* AC03 */
710
8.18M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
8.18M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
8.18M
            if (num >= 0) {
713
5.65M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
5.65M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
5.65M
            } else {
717
2.53M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
2.53M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
2.53M
              pred = -pred;
721
2.53M
            }
722
8.18M
            workspace[3] = (JCOEF)pred;
723
8.18M
          }
724
          /* AC12 */
725
8.18M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
8.18M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
8.18M
            if (num >= 0) {
728
4.53M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
4.53M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
4.53M
            } else {
732
3.65M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
3.65M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
3.65M
              pred = -pred;
736
3.65M
            }
737
8.18M
            workspace[10] = (JCOEF)pred;
738
8.18M
          }
739
          /* AC21 */
740
8.18M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
8.18M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
8.18M
            if (num >= 0) {
743
3.03M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
3.03M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
5.15M
            } else {
747
5.15M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
5.15M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
5.15M
              pred = -pred;
751
5.15M
            }
752
8.18M
            workspace[17] = (JCOEF)pred;
753
8.18M
          }
754
          /* AC30 */
755
8.18M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
8.18M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
8.18M
            if (num >= 0) {
758
4.66M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
4.66M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
4.66M
            } else {
762
3.52M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
3.52M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
3.52M
              pred = -pred;
766
3.52M
            }
767
8.18M
            workspace[24] = (JCOEF)pred;
768
8.18M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
8.18M
          num = Q00 *
773
8.18M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
8.18M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
8.18M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
8.18M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
8.18M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
8.18M
          if (num >= 0) {
779
4.04M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
4.13M
          } else {
781
4.13M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
4.13M
            pred = -pred;
783
4.13M
          }
784
8.18M
          workspace[0] = (JCOEF)pred;
785
8.18M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
14.5M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
14.5M
                        output_col);
790
        /* Advance for next column */
791
14.5M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
14.5M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
14.5M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
14.5M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
14.5M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
14.5M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
14.5M
          prev_prev_block_row++, next_next_block_row++;
798
14.5M
        output_col += compptr->_DCT_scaled_size;
799
14.5M
      }
800
378k
      output_ptr += compptr->_DCT_scaled_size;
801
378k
    }
802
225k
  }
803
804
215k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
215k
    return JPEG_ROW_COMPLETED;
806
434
  return JPEG_SCAN_COMPLETED;
807
215k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
430
215k
{
431
215k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
215k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
215k
  JDIMENSION block_num, last_block_column;
434
215k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
215k
    image_block_rows;
436
215k
  JBLOCKARRAY buffer;
437
215k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
215k
  JBLOCKROW next_block_row, next_next_block_row;
439
215k
  _JSAMPARRAY output_ptr;
440
215k
  JDIMENSION output_col;
441
215k
  jpeg_component_info *compptr;
442
215k
  _inverse_DCT_method_ptr inverse_DCT;
443
215k
  boolean change_dc;
444
215k
  JCOEF *workspace;
445
215k
  int *coef_bits;
446
215k
  JQUANT_TBL *quanttbl;
447
215k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
215k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
215k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
215k
      DC25;
451
215k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
215k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
215k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
215k
         !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
440k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
225k
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
225k
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
225k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
224k
      block_rows = compptr->v_samp_factor;
482
224k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
224k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
459
      block_rows = compptr->v_samp_factor;
485
459
      access_rows = block_rows * 2; /* this and next iMCU row */
486
496
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
496
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
496
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
496
      access_rows = block_rows; /* this iMCU row only */
491
496
    }
492
    /* Align the virtual buffer for this component. */
493
225k
    if (cinfo->output_iMCU_row > 1) {
494
224k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
224k
      buffer = (*cinfo->mem->access_virt_barray)
496
224k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
224k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
224k
         (JDIMENSION)access_rows, FALSE);
499
224k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
224k
    } else if (cinfo->output_iMCU_row > 0) {
501
459
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
459
      buffer = (*cinfo->mem->access_virt_barray)
503
459
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
459
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
459
         (JDIMENSION)access_rows, FALSE);
506
459
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
496
    } else {
508
496
      buffer = (*cinfo->mem->access_virt_barray)
509
496
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
496
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
496
    }
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
225k
    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
225k
    else
520
225k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
225k
    change_dc =
524
225k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
177k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
156k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
225k
    quanttbl = compptr->quant_table;
529
225k
    Q00 = quanttbl->quantval[0];
530
225k
    Q01 = quanttbl->quantval[Q01_POS];
531
225k
    Q10 = quanttbl->quantval[Q10_POS];
532
225k
    Q20 = quanttbl->quantval[Q20_POS];
533
225k
    Q11 = quanttbl->quantval[Q11_POS];
534
225k
    Q02 = quanttbl->quantval[Q02_POS];
535
225k
    if (change_dc) {
536
141k
      Q03 = quanttbl->quantval[Q03_POS];
537
141k
      Q12 = quanttbl->quantval[Q12_POS];
538
141k
      Q21 = quanttbl->quantval[Q21_POS];
539
141k
      Q30 = quanttbl->quantval[Q30_POS];
540
141k
    }
541
225k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
225k
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
225k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
603k
    for (block_row = 0; block_row < block_rows; block_row++) {
546
378k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
378k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
378k
      if (image_block_row > 0)
550
378k
        prev_block_row =
551
378k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
496
      else
553
496
        prev_block_row = buffer_ptr;
554
555
378k
      if (image_block_row > 1)
556
377k
        prev_prev_block_row =
557
377k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
1.00k
      else
559
1.00k
        prev_prev_block_row = prev_block_row;
560
561
378k
      if (image_block_row < image_block_rows - 1)
562
378k
        next_block_row =
563
378k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
496
      else
565
496
        next_block_row = buffer_ptr;
566
567
378k
      if (image_block_row < image_block_rows - 2)
568
377k
        next_next_block_row =
569
377k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
869
      else
571
869
        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
378k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
378k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
378k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
378k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
378k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
378k
      output_col = 0;
582
378k
      last_block_column = compptr->width_in_blocks - 1;
583
378k
      for (block_num = cinfo->master->first_MCU_col[ci];
584
14.9M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
14.5M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
14.5M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
378k
            block_num < last_block_column) {
590
331k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
331k
          DC09 = DC10 = (int)prev_block_row[1][0];
592
331k
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
331k
          DC19 = DC20 = (int)next_block_row[1][0];
594
331k
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
331k
        }
596
14.5M
        if (block_num + 1 < last_block_column) {
597
13.8M
          DC05 = (int)prev_prev_block_row[2][0];
598
13.8M
          DC10 = (int)prev_block_row[2][0];
599
13.8M
          DC15 = (int)buffer_ptr[2][0];
600
13.8M
          DC20 = (int)next_block_row[2][0];
601
13.8M
          DC25 = (int)next_next_block_row[2][0];
602
13.8M
        }
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
14.5M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
14.3M
          num = Q00 * (change_dc ?
616
8.18M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
8.18M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
8.18M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
8.18M
                 DC21 - DC22 + DC24 + DC25) :
620
14.3M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
14.3M
          if (num >= 0) {
622
10.4M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
10.4M
            if (Al > 0 && pred >= (1 << Al))
624
709k
              pred = (1 << Al) - 1;
625
10.4M
          } else {
626
3.90M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
3.90M
            if (Al > 0 && pred >= (1 << Al))
628
779k
              pred = (1 << Al) - 1;
629
3.90M
            pred = -pred;
630
3.90M
          }
631
14.3M
          workspace[1] = (JCOEF)pred;
632
14.3M
        }
633
        /* AC10 */
634
14.5M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
14.0M
          num = Q00 * (change_dc ?
636
8.18M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
8.18M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
8.18M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
8.18M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
14.0M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
14.0M
          if (num >= 0) {
642
8.20M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
8.20M
            if (Al > 0 && pred >= (1 << Al))
644
1.72M
              pred = (1 << Al) - 1;
645
8.20M
          } else {
646
5.81M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
5.81M
            if (Al > 0 && pred >= (1 << Al))
648
1.63M
              pred = (1 << Al) - 1;
649
5.81M
            pred = -pred;
650
5.81M
          }
651
14.0M
          workspace[8] = (JCOEF)pred;
652
14.0M
        }
653
        /* AC20 */
654
14.5M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
14.0M
          num = Q00 * (change_dc ?
656
8.18M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
8.18M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
14.0M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
14.0M
          if (num >= 0) {
660
7.86M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
7.86M
            if (Al > 0 && pred >= (1 << Al))
662
1.12M
              pred = (1 << Al) - 1;
663
7.86M
          } else {
664
6.15M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
6.15M
            if (Al > 0 && pred >= (1 << Al))
666
1.13M
              pred = (1 << Al) - 1;
667
6.15M
            pred = -pred;
668
6.15M
          }
669
14.0M
          workspace[16] = (JCOEF)pred;
670
14.0M
        }
671
        /* AC11 */
672
14.5M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
14.2M
          num = Q00 * (change_dc ?
674
8.18M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
8.18M
                 9 * DC19 + DC21 - DC25) :
676
14.2M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
6.07M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
14.2M
          if (num >= 0) {
679
11.6M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
11.6M
            if (Al > 0 && pred >= (1 << Al))
681
370k
              pred = (1 << Al) - 1;
682
11.6M
          } else {
683
2.64M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
2.64M
            if (Al > 0 && pred >= (1 << Al))
685
347k
              pred = (1 << Al) - 1;
686
2.64M
            pred = -pred;
687
2.64M
          }
688
14.2M
          workspace[9] = (JCOEF)pred;
689
14.2M
        }
690
        /* AC02 */
691
14.5M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
14.3M
          num = Q00 * (change_dc ?
693
8.18M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
8.18M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
14.3M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
14.3M
          if (num >= 0) {
697
7.89M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
7.89M
            if (Al > 0 && pred >= (1 << Al))
699
812k
              pred = (1 << Al) - 1;
700
7.89M
          } else {
701
6.45M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
6.45M
            if (Al > 0 && pred >= (1 << Al))
703
820k
              pred = (1 << Al) - 1;
704
6.45M
            pred = -pred;
705
6.45M
          }
706
14.3M
          workspace[2] = (JCOEF)pred;
707
14.3M
        }
708
14.5M
        if (change_dc) {
709
          /* AC03 */
710
8.18M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
8.18M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
8.18M
            if (num >= 0) {
713
5.65M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
5.65M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
5.65M
            } else {
717
2.53M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
2.53M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
2.53M
              pred = -pred;
721
2.53M
            }
722
8.18M
            workspace[3] = (JCOEF)pred;
723
8.18M
          }
724
          /* AC12 */
725
8.18M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
8.18M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
8.18M
            if (num >= 0) {
728
4.53M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
4.53M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
4.53M
            } else {
732
3.65M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
3.65M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
3.65M
              pred = -pred;
736
3.65M
            }
737
8.18M
            workspace[10] = (JCOEF)pred;
738
8.18M
          }
739
          /* AC21 */
740
8.18M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
8.18M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
8.18M
            if (num >= 0) {
743
3.03M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
3.03M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
5.15M
            } else {
747
5.15M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
5.15M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
5.15M
              pred = -pred;
751
5.15M
            }
752
8.18M
            workspace[17] = (JCOEF)pred;
753
8.18M
          }
754
          /* AC30 */
755
8.18M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
8.18M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
8.18M
            if (num >= 0) {
758
4.66M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
4.66M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
4.66M
            } else {
762
3.52M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
3.52M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
3.52M
              pred = -pred;
766
3.52M
            }
767
8.18M
            workspace[24] = (JCOEF)pred;
768
8.18M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
8.18M
          num = Q00 *
773
8.18M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
8.18M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
8.18M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
8.18M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
8.18M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
8.18M
          if (num >= 0) {
779
4.04M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
4.13M
          } else {
781
4.13M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
4.13M
            pred = -pred;
783
4.13M
          }
784
8.18M
          workspace[0] = (JCOEF)pred;
785
8.18M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
14.5M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
14.5M
                        output_col);
790
        /* Advance for next column */
791
14.5M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
14.5M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
14.5M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
14.5M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
14.5M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
14.5M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
14.5M
          prev_prev_block_row++, next_next_block_row++;
798
14.5M
        output_col += compptr->_DCT_scaled_size;
799
14.5M
      }
800
378k
      output_ptr += compptr->_DCT_scaled_size;
801
378k
    }
802
225k
  }
803
804
215k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
215k
    return JPEG_ROW_COMPLETED;
806
434
  return JPEG_SCAN_COMPLETED;
807
215k
}
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
3.05k
{
819
3.05k
  my_coef_ptr coef;
820
821
3.05k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
3.05k
  coef = (my_coef_ptr)
825
3.05k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
3.05k
                                sizeof(my_coef_controller));
827
3.05k
  memset(coef, 0, sizeof(my_coef_controller));
828
3.05k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
3.05k
  coef->pub.start_input_pass = start_input_pass;
830
3.05k
  coef->pub.start_output_pass = start_output_pass;
831
3.05k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
3.05k
  coef->coef_bits_latch = NULL;
833
3.05k
#endif
834
835
  /* Create the coefficient buffer. */
836
3.05k
  if (need_full_buffer) {
837
2.10k
#ifdef D_MULTISCAN_FILES_SUPPORTED
838
    /* Allocate a full-image virtual array for each component, */
839
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
840
    /* Note we ask for a pre-zeroed array. */
841
2.10k
    int ci, access_rows;
842
2.10k
    jpeg_component_info *compptr;
843
844
5.98k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
3.87k
         ci++, compptr++) {
846
3.87k
      access_rows = compptr->v_samp_factor;
847
3.87k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
3.87k
      if (cinfo->progressive_mode)
850
3.12k
        access_rows *= 5;
851
3.87k
#endif
852
3.87k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
3.87k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
3.87k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
3.87k
                               (long)compptr->h_samp_factor),
856
3.87k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
3.87k
                               (long)compptr->v_samp_factor),
858
3.87k
         (JDIMENSION)access_rows);
859
3.87k
    }
860
2.10k
    coef->pub.consume_data = consume_data;
861
2.10k
    coef->pub._decompress_data = decompress_data;
862
2.10k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
2.10k
  } else {
867
    /* We only need a single-MCU buffer. */
868
946
    JBLOCKROW buffer;
869
946
    int i;
870
871
946
    buffer = (JBLOCKROW)
872
946
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
946
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
10.4k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
9.46k
      coef->MCU_buffer[i] = buffer + i;
876
9.46k
    }
877
946
    coef->pub.consume_data = dummy_consume_data;
878
946
    coef->pub._decompress_data = decompress_onepass;
879
946
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
946
  }
881
882
  /* Allocate the workspace buffer */
883
3.05k
  coef->workspace = (JCOEF *)
884
3.05k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
3.05k
                                sizeof(JCOEF) * DCTSIZE2);
886
3.05k
}
jinit_d_coef_controller
Line
Count
Source
818
2.68k
{
819
2.68k
  my_coef_ptr coef;
820
821
2.68k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
2.68k
  coef = (my_coef_ptr)
825
2.68k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
2.68k
                                sizeof(my_coef_controller));
827
2.68k
  memset(coef, 0, sizeof(my_coef_controller));
828
2.68k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
2.68k
  coef->pub.start_input_pass = start_input_pass;
830
2.68k
  coef->pub.start_output_pass = start_output_pass;
831
2.68k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
2.68k
  coef->coef_bits_latch = NULL;
833
2.68k
#endif
834
835
  /* Create the coefficient buffer. */
836
2.68k
  if (need_full_buffer) {
837
1.74k
#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
1.74k
    int ci, access_rows;
842
1.74k
    jpeg_component_info *compptr;
843
844
4.86k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
3.12k
         ci++, compptr++) {
846
3.12k
      access_rows = compptr->v_samp_factor;
847
3.12k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
3.12k
      if (cinfo->progressive_mode)
850
2.50k
        access_rows *= 5;
851
3.12k
#endif
852
3.12k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
3.12k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
3.12k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
3.12k
                               (long)compptr->h_samp_factor),
856
3.12k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
3.12k
                               (long)compptr->v_samp_factor),
858
3.12k
         (JDIMENSION)access_rows);
859
3.12k
    }
860
1.74k
    coef->pub.consume_data = consume_data;
861
1.74k
    coef->pub._decompress_data = decompress_data;
862
1.74k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
1.74k
  } else {
867
    /* We only need a single-MCU buffer. */
868
939
    JBLOCKROW buffer;
869
939
    int i;
870
871
939
    buffer = (JBLOCKROW)
872
939
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
939
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
10.3k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
9.39k
      coef->MCU_buffer[i] = buffer + i;
876
9.39k
    }
877
939
    coef->pub.consume_data = dummy_consume_data;
878
939
    coef->pub._decompress_data = decompress_onepass;
879
939
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
939
  }
881
882
  /* Allocate the workspace buffer */
883
2.68k
  coef->workspace = (JCOEF *)
884
2.68k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
2.68k
                                sizeof(JCOEF) * DCTSIZE2);
886
2.68k
}
j12init_d_coef_controller
Line
Count
Source
818
367
{
819
367
  my_coef_ptr coef;
820
821
367
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
367
  coef = (my_coef_ptr)
825
367
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
367
                                sizeof(my_coef_controller));
827
367
  memset(coef, 0, sizeof(my_coef_controller));
828
367
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
367
  coef->pub.start_input_pass = start_input_pass;
830
367
  coef->pub.start_output_pass = start_output_pass;
831
367
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
367
  coef->coef_bits_latch = NULL;
833
367
#endif
834
835
  /* Create the coefficient buffer. */
836
367
  if (need_full_buffer) {
837
360
#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
360
    int ci, access_rows;
842
360
    jpeg_component_info *compptr;
843
844
1.11k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
752
         ci++, compptr++) {
846
752
      access_rows = compptr->v_samp_factor;
847
752
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
752
      if (cinfo->progressive_mode)
850
623
        access_rows *= 5;
851
752
#endif
852
752
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
752
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
752
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
752
                               (long)compptr->h_samp_factor),
856
752
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
752
                               (long)compptr->v_samp_factor),
858
752
         (JDIMENSION)access_rows);
859
752
    }
860
360
    coef->pub.consume_data = consume_data;
861
360
    coef->pub._decompress_data = decompress_data;
862
360
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
360
  } else {
867
    /* We only need a single-MCU buffer. */
868
7
    JBLOCKROW buffer;
869
7
    int i;
870
871
7
    buffer = (JBLOCKROW)
872
7
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
7
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
77
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
70
      coef->MCU_buffer[i] = buffer + i;
876
70
    }
877
7
    coef->pub.consume_data = dummy_consume_data;
878
7
    coef->pub._decompress_data = decompress_onepass;
879
7
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
7
  }
881
882
  /* Allocate the workspace buffer */
883
367
  coef->workspace = (JCOEF *)
884
367
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
367
                                sizeof(JCOEF) * DCTSIZE2);
886
367
}