Coverage Report

Created: 2025-11-09 06:19

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.6k
{
48
14.6k
  cinfo->input_iMCU_row = 0;
49
14.6k
  start_iMCU_row(cinfo);
50
14.6k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
47
13.0k
{
48
13.0k
  cinfo->input_iMCU_row = 0;
49
13.0k
  start_iMCU_row(cinfo);
50
13.0k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
47
1.55k
{
48
1.55k
  cinfo->input_iMCU_row = 0;
49
1.55k
  start_iMCU_row(cinfo);
50
1.55k
}
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.15k
{
60
4.15k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
4.15k
  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.15k
  if (coef->pub.coef_arrays != NULL) {
65
2.22k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.06k
      coef->pub._decompress_data = decompress_smooth_data;
67
1.15k
    else
68
1.15k
      coef->pub._decompress_data = decompress_data;
69
2.22k
  }
70
4.15k
#endif
71
4.15k
  cinfo->output_iMCU_row = 0;
72
4.15k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
59
3.98k
{
60
3.98k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
3.98k
  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.98k
  if (coef->pub.coef_arrays != NULL) {
65
2.05k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.03k
      coef->pub._decompress_data = decompress_smooth_data;
67
1.01k
    else
68
1.01k
      coef->pub._decompress_data = decompress_data;
69
2.05k
  }
70
3.98k
#endif
71
3.98k
  cinfo->output_iMCU_row = 0;
72
3.98k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
59
174
{
60
174
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
174
  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
174
  if (coef->pub.coef_arrays != NULL) {
65
163
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
30
      coef->pub._decompress_data = decompress_smooth_data;
67
133
    else
68
133
      coef->pub._decompress_data = decompress_data;
69
163
  }
70
174
#endif
71
174
  cinfo->output_iMCU_row = 0;
72
174
}
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
231k
{
88
231k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
231k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
231k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
231k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
231k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
231k
  _JSAMPARRAY output_ptr;
94
231k
  JDIMENSION start_col, output_col;
95
231k
  jpeg_component_info *compptr;
96
231k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
465k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
233k
       yoffset++) {
101
3.32M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
3.09M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
3.09M
      jzero_far((void *)coef->MCU_buffer[0],
105
3.09M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
3.09M
      if (!cinfo->entropy->insufficient_data)
107
3.09M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
3.09M
      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.09M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
3.09M
          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.09M
        blkn = 0;               /* index of current DCT block within MCU */
126
14.1M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
11.0M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
11.0M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
11.0M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
11.0M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
10.1M
                         compptr->MCU_width : compptr->last_col_width;
136
11.0M
          output_ptr = output_buf[compptr->component_index] +
137
11.0M
                       yoffset * compptr->_DCT_scaled_size;
138
11.0M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
11.0M
                      compptr->MCU_sample_width;
140
22.9M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
11.9M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
11.9M
                yoffset + yindex < compptr->last_row_height) {
143
11.9M
              output_col = start_col;
144
24.2M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
12.3M
                (*inverse_DCT) (cinfo, compptr,
146
12.3M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
12.3M
                                output_ptr, output_col);
148
12.3M
                output_col += compptr->_DCT_scaled_size;
149
12.3M
              }
150
11.9M
            }
151
11.9M
            blkn += compptr->MCU_width;
152
11.9M
            output_ptr += compptr->_DCT_scaled_size;
153
11.9M
          }
154
11.0M
        }
155
3.09M
      }
156
3.09M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
233k
    coef->MCU_ctr = 0;
159
233k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
231k
  cinfo->output_iMCU_row++;
162
231k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
229k
    start_iMCU_row(cinfo);
164
229k
    return JPEG_ROW_COMPLETED;
165
229k
  }
166
  /* Completed the scan */
167
1.92k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
1.92k
  return JPEG_SCAN_COMPLETED;
169
231k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
87
231k
{
88
231k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
231k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
231k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
231k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
231k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
231k
  _JSAMPARRAY output_ptr;
94
231k
  JDIMENSION start_col, output_col;
95
231k
  jpeg_component_info *compptr;
96
231k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
465k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
233k
       yoffset++) {
101
3.32M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
3.09M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
3.09M
      jzero_far((void *)coef->MCU_buffer[0],
105
3.09M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
3.09M
      if (!cinfo->entropy->insufficient_data)
107
3.09M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
3.09M
      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.09M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
3.09M
          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.09M
        blkn = 0;               /* index of current DCT block within MCU */
126
14.1M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
11.0M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
11.0M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
11.0M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
11.0M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
10.1M
                         compptr->MCU_width : compptr->last_col_width;
136
11.0M
          output_ptr = output_buf[compptr->component_index] +
137
11.0M
                       yoffset * compptr->_DCT_scaled_size;
138
11.0M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
11.0M
                      compptr->MCU_sample_width;
140
22.9M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
11.9M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
11.9M
                yoffset + yindex < compptr->last_row_height) {
143
11.9M
              output_col = start_col;
144
24.2M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
12.3M
                (*inverse_DCT) (cinfo, compptr,
146
12.3M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
12.3M
                                output_ptr, output_col);
148
12.3M
                output_col += compptr->_DCT_scaled_size;
149
12.3M
              }
150
11.9M
            }
151
11.9M
            blkn += compptr->MCU_width;
152
11.9M
            output_ptr += compptr->_DCT_scaled_size;
153
11.9M
          }
154
11.0M
        }
155
3.09M
      }
156
3.09M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
233k
    coef->MCU_ctr = 0;
159
233k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
231k
  cinfo->output_iMCU_row++;
162
231k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
229k
    start_iMCU_row(cinfo);
164
229k
    return JPEG_ROW_COMPLETED;
165
229k
  }
166
  /* Completed the scan */
167
1.92k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
1.92k
  return JPEG_SCAN_COMPLETED;
