Coverage Report

Created: 2024-01-20 12:28

/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
594k
{
48
594k
  cinfo->input_iMCU_row = 0;
49
594k
  start_iMCU_row(cinfo);
50
594k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
68.8k
{
60
68.8k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
68.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
62
63
  /* If multipass, check to see whether to use block smoothing on this pass */
64
68.8k
  if (coef->pub.coef_arrays != NULL) {
65
30.6k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
18.0k
      coef->pub._decompress_data = decompress_smooth_data;
67
12.6k
    else
68
12.6k
      coef->pub._decompress_data = decompress_data;
69
30.6k
  }
70
68.8k
#endif
71
68.8k
  cinfo->output_iMCU_row = 0;
72
68.8k
}
73
74
75
/*
76
 * Decompress and return some data in the single-pass case.
77
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
78
 * Input and output must run in lockstep since we have only a one-MCU buffer.
79
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
80
 *
81
 * NB: output_buf contains a plane for each component in image,
82
 * which we index according to the component's SOF position.
83
 */
84
85
METHODDEF(int)
86
decompress_onepass(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
87
2.60M
{
88
2.60M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
2.60M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
2.60M
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
2.60M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
2.60M
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
2.60M
  _JSAMPARRAY output_ptr;
94
2.60M
  JDIMENSION start_col, output_col;
95
2.60M
  jpeg_component_info *compptr;
96
2.60M
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
5.95M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
3.35M
       yoffset++) {
101
18.0M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
14.6M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
14.6M
      jzero_far((void *)coef->MCU_buffer[0],
105
14.6M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
14.6M
      if (!cinfo->entropy->insufficient_data)
107
9.88M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
14.6M
      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
14.6M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
14.6M
          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
14.6M
        blkn = 0;               /* index of current DCT block within MCU */
126
42.3M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
27.6M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
27.6M
          if (!compptr->component_needed) {
130
1.29M
            blkn += compptr->MCU_blocks;
131
1.29M
            continue;
132
1.29M
          }
133
26.3M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
26.3M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
19.8M
                         compptr->MCU_width : compptr->last_col_width;
136
26.3M
          output_ptr = output_buf[compptr->component_index] +
137
26.3M
                       yoffset * compptr->_DCT_scaled_size;
138
26.3M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
26.3M
                      compptr->MCU_sample_width;
140
58.4M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
32.1M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
32.1M
                yoffset + yindex < compptr->last_row_height) {
143
31.3M
              output_col = start_col;
144
75.2M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
43.8M
                (*inverse_DCT) (cinfo, compptr,
146
43.8M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
43.8M
                                output_ptr, output_col);
148
43.8M
                output_col += compptr->_DCT_scaled_size;
149
43.8M
              }
150
31.3M
            }
151
32.1M
            blkn += compptr->MCU_width;
152
32.1M
            output_ptr += compptr->_DCT_scaled_size;
153
32.1M
          }
154
26.3M
        }
155
14.6M
      }
156
14.6M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
3.35M
    coef->MCU_ctr = 0;
159
3.35M
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
2.60M
  cinfo->output_iMCU_row++;
162
2.60M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
2.56M
    start_iMCU_row(cinfo);
164
2.56M
    return JPEG_ROW_COMPLETED;
165
2.56M
  }
166
  /* Completed the scan */
167
38.1k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
38.1k
  return JPEG_SCAN_COMPLETED;
169
2.60M
}
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
70.4M
{
195
70.4M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
70.4M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
70.4M
  int blkn, ci, xindex, yindex, yoffset;
198
70.4M
  JDIMENSION start_col;
199
70.4M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
70.4M
  JBLOCKROW buffer_ptr;
201
70.4M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
164M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
93.8M
    compptr = cinfo->cur_comp_info[ci];
206
93.8M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
93.8M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
93.8M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
93.8M
       (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
93.8M
  }
215
216
  /* Loop to process one whole iMCU row */
217
156M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
85.9M
       yoffset++) {
219
498M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
412M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
412M
      blkn = 0;                 /* index of current DCT block within MCU */
223
899M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
486M
        compptr = cinfo->cur_comp_info[ci];
225
486M
        start_col = MCU_col_num * compptr->MCU_width;
226
1.01G
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
527M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
1.12G
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
597M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
597M
          }
231
527M
        }
232
486M
      }
233
412M
      if (!cinfo->entropy->insufficient_data)
