Coverage Report

Created: 2025-10-13 07:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libultrahdr/third_party/turbojpeg/src/jdcoefct.c
Line
Count
Source
1
/*
2
 * jdcoefct.c
3
 *
4
 * This file was part of the Independent JPEG Group's software:
5
 * Copyright (C) 1994-1997, Thomas G. Lane.
6
 * libjpeg-turbo Modifications:
7
 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
8
 * Copyright (C) 2010, 2015-2016, 2019-2020, 2022-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
174k
{
48
174k
  cinfo->input_iMCU_row = 0;
49
174k
  start_iMCU_row(cinfo);
50
174k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
6.13k
{
60
6.13k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
6.13k
  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
6.13k
  if (coef->pub.coef_arrays != NULL) {
65
4.06k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
916
      coef->pub._decompress_data = decompress_smooth_data;
67
3.14k
    else
68
3.14k
      coef->pub._decompress_data = decompress_data;
69
4.06k
  }
70
6.13k
#endif
71
6.13k
  cinfo->output_iMCU_row = 0;
72
6.13k
}
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
63.6k
{
88
63.6k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
63.6k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
63.6k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
63.6k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
63.6k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
63.6k
  _JSAMPARRAY output_ptr;
94
63.6k
  JDIMENSION start_col, output_col;
95
63.6k
  jpeg_component_info *compptr;
96
63.6k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
142k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
79.3k
       yoffset++) {
101
2.72M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
2.64M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
2.64M
      jzero_far((void *)coef->MCU_buffer[0],
105
2.64M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
2.64M
      if (!cinfo->entropy->insufficient_data)
107
1.19M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
2.64M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
109
        /* Suspension forced; update state counters and exit */
110
4
        coef->MCU_vert_offset = yoffset;
111
4
        coef->MCU_ctr = MCU_col_num;
112
4
        return JPEG_SUSPENDED;
113
4
      }
114
115
      /* Only perform the IDCT on blocks that are contained within the desired
116
       * cropping region.
117
       */
118
2.64M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
2.64M
          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
2.64M
        blkn = 0;               /* index of current DCT block within MCU */
126
8.15M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
5.50M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
5.50M
          if (!compptr->component_needed) {
130
0
            blkn += compptr->MCU_blocks;
131
0
            continue;
132
0
          }
133
5.50M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
5.50M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
5.34M
                         compptr->MCU_width : compptr->last_col_width;
136
5.50M
          output_ptr = output_buf[compptr->component_index] +
137
5.50M
                       yoffset * compptr->_DCT_scaled_size;
138
5.50M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
5.50M
                      compptr->MCU_sample_width;
140
12.4M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
6.91M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
6.88M
                yoffset + yindex < compptr->last_row_height) {
143
6.88M
              output_col = start_col;
144
16.5M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
9.62M
                (*inverse_DCT) (cinfo, compptr,
146
9.62M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
9.62M
                                output_ptr, output_col);
148
9.62M
                output_col += compptr->_DCT_scaled_size;
149
9.62M
              }
150
6.88M
            }
151
6.91M
            blkn += compptr->MCU_width;
152
6.91M
            output_ptr += compptr->_DCT_scaled_size;
153
6.91M
          }
154
5.50M
        }
155
2.64M
      }
156
2.64M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
79.3k
    coef->MCU_ctr = 0;
159
79.3k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
63.6k
  cinfo->output_iMCU_row++;
162
63.6k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
61.5k
    start_iMCU_row(cinfo);
164
61.5k
    return JPEG_ROW_COMPLETED;
165
61.5k
  }
166
  /* Completed the scan */
167
2.06k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
2.06k
  return JPEG_SCAN_COMPLETED;
