Coverage Report

Created: 2023-06-07 06:03

/src/libjpeg-turbo.main/jdcoefct.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * jdcoefct.c
3
 *
4
 * This file was part of the Independent JPEG Group's software:
5
 * Copyright (C) 1994-1997, Thomas G. Lane.
6
 * libjpeg-turbo Modifications:
7
 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
8
 * Copyright (C) 2010, 2015-2016, 2019-2020, 2022, D. R. Commander.
9
 * Copyright (C) 2015, 2020, Google, Inc.
10
 * For conditions of distribution and use, see the accompanying README.ijg
11
 * file.
12
 *
13
 * This file contains the coefficient buffer controller for decompression.
14
 * This controller is the top level of the lossy 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 "jpegapicomp.h"
25
#include "jsamplecomp.h"
26
27
28
/* Forward declarations */
29
METHODDEF(int) decompress_onepass(j_decompress_ptr cinfo,
30
                                  _JSAMPIMAGE output_buf);
31
#ifdef D_MULTISCAN_FILES_SUPPORTED
32
METHODDEF(int) decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf);
33
#endif
34
#ifdef BLOCK_SMOOTHING_SUPPORTED
35
LOCAL(boolean) smoothing_ok(j_decompress_ptr cinfo);
36
METHODDEF(int) decompress_smooth_data(j_decompress_ptr cinfo,
37
                                      _JSAMPIMAGE output_buf);
38
#endif
39
40
41
/*
42
 * Initialize for an input processing pass.
43
 */
44
45
METHODDEF(void)
46
start_input_pass(j_decompress_ptr cinfo)
47
29.1k
{
48
29.1k
  cinfo->input_iMCU_row = 0;
49
29.1k
  start_iMCU_row(cinfo);
50
29.1k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
4.99k
{
60
4.99k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
4.99k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
62
63
  /* If multipass, check to see whether to use block smoothing on this pass */
64
4.99k
  if (coef->pub.coef_arrays != NULL) {
65
4.25k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.37k
      coef->pub._decompress_data = decompress_smooth_data;
67
2.87k
    else
68
2.87k
      coef->pub._decompress_data = decompress_data;
69
4.25k
  }
70
4.99k
#endif
71
4.99k
  cinfo->output_iMCU_row = 0;
72
4.99k
}
73
74
75
/*
76
 * Decompress and return some data in the single-pass case.
77
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
78
 * Input and output must run in lockstep since we have only a one-MCU buffer.
79
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
80
 *
81
 * NB: output_buf contains a plane for each component in image,
82
 * which we index according to the component's SOF position.
83
 */
84
85
METHODDEF(int)
86
decompress_onepass(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
87
204k
{
88
204k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
204k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
204k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
204k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
204k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
204k
  _JSAMPARRAY output_ptr;
94
204k
  JDIMENSION start_col, output_col;
95
204k
  jpeg_component_info *compptr;
96
204k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
562k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
357k
       yoffset++) {
101
3.59M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
3.23M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
3.23M
      jzero_far((void *)coef->MCU_buffer[0],
105
3.23M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
3.23M
      if (!cinfo->entropy->insufficient_data)
107
912k
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
3.23M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
109
        /* Suspension forced; update state counters and exit */
110
0
        coef->MCU_vert_offset = yoffset;
111
0
        coef->MCU_ctr = MCU_col_num;
112
0
        return JPEG_SUSPENDED;
113
0
      }
114
115
      /* Only perform the IDCT on blocks that are contained within the desired
116
       * cropping region.
117
       */
118
3.23M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
3.23M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
120
        /* Determine where data should go in output_buf and do the IDCT thing.
121
         * We skip dummy blocks at the right and bottom edges (but blkn gets
122
         * incremented past them!).  Note the inner loop relies on having
123
         * allocated the MCU_buffer[] blocks sequentially.
124
         */
125
3.23M
        blkn = 0;               /* index of current DCT block within MCU */
126
6.57M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
3.34M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
3.34M
          if (!compptr->component_needed) {
130
8.70k
            blkn += compptr->MCU_blocks;
131
8.70k
            continue;
132
8.70k
          }
133
3.33M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
3.33M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
2.94M
                         compptr->MCU_width : compptr->last_col_width;
136
3.33M
          output_ptr = output_buf[compptr->component_index] +
137
3.33M
                       yoffset * compptr->_DCT_scaled_size;
138
3.33M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
3.33M
                      compptr->MCU_sample_width;
140
6.72M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
3.39M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
3.39M
                yoffset + yindex < compptr->last_row_height) {
143
3.39M
              output_col = start_col;
144
6.89M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
3.50M
                (*inverse_DCT) (cinfo, compptr,
146
3.50M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
3.50M
                                output_ptr, output_col);
148
3.50M
                output_col += compptr->_DCT_scaled_size;
149
3.50M
              }
150
3.39M
            }
151
3.39M
            blkn += compptr->MCU_width;
152
3.39M
            output_ptr += compptr->_DCT_scaled_size;
153
3.39M
          }
