Coverage Report

Created: 2025-06-12 06:52

/src/opencv/3rdparty/libjpeg-turbo/src/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-2023, 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
118k
{
48
118k
  cinfo->input_iMCU_row = 0;
49
118k
  start_iMCU_row(cinfo);
50
118k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
28.4k
{
60
28.4k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
28.4k
  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
28.4k
  if (coef->pub.coef_arrays != NULL) {
65
10.3k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
2.51k
      coef->pub._decompress_data = decompress_smooth_data;
67
7.81k
    else
68
7.81k
      coef->pub._decompress_data = decompress_data;
69
10.3k
  }
70
28.4k
#endif
71
28.4k
  cinfo->output_iMCU_row = 0;
72
28.4k
}
73
74
75
/*
76
 * Decompress and return some data in the single-pass case.
77
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
78
 * Input and output must run in lockstep since we have only a one-MCU buffer.
79
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
80
 *
81
 * NB: output_buf contains a plane for each component in image,
82
 * which we index according to the component's SOF position.
83
 */
84
85
METHODDEF(int)
86
decompress_onepass(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
87
204k
{
88
204k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
204k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
204k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
204k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
204k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
204k
  _JSAMPARRAY output_ptr;
94
204k
  JDIMENSION start_col, output_col;
95
204k
  jpeg_component_info *compptr;
96
204k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
475k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
271k
       yoffset++) {
101
18.1M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
17.9M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
17.9M
      jzero_far((void *)coef->MCU_buffer[0],
105
17.9M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
17.9M
      if (!cinfo->entropy->insufficient_data)
107
4.42M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
17.9M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
109
        /* Suspension forced; update state counters and exit */
110
162
        coef->MCU_vert_offset = yoffset;
111
162
        coef->MCU_ctr = MCU_col_num;
112
162
        return JPEG_SUSPENDED;
113
162
      }
114
115
      /* Only perform the IDCT on blocks that are contained within the desired
116
       * cropping region.
117
       */
118
17.9M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
17.9M
          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
17.9M
        blkn = 0;               /* index of current DCT block within MCU */
126
37.5M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
19.6M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
19.6M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
19.6M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
19.6M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
19.3M
                         compptr->MCU_width : compptr->last_col_width;
136
19.6M
          output_ptr = output_buf[compptr->component_index] +
137
19.6M
                       yoffset * compptr->_DCT_scaled_size;
138
19.6M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
19.6M
                      compptr->MCU_sample_width;
140
40.8M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
21.2M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
21.2M
                yoffset + yindex < compptr->last_row_height) {
143
21.1M
              output_col = start_col;
144
43.0M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
21.9M
                (*inverse_DCT) (cinfo, compptr,
146
21.9M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
21.9M
                                output_ptr, output_col);
148
21.9M
                output_col += compptr->_DCT_scaled_size;
149
21.9M
              }
150
21.1M
            }
151
21.2M
            blkn += compptr->MCU_width;
152
21.2M
            output_ptr += compptr->_DCT_scaled_size;
153
21.2M
          }
154
19.6M
        }
155
17.9M
      }
156
17.9M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
271k
    coef->MCU_ctr = 0;
159
271k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
204k
  cinfo->output_iMCU_row++;
162
204k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
186k
    start_iMCU_row(cinfo);
164
186k
    return JPEG_ROW_COMPLETED;
165
186k
  }
166
  /* Completed the scan */
167
17.9k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
17.9k
  return JPEG_SCAN_COMPLETED;
169
204k
}
170
171
172
/*
173
 * Dummy consume-input routine for single-pass operation.
174
 */
175
176
METHODDEF(int)
177
dummy_consume_data(j_decompress_ptr cinfo)
178
0
{
179
0
  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
180
0
}
181
182
183
#ifdef D_MULTISCAN_FILES_SUPPORTED
184
185
/*
186
 * Consume input data and store it in the full-image coefficient buffer.
187
 * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
188
 * ie, v_samp_factor block rows for each component in the scan.
189
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
190
 */
