Coverage Report

Created: 2024-05-21 06:30

/src/libjpeg-turbo/jdcoefct.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * jdcoefct.c
3
 *
4
 * This file was part of the Independent JPEG Group's software:
5
 * Copyright (C) 1994-1997, Thomas G. Lane.
6
 * libjpeg-turbo Modifications:
7
 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
8
 * Copyright (C) 2010, 2015-2016, 2019-2020, 2022-2023, D. R. Commander.
9
 * Copyright (C) 2015, 2020, Google, Inc.
10
 * For conditions of distribution and use, see the accompanying README.ijg
11
 * file.
12
 *
13
 * This file contains the coefficient buffer controller for decompression.
14
 * This controller is the top level of the lossy JPEG decompressor proper.
15
 * The coefficient buffer lies between entropy decoding and inverse-DCT steps.
16
 *
17
 * In buffered-image mode, this controller is the interface between
18
 * input-oriented processing and output-oriented processing.
19
 * Also, the input side (only) is used when reading a file for transcoding.
20
 */
21
22
#include "jinclude.h"
23
#include "jdcoefct.h"
24
#include "jpegapicomp.h"
25
#include "jsamplecomp.h"
26
27
28
/* Forward declarations */
29
METHODDEF(int) decompress_onepass(j_decompress_ptr cinfo,
30
                                  _JSAMPIMAGE output_buf);
31
#ifdef D_MULTISCAN_FILES_SUPPORTED
32
METHODDEF(int) decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf);
33
#endif
34
#ifdef BLOCK_SMOOTHING_SUPPORTED
35
LOCAL(boolean) smoothing_ok(j_decompress_ptr cinfo);
36
METHODDEF(int) decompress_smooth_data(j_decompress_ptr cinfo,
37
                                      _JSAMPIMAGE output_buf);
38
#endif
39
40
41
/*
42
 * Initialize for an input processing pass.
43
 */
44
45
METHODDEF(void)
46
start_input_pass(j_decompress_ptr cinfo)
47
72.2k
{
48
72.2k
  cinfo->input_iMCU_row = 0;
49
72.2k
  start_iMCU_row(cinfo);
50
72.2k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
62.7k
{
60
62.7k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
62.7k
  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
62.7k
  if (coef->pub.coef_arrays != NULL) {
65
16.0k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
3.44k
      coef->pub._decompress_data = decompress_smooth_data;
67
12.5k
    else
68
12.5k
      coef->pub._decompress_data = decompress_data;
69
16.0k
  }
70
62.7k
#endif
71
62.7k
  cinfo->output_iMCU_row = 0;
72
62.7k
}
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.86M
{
88
2.86M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
2.86M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
2.86M
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
2.86M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
2.86M
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
2.86M
  _JSAMPARRAY output_ptr;
94
2.86M
  JDIMENSION start_col, output_col;
95
2.86M
  jpeg_component_info *compptr;
96
2.86M
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
5.72M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
2.86M
       yoffset++) {
101
114M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
111M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
111M
      jzero_far((void *)coef->MCU_buffer[0],
105
111M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
111M
      if (!cinfo->entropy->insufficient_data)
107
42.6M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
111M
      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
111M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
111M
          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
111M
        blkn = 0;               /* index of current DCT block within MCU */
126
223M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
112M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
112M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
112M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
112M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
109M
                         compptr->MCU_width : compptr->last_col_width;
136
112M
          output_ptr = output_buf[compptr->component_index] +
137
112M
                       yoffset * compptr->_DCT_scaled_size;
138
112M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
112M
                      compptr->MCU_sample_width;
140
224M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
112M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
112M
                yoffset + yindex < compptr->last_row_height) {
143
112M
              output_col = start_col;
144
225M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
112M
                (*inverse_DCT) (cinfo, compptr,
146
112M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
112M
                                output_ptr, output_col);
148
112M
                output_col += compptr->_DCT_scaled_size;
149
112M
              }
150
112M
            }
151
112M
            blkn += compptr->MCU_width;
152
112M
            output_ptr += compptr->_DCT_scaled_size;
153
112M
          }