234
176M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
412M
      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
412M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
85.9M
    coef->MCU_ctr = 0;
245
85.9M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
70.4M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
69.8M
    start_iMCU_row(cinfo);
249
69.8M
    return JPEG_ROW_COMPLETED;
250
69.8M
  }
251
  /* Completed the scan */
252
556k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
556k
  return JPEG_SCAN_COMPLETED;
254
70.4M
}
255
256
257
/*
258
 * Decompress and return some data in the multi-pass case.
259
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
260
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
261
 *
262
 * NB: output_buf contains a plane for each component in image.
263
 */
264
265
METHODDEF(int)
266
decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
267
1.49M
{
268
1.49M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
1.49M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
1.49M
  JDIMENSION block_num;
271
1.49M
  int ci, block_row, block_rows;
272
1.49M
  JBLOCKARRAY buffer;
273
1.49M
  JBLOCKROW buffer_ptr;
274
1.49M
  _JSAMPARRAY output_ptr;
275
1.49M
  JDIMENSION output_col;
276
1.49M
  jpeg_component_info *compptr;
277
1.49M
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
1.49M
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
1.49M
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
1.49M
          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
5.96M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
4.47M
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
4.47M
    if (!compptr->component_needed)
292
475k
      continue;
293
    /* Align the virtual buffer for this component. */
294
4.00M
    buffer = (*cinfo->mem->access_virt_barray)
295
4.00M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
4.00M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
4.00M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
4.00M
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
3.96M
      block_rows = compptr->v_samp_factor;
301
33.8k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
33.8k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
33.8k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
33.8k
    }
306
4.00M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
4.00M
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
9.77M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
5.77M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
5.77M
      output_col = 0;
312
5.77M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
30.8M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
25.1M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
25.1M
                        output_col);
316
25.1M
        buffer_ptr++;
317
25.1M
        output_col += compptr->_DCT_scaled_size;
318
25.1M
      }
319
5.77M
      output_ptr += compptr->_DCT_scaled_size;
320
5.77M
    }
321
4.00M
  }
322
323
1.49M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
1.47M
    return JPEG_ROW_COMPLETED;
325
12.6k
  return JPEG_SCAN_COMPLETED;
326
1.49M
}
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
10.4M
#define Q01_POS  1
342
10.4M
#define Q10_POS  8
343
10.4M
#define Q20_POS  16
344
10.4M
#define Q11_POS  9
345
10.4M
#define Q02_POS  2
346
7.38M
#define Q03_POS  3
347
7.38M
#define Q12_POS  10
348
7.38M
#define Q21_POS  17
349
7.38M
#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
30.6k
{
362
30.6k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
30.6k
  boolean smoothing_useful = FALSE;
364
30.6k
  int ci, coefi;
365
30.6k
  jpeg_component_info *compptr;
366
30.6k
  JQUANT_TBL *qtable;
367
30.6k
  int *coef_bits, *prev_coef_bits;
368
30.6k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
30.6k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
1.09k
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
29.5k
  if (coef->coef_bits_latch == NULL)
375
29.5k
    coef->coef_bits_latch = (int *)
376
29.5k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
29.5k
                                  cinfo->num_components * 2 *
378
29.5k
                                  (SAVED_COEFS * sizeof(int)));
379
29.5k
  coef_bits_latch = coef->coef_bits_latch;
380
29.5k
  prev_coef_bits_latch =
381
29.5k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
87.9k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
69.8k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
69.8k
    if ((qtable = compptr->quant_table) == NULL)
387
2.41k
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
67.4k
    if (qtable->quantval[0] == 0 ||
390
67.4k
        qtable->quantval[Q01_POS] == 0 ||
391
67.4k
        qtable->quantval[Q10_POS] == 0 ||
392
67.4k
        qtable->quantval[Q20_POS] == 0 ||
393
67.4k
        qtable->quantval[Q11_POS] == 0 ||
394
67.4k
        qtable->quantval[Q02_POS] == 0 ||
395
67.4k
        qtable->quantval[Q03_POS] == 0 ||
396
67.4k
        qtable->quantval[Q12_POS] == 0 ||
397
67.4k
        qtable->quantval[Q21_POS] == 0 ||
398
67.4k
        qtable->quantval[Q30_POS] == 0)
399
9.01k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
58.4k
    coef_bits = cinfo->coef_bits[ci];
402
58.4k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
58.4k
    if (coef_bits[0] < 0)
