Coverage Report

Created: 2024-05-19 20:03

/src/libjpeg-turbo.main/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
1.95M
{
47
1.95M
  cinfo->input_iMCU_row = 0;
48
1.95M
  start_iMCU_row(cinfo);
49
1.95M
}
50
51
52
/*
53
 * Initialize for an output processing pass.
54
 */
55
56
METHODDEF(void)
57
start_output_pass(j_decompress_ptr cinfo)
58
72.6k
{
59
72.6k
#ifdef BLOCK_SMOOTHING_SUPPORTED
60
72.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
72.6k
  if (coef->pub.coef_arrays != NULL) {
64
40.9k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
65
12.5k
      coef->pub.decompress_data = decompress_smooth_data;
66
28.4k
    else
67
28.4k
      coef->pub.decompress_data = decompress_data;
68
40.9k
  }
69
72.6k
#endif
70
72.6k
  cinfo->output_iMCU_row = 0;
71
72.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
976k
{
87
976k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
88
976k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
89
976k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
90
976k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
91
976k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
92
976k
  JSAMPARRAY output_ptr;
93
976k
  JDIMENSION start_col, output_col;
94
976k
  jpeg_component_info *compptr;
95
976k
  inverse_DCT_method_ptr inverse_DCT;
96
97
  /* Loop to process as much as one whole iMCU row */
98
2.05M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
99
1.07M
       yoffset++) {
100
6.85M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
101
5.77M
         MCU_col_num++) {
102
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
103
5.77M
      jzero_far((void *)coef->MCU_buffer[0],
104
5.77M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
105
5.77M
      if (!cinfo->entropy->insufficient_data)
106
2.55M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
107
5.77M
      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
5.77M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
118
5.77M
          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
5.77M
        blkn = 0;               /* index of current DCT block within MCU */
125
19.2M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
126
13.4M
          compptr = cinfo->cur_comp_info[ci];
127
          /* Don't bother to IDCT an uninteresting component. */
128
13.4M
          if (!compptr->component_needed) {
129
2.56M
            blkn += compptr->MCU_blocks;
130
2.56M
            continue;
131
2.56M
          }
132
10.9M
          inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];
133
10.9M
          useful_width = (MCU_col_num < last_MCU_col) ?
134
8.95M
                         compptr->MCU_width : compptr->last_col_width;
135
10.9M
          output_ptr = output_buf[compptr->component_index] +
136
10.9M
                       yoffset * compptr->_DCT_scaled_size;
137
10.9M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
138
10.9M
                      compptr->MCU_sample_width;
139
26.1M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
140
15.2M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
141
15.2M
                yoffset + yindex < compptr->last_row_height) {
142
14.4M
              output_col = start_col;
143
38.6M
              for (xindex = 0; xindex < useful_width; xindex++) {
144
24.1M
                (*inverse_DCT) (cinfo, compptr,
145
24.1M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
146
24.1M
                                output_ptr, output_col);
147
24.1M
                output_col += compptr->_DCT_scaled_size;
148
24.1M
              }
149
14.4M
            }
150
15.2M
            blkn += compptr->MCU_width;
151
15.2M
            output_ptr += compptr->_DCT_scaled_size;
152
15.2M
          }
153
10.9M
        }
154
5.77M
      }
155
5.77M
    }
156
    /* Completed an MCU row, but perhaps not an iMCU row */
157
1.07M
    coef->MCU_ctr = 0;
158
1.07M
  }
159
  /* Completed the iMCU row, advance counters for next one */
160
976k
  cinfo->output_iMCU_row++;
161
976k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
162
944k
    start_iMCU_row(cinfo);
163
944k
    return JPEG_ROW_COMPLETED;
164
944k
  }
165
  /* Completed the scan */
166
31.6k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
167
31.6k
  return JPEG_SCAN_COMPLETED;
