Coverage Report

Created: 2025-10-12 07:08

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
14.0k
{
48
14.0k
  cinfo->input_iMCU_row = 0;
49
14.0k
  start_iMCU_row(cinfo);
50
14.0k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
47
12.6k
{
48
12.6k
  cinfo->input_iMCU_row = 0;
49
12.6k
  start_iMCU_row(cinfo);
50
12.6k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
47
1.37k
{
48
1.37k
  cinfo->input_iMCU_row = 0;
49
1.37k
  start_iMCU_row(cinfo);
50
1.37k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
4.14k
{
60
4.14k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
4.14k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
62
63
  /* If multipass, check to see whether to use block smoothing on this pass */
64
4.14k
  if (coef->pub.coef_arrays != NULL) {
65
2.17k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.10k
      coef->pub._decompress_data = decompress_smooth_data;
67
1.06k
    else
68
1.06k
      coef->pub._decompress_data = decompress_data;
69
2.17k
  }
70
4.14k
#endif
71
4.14k
  cinfo->output_iMCU_row = 0;
72
4.14k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
59
3.96k
{
60
3.96k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
3.96k
  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.96k
  if (coef->pub.coef_arrays != NULL) {
65
2.01k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.07k
      coef->pub._decompress_data = decompress_smooth_data;
67
939
    else
68
939
      coef->pub._decompress_data = decompress_data;
69
2.01k
  }
70
3.96k
#endif
71
3.96k
  cinfo->output_iMCU_row = 0;
72
3.96k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
59
172
{
60
172
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
172
  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
172
  if (coef->pub.coef_arrays != NULL) {
65
161
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
31
      coef->pub._decompress_data = decompress_smooth_data;
67
130
    else
68
130
      coef->pub._decompress_data = decompress_data;
69
161
  }
70
172
#endif
71
172
  cinfo->output_iMCU_row = 0;
72
172
}
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
245k
{
88
245k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
245k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
245k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
245k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
245k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
245k
  _JSAMPARRAY output_ptr;
94
245k
  JDIMENSION start_col, output_col;
95
245k
  jpeg_component_info *compptr;
96
245k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
494k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
248k
       yoffset++) {
101
3.84M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
3.59M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
3.59M
      jzero_far((void *)coef->MCU_buffer[0],
105
3.59M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
3.59M
      if (!cinfo->entropy->insufficient_data)
107
3.59M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
3.59M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
109
        /* Suspension forced; update state counters and exit */
110
0
        coef->MCU_vert_offset = yoffset;
111
0
        coef->MCU_ctr = MCU_col_num;
112
0
        return JPEG_SUSPENDED;
113
0
      }
114
115
      /* Only perform the IDCT on blocks that are contained within the desired
116
       * cropping region.
117
       */
118
3.59M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
3.59M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
120
        /* Determine where data should go in output_buf and do the IDCT thing.
121
         * We skip dummy blocks at the right and bottom edges (but blkn gets
122
         * incremented past them!).  Note the inner loop relies on having
123
         * allocated the MCU_buffer[] blocks sequentially.
124
         */
125
3.59M
        blkn = 0;               /* index of current DCT block within MCU */
126
15.4M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
11.8M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
11.8M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
11.8M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
11.8M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
10.8M
                         compptr->MCU_width : compptr->last_col_width;
136
11.8M
          output_ptr = output_buf[compptr->component_index] +
137
11.8M
                       yoffset * compptr->_DCT_scaled_size;
138
11.8M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
11.8M
                      compptr->MCU_sample_width;
140
24.6M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
12.8M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
12.8M
                yoffset + yindex < compptr->last_row_height) {
143
12.8M
              output_col = start_col;
144
26.0M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
13.2M
                (*inverse_DCT) (cinfo, compptr,
146
13.2M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
13.2M
                                output_ptr, output_col);
148
13.2M
                output_col += compptr->_DCT_scaled_size;
149
13.2M
              }
150
12.8M
            }
151
12.8M
            blkn += compptr->MCU_width;
152
12.8M
            output_ptr += compptr->_DCT_scaled_size;
153
12.8M
          }
154
11.8M
        }
155
3.59M
      }
156
3.59M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
248k
    coef->MCU_ctr = 0;
159
248k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
245k
  cinfo->output_iMCU_row++;
162
245k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
243k
    start_iMCU_row(cinfo);
164
243k
    return JPEG_ROW_COMPLETED;
165
243k
  }
166
  /* Completed the scan */
167
1.95k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
1.95k
  return JPEG_SCAN_COMPLETED;
169
245k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
87
245k
{
88
245k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
245k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
245k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
245k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
245k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
245k
  _JSAMPARRAY output_ptr;
94
245k
  JDIMENSION start_col, output_col;
95
245k
  jpeg_component_info *compptr;
96
245k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
494k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
248k
       yoffset++) {
101
3.84M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
3.59M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
3.59M
      jzero_far((void *)coef->MCU_buffer[0],
105
3.59M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
3.59M
      if (!cinfo->entropy->insufficient_data)
107
3.59M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
3.59M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
109
        /* Suspension forced; update state counters and exit */
110
0
        coef->MCU_vert_offset = yoffset;
111
0
        coef->MCU_ctr = MCU_col_num;
112
0
        return JPEG_SUSPENDED;
113
0
      }
114
115
      /* Only perform the IDCT on blocks that are contained within the desired
116
       * cropping region.
117
       */
118
3.59M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
3.59M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
120
        /* Determine where data should go in output_buf and do the IDCT thing.
121
         * We skip dummy blocks at the right and bottom edges (but blkn gets
122
         * incremented past them!).  Note the inner loop relies on having
123
         * allocated the MCU_buffer[] blocks sequentially.
124
         */
125
3.59M
        blkn = 0;               /* index of current DCT block within MCU */
126
15.4M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
11.8M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
11.8M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
11.8M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
11.8M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
10.8M
                         compptr->MCU_width : compptr->last_col_width;
136
11.8M
          output_ptr = output_buf[compptr->component_index] +
137
11.8M
                       yoffset * compptr->_DCT_scaled_size;
138
11.8M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
11.8M
                      compptr->MCU_sample_width;
140
24.6M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
12.8M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
12.8M
                yoffset + yindex < compptr->last_row_height) {
143
12.8M
              output_col = start_col;
144
26.0M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
13.2M
                (*inverse_DCT) (cinfo, compptr,
146
13.2M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
13.2M
                                output_ptr, output_col);
148
13.2M
                output_col += compptr->_DCT_scaled_size;
149
13.2M
              }
150
12.8M
            }
151
12.8M
            blkn += compptr->MCU_width;
