Coverage Report

Created: 2025-11-16 09:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/workdir/UnpackedTarball/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
69.4k
{
48
69.4k
  cinfo->input_iMCU_row = 0;
49
69.4k
  start_iMCU_row(cinfo);
50
69.4k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
28.2k
{
60
28.2k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
28.2k
  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
28.2k
  if (coef->pub.coef_arrays != NULL) {
65
10.1k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.46k
      coef->pub._decompress_data = decompress_smooth_data;
67
8.71k
    else
68
8.71k
      coef->pub._decompress_data = decompress_data;
69
10.1k
  }
70
28.2k
#endif
71
28.2k
  cinfo->output_iMCU_row = 0;
72
28.2k
}
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
2.91M
{
88
2.91M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
2.91M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
2.91M
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
2.91M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
2.91M
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
2.91M
  _JSAMPARRAY output_ptr;
94
2.91M
  JDIMENSION start_col, output_col;
95
2.91M
  jpeg_component_info *compptr;
96
2.91M
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
6.07M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
3.16M
       yoffset++) {
101
48.1M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
44.9M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
44.9M
      jzero_far((void *)coef->MCU_buffer[0],
105
44.9M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
44.9M
      if (!cinfo->entropy->insufficient_data)
107
3.94M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
44.9M
      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
44.9M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
44.9M
          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
44.9M
        blkn = 0;               /* index of current DCT block within MCU */
126
105M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
60.0M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
60.0M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
60.0M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
60.0M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
52.3M
                         compptr->MCU_width : compptr->last_col_width;
136
60.0M
          output_ptr = output_buf[compptr->component_index] +
137
60.0M
                       yoffset * compptr->_DCT_scaled_size;
138
60.0M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
60.0M
                      compptr->MCU_sample_width;
140
125M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
65.3M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
65.2M
                yoffset + yindex < compptr->last_row_height) {
143
65.2M
              output_col = start_col;
144
135M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
70.3M
                (*inverse_DCT) (cinfo, compptr,
146
70.3M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
70.3M
                                output_ptr, output_col);
148
70.3M
                output_col += compptr->_DCT_scaled_size;
149
70.3M
              }
150
65.2M
            }
151
65.3M
            blkn += compptr->MCU_width;
152
65.3M
            output_ptr += compptr->_DCT_scaled_size;
153
65.3M
          }
154
60.0M
        }
155
44.9M
      }
156
44.9M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
3.16M
    coef->MCU_ctr = 0;
159
3.16M
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
2.91M
  cinfo->output_iMCU_row++;
162
2.91M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
2.89M
    start_iMCU_row(cinfo);
164
2.89M
    return JPEG_ROW_COMPLETED;
165
2.89M
  }
166
  /* Completed the scan */
167
18.0k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
18.0k
  return JPEG_SCAN_COMPLETED;
169
2.91M
}
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
}
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
24.0M
{
195
24.0M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
24.0M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
24.0M
  int blkn, ci, xindex, yindex, yoffset;
198
24.0M
  JDIMENSION start_col;
199
24.0M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
24.0M
  JBLOCKROW buffer_ptr;
201
24.0M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
69.3M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
45.3M
    compptr = cinfo->cur_comp_info[ci];
206
45.3M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
45.3M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
45.3M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
45.3M
       (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
45.3M
  }
215
216
  /* Loop to process one whole iMCU row */
217
53.1M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
29.1M
       yoffset++) {
219
131M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
102M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
102M
      blkn = 0;                 /* index of current DCT block within MCU */
223
238M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
136M
        compptr = cinfo->cur_comp_info[ci];
225
136M
        start_col = MCU_col_num * compptr->MCU_width;
226
282M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
146M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
334M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
187M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
187M
          }
231
146M
        }
232
136M
      }
233
102M
      if (!cinfo->entropy->insufficient_data)
234
77.6M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
102M
      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
102M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
29.1M
    coef->MCU_ctr = 0;
245
29.1M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
24.0M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
23.9M
    start_iMCU_row(cinfo);
249
23.9M
    return JPEG_ROW_COMPLETED;
250
23.9M
  }
251
  /* Completed the scan */
252
51.4k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
51.4k
  return JPEG_SCAN_COMPLETED;