168
976k
}
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
26.3M
{
194
26.3M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
195
26.3M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
196
26.3M
  int blkn, ci, xindex, yindex, yoffset;
197
26.3M
  JDIMENSION start_col;
198
26.3M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
199
26.3M
  JBLOCKROW buffer_ptr;
200
26.3M
  jpeg_component_info *compptr;
201
202
  /* Align the virtual buffers for the components used in this scan. */
203
62.5M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
204
36.2M
    compptr = cinfo->cur_comp_info[ci];
205
36.2M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
206
36.2M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
207
36.2M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
208
36.2M
       (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
36.2M
  }
214
215
  /* Loop to process one whole iMCU row */
216
105M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
217
78.8M
       yoffset++) {
218
262M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
219
184M
         MCU_col_num++) {
220
      /* Construct list of pointers to DCT blocks belonging to this MCU */
221
184M
      blkn = 0;                 /* index of current DCT block within MCU */
222
390M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
223
205M
        compptr = cinfo->cur_comp_info[ci];
224
205M
        start_col = MCU_col_num * compptr->MCU_width;
225
422M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
226
216M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
227
452M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
228
236M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
229
236M
          }
230
216M
        }
231
205M
      }
232
184M
      if (!cinfo->entropy->insufficient_data)
233
106M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
234
      /* Try to fetch the MCU. */
235
184M
      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
184M
    }
242
    /* Completed an MCU row, but perhaps not an iMCU row */
243
78.8M
    coef->MCU_ctr = 0;
244
78.8M
  }
245
  /* Completed the iMCU row, advance counters for next one */
246
26.3M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
247
24.4M
    start_iMCU_row(cinfo);
248
24.4M
    return JPEG_ROW_COMPLETED;
249
24.4M
  }
250
  /* Completed the scan */
251
1.92M
  (*cinfo->inputctl->finish_input_pass) (cinfo);
252
1.92M
  return JPEG_SCAN_COMPLETED;
253
26.3M
}
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
820k
{
267
820k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
268
820k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
269
820k
  JDIMENSION block_num;
270
820k
  int ci, block_row, block_rows;
271
820k
  JBLOCKARRAY buffer;
272
820k
  JBLOCKROW buffer_ptr;
273
820k
  JSAMPARRAY output_ptr;
274
820k
  JDIMENSION output_col;
275
820k
  jpeg_component_info *compptr;
276
820k
  inverse_DCT_method_ptr inverse_DCT;
277
278
  /* Force some input to be done if we are getting ahead of the input. */
279
820k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
280
820k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
281
820k
          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
3.23M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
288
2.41M
       ci++, compptr++) {
289
    /* Don't bother to IDCT an uninteresting component. */
290
2.41M
    if (!compptr->component_needed)
291
429k
      continue;
292
    /* Align the virtual buffer for this component. */
293
1.98M
    buffer = (*cinfo->mem->access_virt_barray)
294
1.98M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
295
1.98M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
296
1.98M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
297
    /* Count non-dummy DCT block rows in this iMCU row. */
298
1.98M
    if (cinfo->output_iMCU_row < last_iMCU_row)
299
1.91M
      block_rows = compptr->v_samp_factor;
300
68.2k
    else {
301
      /* NB: can't use last_row_height here; it is input-side-dependent! */
302
68.2k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
303
68.2k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
304
68.2k
    }
305
1.98M
    inverse_DCT = cinfo->idct->inverse_DCT[ci];
306
1.98M
    output_ptr = output_buf[ci];
307
    /* Loop over all DCT blocks to be processed. */
308
5.58M
    for (block_row = 0; block_row < block_rows; block_row++) {
309
3.60M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
310
3.60M
      output_col = 0;
311
3.60M
      for (block_num = cinfo->master->first_MCU_col[ci];
312
17.7M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
313
14.1M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
314
14.1M
                        output_col);
315
14.1M
        buffer_ptr++;
316
14.1M
        output_col += compptr->_DCT_scaled_size;
317
14.1M
      }
318
3.60M
      output_ptr += compptr->_DCT_scaled_size;
319
3.60M
    }