152
12.8M
            output_ptr += compptr->_DCT_scaled_size;
153
12.8M
          }
154
11.8M
        }
155
3.59M
      }
156
3.59M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
248k
    coef->MCU_ctr = 0;
159
248k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
245k
  cinfo->output_iMCU_row++;
162
245k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
243k
    start_iMCU_row(cinfo);
164
243k
    return JPEG_ROW_COMPLETED;
165
243k
  }
166
  /* Completed the scan */
167
1.95k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
1.95k
  return JPEG_SCAN_COMPLETED;
169
245k
}
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
4.13M
{
195
4.13M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
4.13M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
4.13M
  int blkn, ci, xindex, yindex, yoffset;
198
4.13M
  JDIMENSION start_col;
199
4.13M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
4.13M
  JBLOCKROW buffer_ptr;
201
4.13M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
10.6M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
6.56M
    compptr = cinfo->cur_comp_info[ci];
206
6.56M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
6.56M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
6.56M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
6.56M
       (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
6.56M
  }
215
216
  /* Loop to process one whole iMCU row */
217
11.5M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
7.46M
       yoffset++) {
219
59.4M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
51.9M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
51.9M
      blkn = 0;                 /* index of current DCT block within MCU */
223
120M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
68.6M
        compptr = cinfo->cur_comp_info[ci];
225
68.6M
        start_col = MCU_col_num * compptr->MCU_width;
226
147M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
79.2M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
161M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
81.9M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
81.9M
          }
231
79.2M
        }
232
68.6M
      }
233
51.9M
      if (!cinfo->entropy->insufficient_data)
234
51.9M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
51.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
51.9M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
7.46M
    coef->MCU_ctr = 0;
245
7.46M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
4.13M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
4.11M
    start_iMCU_row(cinfo);
249
4.11M
    return JPEG_ROW_COMPLETED;
250
4.11M
  }
251
  /* Completed the scan */
252
12.0k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
12.0k
  return JPEG_SCAN_COMPLETED;
254
4.13M
}
jdcoefct-8.c:consume_data
Line
Count
Source
194
3.30M
{
195
3.30M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
3.30M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
3.30M
  int blkn, ci, xindex, yindex, yoffset;
198
3.30M
  JDIMENSION start_col;
199
3.30M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
3.30M
  JBLOCKROW buffer_ptr;
201
3.30M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
6.96M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
3.65M
    compptr = cinfo->cur_comp_info[ci];
206
3.65M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
3.65M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
3.65M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
3.65M
       (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
3.65M
  }
215
216
  /* Loop to process one whole iMCU row */
217
9.79M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
6.49M
       yoffset++) {
219
53.3M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
46.8M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
46.8M
      blkn = 0;                 /* index of current DCT block within MCU */
223
99.5M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
52.7M
        compptr = cinfo->cur_comp_info[ci];
225
52.7M
        start_col = MCU_col_num * compptr->MCU_width;
226
109M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
56.2M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
115M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
58.8M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
58.8M
          }
231
56.2M
        }
232
52.7M
      }
233
46.8M
      if (!cinfo->entropy->insufficient_data)
234
46.8M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
46.8M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
237
        /* Suspension forced; update state counters and exit */
238
0
        coef->MCU_vert_offset = yoffset;
239
0
        coef->MCU_ctr = MCU_col_num;
240
0
        return JPEG_SUSPENDED;
241
0
      }
242
46.8M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
6.49M
    coef->MCU_ctr = 0;
245
6.49M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
3.30M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
3.29M
    start_iMCU_row(cinfo);
249
3.29M
    return JPEG_ROW_COMPLETED;
250
3.29M
  }
251
  /* Completed the scan */
252
10.6k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
10.6k
  return JPEG_SCAN_COMPLETED;
254
3.30M
}
jdcoefct-12.c:consume_data
Line
Count
Source
194
827k
{
195
827k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
827k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
827k
  int blkn, ci, xindex, yindex, yoffset;
198
827k
  JDIMENSION start_col;
199
827k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
827k
  JBLOCKROW buffer_ptr;
201
827k
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
3.73M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
2.90M
    compptr = cinfo->cur_comp_info[ci];
206
2.90M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
2.90M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
2.90M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
2.90M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
210
    /* Note: entropy decoder expects buffer to be zeroed,
211
     * but this is handled automatically by the memory manager
212
     * because we requested a pre-zeroed array.
213
     */
214
2.90M
  }
215
216
  /* Loop to process one whole iMCU row */
217
1.80M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
972k
       yoffset++) {
219
6.11M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
5.14M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
5.14M
      blkn = 0;                 /* index of current DCT block within MCU */
223
21.0M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
15.8M
        compptr = cinfo->cur_comp_info[ci];
225
15.8M
        start_col = MCU_col_num * compptr->MCU_width;
226
38.8M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
22.9M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
46.0M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
23.0M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
23.0M
          }
231
22.9M
        }
232
15.8M
      }
233
5.14M
      if (!cinfo->entropy->insufficient_data)
234
5.14M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
5.14M
      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
5.14M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
972k
    coef->MCU_ctr = 0;
245
972k
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
827k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
826k
    start_iMCU_row(cinfo);
249
826k
    return JPEG_ROW_COMPLETED;
250
826k
  }
251
  /* Completed the scan */
252
1.35k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
1.35k
  return JPEG_SCAN_COMPLETED;
254
827k
}
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
304k
{
268
304k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
304k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
304k
  JDIMENSION block_num;
271
304k
  int ci, block_row, block_rows;
272
304k
  JBLOCKARRAY buffer;
273
304k
  JBLOCKROW buffer_ptr;
274
304k
  _JSAMPARRAY output_ptr;
275
304k
  JDIMENSION output_col;
276
304k
  jpeg_component_info *compptr;
277
304k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
304k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
304k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
304k
          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
666k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
362k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
362k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
362k
    buffer = (*cinfo->mem->access_virt_barray)
295
362k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
362k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
362k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
362k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
360k
      block_rows = compptr->v_samp_factor;
301
2.50k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
2.50k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
2.50k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
2.50k
    }
306
362k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
362k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
1.09M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
731k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
731k
      output_col = 0;
312
731k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
6.87M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
6.14M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
6.14M
                        output_col);
316
6.14M
        buffer_ptr++;
317
6.14M
        output_col += compptr->_DCT_scaled_size;
318
6.14M
      }
319
731k
      output_ptr += compptr->_DCT_scaled_size;
320
731k
    }
321
362k
  }
322
323
304k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
303k
    return JPEG_ROW_COMPLETED;
325
939
  return JPEG_SCAN_COMPLETED;