154
112M
        }
155
111M
      }
156
111M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
2.86M
    coef->MCU_ctr = 0;
159
2.86M
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
2.86M
  cinfo->output_iMCU_row++;
162
2.86M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
2.80M
    start_iMCU_row(cinfo);
164
2.80M
    return JPEG_ROW_COMPLETED;
165
2.80M
  }
166
  /* Completed the scan */
167
58.4k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
58.4k
  return JPEG_SCAN_COMPLETED;
169
2.86M
}
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
2.74M
{
195
2.74M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
2.74M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
2.74M
  int blkn, ci, xindex, yindex, yoffset;
198
2.74M
  JDIMENSION start_col;
199
2.74M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
2.74M
  JBLOCKROW buffer_ptr;
201
2.74M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
6.57M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
3.82M
    compptr = cinfo->cur_comp_info[ci];
206
3.82M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
3.82M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
3.82M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
3.82M
       (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
3.82M
  }
215
216
  /* Loop to process one whole iMCU row */
217
5.50M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
2.75M
       yoffset++) {
219
241M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
238M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
238M
      blkn = 0;                 /* index of current DCT block within MCU */
223
481M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
243M
        compptr = cinfo->cur_comp_info[ci];
225
243M
        start_col = MCU_col_num * compptr->MCU_width;
226
486M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
243M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
487M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
243M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
243M
          }
231
243M
        }
232
243M
      }
233
238M
      if (!cinfo->entropy->insufficient_data)
234
115M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
238M
      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
238M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
2.75M
    coef->MCU_ctr = 0;
245
2.75M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
2.74M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
2.71M
    start_iMCU_row(cinfo);
249
2.71M
    return JPEG_ROW_COMPLETED;
250
2.71M
  }
251
  /* Completed the scan */
252
25.4k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
25.4k
  return JPEG_SCAN_COMPLETED;
254
2.74M
}
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
633k
{
268
633k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
633k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
633k
  JDIMENSION block_num;
271
633k
  int ci, block_row, block_rows;
272
633k
  JBLOCKARRAY buffer;
273
633k
  JBLOCKROW buffer_ptr;
274
633k
  _JSAMPARRAY output_ptr;
275
633k
  JDIMENSION output_col;
276
633k
  jpeg_component_info *compptr;
277
633k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
633k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
633k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
633k
          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
1.46M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
829k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
829k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
829k
    buffer = (*cinfo->mem->access_virt_barray)
295
829k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
829k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
829k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
829k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
807k
      block_rows = compptr->v_samp_factor;
301
21.8k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
21.8k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
21.8k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
21.8k
    }
306
829k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
829k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
1.66M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
839k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
839k
      output_col = 0;
312
839k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
39.2M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
38.3M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
38.3M
                        output_col);
316
38.3M
        buffer_ptr++;
317
38.3M
        output_col += compptr->_DCT_scaled_size;
318
38.3M
      }
319
839k
      output_ptr += compptr->_DCT_scaled_size;
320
839k
    }
321
829k
  }
322
323
633k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
621k
    return JPEG_ROW_COMPLETED;
325
12.2k
  return JPEG_SCAN_COMPLETED;
326
633k
}
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
1.07M
#define Q01_POS  1
342
1.07M
#define Q10_POS  8
343
1.07M
#define Q20_POS  16
344
1.07M
#define Q11_POS  9
345
1.07M
#define Q02_POS  2
346
970k
#define Q03_POS  3
347
970k
#define Q12_POS  10
348
969k
#define Q21_POS  17
349
968k
#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
16.0k
{
362
16.0k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
16.0k
  boolean smoothing_useful = FALSE;
364
16.0k
  int ci, coefi;
365
16.0k
  jpeg_component_info *compptr;
366
16.0k
  JQUANT_TBL *qtable;
367
16.0k
  int *coef_bits, *prev_coef_bits;
368
16.0k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
16.0k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
1.59k
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
14.4k
  if (coef->coef_bits_latch == NULL)
375
14.4k
    coef->coef_bits_latch = (int *)
376
14.4k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
14.4k
                                  cinfo->num_components * 2 *
378
14.4k
                                  (SAVED_COEFS * sizeof(int)));