320
1.98M
  }
321
322
820k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
323
792k
    return JPEG_ROW_COMPLETED;
324
28.4k
  return JPEG_SCAN_COMPLETED;
325
820k
}
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
3.86M
#define Q01_POS  1
341
3.86M
#define Q10_POS  8
342
3.86M
#define Q20_POS  16
343
3.86M
#define Q11_POS  9
344
3.85M
#define Q02_POS  2
345
2.48M
#define Q03_POS  3
346
2.48M
#define Q12_POS  10
347
2.48M
#define Q21_POS  17
348
2.48M
#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
40.9k
{
361
40.9k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
362
40.9k
  boolean smoothing_useful = FALSE;
363
40.9k
  int ci, coefi;
364
40.9k
  jpeg_component_info *compptr;
365
40.9k
  JQUANT_TBL *qtable;
366
40.9k
  int *coef_bits, *prev_coef_bits;
367
40.9k
  int *coef_bits_latch, *prev_coef_bits_latch;
368
369
40.9k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
370
10.5k
    return FALSE;
371
372
  /* Allocate latch area if not already done */
373
30.4k
  if (coef->coef_bits_latch == NULL)
374
30.4k
    coef->coef_bits_latch = (int *)
375
30.4k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
376
30.4k
                                  cinfo->num_components * 2 *
377
30.4k
                                  (SAVED_COEFS * sizeof(int)));
378
30.4k
  coef_bits_latch = coef->coef_bits_latch;
379
30.4k
  prev_coef_bits_latch =
380
30.4k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
381
382
71.6k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
383
58.9k
       ci++, compptr++) {
384
    /* All components' quantization values must already be latched. */
385
58.9k
    if ((qtable = compptr->quant_table) == NULL)
386
11.4k
      return FALSE;
387
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
388
47.4k
    if (qtable->quantval[0] == 0 ||
389
47.4k
        qtable->quantval[Q01_POS] == 0 ||
390
47.4k
        qtable->quantval[Q10_POS] == 0 ||
391
47.4k
        qtable->quantval[Q20_POS] == 0 ||
392
47.4k
        qtable->quantval[Q11_POS] == 0 ||
393
47.4k
        qtable->quantval[Q02_POS] == 0 ||
394
47.4k
        qtable->quantval[Q03_POS] == 0 ||
395
47.4k
        qtable->quantval[Q12_POS] == 0 ||
396
47.4k
        qtable->quantval[Q21_POS] == 0 ||
397
47.4k
        qtable->quantval[Q30_POS] == 0)
398
5.98k
      return FALSE;
399
    /* DC values must be at least partly known for all components. */
400
41.4k
    coef_bits = cinfo->coef_bits[ci];
401
41.4k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
402
41.4k
    if (coef_bits[0] < 0)
403
321
      return FALSE;
404
41.1k
    coef_bits_latch[0] = coef_bits[0];
405
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
406
411k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
407
370k
      if (cinfo->input_scan_number > 1)
408
195k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
409
175k
      else
410
175k
        prev_coef_bits_latch[coefi] = -1;
411
370k
      coef_bits_latch[coefi] = coef_bits[coefi];
412
370k
      if (coef_bits[coefi] != 0)
413
357k
        smoothing_useful = TRUE;
414
370k
    }
415
41.1k
    coef_bits_latch += SAVED_COEFS;
416
41.1k
    prev_coef_bits_latch += SAVED_COEFS;
417
41.1k
  }
418
419
12.6k
  return smoothing_useful;
