Coverage Report

Created: 2022-11-14 06:33

/src/libjpeg-turbo/jdcoefct.c
Line
Count
Source (jump to first uncovered line)
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, 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 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 "jpegcomp.h"
25
26
27
/* Forward declarations */
28
METHODDEF(int) decompress_onepass(j_decompress_ptr cinfo,
29
                                  JSAMPIMAGE output_buf);
30
#ifdef D_MULTISCAN_FILES_SUPPORTED
31
METHODDEF(int) decompress_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf);
32
#endif
33
#ifdef BLOCK_SMOOTHING_SUPPORTED
34
LOCAL(boolean) smoothing_ok(j_decompress_ptr cinfo);
35
METHODDEF(int) decompress_smooth_data(j_decompress_ptr cinfo,
36
                                      JSAMPIMAGE output_buf);
37
#endif
38
39
40
/*
41
 * Initialize for an input processing pass.
42
 */
43
44
METHODDEF(void)
45
start_input_pass(j_decompress_ptr cinfo)
46
59.6k
{
47
59.6k
  cinfo->input_iMCU_row = 0;
48
59.6k
  start_iMCU_row(cinfo);
49
59.6k
}
50
51
52
/*
53
 * Initialize for an output processing pass.
54
 */
55
56
METHODDEF(void)
57
start_output_pass(j_decompress_ptr cinfo)
58
46.6k
{
59
46.6k
#ifdef BLOCK_SMOOTHING_SUPPORTED
60
46.6k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
61
62
  /* If multipass, check to see whether to use block smoothing on this pass */
63
46.6k
  if (coef->pub.coef_arrays != NULL) {
64
15.5k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
65
3.47k
      coef->pub.decompress_data = decompress_smooth_data;
66
12.0k
    else
67
12.0k
      coef->pub.decompress_data = decompress_data;
68
15.5k
  }
69
46.6k
#endif
70
46.6k
  cinfo->output_iMCU_row = 0;
71
46.6k
}
72
73
74
/*
75
 * Decompress and return some data in the single-pass case.
76
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
77
 * Input and output must run in lockstep since we have only a one-MCU buffer.
78
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
79
 *
80
 * NB: output_buf contains a plane for each component in image,
81
 * which we index according to the component's SOF position.
82
 */
83
84
METHODDEF(int)
85
decompress_onepass(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
86
2.60M
{
87
2.60M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
88
2.60M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
89
2.60M
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
90
2.60M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
91
2.60M
  int blkn, ci, xindex, yindex, yoffset, useful_width;
92
2.60M
  JSAMPARRAY output_ptr;
93
2.60M
  JDIMENSION start_col, output_col;
94
2.60M
  jpeg_component_info *compptr;
95
2.60M
  inverse_DCT_method_ptr inverse_DCT;
96
97
  /* Loop to process as much as one whole iMCU row */
98
5.21M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
99
2.60M
       yoffset++) {
100
67.6M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
101
65.0M
         MCU_col_num++) {
102
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
103
65.0M
      jzero_far((void *)coef->MCU_buffer[0],
104
65.0M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
105
65.0M
      if (!cinfo->entropy->insufficient_data)
106
9.80M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
107
65.0M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
108
        /* Suspension forced; update state counters and exit */
109
0
        coef->MCU_vert_offset = yoffset;
110
0
        coef->MCU_ctr = MCU_col_num;
111
0
        return JPEG_SUSPENDED;
112
0
      }
113
114
      /* Only perform the IDCT on blocks that are contained within the desired
115
       * cropping region.
116
       */
117
65.0M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
118
65.0M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
119
        /* Determine where data should go in output_buf and do the IDCT thing.
120
         * We skip dummy blocks at the right and bottom edges (but blkn gets
121
         * incremented past them!).  Note the inner loop relies on having
122
         * allocated the MCU_buffer[] blocks sequentially.
123
         */
124
65.0M
        blkn = 0;               /* index of current DCT block within MCU */
125
133M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
126
68.9M
          compptr = cinfo->cur_comp_info[ci];
127
          /* Don't bother to IDCT an uninteresting component. */
128
68.9M
          if (!compptr->component_needed) {
129
0
            blkn += compptr->MCU_blocks;
130
0
            continue;
131
0
          }
132
68.9M
          inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];
133
68.9M
          useful_width = (MCU_col_num < last_MCU_col) ?
134
65.2M
                         compptr->MCU_width : compptr->last_col_width;
135
68.9M
          output_ptr = output_buf[compptr->component_index] +
136
68.9M
                       yoffset * compptr->_DCT_scaled_size;
137
68.9M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
138
68.9M
                      compptr->MCU_sample_width;
139
139M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
140
70.7M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
141
70.7M
                yoffset + yindex < compptr->last_row_height) {
142
70.6M
              output_col = start_col;
143
143M
              for (xindex = 0; xindex < useful_width; xindex++) {
144
73.2M
                (*inverse_DCT) (cinfo, compptr,
145
73.2M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
146
73.2M
                                output_ptr, output_col);
147
73.2M
                output_col += compptr->_DCT_scaled_size;
148
73.2M
              }
149
70.6M
            }
