Coverage Report

Created: 2026-11-06 11:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/workdir/UnpackedTarball/libjpeg-turbo/src/jdcoefct.c
Line
Count
Source
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-2026, 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
#ifdef WITH_PROFILE
27
#include "tjutil.h"
28
#endif
29
30
31
/* Forward declarations */
32
METHODDEF(int) decompress_onepass(j_decompress_ptr cinfo,
33
                                  _JSAMPIMAGE output_buf);
34
#ifdef D_MULTISCAN_FILES_SUPPORTED
35
METHODDEF(int) decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf);
36
#endif
37
#ifdef BLOCK_SMOOTHING_SUPPORTED
38
LOCAL(boolean) smoothing_ok(j_decompress_ptr cinfo);
39
METHODDEF(int) decompress_smooth_data(j_decompress_ptr cinfo,
40
                                      _JSAMPIMAGE output_buf);
41
#endif
42
43
44
/*
45
 * Initialize for an input processing pass.
46
 */
47
48
METHODDEF(void)
49
start_input_pass(j_decompress_ptr cinfo)
50
54.4k
{
51
54.4k
  cinfo->input_iMCU_row = 0;
52
54.4k
  start_iMCU_row(cinfo);
53
54.4k
}
54
55
56
/*
57
 * Initialize for an output processing pass.
58
 */
59
60
METHODDEF(void)
61
start_output_pass(j_decompress_ptr cinfo)
62
26.9k
{
63
26.9k
#ifdef BLOCK_SMOOTHING_SUPPORTED
64
26.9k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
65
66
  /* If multipass, check to see whether to use block smoothing on this pass */
67
26.9k
  if (coef->pub.coef_arrays != NULL) {
68
9.14k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
69
1.74k
      coef->pub._decompress_data = decompress_smooth_data;
70
7.40k
    else
71
7.40k
      coef->pub._decompress_data = decompress_data;
72
9.14k
  }
73
26.9k
#endif
74
26.9k
  cinfo->output_iMCU_row = 0;
75
26.9k
}
76
77
78
/*
79
 * Decompress and return some data in the single-pass case.
80
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
81
 * Input and output must run in lockstep since we have only a one-MCU buffer.
82
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
83
 *
84
 * NB: output_buf contains a plane for each component in image,
85
 * which we index according to the component's SOF position.
86
 */
87
88
METHODDEF(int)
89
decompress_onepass(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
90
2.07M
{
91
2.07M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
92
2.07M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
93
2.07M
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
94
2.07M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
95
2.07M
  int blkn, ci, xindex, yindex, yoffset, useful_width;
96
2.07M
  _JSAMPARRAY output_ptr;
97
2.07M
  JDIMENSION start_col, output_col;
98
2.07M
  jpeg_component_info *compptr;
99
2.07M
  _inverse_DCT_method_ptr inverse_DCT;
100
101
  /* Loop to process as much as one whole iMCU row */
102
4.56M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
103
2.49M
       yoffset++) {
104
43.2M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
105
40.7M
         MCU_col_num++) {
106
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
107
40.7M
      jzero_far((void *)coef->MCU_buffer[0],
108
40.7M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
109
40.7M
      if (!cinfo->entropy->insufficient_data)
110
3.52M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
111
#ifdef WITH_PROFILE
112
      cinfo->master->start = getTime();
113
#endif
114
40.7M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
115
        /* Suspension forced; update state counters and exit */
116
0
        coef->MCU_vert_offset = yoffset;
117
0
        coef->MCU_ctr = MCU_col_num;
118
#ifdef WITH_PROFILE
119
        cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
120
        cinfo->master->entropy_mcoeffs +=
121
          (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
122
#endif
123
0
        return JPEG_SUSPENDED;
124
0
      }
125
#ifdef WITH_PROFILE
126
      cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
127
      cinfo->master->entropy_mcoeffs +=
128
        (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
129
#endif
130
131
      /* Only perform the IDCT on blocks that are contained within the desired
132
       * cropping region.
133
       */
134
40.7M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
135
40.7M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
136
        /* Determine where data should go in output_buf and do the IDCT thing.
137
         * We skip dummy blocks at the right and bottom edges (but blkn gets
138
         * incremented past them!).  Note the inner loop relies on having
139
         * allocated the MCU_buffer[] blocks sequentially.
140
         */
141
40.7M
        blkn = 0;               /* index of current DCT block within MCU */
142
93.4M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
143
52.6M
          compptr = cinfo->cur_comp_info[ci];
144
          /* Don't bother to IDCT an uninteresting component. */
145
52.6M
          if (!compptr->component_needed) {
146
0
            blkn += compptr->MCU_blocks;
147
0
            continue;
148
0
          }
149
52.6M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
150
52.6M
          useful_width = (MCU_col_num < last_MCU_col) ?
151
47.2M
                         compptr->MCU_width : compptr->last_col_width;
152
52.6M
          output_ptr = output_buf[compptr->component_index] +
153
52.6M
                       yoffset * compptr->_DCT_scaled_size;
154
52.6M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
155
52.6M
                      compptr->MCU_sample_width;
156
110M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
157
58.1M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
158
58.0M
                yoffset + yindex < compptr->last_row_height) {
159
58.0M
              output_col = start_col;
160
123M
              for (xindex = 0; xindex < useful_width; xindex++) {
161
#ifdef WITH_PROFILE
162
                cinfo->master->start = getTime();
163
#endif
164
65.5M
                (*inverse_DCT) (cinfo, compptr,
165
65.5M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
166
65.5M
                                output_ptr, output_col);
167
#ifdef WITH_PROFILE
168
                cinfo->master->idct_elapsed +=
169
                  getTime() - cinfo->master->start;
170
                cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
171
#endif
172
65.5M
                output_col += compptr->_DCT_scaled_size;
173
65.5M
              }
174
58.0M
            }
175
58.1M
            blkn += compptr->MCU_width;
176
58.1M
            output_ptr += compptr->_DCT_scaled_size;
177
58.1M
          }
178
52.6M
        }
179
40.7M
      }