191
192
METHODDEF(int)
193
consume_data(j_decompress_ptr cinfo)
194
6.98M
{
195
6.98M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
6.98M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
6.98M
  int blkn, ci, xindex, yindex, yoffset;
198
6.98M
  JDIMENSION start_col;
199
6.98M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
6.98M
  JBLOCKROW buffer_ptr;
201
6.98M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
16.7M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
9.75M
    compptr = cinfo->cur_comp_info[ci];
206
9.75M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
9.75M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
9.75M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
9.75M
       (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
9.75M
  }
215
216
  /* Loop to process one whole iMCU row */
217
17.1M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
10.2M
       yoffset++) {
219
199M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
189M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
189M
      blkn = 0;                 /* index of current DCT block within MCU */
223
453M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
263M
        compptr = cinfo->cur_comp_info[ci];
225
263M
        start_col = MCU_col_num * compptr->MCU_width;
226
604M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
340M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
869M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
529M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
529M
          }
231
340M
        }
232
263M
      }
233
189M
      if (!cinfo->entropy->insufficient_data)
234
90.8M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
189M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
237
        /* Suspension forced; update state counters and exit */
238
390
        coef->MCU_vert_offset = yoffset;
239
390
        coef->MCU_ctr = MCU_col_num;
240
390
        return JPEG_SUSPENDED;
241
390
      }
242
189M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
10.2M
    coef->MCU_ctr = 0;
245
10.2M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
6.98M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
6.88M
    start_iMCU_row(cinfo);
249
6.88M
    return JPEG_ROW_COMPLETED;
250
6.88M
  }
251
  /* Completed the scan */
252
99.7k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
99.7k
  return JPEG_SCAN_COMPLETED;
254
6.98M
}
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
97.5k
{
268
97.5k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
97.5k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
97.5k
  JDIMENSION block_num;
271
97.5k
  int ci, block_row, block_rows;
272
97.5k
  JBLOCKARRAY buffer;
273
97.5k
  JBLOCKROW buffer_ptr;
274
97.5k
  _JSAMPARRAY output_ptr;
275
97.5k
  JDIMENSION output_col;
276
97.5k
  jpeg_component_info *compptr;
277
97.5k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
97.5k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
97.5k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
97.5k
          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
347k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
250k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
250k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
250k
    buffer = (*cinfo->mem->access_virt_barray)
295
250k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
250k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
250k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
250k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
236k
      block_rows = compptr->v_samp_factor;
301
13.9k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
13.9k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
13.9k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
13.9k
    }
306
250k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
250k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
603k
    for (block_row = 0; block_row < block_rows; block_row++) {
310
353k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
353k
      output_col = 0;
312
353k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
6.38M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
6.02M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
6.02M
                        output_col);
316
6.02M
        buffer_ptr++;
317
6.02M
        output_col += compptr->_DCT_scaled_size;
318
6.02M
      }
319
353k
      output_ptr += compptr->_DCT_scaled_size;
320
353k
    }
321
250k
  }
322
323
97.5k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
89.7k
    return JPEG_ROW_COMPLETED;
325
7.78k
  return JPEG_SCAN_COMPLETED;
326
97.5k
}
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
125k
#define Q01_POS  1
342
125k
#define Q10_POS  8
343
124k
#define Q20_POS  16
344
124k
#define Q11_POS  9
345
123k
#define Q02_POS  2
346
66.5k
#define Q03_POS  3
347
65.9k
#define Q12_POS  10
348
65.4k
#define Q21_POS  17
349
65.0k
#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
10.3k
{
362
10.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
10.3k
  boolean smoothing_useful = FALSE;
364
10.3k
  int ci, coefi;
365
10.3k
  jpeg_component_info *compptr;
366
10.3k
  JQUANT_TBL *qtable;
367
10.3k
  int *coef_bits, *prev_coef_bits;
368
10.3k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
10.3k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
985
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
9.33k
  if (coef->coef_bits_latch == NULL)
375
9.33k
    coef->coef_bits_latch = (int *)
376
9.33k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
9.33k
                                  cinfo->num_components * 2 *
378
9.33k
                                  (SAVED_COEFS * sizeof(int)));
379
9.33k
  coef_bits_latch = coef->coef_bits_latch;
380
9.33k
  prev_coef_bits_latch =
381
9.33k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
12.3k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
9.71k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
9.71k
    if ((qtable = compptr->quant_table) == NULL)
