Coverage Report

Created: 2026-03-12 08:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libjpeg-turbo.3.0.x/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-2024, 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
77.9k
{
48
77.9k
  cinfo->input_iMCU_row = 0;
49
77.9k
  start_iMCU_row(cinfo);
50
77.9k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
15.4k
{
60
15.4k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
15.4k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
62
63
  /* If multipass, check to see whether to use block smoothing on this pass */
64
15.4k
  if (coef->pub.coef_arrays != NULL) {
65
12.1k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
5.27k
      coef->pub._decompress_data = decompress_smooth_data;
67
6.88k
    else
68
6.88k
      coef->pub._decompress_data = decompress_data;
69
12.1k
  }
70
15.4k
#endif
71
15.4k
  cinfo->output_iMCU_row = 0;
72
15.4k
}
73
74
75
/*
76
 * Decompress and return some data in the single-pass case.
77
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
78
 * Input and output must run in lockstep since we have only a one-MCU buffer.
79
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
80
 *
81
 * NB: output_buf contains a plane for each component in image,
82
 * which we index according to the component's SOF position.
83
 */
84
85
METHODDEF(int)
86
decompress_onepass(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
87
1.32M
{
88
1.32M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
1.32M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
1.32M
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
1.32M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
1.32M
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
1.32M
  _JSAMPARRAY output_ptr;
94
1.32M
  JDIMENSION start_col, output_col;
95
1.32M
  jpeg_component_info *compptr;
96
1.32M
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
4.11M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
2.78M
       yoffset++) {
101
15.2M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
12.4M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
12.4M
      jzero_far((void *)coef->MCU_buffer[0],
105
12.4M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
12.4M
      if (!cinfo->entropy->insufficient_data)
107
5.37M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
12.4M
      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
12.4M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
12.4M
          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
12.4M
        blkn = 0;               /* index of current DCT block within MCU */
126
25.5M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
13.0M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
13.0M
          if (!compptr->component_needed) {
130
91.7k
            blkn += compptr->MCU_blocks;
131
91.7k
            continue;
132
91.7k
          }
133
13.0M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
13.0M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
10.1M
                         compptr->MCU_width : compptr->last_col_width;
136
13.0M
          output_ptr = output_buf[compptr->component_index] +
137
13.0M
                       yoffset * compptr->_DCT_scaled_size;
138
13.0M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
13.0M
                      compptr->MCU_sample_width;
140
26.3M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
13.3M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
13.2M
                yoffset + yindex < compptr->last_row_height) {
143
13.2M
              output_col = start_col;
144
26.9M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
13.6M
                (*inverse_DCT) (cinfo, compptr,
146
13.6M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
13.6M
                                output_ptr, output_col);
148
13.6M
                output_col += compptr->_DCT_scaled_size;
149
13.6M
              }
150
13.2M
            }
151
13.3M
            blkn += compptr->MCU_width;
152
13.3M
            output_ptr += compptr->_DCT_scaled_size;
153
13.3M
          }
154
13.0M
        }
155
12.4M
      }
156
12.4M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
2.78M
    coef->MCU_ctr = 0;
159
2.78M
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
1.32M
  cinfo->output_iMCU_row++;
162
1.32M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
1.32M
    start_iMCU_row(cinfo);
164
1.32M
    return JPEG_ROW_COMPLETED;
165
1.32M
  }
166
  /* Completed the scan */
167
3.30k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
3.30k
  return JPEG_SCAN_COMPLETED;
169
1.32M
}
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
21.8M
{
195
21.8M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
21.8M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
21.8M
  int blkn, ci, xindex, yindex, yoffset;
198
21.8M
  JDIMENSION start_col;
199
21.8M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
21.8M
  JBLOCKROW buffer_ptr;
201
21.8M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
55.1M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
33.3M
    compptr = cinfo->cur_comp_info[ci];
206
33.3M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
33.3M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
33.3M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
33.3M
       (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
33.3M
  }
215
216
  /* Loop to process one whole iMCU row */
217
56.5M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
34.7M
       yoffset++) {
219
300M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
265M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
265M
      blkn = 0;                 /* index of current DCT block within MCU */
223
583M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
317M
        compptr = cinfo->cur_comp_info[ci];
225
317M
        start_col = MCU_col_num * compptr->MCU_width;
226
670M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
353M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
784M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
431M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
431M
          }
