Coverage Report

Created: 2025-07-11 07:01

/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
10.2k
{
48
10.2k
  cinfo->input_iMCU_row = 0;
49
10.2k
  start_iMCU_row(cinfo);
50
10.2k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
47
9.84k
{
48
9.84k
  cinfo->input_iMCU_row = 0;
49
9.84k
  start_iMCU_row(cinfo);
50
9.84k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
47
434
{
48
434
  cinfo->input_iMCU_row = 0;
49
434
  start_iMCU_row(cinfo);
50
434
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
3.29k
{
60
3.29k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
3.29k
  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
3.29k
  if (coef->pub.coef_arrays != NULL) {
65
1.68k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
947
      coef->pub._decompress_data = decompress_smooth_data;
67
741
    else
68
741
      coef->pub._decompress_data = decompress_data;
69
1.68k
  }
70
3.29k
#endif
71
3.29k
  cinfo->output_iMCU_row = 0;
72
3.29k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
59
3.19k
{
60
3.19k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
3.19k
  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
3.19k
  if (coef->pub.coef_arrays != NULL) {
65
1.59k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
928
      coef->pub._decompress_data = decompress_smooth_data;
67
668
    else
68
668
      coef->pub._decompress_data = decompress_data;
69
1.59k
  }
70
3.19k
#endif
71
3.19k
  cinfo->output_iMCU_row = 0;
72
3.19k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
59
99
{
60
99
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
99
  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
99
  if (coef->pub.coef_arrays != NULL) {
65
92
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
19
      coef->pub._decompress_data = decompress_smooth_data;
67
73
    else
68
73
      coef->pub._decompress_data = decompress_data;
69
92
  }
70
99
#endif
71
99
  cinfo->output_iMCU_row = 0;
72
99
}
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
29.7k
{
88
29.7k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
29.7k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
29.7k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
29.7k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
29.7k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
29.7k
  _JSAMPARRAY output_ptr;
94
29.7k
  JDIMENSION start_col, output_col;
95
29.7k
  jpeg_component_info *compptr;
96
29.7k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
61.8k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
32.0k
       yoffset++) {
101
6.41M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
6.37M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
6.37M
      jzero_far((void *)coef->MCU_buffer[0],
105
6.37M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
6.37M
      if (!cinfo->entropy->insufficient_data)
107
6.37M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
6.37M
      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
6.37M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
6.37M
          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
6.37M
        blkn = 0;               /* index of current DCT block within MCU */
126
30.5M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
24.1M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
24.1M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
24.1M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
24.1M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
24.0M
                         compptr->MCU_width : compptr->last_col_width;
136
24.1M
          output_ptr = output_buf[compptr->component_index] +
137
24.1M
                       yoffset * compptr->_DCT_scaled_size;
138
24.1M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
24.1M
                      compptr->MCU_sample_width;
140
48.4M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
24.3M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
24.3M
                yoffset + yindex < compptr->last_row_height) {
143
24.2M
              output_col = start_col;
144
48.7M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
24.5M
                (*inverse_DCT) (cinfo, compptr,
146
24.5M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
24.5M
                                output_ptr, output_col);
148
24.5M
                output_col += compptr->_DCT_scaled_size;
149
24.5M
              }
150
24.2M
            }
151
24.3M
            blkn += compptr->MCU_width;
152
24.3M
            output_ptr += compptr->_DCT_scaled_size;
153
24.3M
          }
154
24.1M
        }
155
6.37M
      }
156
6.37M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
32.0k
    coef->MCU_ctr = 0;
159
32.0k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
29.7k
  cinfo->output_iMCU_row++;
162
29.7k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
28.1k
    start_iMCU_row(cinfo);
164
28.1k
    return JPEG_ROW_COMPLETED;
165
28.1k
  }
166
  /* Completed the scan */
167
1.59k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
1.59k
  return JPEG_SCAN_COMPLETED;
169
29.7k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
87
29.7k
{
88
29.7k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
29.7k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
29.7k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
29.7k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
29.7k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
29.7k
  _JSAMPARRAY output_ptr;
94
29.7k
  JDIMENSION start_col, output_col;
95
29.7k
  jpeg_component_info *compptr;
96
29.7k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
61.8k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
32.0k
       yoffset++) {
101
6.41M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
6.37M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
6.37M
      jzero_far((void *)coef->MCU_buffer[0],
105
6.37M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
6.37M
      if (!cinfo->entropy->insufficient_data)
107
6.37M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
6.37M
      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
6.37M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
6.37M
          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
6.37M
        blkn = 0;               /* index of current DCT block within MCU */
126
30.5M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
24.1M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
24.1M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
24.1M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
24.1M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
24.0M
                         compptr->MCU_width : compptr->last_col_width;
136
24.1M
          output_ptr = output_buf[compptr->component_index] +
137
24.1M
                       yoffset * compptr->_DCT_scaled_size;
138
24.1M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
24.1M
                      compptr->MCU_sample_width;
140
48.4M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
24.3M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
24.3M
                yoffset + yindex < compptr->last_row_height) {
143
24.2M
              output_col = start_col;
144
48.7M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
24.5M
                (*inverse_DCT) (cinfo, compptr,
146
24.5M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
24.5M
                                output_ptr, output_col);
148
24.5M
                output_col += compptr->_DCT_scaled_size;
149
24.5M
              }
150
24.2M
            }
151
24.3M
            blkn += compptr->MCU_width;
152
24.3M
            output_ptr += compptr->_DCT_scaled_size;
153
24.3M
          }
154
24.1M
        }
155
6.37M
      }
156
6.37M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
32.0k
    coef->MCU_ctr = 0;
159
32.0k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
29.7k
  cinfo->output_iMCU_row++;
162
29.7k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
28.1k
    start_iMCU_row(cinfo);
164
28.1k
    return JPEG_ROW_COMPLETED;
165
28.1k
  }
166
  /* Completed the scan */
167
1.59k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
1.59k
  return JPEG_SCAN_COMPLETED;
169
29.7k
}
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.35M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
1.74M
    compptr = cinfo->cur_comp_info[ci];
