Coverage Report

Created: 2024-01-23 06:26

/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
268k
{
48
268k
  cinfo->input_iMCU_row = 0;
49
268k
  start_iMCU_row(cinfo);
50
268k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
42.2k
{
60
42.2k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
42.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
42.2k
  if (coef->pub.coef_arrays != NULL) {
65
18.3k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
7.75k
      coef->pub._decompress_data = decompress_smooth_data;
67
10.5k
    else
68
10.5k
      coef->pub._decompress_data = decompress_data;
69
18.3k
  }
70
42.2k
#endif
71
42.2k
  cinfo->output_iMCU_row = 0;
72
42.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
535k
{
88
535k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
535k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
535k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
535k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
535k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
535k
  _JSAMPARRAY output_ptr;
94
535k
  JDIMENSION start_col, output_col;
95
535k
  jpeg_component_info *compptr;
96
535k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
1.14M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
614k
       yoffset++) {
101
3.88M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
3.26M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
3.26M
      jzero_far((void *)coef->MCU_buffer[0],
105
3.26M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
3.26M
      if (!cinfo->entropy->insufficient_data)
107
1.02M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
3.26M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
109
        /* Suspension forced; update state counters and exit */
110
0
        coef->MCU_vert_offset = yoffset;
111
0
        coef->MCU_ctr = MCU_col_num;
112
0
        return JPEG_SUSPENDED;
113
0
      }
114
115
      /* Only perform the IDCT on blocks that are contained within the desired
116
       * cropping region.
117
       */
118
3.26M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
3.26M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
120
        /* Determine where data should go in output_buf and do the IDCT thing.
121
         * We skip dummy blocks at the right and bottom edges (but blkn gets
122
         * incremented past them!).  Note the inner loop relies on having
123
         * allocated the MCU_buffer[] blocks sequentially.
124
         */
125
3.26M
        blkn = 0;               /* index of current DCT block within MCU */
126
10.5M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
7.26M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
7.26M
          if (!compptr->component_needed) {
130
176k
            blkn += compptr->MCU_blocks;
131
176k
            continue;
132
176k
          }
133
7.08M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
7.08M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
5.74M
                         compptr->MCU_width : compptr->last_col_width;
136
7.08M
          output_ptr = output_buf[compptr->component_index] +
137
7.08M
                       yoffset * compptr->_DCT_scaled_size;
138
7.08M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
7.08M
                      compptr->MCU_sample_width;
140
16.6M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
9.53M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
9.53M
                yoffset + yindex < compptr->last_row_height) {
143
9.17M
              output_col = start_col;
144
23.1M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
13.9M
                (*inverse_DCT) (cinfo, compptr,
146
13.9M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
13.9M
                                output_ptr, output_col);
148
13.9M
                output_col += compptr->_DCT_scaled_size;
149
13.9M
              }
150
9.17M
            }
151
9.53M
            blkn += compptr->MCU_width;
152
9.53M
            output_ptr += compptr->_DCT_scaled_size;
153
9.53M
          }
154
7.08M
        }
155
3.26M
      }
156
3.26M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
614k
    coef->MCU_ctr = 0;
159
614k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
535k
  cinfo->output_iMCU_row++;
162
535k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
511k
    start_iMCU_row(cinfo);
164
511k
    return JPEG_ROW_COMPLETED;
165
511k
  }
166
  /* Completed the scan */
167
23.9k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
23.9k
  return JPEG_SCAN_COMPLETED;
169
535k
}
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
6.58M
{
195
6.58M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
6.58M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
6.58M
  int blkn, ci, xindex, yindex, yoffset;
198
6.58M
  JDIMENSION start_col;
199
6.58M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
6.58M
  JBLOCKROW buffer_ptr;
201
6.58M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
17.6M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
11.0M
    compptr = cinfo->cur_comp_info[ci];
206
11.0M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
11.0M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
11.0M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
11.0M
       (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
11.0M
  }
215
216
  /* Loop to process one whole iMCU row */
217
16.6M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
10.0M
       yoffset++) {
219
53.9M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
43.8M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
43.8M
      blkn = 0;                 /* index of current DCT block within MCU */
223
104M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
60.9M
        compptr = cinfo->cur_comp_info[ci];
225
60.9M
        start_col = MCU_col_num * compptr->MCU_width;
226
132M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
71.5M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
156M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
84.6M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
84.6M
          }