180
40.7M
    }
181
    /* Completed an MCU row, but perhaps not an iMCU row */
182
2.49M
    coef->MCU_ctr = 0;
183
2.49M
  }
184
  /* Completed the iMCU row, advance counters for next one */
185
2.07M
  cinfo->output_iMCU_row++;
186
2.07M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
187
2.05M
    start_iMCU_row(cinfo);
188
2.05M
    return JPEG_ROW_COMPLETED;
189
2.05M
  }
190
  /* Completed the scan */
191
17.8k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
192
17.8k
  return JPEG_SCAN_COMPLETED;
193
2.07M
}
194
195
196
/*
197
 * Dummy consume-input routine for single-pass operation.
198
 */
199
200
METHODDEF(int)
201
dummy_consume_data(j_decompress_ptr cinfo)
202
0
{
203
0
  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
204
0
}
205
206
207
#ifdef D_MULTISCAN_FILES_SUPPORTED
208
209
/*
210
 * Consume input data and store it in the full-image coefficient buffer.
211
 * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
212
 * ie, v_samp_factor block rows for each component in the scan.
213
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
214
 */
215
216
METHODDEF(int)
217
consume_data(j_decompress_ptr cinfo)
218
20.3M
{
219
20.3M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
220
20.3M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
221
20.3M
  int blkn, ci, xindex, yindex, yoffset;
222
20.3M
  JDIMENSION start_col;
223
20.3M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
224
20.3M
  JBLOCKROW buffer_ptr;
225
20.3M
  jpeg_component_info *compptr;
226
227
  /* Align the virtual buffers for the components used in this scan. */
228
61.6M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
229
41.3M
    compptr = cinfo->cur_comp_info[ci];
230
41.3M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
231
41.3M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
232
41.3M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
233
41.3M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
234
    /* Note: entropy decoder expects buffer to be zeroed,
235
     * but this is handled automatically by the memory manager
236
     * because we requested a pre-zeroed array.
237
     */
238
41.3M
  }
239
240
  /* Loop to process one whole iMCU row */
241
46.7M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
242
26.4M
       yoffset++) {
243
141M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
244
114M
         MCU_col_num++) {
245
      /* Construct list of pointers to DCT blocks belonging to this MCU */
246
114M
      blkn = 0;                 /* index of current DCT block within MCU */
247
265M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
248
150M
        compptr = cinfo->cur_comp_info[ci];
249
150M
        start_col = MCU_col_num * compptr->MCU_width;
250
312M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
251
161M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
252
357M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
253
195M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
254
195M
          }
255
161M
        }
256
150M
      }
257
114M
      if (!cinfo->entropy->insufficient_data)
258
78.1M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
259
      /* Try to fetch the MCU. */
260
#ifdef WITH_PROFILE
261
      cinfo->master->start = getTime();
262
#endif
263
114M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
264
        /* Suspension forced; update state counters and exit */
265
0
        coef->MCU_vert_offset = yoffset;
266
0
        coef->MCU_ctr = MCU_col_num;
