Coverage Report

Created: 2023-10-07 13:33

/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
695k
{
48
695k
  cinfo->input_iMCU_row = 0;
49
695k
  start_iMCU_row(cinfo);
50
695k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
71.2k
{
60
71.2k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
71.2k
  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
71.2k
  if (coef->pub.coef_arrays != NULL) {
65
29.7k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
17.3k
      coef->pub._decompress_data = decompress_smooth_data;
67
12.4k
    else
68
12.4k
      coef->pub._decompress_data = decompress_data;
69
29.7k
  }
70
71.2k
#endif
71
71.2k
  cinfo->output_iMCU_row = 0;
72
71.2k
}
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
1.49M
{
88
1.49M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
1.49M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
1.49M
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
1.49M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
1.49M
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
1.49M
  _JSAMPARRAY output_ptr;
94
1.49M
  JDIMENSION start_col, output_col;
95
1.49M
  jpeg_component_info *compptr;
96
1.49M
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
3.32M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
1.83M
       yoffset++) {
101
15.2M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
13.4M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
13.4M
      jzero_far((void *)coef->MCU_buffer[0],
105
13.4M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
13.4M
      if (!cinfo->entropy->insufficient_data)
107
6.18M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
13.4M
      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
13.4M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
13.4M
          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
13.4M
        blkn = 0;               /* index of current DCT block within MCU */
126
39.1M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
25.7M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
25.7M
          if (!compptr->component_needed) {
130
1.55M
            blkn += compptr->MCU_blocks;
131
1.55M
            continue;
132
1.55M
          }
133
24.2M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
24.2M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
20.6M
                         compptr->MCU_width : compptr->last_col_width;
136
24.2M
          output_ptr = output_buf[compptr->component_index] +
137
24.2M
                       yoffset * compptr->_DCT_scaled_size;
138
24.2M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
24.2M
                      compptr->MCU_sample_width;
140
55.1M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
30.9M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
30.9M
                yoffset + yindex < compptr->last_row_height) {
143
30.2M
              output_col = start_col;
144
75.0M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
44.7M
                (*inverse_DCT) (cinfo, compptr,
146
44.7M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
44.7M
                                output_ptr, output_col);
148
44.7M
                output_col += compptr->_DCT_scaled_size;
149
44.7M
              }
150
30.2M
            }
151
30.9M
            blkn += compptr->MCU_width;
152
30.9M
            output_ptr += compptr->_DCT_scaled_size;
153
30.9M
          }
154
24.2M
        }
155
13.4M
      }
156
13.4M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
1.83M
    coef->MCU_ctr = 0;
159
1.83M
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
1.49M
  cinfo->output_iMCU_row++;
162
1.49M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
1.44M
    start_iMCU_row(cinfo);
164
1.44M
    return JPEG_ROW_COMPLETED;
165
1.44M
  }
166
  /* Completed the scan */
167
41.4k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
41.4k
  return JPEG_SCAN_COMPLETED;
169
1.49M
}
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
51.9M
{
195
51.9M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
51.9M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
51.9M
  int blkn, ci, xindex, yindex, yoffset;
198
51.9M
  JDIMENSION start_col;
199
51.9M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
51.9M
  JBLOCKROW buffer_ptr;
201
51.9M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
130M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
78.6M
    compptr = cinfo->cur_comp_info[ci];
206
78.6M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
78.6M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
78.6M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
78.6M
       (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
78.6M
  }
215
216
  /* Loop to process one whole iMCU row */
217
126M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
74.0M
       yoffset++) {
219
471M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
397M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
397M
      blkn = 0;                 /* index of current DCT block within MCU */
223
885M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
488M
        compptr = cinfo->cur_comp_info[ci];
225
488M
        start_col = MCU_col_num * compptr->MCU_width;
226
1.02G
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
535M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
1.15G
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
618M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
618M
          }
231
535M
        }
232
488M
      }
233
397M
      if (!cinfo->entropy->insufficient_data)
234
156M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
397M
      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
397M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
74.0M
    coef->MCU_ctr = 0;
245
74.0M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
51.9M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
51.3M
    start_iMCU_row(cinfo);
249
51.3M
    return JPEG_ROW_COMPLETED;