231
71.5M
        }
232
60.9M
      }
233
43.8M
      if (!cinfo->entropy->insufficient_data)
234
23.5M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
43.8M
      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
43.8M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
10.0M
    coef->MCU_ctr = 0;
245
10.0M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
6.58M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
6.34M
    start_iMCU_row(cinfo);
249
6.34M
    return JPEG_ROW_COMPLETED;
250
6.34M
  }
251
  /* Completed the scan */
252
244k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
244k
  return JPEG_SCAN_COMPLETED;
254
6.58M
}
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
779k
{
268
779k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
779k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
779k
  JDIMENSION block_num;
271
779k
  int ci, block_row, block_rows;
272
779k
  JBLOCKARRAY buffer;
273
779k
  JBLOCKROW buffer_ptr;
274
779k
  _JSAMPARRAY output_ptr;
275
779k
  JDIMENSION output_col;
276
779k
  jpeg_component_info *compptr;
277
779k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
779k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
779k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
779k
          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
3.11M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
2.33M
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
2.33M
    if (!compptr->component_needed)
292
294k
      continue;
293
    /* Align the virtual buffer for this component. */
294
2.04M
    buffer = (*cinfo->mem->access_virt_barray)
295
2.04M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
2.04M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
2.04M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
2.04M
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
2.01M
      block_rows = compptr->v_samp_factor;
301
27.5k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
27.5k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
27.5k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
27.5k
    }
306
2.04M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
2.04M
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
5.36M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
3.31M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
3.31M
      output_col = 0;
312
3.31M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
15.6M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
12.3M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
12.3M
                        output_col);
316
12.3M
        buffer_ptr++;
317
12.3M
        output_col += compptr->_DCT_scaled_size;
318
12.3M
      }
319
3.31M
      output_ptr += compptr->_DCT_scaled_size;
320
3.31M
    }
321
2.04M
  }
322
323
779k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
768k
    return JPEG_ROW_COMPLETED;
325
10.5k
  return JPEG_SCAN_COMPLETED;
326
779k
}
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
2.20M
#define Q01_POS  1
342
2.20M
#define Q10_POS  8
343
2.20M
#define Q20_POS  16
344
2.20M
#define Q11_POS  9
345
2.19M
#define Q02_POS  2
346
1.71M
#define Q03_POS  3
347
1.71M
#define Q12_POS  10
348
1.71M
#define Q21_POS  17
349
1.71M
#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
18.3k
{
362
18.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
18.3k
  boolean smoothing_useful = FALSE;
364
18.3k
  int ci, coefi;
365
18.3k
  jpeg_component_info *compptr;
366
18.3k
  JQUANT_TBL *qtable;
367
18.3k
  int *coef_bits, *prev_coef_bits;
368
18.3k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
18.3k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
928
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
17.4k
  if (coef->coef_bits_latch == NULL)
375
17.4k
    coef->coef_bits_latch = (int *)
376
17.4k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
17.4k
                                  cinfo->num_components * 2 *
378
17.4k
                                  (SAVED_COEFS * sizeof(int)));
379
17.4k
  coef_bits_latch = coef->coef_bits_latch;
380
17.4k
  prev_coef_bits_latch =
381
17.4k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
43.3k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
35.6k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
35.6k
    if ((qtable = compptr->quant_table) == NULL)
387
3.28k
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
32.3k
    if (qtable->quantval[0] == 0 ||
390
32.3k
        qtable->quantval[Q01_POS] == 0 ||
391
32.3k
        qtable->quantval[Q10_POS] == 0 ||
392
32.3k
        qtable->quantval[Q20_POS] == 0 ||
393
32.3k
        qtable->quantval[Q11_POS] == 0 ||
394
32.3k
        qtable->quantval[Q02_POS] == 0 ||
395
32.3k
        qtable->quantval[Q03_POS] == 0 ||
396
32.3k
        qtable->quantval[Q12_POS] == 0 ||
397
32.3k
        qtable->quantval[Q21_POS] == 0 ||
398
32.3k
        qtable->quantval[Q30_POS] == 0)