231
353M
        }
232
317M
      }
233
265M
      if (!cinfo->entropy->insufficient_data)
234
177M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
265M
      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
265M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
34.7M
    coef->MCU_ctr = 0;
245
34.7M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
21.8M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
21.7M
    start_iMCU_row(cinfo);
249
21.7M
    return JPEG_ROW_COMPLETED;
250
21.7M
  }
251
  /* Completed the scan */
252
73.8k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
73.8k
  return JPEG_SCAN_COMPLETED;
254
21.8M
}
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
2.00M
{
268
2.00M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
2.00M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
2.00M
  JDIMENSION block_num;
271
2.00M
  int ci, block_row, block_rows;
272
2.00M
  JBLOCKARRAY buffer;
273
2.00M
  JBLOCKROW buffer_ptr;
274
2.00M
  _JSAMPARRAY output_ptr;
275
2.00M
  JDIMENSION output_col;
276
2.00M
  jpeg_component_info *compptr;
277
2.00M
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
2.00M
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
2.00M
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
2.00M
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
283
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
284
0
      return JPEG_SUSPENDED;
285
0
  }
286
287
  /* OK, output from the virtual arrays. */
288
5.58M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
3.58M
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
3.58M
    if (!compptr->component_needed)
292
288k
      continue;
293
    /* Align the virtual buffer for this component. */
294
3.29M
    buffer = (*cinfo->mem->access_virt_barray)
295
3.29M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
3.29M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
3.29M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
3.29M
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
3.28M
      block_rows = compptr->v_samp_factor;
301
11.7k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
11.7k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
11.7k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
11.7k
    }
306
3.29M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
3.29M
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
7.81M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
4.52M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
4.52M
      output_col = 0;
312
4.52M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
42.2M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
37.7M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
37.7M
                        output_col);
316
37.7M
        buffer_ptr++;
317
37.7M
        output_col += compptr->_DCT_scaled_size;
318
37.7M
      }
319
4.52M
      output_ptr += compptr->_DCT_scaled_size;
320
4.52M
    }
321
3.29M
  }
322
323
2.00M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
1.99M
    return JPEG_ROW_COMPLETED;
325
6.18k
  return JPEG_SCAN_COMPLETED;
326
2.00M
}
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
3.60M
#define Q01_POS  1
342
3.59M
#define Q10_POS  8
343
3.59M
#define Q20_POS  16
344
3.59M
#define Q11_POS  9
345
3.59M
#define Q02_POS  2
346
2.42M
#define Q03_POS  3
347
2.42M
#define Q12_POS  10
348
2.42M
#define Q21_POS  17
349
2.42M
#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
12.1k
{
362
12.1k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
12.1k
  boolean smoothing_useful = FALSE;
364
12.1k
  int ci, coefi;
365
12.1k
  jpeg_component_info *compptr;
366
12.1k
  JQUANT_TBL *qtable;
367
12.1k
  int *coef_bits, *prev_coef_bits;
368
12.1k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
12.1k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
1.94k
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
10.2k
  if (coef->coef_bits_latch == NULL)
375
10.2k
    coef->coef_bits_latch = (int *)
376
10.2k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
10.2k
                                  cinfo->num_components * 2 *
378
10.2k
                                  (SAVED_COEFS * sizeof(int)));
379
10.2k
  coef_bits_latch = coef->coef_bits_latch;
380
10.2k
  prev_coef_bits_latch =
381
10.2k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
17.4k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
12.1k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
12.1k
    if ((qtable = compptr->quant_table) == NULL)