420
30.4k
}
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
1.64M
{
430
1.64M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
431
1.64M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
432
1.64M
  JDIMENSION block_num, last_block_column;
433
1.64M
  int ci, block_row, block_rows, access_rows;
434
1.64M
  JBLOCKARRAY buffer;
435
1.64M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
436
1.64M
  JBLOCKROW next_block_row, next_next_block_row;
437
1.64M
  JSAMPARRAY output_ptr;
438
1.64M
  JDIMENSION output_col;
439
1.64M
  jpeg_component_info *compptr;
440
1.64M
  inverse_DCT_method_ptr inverse_DCT;
441
1.64M
  boolean change_dc;
442
1.64M
  JCOEF *workspace;
443
1.64M
  int *coef_bits;
444
1.64M
  JQUANT_TBL *quanttbl;
445
1.64M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
446
1.64M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
447
1.64M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
448
1.64M
      DC25;
449
1.64M
  int Al, pred;
450
451
  /* Keep a local variable to avoid looking it up more than once */
452
1.64M
  workspace = coef->workspace;
453
454
  /* Force some input to be done if we are getting ahead of the input. */
455
1.64M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
456
1.64M
         !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
6.53M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
473
4.88M
       ci++, compptr++) {
474
    /* Don't bother to IDCT an uninteresting component. */
475
4.88M
    if (!compptr->component_needed)
476
1.06M
      continue;
477
    /* Count non-dummy DCT block rows in this iMCU row. */
478
3.81M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
479
3.76M
      block_rows = compptr->v_samp_factor;
480
3.76M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
481
3.76M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
482
24.3k
      block_rows = compptr->v_samp_factor;
483
24.3k
      access_rows = block_rows * 2; /* this and next iMCU row */
484
28.7k
    } else {
485
      /* NB: can't use last_row_height here; it is input-side-dependent! */
486
28.7k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
487
28.7k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
488
28.7k
      access_rows = block_rows; /* this iMCU row only */
489
28.7k
    }
490
    /* Align the virtual buffer for this component. */
491
3.81M
    if (cinfo->output_iMCU_row > 1) {
492
3.76M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
493
3.76M
      buffer = (*cinfo->mem->access_virt_barray)
494
3.76M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
495
3.76M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
496
3.76M
         (JDIMENSION)access_rows, FALSE);
497
3.76M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
498
3.76M
    } else if (cinfo->output_iMCU_row > 0) {
499
24.3k
      buffer = (*cinfo->mem->access_virt_barray)
500
24.3k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
501
24.3k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
502
24.3k
         (JDIMENSION)access_rows, FALSE);
503
24.3k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
504
28.7k
    } else {
505
28.7k
      buffer = (*cinfo->mem->access_virt_barray)
506
28.7k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
507
28.7k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
508
28.7k
    }
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
3.81M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
514
271k
      coef_bits =
515
271k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
516
3.54M
    else
517
3.54M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
518
519
    /* We only do DC interpolation if no AC coefficient data is available. */
520
3.81M
    change_dc =
521
3.81M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
522
3.81M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
523
3.81M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
524
525
3.81M
    quanttbl = compptr->quant_table;
526
3.81M
    Q00 = quanttbl->quantval[0];
527
3.81M
    Q01 = quanttbl->quantval[Q01_POS];
528
3.81M
    Q10 = quanttbl->quantval[Q10_POS];
529
3.81M
    Q20 = quanttbl->quantval[Q20_POS];
530
3.81M
    Q11 = quanttbl->quantval[Q11_POS];
531
3.81M
    Q02 = quanttbl->quantval[Q02_POS];
532
3.81M
    if (change_dc) {
533
2.44M
      Q03 = quanttbl->quantval[Q03_POS];
534
2.44M
      Q12 = quanttbl->quantval[Q12_POS];
535
2.44M
      Q21 = quanttbl->quantval[Q21_POS];
536
2.44M
      Q30 = quanttbl->quantval[Q30_POS];
537
2.44M
    }
538
3.81M
    inverse_DCT = cinfo->idct->inverse_DCT[ci];
539
3.81M
    output_ptr = output_buf[ci];
540
    /* Loop over all DCT blocks to be processed. */