399
6.33k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
26.0k
    coef_bits = cinfo->coef_bits[ci];
402
26.0k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
26.0k
    if (coef_bits[0] < 0)
404
49
      return FALSE;
405
25.9k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
259k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
233k
      if (cinfo->input_scan_number > 1)
409
106k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
127k
      else
411
127k
        prev_coef_bits_latch[coefi] = -1;
412
233k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
233k
      if (coef_bits[coefi] != 0)
414
228k
        smoothing_useful = TRUE;
415
233k
    }
416
25.9k
    coef_bits_latch += SAVED_COEFS;
417
25.9k
    prev_coef_bits_latch += SAVED_COEFS;
418
25.9k
  }
419
420
7.75k
  return smoothing_useful;
421
17.4k
}
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
770k
{
431
770k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
770k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
770k
  JDIMENSION block_num, last_block_column;
434
770k
  int ci, block_row, block_rows, access_rows;
435
770k
  JBLOCKARRAY buffer;
436
770k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
437
770k
  JBLOCKROW next_block_row, next_next_block_row;
438
770k
  _JSAMPARRAY output_ptr;
439
770k
  JDIMENSION output_col;
440
770k
  jpeg_component_info *compptr;
441
770k
  _inverse_DCT_method_ptr inverse_DCT;
442
770k
  boolean change_dc;
443
770k
  JCOEF *workspace;
444
770k
  int *coef_bits;
445
770k
  JQUANT_TBL *quanttbl;
446
770k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
447
770k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
448
770k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
449
770k
      DC25;
450
770k
  int Al, pred;
451
452
  /* Keep a local variable to avoid looking it up more than once */
453
770k
  workspace = coef->workspace;
454
455
  /* Force some input to be done if we are getting ahead of the input. */
456
770k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
457
770k
         !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
3.08M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
474
2.31M
       ci++, compptr++) {
475
    /* Don't bother to IDCT an uninteresting component. */
476
2.31M
    if (!compptr->component_needed)
477
141k
      continue;
478
    /* Count non-dummy DCT block rows in this iMCU row. */
479
2.17M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
480
2.13M
      block_rows = compptr->v_samp_factor;
481
2.13M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
482
2.13M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
483
16.3k
      block_rows = compptr->v_samp_factor;
484
16.3k
      access_rows = block_rows * 2; /* this and next iMCU row */
485
22.0k
    } else {
486
      /* NB: can't use last_row_height here; it is input-side-dependent! */
487
22.0k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
488
22.0k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
489
22.0k
      access_rows = block_rows; /* this iMCU row only */
490
22.0k
    }
491
    /* Align the virtual buffer for this component. */
492
2.17M
    if (cinfo->output_iMCU_row > 1) {
493
2.13M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
494
2.13M
      buffer = (*cinfo->mem->access_virt_barray)
495
2.13M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
496
2.13M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
497
2.13M
         (JDIMENSION)access_rows, FALSE);
498
2.13M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
499
2.13M
    } else if (cinfo->output_iMCU_row > 0) {
500
16.3k
      buffer = (*cinfo->mem->access_virt_barray)
501
16.3k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
502
16.3k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
503
16.3k
         (JDIMENSION)access_rows, FALSE);
504
16.3k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
505
22.0k
    } else {
506
22.0k
      buffer = (*cinfo->mem->access_virt_barray)
507
22.0k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
508
22.0k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
509
22.0k
    }
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
2.17M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
515
970k
      coef_bits =
516
970k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
517
1.20M
    else
518
1.20M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
519
520
    /* We only do DC interpolation if no AC coefficient data is available. */
521
2.17M
    change_dc =
522
2.17M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
523
2.17M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
524
2.17M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
525
526
2.17M
    quanttbl = compptr->quant_table;
527
2.17M
    Q00 = quanttbl->quantval[0];
528
2.17M
    Q01 = quanttbl->quantval[Q01_POS];
529
2.17M
    Q10 = quanttbl->quantval[Q10_POS];
530
2.17M
    Q20 = quanttbl->quantval[Q20_POS];
531
2.17M
    Q11 = quanttbl->quantval[Q11_POS];
532
2.17M
    Q02 = quanttbl->quantval[Q02_POS];