267
#ifdef WITH_PROFILE
268
        cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
269
        cinfo->master->entropy_mcoeffs +=
270
          (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
271
#endif
272
0
        return JPEG_SUSPENDED;
273
0
      }
274
#ifdef WITH_PROFILE
275
      cinfo->master->entropy_elapsed += getTime() - cinfo->master->start;
276
      cinfo->master->entropy_mcoeffs +=
277
        (double)cinfo->blocks_in_MCU * DCTSIZE2 / 1000000.;
278
#endif
279
114M
    }
280
    /* Completed an MCU row, but perhaps not an iMCU row */
281
26.4M
    coef->MCU_ctr = 0;
282
26.4M
  }
283
  /* Completed the iMCU row, advance counters for next one */
284
20.3M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
285
20.2M
    start_iMCU_row(cinfo);
286
20.2M
    return JPEG_ROW_COMPLETED;
287
20.2M
  }
288
  /* Completed the scan */
289
36.6k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
290
36.6k
  return JPEG_SCAN_COMPLETED;
291
20.3M
}
292
293
294
/*
295
 * Decompress and return some data in the multi-pass case.
296
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
297
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
298
 *
299
 * NB: output_buf contains a plane for each component in image.
300
 */
301
302
METHODDEF(int)
303
decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
304
7.08M
{
305
7.08M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
306
7.08M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
307
7.08M
  JDIMENSION block_num;
308
7.08M
  int ci, block_row, block_rows;
309
7.08M
  JBLOCKARRAY buffer;
310
7.08M
  JBLOCKROW buffer_ptr;
311
7.08M
  _JSAMPARRAY output_ptr;
312
7.08M
  JDIMENSION output_col;
313
7.08M
  jpeg_component_info *compptr;
314
7.08M
  _inverse_DCT_method_ptr inverse_DCT;
315
316
  /* Force some input to be done if we are getting ahead of the input. */
317
7.08M
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
318
7.08M
         (cinfo->input_scan_number == cinfo->output_scan_number &&
319
7.08M
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
320
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
321
0
      return JPEG_SUSPENDED;
322
0
  }
323
324
  /* OK, output from the virtual arrays. */
325
27.3M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
326
20.3M
       ci++, compptr++) {
327
    /* Don't bother to IDCT an uninteresting component. */
328
20.3M
    if (!compptr->component_needed)
329
0
      continue;
330
    /* Align the virtual buffer for this component. */
331
20.3M
    buffer = (*cinfo->mem->access_virt_barray)
332
20.3M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
333
20.3M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
334
20.3M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
335
    /* Count non-dummy DCT block rows in this iMCU row. */
336
20.3M
    if (cinfo->output_iMCU_row < last_iMCU_row)
337
20.2M
      block_rows = compptr->v_samp_factor;
338
20.5k
    else {
339
      /* NB: can't use last_row_height here; it is input-side-dependent! */
340
20.5k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
341
20.5k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
342
20.5k
    }
343
20.3M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
344
20.3M
    output_ptr = output_buf[ci];
345
    /* Loop over all DCT blocks to be processed. */
346
43.7M
    for (block_row = 0; block_row < block_rows; block_row++) {
347
23.4M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
348
23.4M
      output_col = 0;
349
23.4M
      for (block_num = cinfo->master->first_MCU_col[ci];
350
74.9M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
351
#ifdef WITH_PROFILE
352
        cinfo->master->start = getTime();
353
#endif
354
51.4M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
355
51.4M
                        output_col);
356
#ifdef WITH_PROFILE
357
        cinfo->master->idct_elapsed += getTime() - cinfo->master->start;
358
        cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
359
#endif
360
51.4M
        buffer_ptr++;
361
51.4M
        output_col += compptr->_DCT_scaled_size;
362
51.4M
      }
363
23.4M
      output_ptr += compptr->_DCT_scaled_size;
364
23.4M
    }
365
20.3M
  }
366
367
7.08M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
368
7.07M
    return JPEG_ROW_COMPLETED;
369
7.39k
  return JPEG_SCAN_COMPLETED;
370
7.08M
}
371
372
#endif /* D_MULTISCAN_FILES_SUPPORTED */
373
374
375
#ifdef BLOCK_SMOOTHING_SUPPORTED
376
377
/*
378
 * This code applies interblock smoothing; the first 9 AC coefficients are
379
 * estimated from the DC values of a DCT block and its 24 neighboring blocks.
380
 * We apply smoothing only for progressive JPEG decoding, and only if
381
 * the coefficients it can estimate are not yet known to full precision.
382
 */