169
63.6k
}
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
4.89M
{
195
4.89M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
4.89M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
4.89M
  int blkn, ci, xindex, yindex, yoffset;
198
4.89M
  JDIMENSION start_col;
199
4.89M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
4.89M
  JBLOCKROW buffer_ptr;
201
4.89M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
12.4M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
7.55M
    compptr = cinfo->cur_comp_info[ci];
206
7.55M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
7.55M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
7.55M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
7.55M
       (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
7.55M
  }
215
216
  /* Loop to process one whole iMCU row */
217
11.5M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
6.68M
       yoffset++) {
219
151M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
144M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
144M
      blkn = 0;                 /* index of current DCT block within MCU */
223
322M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
177M
        compptr = cinfo->cur_comp_info[ci];
225
177M
        start_col = MCU_col_num * compptr->MCU_width;
226
370M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
193M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
418M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
225M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
225M
          }
231
193M
        }
232
177M
      }
233
144M
      if (!cinfo->entropy->insufficient_data)
234
122M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
144M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
237
        /* Suspension forced; update state counters and exit */
238
2
        coef->MCU_vert_offset = yoffset;
239
2
        coef->MCU_ctr = MCU_col_num;
240
2
        return JPEG_SUSPENDED;
241
2
      }
242
144M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
6.68M
    coef->MCU_ctr = 0;
245
6.68M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
4.89M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
4.72M
    start_iMCU_row(cinfo);
249
4.72M
    return JPEG_ROW_COMPLETED;
250
4.72M
  }
251
  /* Completed the scan */
252
172k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
172k
  return JPEG_SCAN_COMPLETED;
254
4.89M
}
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
129k
{
268
129k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
129k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
129k
  JDIMENSION block_num;
271
129k
  int ci, block_row, block_rows;
272
129k
  JBLOCKARRAY buffer;
273
129k
  JBLOCKROW buffer_ptr;
274
129k
  _JSAMPARRAY output_ptr;
275
129k
  JDIMENSION output_col;
276
129k
  jpeg_component_info *compptr;
277
129k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
129k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
129k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
129k
          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
482k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
353k
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
353k
    if (!compptr->component_needed)
292
0
      continue;
293
    /* Align the virtual buffer for this component. */
294
353k
    buffer = (*cinfo->mem->access_virt_barray)
295
353k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
353k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
353k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
353k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
346k
      block_rows = compptr->v_samp_factor;
301
7.05k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
7.05k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
7.05k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
7.05k
    }
306
353k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
353k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
785k
    for (block_row = 0; block_row < block_rows; block_row++) {
310
431k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
431k
      output_col = 0;
312
431k
      for (block_num = cinfo->master->first_MCU_col[ci];
313
12.8M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
12.4M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
12.4M
                        output_col);
316
12.4M
        buffer_ptr++;
317
12.4M
        output_col += compptr->_DCT_scaled_size;
318
12.4M
      }
319
431k
      output_ptr += compptr->_DCT_scaled_size;
320
431k
    }
321
353k
  }
322
323
129k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
126k
    return JPEG_ROW_COMPLETED;
325
2.81k
  return JPEG_SCAN_COMPLETED;
326
129k
}
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
61.9k
#define Q01_POS  1
342
61.7k
#define Q10_POS  8
343
61.5k
#define Q20_POS  16
344
61.4k
#define Q11_POS  9
345
61.3k
#define Q02_POS  2
346
42.4k
#define Q03_POS  3
347
42.4k
#define Q12_POS  10
348
42.3k
#define Q21_POS  17
349
42.3k
#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
4.06k
{
362
4.06k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
4.06k
  boolean smoothing_useful = FALSE;
364
4.06k
  int ci, coefi;
365
4.06k
  jpeg_component_info *compptr;
366
4.06k
  JQUANT_TBL *qtable;
367
4.06k
  int *coef_bits, *prev_coef_bits;
368
4.06k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
4.06k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
1.71k
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
2.34k
  if (coef->coef_bits_latch == NULL)
375
2.34k
    coef->coef_bits_latch = (int *)
376
2.34k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
2.34k
                                  cinfo->num_components * 2 *
378
2.34k
                                  (SAVED_COEFS * sizeof(int)));
379
2.34k
  coef_bits_latch = coef->coef_bits_latch;
380
2.34k
  prev_coef_bits_latch =