541
8.50M
    for (block_row = 0; block_row < block_rows; block_row++) {
542
4.68M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
543
544
4.68M
      if (block_row > 0 || cinfo->output_iMCU_row > 0)
545
4.65M
        prev_block_row =
546
4.65M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
547
28.7k
      else
548
28.7k
        prev_block_row = buffer_ptr;
549
550
4.68M
      if (block_row > 1 || cinfo->output_iMCU_row > 1)
551
4.61M
        prev_prev_block_row =
552
4.61M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
553
64.5k
      else
554
64.5k
        prev_prev_block_row = prev_block_row;
555
556
4.68M
      if (block_row < block_rows - 1 || cinfo->output_iMCU_row < last_iMCU_row)
557
4.65M
        next_block_row =
558
4.65M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
559
28.7k
      else
560
28.7k
        next_block_row = buffer_ptr;
561
562
4.68M
      if (block_row < block_rows - 2 ||
563
4.68M
          cinfo->output_iMCU_row + 1 < last_iMCU_row)
564
4.61M
        next_next_block_row =
565
4.61M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
566
64.0k
      else
567
64.0k
        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
4.68M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
573
4.68M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
574
4.68M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
575
4.68M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
576
4.68M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
577
4.68M
      output_col = 0;
578
4.68M
      last_block_column = compptr->width_in_blocks - 1;
579
4.68M
      for (block_num = cinfo->master->first_MCU_col[ci];
580
18.5M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
581
        /* Fetch current DCT block into workspace so we can modify it. */
582
13.8M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
583
        /* Update DC values */
584
13.8M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
585
13.8M
            block_num < last_block_column) {
586
3.60M
          DC04 = (int)prev_prev_block_row[1][0];
587
3.60M
          DC09 = (int)prev_block_row[1][0];
588
3.60M
          DC14 = (int)buffer_ptr[1][0];
589
3.60M
          DC19 = (int)next_block_row[1][0];
590
3.60M
          DC24 = (int)next_next_block_row[1][0];
591
3.60M
        }
592
13.8M
        if (block_num + 1 < last_block_column) {
593
5.55M
          DC05 = (int)prev_prev_block_row[2][0];
594
5.55M
          DC10 = (int)prev_block_row[2][0];
595
5.55M
          DC15 = (int)buffer_ptr[2][0];
596
5.55M
          DC20 = (int)next_block_row[2][0];
597
5.55M
          DC25 = (int)next_next_block_row[2][0];
598
5.55M
        }
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
13.8M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
611
13.4M
          num = Q00 * (change_dc ?
612
8.98M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
613
8.98M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
614
8.98M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
615
8.98M
                 DC21 - DC22 + DC24 + DC25) :
616
13.4M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
617
13.4M
          if (num >= 0) {
618
10.9M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
619
10.9M
            if (Al > 0 && pred >= (1 << Al))
620
1.68M
              pred = (1 << Al) - 1;
621
10.9M
          } else {
622
2.43M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
623
2.43M
            if (Al > 0 && pred >= (1 << Al))
624
63.5k
              pred = (1 << Al) - 1;
625
2.43M
            pred = -pred;
626
2.43M
          }
627
13.4M
          workspace[1] = (JCOEF)pred;
628
13.4M
        }
629
        /* AC10 */
630
13.8M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
631
13.2M
          num = Q00 * (change_dc ?
632
8.98M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
633
8.98M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
634
8.98M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
635
8.98M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
636
13.2M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
637
13.2M
          if (num >= 0) {
638
10.1M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
639
10.1M
            if (Al > 0 && pred >= (1 << Al))
640
2.22M
              pred = (1 << Al) - 1;
641
10.1M
          } else {
642
3.06M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
643
3.06M
            if (Al > 0 && pred >= (1 << Al))
644
366k
              pred = (1 << Al) - 1;
645
3.06M
            pred = -pred;
646
3.06M
          }
647
13.2M
          workspace[8] = (JCOEF)pred;
648
13.2M
        }
