Coverage Report

Created: 2023-12-14 14:06

/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
829k
{
48
829k
  cinfo->input_iMCU_row = 0;
49
829k
  start_iMCU_row(cinfo);
50
829k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
81.4k
{
60
81.4k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
81.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
81.4k
  if (coef->pub.coef_arrays != NULL) {
65
37.1k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
23.4k
      coef->pub._decompress_data = decompress_smooth_data;
67
13.6k
    else
68
13.6k
      coef->pub._decompress_data = decompress_data;
69
37.1k
  }
70
81.4k
#endif
71
81.4k
  cinfo->output_iMCU_row = 0;
72
81.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
2.11M
{
88
2.11M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
2.11M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
2.11M
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
2.11M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
2.11M
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
2.11M
  _JSAMPARRAY output_ptr;
94
2.11M
  JDIMENSION start_col, output_col;
95
2.11M
  jpeg_component_info *compptr;
96
2.11M
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
5.28M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
3.17M
       yoffset++) {
101
21.3M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
18.1M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
18.1M
      jzero_far((void *)coef->MCU_buffer[0],
105
18.1M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
18.1M
      if (!cinfo->entropy->insufficient_data)
107
9.83M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
18.1M
      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
18.1M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
18.1M
          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
18.1M
        blkn = 0;               /* index of current DCT block within MCU */
126
50.1M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
32.0M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
32.0M
          if (!compptr->component_needed) {
130
1.20M
            blkn += compptr->MCU_blocks;
131
1.20M
            continue;
132
1.20M
          }
133
30.8M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
30.8M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
25.4M
                         compptr->MCU_width : compptr->last_col_width;
136
30.8M
          output_ptr = output_buf[compptr->component_index] +
137
30.8M
                       yoffset * compptr->_DCT_scaled_size;
138
30.8M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
30.8M
                      compptr->MCU_sample_width;
140
69.5M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
38.7M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
38.7M
                yoffset + yindex < compptr->last_row_height) {
143
37.5M
              output_col = start_col;
144
91.5M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
54.0M
                (*inverse_DCT) (cinfo, compptr,
146
54.0M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
54.0M
                                output_ptr, output_col);
148
54.0M
                output_col += compptr->_DCT_scaled_size;
149
54.0M
              }
150
37.5M
            }
151
38.7M
            blkn += compptr->MCU_width;
152
38.7M
            output_ptr += compptr->_DCT_scaled_size;
153
38.7M
          }
154
30.8M
        }
155
18.1M
      }
156
18.1M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
3.17M
    coef->MCU_ctr = 0;
159
3.17M
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
2.11M
  cinfo->output_iMCU_row++;
162
2.11M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
2.06M
    start_iMCU_row(cinfo);
164
2.06M
    return JPEG_ROW_COMPLETED;
165
2.06M
  }
166
  /* Completed the scan */
167
44.3k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
44.3k
  return JPEG_SCAN_COMPLETED;
169
2.11M
}
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
106M
{
195
106M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
106M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
106M
  int blkn, ci, xindex, yindex, yoffset;
198
106M
  JDIMENSION start_col;
199
106M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
106M
  JBLOCKROW buffer_ptr;
201
106M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
252M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
146M
    compptr = cinfo->cur_comp_info[ci];
206
146M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
146M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
146M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
146M
       (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
146M
  }
215
216
  /* Loop to process one whole iMCU row */
217
225M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
119M
       yoffset++) {
219
569M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
449M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
449M
      blkn = 0;                 /* index of current DCT block within MCU */
223
1.03G
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
588M
        compptr = cinfo->cur_comp_info[ci];
225
588M
        start_col = MCU_col_num * compptr->MCU_width;
226
1.23G
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
650M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
1.42G
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
777M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
777M
          }
231
650M
        }
232
588M
      }
233
449M
      if (!cinfo->entropy->insufficient_data)
234
220M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
449M
      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