150
70.7M
            blkn += compptr->MCU_width;
151
70.7M
            output_ptr += compptr->_DCT_scaled_size;
152
70.7M
          }
153
68.9M
        }
154
65.0M
      }
155
65.0M
    }
156
    /* Completed an MCU row, but perhaps not an iMCU row */
157
2.60M
    coef->MCU_ctr = 0;
158
2.60M
  }
159
  /* Completed the iMCU row, advance counters for next one */
160
2.60M
  cinfo->output_iMCU_row++;
161
2.60M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
162
2.56M
    start_iMCU_row(cinfo);
163
2.56M
    return JPEG_ROW_COMPLETED;
164
2.56M
  }
165
  /* Completed the scan */
166
41.2k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
167
41.2k
  return JPEG_SCAN_COMPLETED;
168
2.60M
}
169
170
171
/*
172
 * Dummy consume-input routine for single-pass operation.
173
 */
174
175
METHODDEF(int)
176
dummy_consume_data(j_decompress_ptr cinfo)
177
0
{
178
0
  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
179
0
}
180
181
182
#ifdef D_MULTISCAN_FILES_SUPPORTED
183
184
/*
185
 * Consume input data and store it in the full-image coefficient buffer.
186
 * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
187
 * ie, v_samp_factor block rows for each component in the scan.
188
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
189
 */
190
191
METHODDEF(int)
192
consume_data(j_decompress_ptr cinfo)
193
7.77M
{
194
7.77M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
195
7.77M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
196
7.77M
  int blkn, ci, xindex, yindex, yoffset;
197
7.77M
  JDIMENSION start_col;
198
7.77M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
199
7.77M
  JBLOCKROW buffer_ptr;
200
7.77M
  jpeg_component_info *compptr;
201
202
  /* Align the virtual buffers for the components used in this scan. */
203
16.2M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
204
8.50M
    compptr = cinfo->cur_comp_info[ci];
205
8.50M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
206
8.50M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
207
8.50M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
208
8.50M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
209
    /* Note: entropy decoder expects buffer to be zeroed,
210
     * but this is handled automatically by the memory manager
211
     * because we requested a pre-zeroed array.
212
     */
213
8.50M
  }
214
215
  /* Loop to process one whole iMCU row */
216
15.8M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
217
8.05M
       yoffset++) {
218
367M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
219
359M
         MCU_col_num++) {
220
      /* Construct list of pointers to DCT blocks belonging to this MCU */
221
359M
      blkn = 0;                 /* index of current DCT block within MCU */
222
725M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
223
366M
        compptr = cinfo->cur_comp_info[ci];
224
366M
        start_col = MCU_col_num * compptr->MCU_width;
225
735M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
226
369M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
227
745M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
228
376M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
229
376M
          }
230
369M
        }
231
366M
      }
232
359M
      if (!cinfo->entropy->insufficient_data)
233
316M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
234
      /* Try to fetch the MCU. */
235
359M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
236
        /* Suspension forced; update state counters and exit */
237
0
        coef->MCU_vert_offset = yoffset;
238
0
        coef->MCU_ctr = MCU_col_num;
239
0
        return JPEG_SUSPENDED;
240
0
      }
241
359M
    }
242
    /* Completed an MCU row, but perhaps not an iMCU row */