387
317
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
9.39k
    if (qtable->quantval[0] == 0 ||
390
9.39k
        qtable->quantval[Q01_POS] == 0 ||
391
9.39k
        qtable->quantval[Q10_POS] == 0 ||
392
9.39k
        qtable->quantval[Q20_POS] == 0 ||
393
9.39k
        qtable->quantval[Q11_POS] == 0 ||
394
9.39k
        qtable->quantval[Q02_POS] == 0 ||
395
9.39k
        qtable->quantval[Q03_POS] == 0 ||
396
9.39k
        qtable->quantval[Q12_POS] == 0 ||
397
9.39k
        qtable->quantval[Q21_POS] == 0 ||
398
9.39k
        qtable->quantval[Q30_POS] == 0)
399
5.15k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
4.24k
    coef_bits = cinfo->coef_bits[ci];
402
4.24k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
4.24k
    if (coef_bits[0] < 0)
404
1.22k
      return FALSE;
405
3.01k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
30.1k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
27.1k
      if (cinfo->input_scan_number > 1)
409
20.9k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
6.22k
      else
411
6.22k
        prev_coef_bits_latch[coefi] = -1;
412
27.1k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
27.1k
      if (coef_bits[coefi] != 0)
414
14.4k
        smoothing_useful = TRUE;
415
27.1k
    }
416
3.01k
    coef_bits_latch += SAVED_COEFS;
417
3.01k
    prev_coef_bits_latch += SAVED_COEFS;
418
3.01k
  }
419
420
2.64k
  return smoothing_useful;
421
9.33k
}
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
93.3k
{
431
93.3k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
93.3k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
93.3k
  JDIMENSION block_num, last_block_column;
434
93.3k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
93.3k
    image_block_rows;
436
93.3k
  JBLOCKARRAY buffer;
437
93.3k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
93.3k
  JBLOCKROW next_block_row, next_next_block_row;
439
93.3k
  _JSAMPARRAY output_ptr;
440
93.3k
  JDIMENSION output_col;
441
93.3k
  jpeg_component_info *compptr;
442
93.3k
  _inverse_DCT_method_ptr inverse_DCT;
443
93.3k
  boolean change_dc;
444
93.3k
  JCOEF *workspace;
445
93.3k
  int *coef_bits;
446
93.3k
  JQUANT_TBL *quanttbl;
447
93.3k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
93.3k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
93.3k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
93.3k
      DC25;
451
93.3k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
93.3k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
93.3k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
93.3k
         !cinfo->inputctl->eoi_reached) {
459
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
460
      /* If input is working on current scan, we ordinarily want it to
461
       * have completed the current row.  But if input scan is DC,
462
       * we want it to keep two rows ahead so that next two block rows' DC
463
       * values are up to date.
464
       */
465
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
466
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
467
0
        break;
468
0
    }
469
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
470
0
      return JPEG_SUSPENDED;
471
0
  }
472
473
  /* OK, output from the virtual arrays. */
474
210k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
116k
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
116k
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
116k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
111k
      block_rows = compptr->v_samp_factor;
482
111k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
111k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
2.46k
      block_rows = compptr->v_samp_factor;
485
2.46k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
2.54k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
2.54k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
2.54k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
2.54k
      access_rows = block_rows; /* this iMCU row only */
491
2.54k
    }
492
    /* Align the virtual buffer for this component. */
493
116k
    if (cinfo->output_iMCU_row > 1) {
494
111k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
111k
      buffer = (*cinfo->mem->access_virt_barray)
496
111k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
111k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
111k
         (JDIMENSION)access_rows, FALSE);
499
111k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
111k
    } else if (cinfo->output_iMCU_row > 0) {
501
2.47k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
2.47k
      buffer = (*cinfo->mem->access_virt_barray)
503
2.47k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
2.47k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
2.47k
         (JDIMENSION)access_rows, FALSE);
506
2.47k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
2.55k
    } else {
508
2.55k
      buffer = (*cinfo->mem->access_virt_barray)
509
2.55k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
2.55k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
2.55k
    }
512
    /* Fetch component-dependent info.
513
     * If the current scan is incomplete, then we use the component-dependent
514
     * info from the previous scan.
515
     */
516
116k
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
36.2k
      coef_bits =
518
36.2k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
80.6k
    else
520
80.6k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
116k
    change_dc =
524
116k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
116k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
116k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
116k
    quanttbl = compptr->quant_table;
529
116k
    Q00 = quanttbl->quantval[0];
530
116k
    Q01 = quanttbl->quantval[Q01_POS];
531
116k
    Q10 = quanttbl->quantval[Q10_POS];