326
304k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
267
304k
{
268
304k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
304k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
304k
  JDIMENSION block_num;
271
304k
  int ci, block_row, block_rows;
272
304k
  JBLOCKARRAY buffer;
273
304k
  JBLOCKROW buffer_ptr;
274
304k
  _JSAMPARRAY output_ptr;
275
304k
  JDIMENSION output_col;
276
304k
  jpeg_component_info *compptr;
277
304k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
304k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
304k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
304k
          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
666k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
362k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
362k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
362k
    buffer = (*cinfo->mem->access_virt_barray)
295
362k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
362k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
362k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
362k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
360k
      block_rows = compptr->v_samp_factor;
301
2.50k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
2.50k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
2.50k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
2.50k
    }
306
362k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
362k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
1.09M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
731k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
731k
      output_col = 0;
312
731k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
6.87M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
6.14M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
6.14M
                        output_col);
316
6.14M
        buffer_ptr++;
317
6.14M
        output_col += compptr->_DCT_scaled_size;
318
6.14M
      }
319
731k
      output_ptr += compptr->_DCT_scaled_size;
320
731k
    }
321
362k
  }
322
323
304k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
303k
    return JPEG_ROW_COMPLETED;
325
939
  return JPEG_SCAN_COMPLETED;
326
304k
}
Unexecuted instantiation: jdcoefct-12.c:decompress_data
327
328
#endif /* D_MULTISCAN_FILES_SUPPORTED */
329
330
331
#ifdef BLOCK_SMOOTHING_SUPPORTED
332
333
/*
334
 * This code applies interblock smoothing; the first 9 AC coefficients are
335
 * estimated from the DC values of a DCT block and its 24 neighboring blocks.
336
 * We apply smoothing only for progressive JPEG decoding, and only if
337
 * the coefficients it can estimate are not yet known to full precision.
338
 */
339
340
/* Natural-order array positions of the first 9 zigzag-order coefficients */
341
1.37M
#define Q01_POS  1
342
1.37M
#define Q10_POS  8
343
1.37M
#define Q20_POS  16
344
1.37M
#define Q11_POS  9
345
1.37M
#define Q02_POS  2
346
722k
#define Q03_POS  3
347
722k
#define Q12_POS  10
348
722k
#define Q21_POS  17
349
722k
#define Q30_POS  24
350
351
/*
352
 * Determine whether block smoothing is applicable and safe.
353
 * We also latch the current states of the coef_bits[] entries for the
354
 * AC coefficients; otherwise, if the input side of the decompressor
355
 * advances into a new scan, we might think the coefficients are known
356
 * more accurately than they really are.
357
 */
358
359
LOCAL(boolean)
360
smoothing_ok(j_decompress_ptr cinfo)
361
2.17k
{
362
2.17k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
2.17k
  boolean smoothing_useful = FALSE;
364
2.17k
  int ci, coefi;
365
2.17k
  jpeg_component_info *compptr;
366
2.17k
  JQUANT_TBL *qtable;
367
2.17k
  int *coef_bits, *prev_coef_bits;
368
2.17k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
2.17k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
26
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
2.14k
  if (coef->coef_bits_latch == NULL)
375
2.14k
    coef->coef_bits_latch = (int *)
376
2.14k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
2.14k
                                  cinfo->num_components * 2 *
378
2.14k
                                  (SAVED_COEFS * sizeof(int)));
379
2.14k
  coef_bits_latch = coef->coef_bits_latch;
380
2.14k
  prev_coef_bits_latch =
381
2.14k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
5.87k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
4.19k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
4.19k
    if ((qtable = compptr->quant_table) == NULL)
387
58
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
4.13k
    if (qtable->quantval[0] == 0 ||
390
4.07k
        qtable->quantval[Q01_POS] == 0 ||
391
4.05k
        qtable->quantval[Q10_POS] == 0 ||
392
4.00k
        qtable->quantval[Q20_POS] == 0 ||
393
3.97k
        qtable->quantval[Q11_POS] == 0 ||
394
3.89k
        qtable->quantval[Q02_POS] == 0 ||
395
3.87k
        qtable->quantval[Q03_POS] == 0 ||
396
3.83k
        qtable->quantval[Q12_POS] == 0 ||
397
3.81k
        qtable->quantval[Q21_POS] == 0 ||
398
3.78k
        qtable->quantval[Q30_POS] == 0)
399
402
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
3.73k
    coef_bits = cinfo->coef_bits[ci];
402
3.73k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
3.73k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
3.73k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
37.3k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
33.5k
      if (cinfo->input_scan_number > 1)
409
20.4k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
13.0k
      else
411
13.0k
        prev_coef_bits_latch[coefi] = -1;
412
33.5k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
33.5k
      if (coef_bits[coefi] != 0)
414
18.1k
        smoothing_useful = TRUE;
415
33.5k
    }
416
3.73k
    coef_bits_latch += SAVED_COEFS;
417
3.73k
    prev_coef_bits_latch += SAVED_COEFS;
418
3.73k
  }
419
420
1.68k
  return smoothing_useful;
421
2.14k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
361
2.01k
{
362
2.01k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
2.01k
  boolean smoothing_useful = FALSE;
364
2.01k
  int ci, coefi;
365
2.01k
  jpeg_component_info *compptr;
366
2.01k
  JQUANT_TBL *qtable;
367
2.01k
  int *coef_bits, *prev_coef_bits;
368
2.01k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
2.01k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
13
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
1.99k
  if (coef->coef_bits_latch == NULL)
375
1.99k
    coef->coef_bits_latch = (int *)
376
1.99k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
1.99k
                                  cinfo->num_components * 2 *
378
1.99k
                                  (SAVED_COEFS * sizeof(int)));
379
1.99k
  coef_bits_latch = coef->coef_bits_latch;
380
1.99k
  prev_coef_bits_latch =
381
1.99k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
5.64k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
3.98k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
3.98k
    if ((qtable = compptr->quant_table) == NULL)
387
57
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
3.93k
    if (qtable->quantval[0] == 0 ||
390
3.88k
        qtable->quantval[Q01_POS] == 0 ||
391
3.86k
        qtable->quantval[Q10_POS] == 0 ||
392
3.85k
        qtable->quantval[Q20_POS] == 0 ||
393
3.83k
        qtable->quantval[Q11_POS] == 0 ||
394
3.76k
        qtable->quantval[Q02_POS] == 0 ||
395
3.74k
        qtable->quantval[Q03_POS] == 0 ||
396
3.71k
        qtable->quantval[Q12_POS] == 0 ||
397
3.70k
        qtable->quantval[Q21_POS] == 0 ||
398
3.68k
        qtable->quantval[Q30_POS] == 0)