169
231k
}
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
3.93M
{
195
3.93M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
3.93M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
3.93M
  int blkn, ci, xindex, yindex, yoffset;
198
3.93M
  JDIMENSION start_col;
199
3.93M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
3.93M
  JBLOCKROW buffer_ptr;
201
3.93M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
11.3M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
7.45M
    compptr = cinfo->cur_comp_info[ci];
206
7.45M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
7.45M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
7.45M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
7.45M
       (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
7.45M
  }
215
216
  /* Loop to process one whole iMCU row */
217
10.6M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
6.69M
       yoffset++) {
219
63.2M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
56.5M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
56.5M
      blkn = 0;                 /* index of current DCT block within MCU */
223
131M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
74.9M
        compptr = cinfo->cur_comp_info[ci];
225
74.9M
        start_col = MCU_col_num * compptr->MCU_width;
226
161M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
86.6M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
178M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
92.0M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
92.0M
          }
231
86.6M
        }
232
74.9M
      }
233
56.5M
      if (!cinfo->entropy->insufficient_data)
234
56.5M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
56.5M
      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
56.5M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
6.69M
    coef->MCU_ctr = 0;
245
6.69M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
3.93M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
3.92M
    start_iMCU_row(cinfo);
249
3.92M
    return JPEG_ROW_COMPLETED;
250
3.92M
  }
251
  /* Completed the scan */
252
12.6k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
12.6k
  return JPEG_SCAN_COMPLETED;
254
3.93M
}
jdcoefct-8.c:consume_data
Line
Count
Source
194
2.74M
{
195
2.74M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
2.74M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
2.74M
  int blkn, ci, xindex, yindex, yoffset;
198
2.74M
  JDIMENSION start_col;
199
2.74M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
2.74M
  JBLOCKROW buffer_ptr;
201
2.74M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
5.84M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
3.09M
    compptr = cinfo->cur_comp_info[ci];
206
3.09M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
3.09M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
3.09M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
3.09M
       (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.09M
  }
215
216
  /* Loop to process one whole iMCU row */
217
8.10M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
5.35M
       yoffset++) {
219
55.8M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
50.4M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
50.4M
      blkn = 0;                 /* index of current DCT block within MCU */
223
106M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
55.9M
        compptr = cinfo->cur_comp_info[ci];
225
55.9M
        start_col = MCU_col_num * compptr->MCU_width;
226
114M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
58.9M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
120M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
61.6M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
61.6M
          }
231
58.9M
        }
232
55.9M
      }
233
50.4M
      if (!cinfo->entropy->insufficient_data)
234
50.4M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
50.4M
      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
50.4M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
5.35M
    coef->MCU_ctr = 0;
245
5.35M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
2.74M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
2.73M
    start_iMCU_row(cinfo);
249
2.73M
    return JPEG_ROW_COMPLETED;
250
2.73M
  }
251
  /* Completed the scan */
252
11.1k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
11.1k
  return JPEG_SCAN_COMPLETED;
254
2.74M
}
jdcoefct-12.c:consume_data
Line
Count
Source
194
1.19M
{
195
1.19M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
1.19M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
1.19M
  int blkn, ci, xindex, yindex, yoffset;
198
1.19M
  JDIMENSION start_col;
199
1.19M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
1.19M
  JBLOCKROW buffer_ptr;
201
1.19M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
5.54M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
4.35M
    compptr = cinfo->cur_comp_info[ci];
206
4.35M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
4.35M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
4.35M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
4.35M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
210
    /* Note: entropy decoder expects buffer to be zeroed,
211
     * but this is handled automatically by the memory manager
212
     * because we requested a pre-zeroed array.
213
     */
214
4.35M
  }
215
216
  /* Loop to process one whole iMCU row */
217
2.52M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
1.33M
       yoffset++) {
219
7.38M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
6.04M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
6.04M
      blkn = 0;                 /* index of current DCT block within MCU */
223
25.0M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
19.0M
        compptr = cinfo->cur_comp_info[ci];
225
19.0M
        start_col = MCU_col_num * compptr->MCU_width;
226
46.6M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
27.6M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
57.9M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
30.3M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
30.3M
          }
231
27.6M
        }
232
19.0M
      }
233
6.04M
      if (!cinfo->entropy->insufficient_data)
234
6.04M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
6.04M
      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
6.04M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
1.33M
    coef->MCU_ctr = 0;
245
1.33M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
1.19M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
1.19M
    start_iMCU_row(cinfo);
249
1.19M
    return JPEG_ROW_COMPLETED;
250
1.19M
  }
251
  /* Completed the scan */
252
1.54k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
1.54k
  return JPEG_SCAN_COMPLETED;
254
1.19M
}
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
274k
{
268
274k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
274k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
274k
  JDIMENSION block_num;
271
274k
  int ci, block_row, block_rows;
272
274k
  JBLOCKARRAY buffer;
273
274k
  JBLOCKROW buffer_ptr;
274
274k
  _JSAMPARRAY output_ptr;
275
274k
  JDIMENSION output_col;
276
274k
  jpeg_component_info *compptr;
277
274k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
274k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
274k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
274k
          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
610k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
335k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
335k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
335k
    buffer = (*cinfo->mem->access_virt_barray)
295
335k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
335k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
335k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
335k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
332k
      block_rows = compptr->v_samp_factor;
301
2.73k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
2.73k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
2.73k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
2.73k
    }
306
335k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
335k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
973k
    for (block_row = 0; block_row < block_rows; block_row++) {
310
637k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
637k
      output_col = 0;
312
637k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
8.21M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
7.58M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
7.58M
                        output_col);
316
7.58M
        buffer_ptr++;
317
7.58M
        output_col += compptr->_DCT_scaled_size;
318
7.58M
      }
319
637k
      output_ptr += compptr->_DCT_scaled_size;
320
637k
    }
321
335k
  }
322
323
274k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
273k
    return JPEG_ROW_COMPLETED;
325
1.01k
  return JPEG_SCAN_COMPLETED;