404
131
      return FALSE;
405
58.3k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
583k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
524k
      if (cinfo->input_scan_number > 1)
409
308k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
216k
      else
411
216k
        prev_coef_bits_latch[coefi] = -1;
412
524k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
524k
      if (coef_bits[coefi] != 0)
414
511k
        smoothing_useful = TRUE;
415
524k
    }
416
58.3k
    coef_bits_latch += SAVED_COEFS;
417
58.3k
    prev_coef_bits_latch += SAVED_COEFS;
418
58.3k
  }
419
420
18.0k
  return smoothing_useful;
421
29.5k
}
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
3.87M
{
431
3.87M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
3.87M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
3.87M
  JDIMENSION block_num, last_block_column;
434
3.87M
  int ci, block_row, block_rows, access_rows;
435
3.87M
  JBLOCKARRAY buffer;
436
3.87M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
437
3.87M
  JBLOCKROW next_block_row, next_next_block_row;
438
3.87M
  _JSAMPARRAY output_ptr;
439
3.87M
  JDIMENSION output_col;
440
3.87M
  jpeg_component_info *compptr;
441
3.87M
  _inverse_DCT_method_ptr inverse_DCT;
442
3.87M
  boolean change_dc;
443
3.87M
  JCOEF *workspace;
444
3.87M
  int *coef_bits;
445
3.87M
  JQUANT_TBL *quanttbl;
446
3.87M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
447
3.87M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
448
3.87M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
449
3.87M
      DC25;
450
3.87M
  int Al, pred;
451
452
  /* Keep a local variable to avoid looking it up more than once */
453
3.87M
  workspace = coef->workspace;
454
455
  /* Force some input to be done if we are getting ahead of the input. */
456
3.87M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
457
3.87M
         !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
15.2M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
474
11.3M
       ci++, compptr++) {
475
    /* Don't bother to IDCT an uninteresting component. */
476
11.3M
    if (!compptr->component_needed)
477
988k
      continue;
478
    /* Count non-dummy DCT block rows in this iMCU row. */
479
10.4M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
480
10.3M
      block_rows = compptr->v_samp_factor;
481
10.3M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
482
10.3M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
483
34.4k
      block_rows = compptr->v_samp_factor;
484
34.4k
      access_rows = block_rows * 2; /* this and next iMCU row */
485
48.7k
    } else {
486
      /* NB: can't use last_row_height here; it is input-side-dependent! */
487
48.7k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
488
48.7k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
489
48.7k
      access_rows = block_rows; /* this iMCU row only */
490
48.7k
    }
491
    /* Align the virtual buffer for this component. */
492
10.4M
    if (cinfo->output_iMCU_row > 1) {
493
10.3M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
494
10.3M
      buffer = (*cinfo->mem->access_virt_barray)
495
10.3M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
496
10.3M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
497
10.3M
         (JDIMENSION)access_rows, FALSE);
498
10.3M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
499
10.3M
    } else if (cinfo->output_iMCU_row > 0) {
500
34.4k
      buffer = (*cinfo->mem->access_virt_barray)
501
34.4k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
502
34.4k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
503
34.4k
         (JDIMENSION)access_rows, FALSE);
504
34.4k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
505
48.7k
    } else {
506
48.7k
      buffer = (*cinfo->mem->access_virt_barray)
507
48.7k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
508
48.7k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
509
48.7k
    }
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
10.4M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
515
3.66M
      coef_bits =
516
3.66M
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
517
6.73M
    else
518
6.73M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
519
520
    /* We only do DC interpolation if no AC coefficient data is available. */
521
10.4M
    change_dc =
522
10.4M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
523
10.4M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
524
10.4M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
525
526
10.4M
    quanttbl = compptr->quant_table;
527
10.4M
    Q00 = quanttbl->quantval[0];
528
10.4M
    Q01 = quanttbl->quantval[Q01_POS];
529
10.4M
    Q10 = quanttbl->quantval[Q10_POS];
530
10.4M
    Q20 = quanttbl->quantval[Q20_POS];
531
10.4M
    Q11 = quanttbl->quantval[Q11_POS];
532
10.4M
    Q02 = quanttbl->quantval[Q02_POS];
533
10.4M
    if (change_dc) {
534
7.32M
      Q03 = quanttbl->quantval[Q03_POS];
535
7.32M
      Q12 = quanttbl->quantval[Q12_POS];
536
7.32M
      Q21 = quanttbl->quantval[Q21_POS];
537
7.32M
      Q30 = quanttbl->quantval[Q30_POS];
538
7.32M
    }