206
1.74M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
1.74M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
1.74M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
1.74M
       (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.74M
  }
215
216
  /* Loop to process one whole iMCU row */
217
4.77M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
3.15M
       yoffset++) {
219
25.0M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
21.8M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
21.8M
      blkn = 0;                 /* index of current DCT block within MCU */
223
49.5M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
27.7M
        compptr = cinfo->cur_comp_info[ci];
225
27.7M
        start_col = MCU_col_num * compptr->MCU_width;
226
59.2M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
31.5M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
64.4M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
32.9M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
32.9M
          }
231
31.5M
        }
232
27.7M
      }
233
21.8M
      if (!cinfo->entropy->insufficient_data)
234
21.8M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
21.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
21.8M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
3.15M
    coef->MCU_ctr = 0;
245
3.15M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
1.61M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
1.60M
    start_iMCU_row(cinfo);
249
1.60M
    return JPEG_ROW_COMPLETED;
250
1.60M
  }
251
  /* Completed the scan */
252
8.67k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
8.67k
  return JPEG_SCAN_COMPLETED;
254
1.61M
}
jdcoefct-8.c:consume_data
Line
Count
Source
194
1.52M
{
195
1.52M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
1.52M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
1.52M
  int blkn, ci, xindex, yindex, yoffset;
198
1.52M
  JDIMENSION start_col;
199
1.52M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
1.52M
  JBLOCKROW buffer_ptr;
201
1.52M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
3.15M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
1.63M
    compptr = cinfo->cur_comp_info[ci];
206
1.63M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
1.63M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
1.63M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
1.63M
       (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.63M
  }
215
216
  /* Loop to process one whole iMCU row */
217
4.48M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
2.96M
       yoffset++) {
219
23.8M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
20.8M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
20.8M
      blkn = 0;                 /* index of current DCT block within MCU */
223
47.6M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
26.7M
        compptr = cinfo->cur_comp_info[ci];
225
26.7M
        start_col = MCU_col_num * compptr->MCU_width;
226
57.2M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
30.5M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
62.3M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
31.8M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
31.8M
          }
231
30.5M
        }
232
26.7M
      }
233
20.8M
      if (!cinfo->entropy->insufficient_data)
234
20.8M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
20.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
20.8M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
2.96M
    coef->MCU_ctr = 0;
245
2.96M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
1.52M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
1.51M
    start_iMCU_row(cinfo);
249
1.51M
    return JPEG_ROW_COMPLETED;
250
1.51M
  }
251
  /* Completed the scan */
252
8.24k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
8.24k
  return JPEG_SCAN_COMPLETED;
254
1.52M
}
jdcoefct-12.c:consume_data
Line
Count
Source
194
95.5k
{
195
95.5k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
95.5k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
95.5k
  int blkn, ci, xindex, yindex, yoffset;
198
95.5k
  JDIMENSION start_col;
199
95.5k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
95.5k
  JBLOCKROW buffer_ptr;
201
95.5k
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
203k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
108k
    compptr = cinfo->cur_comp_info[ci];
206
108k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
108k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
108k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
108k
       (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
108k
  }
215
216
  /* Loop to process one whole iMCU row */
217
284k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
189k
       yoffset++) {
219
1.15M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
961k
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
961k
      blkn = 0;                 /* index of current DCT block within MCU */
223
1.97M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
1.01M
        compptr = cinfo->cur_comp_info[ci];
225
1.01M
        start_col = MCU_col_num * compptr->MCU_width;
226
2.04M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
1.03M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
2.08M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
1.05M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
1.05M
          }
231
1.03M
        }
232
1.01M
      }
233
961k
      if (!cinfo->entropy->insufficient_data)
234
961k
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
961k
      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
961k
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
189k
    coef->MCU_ctr = 0;
245
189k
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
95.5k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
95.0k
    start_iMCU_row(cinfo);
249
95.0k
    return JPEG_ROW_COMPLETED;
250
95.0k
  }
251
  /* Completed the scan */
252
427
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
427
  return JPEG_SCAN_COMPLETED;
254
95.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
73.7k
{
268
73.7k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
73.7k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
73.7k
  JDIMENSION block_num;
271
73.7k
  int ci, block_row, block_rows;
272
73.7k
  JBLOCKARRAY buffer;
273
73.7k
  JBLOCKROW buffer_ptr;
274
73.7k
  _JSAMPARRAY output_ptr;
275
73.7k
  JDIMENSION output_col;
276
73.7k
  jpeg_component_info *compptr;
277
73.7k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
73.7k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
73.7k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
73.7k
          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
197k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
124k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
124k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
124k
    buffer = (*cinfo->mem->access_virt_barray)
295
124k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
124k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
124k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
124k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
122k
      block_rows = compptr->v_samp_factor;
301
1.92k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
1.92k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
1.92k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
1.92k
    }
306
124k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
124k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
339k
    for (block_row = 0; block_row < block_rows; block_row++) {
310
215k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
215k
      output_col = 0;
312
215k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
2.83M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
2.62M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
2.62M
                        output_col);
316
2.62M
        buffer_ptr++;
317
2.62M
        output_col += compptr->_DCT_scaled_size;
318
2.62M
      }
319
215k
      output_ptr += compptr->_DCT_scaled_size;
320
215k
    }
321
124k
  }
322
323
73.7k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
73.0k
    return JPEG_ROW_COMPLETED;
325
668
  return JPEG_SCAN_COMPLETED;
326
73.7k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
267
73.7k
{
268
73.7k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
73.7k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
73.7k
  JDIMENSION block_num;
271
73.7k
  int ci, block_row, block_rows;
272
73.7k
  JBLOCKARRAY buffer;
273
73.7k
  JBLOCKROW buffer_ptr;
274
73.7k
  _JSAMPARRAY output_ptr;
275
73.7k
  JDIMENSION output_col;
276
73.7k
  jpeg_component_info *compptr;
277
73.7k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
73.7k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
73.7k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
73.7k
          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
197k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
124k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
124k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
124k
    buffer = (*cinfo->mem->access_virt_barray)
295
124k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
124k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
124k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
124k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
122k
      block_rows = compptr->v_samp_factor;
301
1.92k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
1.92k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
1.92k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
1.92k
    }
