Coverage Report

Created: 2023-10-27 07:46

/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.79M
{
47
1.79M
  cinfo->input_iMCU_row = 0;
48
1.79M
  start_iMCU_row(cinfo);
49
1.79M
}
50
51
52
/*
53
 * Initialize for an output processing pass.
54
 */
55
56
METHODDEF(void)
57
start_output_pass(j_decompress_ptr cinfo)
58
68.4k
{
59
68.4k
#ifdef BLOCK_SMOOTHING_SUPPORTED
60
68.4k
  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
68.4k
  if (coef->pub.coef_arrays != NULL) {
64
38.8k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
65
11.9k
      coef->pub.decompress_data = decompress_smooth_data;
66
26.9k
    else
67
26.9k
      coef->pub.decompress_data = decompress_data;
68
38.8k
  }
69
68.4k
#endif
70
68.4k
  cinfo->output_iMCU_row = 0;
71
68.4k
}
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
748k
{
87
748k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
88
748k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
89
748k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
90
748k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
91
748k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
92
748k
  JSAMPARRAY output_ptr;
93
748k
  JDIMENSION start_col, output_col;
94
748k
  jpeg_component_info *compptr;
95
748k
  inverse_DCT_method_ptr inverse_DCT;
96
97
  /* Loop to process as much as one whole iMCU row */
98
1.56M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
99
813k
       yoffset++) {
100
5.56M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
101
4.75M
         MCU_col_num++) {
102
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
103
4.75M
      jzero_far((void *)coef->MCU_buffer[0],
104
4.75M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
105
4.75M
      if (!cinfo->entropy->insufficient_data)
106
1.94M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
107
4.75M
      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
4.75M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
118
4.75M
          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
4.75M
        blkn = 0;               /* index of current DCT block within MCU */
125
16.1M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
126
11.3M
          compptr = cinfo->cur_comp_info[ci];
127
          /* Don't bother to IDCT an uninteresting component. */
128
11.3M
          if (!compptr->component_needed) {
129
2.20M
            blkn += compptr->MCU_blocks;
130
2.20M
            continue;
131
2.20M
          }
132
9.19M
          inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];
133
9.19M
          useful_width = (MCU_col_num < last_MCU_col) ?
134
7.53M
                         compptr->MCU_width : compptr->last_col_width;
135
9.19M
          output_ptr = output_buf[compptr->component_index] +
136
9.19M
                       yoffset * compptr->_DCT_scaled_size;
137
9.19M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
138
9.19M
                      compptr->MCU_sample_width;
139
21.9M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
140
12.8M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
141
12.8M
                yoffset + yindex < compptr->last_row_height) {
142
12.3M
              output_col = start_col;
143
33.2M
              for (xindex = 0; xindex < useful_width; xindex++) {
144
20.9M
                (*inverse_DCT) (cinfo, compptr,
145
20.9M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
146
20.9M
                                output_ptr, output_col);
147
20.9M
                output_col += compptr->_DCT_scaled_size;
148
20.9M
              }
149
12.3M
            }
150
12.8M
            blkn += compptr->MCU_width;
151
12.8M
            output_ptr += compptr->_DCT_scaled_size;
152
12.8M
          }
153
9.19M
        }
154
4.75M
      }
155
4.75M
    }
156
    /* Completed an MCU row, but perhaps not an iMCU row */
157
813k
    coef->MCU_ctr = 0;
158
813k
  }
159
  /* Completed the iMCU row, advance counters for next one */
160
748k
  cinfo->output_iMCU_row++;
161
748k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
162
719k
    start_iMCU_row(cinfo);
163
719k
    return JPEG_ROW_COMPLETED;
164
719k
  }
165
  /* Completed the scan */
166
29.5k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
167
29.5k
  return JPEG_SCAN_COMPLETED;
