Coverage Report

Created: 2025-10-10 06:18

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
7.80k
{
48
7.80k
  cinfo->input_iMCU_row = 0;
49
7.80k
  start_iMCU_row(cinfo);
50
7.80k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
47
6.92k
{
48
6.92k
  cinfo->input_iMCU_row = 0;
49
6.92k
  start_iMCU_row(cinfo);
50
6.92k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
47
880
{
48
880
  cinfo->input_iMCU_row = 0;
49
880
  start_iMCU_row(cinfo);
50
880
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
2.31k
{
60
2.31k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
2.31k
  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
2.31k
  if (coef->pub.coef_arrays != NULL) {
65
620
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
427
      coef->pub._decompress_data = decompress_smooth_data;
67
193
    else
68
193
      coef->pub._decompress_data = decompress_data;
69
620
  }
70
2.31k
#endif
71
2.31k
  cinfo->output_iMCU_row = 0;
72
2.31k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
59
2.25k
{
60
2.25k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
2.25k
  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
2.25k
  if (coef->pub.coef_arrays != NULL) {
65
576
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
401
      coef->pub._decompress_data = decompress_smooth_data;
67
175
    else
68
175
      coef->pub._decompress_data = decompress_data;
69
576
  }
70
2.25k
#endif
71
2.25k
  cinfo->output_iMCU_row = 0;
72
2.25k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
59
56
{
60
56
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
56
  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
56
  if (coef->pub.coef_arrays != NULL) {
65
44
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
26
      coef->pub._decompress_data = decompress_smooth_data;
67
18
    else
68
18
      coef->pub._decompress_data = decompress_data;
69
44
  }
70
56
#endif
71
56
  cinfo->output_iMCU_row = 0;
72
56
}
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
109k
{
88
109k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
109k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
109k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
109k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
109k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
109k
  _JSAMPARRAY output_ptr;
94
109k
  JDIMENSION start_col, output_col;
95
109k
  jpeg_component_info *compptr;
96
109k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
220k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
110k
       yoffset++) {
101
1.38M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
1.27M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
1.27M
      jzero_far((void *)coef->MCU_buffer[0],
105
1.27M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
1.27M
      if (!cinfo->entropy->insufficient_data)
107
1.27M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
1.27M
      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
1.27M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
1.27M
          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
1.27M
        blkn = 0;               /* index of current DCT block within MCU */
126
4.54M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
3.26M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
3.26M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
3.26M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
3.26M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
2.96M
                         compptr->MCU_width : compptr->last_col_width;
136
3.26M
          output_ptr = output_buf[compptr->component_index] +
137
3.26M
                       yoffset * compptr->_DCT_scaled_size;
138
3.26M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
3.26M
                      compptr->MCU_sample_width;
140
8.37M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
5.10M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
4.85M
                yoffset + yindex < compptr->last_row_height) {
143
4.85M
              output_col = start_col;
144
11.3M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
6.52M
                (*inverse_DCT) (cinfo, compptr,
146
6.52M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
6.52M
                                output_ptr, output_col);
148
6.52M
                output_col += compptr->_DCT_scaled_size;
149
6.52M
              }
150
4.85M
            }
151
5.10M
            blkn += compptr->MCU_width;
152
5.10M
            output_ptr += compptr->_DCT_scaled_size;
153
5.10M
          }
154
3.26M
        }
155
1.27M
      }
156
1.27M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
110k
    coef->MCU_ctr = 0;
159
110k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
109k
  cinfo->output_iMCU_row++;
162
109k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
107k
    start_iMCU_row(cinfo);
164
107k
    return JPEG_ROW_COMPLETED;
165
107k
  }
166
  /* Completed the scan */
167
1.68k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
1.68k
  return JPEG_SCAN_COMPLETED;
169
109k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
87
109k
{
88
109k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
109k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
109k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
109k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
109k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
109k
  _JSAMPARRAY output_ptr;
94
109k
  JDIMENSION start_col, output_col;
95
109k
  jpeg_component_info *compptr;
96
109k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
220k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
110k
       yoffset++) {
101
1.38M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
1.27M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
1.27M
      jzero_far((void *)coef->MCU_buffer[0],
105
1.27M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
1.27M
      if (!cinfo->entropy->insufficient_data)
107
1.27M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
1.27M
      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
1.27M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
1.27M
          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
1.27M
        blkn = 0;               /* index of current DCT block within MCU */
126
4.54M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
3.26M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
3.26M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
3.26M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
3.26M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
2.96M
                         compptr->MCU_width : compptr->last_col_width;
136
3.26M
          output_ptr = output_buf[compptr->component_index] +
137
3.26M
                       yoffset * compptr->_DCT_scaled_size;
138
3.26M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
3.26M
                      compptr->MCU_sample_width;
140
8.37M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
5.10M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
4.85M
                yoffset + yindex < compptr->last_row_height) {
143
4.85M
              output_col = start_col;
144
11.3M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
6.52M
                (*inverse_DCT) (cinfo, compptr,
146
6.52M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
6.52M
                                output_ptr, output_col);
148
6.52M
                output_col += compptr->_DCT_scaled_size;
149
6.52M
              }
150
4.85M
            }
151
5.10M
            blkn += compptr->MCU_width;
152
5.10M
            output_ptr += compptr->_DCT_scaled_size;
153
5.10M
          }
154
3.26M
        }
155
1.27M
      }
156
1.27M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
110k
    coef->MCU_ctr = 0;
159
110k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
109k
  cinfo->output_iMCU_row++;
162
109k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
107k
    start_iMCU_row(cinfo);
164
107k
    return JPEG_ROW_COMPLETED;
165
107k
  }
166
  /* Completed the scan */
167
1.68k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
1.68k
  return JPEG_SCAN_COMPLETED;