243
8.05M
    coef->MCU_ctr = 0;
244
8.05M
  }
245
  /* Completed the iMCU row, advance counters for next one */
246
7.77M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
247
7.74M
    start_iMCU_row(cinfo);
248
7.74M
    return JPEG_ROW_COMPLETED;
249
7.74M
  }
250
  /* Completed the scan */
251
28.4k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
252
28.4k
  return JPEG_SCAN_COMPLETED;
253
7.77M
}
254
255
256
/*
257
 * Decompress and return some data in the multi-pass case.
258
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
259
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
260
 *
261
 * NB: output_buf contains a plane for each component in image.
262
 */
263
264
METHODDEF(int)
265
decompress_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
266
2.14M
{
267
2.14M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
268
2.14M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
269
2.14M
  JDIMENSION block_num;
270
2.14M
  int ci, block_row, block_rows;
271
2.14M
  JBLOCKARRAY buffer;
272
2.14M
  JBLOCKROW buffer_ptr;
273
2.14M
  JSAMPARRAY output_ptr;
274
2.14M
  JDIMENSION output_col;
275
2.14M
  jpeg_component_info *compptr;
276
2.14M
  inverse_DCT_method_ptr inverse_DCT;
277
278
  /* Force some input to be done if we are getting ahead of the input. */
279
2.14M
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
280
2.14M
         (cinfo->input_scan_number == cinfo->output_scan_number &&
281
2.14M
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
282
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
283
0
      return JPEG_SUSPENDED;
284
0
  }
285
286
  /* OK, output from the virtual arrays. */
287
5.82M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
288
3.68M
       ci++, compptr++) {
289
    /* Don't bother to IDCT an uninteresting component. */
290
3.68M
    if (!compptr->component_needed)
291
0
      continue;
292
    /* Align the virtual buffer for this component. */
293
3.68M
    buffer = (*cinfo->mem->access_virt_barray)
294
3.68M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
295
3.68M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
296
3.68M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
297
    /* Count non-dummy DCT block rows in this iMCU row. */
298
3.68M
    if (cinfo->output_iMCU_row < last_iMCU_row)
299
3.65M
      block_rows = compptr->v_samp_factor;
300
21.9k
    else {
301
      /* NB: can't use last_row_height here; it is input-side-dependent! */
302
21.9k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
303
21.9k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
304
21.9k
    }
305
3.68M
    inverse_DCT = cinfo->idct->inverse_DCT[ci];
306
3.68M
    output_ptr = output_buf[ci];
307
    /* Loop over all DCT blocks to be processed. */
308
7.52M
    for (block_row = 0; block_row < block_rows; block_row++) {
309
3.84M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
310
3.84M
      output_col = 0;
311
3.84M
      for (block_num = cinfo->master->first_MCU_col[ci];
312
67.3M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
313
63.5M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
314
63.5M
                        output_col);
315
63.5M
        buffer_ptr++;
316
63.5M
        output_col += compptr->_DCT_scaled_size;
317
63.5M
      }
318
3.84M
      output_ptr += compptr->_DCT_scaled_size;
319
3.84M
    }
320
3.68M
  }
321
322
2.14M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
323
2.13M
    return JPEG_ROW_COMPLETED;
324
11.9k
  return JPEG_SCAN_COMPLETED;
325
2.14M
}
326
327
#endif /* D_MULTISCAN_FILES_SUPPORTED */
328
329
330
#ifdef BLOCK_SMOOTHING_SUPPORTED
331
332
/*
333
 * This code applies interblock smoothing; the first 9 AC coefficients are
334
 * estimated from the DC values of a DCT block and its 24 neighboring blocks.
335
 * We apply smoothing only for progressive JPEG decoding, and only if
336
 * the coefficients it can estimate are not yet known to full precision.
337
 */
338
339
/* Natural-order array positions of the first 9 zigzag-order coefficients */
340
654k
#define Q01_POS  1
341
653k
#define Q10_POS  8
342
652k
#define Q20_POS  16
343
652k
#define Q11_POS  9
344
651k
#define Q02_POS  2
345
424k
#define Q03_POS  3
346
423k
#define Q12_POS  10
347
423k
#define Q21_POS  17
348
422k
#define Q30_POS  24
349
350
/*
351
 * Determine whether block smoothing is applicable and safe.
352
 * We also latch the current states of the coef_bits[] entries for the
353
 * AC coefficients; otherwise, if the input side of the decompressor
354
 * advances into a new scan, we might think the coefficients are known
355
 * more accurately than they really are.
356
 */