379
14.4k
  coef_bits_latch = coef->coef_bits_latch;
380
14.4k
  prev_coef_bits_latch =
381
14.4k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
21.5k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
17.8k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
17.8k
    if ((qtable = compptr->quant_table) == NULL)
387
2.04k
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
15.7k
    if (qtable->quantval[0] == 0 ||
390
15.7k
        qtable->quantval[Q01_POS] == 0 ||
391
15.7k
        qtable->quantval[Q10_POS] == 0 ||
392
15.7k
        qtable->quantval[Q20_POS] == 0 ||
393
15.7k
        qtable->quantval[Q11_POS] == 0 ||
394
15.7k
        qtable->quantval[Q02_POS] == 0 ||
395
15.7k
        qtable->quantval[Q03_POS] == 0 ||
396
15.7k
        qtable->quantval[Q12_POS] == 0 ||
397
15.7k
        qtable->quantval[Q21_POS] == 0 ||
398
15.7k
        qtable->quantval[Q30_POS] == 0)
399
7.77k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
7.99k
    coef_bits = cinfo->coef_bits[ci];
402
7.99k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
7.99k
    if (coef_bits[0] < 0)
404
836
      return FALSE;
405
7.15k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
71.5k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
64.4k
      if (cinfo->input_scan_number > 1)
409
17.8k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
46.5k
      else
411
46.5k
        prev_coef_bits_latch[coefi] = -1;
412
64.4k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
64.4k
      if (coef_bits[coefi] != 0)
414
58.3k
        smoothing_useful = TRUE;
415
64.4k
    }
416
7.15k
    coef_bits_latch += SAVED_COEFS;
417
7.15k
    prev_coef_bits_latch += SAVED_COEFS;
418
7.15k
  }
419
420
3.74k
  return smoothing_useful;
421
14.4k
}
422
423
424
/*
425
 * Variant of decompress_data for use when doing block smoothing.
426
 */
427
428
METHODDEF(int)
429
decompress_smooth_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
430
774k
{
431
774k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
774k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
774k
  JDIMENSION block_num, last_block_column;
434
774k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
774k
    image_block_rows;
436
774k
  JBLOCKARRAY buffer;
437
774k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
774k
  JBLOCKROW next_block_row, next_next_block_row;
439
774k
  _JSAMPARRAY output_ptr;
440
774k
  JDIMENSION output_col;
441
774k
  jpeg_component_info *compptr;
442
774k
  _inverse_DCT_method_ptr inverse_DCT;
443
774k
  boolean change_dc;
444
774k
  JCOEF *workspace;
445
774k
  int *coef_bits;
446
774k
  JQUANT_TBL *quanttbl;
447
774k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
774k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
774k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
774k
      DC25;
451
774k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
774k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
774k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
774k
         !cinfo->inputctl->eoi_reached) {
459
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
460
      /* If input is working on current scan, we ordinarily want it to
461
       * have completed the current row.  But if input scan is DC,
462
       * we want it to keep two rows ahead so that next two block rows' DC
463
       * values are up to date.
464
       */
465
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
466
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
467
0
        break;
468
0
    }
469
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
470
0
      return JPEG_SUSPENDED;
471
0
  }
472
473
  /* OK, output from the virtual arrays. */
474
1.83M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
1.06M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
1.06M
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
1.06M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
1.05M
      block_rows = compptr->v_samp_factor;
482
1.05M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
1.05M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
4.90k
      block_rows = compptr->v_samp_factor;
485
4.90k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
5.06k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
5.06k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
5.06k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
5.06k
      access_rows = block_rows; /* this iMCU row only */
491
5.06k
    }
492
    /* Align the virtual buffer for this component. */
493
1.06M
    if (cinfo->output_iMCU_row > 1) {
494
1.05M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
1.05M
      buffer = (*cinfo->mem->access_virt_barray)
496
1.05M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
1.05M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
1.05M
         (JDIMENSION)access_rows, FALSE);