169
109k
}
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.11M
{
195
1.11M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
1.11M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
1.11M
  int blkn, ci, xindex, yindex, yoffset;
198
1.11M
  JDIMENSION start_col;
199
1.11M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
1.11M
  JBLOCKROW buffer_ptr;
201
1.11M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
3.90M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
2.79M
    compptr = cinfo->cur_comp_info[ci];
206
2.79M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
2.79M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
2.79M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
2.79M
       (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.79M
  }
215
216
  /* Loop to process one whole iMCU row */
217
2.37M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
1.25M
       yoffset++) {
219
15.2M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
14.0M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
14.0M
      blkn = 0;                 /* index of current DCT block within MCU */
223
41.2M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
27.1M
        compptr = cinfo->cur_comp_info[ci];
225
27.1M
        start_col = MCU_col_num * compptr->MCU_width;
226
65.5M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
38.3M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
87.6M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
49.2M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
49.2M
          }
231
38.3M
        }
232
27.1M
      }
233
14.0M
      if (!cinfo->entropy->insufficient_data)
234
14.0M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
14.0M
      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
14.0M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
1.25M
    coef->MCU_ctr = 0;
245
1.25M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
1.11M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
1.10M
    start_iMCU_row(cinfo);
249
1.10M
    return JPEG_ROW_COMPLETED;
250
1.10M
  }
251
  /* Completed the scan */
252
6.10k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
6.10k
  return JPEG_SCAN_COMPLETED;
254
1.11M
}
jdcoefct-8.c:consume_data
Line
Count
Source
194
828k
{
195
828k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
828k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
828k
  int blkn, ci, xindex, yindex, yoffset;
198
828k
  JDIMENSION start_col;
199
828k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
828k
  JBLOCKROW buffer_ptr;
201
828k
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
3.04M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
2.21M
    compptr = cinfo->cur_comp_info[ci];
206
2.21M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
2.21M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
2.21M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
2.21M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
210
    /* Note: entropy decoder expects buffer to be zeroed,
211
     * but this is handled automatically by the memory manager
212
     * because we requested a pre-zeroed array.
213
     */
214
2.21M
  }
215
216
  /* Loop to process one whole iMCU row */
217
1.67M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
845k
       yoffset++) {
219
10.0M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
9.21M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
9.21M
      blkn = 0;                 /* index of current DCT block within MCU */
223
30.2M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
21.0M
        compptr = cinfo->cur_comp_info[ci];
225
21.0M
        start_col = MCU_col_num * compptr->MCU_width;
226
52.5M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
31.5M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
70.9M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
39.4M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
39.4M
          }
231
31.5M
        }
232
21.0M
      }
233
9.21M
      if (!cinfo->entropy->insufficient_data)
234
9.21M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
9.21M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
237
        /* Suspension forced; update state counters and exit */
238
0
        coef->MCU_vert_offset = yoffset;
239
0
        coef->MCU_ctr = MCU_col_num;
240
0
        return JPEG_SUSPENDED;
241
0
      }
242
9.21M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
845k
    coef->MCU_ctr = 0;
245
845k
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
828k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
822k
    start_iMCU_row(cinfo);
249
822k
    return JPEG_ROW_COMPLETED;
250
822k
  }
251
  /* Completed the scan */
252
5.24k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
5.24k
  return JPEG_SCAN_COMPLETED;
254
828k
}
jdcoefct-12.c:consume_data
Line
Count
Source
194
287k
{
195
287k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
287k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
287k
  int blkn, ci, xindex, yindex, yoffset;
198
287k
  JDIMENSION start_col;
199
287k
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
287k
  JBLOCKROW buffer_ptr;
201
287k
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
862k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
575k
    compptr = cinfo->cur_comp_info[ci];
206
575k
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
575k
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
575k
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
575k
       (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
575k
  }
215
216
  /* Loop to process one whole iMCU row */
217
698k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
411k
       yoffset++) {
219
5.23M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
4.82M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
4.82M
      blkn = 0;                 /* index of current DCT block within MCU */
223
10.9M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
6.15M
        compptr = cinfo->cur_comp_info[ci];
225
6.15M
        start_col = MCU_col_num * compptr->MCU_width;
226
13.0M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
6.87M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
16.6M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
9.80M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
9.80M
          }
231
6.87M
        }
232
6.15M
      }
233
4.82M
      if (!cinfo->entropy->insufficient_data)
234
4.82M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
4.82M
      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
4.82M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
411k
    coef->MCU_ctr = 0;
245
411k
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
287k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
286k
    start_iMCU_row(cinfo);
249
286k
    return JPEG_ROW_COMPLETED;
250
286k
  }
251
  /* Completed the scan */
252
868
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
868
  return JPEG_SCAN_COMPLETED;
254
287k
}
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
46.0k
{
268
46.0k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
46.0k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
46.0k
  JDIMENSION block_num;
271
46.0k
  int ci, block_row, block_rows;
272
46.0k
  JBLOCKARRAY buffer;
273
46.0k
  JBLOCKROW buffer_ptr;
274
46.0k
  _JSAMPARRAY output_ptr;
275
46.0k
  JDIMENSION output_col;
276
46.0k
  jpeg_component_info *compptr;
277
46.0k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
46.0k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
46.0k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
46.0k
          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
184k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
138k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
138k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
138k
    buffer = (*cinfo->mem->access_virt_barray)
295
138k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
138k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
138k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
138k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
137k
      block_rows = compptr->v_samp_factor;
301
526
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
526
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
526
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
526
    }
306
138k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
138k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
362k
    for (block_row = 0; block_row < block_rows; block_row++) {
310
224k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
224k
      output_col = 0;
312
224k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
3.19M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
2.97M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
2.97M
                        output_col);
316
2.97M
        buffer_ptr++;
317
2.97M
        output_col += compptr->_DCT_scaled_size;
318
2.97M
      }
319
224k
      output_ptr += compptr->_DCT_scaled_size;
320
224k
    }
321
138k
  }
322
323
46.0k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
45.8k
    return JPEG_ROW_COMPLETED;
325
175
  return JPEG_SCAN_COMPLETED;
