Coverage Report

Created: 2024-08-15 14:02

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