383
384
/* Natural-order array positions of the first 9 zigzag-order coefficients */
385
4.13M
#define Q01_POS  1
386
4.13M
#define Q10_POS  8
387
4.13M
#define Q20_POS  16
388
4.13M
#define Q11_POS  9
389
4.13M
#define Q02_POS  2
390
3.14M
#define Q03_POS  3
391
3.14M
#define Q12_POS  10
392
3.14M
#define Q21_POS  17
393
3.13M
#define Q30_POS  24
394
395
/*
396
 * Determine whether block smoothing is applicable and safe.
397
 * We also latch the current states of the coef_bits[] entries for the
398
 * AC coefficients; otherwise, if the input side of the decompressor
399
 * advances into a new scan, we might think the coefficients are known
400
 * more accurately than they really are.
401
 */
402
403
LOCAL(boolean)
404
smoothing_ok(j_decompress_ptr cinfo)
405
9.14k
{
406
9.14k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
407
9.14k
  boolean smoothing_useful = FALSE;
408
9.14k
  int ci, coefi;
409
9.14k
  jpeg_component_info *compptr;
410
9.14k
  JQUANT_TBL *qtable;
411
9.14k
  int *coef_bits, *prev_coef_bits;
412
9.14k
  int *coef_bits_latch, *prev_coef_bits_latch;
413
414
9.14k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
415
2.66k
    return FALSE;
416
417
  /* Allocate latch area if not already done */
418
6.48k
  if (coef->coef_bits_latch == NULL)
419
6.48k
    coef->coef_bits_latch = (int *)
420
6.48k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
421
6.48k
                                  cinfo->num_components * 2 *
422
6.48k
                                  (SAVED_COEFS * sizeof(int)));
423
6.48k
  coef_bits_latch = coef->coef_bits_latch;
424
6.48k
  prev_coef_bits_latch =
425
6.48k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
426
427
12.2k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
428
10.4k
       ci++, compptr++) {
429
    /* All components' quantization values must already be latched. */
430
10.4k
    if ((qtable = compptr->quant_table) == NULL)
431
534
      return FALSE;
432
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
433
9.93k
    if (qtable->quantval[0] == 0 ||
434
9.17k
        qtable->quantval[Q01_POS] == 0 ||
435
8.80k
        qtable->quantval[Q10_POS] == 0 ||
436
8.32k
        qtable->quantval[Q20_POS] == 0 ||
437
8.19k
        qtable->quantval[Q11_POS] == 0 ||
438
7.90k
        qtable->quantval[Q02_POS] == 0 ||
439
7.63k
        qtable->quantval[Q03_POS] == 0 ||
440
7.37k
        qtable->quantval[Q12_POS] == 0 ||
441
7.09k
        qtable->quantval[Q21_POS] == 0 ||
442
6.56k
        qtable->quantval[Q30_POS] == 0)
443
3.70k
      return FALSE;
444
    /* DC values must be at least partly known for all components. */
445
6.22k
    coef_bits = cinfo->coef_bits[ci];
446
6.22k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
447
6.22k
    if (coef_bits[0] < 0)
448
474
      return FALSE;
449
5.75k
    coef_bits_latch[0] = coef_bits[0];
450
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
451
57.5k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
452
51.7k
      if (cinfo->input_scan_number > 1)
453
36.1k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
454
15.6k
      else
455
15.6k
        prev_coef_bits_latch[coefi] = -1;
456
51.7k
      coef_bits_latch[coefi] = coef_bits[coefi];
457
51.7k
      if (coef_bits[coefi] != 0)
458
48.2k
        smoothing_useful = TRUE;
459
51.7k
    }
460
5.75k
    coef_bits_latch += SAVED_COEFS;
461
5.75k
    prev_coef_bits_latch += SAVED_COEFS;
462
5.75k
  }
463
464
1.76k
  return smoothing_useful;
465
6.48k
}
466
467
468
/*
469
 * Variant of decompress_data for use when doing block smoothing.
470
 */