154
3.33M
        }
155
3.23M
      }
156
3.23M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
357k
    coef->MCU_ctr = 0;
159
357k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
204k
  cinfo->output_iMCU_row++;
162
204k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
204k
    start_iMCU_row(cinfo);
164
204k
    return JPEG_ROW_COMPLETED;
165
204k
  }
166
  /* Completed the scan */
167
738
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
738
  return JPEG_SCAN_COMPLETED;
169
204k
}
170
171
172
/*
173
 * Dummy consume-input routine for single-pass operation.
174
 */
175
176
METHODDEF(int)
177
dummy_consume_data(j_decompress_ptr cinfo)
178
0
{
179
0
  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
180
0
}
181
182
183
#ifdef D_MULTISCAN_FILES_SUPPORTED
184
185
/*
186
 * Consume input data and store it in the full-image coefficient buffer.
187
 * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
188
 * ie, v_samp_factor block rows for each component in the scan.
189
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
190
 */
191
192
METHODDEF(int)
193
consume_data(j_decompress_ptr cinfo)
194
4.28M
{
195
4.28M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
4.28M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
4.28M
  int blkn, ci, xindex, yindex, yoffset;
198
4.28M
  JDIMENSION start_col;
199
4.28M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
4.28M
  JBLOCKROW buffer_ptr;
201
4.28M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
10.1M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
5.86M
    compptr = cinfo->cur_comp_info[ci];
206
5.86M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
5.86M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
5.86M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
5.86M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
210
    /* Note: entropy decoder expects buffer to be zeroed,
211
     * but this is handled automatically by the memory manager
212
     * because we requested a pre-zeroed array.
213
     */
214
5.86M
  }
215
216
  /* Loop to process one whole iMCU row */
217
10.2M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
5.95M
       yoffset++) {
219
126M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
120M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
120M
      blkn = 0;                 /* index of current DCT block within MCU */
223
264M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
144M
        compptr = cinfo->cur_comp_info[ci];
225
144M
        start_col = MCU_col_num * compptr->MCU_width;
226
303M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
159M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
342M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
183M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
183M
          }
231
159M
        }
232
144M
      }
233
120M
      if (!cinfo->entropy->insufficient_data)
234
43.6M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
120M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
237
        /* Suspension forced; update state counters and exit */
238
0
        coef->MCU_vert_offset = yoffset;
239
0
        coef->MCU_ctr = MCU_col_num;
240
0
        return JPEG_SUSPENDED;
241
0
      }
242
120M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
5.95M
    coef->MCU_ctr = 0;
245
5.95M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
4.28M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
4.25M
    start_iMCU_row(cinfo);
249
4.25M
    return JPEG_ROW_COMPLETED;
250
4.25M
  }
251
  /* Completed the scan */
252
28.4k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
28.4k
  return JPEG_SCAN_COMPLETED;
254
4.28M
}
255
256
257
/*
258
 * Decompress and return some data in the multi-pass case.
259
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
260
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
261
 *
262
 * NB: output_buf contains a plane for each component in image.
263
 */
264
265
METHODDEF(int)
266
decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
267
687k
{
268
687k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
687k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
687k
  JDIMENSION block_num;
271
687k
  int ci, block_row, block_rows;
272
687k
  JBLOCKARRAY buffer;
273
687k
  JBLOCKROW buffer_ptr;
274
687k
  _JSAMPARRAY output_ptr;
275
687k
  JDIMENSION output_col;
276
687k
  jpeg_component_info *compptr;
277
687k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
687k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
687k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
687k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
283
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
284
0
      return JPEG_SUSPENDED;
285
0
  }
286
287
  /* OK, output from the virtual arrays. */
288
2.01M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
1.32M
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
1.32M
    if (!compptr->component_needed)
292
97.0k
      continue;
293
    /* Align the virtual buffer for this component. */
294
1.22M
    buffer = (*cinfo->mem->access_virt_barray)