326
274k
}
jdcoefct-8.c:decompress_data
Line
Count
Source
267
274k
{
268
274k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
274k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
274k
  JDIMENSION block_num;
271
274k
  int ci, block_row, block_rows;
272
274k
  JBLOCKARRAY buffer;
273
274k
  JBLOCKROW buffer_ptr;
274
274k
  _JSAMPARRAY output_ptr;
275
274k
  JDIMENSION output_col;
276
274k
  jpeg_component_info *compptr;
277
274k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
274k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
274k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
274k
          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
610k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
335k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
335k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
335k
    buffer = (*cinfo->mem->access_virt_barray)
295
335k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
335k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
335k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
335k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
332k
      block_rows = compptr->v_samp_factor;
301
2.73k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
2.73k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
2.73k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
2.73k
    }
306
335k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
335k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
973k
    for (block_row = 0; block_row < block_rows; block_row++) {
310
637k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
637k
      output_col = 0;
312
637k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
8.21M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
7.58M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
7.58M
                        output_col);
316
7.58M
        buffer_ptr++;
317
7.58M
        output_col += compptr->_DCT_scaled_size;
318
7.58M
      }
319
637k
      output_ptr += compptr->_DCT_scaled_size;
320
637k
    }
321
335k
  }
322
323
274k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
273k
    return JPEG_ROW_COMPLETED;
325
1.01k
  return JPEG_SCAN_COMPLETED;
326
274k
}
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.17M
#define Q01_POS  1
342
1.17M
#define Q10_POS  8
343
1.17M
#define Q20_POS  16
344
1.17M
#define Q11_POS  9
345
1.17M
#define Q02_POS  2
346
713k
#define Q03_POS  3
347
713k
#define Q12_POS  10
348
713k
#define Q21_POS  17
349
713k
#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.22k
{
362
2.22k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
2.22k
  boolean smoothing_useful = FALSE;
364
2.22k
  int ci, coefi;
365
2.22k
  jpeg_component_info *compptr;
366
2.22k
  JQUANT_TBL *qtable;
367
2.22k
  int *coef_bits, *prev_coef_bits;
368
2.22k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
2.22k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
38
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
2.18k
  if (coef->coef_bits_latch == NULL)
375
2.18k
    coef->coef_bits_latch = (int *)
376
2.18k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
2.18k
                                  cinfo->num_components * 2 *
378
2.18k
                                  (SAVED_COEFS * sizeof(int)));
379
2.18k
  coef_bits_latch = coef->coef_bits_latch;
380
2.18k
  prev_coef_bits_latch =
381
2.18k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
5.97k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
4.26k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
4.26k
    if ((qtable = compptr->quant_table) == NULL)
387
53
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
4.21k
    if (qtable->quantval[0] == 0 ||
390
4.15k
        qtable->quantval[Q01_POS] == 0 ||
391
4.13k
        qtable->quantval[Q10_POS] == 0 ||
392
4.07k
        qtable->quantval[Q20_POS] == 0 ||
393
4.02k
        qtable->quantval[Q11_POS] == 0 ||
394
3.92k
        qtable->quantval[Q02_POS] == 0 ||
395
3.90k
        qtable->quantval[Q03_POS] == 0 ||
396
3.88k
        qtable->quantval[Q12_POS] == 0 ||
397
3.85k
        qtable->quantval[Q21_POS] == 0 ||
398
3.82k
        qtable->quantval[Q30_POS] == 0)
399
421
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
3.79k
    coef_bits = cinfo->coef_bits[ci];
402
3.79k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
3.79k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
3.79k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
37.9k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
34.1k
      if (cinfo->input_scan_number > 1)
409
21.7k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
12.4k
      else
411
12.4k
        prev_coef_bits_latch[coefi] = -1;
412
34.1k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
34.1k
      if (coef_bits[coefi] != 0)
414
17.2k
        smoothing_useful = TRUE;
415
34.1k
    }
416
3.79k
    coef_bits_latch += SAVED_COEFS;
417
3.79k
    prev_coef_bits_latch += SAVED_COEFS;
418
3.79k
  }
419
420
1.70k
  return smoothing_useful;
421
2.18k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
361
2.05k
{
362
2.05k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
2.05k
  boolean smoothing_useful = FALSE;
364
2.05k
  int ci, coefi;
365
2.05k
  jpeg_component_info *compptr;
366
2.05k
  JQUANT_TBL *qtable;
367
2.05k
  int *coef_bits, *prev_coef_bits;
368
2.05k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
2.05k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
22
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
2.03k
  if (coef->coef_bits_latch == NULL)
375
2.03k
    coef->coef_bits_latch = (int *)
376
2.03k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
2.03k
                                  cinfo->num_components * 2 *
378
2.03k
                                  (SAVED_COEFS * sizeof(int)));
379
2.03k
  coef_bits_latch = coef->coef_bits_latch;
380
2.03k
  prev_coef_bits_latch =
381
2.03k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
5.73k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
4.06k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
4.06k
    if ((qtable = compptr->quant_table) == NULL)
387
52
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
4.01k
    if (qtable->quantval[0] == 0 ||
390
3.95k
        qtable->quantval[Q01_POS] == 0 ||
391
3.94k
        qtable->quantval[Q10_POS] == 0 ||
392
3.92k
        qtable->quantval[Q20_POS] == 0 ||
393
3.87k
        qtable->quantval[Q11_POS] == 0 ||
394
3.79k
        qtable->quantval[Q02_POS] == 0 ||
395
3.78k
        qtable->quantval[Q03_POS] == 0 ||
396
3.76k
        qtable->quantval[Q12_POS] == 0 ||
397
3.74k
        qtable->quantval[Q21_POS] == 0 ||
398
3.72k
        qtable->quantval[Q30_POS] == 0)
399
312
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
3.69k
    coef_bits = cinfo->coef_bits[ci];
402
3.69k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
3.69k
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
3.69k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
36.9k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
33.2k
      if (cinfo->input_scan_number > 1)
409
21.4k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
11.8k
      else
411
11.8k
        prev_coef_bits_latch[coefi] = -1;
412
33.2k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
33.2k
      if (coef_bits[coefi] != 0)
414
16.5k
        smoothing_useful = TRUE;
415
33.2k
    }
416
3.69k
    coef_bits_latch += SAVED_COEFS;
417
3.69k
    prev_coef_bits_latch += SAVED_COEFS;
418
3.69k
  }