357
358
LOCAL(boolean)
359
smoothing_ok(j_decompress_ptr cinfo)
360
15.5k
{
361
15.5k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
362
15.5k
  boolean smoothing_useful = FALSE;
363
15.5k
  int ci, coefi;
364
15.5k
  jpeg_component_info *compptr;
365
15.5k
  JQUANT_TBL *qtable;
366
15.5k
  int *coef_bits, *prev_coef_bits;
367
15.5k
  int *coef_bits_latch, *prev_coef_bits_latch;
368
369
15.5k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
370
3.77k
    return FALSE;
371
372
  /* Allocate latch area if not already done */
373
11.7k
  if (coef->coef_bits_latch == NULL)
374
11.7k
    coef->coef_bits_latch = (int *)
375
11.7k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
376
11.7k
                                  cinfo->num_components * 2 *
377
11.7k
                                  (SAVED_COEFS * sizeof(int)));
378
11.7k
  coef_bits_latch = coef->coef_bits_latch;
379
11.7k
  prev_coef_bits_latch =
380
11.7k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
381
382
16.7k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
383
13.1k
       ci++, compptr++) {
384
    /* All components' quantization values must already be latched. */
385
13.1k
    if ((qtable = compptr->quant_table) == NULL)
386
582
      return FALSE;
387
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
388
12.5k
    if (qtable->quantval[0] == 0 ||
389
12.5k
        qtable->quantval[Q01_POS] == 0 ||
390
12.5k
        qtable->quantval[Q10_POS] == 0 ||
391
12.5k
        qtable->quantval[Q20_POS] == 0 ||
392
12.5k
        qtable->quantval[Q11_POS] == 0 ||
393
12.5k
        qtable->quantval[Q02_POS] == 0 ||
394
12.5k
        qtable->quantval[Q03_POS] == 0 ||
395
12.5k
        qtable->quantval[Q12_POS] == 0 ||
396
12.5k
        qtable->quantval[Q21_POS] == 0 ||
397
12.5k
        qtable->quantval[Q30_POS] == 0)
398
6.71k
      return FALSE;
399
    /* DC values must be at least partly known for all components. */
400
5.83k
    coef_bits = cinfo->coef_bits[ci];
401
5.83k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
402
5.83k
    if (coef_bits[0] < 0)
403
819
      return FALSE;
404
5.01k
    coef_bits_latch[0] = coef_bits[0];
405
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
406
50.1k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
407
45.1k
      if (cinfo->input_scan_number > 1)
408
17.8k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
409
27.2k
      else
410
27.2k
        prev_coef_bits_latch[coefi] = -1;
411
45.1k
      coef_bits_latch[coefi] = coef_bits[coefi];
412
45.1k
      if (coef_bits[coefi] != 0)
413
38.4k
        smoothing_useful = TRUE;
414
45.1k
    }
415
5.01k
    coef_bits_latch += SAVED_COEFS;
416
5.01k
    prev_coef_bits_latch += SAVED_COEFS;
417
5.01k
  }
418
419
3.63k
  return smoothing_useful;
420
11.7k
}
421
422
423
/*
424
 * Variant of decompress_data for use when doing block smoothing.
425
 */