295
1.22M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
1.22M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
1.22M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
1.22M
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
1.22M
      block_rows = compptr->v_samp_factor;
301
5.66k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
5.66k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
5.66k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
5.66k
    }
306
1.22M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
1.22M
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
3.09M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
1.86M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
1.86M
      output_col = 0;
312
1.86M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
20.4M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
18.6M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
18.6M
                        output_col);
316
18.6M
        buffer_ptr++;
317
18.6M
        output_col += compptr->_DCT_scaled_size;
318
18.6M
      }
319
1.86M
      output_ptr += compptr->_DCT_scaled_size;
320
1.86M
    }
321
1.22M
  }
322
323
687k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
684k
    return JPEG_ROW_COMPLETED;
325
2.87k
  return JPEG_SCAN_COMPLETED;
326
687k
}
327
328
#endif /* D_MULTISCAN_FILES_SUPPORTED */
329
330
331
#ifdef BLOCK_SMOOTHING_SUPPORTED
332
333
/*
334
 * This code applies interblock smoothing; the first 9 AC coefficients are
335
 * estimated from the DC values of a DCT block and its 24 neighboring blocks.
336
 * We apply smoothing only for progressive JPEG decoding, and only if
337
 * the coefficients it can estimate are not yet known to full precision.
338
 */
339
340
/* Natural-order array positions of the first 9 zigzag-order coefficients */
341
809k
#define Q01_POS  1
342
809k
#define Q10_POS  8
343
809k
#define Q20_POS  16
344
809k
#define Q11_POS  9
345
809k
#define Q02_POS  2
346
576k
#define Q03_POS  3
347
576k
#define Q12_POS  10
348
576k
#define Q21_POS  17
349
575k
#define Q30_POS  24
350
351
/*
352
 * Determine whether block smoothing is applicable and safe.
353
 * We also latch the current states of the coef_bits[] entries for the
354
 * AC coefficients; otherwise, if the input side of the decompressor
355
 * advances into a new scan, we might think the coefficients are known
356
 * more accurately than they really are.
357
 */
358
359
LOCAL(boolean)
360
smoothing_ok(j_decompress_ptr cinfo)
361
4.25k
{
362
4.25k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
4.25k
  boolean smoothing_useful = FALSE;
364
4.25k
  int ci, coefi;
365
4.25k
  jpeg_component_info *compptr;
366
4.25k
  JQUANT_TBL *qtable;
367
4.25k
  int *coef_bits, *prev_coef_bits;
368
4.25k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
4.25k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
1.42k
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
2.82k
  if (coef->coef_bits_latch == NULL)
375
2.82k
    coef->coef_bits_latch = (int *)
376
2.82k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
2.82k
                                  cinfo->num_components * 2 *
378
2.82k
                                  (SAVED_COEFS * sizeof(int)));
379
2.82k
  coef_bits_latch = coef->coef_bits_latch;
380
2.82k
  prev_coef_bits_latch =
381
2.82k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
4.70k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
3.32k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
3.32k
    if ((qtable = compptr->quant_table) == NULL)
387
332
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
2.99k
    if (qtable->quantval[0] == 0 ||
390
2.99k
        qtable->quantval[Q01_POS] == 0 ||
391
2.99k
        qtable->quantval[Q10_POS] == 0 ||
392
2.99k
        qtable->quantval[Q20_POS] == 0 ||
393
2.99k
        qtable->quantval[Q11_POS] == 0 ||
394
2.99k
        qtable->quantval[Q02_POS] == 0 ||
395
2.99k
        qtable->quantval[Q03_POS] == 0 ||
396
2.99k
        qtable->quantval[Q12_POS] == 0 ||
397
2.99k
        qtable->quantval[Q21_POS] == 0 ||
398
2.99k
        qtable->quantval[Q30_POS] == 0)
399
994
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
1.99k
    coef_bits = cinfo->coef_bits[ci];
402
1.99k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
1.99k
    if (coef_bits[0] < 0)
404
120
      return FALSE;
405
1.87k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
18.7k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
16.9k
      if (cinfo->input_scan_number > 1)
409
8.37k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
8.52k
      else
411
8.52k
        prev_coef_bits_latch[coefi] = -1;
412
16.9k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
16.9k
      if (coef_bits[coefi] != 0)
414
16.2k
        smoothing_useful = TRUE;
415
16.9k
    }
416
1.87k
    coef_bits_latch += SAVED_COEFS;
417
1.87k
    prev_coef_bits_latch += SAVED_COEFS;
418
1.87k
  }