326
46.0k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
267
46.0k
{
268
46.0k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
46.0k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
46.0k
  JDIMENSION block_num;
271
46.0k
  int ci, block_row, block_rows;
272
46.0k
  JBLOCKARRAY buffer;
273
46.0k
  JBLOCKROW buffer_ptr;
274
46.0k
  _JSAMPARRAY output_ptr;
275
46.0k
  JDIMENSION output_col;
276
46.0k
  jpeg_component_info *compptr;
277
46.0k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
46.0k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
46.0k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
46.0k
          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
184k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
138k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
138k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
138k
    buffer = (*cinfo->mem->access_virt_barray)
295
138k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
138k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
138k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
138k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
137k
      block_rows = compptr->v_samp_factor;
301
526
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
526
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
526
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
526
    }
306
138k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
138k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
362k
    for (block_row = 0; block_row < block_rows; block_row++) {
310
224k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
224k
      output_col = 0;
312
224k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
3.19M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
2.97M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
2.97M
                        output_col);
316
2.97M
        buffer_ptr++;
317
2.97M
        output_col += compptr->_DCT_scaled_size;
318
2.97M
      }
319
224k
      output_ptr += compptr->_DCT_scaled_size;
320
224k
    }
321
138k
  }
322
323
46.0k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
45.8k
    return JPEG_ROW_COMPLETED;
325
175
  return JPEG_SCAN_COMPLETED;
326
46.0k
}
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
413k
#define Q01_POS  1
342
413k
#define Q10_POS  8
343
413k
#define Q20_POS  16
344
413k
#define Q11_POS  9
345
413k
#define Q02_POS  2
346
361k
#define Q03_POS  3
347
361k
#define Q12_POS  10
348
361k
#define Q21_POS  17
349
361k
#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
620
{
362
620
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
620
  boolean smoothing_useful = FALSE;
364
620
  int ci, coefi;
365
620
  jpeg_component_info *compptr;
366
620
  JQUANT_TBL *qtable;
367
620
  int *coef_bits, *prev_coef_bits;
368
620
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
620
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
4
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
616
  if (coef->coef_bits_latch == NULL)
375
616
    coef->coef_bits_latch = (int *)
376
616
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
616
                                  cinfo->num_components * 2 *
378
616
                                  (SAVED_COEFS * sizeof(int)));
379
616
  coef_bits_latch = coef->coef_bits_latch;
380
616
  prev_coef_bits_latch =
381
616
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
2.12k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
1.64k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
1.64k
    if ((qtable = compptr->quant_table) == NULL)
387
29
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
1.61k
    if (qtable->quantval[0] == 0 ||
390
1.60k
        qtable->quantval[Q01_POS] == 0 ||
391
1.59k
        qtable->quantval[Q10_POS] == 0 ||
392
1.59k
        qtable->quantval[Q20_POS] == 0 ||
393
1.58k
        qtable->quantval[Q11_POS] == 0 ||
394
1.57k
        qtable->quantval[Q02_POS] == 0 ||
395
1.57k
        qtable->quantval[Q03_POS] == 0 ||
396
1.56k
        qtable->quantval[Q12_POS] == 0 ||
397
1.55k
        qtable->quantval[Q21_POS] == 0 ||
398
1.55k
        qtable->quantval[Q30_POS] == 0)
399
110
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
1.50k
    coef_bits = cinfo->coef_bits[ci];
402
1.50k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
1.50k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
1.50k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
15.0k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
13.5k
      if (cinfo->input_scan_number > 1)
409
7.35k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
6.18k
      else
411
6.18k
        prev_coef_bits_latch[coefi] = -1;
412
13.5k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
13.5k
      if (coef_bits[coefi] != 0)
414
12.0k
        smoothing_useful = TRUE;
415
13.5k
    }
416
1.50k
    coef_bits_latch += SAVED_COEFS;
417
1.50k
    prev_coef_bits_latch += SAVED_COEFS;
418
1.50k
  }
419
420
477
  return smoothing_useful;
421
616
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
361
576
{
362
576
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
576
  boolean smoothing_useful = FALSE;
364
576
  int ci, coefi;
365
576
  jpeg_component_info *compptr;
366
576
  JQUANT_TBL *qtable;
367
576
  int *coef_bits, *prev_coef_bits;
368
576
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
576
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
3
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
573
  if (coef->coef_bits_latch == NULL)
375
573
    coef->coef_bits_latch = (int *)
376
573
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
573
                                  cinfo->num_components * 2 *
378
573
                                  (SAVED_COEFS * sizeof(int)));
379
573
  coef_bits_latch = coef->coef_bits_latch;
380
573
  prev_coef_bits_latch =
381
573
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
1.98k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
1.53k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
1.53k
    if ((qtable = compptr->quant_table) == NULL)
387
25
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
1.51k
    if (qtable->quantval[0] == 0 ||
390
1.50k
        qtable->quantval[Q01_POS] == 0 ||
391
1.49k
        qtable->quantval[Q10_POS] == 0 ||
392
1.49k
        qtable->quantval[Q20_POS] == 0 ||
393
1.48k
        qtable->quantval[Q11_POS] == 0 ||
394
1.48k
        qtable->quantval[Q02_POS] == 0 ||
395
1.47k
        qtable->quantval[Q03_POS] == 0 ||
396
1.47k
        qtable->quantval[Q12_POS] == 0 ||
397
1.46k
        qtable->quantval[Q21_POS] == 0 ||
398
1.46k
        qtable->quantval[Q30_POS] == 0)
399
97
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
1.41k
    coef_bits = cinfo->coef_bits[ci];
402
1.41k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
1.41k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
1.41k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
14.1k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
12.7k
      if (cinfo->input_scan_number > 1)
409
7.11k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
5.61k
      else
411
5.61k
        prev_coef_bits_latch[coefi] = -1;
412
12.7k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
12.7k
      if (coef_bits[coefi] != 0)
414
11.2k
        smoothing_useful = TRUE;
415
12.7k
    }