306
124k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
124k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
339k
    for (block_row = 0; block_row < block_rows; block_row++) {
310
215k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
215k
      output_col = 0;
312
215k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
2.83M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
2.62M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
2.62M
                        output_col);
316
2.62M
        buffer_ptr++;
317
2.62M
        output_col += compptr->_DCT_scaled_size;
318
2.62M
      }
319
215k
      output_ptr += compptr->_DCT_scaled_size;
320
215k
    }
321
124k
  }
322
323
73.7k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
73.0k
    return JPEG_ROW_COMPLETED;
325
668
  return JPEG_SCAN_COMPLETED;
326
73.7k
}
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
692k
#define Q01_POS  1
342
692k
#define Q10_POS  8
343
692k
#define Q20_POS  16
344
692k
#define Q11_POS  9
345
692k
#define Q02_POS  2
346
282k
#define Q03_POS  3
347
282k
#define Q12_POS  10
348
282k
#define Q21_POS  17
349
282k
#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
1.68k
{
362
1.68k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
1.68k
  boolean smoothing_useful = FALSE;
364
1.68k
  int ci, coefi;
365
1.68k
  jpeg_component_info *compptr;
366
1.68k
  JQUANT_TBL *qtable;
367
1.68k
  int *coef_bits, *prev_coef_bits;
368
1.68k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
1.68k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
19
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
1.66k
  if (coef->coef_bits_latch == NULL)
375
1.66k
    coef->coef_bits_latch = (int *)
376
1.66k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
1.66k
                                  cinfo->num_components * 2 *
378
1.66k
                                  (SAVED_COEFS * sizeof(int)));
379
1.66k
  coef_bits_latch = coef->coef_bits_latch;
380
1.66k
  prev_coef_bits_latch =
381
1.66k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
4.58k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
3.17k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
3.17k
    if ((qtable = compptr->quant_table) == NULL)
387
30
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
3.14k
    if (qtable->quantval[0] == 0 ||
390
3.14k
        qtable->quantval[Q01_POS] == 0 ||
391
3.14k
        qtable->quantval[Q10_POS] == 0 ||
392
3.14k
        qtable->quantval[Q20_POS] == 0 ||
393
3.14k
        qtable->quantval[Q11_POS] == 0 ||
394
3.14k
        qtable->quantval[Q02_POS] == 0 ||
395
3.14k
        qtable->quantval[Q03_POS] == 0 ||
396
3.14k
        qtable->quantval[Q12_POS] == 0 ||
397
3.14k
        qtable->quantval[Q21_POS] == 0 ||
398
3.14k
        qtable->quantval[Q30_POS] == 0)
399
230
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
2.91k
    coef_bits = cinfo->coef_bits[ci];
402
2.91k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
2.91k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
2.91k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
29.1k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
26.2k
      if (cinfo->input_scan_number > 1)
409
16.4k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
9.80k
      else
411
9.80k
        prev_coef_bits_latch[coefi] = -1;
412
26.2k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
26.2k
      if (coef_bits[coefi] != 0)
414
14.1k
        smoothing_useful = TRUE;
415
26.2k
    }
416
2.91k
    coef_bits_latch += SAVED_COEFS;
417
2.91k
    prev_coef_bits_latch += SAVED_COEFS;
418
2.91k
  }
419
420
1.40k
  return smoothing_useful;
421
1.66k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
361
1.59k
{
362
1.59k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
1.59k
  boolean smoothing_useful = FALSE;
364
1.59k
  int ci, coefi;
365
1.59k
  jpeg_component_info *compptr;
366
1.59k
  JQUANT_TBL *qtable;
367
1.59k
  int *coef_bits, *prev_coef_bits;
368
1.59k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
1.59k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
10
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
1.58k
  if (coef->coef_bits_latch == NULL)
375
1.58k
    coef->coef_bits_latch = (int *)
376
1.58k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
1.58k
                                  cinfo->num_components * 2 *
378
1.58k
                                  (SAVED_COEFS * sizeof(int)));
379
1.58k
  coef_bits_latch = coef->coef_bits_latch;
380
1.58k
  prev_coef_bits_latch =
381
1.58k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
4.45k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
3.06k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
3.06k
    if ((qtable = compptr->quant_table) == NULL)
387
29
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
3.03k
    if (qtable->quantval[0] == 0 ||
390
3.03k
        qtable->quantval[Q01_POS] == 0 ||
391
3.03k
        qtable->quantval[Q10_POS] == 0 ||
392
3.03k
        qtable->quantval[Q20_POS] == 0 ||
393
3.03k
        qtable->quantval[Q11_POS] == 0 ||
394
3.03k
        qtable->quantval[Q02_POS] == 0 ||
395
3.03k
        qtable->quantval[Q03_POS] == 0 ||
396
3.03k
        qtable->quantval[Q12_POS] == 0 ||
397
3.03k
        qtable->quantval[Q21_POS] == 0 ||
398
3.03k
        qtable->quantval[Q30_POS] == 0)
399
168
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
2.86k
    coef_bits = cinfo->coef_bits[ci];
402
2.86k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
2.86k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
2.86k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
28.6k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
25.7k
      if (cinfo->input_scan_number > 1)
409
16.2k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
9.54k
      else
411
9.54k
        prev_coef_bits_latch[coefi] = -1;
412
25.7k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
25.7k
      if (coef_bits[coefi] != 0)
414
13.7k
        smoothing_useful = TRUE;
415
25.7k
    }
416
2.86k
    coef_bits_latch += SAVED_COEFS;
417
2.86k
    prev_coef_bits_latch += SAVED_COEFS;
418
2.86k
  }
419
420
1.38k
  return smoothing_useful;
421
1.58k
}
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
9
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
83
  if (coef->coef_bits_latch == NULL)
375
83
    coef->coef_bits_latch = (int *)
376
83
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
83
                                  cinfo->num_components * 2 *
