Coverage Report

Created: 2024-06-09 06:54

/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-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
1.45M
{
48
1.45M
  cinfo->input_iMCU_row = 0;
49
1.45M
  start_iMCU_row(cinfo);
50
1.45M
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
90.5k
{
60
90.5k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
90.5k
  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
90.5k
  if (coef->pub.coef_arrays != NULL) {
65
51.5k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
21.1k
      coef->pub._decompress_data = decompress_smooth_data;
67
30.4k
    else
68
30.4k
      coef->pub._decompress_data = decompress_data;
69
51.5k
  }
70
90.5k
#endif
71
90.5k
  cinfo->output_iMCU_row = 0;
72
90.5k
}
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
1.06M
{
88
1.06M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
1.06M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
1.06M
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
1.06M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
1.06M
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
1.06M
  _JSAMPARRAY output_ptr;
94
1.06M
  JDIMENSION start_col, output_col;
95
1.06M
  jpeg_component_info *compptr;
96
1.06M
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
2.29M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
1.22M
       yoffset++) {
101
7.24M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
6.02M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
6.02M
      jzero_far((void *)coef->MCU_buffer[0],
105
6.02M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
6.02M
      if (!cinfo->entropy->insufficient_data)
107
4.06M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
6.02M
      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
6.02M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
6.02M
          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
6.02M
        blkn = 0;               /* index of current DCT block within MCU */
126
19.2M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
13.2M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
13.2M
          if (!compptr->component_needed) {
130
1.00M
            blkn += compptr->MCU_blocks;
131
1.00M
            continue;
132
1.00M
          }
133
12.2M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
12.2M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
9.55M
                         compptr->MCU_width : compptr->last_col_width;
136
12.2M
          output_ptr = output_buf[compptr->component_index] +
137
12.2M
                       yoffset * compptr->_DCT_scaled_size;
138
12.2M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
12.2M
                      compptr->MCU_sample_width;
140
28.6M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
16.4M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
16.4M
                yoffset + yindex < compptr->last_row_height) {
143
15.7M
              output_col = start_col;
144
39.0M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
23.2M
                (*inverse_DCT) (cinfo, compptr,
146
23.2M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
23.2M
                                output_ptr, output_col);
148
23.2M
                output_col += compptr->_DCT_scaled_size;
149
23.2M
              }
150
15.7M
            }
151
16.4M
            blkn += compptr->MCU_width;
152
16.4M
            output_ptr += compptr->_DCT_scaled_size;
153
16.4M
          }
154
12.2M
        }
155
6.02M
      }
156
6.02M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
1.22M
    coef->MCU_ctr = 0;
159
1.22M
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
1.06M
  cinfo->output_iMCU_row++;
162
1.06M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
1.02M
    start_iMCU_row(cinfo);
164
1.02M
    return JPEG_ROW_COMPLETED;
165
1.02M
  }
166
  /* Completed the scan */
167
38.9k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
38.9k
  return JPEG_SCAN_COMPLETED;
169
1.06M
}
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
18.7M
{
195
18.7M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
18.7M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
18.7M
  int blkn, ci, xindex, yindex, yoffset;
198
18.7M
  JDIMENSION start_col;
199
18.7M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
18.7M
  JBLOCKROW buffer_ptr;
201
18.7M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
45.8M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
27.1M
    compptr = cinfo->cur_comp_info[ci];
206
27.1M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
27.1M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
27.1M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
27.1M
       (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
27.1M
  }
215
216
  /* Loop to process one whole iMCU row */
217
63.7M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
45.0M
       yoffset++) {
219
175M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
130M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
130M
      blkn = 0;                 /* index of current DCT block within MCU */
223
287M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
157M
        compptr = cinfo->cur_comp_info[ci];
225
157M
        start_col = MCU_col_num * compptr->MCU_width;
226
326M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
169M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
361M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
192M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
192M
          }
231
169M
        }
232
157M
      }