250
51.3M
  }
251
  /* Completed the scan */
252
653k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
653k
  return JPEG_SCAN_COMPLETED;
254
51.9M
}
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
1.76M
{
268
1.76M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
1.76M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
1.76M
  JDIMENSION block_num;
271
1.76M
  int ci, block_row, block_rows;
272
1.76M
  JBLOCKARRAY buffer;
273
1.76M
  JBLOCKROW buffer_ptr;
274
1.76M
  _JSAMPARRAY output_ptr;
275
1.76M
  JDIMENSION output_col;
276
1.76M
  jpeg_component_info *compptr;
277
1.76M
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
1.76M
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
1.76M
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
1.76M
          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
6.99M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
5.23M
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
5.23M
    if (!compptr->component_needed)
292
621k
      continue;
293
    /* Align the virtual buffer for this component. */
294
4.61M
    buffer = (*cinfo->mem->access_virt_barray)
295
4.61M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
4.61M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
4.61M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
4.61M
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
4.57M
      block_rows = compptr->v_samp_factor;
301
33.2k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
33.2k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
33.2k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
33.2k
    }
306
4.61M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
4.61M
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
11.1M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
6.50M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
6.50M
      output_col = 0;
312
6.50M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
31.2M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
24.7M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
24.7M
                        output_col);
316
24.7M
        buffer_ptr++;
317
24.7M
        output_col += compptr->_DCT_scaled_size;
318
24.7M
      }
319
6.50M
      output_ptr += compptr->_DCT_scaled_size;
320
6.50M
    }
321
4.61M
  }
322
323
1.76M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
1.75M
    return JPEG_ROW_COMPLETED;
325
12.4k
  return JPEG_SCAN_COMPLETED;
326
1.76M
}
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
12.9M
#define Q01_POS  1
342
12.9M
#define Q10_POS  8
343
12.9M
#define Q20_POS  16
344
12.9M
#define Q11_POS  9
345
12.9M
#define Q02_POS  2
346
9.70M
#define Q03_POS  3
347
9.70M
#define Q12_POS  10
348
9.70M
#define Q21_POS  17
349
9.69M
#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
29.7k
{
362
29.7k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
29.7k
  boolean smoothing_useful = FALSE;
364
29.7k
  int ci, coefi;
365
29.7k
  jpeg_component_info *compptr;
366
29.7k
  JQUANT_TBL *qtable;
367
29.7k
  int *coef_bits, *prev_coef_bits;
368
29.7k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
29.7k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
1.09k
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
28.6k
  if (coef->coef_bits_latch == NULL)
375
28.6k
    coef->coef_bits_latch = (int *)
376
28.6k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
28.6k
                                  cinfo->num_components * 2 *
378
28.6k
                                  (SAVED_COEFS * sizeof(int)));
379
28.6k
  coef_bits_latch = coef->coef_bits_latch;
380
28.6k
  prev_coef_bits_latch =
381
28.6k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
84.3k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
66.9k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
66.9k
    if ((qtable = compptr->quant_table) == NULL)
387
3.13k
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
63.8k
    if (qtable->quantval[0] == 0 ||
390
63.8k
        qtable->quantval[Q01_POS] == 0 ||
391
63.8k
        qtable->quantval[Q10_POS] == 0 ||
392
63.8k
        qtable->quantval[Q20_POS] == 0 ||
393
63.8k
        qtable->quantval[Q11_POS] == 0 ||
394
63.8k
        qtable->quantval[Q02_POS] == 0 ||
395
63.8k
        qtable->quantval[Q03_POS] == 0 ||
396
63.8k
        qtable->quantval[Q12_POS] == 0 ||
397
63.8k
        qtable->quantval[Q21_POS] == 0 ||
398
63.8k
        qtable->quantval[Q30_POS] == 0)
399
8.00k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
55.8k
    coef_bits = cinfo->coef_bits[ci];
402
55.8k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
55.8k
    if (coef_bits[0] < 0)
404
107
      return FALSE;
405
55.7k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
557k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
501k
      if (cinfo->input_scan_number > 1)
409
307k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
193k
      else
411
193k
        prev_coef_bits_latch[coefi] = -1;