533
2.17M
    if (change_dc) {
534
1.68M
      Q03 = quanttbl->quantval[Q03_POS];
535
1.68M
      Q12 = quanttbl->quantval[Q12_POS];
536
1.68M
      Q21 = quanttbl->quantval[Q21_POS];
537
1.68M
      Q30 = quanttbl->quantval[Q30_POS];
538
1.68M
    }
539
2.17M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
540
2.17M
    output_ptr = output_buf[ci];
541
    /* Loop over all DCT blocks to be processed. */
542
5.30M
    for (block_row = 0; block_row < block_rows; block_row++) {
543
3.13M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
544
545
3.13M
      if (block_row > 0 || cinfo->output_iMCU_row > 0)
546
3.10M
        prev_block_row =
547
3.10M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
548
22.0k
      else
549
22.0k
        prev_block_row = buffer_ptr;
550
551
3.13M
      if (block_row > 1 || cinfo->output_iMCU_row > 1)
552
3.08M
        prev_prev_block_row =
553
3.08M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
554
50.7k
      else
555
50.7k
        prev_prev_block_row = prev_block_row;
556
557
3.13M
      if (block_row < block_rows - 1 || cinfo->output_iMCU_row < last_iMCU_row)
558
3.10M
        next_block_row =
559
3.10M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
560
22.0k
      else
561
22.0k
        next_block_row = buffer_ptr;
562
563
3.13M
      if (block_row < block_rows - 2 ||
564
3.13M
          cinfo->output_iMCU_row + 1 < last_iMCU_row)
565
3.08M
        next_next_block_row =
566
3.08M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
567
48.9k
      else
568
48.9k
        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
3.13M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
574
3.13M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
575
3.13M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
576
3.13M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
577
3.13M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
578
3.13M
      output_col = 0;
579
3.13M
      last_block_column = compptr->width_in_blocks - 1;
580
3.13M
      for (block_num = cinfo->master->first_MCU_col[ci];
581
16.6M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
582
        /* Fetch current DCT block into workspace so we can modify it. */
583
13.5M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
584
        /* Update DC values */
585
13.5M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
586
13.5M
            block_num < last_block_column) {
587
2.49M
          DC04 = (int)prev_prev_block_row[1][0];
588
2.49M
          DC09 = (int)prev_block_row[1][0];
589
2.49M
          DC14 = (int)buffer_ptr[1][0];
590
2.49M
          DC19 = (int)next_block_row[1][0];
591
2.49M
          DC24 = (int)next_next_block_row[1][0];
592
2.49M
        }
593
13.5M
        if (block_num + 1 < last_block_column) {
594
7.90M
          DC05 = (int)prev_prev_block_row[2][0];
595
7.90M
          DC10 = (int)prev_block_row[2][0];
596
7.90M
          DC15 = (int)buffer_ptr[2][0];
597
7.90M
          DC20 = (int)next_block_row[2][0];
598
7.90M
          DC25 = (int)next_next_block_row[2][0];
599
7.90M
        }
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
13.5M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
612
12.3M
          num = Q00 * (change_dc ?
613
10.9M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
614
10.9M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
615
10.9M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
616
10.9M
                 DC21 - DC22 + DC24 + DC25) :
617
12.3M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
618
12.3M
          if (num >= 0) {
619
9.77M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
620
9.77M
            if (Al > 0 && pred >= (1 << Al))
621
4.84k
              pred = (1 << Al) - 1;
622
9.77M
          } else {
623
2.58M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
624
2.58M
            if (Al > 0 && pred >= (1 << Al))
625
3.57k
              pred = (1 << Al) - 1;
626
2.58M
            pred = -pred;
627
2.58M
          }
628
12.3M
          workspace[1] = (JCOEF)pred;
629
12.3M
        }
630
        /* AC10 */
631
13.5M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
632
12.3M
          num = Q00 * (change_dc ?
633
10.9M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
634
10.9M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
635
10.9M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
636
10.9M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
637
12.3M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
638
12.3M
          if (num >= 0) {
639
9.54M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
640
9.54M
            if (Al > 0 && pred >= (1 << Al))
641
21.2k
              pred = (1 << Al) - 1;
642
9.54M
          } else {
643
2.78M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
644
2.78M
            if (Al > 0 && pred >= (1 << Al))
645
19.2k
              pred = (1 << Al) - 1;
646
2.78M
            pred = -pred;
647
2.78M
          }
648
12.3M
          workspace[8] = (JCOEF)pred;
649
12.3M
        }
