Coverage Report

Created: 2024-01-23 06:27

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