649
        /* AC20 */
650
13.8M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
651
13.1M
          num = Q00 * (change_dc ?
652
8.98M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
653
8.98M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
654
13.1M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
655
13.1M
          if (num >= 0) {
656
8.49M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
657
8.49M
            if (Al > 0 && pred >= (1 << Al))
658
300k
              pred = (1 << Al) - 1;
659
8.49M
          } else {
660
4.70M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
661
4.70M
            if (Al > 0 && pred >= (1 << Al))
662
308k
              pred = (1 << Al) - 1;
663
4.70M
            pred = -pred;
664
4.70M
          }
665
13.1M
          workspace[16] = (JCOEF)pred;
666
13.1M
        }
667
        /* AC11 */
668
13.8M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
669
12.9M
          num = Q00 * (change_dc ?
670
8.98M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
671
8.98M
                 9 * DC19 + DC21 - DC25) :
672
12.9M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
673
3.98M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
674
12.9M
          if (num >= 0) {
675
10.5M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
676
10.5M
            if (Al > 0 && pred >= (1 << Al))
677
156k
              pred = (1 << Al) - 1;
678
10.5M
          } else {
679
2.45M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
680
2.45M
            if (Al > 0 && pred >= (1 << Al))
681
158k
              pred = (1 << Al) - 1;
682
2.45M
            pred = -pred;
683
2.45M
          }
684
12.9M
          workspace[9] = (JCOEF)pred;
685
12.9M
        }
686
        /* AC02 */
687
13.8M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
688
12.9M
          num = Q00 * (change_dc ?
689
8.98M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
690
8.98M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
691
12.9M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
692
12.9M
          if (num >= 0) {
693
7.60M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
694
7.60M
            if (Al > 0 && pred >= (1 << Al))
695
593k
              pred = (1 << Al) - 1;
696
7.60M
          } else {
697
5.33M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
698
5.33M
            if (Al > 0 && pred >= (1 << Al))
699
653k
              pred = (1 << Al) - 1;
700
5.33M
            pred = -pred;
701
5.33M
          }
702
12.9M
          workspace[2] = (JCOEF)pred;
703
12.9M
        }
704
13.8M
        if (change_dc) {
705
          /* AC03 */
706
8.98M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
707
8.98M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
708
8.98M
            if (num >= 0) {
709
7.49M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
710
7.49M
              if (Al > 0 && pred >= (1 << Al))
711
0
                pred = (1 << Al) - 1;
712
7.49M
            } else {
713
1.49M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
714
1.49M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
1.49M
              pred = -pred;
717
1.49M
            }
718
8.98M
            workspace[3] = (JCOEF)pred;
719
8.98M
          }
720
          /* AC12 */
721
8.98M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
722
8.98M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
723
8.98M
            if (num >= 0) {
724
4.77M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
725
4.77M
              if (Al > 0 && pred >= (1 << Al))
726
0
                pred = (1 << Al) - 1;
727
4.77M
            } else {
728
4.21M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
729
4.21M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
4.21M
              pred = -pred;
732
4.21M
            }
733
8.98M
            workspace[10] = (JCOEF)pred;
734
8.98M
          }
735
          /* AC21 */
736
8.98M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
737
8.98M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
738
8.98M
            if (num >= 0) {
739
6.25M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
740
6.25M
              if (Al > 0 && pred >= (1 << Al))
741
0
                pred = (1 << Al) - 1;
742
6.25M
            } else {
743
2.72M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
744
2.72M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
2.72M
              pred = -pred;
747
2.72M
            }
748
8.98M
            workspace[17] = (JCOEF)pred;
749
8.98M
          }
750
          /* AC30 */
751
8.98M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
752
8.98M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
753
8.98M
            if (num >= 0) {
754
6.97M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
755
6.97M
              if (Al > 0 && pred >= (1 << Al))
756
0
                pred = (1 << Al) - 1;
757
6.97M
            } else {
758
2.01M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
759
2.01M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
2.01M
              pred = -pred;
762
2.01M
            }
