Coverage Report

Created: 2023-03-26 14:49

/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
2.06M
{
47
2.06M
  cinfo->input_iMCU_row = 0;
48
2.06M
  start_iMCU_row(cinfo);
49
2.06M
}
50
51
52
/*
53
 * Initialize for an output processing pass.
54
 */
55
56
METHODDEF(void)
57
start_output_pass(j_decompress_ptr cinfo)
58
72.2k
{
59
72.2k
#ifdef BLOCK_SMOOTHING_SUPPORTED
60
72.2k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
61
62
  /* If multipass, check to see whether to use block smoothing on this pass */
63
72.2k
  if (coef->pub.coef_arrays != NULL) {
64
41.6k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
65
13.5k
      coef->pub.decompress_data = decompress_smooth_data;
66
28.1k
    else
67
28.1k
      coef->pub.decompress_data = decompress_data;
68
41.6k
  }
69
72.2k
#endif
70
72.2k
  cinfo->output_iMCU_row = 0;
71
72.2k
}
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
787k
{
87
787k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
88
787k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
89
787k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
90
787k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
91
787k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
92
787k
  JSAMPARRAY output_ptr;
93
787k
  JDIMENSION start_col, output_col;
94
787k
  jpeg_component_info *compptr;
95
787k
  inverse_DCT_method_ptr inverse_DCT;
96
97
  /* Loop to process as much as one whole iMCU row */
98
1.61M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
99
828k
       yoffset++) {
100
5.79M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
101
4.96M
         MCU_col_num++) {
102
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
103
4.96M
      jzero_far((void *)coef->MCU_buffer[0],
104
4.96M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
105
4.96M
      if (!cinfo->entropy->insufficient_data)
106
1.98M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
107
4.96M
      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.96M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
118
4.96M
          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.96M
        blkn = 0;               /* index of current DCT block within MCU */
125
16.9M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
126
12.0M
          compptr = cinfo->cur_comp_info[ci];
127
          /* Don't bother to IDCT an uninteresting component. */
128
12.0M
          if (!compptr->component_needed) {
129
2.32M
            blkn += compptr->MCU_blocks;
130
2.32M
            continue;
131
2.32M
          }
132
9.67M
          inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];
133
9.67M
          useful_width = (MCU_col_num < last_MCU_col) ?
134
7.95M
                         compptr->MCU_width : compptr->last_col_width;
135
9.67M
          output_ptr = output_buf[compptr->component_index] +
136
9.67M
                       yoffset * compptr->_DCT_scaled_size;
137
9.67M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
138
9.67M
                      compptr->MCU_sample_width;
139
23.1M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
140
13.5M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
141
13.5M
                yoffset + yindex < compptr->last_row_height) {
142
13.0M
              output_col = start_col;
143
35.3M
              for (xindex = 0; xindex < useful_width; xindex++) {
144
22.3M
                (*inverse_DCT) (cinfo, compptr,
145
22.3M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
146
22.3M
                                output_ptr, output_col);
147
22.3M
                output_col += compptr->_DCT_scaled_size;
148
22.3M
              }
149
13.0M
            }
150
13.5M
            blkn += compptr->MCU_width;
151
13.5M
            output_ptr += compptr->_DCT_scaled_size;
152
13.5M
          }
153
9.67M
        }
154
4.96M
      }
155
4.96M
    }
156
    /* Completed an MCU row, but perhaps not an iMCU row */
157
828k
    coef->MCU_ctr = 0;
158
828k
  }
159
  /* Completed the iMCU row, advance counters for next one */
160
787k
  cinfo->output_iMCU_row++;
161
787k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
162
757k
    start_iMCU_row(cinfo);
163
757k
    return JPEG_ROW_COMPLETED;
164
757k
  }
165
  /* Completed the scan */
166
30.6k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
167
30.6k
  return JPEG_SCAN_COMPLETED;
168
787k
}
169
170
171
/*
172
 * Dummy consume-input routine for single-pass operation.
173
 */