499
1.05M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
1.05M
    } else if (cinfo->output_iMCU_row > 0) {
501
4.90k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
4.90k
      buffer = (*cinfo->mem->access_virt_barray)
503
4.90k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
4.90k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
4.90k
         (JDIMENSION)access_rows, FALSE);
506
4.90k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
5.06k
    } else {
508
5.06k
      buffer = (*cinfo->mem->access_virt_barray)
509
5.06k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
5.06k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
5.06k
    }
512
    /* Fetch component-dependent info.
513
     * If the current scan is incomplete, then we use the component-dependent
514
     * info from the previous scan.
515
     */
516
1.06M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
518k
      coef_bits =
518
518k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
541k
    else
520
541k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
1.06M
    change_dc =
524
1.06M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
1.06M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
1.06M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
1.06M
    quanttbl = compptr->quant_table;
529
1.06M
    Q00 = quanttbl->quantval[0];
530
1.06M
    Q01 = quanttbl->quantval[Q01_POS];
531
1.06M
    Q10 = quanttbl->quantval[Q10_POS];
532
1.06M
    Q20 = quanttbl->quantval[Q20_POS];
533
1.06M
    Q11 = quanttbl->quantval[Q11_POS];
534
1.06M
    Q02 = quanttbl->quantval[Q02_POS];
535
1.06M
    if (change_dc) {
536
959k
      Q03 = quanttbl->quantval[Q03_POS];
537
959k
      Q12 = quanttbl->quantval[Q12_POS];
538
959k
      Q21 = quanttbl->quantval[Q21_POS];
539
959k
      Q30 = quanttbl->quantval[Q30_POS];
540
959k
    }
541
1.06M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
1.06M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
1.06M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
2.26M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
1.20M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
1.20M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
1.20M
      if (image_block_row > 0)
550
1.19M
        prev_block_row =
551
1.19M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
5.06k
      else
553
5.06k
        prev_block_row = buffer_ptr;
554
555
1.20M
      if (image_block_row > 1)
556
1.19M
        prev_prev_block_row =
557
1.19M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
9.97k
      else
559
9.97k
        prev_prev_block_row = prev_block_row;
560
561
1.20M
      if (image_block_row < image_block_rows - 1)
562
1.19M
        next_block_row =
563
1.19M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
5.06k
      else
565
5.06k
        next_block_row = buffer_ptr;
566
567
1.20M
      if (image_block_row < image_block_rows - 2)
568
1.19M
        next_next_block_row =
569
1.19M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
9.46k
      else
571
9.46k
        next_next_block_row = next_block_row;
572
573
      /* We fetch the surrounding DC values using a sliding-register approach.
574
       * Initialize all 25 here so as to do the right thing on narrow pics.
575
       */
576
1.20M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
1.20M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
1.20M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
1.20M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
1.20M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
1.20M
      output_col = 0;
582
1.20M
      last_block_column = compptr->width_in_blocks - 1;
583
1.20M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
41.5M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
40.3M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
40.3M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
40.3M
            block_num < last_block_column) {
590
630k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
630k
          DC09 = DC10 = (int)prev_block_row[1][0];
592
630k
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
630k
          DC19 = DC20 = (int)next_block_row[1][0];
594
630k
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
630k
        }
596
40.3M
        if (block_num + 1 < last_block_column) {
597
38.4M
          DC05 = (int)prev_prev_block_row[2][0];
598
38.4M
          DC10 = (int)prev_block_row[2][0];
599
38.4M
          DC15 = (int)buffer_ptr[2][0];
600
38.4M
          DC20 = (int)next_block_row[2][0];
601
38.4M
          DC25 = (int)next_next_block_row[2][0];
602
38.4M
        }