399
290
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
3.64k
    coef_bits = cinfo->coef_bits[ci];
402
3.64k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
3.64k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
3.64k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
36.4k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
32.7k
      if (cinfo->input_scan_number > 1)
409
20.2k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
12.5k
      else
411
12.5k
        prev_coef_bits_latch[coefi] = -1;
412
32.7k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
32.7k
      if (coef_bits[coefi] != 0)
414
17.4k
        smoothing_useful = TRUE;
415
32.7k
    }
416
3.64k
    coef_bits_latch += SAVED_COEFS;
417
3.64k
    prev_coef_bits_latch += SAVED_COEFS;
418
3.64k
  }
419
420
1.65k
  return smoothing_useful;
421
1.99k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
361
161
{
362
161
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
161
  boolean smoothing_useful = FALSE;
364
161
  int ci, coefi;
365
161
  jpeg_component_info *compptr;
366
161
  JQUANT_TBL *qtable;
367
161
  int *coef_bits, *prev_coef_bits;
368
161
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
161
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
13
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
148
  if (coef->coef_bits_latch == NULL)
375
148
    coef->coef_bits_latch = (int *)
376
148
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
148
                                  cinfo->num_components * 2 *
378
148
                                  (SAVED_COEFS * sizeof(int)));
379
148
  coef_bits_latch = coef->coef_bits_latch;
380
148
  prev_coef_bits_latch =
381
148
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
237
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
202
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
202
    if ((qtable = compptr->quant_table) == NULL)
387
1
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
201
    if (qtable->quantval[0] == 0 ||
390
193
        qtable->quantval[Q01_POS] == 0 ||
391
187
        qtable->quantval[Q10_POS] == 0 ||
392
152
        qtable->quantval[Q20_POS] == 0 ||
393
140
        qtable->quantval[Q11_POS] == 0 ||
394
130
        qtable->quantval[Q02_POS] == 0 ||
395
124
        qtable->quantval[Q03_POS] == 0 ||
396
118
        qtable->quantval[Q12_POS] == 0 ||
397
108
        qtable->quantval[Q21_POS] == 0 ||
398
102
        qtable->quantval[Q30_POS] == 0)
399
112
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
89
    coef_bits = cinfo->coef_bits[ci];
402
89
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
89
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
89
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
890
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
801
      if (cinfo->input_scan_number > 1)
409
252
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
549
      else
411
549
        prev_coef_bits_latch[coefi] = -1;
412
801
      coef_bits_latch[coefi] = coef_bits[coefi];
413
801
      if (coef_bits[coefi] != 0)
414
737
        smoothing_useful = TRUE;
415
801
    }
416
89
    coef_bits_latch += SAVED_COEFS;
417
89
    prev_coef_bits_latch += SAVED_COEFS;
418
89
  }
419
420
35
  return smoothing_useful;
421
148
}
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
1.28M
{
431
1.28M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
1.28M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
1.28M
  JDIMENSION block_num, last_block_column;
434
1.28M
  int ci, block_row, block_rows, access_rows, image_block_row,
435
1.28M
    image_block_rows;
436
1.28M
  JBLOCKARRAY buffer;
437
1.28M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
1.28M
  JBLOCKROW next_block_row, next_next_block_row;
439
1.28M
  _JSAMPARRAY output_ptr;
440
1.28M
  JDIMENSION output_col;
441
1.28M
  jpeg_component_info *compptr;
442
1.28M
  _inverse_DCT_method_ptr inverse_DCT;
443
1.28M
  boolean change_dc;
444
1.28M
  JCOEF *workspace;
445
1.28M
  int *coef_bits;
446
1.28M
  JQUANT_TBL *quanttbl;
447
1.28M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
1.28M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
1.28M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
1.28M
      DC25;
451
1.28M
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
1.28M
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
1.28M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
1.28M
         !cinfo->inputctl->eoi_reached) {
459
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
460
      /* If input is working on current scan, we ordinarily want it to
461
       * have completed the current row.  But if input scan is DC,
462
       * we want it to keep two rows ahead so that next two block rows' DC
463
       * values are up to date.
464
       */
465
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
466
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
467
0
        break;
468
0
    }
469
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
470
0
      return JPEG_SUSPENDED;
471
0
  }
472
473
  /* OK, output from the virtual arrays. */
474
2.65M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
1.37M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
1.37M
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
1.37M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
1.36M
      block_rows = compptr->v_samp_factor;
482
1.36M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
1.36M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
1.81k
      block_rows = compptr->v_samp_factor;
485
1.81k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
1.93k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
1.93k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
1.93k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
1.93k
      access_rows = block_rows; /* this iMCU row only */
491
1.93k
    }
492
    /* Align the virtual buffer for this component. */
493
1.37M
    if (cinfo->output_iMCU_row > 1) {
494
1.36M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
1.36M
      buffer = (*cinfo->mem->access_virt_barray)
496
1.36M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
1.36M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
1.36M
         (JDIMENSION)access_rows, FALSE);
499
1.36M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
1.36M
    } else if (cinfo->output_iMCU_row > 0) {
501
1.81k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
1.81k
      buffer = (*cinfo->mem->access_virt_barray)
503
1.81k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
1.81k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
1.81k
         (JDIMENSION)access_rows, FALSE);
506
1.81k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
1.93k
    } else {
508
1.93k
      buffer = (*cinfo->mem->access_virt_barray)
509
1.93k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
1.93k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
1.93k
    }
512
    /* Fetch component-dependent info.
513
     * If the current scan is incomplete, then we use the component-dependent
514
     * info from the previous scan.
515
     */
516
1.37M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
0
      coef_bits =
518
0
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
1.37M
    else
520
1.37M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
1.37M
    change_dc =
524
1.37M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
760k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
739k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
1.37M
    quanttbl = compptr->quant_table;
529
1.37M
    Q00 = quanttbl->quantval[0];
530
1.37M
    Q01 = quanttbl->quantval[Q01_POS];
531
1.37M
    Q10 = quanttbl->quantval[Q10_POS];
532
1.37M
    Q20 = quanttbl->quantval[Q20_POS];
533
1.37M
    Q11 = quanttbl->quantval[Q11_POS];
534
1.37M
    Q02 = quanttbl->quantval[Q02_POS];
535
1.37M
    if (change_dc) {
536
718k
      Q03 = quanttbl->quantval[Q03_POS];
537
718k
      Q12 = quanttbl->quantval[Q12_POS];
538
718k
      Q21 = quanttbl->quantval[Q21_POS];
539
718k
      Q30 = quanttbl->quantval[Q30_POS];
540
718k
    }