412
501k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
501k
      if (coef_bits[coefi] != 0)
414
480k
        smoothing_useful = TRUE;
415
501k
    }
416
55.7k
    coef_bits_latch += SAVED_COEFS;
417
55.7k
    prev_coef_bits_latch += SAVED_COEFS;
418
55.7k
  }
419
420
17.4k
  return smoothing_useful;
421
28.6k
}
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
4.89M
{
431
4.89M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
4.89M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
4.89M
  JDIMENSION block_num, last_block_column;
434
4.89M
  int ci, block_row, block_rows, access_rows;
435
4.89M
  JBLOCKARRAY buffer;
436
4.89M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
437
4.89M
  JBLOCKROW next_block_row, next_next_block_row;
438
4.89M
  _JSAMPARRAY output_ptr;
439
4.89M
  JDIMENSION output_col;
440
4.89M
  jpeg_component_info *compptr;
441
4.89M
  _inverse_DCT_method_ptr inverse_DCT;
442
4.89M
  boolean change_dc;
443
4.89M
  JCOEF *workspace;
444
4.89M
  int *coef_bits;
445
4.89M
  JQUANT_TBL *quanttbl;
446
4.89M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
447
4.89M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
448
4.89M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
449
4.89M
      DC25;
450
4.89M
  int Al, pred;
451
452
  /* Keep a local variable to avoid looking it up more than once */
453
4.89M
  workspace = coef->workspace;
454
455
  /* Force some input to be done if we are getting ahead of the input. */
456
4.89M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
457
4.89M
         !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
19.5M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
474
14.6M
       ci++, compptr++) {
475
    /* Don't bother to IDCT an uninteresting component. */
476
14.6M
    if (!compptr->component_needed)
477
1.71M
      continue;
478
    /* Count non-dummy DCT block rows in this iMCU row. */
479
12.9M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
480
12.8M
      block_rows = compptr->v_samp_factor;
481
12.8M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
482
12.8M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
483
36.3k
      block_rows = compptr->v_samp_factor;
484
36.3k
      access_rows = block_rows * 2; /* this and next iMCU row */
485
47.5k
    } else {
486
      /* NB: can't use last_row_height here; it is input-side-dependent! */
487
47.5k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
488
47.5k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
489
47.5k
      access_rows = block_rows; /* this iMCU row only */
490
47.5k
    }
491
    /* Align the virtual buffer for this component. */
492
12.9M
    if (cinfo->output_iMCU_row > 1) {
493
12.8M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
494
12.8M
      buffer = (*cinfo->mem->access_virt_barray)
495
12.8M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
496
12.8M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
497
12.8M
         (JDIMENSION)access_rows, FALSE);
498
12.8M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
499
12.8M
    } else if (cinfo->output_iMCU_row > 0) {
500
36.3k
      buffer = (*cinfo->mem->access_virt_barray)
501
36.3k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
502
36.3k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
503
36.3k
         (JDIMENSION)access_rows, FALSE);
504
36.3k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
505
47.5k
    } else {
506
47.5k
      buffer = (*cinfo->mem->access_virt_barray)
507
47.5k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
508
47.5k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
509
47.5k
    }
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
12.9M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
515
3.59M
      coef_bits =
516
3.59M
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
517
9.32M
    else
518
9.32M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
519
520
    /* We only do DC interpolation if no AC coefficient data is available. */
521
12.9M
    change_dc =
522
12.9M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
523
12.9M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
524
12.9M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
525
526
12.9M
    quanttbl = compptr->quant_table;
527
12.9M
    Q00 = quanttbl->quantval[0];
528
12.9M
    Q01 = quanttbl->quantval[Q01_POS];
529
12.9M
    Q10 = quanttbl->quantval[Q10_POS];
530
12.9M
    Q20 = quanttbl->quantval[Q20_POS];
531
12.9M
    Q11 = quanttbl->quantval[Q11_POS];
532
12.9M
    Q02 = quanttbl->quantval[Q02_POS];
533
12.9M
    if (change_dc) {
534
9.64M
      Q03 = quanttbl->quantval[Q03_POS];
535
9.64M
      Q12 = quanttbl->quantval[Q12_POS];
536
9.64M
      Q21 = quanttbl->quantval[Q21_POS];
537
9.64M
      Q30 = quanttbl->quantval[Q30_POS];
538
9.64M
    }