650
        /* AC20 */
651
13.5M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
652
12.2M
          num = Q00 * (change_dc ?
653
10.9M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
654
10.9M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
655
12.2M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
656
12.2M
          if (num >= 0) {
657
9.02M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
658
9.02M
            if (Al > 0 && pred >= (1 << Al))
659
4.76k
              pred = (1 << Al) - 1;
660
9.02M
          } else {
661
3.25M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
662
3.25M
            if (Al > 0 && pred >= (1 << Al))
663
4.73k
              pred = (1 << Al) - 1;
664
3.25M
            pred = -pred;
665
3.25M
          }
666
12.2M
          workspace[16] = (JCOEF)pred;
667
12.2M
        }
668
        /* AC11 */
669
13.5M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
670
12.2M
          num = Q00 * (change_dc ?
671
10.9M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
672
10.9M
                 9 * DC19 + DC21 - DC25) :
673
12.2M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
674
1.33M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
675
12.2M
          if (num >= 0) {
676
10.1M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
677
10.1M
            if (Al > 0 && pred >= (1 << Al))
678
476
              pred = (1 << Al) - 1;
679
10.1M
          } else {
680
2.07M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
681
2.07M
            if (Al > 0 && pred >= (1 << Al))
682
372
              pred = (1 << Al) - 1;
683
2.07M
            pred = -pred;
684
2.07M
          }
685
12.2M
          workspace[9] = (JCOEF)pred;
686
12.2M
        }
687
        /* AC02 */
688
13.5M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
689
12.1M
          num = Q00 * (change_dc ?
690
10.9M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
691
10.9M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
692
12.1M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
693
12.1M
          if (num >= 0) {
694
9.01M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
695
9.01M
            if (Al > 0 && pred >= (1 << Al))
696
1.02k
              pred = (1 << Al) - 1;
697
9.01M
          } else {
698
3.18M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
699
3.18M
            if (Al > 0 && pred >= (1 << Al))
700
1.02k
              pred = (1 << Al) - 1;
701
3.18M
            pred = -pred;
702
3.18M
          }
703
12.1M
          workspace[2] = (JCOEF)pred;
704
12.1M
        }
705
13.5M
        if (change_dc) {
706
          /* AC03 */
707
10.9M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
708
10.9M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
709
10.9M
            if (num >= 0) {
710
8.87M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
711
8.87M
              if (Al > 0 && pred >= (1 << Al))
712
0
                pred = (1 << Al) - 1;
713
8.87M
            } else {
714
2.04M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
715
2.04M
              if (Al > 0 && pred >= (1 << Al))
716
0
                pred = (1 << Al) - 1;
717
2.04M
              pred = -pred;
718
2.04M
            }
719
10.9M
            workspace[3] = (JCOEF)pred;
720
10.9M
          }
721
          /* AC12 */
722
10.9M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
723
10.9M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
724
10.9M
            if (num >= 0) {
725
7.96M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
726
7.96M
              if (Al > 0 && pred >= (1 << Al))
727
0
                pred = (1 << Al) - 1;
728
7.96M
            } else {
729
2.95M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
730
2.95M
              if (Al > 0 && pred >= (1 << Al))
731
0
                pred = (1 << Al) - 1;
732
2.95M
              pred = -pred;
733
2.95M
            }
734
10.9M
            workspace[10] = (JCOEF)pred;
735
10.9M
          }
736
          /* AC21 */
737
10.9M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
738
10.9M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
739
10.9M
            if (num >= 0) {
740
8.31M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
741
8.31M
              if (Al > 0 && pred >= (1 << Al))
742
0
                pred = (1 << Al) - 1;
743
8.31M
            } else {
744
2.61M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
745
2.61M
              if (Al > 0 && pred >= (1 << Al))
746
0
                pred = (1 << Al) - 1;
747
2.61M
              pred = -pred;
748
2.61M
            }
749
10.9M
            workspace[17] = (JCOEF)pred;
750
10.9M
          }
751
          /* AC30 */