541
1.37M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
1.37M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
1.37M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
4.00M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
2.63M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
2.63M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
2.63M
      if (image_block_row > 0)
550
2.63M
        prev_block_row =
551
2.63M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
1.93k
      else
553
1.93k
        prev_block_row = buffer_ptr;
554
555
2.63M
      if (image_block_row > 1)
556
2.63M
        prev_prev_block_row =
557
2.63M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
3.94k
      else
559
3.94k
        prev_prev_block_row = prev_block_row;
560
561
2.63M
      if (image_block_row < image_block_rows - 1)
562
2.63M
        next_block_row =
563
2.63M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
1.93k
      else
565
1.93k
        next_block_row = buffer_ptr;
566
567
2.63M
      if (image_block_row < image_block_rows - 2)
568
2.63M
        next_next_block_row =
569
2.63M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
3.10k
      else
571
3.10k
        next_next_block_row = next_block_row;
572
573
      /* We fetch the surrounding DC values using a sliding-register approach.
574
       * Initialize all 25 here so as to do the right thing on narrow pics.
575
       */
576
2.63M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
2.63M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
2.63M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
2.63M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
2.63M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
2.63M
      output_col = 0;
582
2.63M
      last_block_column = compptr->width_in_blocks - 1;
583
2.63M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
24.8M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
22.2M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
22.2M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
2.63M
            block_num < last_block_column) {
590
2.35M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
2.35M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
2.35M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
2.35M
          DC19 = DC20 = (int)next_block_row[1][0];
594
2.35M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
2.35M
        }
596
22.2M
        if (block_num + 1 < last_block_column) {
597
17.2M
          DC05 = (int)prev_prev_block_row[2][0];
598
17.2M
          DC10 = (int)prev_block_row[2][0];
599
17.2M
          DC15 = (int)buffer_ptr[2][0];
600
17.2M
          DC20 = (int)next_block_row[2][0];
601
17.2M
          DC25 = (int)next_next_block_row[2][0];
602
17.2M
        }
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
22.2M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
20.5M
          num = Q00 * (change_dc ?
616
14.5M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
14.5M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
14.5M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
14.5M
                 DC21 - DC22 + DC24 + DC25) :
620
20.5M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
20.5M
          if (num >= 0) {
622
12.7M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
12.7M
            if (Al > 0 && pred >= (1 << Al))
624
874k
              pred = (1 << Al) - 1;
625
12.7M
          } else {
626
7.82M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
7.82M
            if (Al > 0 && pred >= (1 << Al))
628
1.27M
              pred = (1 << Al) - 1;
629
7.82M
            pred = -pred;
630
7.82M
          }
631
20.5M
          workspace[1] = (JCOEF)pred;
632
20.5M
        }
633
        /* AC10 */
634
22.2M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
21.1M
          num = Q00 * (change_dc ?
636
14.5M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
14.5M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
14.5M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
14.5M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
21.1M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
21.1M
          if (num >= 0) {
642
12.9M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
12.9M
            if (Al > 0 && pred >= (1 << Al))
644
1.87M
              pred = (1 << Al) - 1;
645
12.9M
          } else {
646
8.18M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
8.18M
            if (Al > 0 && pred >= (1 << Al))
648
1.74M
              pred = (1 << Al) - 1;
649
8.18M
            pred = -pred;
650
8.18M
          }
651
21.1M
          workspace[8] = (JCOEF)pred;
652
21.1M
        }
653
        /* AC20 */
654
22.2M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
21.1M
          num = Q00 * (change_dc ?
656
14.5M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
14.5M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
21.1M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
21.1M
          if (num >= 0) {
660
12.4M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
12.4M
            if (Al > 0 && pred >= (1 << Al))
662
1.24M
              pred = (1 << Al) - 1;
663
12.4M
          } else {
664
8.64M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
8.64M
            if (Al > 0 && pred >= (1 << Al))
666
1.25M
              pred = (1 << Al) - 1;
667
8.64M
            pred = -pred;
668
8.64M
          }
669
21.1M
          workspace[16] = (JCOEF)pred;
670
21.1M
        }
671
        /* AC11 */
672
22.2M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
21.3M
          num = Q00 * (change_dc ?
674
14.5M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
14.5M
                 9 * DC19 + DC21 - DC25) :
676
21.3M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
6.79M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
21.3M
          if (num >= 0) {
679
15.5M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
15.5M
            if (Al > 0 && pred >= (1 << Al))
681
798k
              pred = (1 << Al) - 1;
682
15.5M
          } else {
683
5.76M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
5.76M
            if (Al > 0 && pred >= (1 << Al))
685
788k
              pred = (1 << Al) - 1;
686
5.76M
            pred = -pred;
687
5.76M
          }
688
21.3M
          workspace[9] = (JCOEF)pred;
689
21.3M
        }
690
        /* AC02 */
691
22.2M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
20.1M
          num = Q00 * (change_dc ?
693
14.5M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
14.5M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
20.1M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
20.1M
          if (num >= 0) {
697
11.9M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
11.9M
            if (Al > 0 && pred >= (1 << Al))
699
173k
              pred = (1 << Al) - 1;
700
11.9M
          } else {
701
8.21M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
8.21M
            if (Al > 0 && pred >= (1 << Al))
703
174k
              pred = (1 << Al) - 1;
704
8.21M
            pred = -pred;
705
8.21M
          }
706
20.1M
          workspace[2] = (JCOEF)pred;
707
20.1M
        }
708
22.2M
        if (change_dc) {
709
          /* AC03 */
710
14.5M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
14.5M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
14.5M
            if (num >= 0) {
713
9.45M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
9.45M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
9.45M
            } else {
717
5.07M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
5.07M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
5.07M
              pred = -pred;
721
5.07M
            }
722
14.5M
            workspace[3] = (JCOEF)pred;
723
14.5M
          }
724
          /* AC12 */
725
14.5M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
14.5M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
14.5M
            if (num >= 0) {
728
7.16M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
7.16M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
7.36M
            } else {
732
7.36M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
7.36M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
7.36M
              pred = -pred;
736
7.36M
            }
737
14.5M
            workspace[10] = (JCOEF)pred;
738
14.5M
          }
739
          /* AC21 */
740
14.5M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
14.5M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
14.5M
            if (num >= 0) {
743
7.13M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
7.13M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
7.39M
            } else {
747
7.39M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
7.39M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
7.39M
              pred = -pred;
751
7.39M
            }
752
14.5M
            workspace[17] = (JCOEF)pred;
753
14.5M
          }
754
          /* AC30 */
755
14.5M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
14.5M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
14.5M
            if (num >= 0) {
758
9.16M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
9.16M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
9.16M
            } else {
762
5.36M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
5.36M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
5.36M
              pred = -pred;
766
5.36M
            }