419
420
1.67k
  return smoothing_useful;
421
2.03k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
361
163
{
362
163
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
163
  boolean smoothing_useful = FALSE;
364
163
  int ci, coefi;
365
163
  jpeg_component_info *compptr;
366
163
  JQUANT_TBL *qtable;
367
163
  int *coef_bits, *prev_coef_bits;
368
163
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
163
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
16
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
147
  if (coef->coef_bits_latch == NULL)
375
147
    coef->coef_bits_latch = (int *)
376
147
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
147
                                  cinfo->num_components * 2 *
378
147
                                  (SAVED_COEFS * sizeof(int)));
379
147
  coef_bits_latch = coef->coef_bits_latch;
380
147
  prev_coef_bits_latch =
381
147
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
241
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
204
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
204
    if ((qtable = compptr->quant_table) == NULL)
387
1
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
203
    if (qtable->quantval[0] == 0 ||
390
194
        qtable->quantval[Q01_POS] == 0 ||
391
188
        qtable->quantval[Q10_POS] == 0 ||
392
155
        qtable->quantval[Q20_POS] == 0 ||
393
143
        qtable->quantval[Q11_POS] == 0 ||
394
131
        qtable->quantval[Q02_POS] == 0 ||
395
126
        qtable->quantval[Q03_POS] == 0 ||
396
120
        qtable->quantval[Q12_POS] == 0 ||
397
110
        qtable->quantval[Q21_POS] == 0 ||
398
104
        qtable->quantval[Q30_POS] == 0)
399
109
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
94
    coef_bits = cinfo->coef_bits[ci];
402
94
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
94
    if (coef_bits[0] < 0)
404
0
      return FALSE;
405
94
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
940
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
846
      if (cinfo->input_scan_number > 1)
409
261
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
585
      else
411
585
        prev_coef_bits_latch[coefi] = -1;
412
846
      coef_bits_latch[coefi] = coef_bits[coefi];
413
846
      if (coef_bits[coefi] != 0)
414
763
        smoothing_useful = TRUE;
415
846
    }
416
94
    coef_bits_latch += SAVED_COEFS;
417
94
    prev_coef_bits_latch += SAVED_COEFS;
418
94
  }
419
420
37
  return smoothing_useful;
421
147
}
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.08M
{
431
1.08M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
1.08M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
1.08M
  JDIMENSION block_num, last_block_column;
434
1.08M
  int ci, block_row, block_rows, access_rows, image_block_row,
435
1.08M
    image_block_rows;
436
1.08M
  JBLOCKARRAY buffer;
437
1.08M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
1.08M
  JBLOCKROW next_block_row, next_next_block_row;
439
1.08M
  _JSAMPARRAY output_ptr;
440
1.08M
  JDIMENSION output_col;
441
1.08M
  jpeg_component_info *compptr;
442
1.08M
  _inverse_DCT_method_ptr inverse_DCT;
443
1.08M
  boolean change_dc;
444
1.08M
  JCOEF *workspace;
445
1.08M
  int *coef_bits;
446
1.08M
  JQUANT_TBL *quanttbl;
447
1.08M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
1.08M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
1.08M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
1.08M
      DC25;
451
1.08M
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
1.08M
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
1.08M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
1.08M
         !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.24M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
1.16M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
1.16M
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
1.16M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
1.16M
      block_rows = compptr->v_samp_factor;
482
1.16M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
1.16M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
1.72k
      block_rows = compptr->v_samp_factor;
485
1.72k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
1.83k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
1.83k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
1.83k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
1.83k
      access_rows = block_rows; /* this iMCU row only */
491
1.83k
    }
492
    /* Align the virtual buffer for this component. */
493
1.16M
    if (cinfo->output_iMCU_row > 1) {
494
1.16M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
1.16M
      buffer = (*cinfo->mem->access_virt_barray)
496
1.16M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
1.16M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
1.16M
         (JDIMENSION)access_rows, FALSE);
499
1.16M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
1.16M
    } else if (cinfo->output_iMCU_row > 0) {
501
1.72k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
1.72k
      buffer = (*cinfo->mem->access_virt_barray)
503
1.72k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
1.72k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
1.72k
         (JDIMENSION)access_rows, FALSE);
506
1.72k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
1.83k
    } else {
508
1.83k
      buffer = (*cinfo->mem->access_virt_barray)
509
1.83k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
1.83k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
1.83k
    }
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.16M
    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.16M
    else
520
1.16M
      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.16M
    change_dc =
524
1.16M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
749k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
723k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
1.16M
    quanttbl = compptr->quant_table;
529
1.16M
    Q00 = quanttbl->quantval[0];
530
1.16M
    Q01 = quanttbl->quantval[Q01_POS];
531
1.16M
    Q10 = quanttbl->quantval[Q10_POS];
532
1.16M
    Q20 = quanttbl->quantval[Q20_POS];
533
1.16M
    Q11 = quanttbl->quantval[Q11_POS];
534
1.16M
    Q02 = quanttbl->quantval[Q02_POS];
535
1.16M
    if (change_dc) {
536
709k
      Q03 = quanttbl->quantval[Q03_POS];
537
709k
      Q12 = quanttbl->quantval[Q12_POS];
538
709k
      Q21 = quanttbl->quantval[Q21_POS];
539
709k
      Q30 = quanttbl->quantval[Q30_POS];
540
709k
    }
541
1.16M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
1.16M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
1.16M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
3.41M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
2.24M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
2.24M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
2.24M
      if (image_block_row > 0)
550
2.24M
        prev_block_row =
551
2.24M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
1.83k
      else
553
1.83k
        prev_block_row = buffer_ptr;
554
555
2.24M
      if (image_block_row > 1)
556
2.24M
        prev_prev_block_row =
557
2.24M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
3.73k
      else
559
3.73k
        prev_prev_block_row = prev_block_row;
560
561
2.24M
      if (image_block_row < image_block_rows - 1)
562
2.24M
        next_block_row =
563
2.24M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
1.83k
      else
565
1.83k
        next_block_row = buffer_ptr;