539
12.9M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
540
12.9M
    output_ptr = output_buf[ci];
541
    /* Loop over all DCT blocks to be processed. */
542
31.1M
    for (block_row = 0; block_row < block_rows; block_row++) {
543
18.1M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
544
545
18.1M
      if (block_row > 0 || cinfo->output_iMCU_row > 0)
546
18.1M
        prev_block_row =
547
18.1M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
548
47.5k
      else
549
47.5k
        prev_block_row = buffer_ptr;
550
551
18.1M
      if (block_row > 1 || cinfo->output_iMCU_row > 1)
552
18.0M
        prev_prev_block_row =
553
18.0M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
554
109k
      else
555
109k
        prev_prev_block_row = prev_block_row;
556
557
18.1M
      if (block_row < block_rows - 1 || cinfo->output_iMCU_row < last_iMCU_row)
558
18.1M
        next_block_row =
559
18.1M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
560
47.5k
      else
561
47.5k
        next_block_row = buffer_ptr;
562
563
18.1M
      if (block_row < block_rows - 2 ||
564
18.1M
          cinfo->output_iMCU_row + 1 < last_iMCU_row)
565
18.0M
        next_next_block_row =
566
18.0M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
567
106k
      else
568
106k
        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
18.1M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
574
18.1M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
575
18.1M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
576
18.1M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
577
18.1M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
578
18.1M
      output_col = 0;
579
18.1M
      last_block_column = compptr->width_in_blocks - 1;
580
18.1M
      for (block_num = cinfo->master->first_MCU_col[ci];
581
69.5M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
582
        /* Fetch current DCT block into workspace so we can modify it. */
583
51.3M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
584
        /* Update DC values */
585
51.3M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
586
51.3M
            block_num < last_block_column) {
587
8.63M
          DC04 = (int)prev_prev_block_row[1][0];
588
8.63M
          DC09 = (int)prev_block_row[1][0];
589
8.63M
          DC14 = (int)buffer_ptr[1][0];
590
8.63M
          DC19 = (int)next_block_row[1][0];
591
8.63M
          DC24 = (int)next_next_block_row[1][0];
592
8.63M
        }
593
51.3M
        if (block_num + 1 < last_block_column) {
594
24.5M
          DC05 = (int)prev_prev_block_row[2][0];
595
24.5M
          DC10 = (int)prev_block_row[2][0];
596
24.5M
          DC15 = (int)buffer_ptr[2][0];
597
24.5M
          DC20 = (int)next_block_row[2][0];
598
24.5M
          DC25 = (int)next_next_block_row[2][0];
599
24.5M
        }
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
51.3M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
612
45.5M
          num = Q00 * (change_dc ?
613
38.6M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
614
38.6M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
615
38.6M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
616
38.6M
                 DC21 - DC22 + DC24 + DC25) :
617
45.5M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
618
45.5M
          if (num >= 0) {
619
38.5M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
620
38.5M
            if (Al > 0 && pred >= (1 << Al))
621
219k
              pred = (1 << Al) - 1;
622
38.5M
          } else {
623
7.05M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
624
7.05M
            if (Al > 0 && pred >= (1 << Al))
625
53.6k
              pred = (1 << Al) - 1;
626
7.05M
            pred = -pred;
627
7.05M
          }
628
45.5M
          workspace[1] = (JCOEF)pred;
629
45.5M
        }
630
        /* AC10 */
631
51.3M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
632
46.0M
          num = Q00 * (change_dc ?
633
38.6M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
634
38.6M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
635
38.6M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
636
38.6M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
637
46.0M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
638
46.0M
          if (num >= 0) {
639
36.8M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
640
36.8M
            if (Al > 0 && pred >= (1 << Al))
641
326k
              pred = (1 << Al) - 1;
642
36.8M
          } else {
643
9.12M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
644
9.12M
            if (Al > 0 && pred >= (1 << Al))
645
84.7k
              pred = (1 << Al) - 1;
646
9.12M
            pred = -pred;
647
9.12M
          }
648
46.0M
          workspace[8] = (JCOEF)pred;
649
46.0M
        }