387
1.22k
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
10.8k
    if (qtable->quantval[0] == 0 ||
390
10.4k
        qtable->quantval[Q01_POS] == 0 ||
391
10.0k
        qtable->quantval[Q10_POS] == 0 ||
392
9.79k
        qtable->quantval[Q20_POS] == 0 ||
393
9.54k
        qtable->quantval[Q11_POS] == 0 ||
394
9.25k
        qtable->quantval[Q02_POS] == 0 ||
395
9.02k
        qtable->quantval[Q03_POS] == 0 ||
396
8.73k
        qtable->quantval[Q12_POS] == 0 ||
397
8.51k
        qtable->quantval[Q21_POS] == 0 ||
398
8.17k
        qtable->quantval[Q30_POS] == 0)
399
2.98k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
7.91k
    coef_bits = cinfo->coef_bits[ci];
402
7.91k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
7.91k
    if (coef_bits[0] < 0)
404
717
      return FALSE;
405
7.19k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
71.9k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
64.7k
      if (cinfo->input_scan_number > 1)
409
35.9k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
28.8k
      else
411
28.8k
        prev_coef_bits_latch[coefi] = -1;
412
64.7k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
64.7k
      if (coef_bits[coefi] != 0)
414
62.0k
        smoothing_useful = TRUE;
415
64.7k
    }
416
7.19k
    coef_bits_latch += SAVED_COEFS;
417
7.19k
    prev_coef_bits_latch += SAVED_COEFS;
418
7.19k
  }
419
420
5.28k
  return smoothing_useful;
421
10.2k
}
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.28M
{
431
2.28M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
2.28M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
2.28M
  JDIMENSION block_num, last_block_column;
434
2.28M
  int ci, block_row, block_rows, access_rows, image_block_row,
435
2.28M
    image_block_rows;
436
2.28M
  JBLOCKARRAY buffer;
437
2.28M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
2.28M
  JBLOCKROW next_block_row, next_next_block_row;
439
2.28M
  _JSAMPARRAY output_ptr;
440
2.28M
  JDIMENSION output_col;
441
2.28M
  jpeg_component_info *compptr;
442
2.28M
  _inverse_DCT_method_ptr inverse_DCT;
443
2.28M
  boolean change_dc;
444
2.28M
  JCOEF *workspace;
445
2.28M
  int *coef_bits;
446
2.28M
  JQUANT_TBL *quanttbl;
447
2.28M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
2.28M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
2.28M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
2.28M
      DC25;
451
2.28M
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
2.28M
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
2.28M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
2.28M
         !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
6.24M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
3.95M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
3.95M
    if (!compptr->component_needed)
478
367k
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
3.58M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
3.57M
      block_rows = compptr->v_samp_factor;
482
3.57M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
3.57M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
5.65k
      block_rows = compptr->v_samp_factor;
485
5.65k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
6.33k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
6.33k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
6.33k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
6.33k
      access_rows = block_rows; /* this iMCU row only */
491
6.33k
    }
492
    /* Align the virtual buffer for this component. */
493
3.58M
    if (cinfo->output_iMCU_row > 1) {
494
3.57M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
3.57M
      buffer = (*cinfo->mem->access_virt_barray)
496
3.57M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
3.57M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
3.57M
         (JDIMENSION)access_rows, FALSE);
499
3.57M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
3.57M
    } else if (cinfo->output_iMCU_row > 0) {
501
5.65k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
5.65k
      buffer = (*cinfo->mem->access_virt_barray)
503
5.65k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
5.65k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
5.65k
         (JDIMENSION)access_rows, FALSE);
506
5.65k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
6.33k
    } else {
508
6.33k
      buffer = (*cinfo->mem->access_virt_barray)
509
6.33k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
6.33k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
6.33k
    }
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
3.58M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
2.00M
      coef_bits =
518
2.00M
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
1.58M
    else
520
1.58M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
3.58M
    change_dc =