426
427
METHODDEF(int)
428
decompress_smooth_data(j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
429
583k
{
430
583k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
431
583k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
432
583k
  JDIMENSION block_num, last_block_column;
433
583k
  int ci, block_row, block_rows, access_rows;
434
583k
  JBLOCKARRAY buffer;
435
583k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
436
583k
  JBLOCKROW next_block_row, next_next_block_row;
437
583k
  JSAMPARRAY output_ptr;
438
583k
  JDIMENSION output_col;
439
583k
  jpeg_component_info *compptr;
440
583k
  inverse_DCT_method_ptr inverse_DCT;
441
583k
  boolean change_dc;
442
583k
  JCOEF *workspace;
443
583k
  int *coef_bits;
444
583k
  JQUANT_TBL *quanttbl;
445
583k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
446
583k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
447
583k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
448
583k
      DC25;
449
583k
  int Al, pred;
450
451
  /* Keep a local variable to avoid looking it up more than once */
452
583k
  workspace = coef->workspace;
453
454
  /* Force some input to be done if we are getting ahead of the input. */
455
583k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
456
583k
         !cinfo->inputctl->eoi_reached) {
457
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
458
      /* If input is working on current scan, we ordinarily want it to
459
       * have completed the current row.  But if input scan is DC,
460
       * we want it to keep two rows ahead so that next two block rows' DC
461
       * values are up to date.
462
       */
463
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
464
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
465
0
        break;
466
0
    }
467
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
468
0
      return JPEG_SUSPENDED;
469
0
  }
470
471
  /* OK, output from the virtual arrays. */
472
1.22M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
473
642k
       ci++, compptr++) {
474
    /* Don't bother to IDCT an uninteresting component. */
475
642k
    if (!compptr->component_needed)
476
0
      continue;
477
    /* Count non-dummy DCT block rows in this iMCU row. */
478
642k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
479
633k
      block_rows = compptr->v_samp_factor;
480
633k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
481
633k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
482
4.34k
      block_rows = compptr->v_samp_factor;
483
4.34k
      access_rows = block_rows * 2; /* this and next iMCU row */
484
4.44k
    } else {
485
      /* NB: can't use last_row_height here; it is input-side-dependent! */
486
4.44k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
487
4.44k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
488
4.44k
      access_rows = block_rows; /* this iMCU row only */
489
4.44k
    }
490
    /* Align the virtual buffer for this component. */
491
642k
    if (cinfo->output_iMCU_row > 1) {
492
633k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
493
633k
      buffer = (*cinfo->mem->access_virt_barray)
494
633k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
495
633k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
496
633k
         (JDIMENSION)access_rows, FALSE);
497
633k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
498
633k
    } else if (cinfo->output_iMCU_row > 0) {
499
4.34k
      buffer = (*cinfo->mem->access_virt_barray)
500
4.34k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
501
4.34k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
502
4.34k
         (JDIMENSION)access_rows, FALSE);
503
4.34k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
504
4.44k
    } else {
505
4.44k
      buffer = (*cinfo->mem->access_virt_barray)
506
4.44k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
507
4.44k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
508
4.44k
    }
509
    /* Fetch component-dependent info.
510
     * If the current scan is incomplete, then we use the component-dependent
511
     * info from the previous scan.
512
     */
513
642k
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
514
308k
      coef_bits =
515
308k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
516
334k
    else
517
334k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
518
519
    /* We only do DC interpolation if no AC coefficient data is available. */
520
642k
    change_dc =
521
642k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
522
642k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
523
642k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
524
525
642k
    quanttbl = compptr->quant_table;
526
642k
    Q00 = quanttbl->quantval[0];
527
642k
    Q01 = quanttbl->quantval[Q01_POS];
528
642k
    Q10 = quanttbl->quantval[Q10_POS];
529
642k
    Q20 = quanttbl->quantval[Q20_POS];
530
642k
    Q11 = quanttbl->quantval[Q11_POS];
531
642k
    Q02 = quanttbl->quantval[Q02_POS];
532
642k
    if (change_dc) {
533
415k
      Q03 = quanttbl->quantval[Q03_POS];
534
415k
      Q12 = quanttbl->quantval[Q12_POS];
535
415k
      Q21 = quanttbl->quantval[Q21_POS];
536
415k
      Q30 = quanttbl->quantval[Q30_POS];
537
415k
    }
538
642k
    inverse_DCT = cinfo->idct->inverse_DCT[ci];
539
642k
    output_ptr = output_buf[ci];
540
    /* Loop over all DCT blocks to be processed. */