650
        /* AC20 */
651
51.3M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
652
45.6M
          num = Q00 * (change_dc ?
653
38.6M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
654
38.6M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
655
45.6M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
656
45.6M
          if (num >= 0) {
657
33.7M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
658
33.7M
            if (Al > 0 && pred >= (1 << Al))
659
62.5k
              pred = (1 << Al) - 1;
660
33.7M
          } else {
661
11.9M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
662
11.9M
            if (Al > 0 && pred >= (1 << Al))
663
63.8k
              pred = (1 << Al) - 1;
664
11.9M
            pred = -pred;
665
11.9M
          }
666
45.6M
          workspace[16] = (JCOEF)pred;
667
45.6M
        }
668
        /* AC11 */
669
51.3M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
670
45.6M
          num = Q00 * (change_dc ?
671
38.6M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
672
38.6M
                 9 * DC19 + DC21 - DC25) :
673
45.6M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
674
7.04M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
675
45.6M
          if (num >= 0) {
676
40.8M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
677
40.8M
            if (Al > 0 && pred >= (1 << Al))
678
17.8k
              pred = (1 << Al) - 1;
679
40.8M
          } else {
680
4.80M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
681
4.80M
            if (Al > 0 && pred >= (1 << Al))
682
19.5k
              pred = (1 << Al) - 1;
683
4.80M
            pred = -pred;
684
4.80M
          }
685
45.6M
          workspace[9] = (JCOEF)pred;
686
45.6M
        }
687
        /* AC02 */
688
51.3M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
689
44.9M
          num = Q00 * (change_dc ?
690
38.6M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
691
38.6M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
692
44.9M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
693
44.9M
          if (num >= 0) {
694
33.5M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
695
33.5M
            if (Al > 0 && pred >= (1 << Al))
696
46.1k
              pred = (1 << Al) - 1;
697
33.5M
          } else {
698
11.4M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
699
11.4M
            if (Al > 0 && pred >= (1 << Al))
700
42.5k
              pred = (1 << Al) - 1;
701
11.4M
            pred = -pred;
702
11.4M
          }
703
44.9M
          workspace[2] = (JCOEF)pred;
704
44.9M
        }
705
51.3M
        if (change_dc) {
706
          /* AC03 */
707
38.6M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
708
38.6M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
709
38.6M
            if (num >= 0) {
710
33.0M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
711
33.0M
              if (Al > 0 && pred >= (1 << Al))
712
0
                pred = (1 << Al) - 1;
713
33.0M
            } else {
714
5.61M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
715
5.61M
              if (Al > 0 && pred >= (1 << Al))
716
0
                pred = (1 << Al) - 1;
717
5.61M
              pred = -pred;
718
5.61M
            }
719
38.6M
            workspace[3] = (JCOEF)pred;
720
38.6M
          }
721
          /* AC12 */
722
38.6M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
723
38.6M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
724
38.6M
            if (num >= 0) {
725
26.0M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
726
26.0M
              if (Al > 0 && pred >= (1 << Al))
727
0
                pred = (1 << Al) - 1;
728
26.0M
            } else {
729
12.5M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
730
12.5M
              if (Al > 0 && pred >= (1 << Al))
731
0
                pred = (1 << Al) - 1;
732
12.5M
              pred = -pred;
733
12.5M
            }
734
38.6M
            workspace[10] = (JCOEF)pred;
735
38.6M
          }
736
          /* AC21 */
737
38.6M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
738
38.6M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
739
38.6M
            if (num >= 0) {
740
31.4M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
741
31.4M
              if (Al > 0 && pred >= (1 << Al))
742
0
                pred = (1 << Al) - 1;
743
31.4M
            } else {
744
7.21M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
745
7.21M
              if (Al > 0 && pred >= (1 << Al))
746
0
                pred = (1 << Al) - 1;
747
7.21M
              pred = -pred;
748
7.21M
            }
749
38.6M
            workspace[17] = (JCOEF)pred;
750
38.6M
          }
751
          /* AC30 */