532
116k
    Q20 = quanttbl->quantval[Q20_POS];
533
116k
    Q11 = quanttbl->quantval[Q11_POS];
534
116k
    Q02 = quanttbl->quantval[Q02_POS];
535
116k
    if (change_dc) {
536
60.4k
      Q03 = quanttbl->quantval[Q03_POS];
537
60.4k
      Q12 = quanttbl->quantval[Q12_POS];
538
60.4k
      Q21 = quanttbl->quantval[Q21_POS];
539
60.4k
      Q30 = quanttbl->quantval[Q30_POS];
540
60.4k
    }
541
116k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
116k
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
116k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
285k
    for (block_row = 0; block_row < block_rows; block_row++) {
546
168k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
168k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
168k
      if (image_block_row > 0)
550
166k
        prev_block_row =
551
166k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
2.55k
      else
553
2.55k
        prev_block_row = buffer_ptr;
554
555
168k
      if (image_block_row > 1)
556
163k
        prev_prev_block_row =
557
163k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
5.04k
      else
559
5.04k
        prev_prev_block_row = prev_block_row;
560
561
168k
      if (image_block_row < image_block_rows - 1)
562
166k
        next_block_row =
563
166k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
2.54k
      else
565
2.54k
        next_block_row = buffer_ptr;
566
567
168k
      if (image_block_row < image_block_rows - 2)
568
164k
        next_next_block_row =
569
164k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
4.96k
      else
571
4.96k
        next_next_block_row = next_block_row;
572
573
      /* We fetch the surrounding DC values using a sliding-register approach.
574
       * Initialize all 25 here so as to do the right thing on narrow pics.
575
       */
576
168k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
168k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
168k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
168k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
168k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
168k
      output_col = 0;
582
168k
      last_block_column = compptr->width_in_blocks - 1;
583
168k
      for (block_num = cinfo->master->first_MCU_col[ci];
584
13.6M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
13.5M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
13.5M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
13.5M
            block_num < last_block_column) {
590
92.0k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
92.0k
          DC09 = DC10 = (int)prev_block_row[1][0];
592
92.0k
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
92.0k
          DC19 = DC20 = (int)next_block_row[1][0];
594
92.0k
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
92.0k
        }
596
13.5M
        if (block_num + 1 < last_block_column) {
597
13.2M
          DC05 = (int)prev_prev_block_row[2][0];
598
13.2M
          DC10 = (int)prev_block_row[2][0];
599
13.2M
          DC15 = (int)buffer_ptr[2][0];
600
13.2M
          DC20 = (int)next_block_row[2][0];
601
13.2M
          DC25 = (int)next_next_block_row[2][0];
602
13.2M
        }
603
        /* If DC interpolation is enabled, compute coefficient estimates using
604
         * a Gaussian-like kernel, keeping the averages of the DC values.
605
         *
606
         * If DC interpolation is disabled, compute coefficient estimates using
607
         * an algorithm similar to the one described in Section K.8 of the JPEG
608
         * standard, except applied to a 5x5 window rather than a 3x3 window.
609
         *
610
         * An estimate is applied only if the coefficient is still zero and is
611
         * not known to be fully accurate.
612
         */
613
        /* AC01 */
614
13.5M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
13.2M
          num = Q00 * (change_dc ?
616
12.0M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
12.0M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
12.0M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
12.0M
                 DC21 - DC22 + DC24 + DC25) :
620
13.2M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
13.2M
          if (num >= 0) {
622
6.58M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
6.58M
            if (Al > 0 && pred >= (1 << Al))
624
59.2k
              pred = (1 << Al) - 1;
625
6.66M
          } else {
626
6.66M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
6.66M
            if (Al > 0 && pred >= (1 << Al))
628
59.5k
              pred = (1 << Al) - 1;
629
6.66M
            pred = -pred;
630
6.66M
          }
631
13.2M
          workspace[1] = (JCOEF)pred;
632
13.2M
        }
633
        /* AC10 */
634
13.5M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
13.4M
          num = Q00 * (change_dc ?
636
12.0M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
12.0M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
12.0M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
12.0M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
13.4M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
13.4M
          if (num >= 0) {
642
9.14M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
9.14M
            if (Al > 0 && pred >= (1 << Al))
644
212k
              pred = (1 << Al) - 1;
645
9.14M
          } else {
646
4.34M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
4.34M
            if (Al > 0 && pred >= (1 << Al))
648
188k
              pred = (1 << Al) - 1;
649
4.34M
            pred = -pred;
650
4.34M
          }
651
13.4M
          workspace[8] = (JCOEF)pred;
652
13.4M
        }