449M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
119M
    coef->MCU_ctr = 0;
245
119M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
106M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
105M
    start_iMCU_row(cinfo);
249
105M
    return JPEG_ROW_COMPLETED;
250
105M
  }
251
  /* Completed the scan */
252
785k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
785k
  return JPEG_SCAN_COMPLETED;
254
106M
}
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.69M
{
268
1.69M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
1.69M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
1.69M
  JDIMENSION block_num;
271
1.69M
  int ci, block_row, block_rows;
272
1.69M
  JBLOCKARRAY buffer;
273
1.69M
  JBLOCKROW buffer_ptr;
274
1.69M
  _JSAMPARRAY output_ptr;
275
1.69M
  JDIMENSION output_col;
276
1.69M
  jpeg_component_info *compptr;
277
1.69M
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
1.69M
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
1.69M
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
1.69M
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
283
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
284
0
      return JPEG_SUSPENDED;
285
0
  }
286
287
  /* OK, output from the virtual arrays. */
288
6.73M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
5.03M
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
5.03M
    if (!compptr->component_needed)
292
619k
      continue;
293
    /* Align the virtual buffer for this component. */
294
4.41M
    buffer = (*cinfo->mem->access_virt_barray)
295
4.41M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
4.41M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
4.41M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
4.41M
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
4.38M
      block_rows = compptr->v_samp_factor;
301
35.5k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
35.5k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
35.5k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
35.5k
    }
306
4.41M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
4.41M
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
10.6M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
6.26M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
6.26M
      output_col = 0;
312
6.26M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
37.6M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
31.4M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
31.4M
                        output_col);
316
31.4M
        buffer_ptr++;
317
31.4M
        output_col += compptr->_DCT_scaled_size;
318
31.4M
      }
319
6.26M
      output_ptr += compptr->_DCT_scaled_size;
320
6.26M
    }
321
4.41M
  }
322
323
1.69M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
1.68M
    return JPEG_ROW_COMPLETED;
325
13.6k
  return JPEG_SCAN_COMPLETED;
326
1.69M
}
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
13.0M
#define Q01_POS  1
342
13.0M
#define Q10_POS  8
343
13.0M
#define Q20_POS  16
344
13.0M
#define Q11_POS  9
345
13.0M
#define Q02_POS  2
346
9.39M
#define Q03_POS  3
347
9.39M
#define Q12_POS  10
348
9.39M
#define Q21_POS  17
349
9.39M
#define Q30_POS  24
350
351
/*
352
 * Determine whether block smoothing is applicable and safe.
353
 * We also latch the current states of the coef_bits[] entries for the
354
 * AC coefficients; otherwise, if the input side of the decompressor
355
 * advances into a new scan, we might think the coefficients are known
356
 * more accurately than they really are.
357
 */
358
359
LOCAL(boolean)
360
smoothing_ok(j_decompress_ptr cinfo)
361
37.1k
{
362
37.1k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
37.1k
  boolean smoothing_useful = FALSE;
364
37.1k
  int ci, coefi;
365
37.1k
  jpeg_component_info *compptr;
366
37.1k
  JQUANT_TBL *qtable;
367
37.1k
  int *coef_bits, *prev_coef_bits;
368
37.1k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
37.1k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
1.31k
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
35.8k
  if (coef->coef_bits_latch == NULL)
375
35.8k
    coef->coef_bits_latch = (int *)
376
35.8k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
35.8k
                                  cinfo->num_components * 2 *
378
35.8k
                                  (SAVED_COEFS * sizeof(int)));
379
35.8k
  coef_bits_latch = coef->coef_bits_latch;
380
35.8k
  prev_coef_bits_latch =
381
35.8k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
110k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
86.8k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
86.8k
    if ((qtable = compptr->quant_table) == NULL)