603
        /* If DC interpolation is enabled, compute coefficient estimates using
604
         * a Gaussian-like kernel, keeping the averages of the DC values.
605
         *
606
         * If DC interpolation is disabled, compute coefficient estimates using
607
         * an algorithm similar to the one described in Section K.8 of the JPEG
608
         * standard, except applied to a 5x5 window rather than a 3x3 window.
609
         *
610
         * An estimate is applied only if the coefficient is still zero and is
611
         * not known to be fully accurate.
612
         */
613
        /* AC01 */
614
40.3M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
39.9M
          num = Q00 * (change_dc ?
616
30.2M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
30.2M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
30.2M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
30.2M
                 DC21 - DC22 + DC24 + DC25) :
620
39.9M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
39.9M
          if (num >= 0) {
622
27.3M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
27.3M
            if (Al > 0 && pred >= (1 << Al))
624
2.49M
              pred = (1 << Al) - 1;
625
27.3M
          } else {
626
12.6M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
12.6M
            if (Al > 0 && pred >= (1 << Al))
628
1.62M
              pred = (1 << Al) - 1;
629
12.6M
            pred = -pred;
630
12.6M
          }
631
39.9M
          workspace[1] = (JCOEF)pred;
632
39.9M
        }
633
        /* AC10 */
634
40.3M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
40.1M
          num = Q00 * (change_dc ?
636
30.2M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
30.2M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
30.2M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
30.2M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
40.1M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
40.1M
          if (num >= 0) {
642
27.0M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
27.0M
            if (Al > 0 && pred >= (1 << Al))
644
2.76M
              pred = (1 << Al) - 1;
645
27.0M
          } else {
646
13.0M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
13.0M
            if (Al > 0 && pred >= (1 << Al))
648
1.83M
              pred = (1 << Al) - 1;
649
13.0M
            pred = -pred;
650
13.0M
          }
651
40.1M
          workspace[8] = (JCOEF)pred;
652
40.1M
        }
653
        /* AC20 */
654
40.3M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
40.0M
          num = Q00 * (change_dc ?
656
30.2M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
30.2M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
40.0M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
40.0M
          if (num >= 0) {
660
23.9M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
23.9M
            if (Al > 0 && pred >= (1 << Al))
662
1.79M
              pred = (1 << Al) - 1;
663
23.9M
          } else {
664
16.1M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
16.1M
            if (Al > 0 && pred >= (1 << Al))
666
1.79M
              pred = (1 << Al) - 1;
667
16.1M
            pred = -pred;
668
16.1M
          }
669
40.0M
          workspace[16] = (JCOEF)pred;
670
40.0M
        }
671
        /* AC11 */
672
40.3M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
40.0M
          num = Q00 * (change_dc ?
674
30.2M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
30.2M
                 9 * DC19 + DC21 - DC25) :
676
40.0M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
9.87M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
40.0M
          if (num >= 0) {
679
32.3M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
32.3M
            if (Al > 0 && pred >= (1 << Al))
681
913k
              pred = (1 << Al) - 1;
682
32.3M
          } else {
683
7.77M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
7.77M
            if (Al > 0 && pred >= (1 << Al))
685
913k
              pred = (1 << Al) - 1;
686
7.77M
            pred = -pred;
687
7.77M
          }
688
40.0M
          workspace[9] = (JCOEF)pred;
689
40.0M
        }
690
        /* AC02 */
691
40.3M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
39.8M
          num = Q00 * (change_dc ?
693
30.2M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
30.2M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
39.8M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
39.8M
          if (num >= 0) {
697
23.4M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
23.4M
            if (Al > 0 && pred >= (1 << Al))
699
1.44M
              pred = (1 << Al) - 1;
700
23.4M
          } else {
701
16.4M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
16.4M
            if (Al > 0 && pred >= (1 << Al))
703
1.45M
              pred = (1 << Al) - 1;
704
16.4M
            pred = -pred;
705
16.4M
          }
706
39.8M
          workspace[2] = (JCOEF)pred;
707
39.8M
        }
708
40.3M
        if (change_dc) {
709
          /* AC03 */
710
30.2M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
30.2M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
30.2M
            if (num >= 0) {
713
20.9M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
20.9M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
20.9M
            } else {
717
9.31M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
9.31M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
9.31M
              pred = -pred;
721
9.31M
            }
722
30.2M
            workspace[3] = (JCOEF)pred;
723
30.2M
          }