416
1.41k
    coef_bits_latch += SAVED_COEFS;
417
1.41k
    prev_coef_bits_latch += SAVED_COEFS;
418
1.41k
  }
419
420
451
  return smoothing_useful;
421
573
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
361
44
{
362
44
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
44
  boolean smoothing_useful = FALSE;
364
44
  int ci, coefi;
365
44
  jpeg_component_info *compptr;
366
44
  JQUANT_TBL *qtable;
367
44
  int *coef_bits, *prev_coef_bits;
368
44
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
44
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
1
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
43
  if (coef->coef_bits_latch == NULL)
375
43
    coef->coef_bits_latch = (int *)
376
43
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
43
                                  cinfo->num_components * 2 *
378
43
                                  (SAVED_COEFS * sizeof(int)));
379
43
  coef_bits_latch = coef->coef_bits_latch;
380
43
  prev_coef_bits_latch =
381
43
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
132
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
106
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
106
    if ((qtable = compptr->quant_table) == NULL)
387
4
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
102
    if (qtable->quantval[0] == 0 ||
390
100
        qtable->quantval[Q01_POS] == 0 ||
391
99
        qtable->quantval[Q10_POS] == 0 ||
392
98
        qtable->quantval[Q20_POS] == 0 ||
393
97
        qtable->quantval[Q11_POS] == 0 ||
394
96
        qtable->quantval[Q02_POS] == 0 ||
395
95
        qtable->quantval[Q03_POS] == 0 ||
396
94
        qtable->quantval[Q12_POS] == 0 ||
397
93
        qtable->quantval[Q21_POS] == 0 ||
398
90
        qtable->quantval[Q30_POS] == 0)
399
13
      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
234
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
567
      else
411
567
        prev_coef_bits_latch[coefi] = -1;
412
801
      coef_bits_latch[coefi] = coef_bits[coefi];
413
801
      if (coef_bits[coefi] != 0)
414
783
        smoothing_useful = TRUE;
415
801
    }
416
89
    coef_bits_latch += SAVED_COEFS;
417
89
    prev_coef_bits_latch += SAVED_COEFS;
418
89
  }
419
420
26
  return smoothing_useful;
421
43
}
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
136k
{
431
136k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
136k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
136k
  JDIMENSION block_num, last_block_column;
434
136k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
136k
    image_block_rows;
436
136k
  JBLOCKARRAY buffer;
437
136k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
136k
  JBLOCKROW next_block_row, next_next_block_row;
439
136k
  _JSAMPARRAY output_ptr;
440
136k
  JDIMENSION output_col;
441
136k
  jpeg_component_info *compptr;
442
136k
  _inverse_DCT_method_ptr inverse_DCT;
443
136k
  boolean change_dc;
444
136k
  JCOEF *workspace;
445
136k
  int *coef_bits;
446
136k
  JQUANT_TBL *quanttbl;
447
136k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
136k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
136k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
136k
      DC25;
451
136k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
136k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
136k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
136k
         !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
548k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
412k
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
412k
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
412k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
409k
      block_rows = compptr->v_samp_factor;
482
409k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
409k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
1.13k
      block_rows = compptr->v_samp_factor;
485
1.13k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
1.20k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
1.20k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
1.20k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
1.20k
      access_rows = block_rows; /* this iMCU row only */
491
1.20k
    }
492
    /* Align the virtual buffer for this component. */
493
412k
    if (cinfo->output_iMCU_row > 1) {
494
409k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
409k
      buffer = (*cinfo->mem->access_virt_barray)
496
409k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
409k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
409k
         (JDIMENSION)access_rows, FALSE);
499
409k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
409k
    } else if (cinfo->output_iMCU_row > 0) {
501
1.13k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
1.13k
      buffer = (*cinfo->mem->access_virt_barray)
503
1.13k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
1.13k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
1.13k
         (JDIMENSION)access_rows, FALSE);
506
1.13k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
1.20k
    } else {
508
1.20k
      buffer = (*cinfo->mem->access_virt_barray)
509
1.20k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
1.20k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
1.20k
    }
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
412k
    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
412k
    else
520
412k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
412k
    change_dc =
524
412k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
369k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
362k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
412k
    quanttbl = compptr->quant_table;
529
412k
    Q00 = quanttbl->quantval[0];
530
412k
    Q01 = quanttbl->quantval[Q01_POS];
531
412k
    Q10 = quanttbl->quantval[Q10_POS];
532
412k
    Q20 = quanttbl->quantval[Q20_POS];
533
412k
    Q11 = quanttbl->quantval[Q11_POS];
534
412k
    Q02 = quanttbl->quantval[Q02_POS];
535
412k
    if (change_dc) {
536
360k
      Q03 = quanttbl->quantval[Q03_POS];
537
360k
      Q12 = quanttbl->quantval[Q12_POS];
538
360k
      Q21 = quanttbl->quantval[Q21_POS];
539
360k
      Q30 = quanttbl->quantval[Q30_POS];
540
360k
    }
541
412k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
412k
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
412k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
1.12M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
711k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
711k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
711k
      if (image_block_row > 0)
550
709k
        prev_block_row =
551
709k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
1.20k
      else
553
1.20k
        prev_block_row = buffer_ptr;
554
555
711k
      if (image_block_row > 1)
556
708k
        prev_prev_block_row =
557
708k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
2.35k
      else
559
2.35k
        prev_prev_block_row = prev_block_row;
560
561
711k
      if (image_block_row < image_block_rows - 1)
562
709k
        next_block_row =
563
709k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
1.20k
      else
565
1.20k
        next_block_row = buffer_ptr;
566
567
711k
      if (image_block_row < image_block_rows - 2)
568
708k
        next_next_block_row =
569
708k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
2.29k
      else
571
2.29k
        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
711k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
711k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
711k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
711k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
711k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
711k
      output_col = 0;
582
711k
      last_block_column = compptr->width_in_blocks - 1;