419
420
1.38k
  return smoothing_useful;
421
2.82k
}
422
423
424
/*
425
 * Variant of decompress_data for use when doing block smoothing.
426
 */
427
428
METHODDEF(int)
429
decompress_smooth_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
430
577k
{
431
577k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
577k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
577k
  JDIMENSION block_num, last_block_column;
434
577k
  int ci, block_row, block_rows, access_rows;
435
577k
  JBLOCKARRAY buffer;
436
577k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
437
577k
  JBLOCKROW next_block_row, next_next_block_row;
438
577k
  _JSAMPARRAY output_ptr;
439
577k
  JDIMENSION output_col;
440
577k
  jpeg_component_info *compptr;
441
577k
  _inverse_DCT_method_ptr inverse_DCT;
442
577k
  boolean change_dc;
443
577k
  JCOEF *workspace;
444
577k
  int *coef_bits;
445
577k
  JQUANT_TBL *quanttbl;
446
577k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
447
577k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
448
577k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
449
577k
      DC25;
450
577k
  int Al, pred;
451
452
  /* Keep a local variable to avoid looking it up more than once */
453
577k
  workspace = coef->workspace;
454
455
  /* Force some input to be done if we are getting ahead of the input. */
456
577k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
457
577k
         !cinfo->inputctl->eoi_reached) {
458
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
459
      /* If input is working on current scan, we ordinarily want it to
460
       * have completed the current row.  But if input scan is DC,
461
       * we want it to keep two rows ahead so that next two block rows' DC
462
       * values are up to date.
463
       */
464
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
465
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
466
0
        break;
467
0
    }
468
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
469
0
      return JPEG_SUSPENDED;
470
0
  }
471
472
  /* OK, output from the virtual arrays. */
473
1.38M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
474
810k
       ci++, compptr++) {
475
    /* Don't bother to IDCT an uninteresting component. */
476
810k
    if (!compptr->component_needed)
477
3.96k
      continue;
478
    /* Count non-dummy DCT block rows in this iMCU row. */
479
807k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
480
803k
      block_rows = compptr->v_samp_factor;
481
803k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
482
803k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
483
1.54k
      block_rows = compptr->v_samp_factor;
484
1.54k
      access_rows = block_rows * 2; /* this and next iMCU row */
485
1.75k
    } else {
486
      /* NB: can't use last_row_height here; it is input-side-dependent! */
487
1.75k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
488
1.75k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
489
1.75k
      access_rows = block_rows; /* this iMCU row only */
490
1.75k
    }
491
    /* Align the virtual buffer for this component. */
492
807k
    if (cinfo->output_iMCU_row > 1) {
493
803k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
494
803k
      buffer = (*cinfo->mem->access_virt_barray)
495
803k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
496
803k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
497
803k
         (JDIMENSION)access_rows, FALSE);
498
803k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
499
803k
    } else if (cinfo->output_iMCU_row > 0) {
500
1.54k
      buffer = (*cinfo->mem->access_virt_barray)
501
1.54k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
502
1.54k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
503
1.54k
         (JDIMENSION)access_rows, FALSE);
504
1.54k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
505
1.75k
    } else {
506
1.75k
      buffer = (*cinfo->mem->access_virt_barray)
507
1.75k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
508
1.75k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
509
1.75k
    }
510
    /* Fetch component-dependent info.
511
     * If the current scan is incomplete, then we use the component-dependent
512
     * info from the previous scan.
513
     */
514
807k
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
515
379k
      coef_bits =
516
379k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
517
427k
    else
518
427k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
519
520
    /* We only do DC interpolation if no AC coefficient data is available. */
521
807k
    change_dc =
522
807k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
523
807k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
524
807k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
525
526
807k
    quanttbl = compptr->quant_table;
527
807k
    Q00 = quanttbl->quantval[0];
528
807k
    Q01 = quanttbl->quantval[Q01_POS];
529
807k
    Q10 = quanttbl->quantval[Q10_POS];
530
807k
    Q20 = quanttbl->quantval[Q20_POS];
531
807k
    Q11 = quanttbl->quantval[Q11_POS];
532
807k
    Q02 = quanttbl->quantval[Q02_POS];
533
807k
    if (change_dc) {
534
573k
      Q03 = quanttbl->quantval[Q03_POS];
535
573k
      Q12 = quanttbl->quantval[Q12_POS];
536
573k
      Q21 = quanttbl->quantval[Q21_POS];
537
573k
      Q30 = quanttbl->quantval[Q30_POS];
538
573k
    }