724
          /* AC12 */
725
30.2M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
30.2M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
30.2M
            if (num >= 0) {
728
15.6M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
15.6M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
15.6M
            } else {
732
14.5M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
14.5M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
14.5M
              pred = -pred;
736
14.5M
            }
737
30.2M
            workspace[10] = (JCOEF)pred;
738
30.2M
          }
739
          /* AC21 */
740
30.2M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
30.2M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
30.2M
            if (num >= 0) {
743
15.4M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
15.4M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
15.4M
            } else {
747
14.7M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
14.7M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
14.7M
              pred = -pred;
751
14.7M
            }
752
30.2M
            workspace[17] = (JCOEF)pred;
753
30.2M
          }
754
          /* AC30 */
755
30.2M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
30.2M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
30.2M
            if (num >= 0) {
758
20.6M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
20.6M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
20.6M
            } else {
762
9.56M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
9.56M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
9.56M
              pred = -pred;
766
9.56M
            }
767
30.2M
            workspace[24] = (JCOEF)pred;
768
30.2M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
30.2M
          num = Q00 *
773
30.2M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
30.2M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
30.2M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
30.2M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
30.2M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
30.2M
          if (num >= 0) {
779
20.3M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
20.3M
          } else {
781
9.86M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
9.86M
            pred = -pred;
783
9.86M
          }
784
30.2M
          workspace[0] = (JCOEF)pred;
785
30.2M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
40.3M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
40.3M
                        output_col);
790
        /* Advance for next column */
791
40.3M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
40.3M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
40.3M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
40.3M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
40.3M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
40.3M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
40.3M
          prev_prev_block_row++, next_next_block_row++;
798
40.3M
        output_col += compptr->_DCT_scaled_size;
799
40.3M
      }
800
1.20M
      output_ptr += compptr->_DCT_scaled_size;
801
1.20M
    }
802
1.06M
  }
803
804
774k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
771k
    return JPEG_ROW_COMPLETED;
806
3.44k
  return JPEG_SCAN_COMPLETED;
807
774k
}
808
809
#endif /* BLOCK_SMOOTHING_SUPPORTED */
810
811
812
/*
813
 * Initialize coefficient buffer controller.
814
 */
815
816
GLOBAL(void)
817
_jinit_d_coef_controller(j_decompress_ptr cinfo, boolean need_full_buffer)
818
68.8k
{
819
68.8k
  my_coef_ptr coef;
820
821
68.8k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
68.8k
  coef = (my_coef_ptr)
825
68.8k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
68.8k
                                sizeof(my_coef_controller));
827
68.8k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
828
68.8k
  coef->pub.start_input_pass = start_input_pass;
829
68.8k
  coef->pub.start_output_pass = start_output_pass;
830
68.8k
#ifdef BLOCK_SMOOTHING_SUPPORTED
831
68.8k
  coef->coef_bits_latch = NULL;
832
68.8k
#endif
833
834
  /* Create the coefficient buffer. */
835
68.8k
  if (need_full_buffer) {
836
21.3k
#ifdef D_MULTISCAN_FILES_SUPPORTED
837
    /* Allocate a full-image virtual array for each component, */
838
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
839
    /* Note we ask for a pre-zeroed array. */
840
21.3k
    int ci, access_rows;
841
21.3k
    jpeg_component_info *compptr;
842
843
57.3k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
844
36.0k
         ci++, compptr++) {
845
36.0k
      access_rows = compptr->v_samp_factor;
846
36.0k
#ifdef BLOCK_SMOOTHING_SUPPORTED
847
      /* If block smoothing could be used, need a bigger window */
848
36.0k
      if (cinfo->progressive_mode)
849
29.9k
        access_rows *= 5;
850
36.0k
#endif
851
36.0k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
852
36.0k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
853
36.0k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
854
36.0k
                               (long)compptr->h_samp_factor),