254
24.0M
}
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
6.83M
{
268
6.83M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
6.83M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
6.83M
  JDIMENSION block_num;
271
6.83M
  int ci, block_row, block_rows;
272
6.83M
  JBLOCKARRAY buffer;
273
6.83M
  JBLOCKROW buffer_ptr;
274
6.83M
  _JSAMPARRAY output_ptr;
275
6.83M
  JDIMENSION output_col;
276
6.83M
  jpeg_component_info *compptr;
277
6.83M
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
6.83M
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
6.83M
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
6.83M
          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
26.4M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
19.5M
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
19.5M
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
19.5M
    buffer = (*cinfo->mem->access_virt_barray)
295
19.5M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
19.5M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
19.5M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
19.5M
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
19.5M
      block_rows = compptr->v_samp_factor;
301
25.0k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
25.0k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
25.0k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
25.0k
    }
306
19.5M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
19.5M
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
42.1M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
22.5M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
22.5M
      output_col = 0;
312
22.5M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
67.5M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
44.9M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
44.9M
                        output_col);
316
44.9M
        buffer_ptr++;
317
44.9M
        output_col += compptr->_DCT_scaled_size;
318
44.9M
      }
319
22.5M
      output_ptr += compptr->_DCT_scaled_size;
320
22.5M
    }
321
19.5M
  }
322
323
6.83M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
6.83M
    return JPEG_ROW_COMPLETED;
325
8.70k
  return JPEG_SCAN_COMPLETED;
326
6.83M
}
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
2.39M
#define Q01_POS  1
342
2.39M
#define Q10_POS  8
343
2.39M
#define Q20_POS  16
344
2.39M
#define Q11_POS  9
345
2.39M
#define Q02_POS  2
346
1.68M
#define Q03_POS  3
347
1.68M
#define Q12_POS  10
348
1.68M
#define Q21_POS  17
349
1.68M
#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
10.1k
{
362
10.1k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
10.1k
  boolean smoothing_useful = FALSE;
364
10.1k
  int ci, coefi;
365
10.1k
  jpeg_component_info *compptr;
366
10.1k
  JQUANT_TBL *qtable;
367
10.1k
  int *coef_bits, *prev_coef_bits;
368
10.1k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
10.1k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
4.40k
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
5.78k
  if (coef->coef_bits_latch == NULL)
375
5.78k
    coef->coef_bits_latch = (int *)
376
5.78k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
5.78k
                                  cinfo->num_components * 2 *
378
5.78k
                                  (SAVED_COEFS * sizeof(int)));
379
5.78k
  coef_bits_latch = coef->coef_bits_latch;
380
5.78k
  prev_coef_bits_latch =
381
5.78k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
10.9k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
9.48k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
9.48k
    if ((qtable = compptr->quant_table) == NULL)
387
760
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
8.72k
    if (qtable->quantval[0] == 0 ||
390
7.73k
        qtable->quantval[Q01_POS] == 0 ||
391
7.59k
        qtable->quantval[Q10_POS] == 0 ||
392
7.29k
        qtable->quantval[Q20_POS] == 0 ||
393
6.95k
        qtable->quantval[Q11_POS] == 0 ||
394
6.63k
        qtable->quantval[Q02_POS] == 0 ||
395
6.52k
        qtable->quantval[Q03_POS] == 0 ||
396
6.34k
        qtable->quantval[Q12_POS] == 0 ||
397
5.94k
        qtable->quantval[Q21_POS] == 0 ||
398
5.62k
        qtable->quantval[Q30_POS] == 0)
399
3.21k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
5.51k
    coef_bits = cinfo->coef_bits[ci];
402
5.51k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
5.51k
    if (coef_bits[0] < 0)
404
308
      return FALSE;
405
5.20k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
52.0k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
46.8k
      if (cinfo->input_scan_number > 1)
409
35.5k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
11.3k
      else
411
11.3k
        prev_coef_bits_latch[coefi] = -1;
412
46.8k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
46.8k
      if (coef_bits[coefi] != 0)
414
41.1k
        smoothing_useful = TRUE;
415
46.8k
    }
416
5.20k
    coef_bits_latch += SAVED_COEFS;
417
5.20k
    prev_coef_bits_latch += SAVED_COEFS;
418
5.20k
  }
419
420
1.50k
  return smoothing_useful;