539
10.4M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
540
10.4M
    output_ptr = output_buf[ci];
541
    /* Loop over all DCT blocks to be processed. */
542
25.5M
    for (block_row = 0; block_row < block_rows; block_row++) {
543
15.1M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
544
545
15.1M
      if (block_row > 0 || cinfo->output_iMCU_row > 0)
546
15.0M
        prev_block_row =
547
15.0M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
548
48.7k
      else
549
48.7k
        prev_block_row = buffer_ptr;
550
551
15.1M
      if (block_row > 1 || cinfo->output_iMCU_row > 1)
552
15.0M
        prev_prev_block_row =
553
15.0M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
554
107k
      else
555
107k
        prev_prev_block_row = prev_block_row;
556
557
15.1M
      if (block_row < block_rows - 1 || cinfo->output_iMCU_row < last_iMCU_row)
558
15.0M
        next_block_row =
559
15.0M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
560
48.7k
      else
561
48.7k
        next_block_row = buffer_ptr;
562
563
15.1M
      if (block_row < block_rows - 2 ||
564
15.1M
          cinfo->output_iMCU_row + 1 < last_iMCU_row)
565
15.0M
        next_next_block_row =
566
15.0M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
567
104k
      else
568
104k
        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
15.1M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
574
15.1M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
575
15.1M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
576
15.1M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
577
15.1M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
578
15.1M
      output_col = 0;
579
15.1M
      last_block_column = compptr->width_in_blocks - 1;
580
15.1M
      for (block_num = cinfo->master->first_MCU_col[ci];
581
59.7M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
582
        /* Fetch current DCT block into workspace so we can modify it. */
583
44.5M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
584
        /* Update DC values */
585
44.5M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
586
44.5M
            block_num < last_block_column) {
587
6.84M
          DC04 = (int)prev_prev_block_row[1][0];
588
6.84M
          DC09 = (int)prev_block_row[1][0];
589
6.84M
          DC14 = (int)buffer_ptr[1][0];
590
6.84M
          DC19 = (int)next_block_row[1][0];
591
6.84M
          DC24 = (int)next_next_block_row[1][0];
592
6.84M
        }
593
44.5M
        if (block_num + 1 < last_block_column) {
594
22.6M
          DC05 = (int)prev_prev_block_row[2][0];
595
22.6M
          DC10 = (int)prev_block_row[2][0];
596
22.6M
          DC15 = (int)buffer_ptr[2][0];
597
22.6M
          DC20 = (int)next_block_row[2][0];
598
22.6M
          DC25 = (int)next_next_block_row[2][0];
599
22.6M
        }
600
        /* If DC interpolation is enabled, compute coefficient estimates using
601
         * a Gaussian-like kernel, keeping the averages of the DC values.
602
         *
603
         * If DC interpolation is disabled, compute coefficient estimates using
604
         * an algorithm similar to the one described in Section K.8 of the JPEG
605
         * standard, except applied to a 5x5 window rather than a 3x3 window.
606
         *
607
         * An estimate is applied only if the coefficient is still zero and is
608
         * not known to be fully accurate.
609
         */
610
        /* AC01 */
611
44.5M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
612
38.2M
          num = Q00 * (change_dc ?
613
31.1M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
614
31.1M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
615
31.1M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
616
31.1M
                 DC21 - DC22 + DC24 + DC25) :
617
38.2M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
618
38.2M
          if (num >= 0) {
619
31.3M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
620
31.3M
            if (Al > 0 && pred >= (1 << Al))
621
168k
              pred = (1 << Al) - 1;
622
31.3M
          } else {
623
6.94M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
624
6.94M
            if (Al > 0 && pred >= (1 << Al))
625
48.9k
              pred = (1 << Al) - 1;
626
6.94M
            pred = -pred;
627
6.94M
          }
628
38.2M
          workspace[1] = (JCOEF)pred;
629
38.2M
        }
630
        /* AC10 */