168
748k
}
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
23.9M
{
194
23.9M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
195
23.9M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
196
23.9M
  int blkn, ci, xindex, yindex, yoffset;
197
23.9M
  JDIMENSION start_col;
198
23.9M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
199
23.9M
  JBLOCKROW buffer_ptr;
200
23.9M
  jpeg_component_info *compptr;
201
202
  /* Align the virtual buffers for the components used in this scan. */
203
55.9M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
204
31.9M
    compptr = cinfo->cur_comp_info[ci];
205
31.9M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
206
31.9M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
207
31.9M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
208
31.9M
       (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
31.9M
  }
214
215
  /* Loop to process one whole iMCU row */
216
94.2M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
217
70.3M
       yoffset++) {
218
224M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
219
154M
         MCU_col_num++) {
220
      /* Construct list of pointers to DCT blocks belonging to this MCU */
221
154M
      blkn = 0;                 /* index of current DCT block within MCU */
222
327M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
223
173M
        compptr = cinfo->cur_comp_info[ci];
224
173M
        start_col = MCU_col_num * compptr->MCU_width;
225
354M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
226
181M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
227
376M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
228
195M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
229
195M
          }
230
181M
        }
231
173M
      }
232
154M
      if (!cinfo->entropy->insufficient_data)
233
90.8M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
234
      /* Try to fetch the MCU. */
235
154M
      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
154M
    }
242
    /* Completed an MCU row, but perhaps not an iMCU row */
243
70.3M
    coef->MCU_ctr = 0;
244
70.3M
  }
245
  /* Completed the iMCU row, advance counters for next one */
246
23.9M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
247
22.1M
    start_iMCU_row(cinfo);
248
22.1M
    return JPEG_ROW_COMPLETED;
249
22.1M
  }
250
  /* Completed the scan */
251
1.76M
  (*cinfo->inputctl->finish_input_pass) (cinfo);
252
1.76M
  return JPEG_SCAN_COMPLETED;
253
23.9M
}
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
962k
{
267
962k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
268
962k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
269
962k
  JDIMENSION block_num;
270
962k
  int ci, block_row, block_rows;
271
962k
  JBLOCKARRAY buffer;
272
962k
  JBLOCKROW buffer_ptr;
273
962k
  JSAMPARRAY output_ptr;
274
962k
  JDIMENSION output_col;
275
962k
  jpeg_component_info *compptr;
276
962k
  inverse_DCT_method_ptr inverse_DCT;
277
278
  /* Force some input to be done if we are getting ahead of the input. */
279
962k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
280
962k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
281
962k
          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.35M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
288
2.38M
       ci++, compptr++) {
289
    /* Don't bother to IDCT an uninteresting component. */
290
2.38M
    if (!compptr->component_needed)
291
408k
      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
64.3k
    else {
301
      /* NB: can't use last_row_height here; it is input-side-dependent! */
302
64.3k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
303
64.3k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
304
64.3k
    }
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.17M
    for (block_row = 0; block_row < block_rows; block_row++) {
309
3.19M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
310
3.19M
      output_col = 0;
311
3.19M
      for (block_num = cinfo->master->first_MCU_col[ci];
312
16.9M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
313
13.7M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
314
13.7M
                        output_col);
315
13.7M
        buffer_ptr++;
316
13.7M
        output_col += compptr->_DCT_scaled_size;
317
13.7M
      }
318
3.19M
      output_ptr += compptr->_DCT_scaled_size;
319
3.19M
    }
320
1.98M
  }
321
322
962k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
323
935k
    return JPEG_ROW_COMPLETED;
324
26.9k
  return JPEG_SCAN_COMPLETED;
325
962k
}
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.35M
#define Q01_POS  1
341
3.35M
#define Q10_POS  8
342
3.35M
#define Q20_POS  16
343
3.35M
#define Q11_POS  9
344
3.35M
#define Q02_POS  2
345
2.30M
#define Q03_POS  3
346
2.30M
#define Q12_POS  10
347
2.30M
#define Q21_POS  17
348
2.30M
#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
38.8k
{
361
38.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
362
38.8k
  boolean smoothing_useful = FALSE;
363
38.8k
  int ci, coefi;
364
38.8k
  jpeg_component_info *compptr;
365
38.8k
  JQUANT_TBL *qtable;
366
38.8k
  int *coef_bits, *prev_coef_bits;
367
38.8k
  int *coef_bits_latch, *prev_coef_bits_latch;
368
369
38.8k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
370
9.87k
    return FALSE;
371
372
  /* Allocate latch area if not already done */
373
29.0k
  if (coef->coef_bits_latch == NULL)
374
29.0k
    coef->coef_bits_latch = (int *)
375
29.0k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
376
29.0k
                                  cinfo->num_components * 2 *
377
29.0k
                                  (SAVED_COEFS * sizeof(int)));