855
36.0k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
856
36.0k
                               (long)compptr->v_samp_factor),
857
36.0k
         (JDIMENSION)access_rows);
858
36.0k
    }
859
21.3k
    coef->pub.consume_data = consume_data;
860
21.3k
    coef->pub._decompress_data = decompress_data;
861
21.3k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
862
#else
863
    ERREXIT(cinfo, JERR_NOT_COMPILED);
864
#endif
865
47.4k
  } else {
866
    /* We only need a single-MCU buffer. */
867
47.4k
    JBLOCKROW buffer;
868
47.4k
    int i;
869
870
47.4k
    buffer = (JBLOCKROW)
871
47.4k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
872
47.4k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
873
522k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
874
474k
      coef->MCU_buffer[i] = buffer + i;
875
474k
    }
876
47.4k
    coef->pub.consume_data = dummy_consume_data;
877
47.4k
    coef->pub._decompress_data = decompress_onepass;
878
47.4k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
879
47.4k
  }
880
881
  /* Allocate the workspace buffer */
882
68.8k
  coef->workspace = (JCOEF *)
883
68.8k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
884
68.8k
                                sizeof(JCOEF) * DCTSIZE2);
885
68.8k
}
Unexecuted instantiation: j12init_d_coef_controller
jinit_d_coef_controller
Line
Count
Source
818
68.8k
{
819
68.8k
  my_coef_ptr coef;
820
821
68.8k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
68.8k
  coef = (my_coef_ptr)
825
68.8k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
68.8k
                                sizeof(my_coef_controller));
827
68.8k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
828
68.8k
  coef->pub.start_input_pass = start_input_pass;
829
68.8k
  coef->pub.start_output_pass = start_output_pass;
830
68.8k
#ifdef BLOCK_SMOOTHING_SUPPORTED
831
68.8k
  coef->coef_bits_latch = NULL;
832
68.8k
#endif
833
834
  /* Create the coefficient buffer. */
835
68.8k
  if (need_full_buffer) {
836
21.3k
#ifdef D_MULTISCAN_FILES_SUPPORTED
837
    /* Allocate a full-image virtual array for each component, */
838
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
839
    /* Note we ask for a pre-zeroed array. */
840
21.3k
    int ci, access_rows;
841
21.3k
    jpeg_component_info *compptr;
842
843
57.3k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
844
36.0k
         ci++, compptr++) {
845
36.0k
      access_rows = compptr->v_samp_factor;
846
36.0k
#ifdef BLOCK_SMOOTHING_SUPPORTED
847
      /* If block smoothing could be used, need a bigger window */
848
36.0k
      if (cinfo->progressive_mode)
849
29.9k
        access_rows *= 5;
850
36.0k
#endif
851
36.0k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
852
36.0k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
853
36.0k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
854
36.0k
                               (long)compptr->h_samp_factor),
855
36.0k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
856
36.0k
                               (long)compptr->v_samp_factor),
857
36.0k
         (JDIMENSION)access_rows);
858
36.0k
    }
859
21.3k
    coef->pub.consume_data = consume_data;
860
21.3k
    coef->pub._decompress_data = decompress_data;
861
21.3k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
862
#else
863
    ERREXIT(cinfo, JERR_NOT_COMPILED);
864
#endif
865
47.4k
  } else {
866
    /* We only need a single-MCU buffer. */
867
47.4k
    JBLOCKROW buffer;
868
47.4k
    int i;
869
870
47.4k
    buffer = (JBLOCKROW)
871
47.4k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
872
47.4k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
873
522k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
874
474k
      coef->MCU_buffer[i] = buffer + i;
875
474k
    }
876
47.4k
    coef->pub.consume_data = dummy_consume_data;
877
47.4k
    coef->pub._decompress_data = decompress_onepass;
878
47.4k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
879
47.4k
  }
880
881
  /* Allocate the workspace buffer */
882
68.8k
  coef->workspace = (JCOEF *)
883
68.8k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
884
68.8k
                                sizeof(JCOEF) * DCTSIZE2);
885
68.8k
}