174
175
METHODDEF(int)
176
dummy_consume_data(j_decompress_ptr cinfo)
177
0
{
178
0
  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
179
0
}
180
181
182
#ifdef D_MULTISCAN_FILES_SUPPORTED
183
184
/*
185
 * Consume input data and store it in the full-image coefficient buffer.
186
 * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
187
 * ie, v_samp_factor block rows for each component in the scan.
188
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
189
 */
190
191
METHODDEF(int)
192
consume_data(j_decompress_ptr cinfo)
193
26.7M
{
194
26.7M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
195
26.7M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
196
26.7M
  int blkn, ci, xindex, yindex, yoffset;
197
26.7M
  JDIMENSION start_col;
198
26.7M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
199
26.7M
  JBLOCKROW buffer_ptr;
200
26.7M
  jpeg_component_info *compptr;
201
202
  /* Align the virtual buffers for the components used in this scan. */
203
61.3M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
204
34.5M
    compptr = cinfo->cur_comp_info[ci];
205
34.5M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
206
34.5M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
207
34.5M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
208
34.5M
       (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
34.5M
  }
214
215
  /* Loop to process one whole iMCU row */
216
108M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
217
81.9M
       yoffset++) {
218
267M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
219
185M
         MCU_col_num++) {
220
      /* Construct list of pointers to DCT blocks belonging to this MCU */
221
185M
      blkn = 0;                 /* index of current DCT block within MCU */
222
387M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
223
202M
        compptr = cinfo->cur_comp_info[ci];
224
202M
        start_col = MCU_col_num * compptr->MCU_width;
225
414M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
226
211M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
227
437M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
228
225M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
229
225M
          }
230
211M
        }
231
202M
      }
232
185M
      if (!cinfo->entropy->insufficient_data)
233
108M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
234
      /* Try to fetch the MCU. */
235
185M
      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
185M
    }
242
    /* Completed an MCU row, but perhaps not an iMCU row */
243
81.9M
    coef->MCU_ctr = 0;
244
81.9M
  }
245
  /* Completed the iMCU row, advance counters for next one */
246
26.7M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
247
24.7M
    start_iMCU_row(cinfo);
248
24.7M
    return JPEG_ROW_COMPLETED;
249
24.7M
  }
250
  /* Completed the scan */
251
2.03M
  (*cinfo->inputctl->finish_input_pass) (cinfo);
252
2.03M
  return JPEG_SCAN_COMPLETED;
253
26.7M
}
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
893k
{
267
893k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
268
893k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
269
893k
  JDIMENSION block_num;
270
893k
  int ci, block_row, block_rows;
271
893k
  JBLOCKARRAY buffer;
272
893k
  JBLOCKROW buffer_ptr;
273
893k
  JSAMPARRAY output_ptr;
274
893k
  JDIMENSION output_col;
275
893k
  jpeg_component_info *compptr;
276
893k
  inverse_DCT_method_ptr inverse_DCT;
277
278
  /* Force some input to be done if we are getting ahead of the input. */
279
893k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
280
893k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
281
893k
          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.50M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
288
2.61M
       ci++, compptr++) {
289
    /* Don't bother to IDCT an uninteresting component. */
290
2.61M
    if (!compptr->component_needed)
291
474k
      continue;
292
    /* Align the virtual buffer for this component. */
293
2.13M
    buffer = (*cinfo->mem->access_virt_barray)
294
2.13M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
295
2.13M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
296
2.13M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
297
    /* Count non-dummy DCT block rows in this iMCU row. */
298
2.13M
    if (cinfo->output_iMCU_row < last_iMCU_row)
299
2.07M
      block_rows = compptr->v_samp_factor;
300
67.1k
    else {
301
      /* NB: can't use last_row_height here; it is input-side-dependent! */
302
67.1k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
303
67.1k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
304
67.1k
    }
305
2.13M
    inverse_DCT = cinfo->idct->inverse_DCT[ci];
306
2.13M
    output_ptr = output_buf[ci];
307
    /* Loop over all DCT blocks to be processed. */
308
5.74M
    for (block_row = 0; block_row < block_rows; block_row++) {
309
3.60M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
310
3.60M
      output_col = 0;
311
3.60M
      for (block_num = cinfo->master->first_MCU_col[ci];
312
18.4M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
313
14.8M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
314
14.8M
                        output_col);
315
14.8M
        buffer_ptr++;
316
14.8M
        output_col += compptr->_DCT_scaled_size;
317
14.8M
      }
318
3.60M
      output_ptr += compptr->_DCT_scaled_size;
319
3.60M
    }