653
        /* AC20 */
654
13.5M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
13.4M
          num = Q00 * (change_dc ?
656
12.0M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
12.0M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
13.4M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
13.4M
          if (num >= 0) {
660
8.35M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
8.35M
            if (Al > 0 && pred >= (1 << Al))
662
197k
              pred = (1 << Al) - 1;
663
8.35M
          } else {
664
5.12M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
5.12M
            if (Al > 0 && pred >= (1 << Al))
666
196k
              pred = (1 << Al) - 1;
667
5.12M
            pred = -pred;
668
5.12M
          }
669
13.4M
          workspace[16] = (JCOEF)pred;
670
13.4M
        }
671
        /* AC11 */
672
13.5M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
13.3M
          num = Q00 * (change_dc ?
674
12.0M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
12.0M
                 9 * DC19 + DC21 - DC25) :
676
13.3M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
1.22M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
13.3M
          if (num >= 0) {
679
12.1M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
12.1M
            if (Al > 0 && pred >= (1 << Al))
681
164k
              pred = (1 << Al) - 1;
682
12.1M
          } else {
683
1.14M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
1.14M
            if (Al > 0 && pred >= (1 << Al))
685
168k
              pred = (1 << Al) - 1;
686
1.14M
            pred = -pred;
687
1.14M
          }
688
13.3M
          workspace[9] = (JCOEF)pred;
689
13.3M
        }
690
        /* AC02 */
691
13.5M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
13.3M
          num = Q00 * (change_dc ?
693
12.0M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
12.0M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
13.3M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
13.3M
          if (num >= 0) {
697
8.41M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
8.41M
            if (Al > 0 && pred >= (1 << Al))
699
184k
              pred = (1 << Al) - 1;
700
8.41M
          } else {
701
4.90M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
4.90M
            if (Al > 0 && pred >= (1 << Al))
703
188k
              pred = (1 << Al) - 1;
704
4.90M
            pred = -pred;
705
4.90M
          }
706
13.3M
          workspace[2] = (JCOEF)pred;
707
13.3M
        }
708
13.5M
        if (change_dc) {
709
          /* AC03 */
710
12.0M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
12.0M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
12.0M
            if (num >= 0) {
713
5.31M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
5.31M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
6.77M
            } else {
717
6.77M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
6.77M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
6.77M
              pred = -pred;
721
6.77M
            }
722
12.0M
            workspace[3] = (JCOEF)pred;
723
12.0M
          }
724
          /* AC12 */
725
12.0M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
12.0M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
12.0M
            if (num >= 0) {
728
6.60M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
6.60M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
6.60M
            } else {
732
5.47M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
5.47M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
5.47M
              pred = -pred;
736
5.47M
            }
737
12.0M
            workspace[10] = (JCOEF)pred;
738
12.0M
          }
739
          /* AC21 */
740
12.0M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
12.0M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
12.0M
            if (num >= 0) {
743
9.83M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
9.83M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
9.83M
            } else {
747
2.24M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
2.24M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
2.24M
              pred = -pred;
751
2.24M
            }
752
12.0M
            workspace[17] = (JCOEF)pred;
753
12.0M
          }
754
          /* AC30 */
755
12.0M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
12.0M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
12.0M
            if (num >= 0) {
758
8.09M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
8.09M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
8.09M
            } else {
762
3.99M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
3.99M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
3.99M
              pred = -pred;
766
3.99M
            }
767
12.0M
            workspace[24] = (JCOEF)pred;
768
12.0M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
12.0M
          num = Q00 *
773
12.0M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
12.0M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
12.0M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
12.0M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
12.0M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
12.0M
          if (num >= 0) {
779
6.57M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
6.57M
          } else {
781
5.50M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
5.50M
            pred = -pred;
783
5.50M
          }
784
12.0M
          workspace[0] = (JCOEF)pred;
785
12.0M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
13.5M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
13.5M
                        output_col);
790
        /* Advance for next column */
791
13.5M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
13.5M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
13.5M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
13.5M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
13.5M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
13.5M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
13.5M
          prev_prev_block_row++, next_next_block_row++;