378
83
                                  (SAVED_COEFS * sizeof(int)));
379
83
  coef_bits_latch = coef->coef_bits_latch;
380
83
  prev_coef_bits_latch =
381
83
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
134
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
114
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
114
    if ((qtable = compptr->quant_table) == NULL)
387
1
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
113
    if (qtable->quantval[0] == 0 ||
390
113
        qtable->quantval[Q01_POS] == 0 ||
391
113
        qtable->quantval[Q10_POS] == 0 ||
392
113
        qtable->quantval[Q20_POS] == 0 ||
393
113
        qtable->quantval[Q11_POS] == 0 ||
394
113
        qtable->quantval[Q02_POS] == 0 ||
395
113
        qtable->quantval[Q03_POS] == 0 ||
396
113
        qtable->quantval[Q12_POS] == 0 ||
397
113
        qtable->quantval[Q21_POS] == 0 ||
398
113
        qtable->quantval[Q30_POS] == 0)
399
62
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
51
    coef_bits = cinfo->coef_bits[ci];
402
51
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
51
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
51
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
510
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
459
      if (cinfo->input_scan_number > 1)
409
198
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
261
      else
411
261
        prev_coef_bits_latch[coefi] = -1;
412
459
      coef_bits_latch[coefi] = coef_bits[coefi];
413
459
      if (coef_bits[coefi] != 0)
414
442
        smoothing_useful = TRUE;
415
459
    }
416
51
    coef_bits_latch += SAVED_COEFS;
417
51
    prev_coef_bits_latch += SAVED_COEFS;
418
51
  }
419
420
20
  return smoothing_useful;
421
83
}
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
657k
{
431
657k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
657k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
657k
  JDIMENSION block_num, last_block_column;
434
657k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
657k
    image_block_rows;
436
657k
  JBLOCKARRAY buffer;
437
657k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
657k
  JBLOCKROW next_block_row, next_next_block_row;
439
657k
  _JSAMPARRAY output_ptr;
440
657k
  JDIMENSION output_col;
441
657k
  jpeg_component_info *compptr;
442
657k
  _inverse_DCT_method_ptr inverse_DCT;
443
657k
  boolean change_dc;
444
657k
  JCOEF *workspace;
445
657k
  int *coef_bits;
446
657k
  JQUANT_TBL *quanttbl;
447
657k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
657k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
657k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
657k
      DC25;
451
657k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
657k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
657k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
657k
         !cinfo->inputctl->eoi_reached) {
459
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
460
      /* If input is working on current scan, we ordinarily want it to
461
       * have completed the current row.  But if input scan is DC,
462
       * we want it to keep two rows ahead so that next two block rows' DC
463
       * values are up to date.
464
       */
465
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
466
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
467
0
        break;
468
0
    }
469
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
470
0
      return JPEG_SUSPENDED;
471
0
  }
472
473
  /* OK, output from the virtual arrays. */
474
1.34M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
689k
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
689k
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
689k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
686k
      block_rows = compptr->v_samp_factor;
482
686k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
686k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
1.36k
      block_rows = compptr->v_samp_factor;
485
1.36k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
1.53k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
1.53k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
1.53k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
1.53k
      access_rows = block_rows; /* this iMCU row only */
491
1.53k
    }
492
    /* Align the virtual buffer for this component. */
493
689k
    if (cinfo->output_iMCU_row > 1) {
494
686k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
686k
      buffer = (*cinfo->mem->access_virt_barray)
496
686k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
686k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
686k
         (JDIMENSION)access_rows, FALSE);
499
686k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
686k
    } else if (cinfo->output_iMCU_row > 0) {
501
1.36k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
1.36k
      buffer = (*cinfo->mem->access_virt_barray)
503
1.36k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
1.36k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
1.36k
         (JDIMENSION)access_rows, FALSE);
506
1.36k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
1.53k
    } else {
508
1.53k
      buffer = (*cinfo->mem->access_virt_barray)
509
1.53k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
1.53k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
1.53k
    }
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
689k
    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
689k
    else
520
689k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
689k
    change_dc =
524
689k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
689k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
689k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
689k
    quanttbl = compptr->quant_table;
529
689k
    Q00 = quanttbl->quantval[0];
530
689k
    Q01 = quanttbl->quantval[Q01_POS];
531
689k
    Q10 = quanttbl->quantval[Q10_POS];
532
689k
    Q20 = quanttbl->quantval[Q20_POS];
533
689k
    Q11 = quanttbl->quantval[Q11_POS];
534
689k
    Q02 = quanttbl->quantval[Q02_POS];
535
689k
    if (change_dc) {
536
279k
      Q03 = quanttbl->quantval[Q03_POS];
537
279k
      Q12 = quanttbl->quantval[Q12_POS];
538
279k
      Q21 = quanttbl->quantval[Q21_POS];
539
279k
      Q30 = quanttbl->quantval[Q30_POS];
540
279k
    }
541
689k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
689k
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
689k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
2.02M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
1.33M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
1.33M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
1.33M
      if (image_block_row > 0)
550
1.33M
        prev_block_row =
551
1.33M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
1.53k
      else
553
1.53k
        prev_block_row = buffer_ptr;
554
555
1.33M
      if (image_block_row > 1)
556
1.33M
        prev_prev_block_row =
557
1.33M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
2.99k
      else
559
2.99k
        prev_prev_block_row = prev_block_row;
560
561
1.33M
      if (image_block_row < image_block_rows - 1)
562
1.33M
        next_block_row =
563
1.33M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
1.53k
      else
565
1.53k
        next_block_row = buffer_ptr;
566
567
1.33M
      if (image_block_row < image_block_rows - 2)
568
1.33M
        next_next_block_row =
569
1.33M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
2.21k
      else
571
2.21k
        next_next_block_row = next_block_row;
572
573
      /* We fetch the surrounding DC values using a sliding-register approach.
574
       * Initialize all 25 here so as to do the right thing on narrow pics.
575
       */
576
1.33M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
1.33M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
1.33M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
1.33M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
1.33M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
1.33M
      output_col = 0;