566
567
2.24M
      if (image_block_row < image_block_rows - 2)
568
2.24M
        next_next_block_row =
569
2.24M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
2.96k
      else
571
2.96k
        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.24M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
2.24M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
2.24M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
2.24M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
2.24M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
2.24M
      output_col = 0;
582
2.24M
      last_block_column = compptr->width_in_blocks - 1;
583
2.24M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
25.7M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
23.4M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
23.4M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
2.24M
            block_num < last_block_column) {
590
2.07M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
2.07M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
2.07M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
2.07M
          DC19 = DC20 = (int)next_block_row[1][0];
594
2.07M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
2.07M
        }
596
23.4M
        if (block_num + 1 < last_block_column) {
597
19.1M
          DC05 = (int)prev_prev_block_row[2][0];
598
19.1M
          DC10 = (int)prev_block_row[2][0];
599
19.1M
          DC15 = (int)buffer_ptr[2][0];
600
19.1M
          DC20 = (int)next_block_row[2][0];
601
19.1M
          DC25 = (int)next_next_block_row[2][0];
602
19.1M
        }
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
23.4M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
22.2M
          num = Q00 * (change_dc ?
616
16.1M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
16.1M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
16.1M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
16.1M
                 DC21 - DC22 + DC24 + DC25) :
620
22.2M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
22.2M
          if (num >= 0) {
622
13.7M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
13.7M
            if (Al > 0 && pred >= (1 << Al))
624
495k
              pred = (1 << Al) - 1;
625
13.7M
          } else {
626
8.52M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
8.52M
            if (Al > 0 && pred >= (1 << Al))
628
941k
              pred = (1 << Al) - 1;
629
8.52M
            pred = -pred;
630
8.52M
          }
631
22.2M
          workspace[1] = (JCOEF)pred;
632
22.2M
        }
633
        /* AC10 */
634
23.4M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
22.7M
          num = Q00 * (change_dc ?
636
16.1M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
16.1M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
16.1M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
16.1M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
22.7M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
22.7M
          if (num >= 0) {
642
14.1M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
14.1M
            if (Al > 0 && pred >= (1 << Al))
644
1.54M
              pred = (1 << Al) - 1;
645
14.1M
          } else {
646
8.55M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
8.55M
            if (Al > 0 && pred >= (1 << Al))
648
1.44M
              pred = (1 << Al) - 1;
649
8.55M
            pred = -pred;
650
8.55M
          }
651
22.7M
          workspace[8] = (JCOEF)pred;
652
22.7M
        }
653
        /* AC20 */
654
23.4M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
22.8M
          num = Q00 * (change_dc ?
656
16.1M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
16.1M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
22.8M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
22.8M
          if (num >= 0) {
660
13.5M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
13.5M
            if (Al > 0 && pred >= (1 << Al))
662
888k
              pred = (1 << Al) - 1;
663
13.5M
          } else {
664
9.26M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
9.26M
            if (Al > 0 && pred >= (1 << Al))
666
892k
              pred = (1 << Al) - 1;
667
9.26M
            pred = -pred;
668
9.26M
          }
669
22.8M
          workspace[16] = (JCOEF)pred;
670
22.8M
        }
671
        /* AC11 */
672
23.4M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
22.8M
          num = Q00 * (change_dc ?
674
16.1M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
16.1M
                 9 * DC19 + DC21 - DC25) :
676
22.8M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
6.76M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
22.8M
          if (num >= 0) {
679
16.7M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
16.7M
            if (Al > 0 && pred >= (1 << Al))
681
588k
              pred = (1 << Al) - 1;
682
16.7M
          } else {
683
6.09M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
6.09M
            if (Al > 0 && pred >= (1 << Al))
685
586k
              pred = (1 << Al) - 1;
686
6.09M
            pred = -pred;
687
6.09M
          }
688
22.8M
          workspace[9] = (JCOEF)pred;
689
22.8M
        }
690
        /* AC02 */
691
23.4M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
22.0M
          num = Q00 * (change_dc ?
693
16.1M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
16.1M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
22.0M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
22.0M
          if (num >= 0) {
697
13.0M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
13.0M
            if (Al > 0 && pred >= (1 << Al))
699
154k
              pred = (1 << Al) - 1;
700
13.0M
          } else {
701
9.08M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
9.08M
            if (Al > 0 && pred >= (1 << Al))
703
150k
              pred = (1 << Al) - 1;
704
9.08M
            pred = -pred;
705
9.08M
          }
706
22.0M
          workspace[2] = (JCOEF)pred;
707
22.0M
        }
708
23.4M
        if (change_dc) {
709
          /* AC03 */
710
16.1M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
16.1M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
16.1M
            if (num >= 0) {
713
10.3M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
10.3M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
10.3M
            } else {
717
5.78M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
5.78M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
5.78M
              pred = -pred;
721
5.78M
            }
722
16.1M
            workspace[3] = (JCOEF)pred;
723
16.1M
          }
724
          /* AC12 */
725
16.1M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
16.1M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
16.1M
            if (num >= 0) {
728
7.76M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
7.76M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
8.35M
            } else {
732
8.35M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
8.35M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
8.35M
              pred = -pred;
736
8.35M
            }
737
16.1M
            workspace[10] = (JCOEF)pred;
738
16.1M
          }
739
          /* AC21 */
740
16.1M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
16.1M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
16.1M
            if (num >= 0) {
743
8.09M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
8.09M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
8.09M
            } else {
747
8.02M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
8.02M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
8.02M
              pred = -pred;
751
8.02M
            }
752
16.1M
            workspace[17] = (JCOEF)pred;
753
16.1M
          }
754
          /* AC30 */
755
16.1M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
16.1M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
16.1M
            if (num >= 0) {
758
10.1M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
10.1M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
10.1M
            } else {
762
5.94M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
5.94M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
5.94M
              pred = -pred;
766
5.94M
            }
767
16.1M
            workspace[24] = (JCOEF)pred;
768
16.1M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
16.1M
          num = Q00 *