524
3.58M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
2.59M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
2.48M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
3.58M
    quanttbl = compptr->quant_table;
529
3.58M
    Q00 = quanttbl->quantval[0];
530
3.58M
    Q01 = quanttbl->quantval[Q01_POS];
531
3.58M
    Q10 = quanttbl->quantval[Q10_POS];
532
3.58M
    Q20 = quanttbl->quantval[Q20_POS];
533
3.58M
    Q11 = quanttbl->quantval[Q11_POS];
534
3.58M
    Q02 = quanttbl->quantval[Q02_POS];
535
3.58M
    if (change_dc) {
536
2.41M
      Q03 = quanttbl->quantval[Q03_POS];
537
2.41M
      Q12 = quanttbl->quantval[Q12_POS];
538
2.41M
      Q21 = quanttbl->quantval[Q21_POS];
539
2.41M
      Q30 = quanttbl->quantval[Q30_POS];
540
2.41M
    }
541
3.58M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
3.58M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
3.58M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
9.38M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
5.79M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
5.79M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
5.79M
      if (image_block_row > 0)
550
5.78M
        prev_block_row =
551
5.78M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
6.33k
      else
553
6.33k
        prev_block_row = buffer_ptr;
554
555
5.79M
      if (image_block_row > 1)
556
5.78M
        prev_prev_block_row =
557
5.78M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
12.4k
      else
559
12.4k
        prev_prev_block_row = prev_block_row;
560
561
5.79M
      if (image_block_row < image_block_rows - 1)
562
5.78M
        next_block_row =
563
5.78M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
6.33k
      else
565
6.33k
        next_block_row = buffer_ptr;
566
567
5.79M
      if (image_block_row < image_block_rows - 2)
568
5.78M
        next_next_block_row =
569
5.78M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
10.9k
      else
571
10.9k
        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
5.79M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
5.79M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
5.79M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
5.79M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
5.79M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
5.79M
      output_col = 0;
582
5.79M
      last_block_column = compptr->width_in_blocks - 1;
583
5.79M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
45.1M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
39.3M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
39.3M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
5.79M
            block_num < last_block_column) {
590
3.72M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
3.72M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
3.72M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
3.72M
          DC19 = DC20 = (int)next_block_row[1][0];
594
3.72M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
3.72M
        }
596
39.3M
        if (block_num + 1 < last_block_column) {
597
29.8M
          DC05 = (int)prev_prev_block_row[2][0];
598
29.8M
          DC10 = (int)prev_block_row[2][0];
599
29.8M
          DC15 = (int)buffer_ptr[2][0];
600
29.8M
          DC20 = (int)next_block_row[2][0];
601
29.8M
          DC25 = (int)next_next_block_row[2][0];
602
29.8M
        }
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
39.3M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
36.5M
          num = Q00 * (change_dc ?
616
22.5M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
22.5M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
22.5M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
22.5M
                 DC21 - DC22 + DC24 + DC25) :
620
36.5M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
36.5M
          if (num >= 0) {
622
26.5M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
26.5M
            if (Al > 0 && pred >= (1 << Al))
624
2.77M
              pred = (1 << Al) - 1;
625
26.5M
          } else {
626
9.97M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
9.97M
            if (Al > 0 && pred >= (1 << Al))
628
2.20M
              pred = (1 << Al) - 1;
629
9.97M
            pred = -pred;
630
9.97M
          }
631
36.5M
          workspace[1] = (JCOEF)pred;
632
36.5M
        }
633
        /* AC10 */
634
39.3M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
36.5M
          num = Q00 * (change_dc ?
636
22.5M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
22.5M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
22.5M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
22.5M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
36.5M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
36.5M
          if (num >= 0) {
642
24.8M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
24.8M
            if (Al > 0 && pred >= (1 << Al))
644
4.61M
              pred = (1 << Al) - 1;
645
24.8M
          } else {
646
11.7M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
11.7M
            if (Al > 0 && pred >= (1 << Al))
648
4.00M
              pred = (1 << Al) - 1;
649
11.7M
            pred = -pred;
650
11.7M
          }
651
36.5M
          workspace[8] = (JCOEF)pred;
652
36.5M
        }