583
711k
      for (block_num = cinfo->master->first_MCU_col[ci];
584
10.1M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
9.44M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
9.44M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
711k
            block_num < last_block_column) {
590
671k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
671k
          DC09 = DC10 = (int)prev_block_row[1][0];
592
671k
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
671k
          DC19 = DC20 = (int)next_block_row[1][0];
594
671k
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
671k
        }
596
9.44M
        if (block_num + 1 < last_block_column) {
597
8.06M
          DC05 = (int)prev_prev_block_row[2][0];
598
8.06M
          DC10 = (int)prev_block_row[2][0];
599
8.06M
          DC15 = (int)buffer_ptr[2][0];
600
8.06M
          DC20 = (int)next_block_row[2][0];
601
8.06M
          DC25 = (int)next_next_block_row[2][0];
602
8.06M
        }
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
9.44M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
9.26M
          num = Q00 * (change_dc ?
616
8.71M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
8.71M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
8.71M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
8.71M
                 DC21 - DC22 + DC24 + DC25) :
620
9.26M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
9.26M
          if (num >= 0) {
622
6.66M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
6.66M
            if (Al > 0 && pred >= (1 << Al))
624
3.62k
              pred = (1 << Al) - 1;
625
6.66M
          } else {
626
2.60M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
2.60M
            if (Al > 0 && pred >= (1 << Al))
628
4.34k
              pred = (1 << Al) - 1;
629
2.60M
            pred = -pred;
630
2.60M
          }
631
9.26M
          workspace[1] = (JCOEF)pred;
632
9.26M
        }
633
        /* AC10 */
634
9.44M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
9.31M
          num = Q00 * (change_dc ?
636
8.71M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
8.71M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
8.71M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
8.71M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
9.31M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
9.31M
          if (num >= 0) {
642
6.50M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
6.50M
            if (Al > 0 && pred >= (1 << Al))
644
141k
              pred = (1 << Al) - 1;
645
6.50M
          } else {
646
2.81M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
2.81M
            if (Al > 0 && pred >= (1 << Al))
648
145k
              pred = (1 << Al) - 1;
649
2.81M
            pred = -pred;
650
2.81M
          }
651
9.31M
          workspace[8] = (JCOEF)pred;
652
9.31M
        }
653
        /* AC20 */
654
9.44M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
9.29M
          num = Q00 * (change_dc ?
656
8.71M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
8.71M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
9.29M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
9.29M
          if (num >= 0) {
660
6.65M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
6.65M
            if (Al > 0 && pred >= (1 << Al))
662
24.0k
              pred = (1 << Al) - 1;
663
6.65M
          } else {
664
2.64M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
2.64M
            if (Al > 0 && pred >= (1 << Al))
666
23.0k
              pred = (1 << Al) - 1;
667
2.64M
            pred = -pred;
668
2.64M
          }
669
9.29M
          workspace[16] = (JCOEF)pred;
670
9.29M
        }
671
        /* AC11 */
672
9.44M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
9.28M
          num = Q00 * (change_dc ?
674
8.71M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
8.71M
                 9 * DC19 + DC21 - DC25) :
676
9.28M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
572k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
9.28M
          if (num >= 0) {
679
7.83M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
7.83M
            if (Al > 0 && pred >= (1 << Al))
681
41.4k
              pred = (1 << Al) - 1;
682
7.83M
          } else {
683
1.45M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
1.45M
            if (Al > 0 && pred >= (1 << Al))
685
40.2k
              pred = (1 << Al) - 1;
686
1.45M
            pred = -pred;
687
1.45M
          }
688
9.28M
          workspace[9] = (JCOEF)pred;
689
9.28M
        }
690
        /* AC02 */
691
9.44M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
9.34M
          num = Q00 * (change_dc ?
693
8.71M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
8.71M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
9.34M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
9.34M
          if (num >= 0) {
697
6.85M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
6.85M
            if (Al > 0 && pred >= (1 << Al))
699
22.7k
              pred = (1 << Al) - 1;
700
6.85M
          } else {
701
2.48M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
2.48M
            if (Al > 0 && pred >= (1 << Al))
703
23.1k
              pred = (1 << Al) - 1;
704
2.48M
            pred = -pred;
705
2.48M
          }
706
9.34M
          workspace[2] = (JCOEF)pred;
707
9.34M
        }
708
9.44M
        if (change_dc) {
709
          /* AC03 */
710
8.71M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
8.71M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
8.71M
            if (num >= 0) {
713
6.44M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
6.44M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
6.44M
            } else {
717
2.27M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
2.27M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
2.27M
              pred = -pred;
721
2.27M
            }
722
8.71M
            workspace[3] = (JCOEF)pred;
723
8.71M
          }
724
          /* AC12 */
725
8.71M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
8.71M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
8.71M
            if (num >= 0) {
728
6.41M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
6.41M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
6.41M
            } else {
732
2.30M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
2.30M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
2.30M
              pred = -pred;
736
2.30M
            }
737
8.71M
            workspace[10] = (JCOEF)pred;
738
8.71M
          }
739
          /* AC21 */
740
8.71M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
8.71M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
8.71M
            if (num >= 0) {
743
6.54M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
6.54M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
6.54M
            } else {
747
2.17M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
2.17M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
2.17M
              pred = -pred;
751
2.17M
            }
752
8.71M
            workspace[17] = (JCOEF)pred;
753
8.71M
          }
754
          /* AC30 */
755
8.71M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
8.71M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
8.71M
            if (num >= 0) {
758
6.29M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
6.29M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
6.29M
            } else {
762
2.41M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
2.41M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
2.41M
              pred = -pred;
766
2.41M
            }
767
8.71M
            workspace[24] = (JCOEF)pred;
768
8.71M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
8.71M
          num = Q00 *
773
8.71M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
8.71M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
8.71M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
8.71M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
8.71M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
8.71M
          if (num >= 0) {
779
5.18M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
5.18M
          } else {
781
3.53M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
3.53M
            pred = -pred;
783
3.53M
          }