471
472
METHODDEF(int)
473
decompress_smooth_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
474
1.53M
{
475
1.53M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
476
1.53M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
477
1.53M
  JDIMENSION block_num, last_block_column;
478
1.53M
  int ci, block_row, block_rows, access_rows, image_block_row,
479
1.53M
    image_block_rows;
480
1.53M
  JBLOCKARRAY buffer;
481
1.53M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
482
1.53M
  JBLOCKROW next_block_row, next_next_block_row;
483
1.53M
  _JSAMPARRAY output_ptr;
484
1.53M
  JDIMENSION output_col;
485
1.53M
  jpeg_component_info *compptr;
486
1.53M
  _inverse_DCT_method_ptr inverse_DCT;
487
1.53M
  boolean change_dc;
488
1.53M
  JCOEF *workspace;
489
1.53M
  int *coef_bits;
490
1.53M
  JQUANT_TBL *quanttbl;
491
1.53M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
492
1.53M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
493
1.53M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
494
1.53M
      DC25;
495
1.53M
  int Al, pred;
496
497
  /* Keep a local variable to avoid looking it up more than once */
498
1.53M
  workspace = coef->workspace;
499
500
  /* Force some input to be done if we are getting ahead of the input. */
501
1.53M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
502
1.53M
         !cinfo->inputctl->eoi_reached) {
503
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
504
      /* If input is working on current scan, we ordinarily want it to
505
       * have completed the current row.  But if input scan is DC,
506
       * we want it to keep two rows ahead so that next two block rows' DC
507
       * values are up to date.
508
       */
509
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
510
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
511
0
        break;
512
0
    }
513
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
514
0
      return JPEG_SUSPENDED;
515
0
  }
516
517
  /* OK, output from the virtual arrays. */
518
5.65M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
4.12M
       ci++, compptr++) {
520
    /* Don't bother to IDCT an uninteresting component. */
521
4.12M
    if (!compptr->component_needed)
522
0
      continue;
523
    /* Count non-dummy DCT block rows in this iMCU row. */
524
4.12M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
525
4.11M
      block_rows = compptr->v_samp_factor;
526
4.11M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
527
4.11M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
528
3.97k
      block_rows = compptr->v_samp_factor;
529
3.97k
      access_rows = block_rows * 2; /* this and next iMCU row */
530
4.03k
    } else {
531
      /* NB: can't use last_row_height here; it is input-side-dependent! */
532
4.03k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
533
4.03k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
534
4.03k
      access_rows = block_rows; /* this iMCU row only */
535
4.03k
    }
536
    /* Align the virtual buffer for this component. */
537
4.12M
    if (cinfo->output_iMCU_row > 1) {
538
4.11M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
539
4.11M
      buffer = (*cinfo->mem->access_virt_barray)
540
4.11M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
541
4.11M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
542
4.11M
         (JDIMENSION)access_rows, FALSE);
543
4.11M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
544
4.11M
    } else if (cinfo->output_iMCU_row > 0) {
545
3.97k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
546
3.97k
      buffer = (*cinfo->mem->access_virt_barray)
547
3.97k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
548
3.97k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
549
3.97k
         (JDIMENSION)access_rows, FALSE);
550
3.97k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
551
4.03k
    } else {
552
4.03k
      buffer = (*cinfo->mem->access_virt_barray)
553
4.03k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
554
4.03k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
555
4.03k
    }
556
    /* Fetch component-dependent info.
557
     * If the current scan is incomplete, then we use the component-dependent
558
     * info from the previous scan.
559
     */
560
4.12M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
561
1.00M
      coef_bits =
562
1.00M
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
563
3.12M
    else
564
3.12M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
565
566
    /* We only do DC interpolation if no AC coefficient data is available. */
567
4.12M
    change_dc =
568
4.12M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
569
3.67M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
570
3.66M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
571
572
4.12M
    quanttbl = compptr->quant_table;
573
4.12M
    Q00 = quanttbl->quantval[0];
574
4.12M
    Q01 = quanttbl->quantval[Q01_POS];
575
4.12M
    Q10 = quanttbl->quantval[Q10_POS];
576
4.12M
    Q20 = quanttbl->quantval[Q20_POS];
577
4.12M
    Q11 = quanttbl->quantval[Q11_POS];
578
4.12M
    Q02 = quanttbl->quantval[Q02_POS];
579
4.12M
    if (change_dc) {
580
3.13M
      Q03 = quanttbl->quantval[Q03_POS];
581
3.13M
      Q12 = quanttbl->quantval[Q12_POS];
582
3.13M
      Q21 = quanttbl->quantval[Q21_POS];
583
3.13M
      Q30 = quanttbl->quantval[Q30_POS];
584
3.13M
    }
585
4.12M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
586
4.12M
    output_ptr = output_buf[ci];
587
    /* Loop over all DCT blocks to be processed. */