653
        /* AC20 */
654
39.3M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
37.1M
          num = Q00 * (change_dc ?
656
22.5M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
22.5M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
37.1M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
37.1M
          if (num >= 0) {
660
22.8M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
22.8M
            if (Al > 0 && pred >= (1 << Al))
662
3.58M
              pred = (1 << Al) - 1;
663
22.8M
          } else {
664
14.3M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
14.3M
            if (Al > 0 && pred >= (1 << Al))
666
3.62M
              pred = (1 << Al) - 1;
667
14.3M
            pred = -pred;
668
14.3M
          }
669
37.1M
          workspace[16] = (JCOEF)pred;
670
37.1M
        }
671
        /* AC11 */
672
39.3M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
37.3M
          num = Q00 * (change_dc ?
674
22.5M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
22.5M
                 9 * DC19 + DC21 - DC25) :
676
37.3M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
14.8M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
37.3M
          if (num >= 0) {
679
28.1M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
28.1M
            if (Al > 0 && pred >= (1 << Al))
681
1.77M
              pred = (1 << Al) - 1;
682
28.1M
          } else {
683
9.27M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
9.27M
            if (Al > 0 && pred >= (1 << Al))
685
1.78M
              pred = (1 << Al) - 1;
686
9.27M
            pred = -pred;
687
9.27M
          }
688
37.3M
          workspace[9] = (JCOEF)pred;
689
37.3M
        }
690
        /* AC02 */
691
39.3M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
37.2M
          num = Q00 * (change_dc ?
693
22.5M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
22.5M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
37.2M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
37.2M
          if (num >= 0) {
697
23.0M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
23.0M
            if (Al > 0 && pred >= (1 << Al))
699
2.12M
              pred = (1 << Al) - 1;
700
23.0M
          } else {
701
14.2M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
14.2M
            if (Al > 0 && pred >= (1 << Al))
703
2.10M
              pred = (1 << Al) - 1;
704
14.2M
            pred = -pred;
705
14.2M
          }
706
37.2M
          workspace[2] = (JCOEF)pred;
707
37.2M
        }
708
39.3M
        if (change_dc) {
709
          /* AC03 */
710
22.5M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
22.5M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
22.5M
            if (num >= 0) {
713
18.0M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
18.0M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
18.0M
            } else {
717
4.50M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
4.50M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
4.50M
              pred = -pred;
721
4.50M
            }
722
22.5M
            workspace[3] = (JCOEF)pred;
723
22.5M
          }
724
          /* AC12 */
725
22.5M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
22.5M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
22.5M
            if (num >= 0) {
728
13.1M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
13.1M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
13.1M
            } else {
732
9.38M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
9.38M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
9.38M
              pred = -pred;
736
9.38M
            }
737
22.5M
            workspace[10] = (JCOEF)pred;
738
22.5M
          }
739
          /* AC21 */
740
22.5M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
22.5M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
22.5M
            if (num >= 0) {
743
12.5M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
12.5M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
12.5M
            } else {
747
9.94M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
9.94M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
9.94M
              pred = -pred;
751
9.94M
            }
752
22.5M
            workspace[17] = (JCOEF)pred;
753
22.5M
          }
754
          /* AC30 */
755
22.5M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
22.5M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
22.5M
            if (num >= 0) {
758
16.6M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
16.6M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
16.6M
            } else {
762
5.91M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
5.91M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
5.91M
              pred = -pred;
766
5.91M
            }
767
22.5M
            workspace[24] = (JCOEF)pred;
768
22.5M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
22.5M
          num = Q00 *
773
22.5M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
22.5M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
22.5M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
22.5M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
22.5M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
22.5M
          if (num >= 0) {
779
13.4M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
13.4M
          } else {
781
9.13M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
9.13M
            pred = -pred;
783
9.13M
          }