773
16.1M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
16.1M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
16.1M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
16.1M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
16.1M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
16.1M
          if (num >= 0) {
779
6.98M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
9.13M
          } else {
781
9.13M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
9.13M
            pred = -pred;
783
9.13M
          }
784
16.1M
          workspace[0] = (JCOEF)pred;
785
16.1M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
23.4M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
23.4M
                        output_col);
790
        /* Advance for next column */
791
23.4M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
23.4M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
23.4M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
23.4M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
23.4M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
23.4M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
23.4M
          prev_prev_block_row++, next_next_block_row++;
798
23.4M
        output_col += compptr->_DCT_scaled_size;
799
23.4M
      }
800
2.24M
      output_ptr += compptr->_DCT_scaled_size;
801
2.24M
    }
802
1.16M
  }
803
804
1.08M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
1.08M
    return JPEG_ROW_COMPLETED;
806
1.03k
  return JPEG_SCAN_COMPLETED;
807
1.08M
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
430
1.08M
{
431
1.08M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
1.08M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
1.08M
  JDIMENSION block_num, last_block_column;
434
1.08M
  int ci, block_row, block_rows, access_rows, image_block_row,
435
1.08M
    image_block_rows;
436
1.08M
  JBLOCKARRAY buffer;
437
1.08M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
1.08M
  JBLOCKROW next_block_row, next_next_block_row;
439
1.08M
  _JSAMPARRAY output_ptr;
440
1.08M
  JDIMENSION output_col;
441
1.08M
  jpeg_component_info *compptr;
442
1.08M
  _inverse_DCT_method_ptr inverse_DCT;
443
1.08M
  boolean change_dc;
444
1.08M
  JCOEF *workspace;
445
1.08M
  int *coef_bits;
446
1.08M
  JQUANT_TBL *quanttbl;
447
1.08M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
1.08M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
1.08M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
1.08M
      DC25;
451
1.08M
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
1.08M
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
1.08M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
1.08M
         !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.24M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
1.16M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
1.16M
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
1.16M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
1.16M
      block_rows = compptr->v_samp_factor;
482
1.16M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
1.16M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
1.72k
      block_rows = compptr->v_samp_factor;
485
1.72k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
1.83k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
1.83k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
1.83k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
1.83k
      access_rows = block_rows; /* this iMCU row only */
491
1.83k
    }
492
    /* Align the virtual buffer for this component. */
493
1.16M
    if (cinfo->output_iMCU_row > 1) {
494
1.16M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
1.16M
      buffer = (*cinfo->mem->access_virt_barray)
496
1.16M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
1.16M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
1.16M
         (JDIMENSION)access_rows, FALSE);
499
1.16M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
1.16M
    } else if (cinfo->output_iMCU_row > 0) {
501
1.72k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
1.72k
      buffer = (*cinfo->mem->access_virt_barray)
503
1.72k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
1.72k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
1.72k
         (JDIMENSION)access_rows, FALSE);
506
1.72k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
1.83k
    } else {
508
1.83k
      buffer = (*cinfo->mem->access_virt_barray)
509
1.83k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
1.83k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
1.83k
    }
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.16M
    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.16M
    else
520
1.16M
      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.16M
    change_dc =
524
1.16M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
749k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
723k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
1.16M
    quanttbl = compptr->quant_table;
529
1.16M
    Q00 = quanttbl->quantval[0];
530
1.16M
    Q01 = quanttbl->quantval[Q01_POS];
531
1.16M
    Q10 = quanttbl->quantval[Q10_POS];
532
1.16M
    Q20 = quanttbl->quantval[Q20_POS];
533
1.16M
    Q11 = quanttbl->quantval[Q11_POS];
534
1.16M
    Q02 = quanttbl->quantval[Q02_POS];
535
1.16M
    if (change_dc) {
536
709k
      Q03 = quanttbl->quantval[Q03_POS];
537
709k
      Q12 = quanttbl->quantval[Q12_POS];
538
709k
      Q21 = quanttbl->quantval[Q21_POS];
539
709k
      Q30 = quanttbl->quantval[Q30_POS];
540
709k
    }
541
1.16M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
1.16M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
1.16M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
3.41M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
2.24M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
2.24M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
2.24M
      if (image_block_row > 0)
550
2.24M
        prev_block_row =
551
2.24M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
1.83k
      else
553
1.83k
        prev_block_row = buffer_ptr;
554
555
2.24M
      if (image_block_row > 1)
556
2.24M
        prev_prev_block_row =
557
2.24M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
3.73k
      else
559
3.73k
        prev_prev_block_row = prev_block_row;
560
561
2.24M
      if (image_block_row < image_block_rows - 1)
562
2.24M
        next_block_row =
563
2.24M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
1.83k
      else
565
1.83k
        next_block_row = buffer_ptr;
566
567
2.24M
      if (image_block_row < image_block_rows - 2)
568
2.24M
        next_next_block_row =
569
2.24M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
2.96k
      else
571
2.96k
        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.24M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
2.24M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
2.24M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
2.24M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
2.24M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
2.24M
      output_col = 0;
582
2.24M
      last_block_column = compptr->width_in_blocks - 1;
583
2.24M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
25.7M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
23.4M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
23.4M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
2.24M
            block_num < last_block_column) {
590
2.07M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
2.07M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
2.07M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
2.07M
          DC19 = DC20 = (int)next_block_row[1][0];
594
2.07M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
2.07M
        }
596
23.4M
        if (block_num + 1 < last_block_column) {
597
19.1M
          DC05 = (int)prev_prev_block_row[2][0];
598
19.1M
          DC10 = (int)prev_block_row[2][0];
599
19.1M
          DC15 = (int)buffer_ptr[2][0];
600
19.1M
          DC20 = (int)next_block_row[2][0];
601
19.1M
          DC25 = (int)next_next_block_row[2][0];
602
19.1M
        }
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
23.4M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
22.2M
          num = Q00 * (change_dc ?
616
16.1M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
16.1M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
16.1M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
16.1M
                 DC21 - DC22 + DC24 + DC25) :