784
8.71M
          workspace[0] = (JCOEF)pred;
785
8.71M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
9.44M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
9.44M
                        output_col);
790
        /* Advance for next column */
791
9.44M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
9.44M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
9.44M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
9.44M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
9.44M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
9.44M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
9.44M
          prev_prev_block_row++, next_next_block_row++;
798
9.44M
        output_col += compptr->_DCT_scaled_size;
799
9.44M
      }
800
711k
      output_ptr += compptr->_DCT_scaled_size;
801
711k
    }
802
412k
  }
803
804
136k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
136k
    return JPEG_ROW_COMPLETED;
806
401
  return JPEG_SCAN_COMPLETED;
807
136k
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
430
136k
{
431
136k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
136k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
136k
  JDIMENSION block_num, last_block_column;
434
136k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
136k
    image_block_rows;
436
136k
  JBLOCKARRAY buffer;
437
136k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
136k
  JBLOCKROW next_block_row, next_next_block_row;
439
136k
  _JSAMPARRAY output_ptr;
440
136k
  JDIMENSION output_col;
441
136k
  jpeg_component_info *compptr;
442
136k
  _inverse_DCT_method_ptr inverse_DCT;
443
136k
  boolean change_dc;
444
136k
  JCOEF *workspace;
445
136k
  int *coef_bits;
446
136k
  JQUANT_TBL *quanttbl;
447
136k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
136k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
136k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
136k
      DC25;
451
136k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
136k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
136k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
136k
         !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
548k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
412k
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
412k
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
412k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
409k
      block_rows = compptr->v_samp_factor;
482
409k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
409k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
1.13k
      block_rows = compptr->v_samp_factor;
485
1.13k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
1.20k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
1.20k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
1.20k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
1.20k
      access_rows = block_rows; /* this iMCU row only */
491
1.20k
    }
492
    /* Align the virtual buffer for this component. */
493
412k
    if (cinfo->output_iMCU_row > 1) {
494
409k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
409k
      buffer = (*cinfo->mem->access_virt_barray)
496
409k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
409k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
409k
         (JDIMENSION)access_rows, FALSE);
499
409k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
409k
    } else if (cinfo->output_iMCU_row > 0) {
501
1.13k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
1.13k
      buffer = (*cinfo->mem->access_virt_barray)
503
1.13k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
1.13k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
1.13k
         (JDIMENSION)access_rows, FALSE);
506
1.13k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
1.20k
    } else {
508
1.20k
      buffer = (*cinfo->mem->access_virt_barray)
509
1.20k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
1.20k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
1.20k
    }
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
412k
    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
412k
    else
520
412k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
412k
    change_dc =
524
412k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
369k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
362k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
412k
    quanttbl = compptr->quant_table;
529
412k
    Q00 = quanttbl->quantval[0];
530
412k
    Q01 = quanttbl->quantval[Q01_POS];
531
412k
    Q10 = quanttbl->quantval[Q10_POS];
532
412k
    Q20 = quanttbl->quantval[Q20_POS];
533
412k
    Q11 = quanttbl->quantval[Q11_POS];
534
412k
    Q02 = quanttbl->quantval[Q02_POS];
535
412k
    if (change_dc) {
536
360k
      Q03 = quanttbl->quantval[Q03_POS];
537
360k
      Q12 = quanttbl->quantval[Q12_POS];
538
360k
      Q21 = quanttbl->quantval[Q21_POS];
539
360k
      Q30 = quanttbl->quantval[Q30_POS];
540
360k
    }
541
412k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
412k
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
412k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
1.12M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
711k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
711k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
711k
      if (image_block_row > 0)
550
709k
        prev_block_row =
551
709k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
1.20k
      else
553
1.20k
        prev_block_row = buffer_ptr;
554
555
711k
      if (image_block_row > 1)
556
708k
        prev_prev_block_row =
557
708k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
2.35k
      else
559
2.35k
        prev_prev_block_row = prev_block_row;
560
561
711k
      if (image_block_row < image_block_rows - 1)
562
709k
        next_block_row =
563
709k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
1.20k
      else
565
1.20k
        next_block_row = buffer_ptr;
566
567
711k
      if (image_block_row < image_block_rows - 2)
568
708k
        next_next_block_row =
569
708k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
2.29k
      else
571
2.29k
        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
711k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
711k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
711k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
711k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
711k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
711k
      output_col = 0;
582
711k
      last_block_column = compptr->width_in_blocks - 1;
583
711k
      for (block_num = cinfo->master->first_MCU_col[ci];
584
10.1M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
9.44M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
9.44M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
711k
            block_num < last_block_column) {
590
671k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
671k
          DC09 = DC10 = (int)prev_block_row[1][0];
592
671k
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
671k
          DC19 = DC20 = (int)next_block_row[1][0];
594
671k
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
671k
        }
596
9.44M
        if (block_num + 1 < last_block_column) {
597
8.06M
          DC05 = (int)prev_prev_block_row[2][0];
598
8.06M
          DC10 = (int)prev_block_row[2][0];
599
8.06M
          DC15 = (int)buffer_ptr[2][0];
600
8.06M
          DC20 = (int)next_block_row[2][0];
601
8.06M
          DC25 = (int)next_next_block_row[2][0];
602
8.06M
        }
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
9.44M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
9.26M
          num = Q00 * (change_dc ?
616
8.71M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
8.71M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
8.71M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
8.71M
                 DC21 - DC22 + DC24 + DC25) :
620
9.26M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
9.26M
          if (num >= 0) {
622
6.66M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
6.66M
            if (Al > 0 && pred >= (1 << Al))
624
3.62k
              pred = (1 << Al) - 1;
625
6.66M
          } else {
626
2.60M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
2.60M
            if (Al > 0 && pred >= (1 << Al))
628
4.34k
              pred = (1 << Al) - 1;
629
2.60M
            pred = -pred;
630
2.60M
          }
631
9.26M
          workspace[1] = (JCOEF)pred;
632
9.26M
        }