421
5.78k
}
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
936k
{
431
936k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
936k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
936k
  JDIMENSION block_num, last_block_column;
434
936k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
936k
    image_block_rows;
436
936k
  JBLOCKARRAY buffer;
437
936k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
936k
  JBLOCKROW next_block_row, next_next_block_row;
439
936k
  _JSAMPARRAY output_ptr;
440
936k
  JDIMENSION output_col;
441
936k
  jpeg_component_info *compptr;
442
936k
  _inverse_DCT_method_ptr inverse_DCT;
443
936k
  boolean change_dc;
444
936k
  JCOEF *workspace;
445
936k
  int *coef_bits;
446
936k
  JQUANT_TBL *quanttbl;
447
936k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
936k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
936k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
936k
      DC25;
451
936k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
936k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
936k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
936k
         !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
3.32M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
2.38M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
2.38M
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
2.38M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
2.37M
      block_rows = compptr->v_samp_factor;
482
2.37M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
2.37M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
3.37k
      block_rows = compptr->v_samp_factor;
485
3.37k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
3.58k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
3.58k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
3.58k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
3.58k
      access_rows = block_rows; /* this iMCU row only */
491
3.58k
    }
492
    /* Align the virtual buffer for this component. */
493
2.38M
    if (cinfo->output_iMCU_row > 1) {
494
2.37M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
2.37M
      buffer = (*cinfo->mem->access_virt_barray)
496
2.37M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
2.37M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
2.37M
         (JDIMENSION)access_rows, FALSE);
499
2.37M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
2.37M
    } else if (cinfo->output_iMCU_row > 0) {
501
3.37k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
3.37k
      buffer = (*cinfo->mem->access_virt_barray)
503
3.37k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
3.37k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
3.37k
         (JDIMENSION)access_rows, FALSE);
506
3.37k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
3.58k
    } else {
508
3.58k
      buffer = (*cinfo->mem->access_virt_barray)
509
3.58k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
3.58k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
3.58k
    }
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
2.38M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
339k
      coef_bits =
518
339k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
2.04M
    else
520
2.04M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
2.38M
    change_dc =
524
2.38M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
1.70M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
1.68M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
2.38M
    quanttbl = compptr->quant_table;
529
2.38M
    Q00 = quanttbl->quantval[0];
530
2.38M
    Q01 = quanttbl->quantval[Q01_POS];
531
2.38M
    Q10 = quanttbl->quantval[Q10_POS];
532
2.38M
    Q20 = quanttbl->quantval[Q20_POS];
533
2.38M
    Q11 = quanttbl->quantval[Q11_POS];
534
2.38M
    Q02 = quanttbl->quantval[Q02_POS];
535
2.38M
    if (change_dc) {
536
1.68M
      Q03 = quanttbl->quantval[Q03_POS];
537
1.68M
      Q12 = quanttbl->quantval[Q12_POS];
538
1.68M
      Q21 = quanttbl->quantval[Q21_POS];
539
1.68M
      Q30 = quanttbl->quantval[Q30_POS];
540
1.68M
    }
541
2.38M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
2.38M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
2.38M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
5.31M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
2.93M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
2.93M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
2.93M
      if (image_block_row > 0)
550
2.92M
        prev_block_row =
551
2.92M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
3.58k
      else
553
3.58k
        prev_block_row = buffer_ptr;
554
555
2.93M
      if (image_block_row > 1)
556
2.92M
        prev_prev_block_row =
557
2.92M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
7.00k
      else
559
7.00k
        prev_prev_block_row = prev_block_row;
560
561
2.93M
      if (image_block_row < image_block_rows - 1)
562
2.92M
        next_block_row =
563
2.92M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
3.58k
      else
565
3.58k
        next_block_row = buffer_ptr;
566
567
2.93M
      if (image_block_row < image_block_rows - 2)
568
2.92M
        next_next_block_row =
569
2.92M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
6.72k
      else
571
6.72k
        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.93M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
2.93M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
2.93M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
2.93M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
2.93M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
2.93M
      output_col = 0;
582
2.93M
      last_block_column = compptr->width_in_blocks - 1;
583
2.93M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
20.1M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
17.1M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
17.1M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
2.93M
            block_num < last_block_column) {
590
934k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
934k
          DC09 = DC10 = (int)prev_block_row[1][0];
592
934k
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
934k
          DC19 = DC20 = (int)next_block_row[1][0];
594
934k
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
934k
        }