541
1.32M
    for (block_row = 0; block_row < block_rows; block_row++) {
542
684k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
543
544
684k
      if (block_row > 0 || cinfo->output_iMCU_row > 0)
545
680k
        prev_block_row =
546
680k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
547
4.44k
      else
548
4.44k
        prev_block_row = buffer_ptr;
549
550
684k
      if (block_row > 1 || cinfo->output_iMCU_row > 1)
551
674k
        prev_prev_block_row =
552
674k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
553
9.75k
      else
554
9.75k
        prev_prev_block_row = prev_block_row;
555
556
684k
      if (block_row < block_rows - 1 || cinfo->output_iMCU_row < last_iMCU_row)
557
680k
        next_block_row =
558
680k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
559
4.44k
      else
560
4.44k
        next_block_row = buffer_ptr;
561
562
684k
      if (block_row < block_rows - 2 ||
563
684k
          cinfo->output_iMCU_row + 1 < last_iMCU_row)
564
674k
        next_next_block_row =
565
674k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
566
9.46k
      else
567
9.46k
        next_next_block_row = next_block_row;
568
569
      /* We fetch the surrounding DC values using a sliding-register approach.
570
       * Initialize all 25 here so as to do the right thing on narrow pics.
571
       */
572
684k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
573
684k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
574
684k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
575
684k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
576
684k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
577
684k
      output_col = 0;
578
684k
      last_block_column = compptr->width_in_blocks - 1;
579
684k
      for (block_num = cinfo->master->first_MCU_col[ci];
580
51.2M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
581
        /* Fetch current DCT block into workspace so we can modify it. */
582
50.6M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
583
        /* Update DC values */
584
50.6M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
585
50.6M
            block_num < last_block_column) {
586
615k
          DC04 = (int)prev_prev_block_row[1][0];
587
615k
          DC09 = (int)prev_block_row[1][0];
588
615k
          DC14 = (int)buffer_ptr[1][0];
589
615k
          DC19 = (int)next_block_row[1][0];
590
615k
          DC24 = (int)next_next_block_row[1][0];
591
615k
        }
592
50.6M
        if (block_num + 1 < last_block_column) {
593
49.3M
          DC05 = (int)prev_prev_block_row[2][0];
594
49.3M
          DC10 = (int)prev_block_row[2][0];
595
49.3M
          DC15 = (int)buffer_ptr[2][0];
596
49.3M
          DC20 = (int)next_block_row[2][0];
597
49.3M
          DC25 = (int)next_next_block_row[2][0];
598
49.3M
        }
599
        /* If DC interpolation is enabled, compute coefficient estimates using
600
         * a Gaussian-like kernel, keeping the averages of the DC values.
601
         *
602
         * If DC interpolation is disabled, compute coefficient estimates using
603
         * an algorithm similar to the one described in Section K.8 of the JPEG
604
         * standard, except applied to a 5x5 window rather than a 3x3 window.
605
         *
606
         * An estimate is applied only if the coefficient is still zero and is
607
         * not known to be fully accurate.
608
         */
609
        /* AC01 */
610
50.6M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
611
42.0M
          num = Q00 * (change_dc ?
612
16.3M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
613
16.3M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
614
16.3M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
615
16.3M
                 DC21 - DC22 + DC24 + DC25) :
616
42.0M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
617
42.0M
          if (num >= 0) {
618
36.8M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
619
36.8M
            if (Al > 0 && pred >= (1 << Al))
620
3.21M
              pred = (1 << Al) - 1;
621
36.8M
          } else {
622
5.16M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
623
5.16M
            if (Al > 0 && pred >= (1 << Al))
624
650k
              pred = (1 << Al) - 1;
625
5.16M
            pred = -pred;
626
5.16M
          }
627
42.0M
          workspace[1] = (JCOEF)pred;
628
42.0M
        }
629
        /* AC10 */
630
50.6M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
631
41.7M
          num = Q00 * (change_dc ?
632
16.3M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
633
16.3M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
634
16.3M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
635
16.3M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
636
41.7M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
637
41.7M
          if (num >= 0) {
638
32.5M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
639
32.5M
            if (Al > 0 && pred >= (1 << Al))
640
9.00M
              pred = (1 << Al) - 1;
641
32.5M
          } else {
642
9.15M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
643
9.15M
            if (Al > 0 && pred >= (1 << Al))
644
3.49M
              pred = (1 << Al) - 1;
645
9.15M
            pred = -pred;
646
9.15M
          }
647
41.7M
          workspace[8] = (JCOEF)pred;
648
41.7M
        }
