Coverage Report

Created: 2026-10-14 09:33

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