320
2.13M
  }
321
322
893k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
323
865k
    return JPEG_ROW_COMPLETED;
324
28.1k
  return JPEG_SCAN_COMPLETED;
325
893k
}
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
4.06M
#define Q01_POS  1
341
4.05M
#define Q10_POS  8
342
4.05M
#define Q20_POS  16
343
4.05M
#define Q11_POS  9
344
4.05M
#define Q02_POS  2
345
2.47M
#define Q03_POS  3
346
2.47M
#define Q12_POS  10
347
2.47M
#define Q21_POS  17
348
2.47M
#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
41.6k
{
361
41.6k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
362
41.6k
  boolean smoothing_useful = FALSE;
363
41.6k
  int ci, coefi;
364
41.6k
  jpeg_component_info *compptr;
365
41.6k
  JQUANT_TBL *qtable;
366
41.6k
  int *coef_bits, *prev_coef_bits;
367
41.6k
  int *coef_bits_latch, *prev_coef_bits_latch;
368
369
41.6k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
370
9.75k
    return FALSE;
371
372
  /* Allocate latch area if not already done */
373
31.8k
  if (coef->coef_bits_latch == NULL)
374
31.8k
    coef->coef_bits_latch = (int *)
375
31.8k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
376
31.8k
                                  cinfo->num_components * 2 *
377
31.8k
                                  (SAVED_COEFS * sizeof(int)));
378
31.8k
  coef_bits_latch = coef->coef_bits_latch;
379
31.8k
  prev_coef_bits_latch =
380
31.8k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
381
382
76.3k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
383
62.6k
       ci++, compptr++) {
384
    /* All components' quantization values must already be latched. */
385
62.6k
    if ((qtable = compptr->quant_table) == NULL)
386
11.1k
      return FALSE;
387
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
388
51.4k
    if (qtable->quantval[0] == 0 ||
389
51.4k
        qtable->quantval[Q01_POS] == 0 ||
390
51.4k
        qtable->quantval[Q10_POS] == 0 ||
391
51.4k
        qtable->quantval[Q20_POS] == 0 ||
392
51.4k
        qtable->quantval[Q11_POS] == 0 ||
393
51.4k
        qtable->quantval[Q02_POS] == 0 ||
394
51.4k
        qtable->quantval[Q03_POS] == 0 ||
395
51.4k
        qtable->quantval[Q12_POS] == 0 ||
396
51.4k
        qtable->quantval[Q21_POS] == 0 ||
397
51.4k
        qtable->quantval[Q30_POS] == 0)
398
6.35k
      return FALSE;
399
    /* DC values must be at least partly known for all components. */
400
45.0k
    coef_bits = cinfo->coef_bits[ci];
401
45.0k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
402
45.0k
    if (coef_bits[0] < 0)
403
580
      return FALSE;
404
44.5k
    coef_bits_latch[0] = coef_bits[0];
405
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
406
445k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
407
400k
      if (cinfo->input_scan_number > 1)
408
211k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
409
189k
      else
410
189k
        prev_coef_bits_latch[coefi] = -1;
411
400k
      coef_bits_latch[coefi] = coef_bits[coefi];
412
400k
      if (coef_bits[coefi] != 0)
413
374k
        smoothing_useful = TRUE;
414
400k
    }
415
44.5k
    coef_bits_latch += SAVED_COEFS;
416
44.5k
    prev_coef_bits_latch += SAVED_COEFS;
417
44.5k
  }
418
419
13.7k
  return smoothing_useful;