633
        /* AC10 */
634
9.44M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
9.31M
          num = Q00 * (change_dc ?
636
8.71M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
8.71M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
8.71M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
8.71M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
9.31M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
9.31M
          if (num >= 0) {
642
6.50M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
6.50M
            if (Al > 0 && pred >= (1 << Al))
644
141k
              pred = (1 << Al) - 1;
645
6.50M
          } else {
646
2.81M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
2.81M
            if (Al > 0 && pred >= (1 << Al))
648
145k
              pred = (1 << Al) - 1;
649
2.81M
            pred = -pred;
650
2.81M
          }
651
9.31M
          workspace[8] = (JCOEF)pred;
652
9.31M
        }
653
        /* AC20 */
654
9.44M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
9.29M
          num = Q00 * (change_dc ?
656
8.71M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
8.71M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
9.29M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
9.29M
          if (num >= 0) {
660
6.65M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
6.65M
            if (Al > 0 && pred >= (1 << Al))
662
24.0k
              pred = (1 << Al) - 1;
663
6.65M
          } else {
664
2.64M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
2.64M
            if (Al > 0 && pred >= (1 << Al))
666
23.0k
              pred = (1 << Al) - 1;
667
2.64M
            pred = -pred;
668
2.64M
          }
669
9.29M
          workspace[16] = (JCOEF)pred;
670
9.29M
        }
671
        /* AC11 */
672
9.44M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
9.28M
          num = Q00 * (change_dc ?
674
8.71M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
8.71M
                 9 * DC19 + DC21 - DC25) :
676
9.28M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
572k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
9.28M
          if (num >= 0) {
679
7.83M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
7.83M
            if (Al > 0 && pred >= (1 << Al))
681
41.4k
              pred = (1 << Al) - 1;
682
7.83M
          } else {
683
1.45M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
1.45M
            if (Al > 0 && pred >= (1 << Al))
685
40.2k
              pred = (1 << Al) - 1;
686
1.45M
            pred = -pred;
687
1.45M
          }
688
9.28M
          workspace[9] = (JCOEF)pred;
689
9.28M
        }
690
        /* AC02 */
691
9.44M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
9.34M
          num = Q00 * (change_dc ?
693
8.71M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
8.71M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
9.34M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
9.34M
          if (num >= 0) {
697
6.85M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
6.85M
            if (Al > 0 && pred >= (1 << Al))
699
22.7k
              pred = (1 << Al) - 1;
700
6.85M
          } else {
701
2.48M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
2.48M
            if (Al > 0 && pred >= (1 << Al))
703
23.1k
              pred = (1 << Al) - 1;
704
2.48M
            pred = -pred;
705
2.48M
          }
706
9.34M
          workspace[2] = (JCOEF)pred;
707
9.34M
        }
708
9.44M
        if (change_dc) {
709
          /* AC03 */
710
8.71M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
8.71M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
8.71M
            if (num >= 0) {
713
6.44M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
6.44M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
6.44M
            } else {
717
2.27M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
2.27M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
2.27M
              pred = -pred;
721
2.27M
            }
722
8.71M
            workspace[3] = (JCOEF)pred;
723
8.71M
          }
724
          /* AC12 */
725
8.71M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
8.71M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
8.71M
            if (num >= 0) {
728
6.41M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
6.41M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
6.41M
            } else {
732
2.30M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
2.30M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
2.30M
              pred = -pred;
736
2.30M
            }
737
8.71M
            workspace[10] = (JCOEF)pred;
738
8.71M
          }
739
          /* AC21 */
740
8.71M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
8.71M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
8.71M
            if (num >= 0) {
743
6.54M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
6.54M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
6.54M
            } else {
747
2.17M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
2.17M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
2.17M
              pred = -pred;
751
2.17M
            }
752
8.71M
            workspace[17] = (JCOEF)pred;
753
8.71M
          }
754
          /* AC30 */
755
8.71M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
8.71M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
8.71M
            if (num >= 0) {
758
6.29M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
6.29M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
6.29M
            } else {
762
2.41M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
2.41M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
2.41M
              pred = -pred;
766
2.41M
            }
767
8.71M
            workspace[24] = (JCOEF)pred;
768
8.71M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
8.71M
          num = Q00 *
773
8.71M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
8.71M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
8.71M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
8.71M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
8.71M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
8.71M
          if (num >= 0) {
779
5.18M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
5.18M
          } else {
781
3.53M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
3.53M
            pred = -pred;
783
3.53M
          }
784
8.71M
          workspace[0] = (JCOEF)pred;
785
8.71M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
9.44M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
9.44M
                        output_col);
790
        /* Advance for next column */
791
9.44M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
9.44M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
9.44M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
9.44M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
9.44M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
9.44M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
9.44M
          prev_prev_block_row++, next_next_block_row++;
798
9.44M
        output_col += compptr->_DCT_scaled_size;
799
9.44M
      }
800
711k
      output_ptr += compptr->_DCT_scaled_size;
801
711k
    }
802
412k
  }
803
804
136k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
136k
    return JPEG_ROW_COMPLETED;
806
401
  return JPEG_SCAN_COMPLETED;
807
136k
}
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.01k
{
819
4.01k
  my_coef_ptr coef;
820
821
4.01k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
4.01k
  coef = (my_coef_ptr)
825
4.01k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
4.01k
                                sizeof(my_coef_controller));
827
4.01k
  memset(coef, 0, sizeof(my_coef_controller));
828
4.01k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
4.01k
  coef->pub.start_input_pass = start_input_pass;
830
4.01k
  coef->pub.start_output_pass = start_output_pass;
831
4.01k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
4.01k
  coef->coef_bits_latch = NULL;
833
4.01k
#endif
834
835
  /* Create the coefficient buffer. */