649
        /* AC20 */
650
50.6M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
651
47.3M
          num = Q00 * (change_dc ?
652
16.3M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
653
16.3M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
654
47.3M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
655
47.3M
          if (num >= 0) {
656
30.9M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
657
30.9M
            if (Al > 0 && pred >= (1 << Al))
658
4.30M
              pred = (1 << Al) - 1;
659
30.9M
          } else {
660
16.4M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
661
16.4M
            if (Al > 0 && pred >= (1 << Al))
662
4.26M
              pred = (1 << Al) - 1;
663
16.4M
            pred = -pred;
664
16.4M
          }
665
47.3M
          workspace[16] = (JCOEF)pred;
666
47.3M
        }
667
        /* AC11 */
668
50.6M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
669
46.5M
          num = Q00 * (change_dc ?
670
16.3M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
671
16.3M
                 9 * DC19 + DC21 - DC25) :
672
46.5M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
673
30.2M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
674
46.5M
          if (num >= 0) {
675
42.5M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
676
42.5M
            if (Al > 0 && pred >= (1 << Al))
677
637k
              pred = (1 << Al) - 1;
678
42.5M
          } else {
679
3.97M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
680
3.97M
            if (Al > 0 && pred >= (1 << Al))
681
637k
              pred = (1 << Al) - 1;
682
3.97M
            pred = -pred;
683
3.97M
          }
684
46.5M
          workspace[9] = (JCOEF)pred;
685
46.5M
        }
686
        /* AC02 */
687
50.6M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
688
46.8M
          num = Q00 * (change_dc ?
689
16.3M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
690
16.3M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
691
46.8M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
692
46.8M
          if (num >= 0) {
693
28.3M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
694
28.3M
            if (Al > 0 && pred >= (1 << Al))
695
2.00M
              pred = (1 << Al) - 1;
696
28.3M
          } else {
697
18.4M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
698
18.4M
            if (Al > 0 && pred >= (1 << Al))
699
1.85M
              pred = (1 << Al) - 1;
700
18.4M
            pred = -pred;
701
18.4M
          }
702
46.8M
          workspace[2] = (JCOEF)pred;
703
46.8M
        }
704
50.6M
        if (change_dc) {
705
          /* AC03 */
706
16.3M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
707
16.3M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
708
16.3M
            if (num >= 0) {
709
14.4M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
710
14.4M
              if (Al > 0 && pred >= (1 << Al))
711
0
                pred = (1 << Al) - 1;
712
14.4M
            } else {
713
1.89M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
714
1.89M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
1.89M
              pred = -pred;
717
1.89M
            }
718
16.3M
            workspace[3] = (JCOEF)pred;
719
16.3M
          }
720
          /* AC12 */
721
16.3M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
722
16.3M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
723
16.3M
            if (num >= 0) {
724
12.1M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
725
12.1M
              if (Al > 0 && pred >= (1 << Al))
726
0
                pred = (1 << Al) - 1;
727
12.1M
            } else {
728
4.20M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
729
4.20M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
4.20M
              pred = -pred;
732
4.20M
            }
733
16.3M
            workspace[10] = (JCOEF)pred;
734
16.3M
          }
735
          /* AC21 */
736
16.3M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
737
16.3M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
738
16.3M
            if (num >= 0) {
739
11.6M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
740
11.6M
              if (Al > 0 && pred >= (1 << Al))
741
0
                pred = (1 << Al) - 1;
742
11.6M
            } else {
743
4.73M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
744
4.73M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
4.73M
              pred = -pred;
747
4.73M
            }
748
16.3M
            workspace[17] = (JCOEF)pred;
749
16.3M
          }
750
          /* AC30 */
751
16.3M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
752
16.3M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
753
16.3M
            if (num >= 0) {
754
13.6M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
755
13.6M
              if (Al > 0 && pred >= (1 << Al))
756
0
                pred = (1 << Al) - 1;
757
13.6M
            } else {
758
2.68M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
759
2.68M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
2.68M
              pred = -pred;
762
2.68M
            }
763
16.3M
            workspace[24] = (JCOEF)pred;
764
16.3M
          }
765
          /* coef_bits[0] is non-negative.  Otherwise this function would not
766
           * be called.
767
           */