420
31.8k
}
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.73M
{
430
1.73M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
431
1.73M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
432
1.73M
  JDIMENSION block_num, last_block_column;
433
1.73M
  int ci, block_row, block_rows, access_rows;
434
1.73M
  JBLOCKARRAY buffer;
435
1.73M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
436
1.73M
  JBLOCKROW next_block_row, next_next_block_row;
437
1.73M
  JSAMPARRAY output_ptr;
438
1.73M
  JDIMENSION output_col;
439
1.73M
  jpeg_component_info *compptr;
440
1.73M
  inverse_DCT_method_ptr inverse_DCT;
441
1.73M
  boolean change_dc;
442
1.73M
  JCOEF *workspace;
443
1.73M
  int *coef_bits;
444
1.73M
  JQUANT_TBL *quanttbl;
445
1.73M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
446
1.73M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
447
1.73M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
448
1.73M
      DC25;
449
1.73M
  int Al, pred;
450
451
  /* Keep a local variable to avoid looking it up more than once */
452
1.73M
  workspace = coef->workspace;
453
454
  /* Force some input to be done if we are getting ahead of the input. */
455
1.73M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
456
1.73M
         !cinfo->inputctl->eoi_reached) {
457
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
458
      /* If input is working on current scan, we ordinarily want it to
459
       * have completed the current row.  But if input scan is DC,
460
       * we want it to keep two rows ahead so that next two block rows' DC
461
       * values are up to date.
462
       */
463
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
464
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
465
0
        break;
466
0
    }
467
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
468
0
      return JPEG_SUSPENDED;
469
0
  }
470
471
  /* OK, output from the virtual arrays. */
472
6.86M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
473
5.12M
       ci++, compptr++) {
474
    /* Don't bother to IDCT an uninteresting component. */
475
5.12M
    if (!compptr->component_needed)
476
1.11M
      continue;
477
    /* Count non-dummy DCT block rows in this iMCU row. */
478
4.01M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
479
3.95M
      block_rows = compptr->v_samp_factor;
480
3.95M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
481
3.95M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
482
26.5k
      block_rows = compptr->v_samp_factor;
483
26.5k
      access_rows = block_rows * 2; /* this and next iMCU row */
484
31.2k
    } else {
485
      /* NB: can't use last_row_height here; it is input-side-dependent! */
486
31.2k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
487
31.2k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
488
31.2k
      access_rows = block_rows; /* this iMCU row only */
489
31.2k
    }
490
    /* Align the virtual buffer for this component. */
491
4.01M
    if (cinfo->output_iMCU_row > 1) {
492
3.95M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
493
3.95M
      buffer = (*cinfo->mem->access_virt_barray)
494
3.95M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
495
3.95M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
496
3.95M
         (JDIMENSION)access_rows, FALSE);
497
3.95M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
498
3.95M
    } else if (cinfo->output_iMCU_row > 0) {
499
26.5k
      buffer = (*cinfo->mem->access_virt_barray)
500
26.5k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
501
26.5k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
502
26.5k
         (JDIMENSION)access_rows, FALSE);
503
26.5k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
504
31.2k
    } else {
505
31.2k
      buffer = (*cinfo->mem->access_virt_barray)
506
31.2k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
507
31.2k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
508
31.2k
    }
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
4.01M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
514
350k
      coef_bits =
515
350k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
516
3.66M
    else
517
3.66M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
518
519
    /* We only do DC interpolation if no AC coefficient data is available. */
520
4.01M
    change_dc =
521
4.01M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
522
4.01M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
523
4.01M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
524
525
4.01M
    quanttbl = compptr->quant_table;
526
4.01M
    Q00 = quanttbl->quantval[0];
527
4.01M
    Q01 = quanttbl->quantval[Q01_POS];
528
4.01M
    Q10 = quanttbl->quantval[Q10_POS];
529
4.01M
    Q20 = quanttbl->quantval[Q20_POS];
530
4.01M
    Q11 = quanttbl->quantval[Q11_POS];
531
4.01M
    Q02 = quanttbl->quantval[Q02_POS];