836
4.01k
  if (need_full_buffer) {
837
2.18k
#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.18k
    int ci, access_rows;
842
2.18k
    jpeg_component_info *compptr;
843
844
8.74k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
6.56k
         ci++, compptr++) {
846
6.56k
      access_rows = compptr->v_samp_factor;
847
6.56k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
6.56k
      if (cinfo->progressive_mode)
850
6.52k
        access_rows *= 5;
851
6.56k
#endif
852
6.56k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
6.56k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
6.56k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
6.56k
                               (long)compptr->h_samp_factor),
856
6.56k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
6.56k
                               (long)compptr->v_samp_factor),
858
6.56k
         (JDIMENSION)access_rows);
859
6.56k
    }
860
2.18k
    coef->pub.consume_data = consume_data;
861
2.18k
    coef->pub._decompress_data = decompress_data;
862
2.18k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
2.18k
  } else {
867
    /* We only need a single-MCU buffer. */
868
1.82k
    JBLOCKROW buffer;
869
1.82k
    int i;
870
871
1.82k
    buffer = (JBLOCKROW)
872
1.82k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
1.82k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
20.0k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
18.2k
      coef->MCU_buffer[i] = buffer + i;
876
18.2k
    }
877
1.82k
    coef->pub.consume_data = dummy_consume_data;
878
1.82k
    coef->pub._decompress_data = decompress_onepass;
879
1.82k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
1.82k
  }
881
882
  /* Allocate the workspace buffer */
883
4.01k
  coef->workspace = (JCOEF *)
884
4.01k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
4.01k
                                sizeof(JCOEF) * DCTSIZE2);
886
4.01k
}
jinit_d_coef_controller
Line
Count
Source
818
3.55k
{
819
3.55k
  my_coef_ptr coef;
820
821
3.55k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
3.55k
  coef = (my_coef_ptr)
825
3.55k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
3.55k
                                sizeof(my_coef_controller));
827
3.55k
  memset(coef, 0, sizeof(my_coef_controller));
828
3.55k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
3.55k
  coef->pub.start_input_pass = start_input_pass;
830
3.55k
  coef->pub.start_output_pass = start_output_pass;
831
3.55k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
3.55k
  coef->coef_bits_latch = NULL;
833
3.55k
#endif
834
835
  /* Create the coefficient buffer. */
836
3.55k
  if (need_full_buffer) {
837
1.74k
#ifdef D_MULTISCAN_FILES_SUPPORTED
838
    /* Allocate a full-image virtual array for each component, */
839
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
840
    /* Note we ask for a pre-zeroed array. */
841
1.74k
    int ci, access_rows;
842
1.74k
    jpeg_component_info *compptr;
843
844
6.96k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
5.22k
         ci++, compptr++) {
846
5.22k
      access_rows = compptr->v_samp_factor;
847
5.22k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
5.22k
      if (cinfo->progressive_mode)
850
5.20k
        access_rows *= 5;
851
5.22k
#endif
852
5.22k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
5.22k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
5.22k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
5.22k
                               (long)compptr->h_samp_factor),
856
5.22k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
5.22k
                               (long)compptr->v_samp_factor),
858
5.22k
         (JDIMENSION)access_rows);
859
5.22k
    }
860
1.74k
    coef->pub.consume_data = consume_data;
861
1.74k
    coef->pub._decompress_data = decompress_data;
862
1.74k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
1.81k
  } else {
867
    /* We only need a single-MCU buffer. */
868
1.81k
    JBLOCKROW buffer;
869
1.81k
    int i;
870
871
1.81k
    buffer = (JBLOCKROW)
872
1.81k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
1.81k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
19.9k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
18.1k
      coef->MCU_buffer[i] = buffer + i;
876
18.1k
    }
877
1.81k
    coef->pub.consume_data = dummy_consume_data;
878
1.81k
    coef->pub._decompress_data = decompress_onepass;
879
1.81k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
1.81k
  }
881
882
  /* Allocate the workspace buffer */
883
3.55k
  coef->workspace = (JCOEF *)
884
3.55k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
3.55k
                                sizeof(JCOEF) * DCTSIZE2);
886
3.55k
}
j12init_d_coef_controller
Line
Count
Source
818
459
{
819
459
  my_coef_ptr coef;
820
821
459
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
459
  coef = (my_coef_ptr)
825
459
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
459
                                sizeof(my_coef_controller));
827
459
  memset(coef, 0, sizeof(my_coef_controller));
828
459
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
459
  coef->pub.start_input_pass = start_input_pass;
830
459
  coef->pub.start_output_pass = start_output_pass;
831
459
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
459
  coef->coef_bits_latch = NULL;
833
459
#endif
834
835
  /* Create the coefficient buffer. */
836
459
  if (need_full_buffer) {
837
444
#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
444
    int ci, access_rows;
842
444
    jpeg_component_info *compptr;
843
844
1.78k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
1.33k
         ci++, compptr++) {
846
1.33k
      access_rows = compptr->v_samp_factor;
847
1.33k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
1.33k
      if (cinfo->progressive_mode)
850
1.32k
        access_rows *= 5;
851
1.33k
#endif
852
1.33k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
1.33k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
1.33k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
1.33k
                               (long)compptr->h_samp_factor),
856
1.33k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
1.33k
                               (long)compptr->v_samp_factor),
858
1.33k
         (JDIMENSION)access_rows);
859
1.33k
    }
860
444
    coef->pub.consume_data = consume_data;
861
444
    coef->pub._decompress_data = decompress_data;
862
444
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
444
  } else {
867
    /* We only need a single-MCU buffer. */
868
15
    JBLOCKROW buffer;
869
15
    int i;
870
871
15
    buffer = (JBLOCKROW)
872
15
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
15
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
165
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
150
      coef->MCU_buffer[i] = buffer + i;
876
150
    }
877
15
    coef->pub.consume_data = dummy_consume_data;
878
15
    coef->pub._decompress_data = decompress_onepass;
879
15
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
15
  }
881
882
  /* Allocate the workspace buffer */
883
459
  coef->workspace = (JCOEF *)
884
459
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
459
                                sizeof(JCOEF) * DCTSIZE2);
886
459
}