631
44.5M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
632
38.1M
          num = Q00 * (change_dc ?
633
31.1M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
634
31.1M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
635
31.1M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
636
31.1M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
637
38.1M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
638
38.1M
          if (num >= 0) {
639
30.3M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
640
30.3M
            if (Al > 0 && pred >= (1 << Al))
641
372k
              pred = (1 << Al) - 1;
642
30.3M
          } else {
643
7.74M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
644
7.74M
            if (Al > 0 && pred >= (1 << Al))
645
236k
              pred = (1 << Al) - 1;
646
7.74M
            pred = -pred;
647
7.74M
          }
648
38.1M
          workspace[8] = (JCOEF)pred;
649
38.1M
        }
650
        /* AC20 */
651
44.5M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
652
38.0M
          num = Q00 * (change_dc ?
653
31.1M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
654
31.1M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
655
38.0M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
656
38.0M
          if (num >= 0) {
657
27.2M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
658
27.2M
            if (Al > 0 && pred >= (1 << Al))
659
191k
              pred = (1 << Al) - 1;
660
27.2M
          } else {
661
10.7M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
662
10.7M
            if (Al > 0 && pred >= (1 << Al))
663
205k
              pred = (1 << Al) - 1;
664
10.7M
            pred = -pred;
665
10.7M
          }
666
38.0M
          workspace[16] = (JCOEF)pred;
667
38.0M
        }
668
        /* AC11 */
669
44.5M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
670
37.7M
          num = Q00 * (change_dc ?
671
31.1M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
672
31.1M
                 9 * DC19 + DC21 - DC25) :
673
37.7M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
674
6.55M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
675
37.7M
          if (num >= 0) {
676
32.6M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
677
32.6M
            if (Al > 0 && pred >= (1 << Al))
678
84.3k
              pred = (1 << Al) - 1;
679
32.6M
          } else {
680
5.06M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
681
5.06M
            if (Al > 0 && pred >= (1 << Al))
682
99.1k
              pred = (1 << Al) - 1;
683
5.06M
            pred = -pred;
684
5.06M
          }
685
37.7M
          workspace[9] = (JCOEF)pred;
686
37.7M
        }
687
        /* AC02 */
688
44.5M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
689
37.6M
          num = Q00 * (change_dc ?
690
31.1M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
691
31.1M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
692
37.6M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
693
37.6M
          if (num >= 0) {
694
26.8M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
695
26.8M
            if (Al > 0 && pred >= (1 << Al))
696
220k
              pred = (1 << Al) - 1;
697
26.8M
          } else {
698
10.8M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
699
10.8M
            if (Al > 0 && pred >= (1 << Al))
700
235k
              pred = (1 << Al) - 1;
701
10.8M
            pred = -pred;
702
10.8M
          }
703
37.6M
          workspace[2] = (JCOEF)pred;
704
37.6M
        }
705
44.5M
        if (change_dc) {
706
          /* AC03 */
707
31.2M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
708
31.1M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
709
31.1M
            if (num >= 0) {
710
26.6M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
711
26.6M
              if (Al > 0 && pred >= (1 << Al))
712
0
                pred = (1 << Al) - 1;
713
26.6M
            } else {
714
4.53M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
715
4.53M
              if (Al > 0 && pred >= (1 << Al))
716
0
                pred = (1 << Al) - 1;
717
4.53M
              pred = -pred;
718
4.53M
            }
719
31.1M
            workspace[3] = (JCOEF)pred;
720
31.1M
          }
721
          /* AC12 */
722
31.2M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
723
31.1M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
724
31.1M
            if (num >= 0) {
725
21.1M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
726
21.1M
              if (Al > 0 && pred >= (1 << Al))
727
0
                pred = (1 << Al) - 1;
728
21.1M
            } else {
729
10.0M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
730
10.0M
              if (Al > 0 && pred >= (1 << Al))
731
0
                pred = (1 << Al) - 1;
732
10.0M
              pred = -pred;
733
10.0M
            }
734
31.1M
            workspace[10] = (JCOEF)pred;
735
31.1M
          }
736
          /* AC21 */
737
31.2M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
738
31.1M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
739
31.1M
            if (num >= 0) {
740
23.4M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
741
23.4M
              if (Al > 0 && pred >= (1 << Al))
742
0
                pred = (1 << Al) - 1;
743
23.4M
            } else {
744
7.75M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
745
7.75M
              if (Al > 0 && pred >= (1 << Al))
746
0
                pred = (1 << Al) - 1;
747
7.75M
              pred = -pred;
748
7.75M
            }
749
31.1M
            workspace[17] = (JCOEF)pred;
750
31.1M
          }
751
          /* AC30 */