532
4.01M
    if (change_dc) {
533
2.43M
      Q03 = quanttbl->quantval[Q03_POS];
534
2.43M
      Q12 = quanttbl->quantval[Q12_POS];
535
2.43M
      Q21 = quanttbl->quantval[Q21_POS];
536
2.43M
      Q30 = quanttbl->quantval[Q30_POS];
537
2.43M
    }
538
4.01M
    inverse_DCT = cinfo->idct->inverse_DCT[ci];
539
4.01M
    output_ptr = output_buf[ci];
540
    /* Loop over all DCT blocks to be processed. */
541
9.25M
    for (block_row = 0; block_row < block_rows; block_row++) {
542
5.23M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
543
544
5.23M
      if (block_row > 0 || cinfo->output_iMCU_row > 0)
545
5.20M
        prev_block_row =
546
5.20M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
547
31.2k
      else
548
31.2k
        prev_block_row = buffer_ptr;
549
550
5.23M
      if (block_row > 1 || cinfo->output_iMCU_row > 1)
551
5.16M
        prev_prev_block_row =
552
5.16M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
553
71.9k
      else
554
71.9k
        prev_prev_block_row = prev_block_row;
555
556
5.23M
      if (block_row < block_rows - 1 || cinfo->output_iMCU_row < last_iMCU_row)
557
5.20M
        next_block_row =
558
5.20M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
559
31.2k
      else
560
31.2k
        next_block_row = buffer_ptr;
561
562
5.23M
      if (block_row < block_rows - 2 ||
563
5.23M
          cinfo->output_iMCU_row + 1 < last_iMCU_row)
564
5.16M
        next_next_block_row =
565
5.16M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
566
71.3k
      else
567
71.3k
        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
5.23M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
573
5.23M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
574
5.23M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
575
5.23M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
576
5.23M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
577
5.23M
      output_col = 0;
578
5.23M
      last_block_column = compptr->width_in_blocks - 1;
579
5.23M
      for (block_num = cinfo->master->first_MCU_col[ci];
580
19.7M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
581
        /* Fetch current DCT block into workspace so we can modify it. */
582
14.4M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
583
        /* Update DC values */
584
14.4M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
585
14.4M
            block_num < last_block_column) {
586
3.31M
          DC04 = (int)prev_prev_block_row[1][0];
587
3.31M
          DC09 = (int)prev_block_row[1][0];
588
3.31M
          DC14 = (int)buffer_ptr[1][0];
589
3.31M
          DC19 = (int)next_block_row[1][0];
590
3.31M
          DC24 = (int)next_next_block_row[1][0];
591
3.31M
        }
592
14.4M
        if (block_num + 1 < last_block_column) {
593
5.92M
          DC05 = (int)prev_prev_block_row[2][0];
594
5.92M
          DC10 = (int)prev_block_row[2][0];
595
5.92M
          DC15 = (int)buffer_ptr[2][0];
596
5.92M
          DC20 = (int)next_block_row[2][0];
597
5.92M
          DC25 = (int)next_next_block_row[2][0];
598
5.92M
        }
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
14.4M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
611
13.6M
          num = Q00 * (change_dc ?
612
9.39M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
613
9.39M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
614
9.39M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
615
9.39M
                 DC21 - DC22 + DC24 + DC25) :
616
13.6M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
617
13.6M
          if (num >= 0) {
618
11.1M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
619
11.1M
            if (Al > 0 && pred >= (1 << Al))
620
1.91M
              pred = (1 << Al) - 1;
621
11.1M
          } else {
622
2.51M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
623
2.51M
            if (Al > 0 && pred >= (1 << Al))
624
71.8k
              pred = (1 << Al) - 1;
625
2.51M
            pred = -pred;
626
2.51M
          }
627
13.6M
          workspace[1] = (JCOEF)pred;
628
13.6M
        }
629
        /* AC10 */