582
1.33M
      last_block_column = compptr->width_in_blocks - 1;
583
1.33M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
11.5M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
10.2M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
10.2M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
10.2M
            block_num < last_block_column) {
590
1.31M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
1.31M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
1.31M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
1.31M
          DC19 = DC20 = (int)next_block_row[1][0];
594
1.31M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
1.31M
        }
596
10.2M
        if (block_num + 1 < last_block_column) {
597
7.58M
          DC05 = (int)prev_prev_block_row[2][0];
598
7.58M
          DC10 = (int)prev_block_row[2][0];
599
7.58M
          DC15 = (int)buffer_ptr[2][0];
600
7.58M
          DC20 = (int)next_block_row[2][0];
601
7.58M
          DC25 = (int)next_next_block_row[2][0];
602
7.58M
        }
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
10.2M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
8.47M
          num = Q00 * (change_dc ?
616
6.01M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
6.01M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
6.01M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
6.01M
                 DC21 - DC22 + DC24 + DC25) :
620
8.47M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
8.47M
          if (num >= 0) {
622
5.79M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
5.79M
            if (Al > 0 && pred >= (1 << Al))
624
343k
              pred = (1 << Al) - 1;
625
5.79M
          } else {
626
2.68M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
2.68M
            if (Al > 0 && pred >= (1 << Al))
628
115k
              pred = (1 << Al) - 1;
629
2.68M
            pred = -pred;
630
2.68M
          }
631
8.47M
          workspace[1] = (JCOEF)pred;
632
8.47M
        }
633
        /* AC10 */
634
10.2M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
9.61M
          num = Q00 * (change_dc ?
636
6.01M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
6.01M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
6.01M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
6.01M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
9.61M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
9.61M
          if (num >= 0) {
642
6.71M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
6.71M
            if (Al > 0 && pred >= (1 << Al))
644
1.34M
              pred = (1 << Al) - 1;
645
6.71M
          } else {
646
2.90M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
2.90M
            if (Al > 0 && pred >= (1 << Al))
648
675k
              pred = (1 << Al) - 1;
649
2.90M
            pred = -pred;
650
2.90M
          }
651
9.61M
          workspace[8] = (JCOEF)pred;
652
9.61M
        }
653
        /* AC20 */
654
10.2M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
8.99M
          num = Q00 * (change_dc ?
656
6.01M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
6.01M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
8.99M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
8.99M
          if (num >= 0) {
660
4.96M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
4.96M
            if (Al > 0 && pred >= (1 << Al))
662
577k
              pred = (1 << Al) - 1;
663
4.96M
          } else {
664
4.03M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
4.03M
            if (Al > 0 && pred >= (1 << Al))
666
579k
              pred = (1 << Al) - 1;
667
4.03M
            pred = -pred;
668
4.03M
          }
669
8.99M
          workspace[16] = (JCOEF)pred;
670
8.99M
        }
671
        /* AC11 */
672
10.2M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
9.33M
          num = Q00 * (change_dc ?
674
6.01M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
6.01M
                 9 * DC19 + DC21 - DC25) :
676
9.33M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
3.32M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
9.33M
          if (num >= 0) {
679
6.41M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
6.41M
            if (Al > 0 && pred >= (1 << Al))
681
433k
              pred = (1 << Al) - 1;
682
6.41M
          } else {
683
2.91M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
2.91M
            if (Al > 0 && pred >= (1 << Al))
685
431k
              pred = (1 << Al) - 1;
686
2.91M
            pred = -pred;
687
2.91M
          }
688
9.33M
          workspace[9] = (JCOEF)pred;
689
9.33M
        }
690
        /* AC02 */
691
10.2M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
9.78M
          num = Q00 * (change_dc ?
693
6.01M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
6.01M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
9.78M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
9.78M
          if (num >= 0) {
697
5.48M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
5.48M
            if (Al > 0 && pred >= (1 << Al))
699
222k
              pred = (1 << Al) - 1;
700
5.48M
          } else {
701
4.30M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
4.30M
            if (Al > 0 && pred >= (1 << Al))
703
219k
              pred = (1 << Al) - 1;
704
4.30M
            pred = -pred;
705
4.30M
          }
706
9.78M
          workspace[2] = (JCOEF)pred;
707
9.78M
        }
708
10.2M
        if (change_dc) {
709
          /* AC03 */
710
6.01M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
6.01M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
6.01M
            if (num >= 0) {
713
4.39M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
4.39M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
4.39M
            } else {
717
1.61M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
1.61M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
1.61M
              pred = -pred;
721
1.61M
            }
722
6.01M
            workspace[3] = (JCOEF)pred;
723
6.01M
          }
724
          /* AC12 */
725
6.01M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
6.01M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
6.01M
            if (num >= 0) {
728
2.82M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
2.82M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
3.18M
            } else {
732
3.18M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
3.18M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
3.18M
              pred = -pred;
736
3.18M
            }
737
6.01M
            workspace[10] = (JCOEF)pred;
738
6.01M
          }
739
          /* AC21 */
740
6.01M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
6.01M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
6.01M
            if (num >= 0) {
743
2.93M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
2.93M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
3.08M
            } else {
747
3.08M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
3.08M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
3.08M
              pred = -pred;
751
3.08M
            }
752
6.01M
            workspace[17] = (JCOEF)pred;
753
6.01M
          }
754
          /* AC30 */
755
6.01M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
6.01M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
6.01M
            if (num >= 0) {
758
4.26M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
4.26M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
4.26M
            } else {
762
1.74M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
1.74M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
1.74M
              pred = -pred;
766
1.74M
            }
767
6.01M
            workspace[24] = (JCOEF)pred;
768
6.01M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
6.01M
          num = Q00 *
773
6.01M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
6.01M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
6.01M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
6.01M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
6.01M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
6.01M
          if (num >= 0) {
779
2.05M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
3.96M
          } else {
781
3.96M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
3.96M
            pred = -pred;
783
3.96M
          }
784
6.01M
          workspace[0] = (JCOEF)pred;
785
6.01M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
10.2M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
10.2M
                        output_col);
790
        /* Advance for next column */