539
807k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
540
807k
    output_ptr = output_buf[ci];
541
    /* Loop over all DCT blocks to be processed. */
542
2.07M
    for (block_row = 0; block_row < block_rows; block_row++) {
543
1.26M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
544
545
1.26M
      if (block_row > 0 || cinfo->output_iMCU_row > 0)
546
1.26M
        prev_block_row =
547
1.26M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
548
1.75k
      else
549
1.75k
        prev_block_row = buffer_ptr;
550
551
1.26M
      if (block_row > 1 || cinfo->output_iMCU_row > 1)
552
1.26M
        prev_prev_block_row =
553
1.26M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
554
5.29k
      else
555
5.29k
        prev_prev_block_row = prev_block_row;
556
557
1.26M
      if (block_row < block_rows - 1 || cinfo->output_iMCU_row < last_iMCU_row)
558
1.26M
        next_block_row =
559
1.26M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
560
1.75k
      else
561
1.75k
        next_block_row = buffer_ptr;
562
563
1.26M
      if (block_row < block_rows - 2 ||
564
1.26M
          cinfo->output_iMCU_row + 1 < last_iMCU_row)
565
1.26M
        next_next_block_row =
566
1.26M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
567
4.92k
      else
568
4.92k
        next_next_block_row = next_block_row;
569
570
      /* We fetch the surrounding DC values using a sliding-register approach.
571
       * Initialize all 25 here so as to do the right thing on narrow pics.
572
       */
573
1.26M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
574
1.26M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
575
1.26M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
576
1.26M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
577
1.26M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
578
1.26M
      output_col = 0;
579
1.26M
      last_block_column = compptr->width_in_blocks - 1;
580
1.26M
      for (block_num = cinfo->master->first_MCU_col[ci];
581
11.6M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
582
        /* Fetch current DCT block into workspace so we can modify it. */
583
10.3M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
584
        /* Update DC values */
585
10.3M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
586
10.3M
            block_num < last_block_column) {
587
655k
          DC04 = (int)prev_prev_block_row[1][0];
588
655k
          DC09 = (int)prev_block_row[1][0];
589
655k
          DC14 = (int)buffer_ptr[1][0];
590
655k
          DC19 = (int)next_block_row[1][0];
591
655k
          DC24 = (int)next_next_block_row[1][0];
592
655k
        }
593
10.3M
        if (block_num + 1 < last_block_column) {
594
8.43M
          DC05 = (int)prev_prev_block_row[2][0];
595
8.43M
          DC10 = (int)prev_block_row[2][0];
596
8.43M
          DC15 = (int)buffer_ptr[2][0];
597
8.43M
          DC20 = (int)next_block_row[2][0];
598
8.43M
          DC25 = (int)next_next_block_row[2][0];
599
8.43M
        }
600
        /* If DC interpolation is enabled, compute coefficient estimates using
601
         * a Gaussian-like kernel, keeping the averages of the DC values.
602
         *
603
         * If DC interpolation is disabled, compute coefficient estimates using
604
         * an algorithm similar to the one described in Section K.8 of the JPEG
605
         * standard, except applied to a 5x5 window rather than a 3x3 window.
606
         *
607
         * An estimate is applied only if the coefficient is still zero and is
608
         * not known to be fully accurate.
609
         */
610
        /* AC01 */
611
10.3M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
612
9.74M
          num = Q00 * (change_dc ?
613
7.10M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
614
7.10M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
615
7.10M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
616
7.10M
                 DC21 - DC22 + DC24 + DC25) :
617
9.74M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
618
9.74M
          if (num >= 0) {
619
7.73M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
620
7.73M
            if (Al > 0 && pred >= (1 << Al))
621
593k
              pred = (1 << Al) - 1;
622
7.73M
          } else {
623
2.00M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
624
2.00M
            if (Al > 0 && pred >= (1 << Al))
625
355k
              pred = (1 << Al) - 1;
626
2.00M
            pred = -pred;
627
2.00M
          }
628
9.74M
          workspace[1] = (JCOEF)pred;
629
9.74M
        }
630
        /* AC10 */
631
10.3M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
632
9.76M
          num = Q00 * (change_dc ?
633
7.10M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
634
7.10M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
635
7.10M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
636
7.10M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
637
9.76M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
638
9.76M
          if (num >= 0) {
639
7.42M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
640
7.42M
            if (Al > 0 && pred >= (1 << Al))
641
745k
              pred = (1 << Al) - 1;
642
7.42M
          } else {
643
2.34M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
644
2.34M
            if (Al > 0 && pred >= (1 << Al))
645
627k
              pred = (1 << Al) - 1;
646
2.34M
            pred = -pred;
647
2.34M
          }
648
9.76M
          workspace[8] = (JCOEF)pred;
649
9.76M
        }