798
13.5M
        output_col += compptr->_DCT_scaled_size;
799
13.5M
      }
800
168k
      output_ptr += compptr->_DCT_scaled_size;
801
168k
    }
802
116k
  }
803
804
93.3k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
90.8k
    return JPEG_ROW_COMPLETED;
806
2.50k
  return JPEG_SCAN_COMPLETED;
807
93.3k
}
808
809
#endif /* BLOCK_SMOOTHING_SUPPORTED */
810
811
812
/*
813
 * Initialize coefficient buffer controller.
814
 */
815
816
GLOBAL(void)
817
_jinit_d_coef_controller(j_decompress_ptr cinfo, boolean need_full_buffer)
818
30.6k
{
819
30.6k
  my_coef_ptr coef;
820
821
30.6k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
30.6k
  coef = (my_coef_ptr)
825
30.6k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
30.6k
                                sizeof(my_coef_controller));
827
30.6k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
828
30.6k
  coef->pub.start_input_pass = start_input_pass;
829
30.6k
  coef->pub.start_output_pass = start_output_pass;
830
30.6k
#ifdef BLOCK_SMOOTHING_SUPPORTED
831
30.6k
  coef->coef_bits_latch = NULL;
832
30.6k
#endif
833
834
  /* Create the coefficient buffer. */
835
30.6k
  if (need_full_buffer) {
836
12.3k
#ifdef D_MULTISCAN_FILES_SUPPORTED
837
    /* Allocate a full-image virtual array for each component, */
838
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
839
    /* Note we ask for a pre-zeroed array. */
840
12.3k
    int ci, access_rows;
841
12.3k
    jpeg_component_info *compptr;
842
843
33.1k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
844
20.8k
         ci++, compptr++) {
845
20.8k
      access_rows = compptr->v_samp_factor;
846
20.8k
#ifdef BLOCK_SMOOTHING_SUPPORTED
847
      /* If block smoothing could be used, need a bigger window */
848
20.8k
      if (cinfo->progressive_mode)
849
15.5k
        access_rows *= 5;
850
20.8k
#endif
851
20.8k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
852
20.8k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
853
20.8k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
854
20.8k
                               (long)compptr->h_samp_factor),
855
20.8k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
856
20.8k
                               (long)compptr->v_samp_factor),
857
20.8k
         (JDIMENSION)access_rows);
858
20.8k
    }
859
12.3k
    coef->pub.consume_data = consume_data;
860
12.3k
    coef->pub._decompress_data = decompress_data;
861
12.3k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
862
#else
863
    ERREXIT(cinfo, JERR_NOT_COMPILED);
864
#endif
865
18.2k
  } else {
866
    /* We only need a single-MCU buffer. */
867
18.2k
    JBLOCKROW buffer;
868
18.2k
    int i;
869
870
18.2k
    buffer = (JBLOCKROW)
871
18.2k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
872
18.2k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
873
201k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
874
182k
      coef->MCU_buffer[i] = buffer + i;
875
182k
    }
876
18.2k
    coef->pub.consume_data = dummy_consume_data;
877
18.2k
    coef->pub._decompress_data = decompress_onepass;
878
18.2k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
879
18.2k
  }
880
881
  /* Allocate the workspace buffer */
882
30.6k
  coef->workspace = (JCOEF *)
883
30.6k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
884
30.6k
                                sizeof(JCOEF) * DCTSIZE2);
885
30.6k
}
j12init_d_coef_controller
Line
Count
Source
818
243
{
819
243
  my_coef_ptr coef;
820
821
243
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
243
  coef = (my_coef_ptr)
825
243
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
243
                                sizeof(my_coef_controller));
827
243
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
828
243
  coef->pub.start_input_pass = start_input_pass;
829
243
  coef->pub.start_output_pass = start_output_pass;
830
243
#ifdef BLOCK_SMOOTHING_SUPPORTED
831
243
  coef->coef_bits_latch = NULL;
832
243
#endif
833
834
  /* Create the coefficient buffer. */