387
1.75k
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
85.1k
    if (qtable->quantval[0] == 0 ||
390
85.1k
        qtable->quantval[Q01_POS] == 0 ||
391
85.1k
        qtable->quantval[Q10_POS] == 0 ||
392
85.1k
        qtable->quantval[Q20_POS] == 0 ||
393
85.1k
        qtable->quantval[Q11_POS] == 0 ||
394
85.1k
        qtable->quantval[Q02_POS] == 0 ||
395
85.1k
        qtable->quantval[Q03_POS] == 0 ||
396
85.1k
        qtable->quantval[Q12_POS] == 0 ||
397
85.1k
        qtable->quantval[Q21_POS] == 0 ||
398
85.1k
        qtable->quantval[Q30_POS] == 0)
399
10.3k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
74.7k
    coef_bits = cinfo->coef_bits[ci];
402
74.7k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
74.7k
    if (coef_bits[0] < 0)
404
191
      return FALSE;
405
74.5k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
745k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
671k
      if (cinfo->input_scan_number > 1)
409
406k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
264k
      else
411
264k
        prev_coef_bits_latch[coefi] = -1;
412
671k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
671k
      if (coef_bits[coefi] != 0)
414
643k
        smoothing_useful = TRUE;
415
671k
    }
416
74.5k
    coef_bits_latch += SAVED_COEFS;
417
74.5k
    prev_coef_bits_latch += SAVED_COEFS;
418
74.5k
  }
419
420
23.4k
  return smoothing_useful;
421
35.8k
}
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
5.00M
{
431
5.00M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
5.00M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
5.00M
  JDIMENSION block_num, last_block_column;
434
5.00M
  int ci, block_row, block_rows, access_rows;
435
5.00M
  JBLOCKARRAY buffer;
436
5.00M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
437
5.00M
  JBLOCKROW next_block_row, next_next_block_row;
438
5.00M
  _JSAMPARRAY output_ptr;
439
5.00M
  JDIMENSION output_col;
440
5.00M
  jpeg_component_info *compptr;
441
5.00M
  _inverse_DCT_method_ptr inverse_DCT;
442
5.00M
  boolean change_dc;
443
5.00M
  JCOEF *workspace;
444
5.00M
  int *coef_bits;
445
5.00M
  JQUANT_TBL *quanttbl;
446
5.00M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
447
5.00M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
448
5.00M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
449
5.00M
      DC25;
450
5.00M
  int Al, pred;
451
452
  /* Keep a local variable to avoid looking it up more than once */
453
5.00M
  workspace = coef->workspace;
454
455
  /* Force some input to be done if we are getting ahead of the input. */
456
5.00M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
457
5.00M
         !cinfo->inputctl->eoi_reached) {
458
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
459
      /* If input is working on current scan, we ordinarily want it to
460
       * have completed the current row.  But if input scan is DC,
461
       * we want it to keep two rows ahead so that next two block rows' DC
462
       * values are up to date.
463
       */
464
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
465
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
466
0
        break;
467
0
    }
468
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
469
0
      return JPEG_SUSPENDED;
470
0
  }
471
472
  /* OK, output from the virtual arrays. */
473
19.3M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
474
14.3M
       ci++, compptr++) {
475
    /* Don't bother to IDCT an uninteresting component. */
476
14.3M
    if (!compptr->component_needed)
477
1.42M
      continue;
478
    /* Count non-dummy DCT block rows in this iMCU row. */
479
12.9M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
480
12.8M
      block_rows = compptr->v_samp_factor;
481
12.8M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
482
12.8M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
483
44.9k
      block_rows = compptr->v_samp_factor;
484
44.9k
      access_rows = block_rows * 2; /* this and next iMCU row */
485
61.9k
    } else {
486
      /* NB: can't use last_row_height here; it is input-side-dependent! */
487
61.9k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
488
61.9k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
489
61.9k
      access_rows = block_rows; /* this iMCU row only */
490
61.9k
    }
491
    /* Align the virtual buffer for this component. */