381
2.34k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
4.01k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
3.08k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
3.08k
    if ((qtable = compptr->quant_table) == NULL)
387
240
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
2.84k
    if (qtable->quantval[0] == 0 ||
390
2.69k
        qtable->quantval[Q01_POS] == 0 ||
391
2.52k
        qtable->quantval[Q10_POS] == 0 ||
392
2.36k
        qtable->quantval[Q20_POS] == 0 ||
393
2.25k
        qtable->quantval[Q11_POS] == 0 ||
394
2.16k
        qtable->quantval[Q02_POS] == 0 ||
395
2.08k
        qtable->quantval[Q03_POS] == 0 ||
396
2.03k
        qtable->quantval[Q12_POS] == 0 ||
397
1.96k
        qtable->quantval[Q21_POS] == 0 ||
398
1.89k
        qtable->quantval[Q30_POS] == 0)
399
1.03k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
1.81k
    coef_bits = cinfo->coef_bits[ci];
402
1.81k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
1.81k
    if (coef_bits[0] < 0)
404
151
      return FALSE;
405
1.66k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
16.6k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
14.9k
      if (cinfo->input_scan_number > 1)
409
8.65k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
6.30k
      else
411
6.30k
        prev_coef_bits_latch[coefi] = -1;
412
14.9k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
14.9k
      if (coef_bits[coefi] != 0)
414
14.1k
        smoothing_useful = TRUE;
415
14.9k
    }
416
1.66k
    coef_bits_latch += SAVED_COEFS;
417
1.66k
    prev_coef_bits_latch += SAVED_COEFS;
418
1.66k
  }
419
420
922
  return smoothing_useful;
421
2.34k
}
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
32.6k
{
431
32.6k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
32.6k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
32.6k
  JDIMENSION block_num, last_block_column;
434
32.6k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
32.6k
    image_block_rows;
436
32.6k
  JBLOCKARRAY buffer;
437
32.6k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
32.6k
  JBLOCKROW next_block_row, next_next_block_row;
439
32.6k
  _JSAMPARRAY output_ptr;
440
32.6k
  JDIMENSION output_col;
441
32.6k
  jpeg_component_info *compptr;
442
32.6k
  _inverse_DCT_method_ptr inverse_DCT;
443
32.6k
  boolean change_dc;
444
32.6k
  JCOEF *workspace;
445
32.6k
  int *coef_bits;
446
32.6k
  JQUANT_TBL *quanttbl;
447
32.6k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
32.6k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
32.6k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
32.6k
      DC25;
451
32.6k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
32.6k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
32.6k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
32.6k
         !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
91.9k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
59.2k
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
59.2k
    if (!compptr->component_needed)
478
0
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
59.2k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
56.3k
      block_rows = compptr->v_samp_factor;
482
56.3k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
56.3k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
1.38k
      block_rows = compptr->v_samp_factor;
485
1.38k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
1.50k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
1.50k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
1.50k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
1.50k
      access_rows = block_rows; /* this iMCU row only */
491
1.50k
    }
492
    /* Align the virtual buffer for this component. */
493
59.2k
    if (cinfo->output_iMCU_row > 1) {
494
56.3k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
56.3k
      buffer = (*cinfo->mem->access_virt_barray)
496
56.3k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
56.3k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
56.3k
         (JDIMENSION)access_rows, FALSE);
499
56.3k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
56.3k
    } else if (cinfo->output_iMCU_row > 0) {
501
1.38k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
1.38k
      buffer = (*cinfo->mem->access_virt_barray)
503
1.38k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
1.38k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
1.38k
         (JDIMENSION)access_rows, FALSE);
506
1.38k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
1.50k
    } else {
508
1.50k
      buffer = (*cinfo->mem->access_virt_barray)
509
1.50k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
1.50k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
1.50k
    }
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
59.2k
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
17.1k
      coef_bits =
518
17.1k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
42.0k
    else
520
42.0k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
59.2k
    change_dc =
524
59.2k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
44.6k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
41.8k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
59.2k
    quanttbl = compptr->quant_table;