835
243
  if (need_full_buffer) {
836
235
#ifdef D_MULTISCAN_FILES_SUPPORTED
837
    /* Allocate a full-image virtual array for each component, */
838
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
839
    /* Note we ask for a pre-zeroed array. */
840
235
    int ci, access_rows;
841
235
    jpeg_component_info *compptr;
842
843
887
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
844
652
         ci++, compptr++) {
845
652
      access_rows = compptr->v_samp_factor;
846
652
#ifdef BLOCK_SMOOTHING_SUPPORTED
847
      /* If block smoothing could be used, need a bigger window */
848
652
      if (cinfo->progressive_mode)
849
305
        access_rows *= 5;
850
652
#endif
851
652
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
852
652
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
853
652
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
854
652
                               (long)compptr->h_samp_factor),
855
652
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
856
652
                               (long)compptr->v_samp_factor),
857
652
         (JDIMENSION)access_rows);
858
652
    }
859
235
    coef->pub.consume_data = consume_data;
860
235
    coef->pub._decompress_data = decompress_data;
861
235
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
862
#else
863
    ERREXIT(cinfo, JERR_NOT_COMPILED);
864
#endif
865
235
  } else {
866
    /* We only need a single-MCU buffer. */
867
8
    JBLOCKROW buffer;
868
8
    int i;
869
870
8
    buffer = (JBLOCKROW)
871
8
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
872
8
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
873
88
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
874
80
      coef->MCU_buffer[i] = buffer + i;
875
80
    }
876
8
    coef->pub.consume_data = dummy_consume_data;
877
8
    coef->pub._decompress_data = decompress_onepass;
878
8
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
879
8
  }
880
881
  /* Allocate the workspace buffer */
882
243
  coef->workspace = (JCOEF *)
883
243
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
884
243
                                sizeof(JCOEF) * DCTSIZE2);
885
243
}
jinit_d_coef_controller
Line
Count
Source
818
30.3k
{
819
30.3k
  my_coef_ptr coef;
820
821
30.3k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
30.3k
  coef = (my_coef_ptr)
825
30.3k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
30.3k
                                sizeof(my_coef_controller));
827
30.3k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
828
30.3k
  coef->pub.start_input_pass = start_input_pass;
829
30.3k
  coef->pub.start_output_pass = start_output_pass;
830
30.3k
#ifdef BLOCK_SMOOTHING_SUPPORTED
831
30.3k
  coef->coef_bits_latch = NULL;
832
30.3k
#endif
833
834
  /* Create the coefficient buffer. */
835
30.3k
  if (need_full_buffer) {
836
12.1k
#ifdef D_MULTISCAN_FILES_SUPPORTED
837
    /* Allocate a full-image virtual array for each component, */
838
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
839
    /* Note we ask for a pre-zeroed array. */
840
12.1k
    int ci, access_rows;
841
12.1k
    jpeg_component_info *compptr;
842
843
32.2k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
844
20.1k
         ci++, compptr++) {
845
20.1k
      access_rows = compptr->v_samp_factor;
846
20.1k
#ifdef BLOCK_SMOOTHING_SUPPORTED
847
      /* If block smoothing could be used, need a bigger window */
848
20.1k
      if (cinfo->progressive_mode)
849
15.1k
        access_rows *= 5;
850
20.1k
#endif
851
20.1k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
852
20.1k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
853
20.1k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
854
20.1k
                               (long)compptr->h_samp_factor),
855
20.1k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
856
20.1k
                               (long)compptr->v_samp_factor),
857
20.1k
         (JDIMENSION)access_rows);
858
20.1k
    }
859
12.1k
    coef->pub.consume_data = consume_data;
860
12.1k
    coef->pub._decompress_data = decompress_data;
861
12.1k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
862
#else
863
    ERREXIT(cinfo, JERR_NOT_COMPILED);
864
#endif
865
18.2k
  } else {
866
    /* We only need a single-MCU buffer. */
867
18.2k
    JBLOCKROW buffer;
868
18.2k
    int i;
869
870
18.2k
    buffer = (JBLOCKROW)
871
18.2k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
872
18.2k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
873
201k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
874
182k
      coef->MCU_buffer[i] = buffer + i;
875
182k
    }
876
18.2k
    coef->pub.consume_data = dummy_consume_data;
877
18.2k
    coef->pub._decompress_data = decompress_onepass;
878
18.2k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
879
18.2k
  }
880
881
  /* Allocate the workspace buffer */
882
30.3k
  coef->workspace = (JCOEF *)
883
30.3k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
884
30.3k
                                sizeof(JCOEF) * DCTSIZE2);
885
30.3k
}