Coverage Report

Created: 2026-07-10 11:04

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