378
29.0k
  coef_bits_latch = coef->coef_bits_latch;
379
29.0k
  prev_coef_bits_latch =
380
29.0k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
381
382
68.1k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
383
56.0k
       ci++, compptr++) {
384
    /* All components' quantization values must already be latched. */
385
56.0k
    if ((qtable = compptr->quant_table) == NULL)
386
10.8k
      return FALSE;
387
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
388
45.1k
    if (qtable->quantval[0] == 0 ||
389
45.1k
        qtable->quantval[Q01_POS] == 0 ||
390
45.1k
        qtable->quantval[Q10_POS] == 0 ||
391
45.1k
        qtable->quantval[Q20_POS] == 0 ||
392
45.1k
        qtable->quantval[Q11_POS] == 0 ||
393
45.1k
        qtable->quantval[Q02_POS] == 0 ||
394
45.1k
        qtable->quantval[Q03_POS] == 0 ||
395
45.1k
        qtable->quantval[Q12_POS] == 0 ||
396
45.1k
        qtable->quantval[Q21_POS] == 0 ||
397
45.1k
        qtable->quantval[Q30_POS] == 0)
398
5.57k
      return FALSE;
399
    /* DC values must be at least partly known for all components. */
400
39.6k
    coef_bits = cinfo->coef_bits[ci];
401
39.6k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
402
39.6k
    if (coef_bits[0] < 0)
403
508
      return FALSE;
404
39.1k
    coef_bits_latch[0] = coef_bits[0];
405
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
406
391k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
407
352k
      if (cinfo->input_scan_number > 1)
408
179k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
409
172k
      else
410
172k
        prev_coef_bits_latch[coefi] = -1;
411
352k
      coef_bits_latch[coefi] = coef_bits[coefi];
412
352k
      if (coef_bits[coefi] != 0)
413
343k
        smoothing_useful = TRUE;
414
352k
    }
415
39.1k
    coef_bits_latch += SAVED_COEFS;
416
39.1k
    prev_coef_bits_latch += SAVED_COEFS;
417
39.1k
  }
418
419
12.0k
  return smoothing_useful;
420
29.0k
}
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.45M
{
430
1.45M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
431
1.45M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
432
1.45M
  JDIMENSION block_num, last_block_column;
433
1.45M
  int ci, block_row, block_rows, access_rows;
434
1.45M
  JBLOCKARRAY buffer;
435
1.45M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
436
1.45M
  JBLOCKROW next_block_row, next_next_block_row;
437
1.45M
  JSAMPARRAY output_ptr;
438
1.45M
  JDIMENSION output_col;
439
1.45M
  jpeg_component_info *compptr;
440
1.45M
  inverse_DCT_method_ptr inverse_DCT;
441
1.45M
  boolean change_dc;
442
1.45M
  JCOEF *workspace;
443
1.45M
  int *coef_bits;
444
1.45M
  JQUANT_TBL *quanttbl;
445
1.45M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
446
1.45M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
447
1.45M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
448
1.45M
      DC25;
449
1.45M
  int Al, pred;
450
451
  /* Keep a local variable to avoid looking it up more than once */
452
1.45M
  workspace = coef->workspace;
453
454
  /* Force some input to be done if we are getting ahead of the input. */
455
1.45M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
456
1.45M
         !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
5.69M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
473
4.23M
       ci++, compptr++) {
474
    /* Don't bother to IDCT an uninteresting component. */
475
4.23M
    if (!compptr->component_needed)
476
924k
      continue;
477
    /* Count non-dummy DCT block rows in this iMCU row. */
478
3.31M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
479
3.26M
      block_rows = compptr->v_samp_factor;
480
3.26M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
481
3.26M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
482
23.1k
      block_rows = compptr->v_samp_factor;
483
23.1k
      access_rows = block_rows * 2; /* this and next iMCU row */
484
27.4k
    } else {
485
      /* NB: can't use last_row_height here; it is input-side-dependent! */
486
27.4k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
487
27.4k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
488
27.4k
      access_rows = block_rows; /* this iMCU row only */
489
27.4k
    }
490
    /* Align the virtual buffer for this component. */
491
3.31M
    if (cinfo->output_iMCU_row > 1) {
492
3.26M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
493
3.26M
      buffer = (*cinfo->mem->access_virt_barray)
494
3.26M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
495
3.26M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
496
3.26M
         (JDIMENSION)access_rows, FALSE);