791
10.2M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
10.2M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
10.2M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
10.2M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
10.2M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
10.2M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
10.2M
          prev_prev_block_row++, next_next_block_row++;
798
10.2M
        output_col += compptr->_DCT_scaled_size;
799
10.2M
      }
800
1.33M
      output_ptr += compptr->_DCT_scaled_size;
801
1.33M
    }
802
689k
  }
803
804
657k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
656k
    return JPEG_ROW_COMPLETED;
806
928
  return JPEG_SCAN_COMPLETED;
807
657k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
430
657k
{
431
657k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
657k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
657k
  JDIMENSION block_num, last_block_column;
434
657k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
657k
    image_block_rows;
436
657k
  JBLOCKARRAY buffer;
437
657k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
657k
  JBLOCKROW next_block_row, next_next_block_row;
439
657k
  _JSAMPARRAY output_ptr;
440
657k
  JDIMENSION output_col;
441
657k
  jpeg_component_info *compptr;
442
657k
  _inverse_DCT_method_ptr inverse_DCT;
443
657k
  boolean change_dc;
444
657k
  JCOEF *workspace;
445
657k
  int *coef_bits;
446
657k
  JQUANT_TBL *quanttbl;
447
657k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
657k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
657k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
657k
      DC25;
451
657k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
657k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
657k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
657k
         !cinfo->inputctl->eoi_reached) {
459
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
460
      /* If input is working on current scan, we ordinarily want it to
461
       * have completed the current row.  But if input scan is DC,
462
       * we want it to keep two rows ahead so that next two block rows' DC
463
       * values are up to date.
464
       */
465
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
466
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
467
0
        break;
468
0
    }
469
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
470
0
      return JPEG_SUSPENDED;
471
0
  }
472
473
  /* OK, output from the virtual arrays. */
474
1.34M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
689k
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
689k
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
689k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
686k
      block_rows = compptr->v_samp_factor;
482
686k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
686k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
1.36k
      block_rows = compptr->v_samp_factor;
485
1.36k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
1.53k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
1.53k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
1.53k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
1.53k
      access_rows = block_rows; /* this iMCU row only */
491
1.53k
    }
492
    /* Align the virtual buffer for this component. */
493
689k
    if (cinfo->output_iMCU_row > 1) {
494
686k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
686k
      buffer = (*cinfo->mem->access_virt_barray)
496
686k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
686k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
686k
         (JDIMENSION)access_rows, FALSE);
499
686k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
686k
    } else if (cinfo->output_iMCU_row > 0) {
501
1.36k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
1.36k
      buffer = (*cinfo->mem->access_virt_barray)
503
1.36k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
1.36k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
1.36k
         (JDIMENSION)access_rows, FALSE);
506
1.36k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
1.53k
    } else {
508
1.53k
      buffer = (*cinfo->mem->access_virt_barray)
509
1.53k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
1.53k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
1.53k
    }
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
689k
    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
689k
    else
520
689k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
689k
    change_dc =
524
689k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
689k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
689k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
689k
    quanttbl = compptr->quant_table;
529
689k
    Q00 = quanttbl->quantval[0];
530
689k
    Q01 = quanttbl->quantval[Q01_POS];
531
689k
    Q10 = quanttbl->quantval[Q10_POS];
532
689k
    Q20 = quanttbl->quantval[Q20_POS];
533
689k
    Q11 = quanttbl->quantval[Q11_POS];
534
689k
    Q02 = quanttbl->quantval[Q02_POS];
535
689k
    if (change_dc) {
536
279k
      Q03 = quanttbl->quantval[Q03_POS];
537
279k
      Q12 = quanttbl->quantval[Q12_POS];
538
279k
      Q21 = quanttbl->quantval[Q21_POS];
539
279k
      Q30 = quanttbl->quantval[Q30_POS];
540
279k
    }
541
689k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
689k
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
689k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
2.02M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
1.33M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
1.33M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
1.33M
      if (image_block_row > 0)
550
1.33M
        prev_block_row =
551
1.33M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
1.53k
      else
553
1.53k
        prev_block_row = buffer_ptr;
554
555
1.33M
      if (image_block_row > 1)
556
1.33M
        prev_prev_block_row =
557
1.33M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
2.99k
      else
559
2.99k
        prev_prev_block_row = prev_block_row;
560
561
1.33M
      if (image_block_row < image_block_rows - 1)
562
1.33M
        next_block_row =
563
1.33M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
1.53k
      else
565
1.53k
        next_block_row = buffer_ptr;
566
567
1.33M
      if (image_block_row < image_block_rows - 2)
568
1.33M
        next_next_block_row =
569
1.33M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
2.21k
      else
571
2.21k
        next_next_block_row = next_block_row;
572
573
      /* We fetch the surrounding DC values using a sliding-register approach.
574
       * Initialize all 25 here so as to do the right thing on narrow pics.
575
       */
576
1.33M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
1.33M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
1.33M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
1.33M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
1.33M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
1.33M
      output_col = 0;
582
1.33M
      last_block_column = compptr->width_in_blocks - 1;
583
1.33M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
11.5M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
10.2M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
10.2M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
10.2M
            block_num < last_block_column) {
590
1.31M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
1.31M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
1.31M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
1.31M
          DC19 = DC20 = (int)next_block_row[1][0];
594
1.31M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
1.31M
        }
596
10.2M
        if (block_num + 1 < last_block_column) {
597
7.58M
          DC05 = (int)prev_prev_block_row[2][0];
598
7.58M
          DC10 = (int)prev_block_row[2][0];
599
7.58M
          DC15 = (int)buffer_ptr[2][0];
600
7.58M
          DC20 = (int)next_block_row[2][0];
601
7.58M
          DC25 = (int)next_next_block_row[2][0];
602
7.58M
        }
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
10.2M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
8.47M
          num = Q00 * (change_dc ?
616
6.01M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
6.01M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
6.01M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
6.01M
                 DC21 - DC22 + DC24 + DC25) :