588
4.12M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
589
9.72M
    for (block_row = 0; block_row < block_rows; block_row++) {
590
5.59M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
591
5.59M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
592
593
5.59M
      if (image_block_row > 0)
594
5.59M
        prev_block_row =
595
5.59M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
596
4.03k
      else
597
4.03k
        prev_block_row = buffer_ptr;
598
599
5.59M
      if (image_block_row > 1)
600
5.59M
        prev_prev_block_row =
601
5.59M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
602
8.04k
      else
603
8.04k
        prev_prev_block_row = prev_block_row;
604
605
5.59M
      if (image_block_row < image_block_rows - 1)
606
5.59M
        next_block_row =
607
5.59M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
608
4.03k
      else
609
4.03k
        next_block_row = buffer_ptr;
610
611
5.59M
      if (image_block_row < image_block_rows - 2)
612
5.59M
        next_next_block_row =
613
5.59M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
614
7.46k
      else
615
7.46k
        next_next_block_row = next_block_row;
616
617
      /* We fetch the surrounding DC values using a sliding-register approach.
618
       * Initialize all 25 here so as to do the right thing on narrow pics.
619
       */
620
5.59M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
621
5.59M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
622
5.59M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
623
5.59M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
624
5.59M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
625
5.59M
      output_col = 0;
626
5.59M
      last_block_column = compptr->width_in_blocks - 1;
627
5.59M
      for (block_num = cinfo->master->first_MCU_col[ci];
628
27.0M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
629
        /* Fetch current DCT block into workspace so we can modify it. */
630
21.4M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
631
        /* Update DC values */
632
21.4M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
633
5.59M
            block_num < last_block_column) {
634
762k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
635
762k
          DC09 = DC10 = (int)prev_block_row[1][0];
636
762k
          DC14 = DC15 = (int)buffer_ptr[1][0];
637
762k
          DC19 = DC20 = (int)next_block_row[1][0];
638
762k
          DC24 = DC25 = (int)next_next_block_row[1][0];
639
762k
        }
640
21.4M
        if (block_num + 1 < last_block_column) {
641
15.1M
          DC05 = (int)prev_prev_block_row[2][0];
642
15.1M
          DC10 = (int)prev_block_row[2][0];
643
15.1M
          DC15 = (int)buffer_ptr[2][0];
644
15.1M
          DC20 = (int)next_block_row[2][0];
645
15.1M
          DC25 = (int)next_next_block_row[2][0];
646
15.1M
        }
647
        /* If DC interpolation is enabled, compute coefficient estimates using
648
         * a Gaussian-like kernel, keeping the averages of the DC values.
649
         *
650
         * If DC interpolation is disabled, compute coefficient estimates using
651
         * an algorithm similar to the one described in Section K.8 of the JPEG
652
         * standard, except applied to a 5x5 window rather than a 3x3 window.
653
         *
654
         * An estimate is applied only if the coefficient is still zero and is
655
         * not known to be fully accurate.
656
         */
657
        /* AC01 */
658
21.4M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
659
19.6M
          num = Q00 * (change_dc ?
660
14.5M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
661
14.5M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
662
14.5M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
663
14.5M
                 DC21 - DC22 + DC24 + DC25) :
664
19.6M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
665
19.6M
          if (num >= 0) {
666
15.6M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
667
15.6M
            if (Al > 0 && pred >= (1 << Al))
668
483k
              pred = (1 << Al) - 1;
669
15.6M
          } else {
670
4.02M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
671
4.02M
            if (Al > 0 && pred >= (1 << Al))
672
560k
              pred = (1 << Al) - 1;
673
4.02M
            pred = -pred;
674
4.02M
          }
675
19.6M
          workspace[1] = (JCOEF)pred;
676
19.6M
        }
677
        /* AC10 */
678
21.4M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
679
19.9M
          num = Q00 * (change_dc ?
680
14.5M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
681
14.5M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
682
14.5M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
683
14.5M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
684
19.9M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
685
19.9M
          if (num >= 0) {
686
14.5M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
687
14.5M
            if (Al > 0 && pred >= (1 << Al))
688
720k
              pred = (1 << Al) - 1;
689
14.5M
          } else {
690
5.32M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
691
5.32M
            if (Al > 0 && pred >= (1 << Al))
692
729k
              pred = (1 << Al) - 1;
693
5.32M
            pred = -pred;
694
5.32M
          }
695
19.9M
          workspace[8] = (JCOEF)pred;
696
19.9M
        }
697
        /* AC20 */