752
10.9M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
753
10.9M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
754
10.9M
            if (num >= 0) {
755
8.70M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
756
8.70M
              if (Al > 0 && pred >= (1 << Al))
757
0
                pred = (1 << Al) - 1;
758
8.70M
            } else {
759
2.22M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
760
2.22M
              if (Al > 0 && pred >= (1 << Al))
761
0
                pred = (1 << Al) - 1;
762
2.22M
              pred = -pred;
763
2.22M
            }
764
10.9M
            workspace[24] = (JCOEF)pred;
765
10.9M
          }
766
          /* coef_bits[0] is non-negative.  Otherwise this function would not
767
           * be called.
768
           */
769
10.9M
          num = Q00 *
770
10.9M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
771
10.9M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
772
10.9M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
773
10.9M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
774
10.9M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
775
10.9M
          if (num >= 0) {
776
7.87M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
777
7.87M
          } else {
778
3.06M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
779
3.06M
            pred = -pred;
780
3.06M
          }
781
10.9M
          workspace[0] = (JCOEF)pred;
782
10.9M
        }  /* change_dc */
783
784
        /* OK, do the IDCT */
785
13.5M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
786
13.5M
                        output_col);
787
        /* Advance for next column */
788
13.5M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
789
13.5M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
790
13.5M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
791
13.5M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
792
13.5M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
793
13.5M
        buffer_ptr++, prev_block_row++, next_block_row++,
794
13.5M
          prev_prev_block_row++, next_next_block_row++;
795
13.5M
        output_col += compptr->_DCT_scaled_size;
796
13.5M
      }
797
3.13M
      output_ptr += compptr->_DCT_scaled_size;
798
3.13M
    }
799
2.17M
  }
800
801
770k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
802
763k
    return JPEG_ROW_COMPLETED;
803
7.75k
  return JPEG_SCAN_COMPLETED;
804
770k
}
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
50.9k
{
816
50.9k
  my_coef_ptr coef;
817
818
50.9k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
50.9k
  coef = (my_coef_ptr)
822
50.9k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
50.9k
                                sizeof(my_coef_controller));
824
50.9k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
50.9k
  coef->pub.start_input_pass = start_input_pass;
826
50.9k
  coef->pub.start_output_pass = start_output_pass;
827
50.9k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
50.9k
  coef->coef_bits_latch = NULL;
829
50.9k
#endif
830
831
  /* Create the coefficient buffer. */
832
50.9k
  if (need_full_buffer) {
833
26.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
26.5k
    int ci, access_rows;
838
26.5k
    jpeg_component_info *compptr;
839
840
106k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
79.5k
         ci++, compptr++) {
842
79.5k
      access_rows = compptr->v_samp_factor;
843
79.5k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
79.5k
      if (cinfo->progressive_mode)
846
70.7k
        access_rows *= 5;
847
79.5k
#endif
848
79.5k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
79.5k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
79.5k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
79.5k
                               (long)compptr->h_samp_factor),
852
79.5k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
79.5k
                               (long)compptr->v_samp_factor),
854
79.5k
         (JDIMENSION)access_rows);
855
79.5k
    }
856
26.5k
    coef->pub.consume_data = consume_data;
857
26.5k
    coef->pub._decompress_data = decompress_data;
858
26.5k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
26.5k
  } else {
863
    /* We only need a single-MCU buffer. */
864
24.4k
    JBLOCKROW buffer;
865
24.4k
    int i;
866
867
24.4k
    buffer = (JBLOCKROW)
868
24.4k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
24.4k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
268k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
244k
      coef->MCU_buffer[i] = buffer + i;
872
244k
    }
873
24.4k
    coef->pub.consume_data = dummy_consume_data;
874
24.4k
    coef->pub._decompress_data = decompress_onepass;
875
24.4k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
24.4k
  }
877
878
  /* Allocate the workspace buffer */
879
50.9k
  coef->workspace = (JCOEF *)
880
50.9k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
50.9k
                                sizeof(JCOEF) * DCTSIZE2);
882
50.9k
}
j12init_d_coef_controller
Line
Count
Source
815
17.6k
{
816
17.6k
  my_coef_ptr coef;
817
818
17.6k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
17.6k
  coef = (my_coef_ptr)
822
17.6k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
17.6k
                                sizeof(my_coef_controller));