492
12.9M
    if (cinfo->output_iMCU_row > 1) {
493
12.8M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
494
12.8M
      buffer = (*cinfo->mem->access_virt_barray)
495
12.8M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
496
12.8M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
497
12.8M
         (JDIMENSION)access_rows, FALSE);
498
12.8M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
499
12.8M
    } else if (cinfo->output_iMCU_row > 0) {
500
44.9k
      buffer = (*cinfo->mem->access_virt_barray)
501
44.9k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
502
44.9k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
503
44.9k
         (JDIMENSION)access_rows, FALSE);
504
44.9k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
505
61.9k
    } else {
506
61.9k
      buffer = (*cinfo->mem->access_virt_barray)
507
61.9k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
508
61.9k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
509
61.9k
    }
510
    /* Fetch component-dependent info.
511
     * If the current scan is incomplete, then we use the component-dependent
512
     * info from the previous scan.
513
     */
514
12.9M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
515
3.65M
      coef_bits =
516
3.65M
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
517
9.27M
    else
518
9.27M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
519
520
    /* We only do DC interpolation if no AC coefficient data is available. */
521
12.9M
    change_dc =
522
12.9M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
523
12.9M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
524
12.9M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
525
526
12.9M
    quanttbl = compptr->quant_table;
527
12.9M
    Q00 = quanttbl->quantval[0];
528
12.9M
    Q01 = quanttbl->quantval[Q01_POS];
529
12.9M
    Q10 = quanttbl->quantval[Q10_POS];
530
12.9M
    Q20 = quanttbl->quantval[Q20_POS];
531
12.9M
    Q11 = quanttbl->quantval[Q11_POS];
532
12.9M
    Q02 = quanttbl->quantval[Q02_POS];
533
12.9M
    if (change_dc) {
534
9.31M
      Q03 = quanttbl->quantval[Q03_POS];
535
9.31M
      Q12 = quanttbl->quantval[Q12_POS];
536
9.31M
      Q21 = quanttbl->quantval[Q21_POS];
537
9.31M
      Q30 = quanttbl->quantval[Q30_POS];
538
9.31M
    }
539
12.9M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
540
12.9M
    output_ptr = output_buf[ci];
541
    /* Loop over all DCT blocks to be processed. */