650
        /* AC20 */
651
10.3M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
652
9.85M
          num = Q00 * (change_dc ?
653
7.10M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
654
7.10M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
655
9.85M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
656
9.85M
          if (num >= 0) {
657
6.03M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
658
6.03M
            if (Al > 0 && pred >= (1 << Al))
659
652k
              pred = (1 << Al) - 1;
660
6.03M
          } else {
661
3.82M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
662
3.82M
            if (Al > 0 && pred >= (1 << Al))
663
665k
              pred = (1 << Al) - 1;
664
3.82M
            pred = -pred;
665
3.82M
          }
666
9.85M
          workspace[16] = (JCOEF)pred;
667
9.85M
        }
668
        /* AC11 */
669
10.3M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
670
9.77M
          num = Q00 * (change_dc ?
671
7.10M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
672
7.10M
                 9 * DC19 + DC21 - DC25) :
673
9.77M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
674
2.67M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
675
9.77M
          if (num >= 0) {
676
7.87M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
677
7.87M
            if (Al > 0 && pred >= (1 << Al))
678
288k
              pred = (1 << Al) - 1;
679
7.87M
          } else {
680
1.89M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
681
1.89M
            if (Al > 0 && pred >= (1 << Al))
682
298k
              pred = (1 << Al) - 1;
683
1.89M
            pred = -pred;
684
1.89M
          }
685
9.77M
          workspace[9] = (JCOEF)pred;
686
9.77M
        }
687
        /* AC02 */
688
10.3M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
689
9.85M
          num = Q00 * (change_dc ?
690
7.10M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
691
7.10M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
692
9.85M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
693
9.85M
          if (num >= 0) {
694
6.11M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
695
6.11M
            if (Al > 0 && pred >= (1 << Al))
696
472k
              pred = (1 << Al) - 1;
697
6.11M
          } else {
698
3.74M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
699
3.74M
            if (Al > 0 && pred >= (1 << Al))
700
476k
              pred = (1 << Al) - 1;
701
3.74M
            pred = -pred;
702
3.74M
          }
703
9.85M
          workspace[2] = (JCOEF)pred;
704
9.85M
        }
705
10.3M
        if (change_dc) {
706
          /* AC03 */
707
7.10M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
708
7.10M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
709
7.10M
            if (num >= 0) {
710
6.02M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
711
6.02M
              if (Al > 0 && pred >= (1 << Al))
712
0
                pred = (1 << Al) - 1;
713
6.02M
            } else {
714
1.07M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
715
1.07M
              if (Al > 0 && pred >= (1 << Al))
716
0
                pred = (1 << Al) - 1;
717
1.07M
              pred = -pred;
718
1.07M
            }
719
7.10M
            workspace[3] = (JCOEF)pred;
720
7.10M
          }
721
          /* AC12 */
722
7.10M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
723
7.10M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
724
7.10M
            if (num >= 0) {
725
3.90M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
726
3.90M
              if (Al > 0 && pred >= (1 << Al))
727
0
                pred = (1 << Al) - 1;
728
3.90M
            } else {
729
3.19M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
730
3.19M
              if (Al > 0 && pred >= (1 << Al))
731
0
                pred = (1 << Al) - 1;
732
3.19M
              pred = -pred;
733
3.19M
            }
734
7.10M
            workspace[10] = (JCOEF)pred;
735
7.10M
          }
736
          /* AC21 */
737
7.10M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
738
7.10M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
739
7.10M
            if (num >= 0) {
740
3.83M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
741
3.83M
              if (Al > 0 && pred >= (1 << Al))
742
0
                pred = (1 << Al) - 1;
743
3.83M
            } else {
744
3.26M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
745
3.26M
              if (Al > 0 && pred >= (1 << Al))
746
0
                pred = (1 << Al) - 1;
747
3.26M
              pred = -pred;
748
3.26M
            }
749
7.10M
            workspace[17] = (JCOEF)pred;
750
7.10M
          }
751
          /* AC30 */
752
7.10M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
753
7.10M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
754
7.10M
            if (num >= 0) {
755
5.78M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
756
5.78M
              if (Al > 0 && pred >= (1 << Al))
757
0
                pred = (1 << Al) - 1;
758
5.78M
            } else {
759
1.31M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
760
1.31M
              if (Al > 0 && pred >= (1 << Al))
761
0
                pred = (1 << Al) - 1;
762
1.31M
              pred = -pred;
763
1.31M
            }