233
130M
      if (!cinfo->entropy->insufficient_data)
234
83.1M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
130M
      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
130M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
45.0M
    coef->MCU_ctr = 0;
245
45.0M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
18.7M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
17.2M
    start_iMCU_row(cinfo);
249
17.2M
    return JPEG_ROW_COMPLETED;
250
17.2M
  }
251
  /* Completed the scan */
252
1.41M
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
1.41M
  return JPEG_SCAN_COMPLETED;
254
18.7M
}
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.62M
{
268
1.62M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
1.62M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
1.62M
  JDIMENSION block_num;
271
1.62M
  int ci, block_row, block_rows;
272
1.62M
  JBLOCKARRAY buffer;
273
1.62M
  JBLOCKROW buffer_ptr;
274
1.62M
  _JSAMPARRAY output_ptr;
275
1.62M
  JDIMENSION output_col;
276
1.62M
  jpeg_component_info *compptr;
277
1.62M
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
1.62M
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
1.62M
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
1.62M
          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.19M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
4.57M
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
4.57M
    if (!compptr->component_needed)
292
518k
      continue;
293
    /* Align the virtual buffer for this component. */
294
4.05M
    buffer = (*cinfo->mem->access_virt_barray)
295
4.05M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
4.05M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
4.05M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
4.05M
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
3.97M
      block_rows = compptr->v_samp_factor;
301
81.1k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
81.1k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
81.1k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
81.1k
    }
306
4.05M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
4.05M
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
10.3M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
6.27M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
6.27M
      output_col = 0;
312
6.27M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
32.1M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
25.8M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
25.8M
                        output_col);
316
25.8M
        buffer_ptr++;
317
25.8M
        output_col += compptr->_DCT_scaled_size;
318
25.8M
      }
319
6.27M
      output_ptr += compptr->_DCT_scaled_size;
320
6.27M
    }
321
4.05M
  }
322
323
1.62M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
1.59M
    return JPEG_ROW_COMPLETED;
325
30.4k
  return JPEG_SCAN_COMPLETED;
326
1.62M
}
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
5.69M
#define Q01_POS  1
342
5.69M
#define Q10_POS  8
343
5.69M
#define Q20_POS  16
344
5.68M
#define Q11_POS  9
345
5.68M
#define Q02_POS  2
346
4.30M
#define Q03_POS  3
347
4.30M
#define Q12_POS  10
348
4.30M
#define Q21_POS  17
349
4.29M
#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
51.5k
{
362
51.5k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
51.5k
  boolean smoothing_useful = FALSE;
364
51.5k
  int ci, coefi;
365
51.5k
  jpeg_component_info *compptr;
366
51.5k
  JQUANT_TBL *qtable;
367
51.5k
  int *coef_bits, *prev_coef_bits;
368
51.5k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
51.5k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
6.00k
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
45.5k
  if (coef->coef_bits_latch == NULL)
375
45.5k
    coef->coef_bits_latch = (int *)
376
45.5k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
45.5k
                                  cinfo->num_components * 2 *
378
45.5k
                                  (SAVED_COEFS * sizeof(int)));
379
45.5k
  coef_bits_latch = coef->coef_bits_latch;
380
45.5k
  prev_coef_bits_latch =
381
45.5k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
113k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
92.0k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
92.0k
    if ((qtable = compptr->quant_table) == NULL)
387
7.20k
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
84.8k
    if (qtable->quantval[0] == 0 ||
390
84.8k
        qtable->quantval[Q01_POS] == 0 ||
391
84.8k
        qtable->quantval[Q10_POS] == 0 ||
392
84.8k
        qtable->quantval[Q20_POS] == 0 ||
393
84.8k
        qtable->quantval[Q11_POS] == 0 ||
394
84.8k
        qtable->quantval[Q02_POS] == 0 ||
395
84.8k
        qtable->quantval[Q03_POS] == 0 ||
396
84.8k
        qtable->quantval[Q12_POS] == 0 ||
397
84.8k
        qtable->quantval[Q21_POS] == 0 ||
398
84.8k
        qtable->quantval[Q30_POS] == 0)