542
31.0M
    for (block_row = 0; block_row < block_rows; block_row++) {
543
18.1M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
544
545
18.1M
      if (block_row > 0 || cinfo->output_iMCU_row > 0)
546
18.0M
        prev_block_row =
547
18.0M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
548
61.9k
      else
549
61.9k
        prev_block_row = buffer_ptr;
550
551
18.1M
      if (block_row > 1 || cinfo->output_iMCU_row > 1)
552
18.0M
        prev_prev_block_row =
553
18.0M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
554
134k
      else
555
134k
        prev_prev_block_row = prev_block_row;
556
557
18.1M
      if (block_row < block_rows - 1 || cinfo->output_iMCU_row < last_iMCU_row)
558
18.0M
        next_block_row =
559
18.0M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
560
61.9k
      else
561
61.9k
        next_block_row = buffer_ptr;
562
563
18.1M
      if (block_row < block_rows - 2 ||
564
18.1M
          cinfo->output_iMCU_row + 1 < last_iMCU_row)
565
18.0M
        next_next_block_row =
566
18.0M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
567
130k
      else
568
130k
        next_next_block_row = next_block_row;
569
570
      /* We fetch the surrounding DC values using a sliding-register approach.
571
       * Initialize all 25 here so as to do the right thing on narrow pics.
572
       */
573
18.1M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
574
18.1M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
575
18.1M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
576
18.1M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
577
18.1M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
578
18.1M
      output_col = 0;
579
18.1M
      last_block_column = compptr->width_in_blocks - 1;
580
18.1M
      for (block_num = cinfo->master->first_MCU_col[ci];
581
72.6M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
582
        /* Fetch current DCT block into workspace so we can modify it. */
583
54.4M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
584
        /* Update DC values */
585
54.4M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
586
54.4M
            block_num < last_block_column) {
587
7.48M
          DC04 = (int)prev_prev_block_row[1][0];
588
7.48M
          DC09 = (int)prev_block_row[1][0];
589
7.48M
          DC14 = (int)buffer_ptr[1][0];
590
7.48M
          DC19 = (int)next_block_row[1][0];
591
7.48M
          DC24 = (int)next_next_block_row[1][0];
592
7.48M
        }
593
54.4M
        if (block_num + 1 < last_block_column) {
594
28.8M
          DC05 = (int)prev_prev_block_row[2][0];
595
28.8M
          DC10 = (int)prev_block_row[2][0];
596
28.8M
          DC15 = (int)buffer_ptr[2][0];
597
28.8M
          DC20 = (int)next_block_row[2][0];
598
28.8M
          DC25 = (int)next_next_block_row[2][0];
599
28.8M
        }
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
54.4M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
612
47.5M
          num = Q00 * (change_dc ?
613
40.2M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
614
40.2M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
615
40.2M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
616
40.2M
                 DC21 - DC22 + DC24 + DC25) :
617
47.5M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
618
47.5M
          if (num >= 0) {
619
37.7M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
620
37.7M
            if (Al > 0 && pred >= (1 << Al))
621
54.8k
              pred = (1 << Al) - 1;
622
37.7M
          } else {
623
9.77M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
624
9.77M
            if (Al > 0 && pred >= (1 << Al))
625
21.0k
              pred = (1 << Al) - 1;
626
9.77M
            pred = -pred;
627
9.77M
          }
628
47.5M
          workspace[1] = (JCOEF)pred;
629
47.5M
        }
630
        /* AC10 */
631
54.4M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
632
47.5M
          num = Q00 * (change_dc ?
633
40.1M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
634
40.1M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
635
40.1M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
636
40.1M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
637
47.5M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
638
47.5M
          if (num >= 0) {
639
36.5M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
640
36.5M
            if (Al > 0 && pred >= (1 << Al))
641
445k
              pred = (1 << Al) - 1;
642
36.5M
          } else {
643
11.0M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
644
11.0M
            if (Al > 0 && pred >= (1 << Al))
645
285k
              pred = (1 << Al) - 1;
646
11.0M
            pred = -pred;
647
11.0M
          }
648
47.5M
          workspace[8] = (JCOEF)pred;
649
47.5M
        }
650
        /* AC20 */
651
54.4M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
652
47.4M
          num = Q00 * (change_dc ?
653
40.2M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
654
40.2M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
655
47.4M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
656
47.4M
          if (num >= 0) {
657
33.1M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
658
33.1M
            if (Al > 0 && pred >= (1 << Al))
659
205k
              pred = (1 << Al) - 1;
660
33.1M
          } else {
661
14.2M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
662
14.2M
            if (Al > 0 && pred >= (1 << Al))
663
218k
              pred = (1 << Al) - 1;
664
14.2M
            pred = -pred;
665
14.2M
          }
666
47.4M
          workspace[16] = (JCOEF)pred;
667
47.4M
        }
668
        /* AC11 */
669
54.4M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
670
47.4M
          num = Q00 * (change_dc ?
671
40.2M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
672
40.2M
                 9 * DC19 + DC21 - DC25) :
673
47.4M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
674
7.27M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
675
47.4M
          if (num >= 0) {
676
40.0M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
677
40.0M
            if (Al > 0 && pred >= (1 << Al))
678
21.7k
              pred = (1 << Al) - 1;
679
40.0M
          } else {
680
7.39M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
681
7.39M
            if (Al > 0 && pred >= (1 << Al))
682
23.9k
              pred = (1 << Al) - 1;
683
7.39M
            pred = -pred;
684
7.39M
          }
685
47.4M
          workspace[9] = (JCOEF)pred;