763
8.98M
            workspace[24] = (JCOEF)pred;
764
8.98M
          }
765
          /* coef_bits[0] is non-negative.  Otherwise this function would not
766
           * be called.
767
           */
768
8.98M
          num = Q00 *
769
8.98M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
770
8.98M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
771
8.98M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
772
8.98M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
773
8.98M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
774
8.98M
          if (num >= 0) {
775
6.24M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
776
6.24M
          } else {
777
2.73M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
778
2.73M
            pred = -pred;
779
2.73M
          }
780
8.98M
          workspace[0] = (JCOEF)pred;
781
8.98M
        }  /* change_dc */
782
783
        /* OK, do the IDCT */
784
13.8M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
785
13.8M
                        output_col);
786
        /* Advance for next column */
787
13.8M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
788
13.8M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
789
13.8M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
790
13.8M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
791
13.8M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
792
13.8M
        buffer_ptr++, prev_block_row++, next_block_row++,
793
13.8M
          prev_prev_block_row++, next_next_block_row++;
794
13.8M
        output_col += compptr->_DCT_scaled_size;
795
13.8M
      }
796
4.68M
      output_ptr += compptr->_DCT_scaled_size;
797
4.68M
    }
798
3.81M
  }
799
800
1.64M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
801
1.63M
    return JPEG_ROW_COMPLETED;
802
12.5k
  return JPEG_SCAN_COMPLETED;
803
1.64M
}
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
135k
{
815
135k
  my_coef_ptr coef;
816
817
135k
  coef = (my_coef_ptr)
818
135k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
819
135k
                                sizeof(my_coef_controller));
820
135k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
821
135k
  coef->pub.start_input_pass = start_input_pass;
822
135k
  coef->pub.start_output_pass = start_output_pass;
823
135k
#ifdef BLOCK_SMOOTHING_SUPPORTED
824
135k
  coef->coef_bits_latch = NULL;
825
135k
#endif
826
827
  /* Create the coefficient buffer. */
828
135k
  if (need_full_buffer) {
829
100k
#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
100k
    int ci, access_rows;
834
100k
    jpeg_component_info *compptr;
835
836
400k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
837
299k
         ci++, compptr++) {
838
299k
      access_rows = compptr->v_samp_factor;
839
299k
#ifdef BLOCK_SMOOTHING_SUPPORTED
840
      /* If block smoothing could be used, need a bigger window */
841
299k
      if (cinfo->progressive_mode)
842
198k
        access_rows *= 5;
843
299k
#endif
844
299k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
845
299k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
846
299k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
847
299k
                               (long)compptr->h_samp_factor),
848
299k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
849
299k
                               (long)compptr->v_samp_factor),
850
299k
         (JDIMENSION)access_rows);
851
299k
    }
852
100k
    coef->pub.consume_data = consume_data;
853
100k
    coef->pub.decompress_data = decompress_data;
854
100k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
855
#else
856
    ERREXIT(cinfo, JERR_NOT_COMPILED);
857
#endif
858
100k
  } else {
859
    /* We only need a single-MCU buffer. */
860
34.8k
    JBLOCKROW buffer;
861
34.8k
    int i;
862
863
34.8k
    buffer = (JBLOCKROW)
864
34.8k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
865
34.8k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
866
383k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
867
348k
      coef->MCU_buffer[i] = buffer + i;
868
348k
    }
869
34.8k
    coef->pub.consume_data = dummy_consume_data;
870
34.8k
    coef->pub.decompress_data = decompress_onepass;
871
34.8k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
872
34.8k
  }
873
874
  /* Allocate the workspace buffer */
875
135k
  coef->workspace = (JCOEF *)
876
135k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
135k
                                sizeof(JCOEF) * DCTSIZE2);
878
135k
}