767
14.5M
            workspace[24] = (JCOEF)pred;
768
14.5M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
14.5M
          num = Q00 *
773
14.5M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
14.5M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
14.5M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
14.5M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
14.5M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
14.5M
          if (num >= 0) {
779
5.91M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
8.61M
          } else {
781
8.61M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
8.61M
            pred = -pred;
783
8.61M
          }
784
14.5M
          workspace[0] = (JCOEF)pred;
785
14.5M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
22.2M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
22.2M
                        output_col);
790
        /* Advance for next column */
791
22.2M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
22.2M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
22.2M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
22.2M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
22.2M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
22.2M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
22.2M
          prev_prev_block_row++, next_next_block_row++;
798
22.2M
        output_col += compptr->_DCT_scaled_size;
799
22.2M
      }
800
2.63M
      output_ptr += compptr->_DCT_scaled_size;
801
2.63M
    }
802
1.37M
  }
803
804
1.28M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
1.28M
    return JPEG_ROW_COMPLETED;
806
1.07k
  return JPEG_SCAN_COMPLETED;
807
1.28M
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
430
1.28M
{
431
1.28M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
1.28M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
1.28M
  JDIMENSION block_num, last_block_column;
434
1.28M
  int ci, block_row, block_rows, access_rows, image_block_row,
435
1.28M
    image_block_rows;
436
1.28M
  JBLOCKARRAY buffer;
437
1.28M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
1.28M
  JBLOCKROW next_block_row, next_next_block_row;
439
1.28M
  _JSAMPARRAY output_ptr;
440
1.28M
  JDIMENSION output_col;
441
1.28M
  jpeg_component_info *compptr;
442
1.28M
  _inverse_DCT_method_ptr inverse_DCT;
443
1.28M
  boolean change_dc;
444
1.28M
  JCOEF *workspace;
445
1.28M
  int *coef_bits;
446
1.28M
  JQUANT_TBL *quanttbl;
447
1.28M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
1.28M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
1.28M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
1.28M
      DC25;
451
1.28M
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
1.28M
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
1.28M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
1.28M
         !cinfo->inputctl->eoi_reached) {
459
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
460
      /* If input is working on current scan, we ordinarily want it to
461
       * have completed the current row.  But if input scan is DC,
462
       * we want it to keep two rows ahead so that next two block rows' DC
463
       * values are up to date.
464
       */
465
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
466
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
467
0
        break;
468
0
    }
469
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
470
0
      return JPEG_SUSPENDED;
471
0
  }
472
473
  /* OK, output from the virtual arrays. */
474
2.65M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
1.37M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
1.37M
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
1.37M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
1.36M
      block_rows = compptr->v_samp_factor;
482
1.36M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
1.36M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
1.81k
      block_rows = compptr->v_samp_factor;
485
1.81k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
1.93k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
1.93k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
1.93k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
1.93k
      access_rows = block_rows; /* this iMCU row only */
491
1.93k
    }
492
    /* Align the virtual buffer for this component. */
493
1.37M
    if (cinfo->output_iMCU_row > 1) {
494
1.36M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
1.36M
      buffer = (*cinfo->mem->access_virt_barray)
496
1.36M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
1.36M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
1.36M
         (JDIMENSION)access_rows, FALSE);
499
1.36M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
1.36M
    } else if (cinfo->output_iMCU_row > 0) {
501
1.81k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
1.81k
      buffer = (*cinfo->mem->access_virt_barray)
503
1.81k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
1.81k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
1.81k
         (JDIMENSION)access_rows, FALSE);
506
1.81k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
1.93k
    } else {
508
1.93k
      buffer = (*cinfo->mem->access_virt_barray)
509
1.93k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
1.93k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
1.93k
    }
512
    /* Fetch component-dependent info.
513
     * If the current scan is incomplete, then we use the component-dependent
514
     * info from the previous scan.
515
     */
516
1.37M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
0
      coef_bits =
518
0
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
1.37M
    else
520
1.37M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
1.37M
    change_dc =
524
1.37M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
760k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
739k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
1.37M
    quanttbl = compptr->quant_table;
529
1.37M
    Q00 = quanttbl->quantval[0];
530
1.37M
    Q01 = quanttbl->quantval[Q01_POS];
531
1.37M
    Q10 = quanttbl->quantval[Q10_POS];
532
1.37M
    Q20 = quanttbl->quantval[Q20_POS];
533
1.37M
    Q11 = quanttbl->quantval[Q11_POS];
534
1.37M
    Q02 = quanttbl->quantval[Q02_POS];
535
1.37M
    if (change_dc) {
536
718k
      Q03 = quanttbl->quantval[Q03_POS];
537
718k
      Q12 = quanttbl->quantval[Q12_POS];
538
718k
      Q21 = quanttbl->quantval[Q21_POS];
539
718k
      Q30 = quanttbl->quantval[Q30_POS];
540
718k
    }
541
1.37M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
1.37M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
1.37M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
4.00M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
2.63M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
2.63M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
2.63M
      if (image_block_row > 0)
550
2.63M
        prev_block_row =
551
2.63M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
1.93k
      else
553
1.93k
        prev_block_row = buffer_ptr;
554
555
2.63M
      if (image_block_row > 1)
556
2.63M
        prev_prev_block_row =
557
2.63M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
3.94k
      else
559
3.94k
        prev_prev_block_row = prev_block_row;
560
561
2.63M
      if (image_block_row < image_block_rows - 1)
562
2.63M
        next_block_row =
563
2.63M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
1.93k
      else
565
1.93k
        next_block_row = buffer_ptr;
566
567
2.63M
      if (image_block_row < image_block_rows - 2)
568
2.63M
        next_next_block_row =
569
2.63M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
3.10k
      else
571
3.10k
        next_next_block_row = next_block_row;
572
573
      /* We fetch the surrounding DC values using a sliding-register approach.
574
       * Initialize all 25 here so as to do the right thing on narrow pics.
575
       */
576
2.63M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
2.63M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
2.63M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
2.63M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
2.63M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
2.63M
      output_col = 0;
582
2.63M
      last_block_column = compptr->width_in_blocks - 1;
583
2.63M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
24.8M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
22.2M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
22.2M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
2.63M
            block_num < last_block_column) {
590
2.35M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
2.35M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
2.35M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
2.35M
          DC19 = DC20 = (int)next_block_row[1][0];
594
2.35M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
2.35M
        }