686
47.4M
        }
687
        /* AC02 */
688
54.4M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
689
46.7M
          num = Q00 * (change_dc ?
690
40.2M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
691
40.2M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
692
46.7M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
693
46.7M
          if (num >= 0) {
694
32.7M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
695
32.7M
            if (Al > 0 && pred >= (1 << Al))
696
32.7k
              pred = (1 << Al) - 1;
697
32.7M
          } else {
698
13.9M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
699
13.9M
            if (Al > 0 && pred >= (1 << Al))
700
32.2k
              pred = (1 << Al) - 1;
701
13.9M
            pred = -pred;
702
13.9M
          }
703
46.7M
          workspace[2] = (JCOEF)pred;
704
46.7M
        }
705
54.4M
        if (change_dc) {
706
          /* AC03 */
707
40.2M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
708
40.2M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
709
40.2M
            if (num >= 0) {
710
32.7M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
711
32.7M
              if (Al > 0 && pred >= (1 << Al))
712
0
                pred = (1 << Al) - 1;
713
32.7M
            } else {
714
7.44M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
715
7.44M
              if (Al > 0 && pred >= (1 << Al))
716
0
                pred = (1 << Al) - 1;
717
7.44M
              pred = -pred;
718
7.44M
            }
719
40.2M
            workspace[3] = (JCOEF)pred;
720
40.2M
          }
721
          /* AC12 */
722
40.2M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
723
40.2M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
724
40.2M
            if (num >= 0) {
725
26.0M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
726
26.0M
              if (Al > 0 && pred >= (1 << Al))
727
0
                pred = (1 << Al) - 1;
728
26.0M
            } else {
729
14.1M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
730
14.1M
              if (Al > 0 && pred >= (1 << Al))
731
0
                pred = (1 << Al) - 1;
732
14.1M
              pred = -pred;
733
14.1M
            }
734
40.2M
            workspace[10] = (JCOEF)pred;
735
40.2M
          }
736
          /* AC21 */
737
40.2M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
738
40.1M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
739
40.1M
            if (num >= 0) {
740
29.7M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
741
29.7M
              if (Al > 0 && pred >= (1 << Al))
742
0
                pred = (1 << Al) - 1;
743
29.7M
            } else {
744
10.4M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
745
10.4M
              if (Al > 0 && pred >= (1 << Al))
746
0
                pred = (1 << Al) - 1;
747
10.4M
              pred = -pred;
748
10.4M
            }
749
40.1M
            workspace[17] = (JCOEF)pred;
750
40.1M
          }
751
          /* AC30 */
752
40.2M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
753
40.2M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
754
40.2M
            if (num >= 0) {
755
31.6M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
756
31.6M
              if (Al > 0 && pred >= (1 << Al))
757
0
                pred = (1 << Al) - 1;
758
31.6M
            } else {
759
8.57M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
760
8.57M
              if (Al > 0 && pred >= (1 << Al))
761
0
                pred = (1 << Al) - 1;
762
8.57M
              pred = -pred;
763
8.57M
            }
764
40.2M
            workspace[24] = (JCOEF)pred;
765
40.2M
          }
766
          /* coef_bits[0] is non-negative.  Otherwise this function would not
767
           * be called.
768
           */
769
40.2M
          num = Q00 *
770
40.2M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
771
40.2M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
772
40.2M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
773
40.2M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
774
40.2M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
775
40.2M
          if (num >= 0) {
776
21.7M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
777
21.7M
          } else {
778
18.4M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
779
18.4M
            pred = -pred;
780
18.4M
          }
781
40.2M
          workspace[0] = (JCOEF)pred;
782
40.2M
        }  /* change_dc */
783
784
        /* OK, do the IDCT */
785
54.4M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
786
54.4M
                        output_col);
787
        /* Advance for next column */