698
21.4M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
699
19.7M
          num = Q00 * (change_dc ?
700
14.5M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
701
14.5M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
702
19.7M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
703
19.7M
          if (num >= 0) {
704
14.2M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
705
14.2M
            if (Al > 0 && pred >= (1 << Al))
706
546k
              pred = (1 << Al) - 1;
707
14.2M
          } else {
708
5.53M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
709
5.53M
            if (Al > 0 && pred >= (1 << Al))
710
557k
              pred = (1 << Al) - 1;
711
5.53M
            pred = -pred;
712
5.53M
          }
713
19.7M
          workspace[16] = (JCOEF)pred;
714
19.7M
        }
715
        /* AC11 */
716
21.4M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
717
19.7M
          num = Q00 * (change_dc ?
718
14.5M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
719
14.5M
                 9 * DC19 + DC21 - DC25) :
720
19.7M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
721
5.29M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
722
19.7M
          if (num >= 0) {
723
16.8M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
724
16.8M
            if (Al > 0 && pred >= (1 << Al))
725
417k
              pred = (1 << Al) - 1;
726
16.8M
          } else {
727
2.94M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
728
2.94M
            if (Al > 0 && pred >= (1 << Al))
729
412k
              pred = (1 << Al) - 1;
730
2.94M
            pred = -pred;
731
2.94M
          }
732
19.7M
          workspace[9] = (JCOEF)pred;
733
19.7M
        }
734
        /* AC02 */
735
21.4M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
736
19.8M
          num = Q00 * (change_dc ?
737
14.5M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
738
14.5M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
739
19.8M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
740
19.8M
          if (num >= 0) {
741
14.5M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
742
14.5M
            if (Al > 0 && pred >= (1 << Al))
743
577k
              pred = (1 << Al) - 1;
744
14.5M
          } else {
745
5.33M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
746
5.33M
            if (Al > 0 && pred >= (1 << Al))
747
569k
              pred = (1 << Al) - 1;
748
5.33M
            pred = -pred;
749
5.33M
          }
750
19.8M
          workspace[2] = (JCOEF)pred;
751
19.8M
        }
752
21.4M
        if (change_dc) {
753
          /* AC03 */
754
14.5M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
755
14.5M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
756
14.5M
            if (num >= 0) {
757
12.0M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
758
12.0M
              if (Al > 0 && pred >= (1 << Al))
759
0
                pred = (1 << Al) - 1;
760
12.0M
            } else {
761
2.43M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
762
2.43M
              if (Al > 0 && pred >= (1 << Al))
763
0
                pred = (1 << Al) - 1;
764
2.43M
              pred = -pred;
765
2.43M
            }
766
14.5M
            workspace[3] = (JCOEF)pred;
767
14.5M
          }
768
          /* AC12 */
769
14.5M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
770
14.5M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
771
14.5M
            if (num >= 0) {
772
9.87M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
773
9.87M
              if (Al > 0 && pred >= (1 << Al))
774
0
                pred = (1 << Al) - 1;
775
9.87M
            } else {
776
4.62M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
777
4.62M
              if (Al > 0 && pred >= (1 << Al))
778
0
                pred = (1 << Al) - 1;
779
4.62M
              pred = -pred;
780
4.62M
            }
781
14.5M
            workspace[10] = (JCOEF)pred;
782
14.5M
          }
783
          /* AC21 */
784
14.5M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
785
14.5M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
786
14.5M
            if (num >= 0) {
787
10.9M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
788
10.9M
              if (Al > 0 && pred >= (1 << Al))
789
0
                pred = (1 << Al) - 1;
790
10.9M
            } else {
791
3.58M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
792
3.58M
              if (Al > 0 && pred >= (1 << Al))
793
0
                pred = (1 << Al) - 1;
794
3.58M
              pred = -pred;
795
3.58M
            }
796
14.5M
            workspace[17] = (JCOEF)pred;
797
14.5M
          }
798
          /* AC30 */
799
14.5M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
800
14.5M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
801
14.5M
            if (num >= 0) {
802
11.1M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
803
11.1M
              if (Al > 0 && pred >= (1 << Al))
804
0
                pred = (1 << Al) - 1;
805
11.1M
            } else {
806
3.36M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
807
3.36M
              if (Al > 0 && pred >= (1 << Al))
808
0
                pred = (1 << Al) - 1;
809
3.36M
              pred = -pred;
810
3.36M
            }
811
14.5M
            workspace[24] = (JCOEF)pred;
812
14.5M
          }
813
          /* coef_bits[0] is non-negative.  Otherwise this function would not
814
           * be called.
815
           */
816
14.5M
          num = Q00 *