784
22.5M
          workspace[0] = (JCOEF)pred;
785
22.5M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
39.3M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
39.3M
                        output_col);
790
        /* Advance for next column */
791
39.3M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
39.3M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
39.3M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
39.3M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
39.3M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
39.3M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
39.3M
          prev_prev_block_row++, next_next_block_row++;
798
39.3M
        output_col += compptr->_DCT_scaled_size;
799
39.3M
      }
800
5.79M
      output_ptr += compptr->_DCT_scaled_size;
801
5.79M
    }
802
3.58M
  }
803
804
2.28M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
2.28M
    return JPEG_ROW_COMPLETED;
806
5.15k
  return JPEG_SCAN_COMPLETED;
807
2.28M
}
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
124k
{
819
124k
  my_coef_ptr coef;
820
821
124k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
124k
  coef = (my_coef_ptr)
825
124k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
124k
                                sizeof(my_coef_controller));
827
124k
  memset(coef, 0, sizeof(my_coef_controller));
828
124k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
124k
  coef->pub.start_input_pass = start_input_pass;
830
124k
  coef->pub.start_output_pass = start_output_pass;
831
124k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
124k
  coef->coef_bits_latch = NULL;
833
124k
#endif
834
835
  /* Create the coefficient buffer. */
836
124k
  if (need_full_buffer) {
837
95.3k
#ifdef D_MULTISCAN_FILES_SUPPORTED
838
    /* Allocate a full-image virtual array for each component, */
839
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
840
    /* Note we ask for a pre-zeroed array. */
841
95.3k
    int ci, access_rows;
842
95.3k
    jpeg_component_info *compptr;
843
844
287k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
191k
         ci++, compptr++) {
846
191k
      access_rows = compptr->v_samp_factor;
847
191k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
191k
      if (cinfo->progressive_mode)
850
113k
        access_rows *= 5;
851
191k
#endif
852
191k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
191k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
191k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
191k
                               (long)compptr->h_samp_factor),
856
191k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
191k
                               (long)compptr->v_samp_factor),
858
191k
         (JDIMENSION)access_rows);
859
191k
    }
860
95.3k
    coef->pub.consume_data = consume_data;
861
95.3k
    coef->pub._decompress_data = decompress_data;
862
95.3k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
95.3k
  } else {
867
    /* We only need a single-MCU buffer. */
868
29.0k
    JBLOCKROW buffer;
869
29.0k
    int i;
870
871
29.0k
    buffer = (JBLOCKROW)
872
29.0k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
29.0k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
319k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
290k
      coef->MCU_buffer[i] = buffer + i;
876
290k
    }
877
29.0k
    coef->pub.consume_data = dummy_consume_data;
878
29.0k
    coef->pub._decompress_data = decompress_onepass;
879
29.0k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
29.0k
  }
881
882
  /* Allocate the workspace buffer */
883
124k
  coef->workspace = (JCOEF *)
884
124k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
124k
                                sizeof(JCOEF) * DCTSIZE2);
886
124k
}
j12init_d_coef_controller
Line
Count
Source
818
23.6k
{
819
23.6k
  my_coef_ptr coef;
820
821
23.6k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
23.6k
  coef = (my_coef_ptr)
825
23.6k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
23.6k
                                sizeof(my_coef_controller));
827
23.6k
  memset(coef, 0, sizeof(my_coef_controller));
828
23.6k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
23.6k
  coef->pub.start_input_pass = start_input_pass;
830
23.6k
  coef->pub.start_output_pass = start_output_pass;
831
23.6k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
23.6k
  coef->coef_bits_latch = NULL;
833
23.6k
#endif
834
835
  /* Create the coefficient buffer. */