788
54.4M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
789
54.4M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
790
54.4M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
791
54.4M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
792
54.4M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
793
54.4M
        buffer_ptr++, prev_block_row++, next_block_row++,
794
54.4M
          prev_prev_block_row++, next_next_block_row++;
795
54.4M
        output_col += compptr->_DCT_scaled_size;
796
54.4M
      }
797
18.1M
      output_ptr += compptr->_DCT_scaled_size;
798
18.1M
    }
799
12.9M
  }
800
801
5.00M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
802
4.98M
    return JPEG_ROW_COMPLETED;
803
23.4k
  return JPEG_SCAN_COMPLETED;
804
5.00M
}
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
104k
{
816
104k
  my_coef_ptr coef;
817
818
104k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
104k
  coef = (my_coef_ptr)
822
104k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
104k
                                sizeof(my_coef_controller));
824
104k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
104k
  coef->pub.start_input_pass = start_input_pass;
826
104k
  coef->pub.start_output_pass = start_output_pass;
827
104k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
104k
  coef->coef_bits_latch = NULL;
829
104k
#endif
830
831
  /* Create the coefficient buffer. */
832
104k
  if (need_full_buffer) {
833
59.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
59.8k
    int ci, access_rows;
838
59.8k
    jpeg_component_info *compptr;
839
840
236k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
176k
         ci++, compptr++) {
842
176k
      access_rows = compptr->v_samp_factor;
843
176k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
176k
      if (cinfo->progressive_mode)
846
158k
        access_rows *= 5;
847
176k
#endif
848
176k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
176k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
176k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
176k
                               (long)compptr->h_samp_factor),
852
176k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
176k
                               (long)compptr->v_samp_factor),
854
176k
         (JDIMENSION)access_rows);
855
176k
    }
856
59.8k
    coef->pub.consume_data = consume_data;
857
59.8k
    coef->pub._decompress_data = decompress_data;
858
59.8k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
59.8k
  } else {
863
    /* We only need a single-MCU buffer. */
864
44.9k
    JBLOCKROW buffer;
865
44.9k
    int i;
866
867
44.9k
    buffer = (JBLOCKROW)
868
44.9k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
44.9k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
494k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
449k
      coef->MCU_buffer[i] = buffer + i;
872
449k
    }
873
44.9k
    coef->pub.consume_data = dummy_consume_data;
874
44.9k
    coef->pub._decompress_data = decompress_onepass;
875
44.9k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
44.9k
  }
877
878
  /* Allocate the workspace buffer */
879
104k
  coef->workspace = (JCOEF *)
880
104k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
104k
                                sizeof(JCOEF) * DCTSIZE2);
882
104k
}
j12init_d_coef_controller
Line
Count
Source
815
48.9k
{
816
48.9k
  my_coef_ptr coef;
817
818
48.9k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
48.9k
  coef = (my_coef_ptr)
822
48.9k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
48.9k
                                sizeof(my_coef_controller));
824
48.9k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
48.9k
  coef->pub.start_input_pass = start_input_pass;
826
48.9k
  coef->pub.start_output_pass = start_output_pass;
827
48.9k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
48.9k
  coef->coef_bits_latch = NULL;
829
48.9k
#endif
830
831
  /* Create the coefficient buffer. */
832
48.9k
  if (need_full_buffer) {
833
26.5k
#ifdef D_MULTISCAN_FILES_SUPPORTED
834
    /* Allocate a full-image virtual array for each component, */
835
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
836
    /* Note we ask for a pre-zeroed array. */
837
26.5k
    int ci, access_rows;
838
26.5k
    jpeg_component_info *compptr;
839
840
105k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
78.4k
         ci++, compptr++) {
842
78.4k
      access_rows = compptr->v_samp_factor;
843
78.4k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
78.4k
      if (cinfo->progressive_mode)
846
75.3k
        access_rows *= 5;
847
78.4k
#endif
848
78.4k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
78.4k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
78.4k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
78.4k
                               (long)compptr->h_samp_factor),