817
14.5M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
818
14.5M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
819
14.5M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
820
14.5M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
821
14.5M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
822
14.5M
          if (num >= 0) {
823
10.3M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
824
10.3M
          } else {
825
4.15M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
826
4.15M
            pred = -pred;
827
4.15M
          }
828
14.5M
          workspace[0] = (JCOEF)pred;
829
14.5M
        }  /* change_dc */
830
831
        /* OK, do the IDCT */
832
#ifdef WITH_PROFILE
833
        cinfo->master->start = getTime();
834
#endif
835
21.4M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
836
21.4M
                        output_col);
837
#ifdef WITH_PROFILE
838
        cinfo->master->idct_elapsed += getTime() - cinfo->master->start;
839
        cinfo->master->idct_mcoeffs += (double)DCTSIZE2 / 1000000.;
840
#endif
841
        /* Advance for next column */
842
21.4M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
843
21.4M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
844
21.4M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
845
21.4M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
846
21.4M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
847
21.4M
        buffer_ptr++, prev_block_row++, next_block_row++,
848
21.4M
          prev_prev_block_row++, next_next_block_row++;
849
21.4M
        output_col += compptr->_DCT_scaled_size;
850
21.4M
      }
851
5.59M
      output_ptr += compptr->_DCT_scaled_size;
852
5.59M
    }
853
4.12M
  }
854
855
1.53M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
856
1.52M
    return JPEG_ROW_COMPLETED;
857
1.74k
  return JPEG_SCAN_COMPLETED;
858
1.53M
}
859
860
#endif /* BLOCK_SMOOTHING_SUPPORTED */
861
862
863
/*
864
 * Initialize coefficient buffer controller.
865
 */
866
867
GLOBAL(void)
868
_jinit_d_coef_controller(j_decompress_ptr cinfo, boolean need_full_buffer)
869
27.9k
{
870
27.9k
  my_coef_ptr coef;
871
872
27.9k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
873
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
874
875
27.9k
  coef = (my_coef_ptr)
876
27.9k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
877
27.9k
                                sizeof(my_coef_controller));
878
27.9k
  memset(coef, 0, sizeof(my_coef_controller));
879
27.9k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
880
27.9k
  coef->pub.start_input_pass = start_input_pass;
881
27.9k
  coef->pub.start_output_pass = start_output_pass;
882
27.9k
#ifdef BLOCK_SMOOTHING_SUPPORTED
883
27.9k
  coef->coef_bits_latch = NULL;
884
27.9k
#endif
885
886
  /* Create the coefficient buffer. */
887
27.9k
  if (need_full_buffer) {
888
10.0k
#ifdef D_MULTISCAN_FILES_SUPPORTED
889
    /* Allocate a full-image virtual array for each component, */
890
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
891
    /* Note we ask for a pre-zeroed array. */
892
10.0k
    int ci, access_rows;
893
10.0k
    jpeg_component_info *compptr;
894
895
36.9k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
896
26.8k
         ci++, compptr++) {
897
26.8k
      access_rows = compptr->v_samp_factor;
898
26.8k
#ifdef BLOCK_SMOOTHING_SUPPORTED
899
      /* If block smoothing could be used, need a bigger window */
900
26.8k
      if (cinfo->progressive_mode)
901
17.8k
        access_rows *= 5;
902
26.8k
#endif
903
26.8k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
904
26.8k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
905
26.8k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
906
26.8k
                               (long)compptr->h_samp_factor),
907
26.8k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
908
26.8k
                               (long)compptr->v_samp_factor),
909
26.8k
         (JDIMENSION)access_rows);
910
26.8k
    }
911
10.0k
    coef->pub.consume_data = consume_data;
912
10.0k
    coef->pub._decompress_data = decompress_data;
913
10.0k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
914
#else
915
    ERREXIT(cinfo, JERR_NOT_COMPILED);
916
#endif
917
17.8k
  } else {
918
    /* We only need a single-MCU buffer. */
919
17.8k
    JBLOCKROW buffer;
920
17.8k
    int i;
921
922
17.8k
    buffer = (JBLOCKROW)
923
17.8k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
924
17.8k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
925
196k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
926
178k
      coef->MCU_buffer[i] = buffer + i;
927
178k
    }
928
17.8k
    coef->pub.consume_data = dummy_consume_data;
929
17.8k
    coef->pub._decompress_data = decompress_onepass;
930
17.8k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
931
17.8k
  }
932
933
  /* Allocate the workspace buffer */
934
27.9k
  coef->workspace = (JCOEF *)
935
27.9k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
936
27.9k
                                sizeof(JCOEF) * DCTSIZE2);
937
27.9k
}