764
7.10M
            workspace[24] = (JCOEF)pred;
765
7.10M
          }
766
          /* coef_bits[0] is non-negative.  Otherwise this function would not
767
           * be called.
768
           */
769
7.10M
          num = Q00 *
770
7.10M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
771
7.10M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
772
7.10M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
773
7.10M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
774
7.10M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
775
7.10M
          if (num >= 0) {
776
3.71M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
777
3.71M
          } else {
778
3.38M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
779
3.38M
            pred = -pred;
780
3.38M
          }
781
7.10M
          workspace[0] = (JCOEF)pred;
782
7.10M
        }  /* change_dc */
783
784
        /* OK, do the IDCT */
785
10.3M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
786
10.3M
                        output_col);
787
        /* Advance for next column */
788
10.3M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
789
10.3M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
790
10.3M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
791
10.3M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
792
10.3M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
793
10.3M
        buffer_ptr++, prev_block_row++, next_block_row++,
794
10.3M
          prev_prev_block_row++, next_next_block_row++;
795
10.3M
        output_col += compptr->_DCT_scaled_size;
796
10.3M
      }
797
1.26M
      output_ptr += compptr->_DCT_scaled_size;
798
1.26M
    }
799
807k
  }
800
801
577k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
802
576k
    return JPEG_ROW_COMPLETED;
803
1.37k
  return JPEG_SCAN_COMPLETED;
804
577k
}
805
806
#endif /* BLOCK_SMOOTHING_SUPPORTED */
807
808
809
/*
810
 * Initialize coefficient buffer controller.
811
 */
812
813
GLOBAL(void)
814
_jinit_d_coef_controller(j_decompress_ptr cinfo, boolean need_full_buffer)
815
5.49k
{
816
5.49k
  my_coef_ptr coef;
817
818
5.49k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
5.49k
  coef = (my_coef_ptr)
822
5.49k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
5.49k
                                sizeof(my_coef_controller));
824
5.49k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
5.49k
  coef->pub.start_input_pass = start_input_pass;
826
5.49k
  coef->pub.start_output_pass = start_output_pass;
827
5.49k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
5.49k
  coef->coef_bits_latch = NULL;
829
5.49k
#endif
830
831
  /* Create the coefficient buffer. */
832
5.49k
  if (need_full_buffer) {
833
4.74k
#ifdef D_MULTISCAN_FILES_SUPPORTED
834
    /* Allocate a full-image virtual array for each component, */
835
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
836
    /* Note we ask for a pre-zeroed array. */
837
4.74k
    int ci, access_rows;
838
4.74k
    jpeg_component_info *compptr;
839
840
14.1k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
9.40k
         ci++, compptr++) {
842
9.40k
      access_rows = compptr->v_samp_factor;
843
9.40k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
9.40k
      if (cinfo->progressive_mode)
846
4.41k
        access_rows *= 5;
847
9.40k
#endif
848
9.40k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
9.40k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
9.40k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
9.40k
                               (long)compptr->h_samp_factor),
852
9.40k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
9.40k
                               (long)compptr->v_samp_factor),
854
9.40k
         (JDIMENSION)access_rows);
855
9.40k
    }
856
4.74k
    coef->pub.consume_data = consume_data;
857
4.74k
    coef->pub._decompress_data = decompress_data;
858
4.74k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
4.74k
  } else {
863
    /* We only need a single-MCU buffer. */
864
753
    JBLOCKROW buffer;
865
753
    int i;
866
867
753
    buffer = (JBLOCKROW)
868
753
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
753
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
8.28k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
7.53k
      coef->MCU_buffer[i] = buffer + i;
872
7.53k
    }
873
753
    coef->pub.consume_data = dummy_consume_data;
874
753
    coef->pub._decompress_data = decompress_onepass;
875
753
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
753
  }
877
878
  /* Allocate the workspace buffer */
879
5.49k
  coef->workspace = (JCOEF *)
880
5.49k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
5.49k
                                sizeof(JCOEF) * DCTSIZE2);
882
5.49k
}
j12init_d_coef_controller
Line
Count
Source
815
2.91k
{
816
2.91k
  my_coef_ptr coef;
817
818
2.91k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
2.91k
  coef = (my_coef_ptr)
822
2.91k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
2.91k
                                sizeof(my_coef_controller));