596
17.1M
        if (block_num + 1 < last_block_column) {
597
13.3M
          DC05 = (int)prev_prev_block_row[2][0];
598
13.3M
          DC10 = (int)prev_block_row[2][0];
599
13.3M
          DC15 = (int)buffer_ptr[2][0];
600
13.3M
          DC20 = (int)next_block_row[2][0];
601
13.3M
          DC25 = (int)next_next_block_row[2][0];
602
13.3M
        }
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
17.1M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
15.6M
          num = Q00 * (change_dc ?
616
11.6M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
11.6M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
11.6M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
11.6M
                 DC21 - DC22 + DC24 + DC25) :
620
15.6M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
15.6M
          if (num >= 0) {
622
11.8M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
11.8M
            if (Al > 0 && pred >= (1 << Al))
624
564k
              pred = (1 << Al) - 1;
625
11.8M
          } else {
626
3.72M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
3.72M
            if (Al > 0 && pred >= (1 << Al))
628
744k
              pred = (1 << Al) - 1;
629
3.72M
            pred = -pred;
630
3.72M
          }
631
15.6M
          workspace[1] = (JCOEF)pred;
632
15.6M
        }
633
        /* AC10 */
634
17.1M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
15.7M
          num = Q00 * (change_dc ?
636
11.6M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
11.6M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
11.6M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
11.6M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
15.7M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
15.7M
          if (num >= 0) {
642
10.9M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
10.9M
            if (Al > 0 && pred >= (1 << Al))
644
805k
              pred = (1 << Al) - 1;
645
10.9M
          } else {
646
4.85M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
4.85M
            if (Al > 0 && pred >= (1 << Al))
648
895k
              pred = (1 << Al) - 1;
649
4.85M
            pred = -pred;
650
4.85M
          }
651
15.7M
          workspace[8] = (JCOEF)pred;
652
15.7M
        }
653
        /* AC20 */
654
17.1M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
15.8M
          num = Q00 * (change_dc ?
656
11.6M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
11.6M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
15.8M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
15.8M
          if (num >= 0) {
660
10.9M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
10.9M
            if (Al > 0 && pred >= (1 << Al))
662
826k
              pred = (1 << Al) - 1;
663
10.9M
          } else {
664
4.94M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
4.94M
            if (Al > 0 && pred >= (1 << Al))
666
846k
              pred = (1 << Al) - 1;
667
4.94M
            pred = -pred;
668
4.94M
          }
669
15.8M
          workspace[16] = (JCOEF)pred;
670
15.8M
        }
671
        /* AC11 */
672
17.1M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
15.7M
          num = Q00 * (change_dc ?
674
11.6M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
11.6M
                 9 * DC19 + DC21 - DC25) :
676
15.7M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
4.08M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
15.7M
          if (num >= 0) {
679
12.9M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
12.9M
            if (Al > 0 && pred >= (1 << Al))
681
485k
              pred = (1 << Al) - 1;
682
12.9M
          } else {
683
2.79M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
2.79M
            if (Al > 0 && pred >= (1 << Al))
685
480k
              pred = (1 << Al) - 1;
686
2.79M
            pred = -pred;
687
2.79M
          }
688
15.7M
          workspace[9] = (JCOEF)pred;
689
15.7M
        }
690
        /* AC02 */
691
17.1M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
15.7M
          num = Q00 * (change_dc ?
693
11.6M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
11.6M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
15.7M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
15.7M
          if (num >= 0) {
697
10.7M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
10.7M
            if (Al > 0 && pred >= (1 << Al))
699
860k
              pred = (1 << Al) - 1;
700
10.7M
          } else {
701
4.97M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
4.97M
            if (Al > 0 && pred >= (1 << Al))
703
849k
              pred = (1 << Al) - 1;
704
4.97M
            pred = -pred;
705
4.97M
          }
706
15.7M
          workspace[2] = (JCOEF)pred;
707
15.7M
        }
708
17.1M
        if (change_dc) {
709
          /* AC03 */
710
11.6M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
11.6M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
11.6M
            if (num >= 0) {
713
9.57M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
9.57M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
9.57M
            } else {
717
2.04M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
2.04M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
2.04M
              pred = -pred;
721
2.04M
            }
722
11.6M
            workspace[3] = (JCOEF)pred;
723
11.6M
          }