852
78.4k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
78.4k
                               (long)compptr->v_samp_factor),
854
78.4k
         (JDIMENSION)access_rows);
855
78.4k
    }
856
26.5k
    coef->pub.consume_data = consume_data;
857
26.5k
    coef->pub._decompress_data = decompress_data;
858
26.5k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
26.5k
  } else {
863
    /* We only need a single-MCU buffer. */
864
22.4k
    JBLOCKROW buffer;
865
22.4k
    int i;
866
867
22.4k
    buffer = (JBLOCKROW)
868
22.4k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
22.4k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
246k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
224k
      coef->MCU_buffer[i] = buffer + i;
872
224k
    }
873
22.4k
    coef->pub.consume_data = dummy_consume_data;
874
22.4k
    coef->pub._decompress_data = decompress_onepass;
875
22.4k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
22.4k
  }
877
878
  /* Allocate the workspace buffer */
879
48.9k
  coef->workspace = (JCOEF *)
880
48.9k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
48.9k
                                sizeof(JCOEF) * DCTSIZE2);
882
48.9k
}
jinit_d_coef_controller
Line
Count
Source
815
55.8k
{
816
55.8k
  my_coef_ptr coef;
817
818
55.8k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
819
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
820
821
55.8k
  coef = (my_coef_ptr)
822
55.8k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
823
55.8k
                                sizeof(my_coef_controller));
824
55.8k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
825
55.8k
  coef->pub.start_input_pass = start_input_pass;
826
55.8k
  coef->pub.start_output_pass = start_output_pass;
827
55.8k
#ifdef BLOCK_SMOOTHING_SUPPORTED
828
55.8k
  coef->coef_bits_latch = NULL;
829
55.8k
#endif
830
831
  /* Create the coefficient buffer. */
832
55.8k
  if (need_full_buffer) {
833
33.2k
#ifdef D_MULTISCAN_FILES_SUPPORTED
834
    /* Allocate a full-image virtual array for each component, */
835
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
836
    /* Note we ask for a pre-zeroed array. */
837
33.2k
    int ci, access_rows;
838
33.2k
    jpeg_component_info *compptr;
839
840
131k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
841
98.5k
         ci++, compptr++) {
842
98.5k
      access_rows = compptr->v_samp_factor;
843
98.5k
#ifdef BLOCK_SMOOTHING_SUPPORTED
844
      /* If block smoothing could be used, need a bigger window */
845
98.5k
      if (cinfo->progressive_mode)
846
83.5k
        access_rows *= 5;
847
98.5k
#endif
848
98.5k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
849
98.5k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
850
98.5k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
851
98.5k
                               (long)compptr->h_samp_factor),
852
98.5k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
853
98.5k
                               (long)compptr->v_samp_factor),
854
98.5k
         (JDIMENSION)access_rows);
855
98.5k
    }
856
33.2k
    coef->pub.consume_data = consume_data;
857
33.2k
    coef->pub._decompress_data = decompress_data;
858
33.2k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
859
#else
860
    ERREXIT(cinfo, JERR_NOT_COMPILED);
861
#endif
862
33.2k
  } else {
863
    /* We only need a single-MCU buffer. */
864
22.5k
    JBLOCKROW buffer;
865
22.5k
    int i;
866
867
22.5k
    buffer = (JBLOCKROW)
868
22.5k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
869
22.5k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
870
247k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
871
225k
      coef->MCU_buffer[i] = buffer + i;
872
225k
    }
873
22.5k
    coef->pub.consume_data = dummy_consume_data;
874
22.5k
    coef->pub._decompress_data = decompress_onepass;
875
22.5k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
876
22.5k
  }
877
878
  /* Allocate the workspace buffer */
879
55.8k
  coef->workspace = (JCOEF *)
880
55.8k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
881
55.8k
                                sizeof(JCOEF) * DCTSIZE2);
882
55.8k
}