529
59.2k
    Q00 = quanttbl->quantval[0];
530
59.2k
    Q01 = quanttbl->quantval[Q01_POS];
531
59.2k
    Q10 = quanttbl->quantval[Q10_POS];
532
59.2k
    Q20 = quanttbl->quantval[Q20_POS];
533
59.2k
    Q11 = quanttbl->quantval[Q11_POS];
534
59.2k
    Q02 = quanttbl->quantval[Q02_POS];
535
59.2k
    if (change_dc) {
536
40.4k
      Q03 = quanttbl->quantval[Q03_POS];
537
40.4k
      Q12 = quanttbl->quantval[Q12_POS];
538
40.4k
      Q21 = quanttbl->quantval[Q21_POS];
539
40.4k
      Q30 = quanttbl->quantval[Q30_POS];
540
40.4k
    }
541
59.2k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
59.2k
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
59.2k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
137k
    for (block_row = 0; block_row < block_rows; block_row++) {
546
78.5k
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
78.5k
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
78.5k
      if (image_block_row > 0)
550
77.0k
        prev_block_row =
551
77.0k
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
1.50k
      else
553
1.50k
        prev_block_row = buffer_ptr;
554
555
78.5k
      if (image_block_row > 1)
556
75.6k
        prev_prev_block_row =
557
75.6k
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
2.91k
      else
559
2.91k
        prev_prev_block_row = prev_block_row;
560
561
78.5k
      if (image_block_row < image_block_rows - 1)
562
77.0k
        next_block_row =
563
77.0k
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
1.50k
      else
565
1.50k
        next_block_row = buffer_ptr;
566
567
78.5k
      if (image_block_row < image_block_rows - 2)
568
75.8k
        next_next_block_row =
569
75.8k
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
2.67k
      else
571
2.67k
        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
78.5k
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
78.5k
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
78.5k
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
78.5k
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
78.5k
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
78.5k
      output_col = 0;
582
78.5k
      last_block_column = compptr->width_in_blocks - 1;
583
78.5k
      for (block_num = cinfo->master->first_MCU_col[ci];
584
2.79M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
2.71M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
2.71M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
78.5k
            block_num < last_block_column) {
590
61.3k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
61.3k
          DC09 = DC10 = (int)prev_block_row[1][0];
592
61.3k
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
61.3k
          DC19 = DC20 = (int)next_block_row[1][0];
594
61.3k
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
61.3k
        }
596
2.71M
        if (block_num + 1 < last_block_column) {
597
2.57M
          DC05 = (int)prev_prev_block_row[2][0];
598
2.57M
          DC10 = (int)prev_block_row[2][0];
599
2.57M
          DC15 = (int)buffer_ptr[2][0];
600
2.57M
          DC20 = (int)next_block_row[2][0];
601
2.57M
          DC25 = (int)next_next_block_row[2][0];
602
2.57M
        }
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
2.71M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
2.58M
          num = Q00 * (change_dc ?
616
1.67M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
1.67M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
1.67M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
1.67M
                 DC21 - DC22 + DC24 + DC25) :
620
2.58M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
2.58M
          if (num >= 0) {
622
1.84M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
1.84M
            if (Al > 0 && pred >= (1 << Al))
624
83.0k
              pred = (1 << Al) - 1;
625
1.84M
          } else {
626
738k
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
738k
            if (Al > 0 && pred >= (1 << Al))
628
133k
              pred = (1 << Al) - 1;
629
738k
            pred = -pred;
630
738k
          }
631
2.58M
          workspace[1] = (JCOEF)pred;
632
2.58M
        }
633
        /* AC10 */
634
2.71M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
2.62M
          num = Q00 * (change_dc ?
636
1.67M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
1.67M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
1.67M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
1.67M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
2.62M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
2.62M
          if (num >= 0) {
642
1.78M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
1.78M
            if (Al > 0 && pred >= (1 << Al))
644
219k
              pred = (1 << Al) - 1;
645
1.78M
          } else {
646
835k
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
835k
            if (Al > 0 && pred >= (1 << Al))
648
252k
              pred = (1 << Al) - 1;
649
835k
            pred = -pred;
650
835k
          }
651
2.62M
          workspace[8] = (JCOEF)pred;
652
2.62M
        }