399
16.6k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
68.2k
    coef_bits = cinfo->coef_bits[ci];
402
68.2k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
68.2k
    if (coef_bits[0] < 0)
404
501
      return FALSE;
405
67.7k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
677k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
609k
      if (cinfo->input_scan_number > 1)
409
399k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
209k
      else
411
209k
        prev_coef_bits_latch[coefi] = -1;
412
609k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
609k
      if (coef_bits[coefi] != 0)
414
582k
        smoothing_useful = TRUE;
415
609k
    }
416
67.7k
    coef_bits_latch += SAVED_COEFS;
417
67.7k
    prev_coef_bits_latch += SAVED_COEFS;
418
67.7k
  }
419
420
21.2k
  return smoothing_useful;
421
45.5k
}
422
423
424
/*
425
 * Variant of decompress_data for use when doing block smoothing.
426
 */
427
428
METHODDEF(int)
429
decompress_smooth_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
430
2.08M
{
431
2.08M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
2.08M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
2.08M
  JDIMENSION block_num, last_block_column;
434
2.08M
  int ci, block_row, block_rows, access_rows, image_block_row,
435
2.08M
    image_block_rows;
436
2.08M
  JBLOCKARRAY buffer;
437
2.08M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
2.08M
  JBLOCKROW next_block_row, next_next_block_row;
439
2.08M
  _JSAMPARRAY output_ptr;
440
2.08M
  JDIMENSION output_col;
441
2.08M
  jpeg_component_info *compptr;
442
2.08M
  _inverse_DCT_method_ptr inverse_DCT;
443
2.08M
  boolean change_dc;
444
2.08M
  JCOEF *workspace;
445
2.08M
  int *coef_bits;
446
2.08M
  JQUANT_TBL *quanttbl;
447
2.08M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
2.08M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
2.08M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
2.08M
      DC25;
451
2.08M
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
2.08M
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
2.08M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
2.08M
         !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
8.04M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
5.96M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
5.96M
    if (!compptr->component_needed)
478
352k
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
5.61M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
5.50M
      block_rows = compptr->v_samp_factor;
482
5.50M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
5.50M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
46.1k
      block_rows = compptr->v_samp_factor;
485
46.1k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
56.3k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
56.3k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
56.3k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
56.3k
      access_rows = block_rows; /* this iMCU row only */
491
56.3k
    }
492
    /* Align the virtual buffer for this component. */
493
5.61M
    if (cinfo->output_iMCU_row > 1) {
494
5.50M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
5.50M
      buffer = (*cinfo->mem->access_virt_barray)
496
5.50M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
5.50M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
5.50M
         (JDIMENSION)access_rows, FALSE);
499
5.50M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
5.50M
    } else if (cinfo->output_iMCU_row > 0) {
501
46.1k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
46.1k
      buffer = (*cinfo->mem->access_virt_barray)
503
46.1k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
46.1k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
46.1k
         (JDIMENSION)access_rows, FALSE);
506
46.1k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
56.3k
    } else {
508
56.3k
      buffer = (*cinfo->mem->access_virt_barray)
509
56.3k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
56.3k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
56.3k
    }
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
5.61M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
551k
      coef_bits =
518
551k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
5.05M
    else
520
5.05M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
5.61M
    change_dc =
524
5.61M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
5.61M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
5.61M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
5.61M
    quanttbl = compptr->quant_table;
529
5.61M
    Q00 = quanttbl->quantval[0];
530
5.61M
    Q01 = quanttbl->quantval[Q01_POS];
531
5.61M
    Q10 = quanttbl->quantval[Q10_POS];
532
5.61M
    Q20 = quanttbl->quantval[Q20_POS];
533
5.61M
    Q11 = quanttbl->quantval[Q11_POS];