824
17.6k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
17.6k
  coef->pub.start_input_pass = start_input_pass;
826
17.6k
  coef->pub.start_output_pass = start_output_pass;
827
17.6k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
17.6k
  coef->coef_bits_latch = NULL;
829
17.6k
#endif
830
831
  /* Create the coefficient buffer. */
832
17.6k
  if (need_full_buffer) {
833
8.82k
#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
8.82k
    int ci, access_rows;
838
8.82k
    jpeg_component_info *compptr;
839
840
35.2k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
26.4k
         ci++, compptr++) {
842
26.4k
      access_rows = compptr->v_samp_factor;
843
26.4k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
26.4k
      if (cinfo->progressive_mode)
846
24.9k
        access_rows *= 5;
847
26.4k
#endif
848
26.4k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
26.4k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
26.4k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
26.4k
                               (long)compptr->h_samp_factor),
852
26.4k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
26.4k
                               (long)compptr->v_samp_factor),
854
26.4k
         (JDIMENSION)access_rows);
855
26.4k
    }
856
8.82k
    coef->pub.consume_data = consume_data;
857
8.82k
    coef->pub._decompress_data = decompress_data;
858
8.82k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
8.82k
  } else {
863
    /* We only need a single-MCU buffer. */
864
8.82k
    JBLOCKROW buffer;
865
8.82k
    int i;
866
867
8.82k
    buffer = (JBLOCKROW)
868
8.82k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
8.82k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
97.0k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
88.2k
      coef->MCU_buffer[i] = buffer + i;
872
88.2k
    }
873
8.82k
    coef->pub.consume_data = dummy_consume_data;
874
8.82k
    coef->pub._decompress_data = decompress_onepass;
875
8.82k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
8.82k
  }
877
878
  /* Allocate the workspace buffer */
879
17.6k
  coef->workspace = (JCOEF *)
880
17.6k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
17.6k
                                sizeof(JCOEF) * DCTSIZE2);
882
17.6k
}
jinit_d_coef_controller
Line
Count
Source
815
33.3k
{
816
33.3k
  my_coef_ptr coef;
817
818
33.3k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
33.3k
  coef = (my_coef_ptr)
822
33.3k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
33.3k
                                sizeof(my_coef_controller));
824
33.3k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
33.3k
  coef->pub.start_input_pass = start_input_pass;
826
33.3k
  coef->pub.start_output_pass = start_output_pass;
827
33.3k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
33.3k
  coef->coef_bits_latch = NULL;
829
33.3k
#endif
830
831
  /* Create the coefficient buffer. */
832
33.3k
  if (need_full_buffer) {
833
17.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
17.6k
    int ci, access_rows;
838
17.6k
    jpeg_component_info *compptr;
839
840
70.7k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
53.0k
         ci++, compptr++) {
842
53.0k
      access_rows = compptr->v_samp_factor;
843
53.0k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
53.0k
      if (cinfo->progressive_mode)
846
45.7k
        access_rows *= 5;
847
53.0k
#endif
848
53.0k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
53.0k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
53.0k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
53.0k
                               (long)compptr->h_samp_factor),
852
53.0k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
53.0k
                               (long)compptr->v_samp_factor),
854
53.0k
         (JDIMENSION)access_rows);
855
53.0k
    }
856
17.6k
    coef->pub.consume_data = consume_data;
857
17.6k
    coef->pub._decompress_data = decompress_data;
858
17.6k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
17.6k
  } else {
863
    /* We only need a single-MCU buffer. */
864
15.6k
    JBLOCKROW buffer;
865
15.6k
    int i;
866
867
15.6k
    buffer = (JBLOCKROW)
868
15.6k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
15.6k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
171k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
156k
      coef->MCU_buffer[i] = buffer + i;
872
156k
    }
873
15.6k
    coef->pub.consume_data = dummy_consume_data;
874
15.6k
    coef->pub._decompress_data = decompress_onepass;
875
15.6k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
15.6k
  }
877
878
  /* Allocate the workspace buffer */
879
33.3k
  coef->workspace = (JCOEF *)
880
33.3k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
33.3k
                                sizeof(JCOEF) * DCTSIZE2);
882
33.3k
}