653
        /* AC20 */
654
2.71M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
2.64M
          num = Q00 * (change_dc ?
656
1.67M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
1.67M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
2.64M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
2.64M
          if (num >= 0) {
660
1.68M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
1.68M
            if (Al > 0 && pred >= (1 << Al))
662
179k
              pred = (1 << Al) - 1;
663
1.68M
          } else {
664
963k
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
963k
            if (Al > 0 && pred >= (1 << Al))
666
180k
              pred = (1 << Al) - 1;
667
963k
            pred = -pred;
668
963k
          }
669
2.64M
          workspace[16] = (JCOEF)pred;
670
2.64M
        }
671
        /* AC11 */
672
2.71M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
2.62M
          num = Q00 * (change_dc ?
674
1.67M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
1.67M
                 9 * DC19 + DC21 - DC25) :
676
2.62M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
954k
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
2.62M
          if (num >= 0) {
679
1.99M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
1.99M
            if (Al > 0 && pred >= (1 << Al))
681
54.4k
              pred = (1 << Al) - 1;
682
1.99M
          } else {
683
627k
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
627k
            if (Al > 0 && pred >= (1 << Al))
685
54.3k
              pred = (1 << Al) - 1;
686
627k
            pred = -pred;
687
627k
          }
688
2.62M
          workspace[9] = (JCOEF)pred;
689
2.62M
        }
690
        /* AC02 */
691
2.71M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
2.63M
          num = Q00 * (change_dc ?
693
1.67M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
1.67M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
2.63M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
2.63M
          if (num >= 0) {
697
1.65M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
1.65M
            if (Al > 0 && pred >= (1 << Al))
699
41.3k
              pred = (1 << Al) - 1;
700
1.65M
          } else {
701
977k
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
977k
            if (Al > 0 && pred >= (1 << Al))
703
41.9k
              pred = (1 << Al) - 1;
704
977k
            pred = -pred;
705
977k
          }
706
2.63M
          workspace[2] = (JCOEF)pred;
707
2.63M
        }
708
2.71M
        if (change_dc) {
709
          /* AC03 */
710
1.67M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
1.67M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
1.67M
            if (num >= 0) {
713
1.26M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
1.26M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
1.26M
            } else {
717
407k
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
407k
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
407k
              pred = -pred;
721
407k
            }
722
1.67M
            workspace[3] = (JCOEF)pred;
723
1.67M
          }
724
          /* AC12 */
725
1.67M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
1.67M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
1.67M
            if (num >= 0) {
728
926k
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
926k
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
926k
            } else {
732
745k
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
745k
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
745k
              pred = -pred;
736
745k
            }
737
1.67M
            workspace[10] = (JCOEF)pred;
738
1.67M
          }
739
          /* AC21 */
740
1.67M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
1.67M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
1.67M
            if (num >= 0) {
743
940k
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
940k
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
940k
            } else {
747
731k
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
731k
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
731k
              pred = -pred;
751
731k
            }
752
1.67M
            workspace[17] = (JCOEF)pred;
753
1.67M
          }
754
          /* AC30 */
755
1.67M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
1.67M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
1.67M
            if (num >= 0) {
758
1.22M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
1.22M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
1.22M
            } else {
762
442k
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
442k
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
442k
              pred = -pred;
766
442k
            }
767
1.67M
            workspace[24] = (JCOEF)pred;
768
1.67M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
1.67M
          num = Q00 *
773
1.67M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
1.67M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
1.67M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
1.67M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
1.67M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
1.67M
          if (num >= 0) {
779
887k
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
887k
          } else {
781
784k
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
784k
            pred = -pred;
783
784k
          }
784
1.67M
          workspace[0] = (JCOEF)pred;
785
1.67M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
2.71M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
2.71M
                        output_col);