768
16.3M
          num = Q00 *
769
16.3M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
770
16.3M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
771
16.3M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
772
16.3M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
773
16.3M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
774
16.3M
          if (num >= 0) {
775
12.9M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
776
12.9M
          } else {
777
3.35M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
778
3.35M
            pred = -pred;
779
3.35M
          }
780
16.3M
          workspace[0] = (JCOEF)pred;
781
16.3M
        }  /* change_dc */
782
783
        /* OK, do the IDCT */
784
50.6M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
785
50.6M
                        output_col);
786
        /* Advance for next column */
787
50.6M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
788
50.6M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
789
50.6M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
790
50.6M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
791
50.6M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
792
50.6M
        buffer_ptr++, prev_block_row++, next_block_row++,
793
50.6M
          prev_prev_block_row++, next_next_block_row++;
794
50.6M
        output_col += compptr->_DCT_scaled_size;
795
50.6M
      }
796
684k
      output_ptr += compptr->_DCT_scaled_size;
797
684k
    }
798
642k
  }
799
800
583k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
801
579k
    return JPEG_ROW_COMPLETED;
802
3.40k
  return JPEG_SCAN_COMPLETED;
803
583k
}
804
805
#endif /* BLOCK_SMOOTHING_SUPPORTED */
806
807
808
/*
809
 * Initialize coefficient buffer controller.
810
 */
811
812
GLOBAL(void)
813
jinit_d_coef_controller(j_decompress_ptr cinfo, boolean need_full_buffer)
814
54.4k
{
815
54.4k
  my_coef_ptr coef;
816
817
54.4k
  coef = (my_coef_ptr)
818
54.4k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
819
54.4k
                                sizeof(my_coef_controller));
820
54.4k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
821
54.4k
  coef->pub.start_input_pass = start_input_pass;
822
54.4k
  coef->pub.start_output_pass = start_output_pass;
823
54.4k
#ifdef BLOCK_SMOOTHING_SUPPORTED
824
54.4k
  coef->coef_bits_latch = NULL;
825
54.4k
#endif
826
827
  /* Create the coefficient buffer. */
828
54.4k
  if (need_full_buffer) {
829
22.1k
#ifdef D_MULTISCAN_FILES_SUPPORTED
830
    /* Allocate a full-image virtual array for each component, */
831
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
832
    /* Note we ask for a pre-zeroed array. */
833
22.1k
    int ci, access_rows;
834
22.1k
    jpeg_component_info *compptr;
835
836
58.8k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
837
36.6k
         ci++, compptr++) {
838
36.6k
      access_rows = compptr->v_samp_factor;
839
36.6k
#ifdef BLOCK_SMOOTHING_SUPPORTED
840
      /* If block smoothing could be used, need a bigger window */
841
36.6k
      if (cinfo->progressive_mode)
842
22.8k
        access_rows *= 5;
843
36.6k
#endif
844
36.6k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
845
36.6k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
846
36.6k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
847
36.6k
                               (long)compptr->h_samp_factor),
848
36.6k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
849
36.6k
                               (long)compptr->v_samp_factor),
850
36.6k
         (JDIMENSION)access_rows);
851
36.6k
    }
852
22.1k
    coef->pub.consume_data = consume_data;
853
22.1k
    coef->pub.decompress_data = decompress_data;
854
22.1k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
855
#else
856
    ERREXIT(cinfo, JERR_NOT_COMPILED);
857
#endif
858
32.3k
  } else {
859
    /* We only need a single-MCU buffer. */
860
32.3k
    JBLOCKROW buffer;
861
32.3k
    int i;
862
863
32.3k
    buffer = (JBLOCKROW)
864
32.3k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
865
32.3k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
866
355k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
867
323k
      coef->MCU_buffer[i] = buffer + i;
868
323k
    }
869
32.3k
    coef->pub.consume_data = dummy_consume_data;
870
32.3k
    coef->pub.decompress_data = decompress_onepass;
871
32.3k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
872
32.3k
  }
873
874
  /* Allocate the workspace buffer */
875
54.4k
  coef->workspace = (JCOEF *)
876
54.4k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
54.4k
                                sizeof(JCOEF) * DCTSIZE2);
878
54.4k
}