752
31.2M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
753
31.1M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
754
31.1M
            if (num >= 0) {
755
25.7M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
756
25.7M
              if (Al > 0 && pred >= (1 << Al))
757
0
                pred = (1 << Al) - 1;
758
25.7M
            } else {
759
5.40M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
760
5.40M
              if (Al > 0 && pred >= (1 << Al))
761
0
                pred = (1 << Al) - 1;
762
5.40M
              pred = -pred;
763
5.40M
            }
764
31.1M
            workspace[24] = (JCOEF)pred;
765
31.1M
          }
766
          /* coef_bits[0] is non-negative.  Otherwise this function would not
767
           * be called.
768
           */
769
31.2M
          num = Q00 *
770
31.2M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
771
31.2M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
772
31.2M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
773
31.2M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
774
31.2M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
775
31.2M
          if (num >= 0) {
776
17.1M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
777
17.1M
          } else {
778
14.0M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
779
14.0M
            pred = -pred;
780
14.0M
          }
781
31.2M
          workspace[0] = (JCOEF)pred;
782
31.2M
        }  /* change_dc */
783
784
        /* OK, do the IDCT */
785
44.5M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
786
44.5M
                        output_col);
787
        /* Advance for next column */
788
44.5M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
789
44.5M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
790
44.5M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
791
44.5M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
792
44.5M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
793
44.5M
        buffer_ptr++, prev_block_row++, next_block_row++,
794
44.5M
          prev_prev_block_row++, next_next_block_row++;
795
44.5M
        output_col += compptr->_DCT_scaled_size;
796
44.5M
      }
797
15.1M
      output_ptr += compptr->_DCT_scaled_size;
798
15.1M
    }
799
10.4M
  }
800
801
3.87M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
802
3.85M
    return JPEG_ROW_COMPLETED;
803
18.0k
  return JPEG_SCAN_COMPLETED;
804
3.87M
}
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
88.1k
{
816
88.1k
  my_coef_ptr coef;
817
818
88.1k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
88.1k
  coef = (my_coef_ptr)
822
88.1k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
88.1k
                                sizeof(my_coef_controller));
824
88.1k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
88.1k
  coef->pub.start_input_pass = start_input_pass;
826
88.1k
  coef->pub.start_output_pass = start_output_pass;
827
88.1k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
88.1k
  coef->coef_bits_latch = NULL;
829
88.1k
#endif
830
831
  /* Create the coefficient buffer. */
832
88.1k
  if (need_full_buffer) {
833
49.4k
#ifdef D_MULTISCAN_FILES_SUPPORTED
834
    /* Allocate a full-image virtual array for each component, */
835
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
836
    /* Note we ask for a pre-zeroed array. */
837
49.4k
    int ci, access_rows;
838
49.4k
    jpeg_component_info *compptr;
839
840
196k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
147k
         ci++, compptr++) {
842
147k
      access_rows = compptr->v_samp_factor;
843
147k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
147k
      if (cinfo->progressive_mode)
846
132k
        access_rows *= 5;
847
147k
#endif
848
147k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
147k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
147k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
147k
                               (long)compptr->h_samp_factor),
852
147k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
147k
                               (long)compptr->v_samp_factor),
854
147k
         (JDIMENSION)access_rows);
855
147k
    }
856
49.4k
    coef->pub.consume_data = consume_data;
857
49.4k
    coef->pub._decompress_data = decompress_data;
858
49.4k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
49.4k
  } else {
863
    /* We only need a single-MCU buffer. */
864
38.7k
    JBLOCKROW buffer;
865
38.7k
    int i;
866
867
38.7k
    buffer = (JBLOCKROW)
868
38.7k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
38.7k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
425k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
387k
      coef->MCU_buffer[i] = buffer + i;
872
387k
    }
873
38.7k
    coef->pub.consume_data = dummy_consume_data;
874
38.7k
    coef->pub._decompress_data = decompress_onepass;
875
38.7k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
38.7k
  }
877
878
  /* Allocate the workspace buffer */
879
88.1k
  coef->workspace = (JCOEF *)
880
88.1k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
88.1k
                                sizeof(JCOEF) * DCTSIZE2);
882
88.1k
}
j12init_d_coef_controller
Line
Count
Source
815
39.6k
{
816
39.6k
  my_coef_ptr coef;
817
818
39.6k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
39.6k
  coef = (my_coef_ptr)
822
39.6k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
39.6k
                                sizeof(my_coef_controller));