620
22.2M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
22.2M
          if (num >= 0) {
622
13.7M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
13.7M
            if (Al > 0 && pred >= (1 << Al))
624
495k
              pred = (1 << Al) - 1;
625
13.7M
          } else {
626
8.52M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
8.52M
            if (Al > 0 && pred >= (1 << Al))
628
941k
              pred = (1 << Al) - 1;
629
8.52M
            pred = -pred;
630
8.52M
          }
631
22.2M
          workspace[1] = (JCOEF)pred;
632
22.2M
        }
633
        /* AC10 */
634
23.4M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
22.7M
          num = Q00 * (change_dc ?
636
16.1M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
16.1M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
16.1M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
16.1M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
22.7M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
22.7M
          if (num >= 0) {
642
14.1M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
14.1M
            if (Al > 0 && pred >= (1 << Al))
644
1.54M
              pred = (1 << Al) - 1;
645
14.1M
          } else {
646
8.55M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
8.55M
            if (Al > 0 && pred >= (1 << Al))
648
1.44M
              pred = (1 << Al) - 1;
649
8.55M
            pred = -pred;
650
8.55M
          }
651
22.7M
          workspace[8] = (JCOEF)pred;
652
22.7M
        }
653
        /* AC20 */
654
23.4M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
22.8M
          num = Q00 * (change_dc ?
656
16.1M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
16.1M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
22.8M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
22.8M
          if (num >= 0) {
660
13.5M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
13.5M
            if (Al > 0 && pred >= (1 << Al))
662
888k
              pred = (1 << Al) - 1;
663
13.5M
          } else {
664
9.26M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
9.26M
            if (Al > 0 && pred >= (1 << Al))
666
892k
              pred = (1 << Al) - 1;
667
9.26M
            pred = -pred;
668
9.26M
          }
669
22.8M
          workspace[16] = (JCOEF)pred;
670
22.8M
        }
671
        /* AC11 */
672
23.4M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
22.8M
          num = Q00 * (change_dc ?
674
16.1M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
16.1M
                 9 * DC19 + DC21 - DC25) :
676
22.8M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
6.76M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
22.8M
          if (num >= 0) {
679
16.7M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
16.7M
            if (Al > 0 && pred >= (1 << Al))
681
588k
              pred = (1 << Al) - 1;
682
16.7M
          } else {
683
6.09M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
6.09M
            if (Al > 0 && pred >= (1 << Al))
685
586k
              pred = (1 << Al) - 1;
686
6.09M
            pred = -pred;
687
6.09M
          }
688
22.8M
          workspace[9] = (JCOEF)pred;
689
22.8M
        }
690
        /* AC02 */
691
23.4M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
22.0M
          num = Q00 * (change_dc ?
693
16.1M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
16.1M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
22.0M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
22.0M
          if (num >= 0) {
697
13.0M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
13.0M
            if (Al > 0 && pred >= (1 << Al))
699
154k
              pred = (1 << Al) - 1;
700
13.0M
          } else {
701
9.08M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
9.08M
            if (Al > 0 && pred >= (1 << Al))
703
150k
              pred = (1 << Al) - 1;
704
9.08M
            pred = -pred;
705
9.08M
          }
706
22.0M
          workspace[2] = (JCOEF)pred;
707
22.0M
        }
708
23.4M
        if (change_dc) {
709
          /* AC03 */
710
16.1M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
16.1M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
16.1M
            if (num >= 0) {
713
10.3M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
10.3M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
10.3M
            } else {
717
5.78M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
5.78M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
5.78M
              pred = -pred;
721
5.78M
            }
722
16.1M
            workspace[3] = (JCOEF)pred;
723
16.1M
          }
724
          /* AC12 */
725
16.1M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
16.1M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
16.1M
            if (num >= 0) {
728
7.76M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
7.76M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
8.35M
            } else {
732
8.35M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
8.35M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
8.35M
              pred = -pred;
736
8.35M
            }
737
16.1M
            workspace[10] = (JCOEF)pred;
738
16.1M
          }
739
          /* AC21 */
740
16.1M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
16.1M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
16.1M
            if (num >= 0) {
743
8.09M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
8.09M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
8.09M
            } else {
747
8.02M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
8.02M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
8.02M
              pred = -pred;
751
8.02M
            }
752
16.1M
            workspace[17] = (JCOEF)pred;
753
16.1M
          }
754
          /* AC30 */
755
16.1M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
16.1M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
16.1M
            if (num >= 0) {
758
10.1M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
10.1M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
10.1M
            } else {
762
5.94M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
5.94M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
5.94M
              pred = -pred;
766
5.94M
            }
767
16.1M
            workspace[24] = (JCOEF)pred;
768
16.1M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
16.1M
          num = Q00 *
773
16.1M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
16.1M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
16.1M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
16.1M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
16.1M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
16.1M
          if (num >= 0) {
779
6.98M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
9.13M
          } else {
781
9.13M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
9.13M
            pred = -pred;
783
9.13M
          }
784
16.1M
          workspace[0] = (JCOEF)pred;
785
16.1M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
23.4M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
23.4M
                        output_col);
790
        /* Advance for next column */
791
23.4M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
23.4M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
23.4M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
23.4M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
23.4M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
23.4M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
23.4M
          prev_prev_block_row++, next_next_block_row++;
798
23.4M
        output_col += compptr->_DCT_scaled_size;
799
23.4M
      }
800
2.24M
      output_ptr += compptr->_DCT_scaled_size;
801
2.24M
    }
802
1.16M
  }
803
804
1.08M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
1.08M
    return JPEG_ROW_COMPLETED;
806
1.03k
  return JPEG_SCAN_COMPLETED;
807
1.08M
}
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.37k
{
819
5.37k
  my_coef_ptr coef;
820
821
5.37k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
5.37k
  coef = (my_coef_ptr)
825
5.37k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
5.37k
                                sizeof(my_coef_controller));
827
5.37k
  memset(coef, 0, sizeof(my_coef_controller));
828
5.37k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
5.37k
  coef->pub.start_input_pass = start_input_pass;
830
5.37k
  coef->pub.start_output_pass = start_output_pass;
831
5.37k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
5.37k
  coef->coef_bits_latch = NULL;