724
          /* AC12 */
725
11.6M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
11.6M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
11.6M
            if (num >= 0) {
728
8.48M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
8.48M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
8.48M
            } else {
732
3.13M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
3.13M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
3.13M
              pred = -pred;
736
3.13M
            }
737
11.6M
            workspace[10] = (JCOEF)pred;
738
11.6M
          }
739
          /* AC21 */
740
11.6M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
11.6M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
11.6M
            if (num >= 0) {
743
8.64M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
8.64M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
8.64M
            } else {
747
2.97M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
2.97M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
2.97M
              pred = -pred;
751
2.97M
            }
752
11.6M
            workspace[17] = (JCOEF)pred;
753
11.6M
          }
754
          /* AC30 */
755
11.6M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
11.6M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
11.6M
            if (num >= 0) {
758
8.74M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
8.74M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
8.74M
            } else {
762
2.87M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
2.87M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
2.87M
              pred = -pred;
766
2.87M
            }
767
11.6M
            workspace[24] = (JCOEF)pred;
768
11.6M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
11.6M
          num = Q00 *
773
11.6M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
11.6M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
11.6M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
11.6M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
11.6M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
11.6M
          if (num >= 0) {
779
8.47M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
8.47M
          } else {
781
3.14M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
3.14M
            pred = -pred;
783
3.14M
          }
784
11.6M
          workspace[0] = (JCOEF)pred;
785
11.6M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
17.1M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
17.1M
                        output_col);
790
        /* Advance for next column */
791
17.1M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
17.1M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
17.1M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
17.1M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
17.1M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
17.1M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
17.1M
          prev_prev_block_row++, next_next_block_row++;
798
17.1M
        output_col += compptr->_DCT_scaled_size;
799
17.1M
      }
800
2.93M
      output_ptr += compptr->_DCT_scaled_size;
801
2.93M
    }
802
2.38M
  }
803
804
936k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
934k
    return JPEG_ROW_COMPLETED;
806
1.46k
  return JPEG_SCAN_COMPLETED;
807
936k
}
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
29.3k
{
819
29.3k
  my_coef_ptr coef;
820
821
29.3k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
29.3k
  coef = (my_coef_ptr)
825
29.3k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
29.3k
                                sizeof(my_coef_controller));
827
29.3k
  memset(coef, 0, sizeof(my_coef_controller));
828
29.3k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
29.3k
  coef->pub.start_input_pass = start_input_pass;
830
29.3k
  coef->pub.start_output_pass = start_output_pass;
831
29.3k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
29.3k
  coef->coef_bits_latch = NULL;
833
29.3k
#endif
834
835
  /* Create the coefficient buffer. */
836
29.3k
  if (need_full_buffer) {
837
11.2k
#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
11.2k
    int ci, access_rows;
842
11.2k
    jpeg_component_info *compptr;
843
844
42.6k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
31.4k
         ci++, compptr++) {
846
31.4k
      access_rows = compptr->v_samp_factor;
847
31.4k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
31.4k
      if (cinfo->progressive_mode)
850
17.2k
        access_rows *= 5;
851
31.4k
#endif
852
31.4k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
31.4k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
31.4k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
31.4k
                               (long)compptr->h_samp_factor),
856
31.4k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
31.4k
                               (long)compptr->v_samp_factor),
858
31.4k
         (JDIMENSION)access_rows);
859
31.4k
    }
860
11.2k
    coef->pub.consume_data = consume_data;
861
11.2k
    coef->pub._decompress_data = decompress_data;
862
11.2k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
18.1k
  } else {
867
    /* We only need a single-MCU buffer. */
868
18.1k
    JBLOCKROW buffer;
869
18.1k
    int i;
870
871
18.1k
    buffer = (JBLOCKROW)
872
18.1k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
18.1k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
199k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
181k
      coef->MCU_buffer[i] = buffer + i;
876
181k
    }
877
18.1k
    coef->pub.consume_data = dummy_consume_data;
878
18.1k
    coef->pub._decompress_data = decompress_onepass;
879
18.1k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
18.1k
  }
881
882
  /* Allocate the workspace buffer */
883
29.3k
  coef->workspace = (JCOEF *)
884
29.3k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
29.3k
                                sizeof(JCOEF) * DCTSIZE2);
886
29.3k
}