497
3.26M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
498
3.26M
    } else if (cinfo->output_iMCU_row > 0) {
499
23.1k
      buffer = (*cinfo->mem->access_virt_barray)
500
23.1k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
501
23.1k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
502
23.1k
         (JDIMENSION)access_rows, FALSE);
503
23.1k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
504
27.4k
    } else {
505
27.4k
      buffer = (*cinfo->mem->access_virt_barray)
506
27.4k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
507
27.4k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
508
27.4k
    }
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.31M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
514
293k
      coef_bits =
515
293k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
516
3.01M
    else
517
3.01M
      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.31M
    change_dc =
521
3.31M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
522
3.31M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
523
3.31M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
524
525
3.31M
    quanttbl = compptr->quant_table;
526
3.31M
    Q00 = quanttbl->quantval[0];
527
3.31M
    Q01 = quanttbl->quantval[Q01_POS];
528
3.31M
    Q10 = quanttbl->quantval[Q10_POS];
529
3.31M
    Q20 = quanttbl->quantval[Q20_POS];
530
3.31M
    Q11 = quanttbl->quantval[Q11_POS];
531
3.31M
    Q02 = quanttbl->quantval[Q02_POS];
532
3.31M
    if (change_dc) {
533
2.26M
      Q03 = quanttbl->quantval[Q03_POS];
534
2.26M
      Q12 = quanttbl->quantval[Q12_POS];
535
2.26M
      Q21 = quanttbl->quantval[Q21_POS];
536
2.26M
      Q30 = quanttbl->quantval[Q30_POS];
537
2.26M
    }
538
3.31M
    inverse_DCT = cinfo->idct->inverse_DCT[ci];
539
3.31M
    output_ptr = output_buf[ci];
540
    /* Loop over all DCT blocks to be processed. */
541
7.25M
    for (block_row = 0; block_row < block_rows; block_row++) {
542
3.93M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
543
544
3.93M
      if (block_row > 0 || cinfo->output_iMCU_row > 0)
545
3.91M
        prev_block_row =
546
3.91M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
547
27.4k
      else
548
27.4k
        prev_block_row = buffer_ptr;
549
550
3.93M
      if (block_row > 1 || cinfo->output_iMCU_row > 1)
551
3.87M
        prev_prev_block_row =
552
3.87M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
553
62.2k
      else
554
62.2k
        prev_prev_block_row = prev_block_row;
555
556
3.93M
      if (block_row < block_rows - 1 || cinfo->output_iMCU_row < last_iMCU_row)
557
3.91M
        next_block_row =
558
3.91M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
559
27.4k
      else
560
27.4k
        next_block_row = buffer_ptr;
561
562
3.93M
      if (block_row < block_rows - 2 ||
563
3.93M
          cinfo->output_iMCU_row + 1 < last_iMCU_row)
564
3.87M
        next_next_block_row =
565
3.87M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
566
61.6k
      else
567
61.6k
        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
3.93M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
573
3.93M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
574
3.93M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
575
3.93M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
576
3.93M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
577
3.93M
      output_col = 0;
578
3.93M
      last_block_column = compptr->width_in_blocks - 1;
579
3.93M
      for (block_num = cinfo->master->first_MCU_col[ci];
580
17.8M
           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.76M
          DC04 = (int)prev_prev_block_row[1][0];
587
3.76M
          DC09 = (int)prev_block_row[1][0];
588
3.76M
          DC14 = (int)buffer_ptr[1][0];
589
3.76M
          DC19 = (int)next_block_row[1][0];
590
3.76M
          DC24 = (int)next_next_block_row[1][0];
591
3.76M
        }
592
13.8M
        if (block_num + 1 < last_block_column) {
593
6.16M
          DC05 = (int)prev_prev_block_row[2][0];
594
6.16M
          DC10 = (int)prev_block_row[2][0];
595
6.16M
          DC15 = (int)buffer_ptr[2][0];
596
6.16M
          DC20 = (int)next_block_row[2][0];
597
6.16M
          DC25 = (int)next_next_block_row[2][0];
598
6.16M
        }
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.6M
          num = Q00 * (change_dc ?
612
9.44M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
613
9.44M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
614
9.44M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
615
9.44M
                 DC21 - DC22 + DC24 + DC25) :
616
13.6M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
617
13.6M
          if (num >= 0) {
618
10.9M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
619
10.9M
            if (Al > 0 && pred >= (1 << Al))
620
1.13M
              pred = (1 << Al) - 1;
621
10.9M
          } else {
622
2.76M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
623
2.76M
            if (Al > 0 && pred >= (1 << Al))
624
44.4k
              pred = (1 << Al) - 1;
625
2.76M
            pred = -pred;
626
2.76M
          }
627
13.6M
          workspace[1] = (JCOEF)pred;
628
13.6M
        }
