Coverage Report

Created: 2026-09-28 10:59

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