534
5.61M
    Q02 = quanttbl->quantval[Q02_POS];
535
5.61M
    if (change_dc) {
536
4.22M
      Q03 = quanttbl->quantval[Q03_POS];
537
4.22M
      Q12 = quanttbl->quantval[Q12_POS];
538
4.22M
      Q21 = quanttbl->quantval[Q21_POS];
539
4.22M
      Q30 = quanttbl->quantval[Q30_POS];
540
4.22M
    }
541
5.61M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
5.61M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
5.61M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
12.6M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
6.99M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
6.99M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
6.99M
      if (image_block_row > 0)
550
6.93M
        prev_block_row =
551
6.93M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
56.3k
      else
553
56.3k
        prev_block_row = buffer_ptr;
554
555
6.99M
      if (image_block_row > 1)
556
6.88M
        prev_prev_block_row =
557
6.88M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
106k
      else
559
106k
        prev_prev_block_row = prev_block_row;
560
561
6.99M
      if (image_block_row < image_block_rows - 1)
562
6.93M
        next_block_row =
563
6.93M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
56.3k
      else
565
56.3k
        next_block_row = buffer_ptr;
566
567
6.99M
      if (image_block_row < image_block_rows - 2)
568
6.89M
        next_next_block_row =
569
6.89M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
101k
      else
571
101k
        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
6.99M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
6.99M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
6.99M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
6.99M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
6.99M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
6.99M
      output_col = 0;
582
6.99M
      last_block_column = compptr->width_in_blocks - 1;
583
6.99M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
37.2M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
30.2M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
30.2M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
30.2M
            block_num < last_block_column) {
590
5.66M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
5.66M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
5.66M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
5.66M
          DC19 = DC20 = (int)next_block_row[1][0];
594
5.66M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
5.66M
        }
596
30.2M
        if (block_num + 1 < last_block_column) {
597
17.5M
          DC05 = (int)prev_prev_block_row[2][0];
598
17.5M
          DC10 = (int)prev_block_row[2][0];
599
17.5M
          DC15 = (int)buffer_ptr[2][0];
600
17.5M
          DC20 = (int)next_block_row[2][0];
601
17.5M
          DC25 = (int)next_next_block_row[2][0];
602
17.5M
        }
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
30.2M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
28.6M
          num = Q00 * (change_dc ?
616
22.0M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
22.0M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
22.0M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
22.0M
                 DC21 - DC22 + DC24 + DC25) :
620
28.6M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
28.6M
          if (num >= 0) {
622
20.0M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
20.0M
            if (Al > 0 && pred >= (1 << Al))
624
654k
              pred = (1 << Al) - 1;
625
20.0M
          } else {
626
8.64M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
8.64M
            if (Al > 0 && pred >= (1 << Al))
628
202k
              pred = (1 << Al) - 1;
629
8.64M
            pred = -pred;
630
8.64M
          }
631
28.6M
          workspace[1] = (JCOEF)pred;
632
28.6M
        }
633
        /* AC10 */
634
30.2M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
28.3M
          num = Q00 * (change_dc ?
636
22.0M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
22.0M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
22.0M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
22.0M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
28.3M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
28.3M
          if (num >= 0) {
642
19.8M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
19.8M
            if (Al > 0 && pred >= (1 << Al))
644
1.93M
              pred = (1 << Al) - 1;
645
19.8M
          } else {
646
8.48M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
8.48M
            if (Al > 0 && pred >= (1 << Al))
648
984k
              pred = (1 << Al) - 1;
649
8.48M
            pred = -pred;
650
8.48M
          }
651
28.3M
          workspace[8] = (JCOEF)pred;
652
28.3M
        }
653
        /* AC20 */