630
14.4M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
631
13.5M
          num = Q00 * (change_dc ?
632
9.39M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
633
9.39M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
634
9.39M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
635
9.39M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
636
13.5M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
637
13.5M
          if (num >= 0) {
638
10.1M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
639
10.1M
            if (Al > 0 && pred >= (1 << Al))
640
2.56M
              pred = (1 << Al) - 1;
641
10.1M
          } else {
642
3.32M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
643
3.32M
            if (Al > 0 && pred >= (1 << Al))
644
306k
              pred = (1 << Al) - 1;
645
3.32M
            pred = -pred;
646
3.32M
          }
647
13.5M
          workspace[8] = (JCOEF)pred;
648
13.5M
        }
649
        /* AC20 */
650
14.4M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
651
13.5M
          num = Q00 * (change_dc ?
652
9.39M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
653
9.39M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
654
13.5M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
655
13.5M
          if (num >= 0) {
656
8.87M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
657
8.87M
            if (Al > 0 && pred >= (1 << Al))
658
235k
              pred = (1 << Al) - 1;
659
8.87M
          } else {
660
4.71M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
661
4.71M
            if (Al > 0 && pred >= (1 << Al))
662
246k
              pred = (1 << Al) - 1;
663
4.71M
            pred = -pred;
664
4.71M
          }
665
13.5M
          workspace[16] = (JCOEF)pred;
666
13.5M
        }
667
        /* AC11 */
668
14.4M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
669
13.4M
          num = Q00 * (change_dc ?
670
9.39M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
671
9.39M
                 9 * DC19 + DC21 - DC25) :
672
13.4M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
673
4.00M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
674
13.4M
          if (num >= 0) {
675
10.8M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
676
10.8M
            if (Al > 0 && pred >= (1 << Al))
677
137k
              pred = (1 << Al) - 1;
678
10.8M
          } else {
679
2.50M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
680
2.50M
            if (Al > 0 && pred >= (1 << Al))
681
138k
              pred = (1 << Al) - 1;
682
2.50M
            pred = -pred;
683
2.50M
          }
684
13.4M
          workspace[9] = (JCOEF)pred;
685
13.4M
        }
686
        /* AC02 */
687
14.4M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
688
13.3M
          num = Q00 * (change_dc ?
689
9.39M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
690
9.39M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
691
13.3M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
692
13.3M
          if (num >= 0) {
693
8.26M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
694
8.26M
            if (Al > 0 && pred >= (1 << Al))
695
553k
              pred = (1 << Al) - 1;
696
8.26M
          } else {
697
5.10M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
698
5.10M
            if (Al > 0 && pred >= (1 << Al))
699
573k
              pred = (1 << Al) - 1;
700
5.10M
            pred = -pred;
701
5.10M
          }
702
13.3M
          workspace[2] = (JCOEF)pred;
703
13.3M
        }
704
14.4M
        if (change_dc) {
705
          /* AC03 */
706
9.40M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
707
9.39M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
708
9.39M
            if (num >= 0) {
709
7.75M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
710
7.75M
              if (Al > 0 && pred >= (1 << Al))
711
0
                pred = (1 << Al) - 1;
712
7.75M
            } else {
713
1.64M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
714
1.64M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
1.64M
              pred = -pred;
717
1.64M
            }
718
9.39M
            workspace[3] = (JCOEF)pred;
719
9.39M
          }
720
          /* AC12 */
721
9.40M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
722
9.39M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
723
9.39M
            if (num >= 0) {
724
5.41M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
725
5.41M
              if (Al > 0 && pred >= (1 << Al))
726
0
                pred = (1 << Al) - 1;
727
5.41M
            } else {
728
3.98M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
729
3.98M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
3.98M
              pred = -pred;
732
3.98M
            }
733
9.39M
            workspace[10] = (JCOEF)pred;
734
9.39M
          }
735
          /* AC21 */
736
9.40M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
737
9.39M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
738
9.39M
            if (num >= 0) {
739
6.77M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
740
6.77M
              if (Al > 0 && pred >= (1 << Al))
741
0
                pred = (1 << Al) - 1;
742
6.77M
            } else {
743
2.62M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
744
2.62M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
2.62M
              pred = -pred;
747
2.62M
            }
748
9.39M
            workspace[17] = (JCOEF)pred;
749
9.39M
          }
750
          /* AC30 */