596
22.2M
        if (block_num + 1 < last_block_column) {
597
17.2M
          DC05 = (int)prev_prev_block_row[2][0];
598
17.2M
          DC10 = (int)prev_block_row[2][0];
599
17.2M
          DC15 = (int)buffer_ptr[2][0];
600
17.2M
          DC20 = (int)next_block_row[2][0];
601
17.2M
          DC25 = (int)next_next_block_row[2][0];
602
17.2M
        }
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
22.2M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
20.5M
          num = Q00 * (change_dc ?
616
14.5M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
14.5M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
14.5M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
14.5M
                 DC21 - DC22 + DC24 + DC25) :
620
20.5M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
20.5M
          if (num >= 0) {
622
12.7M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
12.7M
            if (Al > 0 && pred >= (1 << Al))
624
874k
              pred = (1 << Al) - 1;
625
12.7M
          } else {
626
7.82M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
7.82M
            if (Al > 0 && pred >= (1 << Al))
628
1.27M
              pred = (1 << Al) - 1;
629
7.82M
            pred = -pred;
630
7.82M
          }
631
20.5M
          workspace[1] = (JCOEF)pred;
632
20.5M
        }
633
        /* AC10 */
634
22.2M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
21.1M
          num = Q00 * (change_dc ?
636
14.5M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
14.5M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
14.5M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
14.5M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
21.1M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
21.1M
          if (num >= 0) {
642
12.9M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
12.9M
            if (Al > 0 && pred >= (1 << Al))
644
1.87M
              pred = (1 << Al) - 1;
645
12.9M
          } else {
646
8.18M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
8.18M
            if (Al > 0 && pred >= (1 << Al))
648
1.74M
              pred = (1 << Al) - 1;
649
8.18M
            pred = -pred;
650
8.18M
          }
651
21.1M
          workspace[8] = (JCOEF)pred;
652
21.1M
        }
653
        /* AC20 */
654
22.2M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
21.1M
          num = Q00 * (change_dc ?
656
14.5M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
14.5M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
21.1M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
21.1M
          if (num >= 0) {
660
12.4M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
12.4M
            if (Al > 0 && pred >= (1 << Al))
662
1.24M
              pred = (1 << Al) - 1;
663
12.4M
          } else {
664
8.64M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
8.64M
            if (Al > 0 && pred >= (1 << Al))
666
1.25M
              pred = (1 << Al) - 1;
667
8.64M
            pred = -pred;
668
8.64M
          }
669
21.1M
          workspace[16] = (JCOEF)pred;
670
21.1M
        }
671
        /* AC11 */
672
22.2M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
21.3M
          num = Q00 * (change_dc ?
674
14.5M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
14.5M
                 9 * DC19 + DC21 - DC25) :
676
21.3M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
6.79M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
21.3M
          if (num >= 0) {
679
15.5M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
15.5M
            if (Al > 0 && pred >= (1 << Al))
681
798k
              pred = (1 << Al) - 1;
682
15.5M
          } else {
683
5.76M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
5.76M
            if (Al > 0 && pred >= (1 << Al))
685
788k
              pred = (1 << Al) - 1;
686
5.76M
            pred = -pred;
687
5.76M
          }
688
21.3M
          workspace[9] = (JCOEF)pred;
689
21.3M
        }
690
        /* AC02 */
691
22.2M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
20.1M
          num = Q00 * (change_dc ?
693
14.5M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
14.5M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
20.1M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
20.1M
          if (num >= 0) {
697
11.9M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
11.9M
            if (Al > 0 && pred >= (1 << Al))
699
173k
              pred = (1 << Al) - 1;
700
11.9M
          } else {
701
8.21M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
8.21M
            if (Al > 0 && pred >= (1 << Al))
703
174k
              pred = (1 << Al) - 1;
704
8.21M
            pred = -pred;
705
8.21M
          }
706
20.1M
          workspace[2] = (JCOEF)pred;
707
20.1M
        }
708
22.2M
        if (change_dc) {
709
          /* AC03 */
710
14.5M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
14.5M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
14.5M
            if (num >= 0) {
713
9.45M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
9.45M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
9.45M
            } else {
717
5.07M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
5.07M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
5.07M
              pred = -pred;
721
5.07M
            }
722
14.5M
            workspace[3] = (JCOEF)pred;
723
14.5M
          }
724
          /* AC12 */
725
14.5M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
14.5M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
14.5M
            if (num >= 0) {
728
7.16M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
7.16M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
7.36M
            } else {
732
7.36M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
7.36M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
7.36M
              pred = -pred;
736
7.36M
            }
737
14.5M
            workspace[10] = (JCOEF)pred;
738
14.5M
          }
739
          /* AC21 */
740
14.5M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
14.5M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
14.5M
            if (num >= 0) {
743
7.13M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
7.13M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
7.39M
            } else {
747
7.39M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
7.39M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
7.39M
              pred = -pred;
751
7.39M
            }
752
14.5M
            workspace[17] = (JCOEF)pred;
753
14.5M
          }
754
          /* AC30 */
755
14.5M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
14.5M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
14.5M
            if (num >= 0) {
758
9.16M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
9.16M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
9.16M
            } else {
762
5.36M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
5.36M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
5.36M
              pred = -pred;
766
5.36M
            }
767
14.5M
            workspace[24] = (JCOEF)pred;
768
14.5M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
14.5M
          num = Q00 *
773
14.5M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
14.5M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
14.5M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
14.5M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
14.5M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
14.5M
          if (num >= 0) {
779
5.91M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
8.61M
          } else {
781
8.61M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
8.61M
            pred = -pred;
783
8.61M
          }
784
14.5M
          workspace[0] = (JCOEF)pred;
785
14.5M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
22.2M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
22.2M
                        output_col);
790
        /* Advance for next column */
791
22.2M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
22.2M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
22.2M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
22.2M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
22.2M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
22.2M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
22.2M
          prev_prev_block_row++, next_next_block_row++;
798
22.2M
        output_col += compptr->_DCT_scaled_size;
799
22.2M
      }
800
2.63M
      output_ptr += compptr->_DCT_scaled_size;
801
2.63M
    }
802
1.37M
  }
803
804
1.28M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
1.28M
    return JPEG_ROW_COMPLETED;
806
1.07k
  return JPEG_SCAN_COMPLETED;
807
1.28M
}
Unexecuted instantiation: jdcoefct-12.c:decompress_smooth_data
808
809
#endif /* BLOCK_SMOOTHING_SUPPORTED */
810
811
812
/*
813
 * Initialize coefficient buffer controller.
814
 */
815
816
GLOBAL(void)
817
_jinit_d_coef_controller(j_decompress_ptr cinfo, boolean need_full_buffer)
818
5.30k
{
819
5.30k
  my_coef_ptr coef;
820
821
5.30k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
5.30k
  coef = (my_coef_ptr)
825
5.30k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
5.30k
                                sizeof(my_coef_controller));