790
        /* Advance for next column */
791
2.71M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
2.71M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
2.71M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
2.71M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
2.71M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
2.71M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
2.71M
          prev_prev_block_row++, next_next_block_row++;
798
2.71M
        output_col += compptr->_DCT_scaled_size;
799
2.71M
      }
800
78.5k
      output_ptr += compptr->_DCT_scaled_size;
801
78.5k
    }
802
59.2k
  }
803
804
32.6k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
31.8k
    return JPEG_ROW_COMPLETED;
806
860
  return JPEG_SCAN_COMPLETED;
807
32.6k
}
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
6.70k
{
819
6.70k
  my_coef_ptr coef;
820
821
6.70k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
6.70k
  coef = (my_coef_ptr)
825
6.70k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
6.70k
                                sizeof(my_coef_controller));
827
6.70k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
828
6.70k
  coef->pub.start_input_pass = start_input_pass;
829
6.70k
  coef->pub.start_output_pass = start_output_pass;
830
6.70k
#ifdef BLOCK_SMOOTHING_SUPPORTED
831
6.70k
  coef->coef_bits_latch = NULL;
832
6.70k
#endif
833
834
  /* Create the coefficient buffer. */
835
6.70k
  if (need_full_buffer) {
836
4.58k
#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
4.58k
    int ci, access_rows;
841
4.58k
    jpeg_component_info *compptr;
842
843
15.0k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
844
10.4k
         ci++, compptr++) {
845
10.4k
      access_rows = compptr->v_samp_factor;
846
10.4k
#ifdef BLOCK_SMOOTHING_SUPPORTED
847
      /* If block smoothing could be used, need a bigger window */
848
10.4k
      if (cinfo->progressive_mode)
849
4.68k
        access_rows *= 5;
850
10.4k
#endif
851
10.4k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
852
10.4k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
853
10.4k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
854
10.4k
                               (long)compptr->h_samp_factor),
855
10.4k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
856
10.4k
                               (long)compptr->v_samp_factor),
857
10.4k
         (JDIMENSION)access_rows);
858
10.4k
    }
859
4.58k
    coef->pub.consume_data = consume_data;
860
4.58k
    coef->pub._decompress_data = decompress_data;
861
4.58k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
862
#else
863
    ERREXIT(cinfo, JERR_NOT_COMPILED);
864
#endif
865
4.58k
  } else {
866
    /* We only need a single-MCU buffer. */
867
2.12k
    JBLOCKROW buffer;
868
2.12k
    int i;
869
870
2.12k
    buffer = (JBLOCKROW)
871
2.12k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
872
2.12k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
873
23.3k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
874
21.2k
      coef->MCU_buffer[i] = buffer + i;
875
21.2k
    }
876
2.12k
    coef->pub.consume_data = dummy_consume_data;
877
2.12k
    coef->pub._decompress_data = decompress_onepass;
878
2.12k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
879
2.12k
  }
880
881
  /* Allocate the workspace buffer */
882
6.70k
  coef->workspace = (JCOEF *)
883
6.70k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
884
6.70k
                                sizeof(JCOEF) * DCTSIZE2);
885
6.70k
}
j12init_d_coef_controller
Line
Count
Source
818
467
{
819
467
  my_coef_ptr coef;
820
821
467
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
467
  coef = (my_coef_ptr)
825
467
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
467
                                sizeof(my_coef_controller));
827
467
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
828
467
  coef->pub.start_input_pass = start_input_pass;
829
467
  coef->pub.start_output_pass = start_output_pass;
830
467
#ifdef BLOCK_SMOOTHING_SUPPORTED
831
467
  coef->coef_bits_latch = NULL;
832
467
#endif
833
834
  /* Create the coefficient buffer. */