824
39.6k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
39.6k
  coef->pub.start_input_pass = start_input_pass;
826
39.6k
  coef->pub.start_output_pass = start_output_pass;
827
39.6k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
39.6k
  coef->coef_bits_latch = NULL;
829
39.6k
#endif
830
831
  /* Create the coefficient buffer. */
832
39.6k
  if (need_full_buffer) {
833
20.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
20.5k
    int ci, access_rows;
838
20.5k
    jpeg_component_info *compptr;
839
840
81.8k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
61.2k
         ci++, compptr++) {
842
61.2k
      access_rows = compptr->v_samp_factor;
843
61.2k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
61.2k
      if (cinfo->progressive_mode)
846
57.0k
        access_rows *= 5;
847
61.2k
#endif
848
61.2k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
61.2k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
61.2k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
61.2k
                               (long)compptr->h_samp_factor),
852
61.2k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
61.2k
                               (long)compptr->v_samp_factor),
854
61.2k
         (JDIMENSION)access_rows);
855
61.2k
    }
856
20.5k
    coef->pub.consume_data = consume_data;
857
20.5k
    coef->pub._decompress_data = decompress_data;
858
20.5k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
20.5k
  } else {
863
    /* We only need a single-MCU buffer. */
864
19.0k
    JBLOCKROW buffer;
865
19.0k
    int i;
866
867
19.0k
    buffer = (JBLOCKROW)
868
19.0k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
19.0k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
209k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
190k
      coef->MCU_buffer[i] = buffer + i;
872
190k
    }
873
19.0k
    coef->pub.consume_data = dummy_consume_data;
874
19.0k
    coef->pub._decompress_data = decompress_onepass;
875
19.0k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
19.0k
  }
877
878
  /* Allocate the workspace buffer */
879
39.6k
  coef->workspace = (JCOEF *)
880
39.6k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
39.6k
                                sizeof(JCOEF) * DCTSIZE2);
882
39.6k
}
jinit_d_coef_controller
Line
Count
Source
815
48.4k
{
816
48.4k
  my_coef_ptr coef;
817
818
48.4k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
48.4k
  coef = (my_coef_ptr)
822
48.4k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
48.4k
                                sizeof(my_coef_controller));
824
48.4k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
48.4k
  coef->pub.start_input_pass = start_input_pass;
826
48.4k
  coef->pub.start_output_pass = start_output_pass;
827
48.4k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
48.4k
  coef->coef_bits_latch = NULL;
829
48.4k
#endif
830
831
  /* Create the coefficient buffer. */
832
48.4k
  if (need_full_buffer) {
833
28.8k
#ifdef D_MULTISCAN_FILES_SUPPORTED
834
    /* Allocate a full-image virtual array for each component, */
835
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
836
    /* Note we ask for a pre-zeroed array. */
837
28.8k
    int ci, access_rows;
838
28.8k
    jpeg_component_info *compptr;
839
840
114k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
86.1k
         ci++, compptr++) {
842
86.1k
      access_rows = compptr->v_samp_factor;
843
86.1k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
86.1k
      if (cinfo->progressive_mode)
846
75.4k
        access_rows *= 5;
847
86.1k
#endif
848
86.1k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
86.1k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
86.1k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
86.1k
                               (long)compptr->h_samp_factor),
852
86.1k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
86.1k
                               (long)compptr->v_samp_factor),
854
86.1k
         (JDIMENSION)access_rows);
855
86.1k
    }
856
28.8k
    coef->pub.consume_data = consume_data;
857
28.8k
    coef->pub._decompress_data = decompress_data;
858
28.8k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
28.8k
  } else {
863
    /* We only need a single-MCU buffer. */
864
19.6k
    JBLOCKROW buffer;
865
19.6k
    int i;
866
867
19.6k
    buffer = (JBLOCKROW)
868
19.6k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
19.6k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
216k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
196k
      coef->MCU_buffer[i] = buffer + i;
872
196k
    }
873
19.6k
    coef->pub.consume_data = dummy_consume_data;
874
19.6k
    coef->pub._decompress_data = decompress_onepass;
875
19.6k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
19.6k
  }
877
878
  /* Allocate the workspace buffer */
879
48.4k
  coef->workspace = (JCOEF *)
880
48.4k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
48.4k
                                sizeof(JCOEF) * DCTSIZE2);
882
48.4k
}