654
30.2M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
28.4M
          num = Q00 * (change_dc ?
656
22.0M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
22.0M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
28.4M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
28.4M
          if (num >= 0) {
660
17.5M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
17.5M
            if (Al > 0 && pred >= (1 << Al))
662
719k
              pred = (1 << Al) - 1;
663
17.5M
          } else {
664
10.9M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
10.9M
            if (Al > 0 && pred >= (1 << Al))
666
729k
              pred = (1 << Al) - 1;
667
10.9M
            pred = -pred;
668
10.9M
          }
669
28.4M
          workspace[16] = (JCOEF)pred;
670
28.4M
        }
671
        /* AC11 */
672
30.2M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
28.5M
          num = Q00 * (change_dc ?
674
22.0M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
22.0M
                 9 * DC19 + DC21 - DC25) :
676
28.5M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
6.46M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
28.5M
          if (num >= 0) {
679
21.2M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
21.2M
            if (Al > 0 && pred >= (1 << Al))
681
247k
              pred = (1 << Al) - 1;
682
21.2M
          } else {
683
7.27M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
7.27M
            if (Al > 0 && pred >= (1 << Al))
685
242k
              pred = (1 << Al) - 1;
686
7.27M
            pred = -pred;
687
7.27M
          }
688
28.5M
          workspace[9] = (JCOEF)pred;
689
28.5M
        }
690
        /* AC02 */
691
30.2M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
28.5M
          num = Q00 * (change_dc ?
693
22.0M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
22.0M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
28.5M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
28.5M
          if (num >= 0) {
697
17.3M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
17.3M
            if (Al > 0 && pred >= (1 << Al))
699
417k
              pred = (1 << Al) - 1;
700
17.3M
          } else {
701
11.2M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
11.2M
            if (Al > 0 && pred >= (1 << Al))
703
436k
              pred = (1 << Al) - 1;
704
11.2M
            pred = -pred;
705
11.2M
          }
706
28.5M
          workspace[2] = (JCOEF)pred;
707
28.5M
        }
708
30.2M
        if (change_dc) {
709
          /* AC03 */
710
22.0M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
22.0M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
22.0M
            if (num >= 0) {
713
16.4M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
16.4M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
16.4M
            } else {
717
5.65M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
5.65M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
5.65M
              pred = -pred;
721
5.65M
            }
722
22.0M
            workspace[3] = (JCOEF)pred;
723
22.0M
          }
724
          /* AC12 */
725
22.0M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
22.0M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
22.0M
            if (num >= 0) {
728
12.0M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
12.0M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
12.0M
            } else {
732
10.0M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
10.0M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
10.0M
              pred = -pred;
736
10.0M
            }
737
22.0M
            workspace[10] = (JCOEF)pred;
738
22.0M
          }
739
          /* AC21 */
740
22.0M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
22.0M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
22.0M
            if (num >= 0) {
743
12.8M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
12.8M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
12.8M
            } else {
747
9.23M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
9.23M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
9.23M
              pred = -pred;
751
9.23M
            }
752
22.0M
            workspace[17] = (JCOEF)pred;
753
22.0M
          }
754
          /* AC30 */
755
22.0M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
22.0M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
22.0M
            if (num >= 0) {
758
16.0M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
16.0M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
16.0M
            } else {
762
6.00M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
6.00M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
6.00M
              pred = -pred;
766
6.00M
            }
767
22.0M
            workspace[24] = (JCOEF)pred;
768
22.0M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
22.0M
          num = Q00 *
773
22.0M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
22.0M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
22.0M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
22.0M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
22.0M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
22.0M
          if (num >= 0) {
779
10.8M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
11.2M
          } else {
781
11.2M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
11.2M
            pred = -pred;
783
11.2M
          }
784
22.0M
          workspace[0] = (JCOEF)pred;
785
22.0M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
30.2M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
30.2M
                        output_col);
790
        /* Advance for next column */
791
30.2M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
30.2M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
30.2M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
30.2M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
30.2M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
30.2M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
30.2M
          prev_prev_block_row++, next_next_block_row++;
798
30.2M
        output_col += compptr->_DCT_scaled_size;