835
467
  if (need_full_buffer) {
836
459
#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
459
    int ci, access_rows;
841
459
    jpeg_component_info *compptr;
842
843
1.23k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
844
773
         ci++, compptr++) {
845
773
      access_rows = compptr->v_samp_factor;
846
773
#ifdef BLOCK_SMOOTHING_SUPPORTED
847
      /* If block smoothing could be used, need a bigger window */
848
773
      if (cinfo->progressive_mode)
849
644
        access_rows *= 5;
850
773
#endif
851
773
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
852
773
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
853
773
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
854
773
                               (long)compptr->h_samp_factor),
855
773
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
856
773
                               (long)compptr->v_samp_factor),
857
773
         (JDIMENSION)access_rows);
858
773
    }
859
459
    coef->pub.consume_data = consume_data;
860
459
    coef->pub._decompress_data = decompress_data;
861
459
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
862
#else
863
    ERREXIT(cinfo, JERR_NOT_COMPILED);
864
#endif
865
459
  } else {
866
    /* We only need a single-MCU buffer. */
867
8
    JBLOCKROW buffer;
868
8
    int i;
869
870
8
    buffer = (JBLOCKROW)
871
8
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
872
8
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
873
88
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
874
80
      coef->MCU_buffer[i] = buffer + i;
875
80
    }
876
8
    coef->pub.consume_data = dummy_consume_data;
877
8
    coef->pub._decompress_data = decompress_onepass;
878
8
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
879
8
  }
880
881
  /* Allocate the workspace buffer */
882
467
  coef->workspace = (JCOEF *)
883
467
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
884
467
                                sizeof(JCOEF) * DCTSIZE2);
885
467
}
jinit_d_coef_controller
Line
Count
Source
818
6.23k
{
819
6.23k
  my_coef_ptr coef;
820
821
6.23k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
6.23k
  coef = (my_coef_ptr)
825
6.23k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
6.23k
                                sizeof(my_coef_controller));
827
6.23k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
828
6.23k
  coef->pub.start_input_pass = start_input_pass;
829
6.23k
  coef->pub.start_output_pass = start_output_pass;
830
6.23k
#ifdef BLOCK_SMOOTHING_SUPPORTED
831
6.23k
  coef->coef_bits_latch = NULL;
832
6.23k
#endif
833
834
  /* Create the coefficient buffer. */
835
6.23k
  if (need_full_buffer) {
836
4.12k
#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
4.12k
    int ci, access_rows;
841
4.12k
    jpeg_component_info *compptr;
842
843
13.8k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
844
9.68k
         ci++, compptr++) {
845
9.68k
      access_rows = compptr->v_samp_factor;
846
9.68k
#ifdef BLOCK_SMOOTHING_SUPPORTED
847
      /* If block smoothing could be used, need a bigger window */
848
9.68k
      if (cinfo->progressive_mode)
849
4.04k
        access_rows *= 5;
850
9.68k
#endif
851
9.68k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
852
9.68k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
853
9.68k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
854
9.68k
                               (long)compptr->h_samp_factor),
855
9.68k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
856
9.68k
                               (long)compptr->v_samp_factor),
857
9.68k
         (JDIMENSION)access_rows);
858
9.68k
    }
859
4.12k
    coef->pub.consume_data = consume_data;
860
4.12k
    coef->pub._decompress_data = decompress_data;
861
4.12k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
862
#else
863
    ERREXIT(cinfo, JERR_NOT_COMPILED);
864
#endif
865
4.12k
  } else {
866
    /* We only need a single-MCU buffer. */
867
2.11k
    JBLOCKROW buffer;
868
2.11k
    int i;
869
870
2.11k
    buffer = (JBLOCKROW)
871
2.11k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
872
2.11k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
873
23.2k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
874
21.1k
      coef->MCU_buffer[i] = buffer + i;
875
21.1k
    }
876
2.11k
    coef->pub.consume_data = dummy_consume_data;
877
2.11k
    coef->pub._decompress_data = decompress_onepass;
878
2.11k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
879
2.11k
  }
880
881
  /* Allocate the workspace buffer */
882
6.23k
  coef->workspace = (JCOEF *)
883
6.23k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
884
6.23k
                                sizeof(JCOEF) * DCTSIZE2);
885
6.23k
}