620
8.47M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
8.47M
          if (num >= 0) {
622
5.79M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
5.79M
            if (Al > 0 && pred >= (1 << Al))
624
343k
              pred = (1 << Al) - 1;
625
5.79M
          } else {
626
2.68M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
2.68M
            if (Al > 0 && pred >= (1 << Al))
628
115k
              pred = (1 << Al) - 1;
629
2.68M
            pred = -pred;
630
2.68M
          }
631
8.47M
          workspace[1] = (JCOEF)pred;
632
8.47M
        }
633
        /* AC10 */
634
10.2M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
9.61M
          num = Q00 * (change_dc ?
636
6.01M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
6.01M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
6.01M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
6.01M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
9.61M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
9.61M
          if (num >= 0) {
642
6.71M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
6.71M
            if (Al > 0 && pred >= (1 << Al))
644
1.34M
              pred = (1 << Al) - 1;
645
6.71M
          } else {
646
2.90M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
2.90M
            if (Al > 0 && pred >= (1 << Al))
648
675k
              pred = (1 << Al) - 1;
649
2.90M
            pred = -pred;
650
2.90M
          }
651
9.61M
          workspace[8] = (JCOEF)pred;
652
9.61M
        }
653
        /* AC20 */
654
10.2M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
8.99M
          num = Q00 * (change_dc ?
656
6.01M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
6.01M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
8.99M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
8.99M
          if (num >= 0) {
660
4.96M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
4.96M
            if (Al > 0 && pred >= (1 << Al))
662
577k
              pred = (1 << Al) - 1;
663
4.96M
          } else {
664
4.03M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
4.03M
            if (Al > 0 && pred >= (1 << Al))
666
579k
              pred = (1 << Al) - 1;
667
4.03M
            pred = -pred;
668
4.03M
          }
669
8.99M
          workspace[16] = (JCOEF)pred;
670
8.99M
        }
671
        /* AC11 */
672
10.2M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
9.33M
          num = Q00 * (change_dc ?
674
6.01M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
6.01M
                 9 * DC19 + DC21 - DC25) :
676
9.33M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
3.32M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
9.33M
          if (num >= 0) {
679
6.41M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
6.41M
            if (Al > 0 && pred >= (1 << Al))
681
433k
              pred = (1 << Al) - 1;
682
6.41M
          } else {
683
2.91M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
2.91M
            if (Al > 0 && pred >= (1 << Al))
685
431k
              pred = (1 << Al) - 1;
686
2.91M
            pred = -pred;
687
2.91M
          }
688
9.33M
          workspace[9] = (JCOEF)pred;
689
9.33M
        }
690
        /* AC02 */
691
10.2M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
9.78M
          num = Q00 * (change_dc ?
693
6.01M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
6.01M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
9.78M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
9.78M
          if (num >= 0) {
697
5.48M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
5.48M
            if (Al > 0 && pred >= (1 << Al))
699
222k
              pred = (1 << Al) - 1;
700
5.48M
          } else {
701
4.30M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
4.30M
            if (Al > 0 && pred >= (1 << Al))
703
219k
              pred = (1 << Al) - 1;
704
4.30M
            pred = -pred;
705
4.30M
          }
706
9.78M
          workspace[2] = (JCOEF)pred;
707
9.78M
        }
708
10.2M
        if (change_dc) {
709
          /* AC03 */
710
6.01M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
6.01M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
6.01M
            if (num >= 0) {
713
4.39M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
4.39M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
4.39M
            } else {
717
1.61M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
1.61M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
1.61M
              pred = -pred;
721
1.61M
            }
722
6.01M
            workspace[3] = (JCOEF)pred;
723
6.01M
          }
724
          /* AC12 */
725
6.01M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
6.01M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
6.01M
            if (num >= 0) {
728
2.82M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
2.82M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
3.18M
            } else {
732
3.18M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
3.18M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
3.18M
              pred = -pred;
736
3.18M
            }
737
6.01M
            workspace[10] = (JCOEF)pred;
738
6.01M
          }
739
          /* AC21 */
740
6.01M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
6.01M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
6.01M
            if (num >= 0) {
743
2.93M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
2.93M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
3.08M
            } else {
747
3.08M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
3.08M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
3.08M
              pred = -pred;
751
3.08M
            }
752
6.01M
            workspace[17] = (JCOEF)pred;
753
6.01M
          }
754
          /* AC30 */
755
6.01M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
6.01M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
6.01M
            if (num >= 0) {
758
4.26M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
4.26M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
4.26M
            } else {
762
1.74M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
1.74M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
1.74M
              pred = -pred;
766
1.74M
            }
767
6.01M
            workspace[24] = (JCOEF)pred;
768
6.01M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
6.01M
          num = Q00 *
773
6.01M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
6.01M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
6.01M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
6.01M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
6.01M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
6.01M
          if (num >= 0) {
779
2.05M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
3.96M
          } else {
781
3.96M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
3.96M
            pred = -pred;
783
3.96M
          }
784
6.01M
          workspace[0] = (JCOEF)pred;
785
6.01M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
10.2M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
10.2M
                        output_col);
790
        /* Advance for next column */
791
10.2M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
10.2M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
10.2M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
10.2M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
10.2M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
10.2M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
10.2M
          prev_prev_block_row++, next_next_block_row++;
798
10.2M
        output_col += compptr->_DCT_scaled_size;
799
10.2M
      }
800
1.33M
      output_ptr += compptr->_DCT_scaled_size;
801
1.33M
    }
802
689k
  }
803
804
657k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
656k
    return JPEG_ROW_COMPLETED;
806
928
  return JPEG_SCAN_COMPLETED;
807
657k
}
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
4.19k
{
819
4.19k
  my_coef_ptr coef;
820
821
4.19k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
4.19k
  coef = (my_coef_ptr)
825
4.19k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
4.19k
                                sizeof(my_coef_controller));
827
4.19k
  memset(coef, 0, sizeof(my_coef_controller));
828
4.19k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
4.19k
  coef->pub.start_input_pass = start_input_pass;
830
4.19k
  coef->pub.start_output_pass = start_output_pass;
831
4.19k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
4.19k
  coef->coef_bits_latch = NULL;