799
30.2M
      }
800
6.99M
      output_ptr += compptr->_DCT_scaled_size;
801
6.99M
    }
802
5.61M
  }
803
804
2.08M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
2.06M
    return JPEG_ROW_COMPLETED;
806
21.1k
  return JPEG_SCAN_COMPLETED;
807
2.08M
}
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
130k
{
819
130k
  my_coef_ptr coef;
820
821
130k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
130k
  coef = (my_coef_ptr)
825
130k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
130k
                                sizeof(my_coef_controller));
827
130k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
828
130k
  coef->pub.start_input_pass = start_input_pass;
829
130k
  coef->pub.start_output_pass = start_output_pass;
830
130k
#ifdef BLOCK_SMOOTHING_SUPPORTED
831
130k
  coef->coef_bits_latch = NULL;
832
130k
#endif
833
834
  /* Create the coefficient buffer. */
835
130k
  if (need_full_buffer) {
836
89.9k
#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
89.9k
    int ci, access_rows;
841
89.9k
    jpeg_component_info *compptr;
842
843
354k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
844
264k
         ci++, compptr++) {
845
264k
      access_rows = compptr->v_samp_factor;
846
264k
#ifdef BLOCK_SMOOTHING_SUPPORTED
847
      /* If block smoothing could be used, need a bigger window */
848
264k
      if (cinfo->progressive_mode)
849
198k
        access_rows *= 5;
850
264k
#endif
851
264k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
852
264k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
853
264k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
854
264k
                               (long)compptr->h_samp_factor),
855
264k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
856
264k
                               (long)compptr->v_samp_factor),
857
264k
         (JDIMENSION)access_rows);
858
264k
    }
859
89.9k
    coef->pub.consume_data = consume_data;
860
89.9k
    coef->pub._decompress_data = decompress_data;
861
89.9k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
862
#else
863
    ERREXIT(cinfo, JERR_NOT_COMPILED);
864
#endif
865
89.9k
  } else {
866
    /* We only need a single-MCU buffer. */
867
40.1k
    JBLOCKROW buffer;
868
40.1k
    int i;
869
870
40.1k
    buffer = (JBLOCKROW)
871
40.1k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
872
40.1k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
873
441k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
874
401k
      coef->MCU_buffer[i] = buffer + i;
875
401k
    }
876
40.1k
    coef->pub.consume_data = dummy_consume_data;
877
40.1k
    coef->pub._decompress_data = decompress_onepass;
878
40.1k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
879
40.1k
  }
880
881
  /* Allocate the workspace buffer */
882
130k
  coef->workspace = (JCOEF *)
883
130k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
884
130k
                                sizeof(JCOEF) * DCTSIZE2);
885
130k
}
j12init_d_coef_controller
Line
Count
Source
818
42.5k
{
819
42.5k
  my_coef_ptr coef;
820
821
42.5k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
42.5k
  coef = (my_coef_ptr)
825
42.5k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
42.5k
                                sizeof(my_coef_controller));
827
42.5k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
828
42.5k
  coef->pub.start_input_pass = start_input_pass;
829
42.5k
  coef->pub.start_output_pass = start_output_pass;
830
42.5k
#ifdef BLOCK_SMOOTHING_SUPPORTED
831
42.5k
  coef->coef_bits_latch = NULL;
832
42.5k
#endif
833
834
  /* Create the coefficient buffer. */
835
42.5k
  if (need_full_buffer) {
836
24.9k
#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
24.9k
    int ci, access_rows;
841
24.9k
    jpeg_component_info *compptr;
842
843
96.8k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
844
71.8k
         ci++, compptr++) {
845
71.8k
      access_rows = compptr->v_samp_factor;
846
71.8k
#ifdef BLOCK_SMOOTHING_SUPPORTED
847
      /* If block smoothing could be used, need a bigger window */
848
71.8k
      if (cinfo->progressive_mode)
849
64.8k
        access_rows *= 5;
850
71.8k
#endif
851
71.8k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
852
71.8k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
853
71.8k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
854
71.8k
                               (long)compptr->h_samp_factor),