751
9.40M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
752
9.39M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
753
9.39M
            if (num >= 0) {
754
7.27M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
755
7.27M
              if (Al > 0 && pred >= (1 << Al))
756
0
                pred = (1 << Al) - 1;
757
7.27M
            } else {
758
2.12M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
759
2.12M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
2.12M
              pred = -pred;
762
2.12M
            }
763
9.39M
            workspace[24] = (JCOEF)pred;
764
9.39M
          }
765
          /* coef_bits[0] is non-negative.  Otherwise this function would not
766
           * be called.
767
           */
768
9.40M
          num = Q00 *
769
9.40M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
770
9.40M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
771
9.40M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
772
9.40M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
773
9.40M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
774
9.40M
          if (num >= 0) {
775
7.21M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
776
7.21M
          } else {
777
2.18M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
778
2.18M
            pred = -pred;
779
2.18M
          }
780
9.40M
          workspace[0] = (JCOEF)pred;
781
9.40M
        }  /* change_dc */
782
783
        /* OK, do the IDCT */
784
14.4M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
785
14.4M
                        output_col);
786
        /* Advance for next column */
787
14.4M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
788
14.4M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
789
14.4M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
790
14.4M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
791
14.4M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
792
14.4M
        buffer_ptr++, prev_block_row++, next_block_row++,
793
14.4M
          prev_prev_block_row++, next_next_block_row++;
794
14.4M
        output_col += compptr->_DCT_scaled_size;
795
14.4M
      }
796
5.23M
      output_ptr += compptr->_DCT_scaled_size;
797
5.23M
    }
798
4.01M
  }
799
800
1.73M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
801
1.72M
    return JPEG_ROW_COMPLETED;
802
13.5k
  return JPEG_SCAN_COMPLETED;
803
1.73M
}
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
137k
{
815
137k
  my_coef_ptr coef;
816
817
137k
  coef = (my_coef_ptr)
818
137k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
819
137k
                                sizeof(my_coef_controller));
820
137k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
821
137k
  coef->pub.start_input_pass = start_input_pass;
822
137k
  coef->pub.start_output_pass = start_output_pass;
823
137k
#ifdef BLOCK_SMOOTHING_SUPPORTED
824
137k
  coef->coef_bits_latch = NULL;
825
137k
#endif
826
827
  /* Create the coefficient buffer. */
828
137k
  if (need_full_buffer) {
829
103k
#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
103k
    int ci, access_rows;
834
103k
    jpeg_component_info *compptr;
835
836
413k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
837
309k
         ci++, compptr++) {
838
309k
      access_rows = compptr->v_samp_factor;
839
309k
#ifdef BLOCK_SMOOTHING_SUPPORTED
840
      /* If block smoothing could be used, need a bigger window */
841
309k
      if (cinfo->progressive_mode)
842
203k
        access_rows *= 5;
843
309k
#endif
844
309k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
845
309k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
846
309k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
847
309k
                               (long)compptr->h_samp_factor),
848
309k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
849
309k
                               (long)compptr->v_samp_factor),
850
309k
         (JDIMENSION)access_rows);
851
309k
    }
852
103k
    coef->pub.consume_data = consume_data;
853
103k
    coef->pub.decompress_data = decompress_data;
854
103k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
855
#else
856
    ERREXIT(cinfo, JERR_NOT_COMPILED);
857
#endif
858
103k
  } else {
859
    /* We only need a single-MCU buffer. */
860
33.8k
    JBLOCKROW buffer;
861
33.8k
    int i;
862
863
33.8k
    buffer = (JBLOCKROW)
864
33.8k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
865
33.8k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
866
372k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
867
338k
      coef->MCU_buffer[i] = buffer + i;
868
338k
    }
869
33.8k
    coef->pub.consume_data = dummy_consume_data;
870
33.8k
    coef->pub.decompress_data = decompress_onepass;
871
33.8k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
872
33.8k
  }
873
874
  /* Allocate the workspace buffer */
875
137k
  coef->workspace = (JCOEF *)
876
137k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
137k
                                sizeof(JCOEF) * DCTSIZE2);
878
137k
}