833
4.19k
#endif
834
835
  /* Create the coefficient buffer. */
836
4.19k
  if (need_full_buffer) {
837
2.50k
#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.50k
    int ci, access_rows;
842
2.50k
    jpeg_component_info *compptr;
843
844
8.32k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
5.82k
         ci++, compptr++) {
846
5.82k
      access_rows = compptr->v_samp_factor;
847
5.82k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
5.82k
      if (cinfo->progressive_mode)
850
5.65k
        access_rows *= 5;
851
5.82k
#endif
852
5.82k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
5.82k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
5.82k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
5.82k
                               (long)compptr->h_samp_factor),
856
5.82k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
5.82k
                               (long)compptr->v_samp_factor),
858
5.82k
         (JDIMENSION)access_rows);
859
5.82k
    }
860
2.50k
    coef->pub.consume_data = consume_data;
861
2.50k
    coef->pub._decompress_data = decompress_data;
862
2.50k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
2.50k
  } else {
867
    /* We only need a single-MCU buffer. */
868
1.69k
    JBLOCKROW buffer;
869
1.69k
    int i;
870
871
1.69k
    buffer = (JBLOCKROW)
872
1.69k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
1.69k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
18.6k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
16.9k
      coef->MCU_buffer[i] = buffer + i;
876
16.9k
    }
877
1.69k
    coef->pub.consume_data = dummy_consume_data;
878
1.69k
    coef->pub._decompress_data = decompress_onepass;
879
1.69k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
1.69k
  }
881
882
  /* Allocate the workspace buffer */
883
4.19k
  coef->workspace = (JCOEF *)
884
4.19k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
4.19k
                                sizeof(JCOEF) * DCTSIZE2);
886
4.19k
}
jinit_d_coef_controller
Line
Count
Source
818
3.80k
{
819
3.80k
  my_coef_ptr coef;
820
821
3.80k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
3.80k
  coef = (my_coef_ptr)
825
3.80k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
3.80k
                                sizeof(my_coef_controller));
827
3.80k
  memset(coef, 0, sizeof(my_coef_controller));
828
3.80k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
3.80k
  coef->pub.start_input_pass = start_input_pass;
830
3.80k
  coef->pub.start_output_pass = start_output_pass;
831
3.80k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
3.80k
  coef->coef_bits_latch = NULL;
833
3.80k
#endif
834
835
  /* Create the coefficient buffer. */
836
3.80k
  if (need_full_buffer) {
837
2.12k
#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.12k
    int ci, access_rows;
842
2.12k
    jpeg_component_info *compptr;
843
844
6.86k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
4.74k
         ci++, compptr++) {
846
4.74k
      access_rows = compptr->v_samp_factor;
847
4.74k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
4.74k
      if (cinfo->progressive_mode)
850
4.68k
        access_rows *= 5;
851
4.74k
#endif
852
4.74k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
4.74k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
4.74k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
4.74k
                               (long)compptr->h_samp_factor),
856
4.74k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
4.74k
                               (long)compptr->v_samp_factor),
858
4.74k
         (JDIMENSION)access_rows);
859
4.74k
    }
860
2.12k
    coef->pub.consume_data = consume_data;
861
2.12k
    coef->pub._decompress_data = decompress_data;
862
2.12k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
2.12k
  } else {
867
    /* We only need a single-MCU buffer. */
868
1.68k
    JBLOCKROW buffer;
869
1.68k
    int i;
870
871
1.68k
    buffer = (JBLOCKROW)
872
1.68k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
1.68k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
18.4k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
16.8k
      coef->MCU_buffer[i] = buffer + i;
876
16.8k
    }
877
1.68k
    coef->pub.consume_data = dummy_consume_data;
878
1.68k
    coef->pub._decompress_data = decompress_onepass;
879
1.68k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
1.68k
  }
881
882
  /* Allocate the workspace buffer */
883
3.80k
  coef->workspace = (JCOEF *)
884
3.80k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
3.80k
                                sizeof(JCOEF) * DCTSIZE2);
886
3.80k
}
j12init_d_coef_controller
Line
Count
Source
818
394
{
819
394
  my_coef_ptr coef;
820
821
394
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
394
  coef = (my_coef_ptr)
825
394
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
394
                                sizeof(my_coef_controller));
827
394
  memset(coef, 0, sizeof(my_coef_controller));
828
394
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
394
  coef->pub.start_input_pass = start_input_pass;
830
394
  coef->pub.start_output_pass = start_output_pass;
831
394
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
394
  coef->coef_bits_latch = NULL;
833
394
#endif
834
835
  /* Create the coefficient buffer. */
836
394
  if (need_full_buffer) {
837
382
#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
382
    int ci, access_rows;
842
382
    jpeg_component_info *compptr;
843
844
1.46k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
1.07k
         ci++, compptr++) {
846
1.07k
      access_rows = compptr->v_samp_factor;
847
1.07k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
1.07k
      if (cinfo->progressive_mode)
850
967
        access_rows *= 5;
851
1.07k
#endif
852
1.07k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
1.07k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
1.07k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
1.07k
                               (long)compptr->h_samp_factor),
856
1.07k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
1.07k
                               (long)compptr->v_samp_factor),
858
1.07k
         (JDIMENSION)access_rows);
859
1.07k
    }
860
382
    coef->pub.consume_data = consume_data;
861
382
    coef->pub._decompress_data = decompress_data;
862
382
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
382
  } else {
867
    /* We only need a single-MCU buffer. */
868
12
    JBLOCKROW buffer;
869
12
    int i;
870
871
12
    buffer = (JBLOCKROW)
872
12
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
12
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
132
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
120
      coef->MCU_buffer[i] = buffer + i;
876
120
    }
877
12
    coef->pub.consume_data = dummy_consume_data;
878
12
    coef->pub._decompress_data = decompress_onepass;
879
12
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
12
  }
881
882
  /* Allocate the workspace buffer */
883
394
  coef->workspace = (JCOEF *)
884
394
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
394
                                sizeof(JCOEF) * DCTSIZE2);
886
394
}