855
71.8k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
856
71.8k
                               (long)compptr->v_samp_factor),
857
71.8k
         (JDIMENSION)access_rows);
858
71.8k
    }
859
24.9k
    coef->pub.consume_data = consume_data;
860
24.9k
    coef->pub._decompress_data = decompress_data;
861
24.9k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
862
#else
863
    ERREXIT(cinfo, JERR_NOT_COMPILED);
864
#endif
865
24.9k
  } else {
866
    /* We only need a single-MCU buffer. */
867
17.5k
    JBLOCKROW buffer;
868
17.5k
    int i;
869
870
17.5k
    buffer = (JBLOCKROW)
871
17.5k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
872
17.5k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
873
193k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
874
175k
      coef->MCU_buffer[i] = buffer + i;
875
175k
    }
876
17.5k
    coef->pub.consume_data = dummy_consume_data;
877
17.5k
    coef->pub._decompress_data = decompress_onepass;
878
17.5k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
879
17.5k
  }
880
881
  /* Allocate the workspace buffer */
882
42.5k
  coef->workspace = (JCOEF *)
883
42.5k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
884
42.5k
                                sizeof(JCOEF) * DCTSIZE2);
885
42.5k
}
jinit_d_coef_controller
Line
Count
Source
818
87.5k
{
819
87.5k
  my_coef_ptr coef;
820
821
87.5k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
87.5k
  coef = (my_coef_ptr)
825
87.5k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
87.5k
                                sizeof(my_coef_controller));
827
87.5k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
828
87.5k
  coef->pub.start_input_pass = start_input_pass;
829
87.5k
  coef->pub.start_output_pass = start_output_pass;
830
87.5k
#ifdef BLOCK_SMOOTHING_SUPPORTED
831
87.5k
  coef->coef_bits_latch = NULL;
832
87.5k
#endif
833
834
  /* Create the coefficient buffer. */
835
87.5k
  if (need_full_buffer) {
836
64.9k
#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
64.9k
    int ci, access_rows;
841
64.9k
    jpeg_component_info *compptr;
842
843
257k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
844
192k
         ci++, compptr++) {
845
192k
      access_rows = compptr->v_samp_factor;
846
192k
#ifdef BLOCK_SMOOTHING_SUPPORTED
847
      /* If block smoothing could be used, need a bigger window */
848
192k
      if (cinfo->progressive_mode)
849
133k
        access_rows *= 5;
850
192k
#endif
851
192k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
852
192k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
853
192k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
854
192k
                               (long)compptr->h_samp_factor),
855
192k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
856
192k
                               (long)compptr->v_samp_factor),
857
192k
         (JDIMENSION)access_rows);
858
192k
    }
859
64.9k
    coef->pub.consume_data = consume_data;
860
64.9k
    coef->pub._decompress_data = decompress_data;
861
64.9k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
862
#else
863
    ERREXIT(cinfo, JERR_NOT_COMPILED);
864
#endif
865
64.9k
  } else {
866
    /* We only need a single-MCU buffer. */
867
22.5k
    JBLOCKROW buffer;
868
22.5k
    int i;
869
870
22.5k
    buffer = (JBLOCKROW)
871
22.5k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
872
22.5k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
873
247k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
874
225k
      coef->MCU_buffer[i] = buffer + i;
875
225k
    }
876
22.5k
    coef->pub.consume_data = dummy_consume_data;
877
22.5k
    coef->pub._decompress_data = decompress_onepass;
878
22.5k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
879
22.5k
  }
880
881
  /* Allocate the workspace buffer */
882
87.5k
  coef->workspace = (JCOEF *)
883
87.5k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
884
87.5k
                                sizeof(JCOEF) * DCTSIZE2);
885
87.5k
}