824
2.91k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
2.91k
  coef->pub.start_input_pass = start_input_pass;
826
2.91k
  coef->pub.start_output_pass = start_output_pass;
827
2.91k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
2.91k
  coef->coef_bits_latch = NULL;
829
2.91k
#endif
830
831
  /* Create the coefficient buffer. */
832
2.91k
  if (need_full_buffer) {
833
2.64k
#ifdef D_MULTISCAN_FILES_SUPPORTED
834
    /* Allocate a full-image virtual array for each component, */
835
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
836
    /* Note we ask for a pre-zeroed array. */
837
2.64k
    int ci, access_rows;
838
2.64k
    jpeg_component_info *compptr;
839
840
8.21k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
5.57k
         ci++, compptr++) {
842
5.57k
      access_rows = compptr->v_samp_factor;
843
5.57k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
5.57k
      if (cinfo->progressive_mode)
846
2.11k
        access_rows *= 5;
847
5.57k
#endif
848
5.57k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
5.57k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
5.57k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
5.57k
                               (long)compptr->h_samp_factor),
852
5.57k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
5.57k
                               (long)compptr->v_samp_factor),
854
5.57k
         (JDIMENSION)access_rows);
855
5.57k
    }
856
2.64k
    coef->pub.consume_data = consume_data;
857
2.64k
    coef->pub._decompress_data = decompress_data;
858
2.64k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
2.64k
  } else {
863
    /* We only need a single-MCU buffer. */
864
276
    JBLOCKROW buffer;
865
276
    int i;
866
867
276
    buffer = (JBLOCKROW)
868
276
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
276
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
3.03k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
2.76k
      coef->MCU_buffer[i] = buffer + i;
872
2.76k
    }
873
276
    coef->pub.consume_data = dummy_consume_data;
874
276
    coef->pub._decompress_data = decompress_onepass;
875
276
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
276
  }
877
878
  /* Allocate the workspace buffer */
879
2.91k
  coef->workspace = (JCOEF *)
880
2.91k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
2.91k
                                sizeof(JCOEF) * DCTSIZE2);
882
2.91k
}
jinit_d_coef_controller
Line
Count
Source
815
2.57k
{
816
2.57k
  my_coef_ptr coef;
817
818
2.57k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
2.57k
  coef = (my_coef_ptr)
822
2.57k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
2.57k
                                sizeof(my_coef_controller));
824
2.57k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
2.57k
  coef->pub.start_input_pass = start_input_pass;
826
2.57k
  coef->pub.start_output_pass = start_output_pass;
827
2.57k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
2.57k
  coef->coef_bits_latch = NULL;
829
2.57k
#endif
830
831
  /* Create the coefficient buffer. */
832
2.57k
  if (need_full_buffer) {
833
2.10k
#ifdef D_MULTISCAN_FILES_SUPPORTED
834
    /* Allocate a full-image virtual array for each component, */
835
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
836
    /* Note we ask for a pre-zeroed array. */
837
2.10k
    int ci, access_rows;
838
2.10k
    jpeg_component_info *compptr;
839
840
5.93k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
3.83k
         ci++, compptr++) {
842
3.83k
      access_rows = compptr->v_samp_factor;
843
3.83k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
3.83k
      if (cinfo->progressive_mode)
846
2.29k
        access_rows *= 5;
847
3.83k
#endif
848
3.83k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
3.83k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
3.83k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
3.83k
                               (long)compptr->h_samp_factor),
852
3.83k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
3.83k
                               (long)compptr->v_samp_factor),
854
3.83k
         (JDIMENSION)access_rows);
855
3.83k
    }
856
2.10k
    coef->pub.consume_data = consume_data;
857
2.10k
    coef->pub._decompress_data = decompress_data;
858
2.10k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
2.10k
  } else {
863
    /* We only need a single-MCU buffer. */
864
477
    JBLOCKROW buffer;
865
477
    int i;
866
867
477
    buffer = (JBLOCKROW)
868
477
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
477
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
5.24k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
4.77k
      coef->MCU_buffer[i] = buffer + i;
872
4.77k
    }
873
477
    coef->pub.consume_data = dummy_consume_data;
874
477
    coef->pub._decompress_data = decompress_onepass;
875
477
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
477
  }
877
878
  /* Allocate the workspace buffer */
879
2.57k
  coef->workspace = (JCOEF *)
880
2.57k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
2.57k
                                sizeof(JCOEF) * DCTSIZE2);
882
2.57k
}