752
38.6M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
753
38.6M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
754
38.6M
            if (num >= 0) {
755
31.1M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
756
31.1M
              if (Al > 0 && pred >= (1 << Al))
757
0
                pred = (1 << Al) - 1;
758
31.1M
            } else {
759
7.48M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
760
7.48M
              if (Al > 0 && pred >= (1 << Al))
761
0
                pred = (1 << Al) - 1;
762
7.48M
              pred = -pred;
763
7.48M
            }
764
38.6M
            workspace[24] = (JCOEF)pred;
765
38.6M
          }
766
          /* coef_bits[0] is non-negative.  Otherwise this function would not
767
           * be called.
768
           */
769
38.6M
          num = Q00 *
770
38.6M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
771
38.6M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
772
38.6M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
773
38.6M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
774
38.6M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
775
38.6M
          if (num >= 0) {
776
23.0M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
777
23.0M
          } else {
778
15.5M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
779
15.5M
            pred = -pred;
780
15.5M
          }
781
38.6M
          workspace[0] = (JCOEF)pred;
782
38.6M
        }  /* change_dc */
783
784
        /* OK, do the IDCT */
785
51.3M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
786
51.3M
                        output_col);
787
        /* Advance for next column */
788
51.3M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
789
51.3M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
790
51.3M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
791
51.3M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
792
51.3M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
793
51.3M
        buffer_ptr++, prev_block_row++, next_block_row++,
794
51.3M
          prev_prev_block_row++, next_next_block_row++;
795
51.3M
        output_col += compptr->_DCT_scaled_size;
796
51.3M
      }
797
18.1M
      output_ptr += compptr->_DCT_scaled_size;
798
18.1M
    }
799
12.9M
  }
800
801
4.89M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
802
4.87M
    return JPEG_ROW_COMPLETED;
803
17.3k
  return JPEG_SCAN_COMPLETED;
804
4.89M
}
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
91.5k
{
816
91.5k
  my_coef_ptr coef;
817
818
91.5k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
91.5k
  coef = (my_coef_ptr)
822
91.5k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
91.5k
                                sizeof(my_coef_controller));
824
91.5k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
91.5k
  coef->pub.start_input_pass = start_input_pass;
826
91.5k
  coef->pub.start_output_pass = start_output_pass;
827
91.5k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
91.5k
  coef->coef_bits_latch = NULL;
829
91.5k
#endif
830
831
  /* Create the coefficient buffer. */
832
91.5k
  if (need_full_buffer) {
833
49.4k
#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
49.4k
    int ci, access_rows;
838
49.4k
    jpeg_component_info *compptr;
839
840
196k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
147k
         ci++, compptr++) {
842
147k
      access_rows = compptr->v_samp_factor;
843
147k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
147k
      if (cinfo->progressive_mode)
846
131k
        access_rows *= 5;
847
147k
#endif
848
147k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
147k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
147k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
147k
                               (long)compptr->h_samp_factor),
852
147k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
147k
                               (long)compptr->v_samp_factor),
854
147k
         (JDIMENSION)access_rows);
855
147k
    }
856
49.4k
    coef->pub.consume_data = consume_data;
857
49.4k
    coef->pub._decompress_data = decompress_data;
858
49.4k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
49.4k
  } else {
863
    /* We only need a single-MCU buffer. */
864
42.0k
    JBLOCKROW buffer;
865
42.0k
    int i;
866
867
42.0k
    buffer = (JBLOCKROW)
868
42.0k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
42.0k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
462k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
420k
      coef->MCU_buffer[i] = buffer + i;
872
420k
    }
873
42.0k
    coef->pub.consume_data = dummy_consume_data;
874
42.0k
    coef->pub._decompress_data = decompress_onepass;
875
42.0k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
42.0k
  }
877
878
  /* Allocate the workspace buffer */
879
91.5k
  coef->workspace = (JCOEF *)
880
91.5k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
91.5k
                                sizeof(JCOEF) * DCTSIZE2);
882
91.5k
}
j12init_d_coef_controller
Line
Count
Source
815
42.7k
{
816
42.7k
  my_coef_ptr coef;
817
818
42.7k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
42.7k
  coef = (my_coef_ptr)
822
42.7k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
42.7k
                                sizeof(my_coef_controller));
