Coverage Report

Created: 2024-08-17 10:58

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