629
        /* AC10 */
630
13.8M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
631
13.4M
          num = Q00 * (change_dc ?
632
9.44M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
633
9.44M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
634
9.44M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
635
9.44M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
636
13.4M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
637
13.4M
          if (num >= 0) {
638
10.3M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
639
10.3M
            if (Al > 0 && pred >= (1 << Al))
640
1.89M
              pred = (1 << Al) - 1;
641
10.3M
          } else {
642
3.10M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
643
3.10M
            if (Al > 0 && pred >= (1 << Al))
644
242k
              pred = (1 << Al) - 1;
645
3.10M
            pred = -pred;
646
3.10M
          }
647
13.4M
          workspace[8] = (JCOEF)pred;
648
13.4M
        }
649
        /* AC20 */
650
13.8M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
651
13.4M
          num = Q00 * (change_dc ?
652
9.44M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
653
9.44M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
654
13.4M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
655
13.4M
          if (num >= 0) {
656
8.85M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
657
8.85M
            if (Al > 0 && pred >= (1 << Al))
658
151k
              pred = (1 << Al) - 1;
659
8.85M
          } else {
660
4.60M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
661
4.60M
            if (Al > 0 && pred >= (1 << Al))
662
157k
              pred = (1 << Al) - 1;
663
4.60M
            pred = -pred;
664
4.60M
          }
665
13.4M
          workspace[16] = (JCOEF)pred;
666
13.4M
        }
667
        /* AC11 */
668
13.8M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
669
13.4M
          num = Q00 * (change_dc ?
670
9.44M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
671
9.44M
                 9 * DC19 + DC21 - DC25) :
672
13.4M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
673
3.97M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
674
13.4M
          if (num >= 0) {
675
10.7M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
676
10.7M
            if (Al > 0 && pred >= (1 << Al))
677
96.3k
              pred = (1 << Al) - 1;
678
10.7M
          } else {
679
2.69M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
680
2.69M
            if (Al > 0 && pred >= (1 << Al))
681
97.1k
              pred = (1 << Al) - 1;
682
2.69M
            pred = -pred;
683
2.69M
          }
684
13.4M
          workspace[9] = (JCOEF)pred;
685
13.4M
        }
686
        /* AC02 */
687
13.8M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
688
13.5M
          num = Q00 * (change_dc ?
689
9.44M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
690
9.44M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
691
13.5M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
692
13.5M
          if (num >= 0) {
693
7.96M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
694
7.96M
            if (Al > 0 && pred >= (1 << Al))
695
341k
              pred = (1 << Al) - 1;
696
7.96M
          } else {
697
5.55M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
698
5.55M
            if (Al > 0 && pred >= (1 << Al))
699
356k
              pred = (1 << Al) - 1;
700
5.55M
            pred = -pred;
701
5.55M
          }
702
13.5M
          workspace[2] = (JCOEF)pred;
703
13.5M
        }
704
13.8M
        if (change_dc) {
705
          /* AC03 */
706
9.44M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
707
9.44M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
708
9.44M
            if (num >= 0) {
709
7.71M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
710
7.71M
              if (Al > 0 && pred >= (1 << Al))
711
0
                pred = (1 << Al) - 1;
712
7.71M
            } else {
713
1.72M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
714
1.72M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
1.72M
              pred = -pred;
717
1.72M
            }
718
9.44M
            workspace[3] = (JCOEF)pred;
719
9.44M
          }
720
          /* AC12 */
721
9.44M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
722
9.44M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
723
9.44M
            if (num >= 0) {
724
5.33M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
725
5.33M
              if (Al > 0 && pred >= (1 << Al))
726
0
                pred = (1 << Al) - 1;
727
5.33M
            } else {
728
4.11M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
729
4.11M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
4.11M
              pred = -pred;
732
4.11M
            }