827
5.30k
  memset(coef, 0, sizeof(my_coef_controller));
828
5.30k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
5.30k
  coef->pub.start_input_pass = start_input_pass;
830
5.30k
  coef->pub.start_output_pass = start_output_pass;
831
5.30k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
5.30k
  coef->coef_bits_latch = NULL;
833
5.30k
#endif
834
835
  /* Create the coefficient buffer. */
836
5.30k
  if (need_full_buffer) {
837
3.20k
#ifdef D_MULTISCAN_FILES_SUPPORTED
838
    /* Allocate a full-image virtual array for each component, */
839
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
840
    /* Note we ask for a pre-zeroed array. */
841
3.20k
    int ci, access_rows;
842
3.20k
    jpeg_component_info *compptr;
843
844
10.8k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
7.61k
         ci++, compptr++) {
846
7.61k
      access_rows = compptr->v_samp_factor;
847
7.61k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
7.61k
      if (cinfo->progressive_mode)
850
7.38k
        access_rows *= 5;
851
7.61k
#endif
852
7.61k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
7.61k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
7.61k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
7.61k
                               (long)compptr->h_samp_factor),
856
7.61k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
7.61k
                               (long)compptr->v_samp_factor),
858
7.61k
         (JDIMENSION)access_rows);
859
7.61k
    }
860
3.20k
    coef->pub.consume_data = consume_data;
861
3.20k
    coef->pub._decompress_data = decompress_data;
862
3.20k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
3.20k
  } else {
867
    /* We only need a single-MCU buffer. */
868
2.10k
    JBLOCKROW buffer;
869
2.10k
    int i;
870
871
2.10k
    buffer = (JBLOCKROW)
872
2.10k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
2.10k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
23.1k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
21.0k
      coef->MCU_buffer[i] = buffer + i;
876
21.0k
    }
877
2.10k
    coef->pub.consume_data = dummy_consume_data;
878
2.10k
    coef->pub._decompress_data = decompress_onepass;
879
2.10k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
2.10k
  }
881
882
  /* Allocate the workspace buffer */
883
5.30k
  coef->workspace = (JCOEF *)
884
5.30k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
5.30k
                                sizeof(JCOEF) * DCTSIZE2);
886
5.30k
}
jinit_d_coef_controller
Line
Count
Source
818
4.64k
{
819
4.64k
  my_coef_ptr coef;
820
821
4.64k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
4.64k
  coef = (my_coef_ptr)
825
4.64k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
4.64k
                                sizeof(my_coef_controller));
827
4.64k
  memset(coef, 0, sizeof(my_coef_controller));
828
4.64k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
4.64k
  coef->pub.start_input_pass = start_input_pass;
830
4.64k
  coef->pub.start_output_pass = start_output_pass;
831
4.64k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
4.64k
  coef->coef_bits_latch = NULL;
833
4.64k
#endif
834
835
  /* Create the coefficient buffer. */
836
4.64k
  if (need_full_buffer) {
837
2.57k
#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.57k
    int ci, access_rows;
842
2.57k
    jpeg_component_info *compptr;
843
844
8.36k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
5.79k
         ci++, compptr++) {
846
5.79k
      access_rows = compptr->v_samp_factor;
847
5.79k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
5.79k
      if (cinfo->progressive_mode)
850
5.70k
        access_rows *= 5;
851
5.79k
#endif
852
5.79k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
5.79k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
5.79k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
5.79k
                               (long)compptr->h_samp_factor),
856
5.79k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
5.79k
                               (long)compptr->v_samp_factor),
858
5.79k
         (JDIMENSION)access_rows);
859
5.79k
    }
860
2.57k
    coef->pub.consume_data = consume_data;
861
2.57k
    coef->pub._decompress_data = decompress_data;
862
2.57k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
2.57k
  } else {
867
    /* We only need a single-MCU buffer. */
868
2.07k
    JBLOCKROW buffer;
869
2.07k
    int i;
870
871
2.07k
    buffer = (JBLOCKROW)
872
2.07k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
2.07k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
22.8k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
20.7k
      coef->MCU_buffer[i] = buffer + i;
876
20.7k
    }
877
2.07k
    coef->pub.consume_data = dummy_consume_data;
878
2.07k
    coef->pub._decompress_data = decompress_onepass;
879
2.07k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
2.07k
  }
881
882
  /* Allocate the workspace buffer */
883
4.64k
  coef->workspace = (JCOEF *)
884
4.64k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
4.64k
                                sizeof(JCOEF) * DCTSIZE2);
886
4.64k
}
j12init_d_coef_controller
Line
Count
Source
818
662
{
819
662
  my_coef_ptr coef;
820
821
662
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
662
  coef = (my_coef_ptr)
825
662
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
662
                                sizeof(my_coef_controller));
827
662
  memset(coef, 0, sizeof(my_coef_controller));
828
662
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
662
  coef->pub.start_input_pass = start_input_pass;
830
662
  coef->pub.start_output_pass = start_output_pass;
831
662
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
662
  coef->coef_bits_latch = NULL;
833
662
#endif
834
835
  /* Create the coefficient buffer. */
836
662
  if (need_full_buffer) {
837
634
#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
634
    int ci, access_rows;
842
634
    jpeg_component_info *compptr;
843
844
2.45k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
1.82k
         ci++, compptr++) {
846
1.82k
      access_rows = compptr->v_samp_factor;
847
1.82k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
1.82k
      if (cinfo->progressive_mode)
850
1.67k
        access_rows *= 5;
851
1.82k
#endif
852
1.82k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
1.82k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
1.82k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
1.82k
                               (long)compptr->h_samp_factor),
856
1.82k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
1.82k
                               (long)compptr->v_samp_factor),
858
1.82k
         (JDIMENSION)access_rows);
859
1.82k
    }
860
634
    coef->pub.consume_data = consume_data;
861
634
    coef->pub._decompress_data = decompress_data;
862
634
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
634
  } else {
867
    /* We only need a single-MCU buffer. */
868
28
    JBLOCKROW buffer;
869
28
    int i;
870
871
28
    buffer = (JBLOCKROW)
872
28
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
28
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
308
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
280
      coef->MCU_buffer[i] = buffer + i;
876
280
    }
877
28
    coef->pub.consume_data = dummy_consume_data;
878
28
    coef->pub._decompress_data = decompress_onepass;
879
28
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
28
  }
881
882
  /* Allocate the workspace buffer */
883
662
  coef->workspace = (JCOEF *)
884
662
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
662
                                sizeof(JCOEF) * DCTSIZE2);
886
662
}