833
5.37k
#endif
834
835
  /* Create the coefficient buffer. */
836
5.37k
  if (need_full_buffer) {
837
3.28k
#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.28k
    int ci, access_rows;
842
3.28k
    jpeg_component_info *compptr;
843
844
11.1k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
7.84k
         ci++, compptr++) {
846
7.84k
      access_rows = compptr->v_samp_factor;
847
7.84k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
7.84k
      if (cinfo->progressive_mode)
850
7.58k
        access_rows *= 5;
851
7.84k
#endif
852
7.84k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
7.84k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
7.84k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
7.84k
                               (long)compptr->h_samp_factor),
856
7.84k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
7.84k
                               (long)compptr->v_samp_factor),
858
7.84k
         (JDIMENSION)access_rows);
859
7.84k
    }
860
3.28k
    coef->pub.consume_data = consume_data;
861
3.28k
    coef->pub._decompress_data = decompress_data;
862
3.28k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
3.28k
  } else {
867
    /* We only need a single-MCU buffer. */
868
2.08k
    JBLOCKROW buffer;
869
2.08k
    int i;
870
871
2.08k
    buffer = (JBLOCKROW)
872
2.08k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
2.08k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
22.9k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
20.8k
      coef->MCU_buffer[i] = buffer + i;
876
20.8k
    }
877
2.08k
    coef->pub.consume_data = dummy_consume_data;
878
2.08k
    coef->pub._decompress_data = decompress_onepass;
879
2.08k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
2.08k
  }
881
882
  /* Allocate the workspace buffer */
883
5.37k
  coef->workspace = (JCOEF *)
884
5.37k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
5.37k
                                sizeof(JCOEF) * DCTSIZE2);
886
5.37k
}
jinit_d_coef_controller
Line
Count
Source
818
4.71k
{
819
4.71k
  my_coef_ptr coef;
820
821
4.71k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
4.71k
  coef = (my_coef_ptr)
825
4.71k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
4.71k
                                sizeof(my_coef_controller));
827
4.71k
  memset(coef, 0, sizeof(my_coef_controller));
828
4.71k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
4.71k
  coef->pub.start_input_pass = start_input_pass;
830
4.71k
  coef->pub.start_output_pass = start_output_pass;
831
4.71k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
4.71k
  coef->coef_bits_latch = NULL;
833
4.71k
#endif
834
835
  /* Create the coefficient buffer. */
836
4.71k
  if (need_full_buffer) {
837
2.65k
#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.65k
    int ci, access_rows;
842
2.65k
    jpeg_component_info *compptr;
843
844
8.70k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
6.04k
         ci++, compptr++) {
846
6.04k
      access_rows = compptr->v_samp_factor;
847
6.04k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
6.04k
      if (cinfo->progressive_mode)
850
5.95k
        access_rows *= 5;
851
6.04k
#endif
852
6.04k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
6.04k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
6.04k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
6.04k
                               (long)compptr->h_samp_factor),
856
6.04k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
6.04k
                               (long)compptr->v_samp_factor),
858
6.04k
         (JDIMENSION)access_rows);
859
6.04k
    }
860
2.65k
    coef->pub.consume_data = consume_data;
861
2.65k
    coef->pub._decompress_data = decompress_data;
862
2.65k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
2.65k
  } else {
867
    /* We only need a single-MCU buffer. */
868
2.05k
    JBLOCKROW buffer;
869
2.05k
    int i;
870
871
2.05k
    buffer = (JBLOCKROW)
872
2.05k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
2.05k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
22.6k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
20.5k
      coef->MCU_buffer[i] = buffer + i;
876
20.5k
    }
877
2.05k
    coef->pub.consume_data = dummy_consume_data;
878
2.05k
    coef->pub._decompress_data = decompress_onepass;
879
2.05k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
2.05k
  }
881
882
  /* Allocate the workspace buffer */
883
4.71k
  coef->workspace = (JCOEF *)
884
4.71k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
4.71k
                                sizeof(JCOEF) * DCTSIZE2);
886
4.71k
}
j12init_d_coef_controller
Line
Count
Source
818
660
{
819
660
  my_coef_ptr coef;
820
821
660
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
660
  coef = (my_coef_ptr)
825
660
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
660
                                sizeof(my_coef_controller));
827
660
  memset(coef, 0, sizeof(my_coef_controller));
828
660
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
660
  coef->pub.start_input_pass = start_input_pass;
830
660
  coef->pub.start_output_pass = start_output_pass;
831
660
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
660
  coef->coef_bits_latch = NULL;
833
660
#endif
834
835
  /* Create the coefficient buffer. */
836
660
  if (need_full_buffer) {
837
631
#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
631
    int ci, access_rows;
842
631
    jpeg_component_info *compptr;
843
844
2.42k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
1.79k
         ci++, compptr++) {
846
1.79k
      access_rows = compptr->v_samp_factor;
847
1.79k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
1.79k
      if (cinfo->progressive_mode)
850
1.62k
        access_rows *= 5;
851
1.79k
#endif
852
1.79k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
1.79k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
1.79k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
1.79k
                               (long)compptr->h_samp_factor),
856
1.79k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
1.79k
                               (long)compptr->v_samp_factor),
858
1.79k
         (JDIMENSION)access_rows);
859
1.79k
    }
860
631
    coef->pub.consume_data = consume_data;
861
631
    coef->pub._decompress_data = decompress_data;
862
631
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
631
  } else {
867
    /* We only need a single-MCU buffer. */
868
29
    JBLOCKROW buffer;
869
29
    int i;
870
871
29
    buffer = (JBLOCKROW)
872
29
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
29
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
319
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
290
      coef->MCU_buffer[i] = buffer + i;
876
290
    }
877
29
    coef->pub.consume_data = dummy_consume_data;
878
29
    coef->pub._decompress_data = decompress_onepass;
879
29
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
29
  }
881
882
  /* Allocate the workspace buffer */
883
660
  coef->workspace = (JCOEF *)
884
660
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
660
                                sizeof(JCOEF) * DCTSIZE2);
886
660
}