733
9.44M
            workspace[10] = (JCOEF)pred;
734
9.44M
          }
735
          /* AC21 */
736
9.44M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
737
9.44M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
738
9.44M
            if (num >= 0) {
739
6.61M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
740
6.61M
              if (Al > 0 && pred >= (1 << Al))
741
0
                pred = (1 << Al) - 1;
742
6.61M
            } else {
743
2.82M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
744
2.82M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
2.82M
              pred = -pred;
747
2.82M
            }
748
9.44M
            workspace[17] = (JCOEF)pred;
749
9.44M
          }
750
          /* AC30 */
751
9.44M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
752
9.44M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
753
9.44M
            if (num >= 0) {
754
7.38M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
755
7.38M
              if (Al > 0 && pred >= (1 << Al))
756
0
                pred = (1 << Al) - 1;
757
7.38M
            } else {
758
2.06M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
759
2.06M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
2.06M
              pred = -pred;
762
2.06M
            }
763
9.44M
            workspace[24] = (JCOEF)pred;
764
9.44M
          }
765
          /* coef_bits[0] is non-negative.  Otherwise this function would not
766
           * be called.
767
           */
768
9.44M
          num = Q00 *
769
9.44M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
770
9.44M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
771
9.44M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
772
9.44M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
773
9.44M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
774
9.44M
          if (num >= 0) {
775
6.91M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
776
6.91M
          } else {
777
2.52M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
778
2.52M
            pred = -pred;
779
2.52M
          }
780
9.44M
          workspace[0] = (JCOEF)pred;
781
9.44M
        }  /* 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
3.93M
      output_ptr += compptr->_DCT_scaled_size;
797
3.93M
    }
798
3.31M
  }
799
800
1.45M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
801
1.44M
    return JPEG_ROW_COMPLETED;
802
11.9k
  return JPEG_SCAN_COMPLETED;
803
1.45M
}
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
128k
{
815
128k
  my_coef_ptr coef;
816
817
128k
  coef = (my_coef_ptr)
818
128k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
819
128k
                                sizeof(my_coef_controller));
820
128k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
821
128k
  coef->pub.start_input_pass = start_input_pass;
822
128k
  coef->pub.start_output_pass = start_output_pass;
823
128k
#ifdef BLOCK_SMOOTHING_SUPPORTED
824
128k
  coef->coef_bits_latch = NULL;
825
128k
#endif
826
827
  /* Create the coefficient buffer. */
828
128k
  if (need_full_buffer) {
829
95.8k
#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
95.8k
    int ci, access_rows;
834
95.8k
    jpeg_component_info *compptr;
835
836
380k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
837
285k
         ci++, compptr++) {
838
285k
      access_rows = compptr->v_samp_factor;
839
285k
#ifdef BLOCK_SMOOTHING_SUPPORTED
840
      /* If block smoothing could be used, need a bigger window */
841
285k
      if (cinfo->progressive_mode)
842
188k
        access_rows *= 5;
843
285k
#endif
844
285k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
845
285k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
846
285k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
847
285k
                               (long)compptr->h_samp_factor),
848
285k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
849
285k
                               (long)compptr->v_samp_factor),
850
285k
         (JDIMENSION)access_rows);
851
285k
    }
852
95.8k
    coef->pub.consume_data = consume_data;
853
95.8k
    coef->pub.decompress_data = decompress_data;
854
95.8k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
855
#else
856
    ERREXIT(cinfo, JERR_NOT_COMPILED);
857
#endif
858
95.8k
  } else {
859
    /* We only need a single-MCU buffer. */
860
32.6k
    JBLOCKROW buffer;
861
32.6k
    int i;
862
863
32.6k
    buffer = (JBLOCKROW)
864
32.6k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
865
32.6k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
866
359k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
867
326k
      coef->MCU_buffer[i] = buffer + i;
868
326k
    }
869
32.6k
    coef->pub.consume_data = dummy_consume_data;
870
32.6k
    coef->pub.decompress_data = decompress_onepass;
871
32.6k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
872
32.6k
  }
873
874
  /* Allocate the workspace buffer */
875
128k
  coef->workspace = (JCOEF *)
876
128k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
128k
                                sizeof(JCOEF) * DCTSIZE2);
878
128k
}