836
23.6k
  if (need_full_buffer) {
837
19.9k
#ifdef D_MULTISCAN_FILES_SUPPORTED
838
    /* Allocate a full-image virtual array for each component, */
839
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
840
    /* Note we ask for a pre-zeroed array. */
841
19.9k
    int ci, access_rows;
842
19.9k
    jpeg_component_info *compptr;
843
844
56.9k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
36.9k
         ci++, compptr++) {
846
36.9k
      access_rows = compptr->v_samp_factor;
847
36.9k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
36.9k
      if (cinfo->progressive_mode)
850
20.4k
        access_rows *= 5;
851
36.9k
#endif
852
36.9k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
36.9k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
36.9k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
36.9k
                               (long)compptr->h_samp_factor),
856
36.9k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
36.9k
                               (long)compptr->v_samp_factor),
858
36.9k
         (JDIMENSION)access_rows);
859
36.9k
    }
860
19.9k
    coef->pub.consume_data = consume_data;
861
19.9k
    coef->pub._decompress_data = decompress_data;
862
19.9k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
19.9k
  } else {
867
    /* We only need a single-MCU buffer. */
868
3.65k
    JBLOCKROW buffer;
869
3.65k
    int i;
870
871
3.65k
    buffer = (JBLOCKROW)
872
3.65k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
3.65k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
40.1k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
36.5k
      coef->MCU_buffer[i] = buffer + i;
876
36.5k
    }
877
3.65k
    coef->pub.consume_data = dummy_consume_data;
878
3.65k
    coef->pub._decompress_data = decompress_onepass;
879
3.65k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
3.65k
  }
881
882
  /* Allocate the workspace buffer */
883
23.6k
  coef->workspace = (JCOEF *)
884
23.6k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
23.6k
                                sizeof(JCOEF) * DCTSIZE2);
886
23.6k
}
jinit_d_coef_controller
Line
Count
Source
818
100k
{
819
100k
  my_coef_ptr coef;
820
821
100k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
100k
  coef = (my_coef_ptr)
825
100k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
100k
                                sizeof(my_coef_controller));
827
100k
  memset(coef, 0, sizeof(my_coef_controller));
828
100k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
100k
  coef->pub.start_input_pass = start_input_pass;
830
100k
  coef->pub.start_output_pass = start_output_pass;
831
100k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
100k
  coef->coef_bits_latch = NULL;
833
100k
#endif
834
835
  /* Create the coefficient buffer. */
836
100k
  if (need_full_buffer) {
837
75.3k
#ifdef D_MULTISCAN_FILES_SUPPORTED
838
    /* Allocate a full-image virtual array for each component, */
839
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
840
    /* Note we ask for a pre-zeroed array. */
841
75.3k
    int ci, access_rows;
842
75.3k
    jpeg_component_info *compptr;
843
844
230k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
154k
         ci++, compptr++) {
846
154k
      access_rows = compptr->v_samp_factor;
847
154k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
154k
      if (cinfo->progressive_mode)
850
93.2k
        access_rows *= 5;
851
154k
#endif
852
154k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
154k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
154k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
154k
                               (long)compptr->h_samp_factor),
856
154k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
154k
                               (long)compptr->v_samp_factor),
858
154k
         (JDIMENSION)access_rows);
859
154k
    }
860
75.3k
    coef->pub.consume_data = consume_data;
861
75.3k
    coef->pub._decompress_data = decompress_data;
862
75.3k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
75.3k
  } else {
867
    /* We only need a single-MCU buffer. */
868
25.4k
    JBLOCKROW buffer;
869
25.4k
    int i;
870
871
25.4k
    buffer = (JBLOCKROW)
872
25.4k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
25.4k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
279k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
254k
      coef->MCU_buffer[i] = buffer + i;
876
254k
    }
877
25.4k
    coef->pub.consume_data = dummy_consume_data;
878
25.4k
    coef->pub._decompress_data = decompress_onepass;
879
25.4k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
25.4k
  }
881
882
  /* Allocate the workspace buffer */
883
100k
  coef->workspace = (JCOEF *)
884
100k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
100k
                                sizeof(JCOEF) * DCTSIZE2);
886
100k
}