824
42.7k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
42.7k
  coef->pub.start_input_pass = start_input_pass;
826
42.7k
  coef->pub.start_output_pass = start_output_pass;
827
42.7k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
42.7k
  coef->coef_bits_latch = NULL;
829
42.7k
#endif
830
831
  /* Create the coefficient buffer. */
832
42.7k
  if (need_full_buffer) {
833
20.4k
#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
20.4k
    int ci, access_rows;
838
20.4k
    jpeg_component_info *compptr;
839
840
81.3k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
60.8k
         ci++, compptr++) {
842
60.8k
      access_rows = compptr->v_samp_factor;
843
60.8k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
60.8k
      if (cinfo->progressive_mode)
846
57.0k
        access_rows *= 5;
847
60.8k
#endif
848
60.8k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
60.8k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
60.8k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
60.8k
                               (long)compptr->h_samp_factor),
852
60.8k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
60.8k
                               (long)compptr->v_samp_factor),
854
60.8k
         (JDIMENSION)access_rows);
855
60.8k
    }
856
20.4k
    coef->pub.consume_data = consume_data;
857
20.4k
    coef->pub._decompress_data = decompress_data;
858
20.4k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
22.2k
  } else {
863
    /* We only need a single-MCU buffer. */
864
22.2k
    JBLOCKROW buffer;
865
22.2k
    int i;
866
867
22.2k
    buffer = (JBLOCKROW)
868
22.2k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
22.2k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
245k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
222k
      coef->MCU_buffer[i] = buffer + i;
872
222k
    }
873
22.2k
    coef->pub.consume_data = dummy_consume_data;
874
22.2k
    coef->pub._decompress_data = decompress_onepass;
875
22.2k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
22.2k
  }
877
878
  /* Allocate the workspace buffer */
879
42.7k
  coef->workspace = (JCOEF *)
880
42.7k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
42.7k
                                sizeof(JCOEF) * DCTSIZE2);
882
42.7k
}
jinit_d_coef_controller
Line
Count
Source
815
48.7k
{
816
48.7k
  my_coef_ptr coef;
817
818
48.7k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
48.7k
  coef = (my_coef_ptr)
822
48.7k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
48.7k
                                sizeof(my_coef_controller));
824
48.7k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
48.7k
  coef->pub.start_input_pass = start_input_pass;
826
48.7k
  coef->pub.start_output_pass = start_output_pass;
827
48.7k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
48.7k
  coef->coef_bits_latch = NULL;
829
48.7k
#endif
830
831
  /* Create the coefficient buffer. */
832
48.7k
  if (need_full_buffer) {
833
28.9k
#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
28.9k
    int ci, access_rows;
838
28.9k
    jpeg_component_info *compptr;
839
840
115k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
86.3k
         ci++, compptr++) {
842
86.3k
      access_rows = compptr->v_samp_factor;
843
86.3k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
86.3k
      if (cinfo->progressive_mode)
846
74.6k
        access_rows *= 5;
847
86.3k
#endif
848
86.3k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
86.3k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
86.3k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
86.3k
                               (long)compptr->h_samp_factor),
852
86.3k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
86.3k
                               (long)compptr->v_samp_factor),
854
86.3k
         (JDIMENSION)access_rows);
855
86.3k
    }
856
28.9k
    coef->pub.consume_data = consume_data;
857
28.9k
    coef->pub._decompress_data = decompress_data;
858
28.9k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
28.9k
  } else {
863
    /* We only need a single-MCU buffer. */
864
19.7k
    JBLOCKROW buffer;
865
19.7k
    int i;
866
867
19.7k
    buffer = (JBLOCKROW)
868
19.7k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
19.7k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
217k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
197k
      coef->MCU_buffer[i] = buffer + i;
872
197k
    }
873
19.7k
    coef->pub.consume_data = dummy_consume_data;
874
19.7k
    coef->pub._decompress_data = decompress_onepass;
875
19.7k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
19.7k
  }
877
878
  /* Allocate the workspace buffer */
879
48.7k
  coef->workspace = (JCOEF *)
880
48.7k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
48.7k
                                sizeof(JCOEF) * DCTSIZE2);
882
48.7k
}