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, D. R. Commander.
9 * Copyright (C) 2015, 2020, Google, Inc.
10 * For conditions of distribution and use, see the accompanying README.ijg
13 * This file contains the coefficient buffer controller for decompression.
14 * This controller is the top level of the JPEG decompressor proper.
15 * The coefficient buffer lies between entropy decoding and inverse-DCT steps.
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.
27 /* Forward declarations */
28 METHODDEF(int) decompress_onepass(j_decompress_ptr cinfo
,
29 JSAMPIMAGE output_buf
);
30 #ifdef D_MULTISCAN_FILES_SUPPORTED
31 METHODDEF(int) decompress_data(j_decompress_ptr cinfo
, JSAMPIMAGE output_buf
);
33 #ifdef BLOCK_SMOOTHING_SUPPORTED
34 LOCAL(boolean
) smoothing_ok(j_decompress_ptr cinfo
);
35 METHODDEF(int) decompress_smooth_data(j_decompress_ptr cinfo
,
36 JSAMPIMAGE output_buf
);
41 * Initialize for an input processing pass.
45 start_input_pass(j_decompress_ptr cinfo
)
47 cinfo
->input_iMCU_row
= 0;
48 start_iMCU_row(cinfo
);
53 * Initialize for an output processing pass.
57 start_output_pass(j_decompress_ptr cinfo
)
59 #ifdef BLOCK_SMOOTHING_SUPPORTED
60 my_coef_ptr coef
= (my_coef_ptr
)cinfo
->coef
;
62 /* If multipass, check to see whether to use block smoothing on this pass */
63 if (coef
->pub
.coef_arrays
!= NULL
) {
64 if (cinfo
->do_block_smoothing
&& smoothing_ok(cinfo
))
65 coef
->pub
.decompress_data
= decompress_smooth_data
;
67 coef
->pub
.decompress_data
= decompress_data
;
70 cinfo
->output_iMCU_row
= 0;
75 * Decompress and return some data in the single-pass case.
76 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
77 * Input and output must run in lockstep since we have only a one-MCU buffer.
78 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
80 * NB: output_buf contains a plane for each component in image,
81 * which we index according to the component's SOF position.
85 decompress_onepass(j_decompress_ptr cinfo
, JSAMPIMAGE output_buf
)
87 my_coef_ptr coef
= (my_coef_ptr
)cinfo
->coef
;
88 JDIMENSION MCU_col_num
; /* index of current MCU within row */
89 JDIMENSION last_MCU_col
= cinfo
->MCUs_per_row
- 1;
90 JDIMENSION last_iMCU_row
= cinfo
->total_iMCU_rows
- 1;
91 int blkn
, ci
, xindex
, yindex
, yoffset
, useful_width
;
92 JSAMPARRAY output_ptr
;
93 JDIMENSION start_col
, output_col
;
94 jpeg_component_info
*compptr
;
95 inverse_DCT_method_ptr inverse_DCT
;
97 /* Loop to process as much as one whole iMCU row */
98 for (yoffset
= coef
->MCU_vert_offset
; yoffset
< coef
->MCU_rows_per_iMCU_row
;
100 for (MCU_col_num
= coef
->MCU_ctr
; MCU_col_num
<= last_MCU_col
;
102 /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */
103 jzero_far((void *)coef
->MCU_buffer
[0],
104 (size_t)(cinfo
->blocks_in_MCU
* sizeof(JBLOCK
)));
105 if (!(*cinfo
->entropy
->decode_mcu
) (cinfo
, coef
->MCU_buffer
)) {
106 /* Suspension forced; update state counters and exit */
107 coef
->MCU_vert_offset
= yoffset
;
108 coef
->MCU_ctr
= MCU_col_num
;
109 return JPEG_SUSPENDED
;
112 /* Only perform the IDCT on blocks that are contained within the desired
115 if (MCU_col_num
>= cinfo
->master
->first_iMCU_col
&&
116 MCU_col_num
<= cinfo
->master
->last_iMCU_col
) {
117 /* Determine where data should go in output_buf and do the IDCT thing.
118 * We skip dummy blocks at the right and bottom edges (but blkn gets
119 * incremented past them!). Note the inner loop relies on having
120 * allocated the MCU_buffer[] blocks sequentially.
122 blkn
= 0; /* index of current DCT block within MCU */
123 for (ci
= 0; ci
< cinfo
->comps_in_scan
; ci
++) {
124 compptr
= cinfo
->cur_comp_info
[ci
];
125 /* Don't bother to IDCT an uninteresting component. */
126 if (!compptr
->component_needed
) {
127 blkn
+= compptr
->MCU_blocks
;
130 inverse_DCT
= cinfo
->idct
->inverse_DCT
[compptr
->component_index
];
131 useful_width
= (MCU_col_num
< last_MCU_col
) ?
132 compptr
->MCU_width
: compptr
->last_col_width
;
133 output_ptr
= output_buf
[compptr
->component_index
] +
134 yoffset
* compptr
->_DCT_scaled_size
;
135 start_col
= (MCU_col_num
- cinfo
->master
->first_iMCU_col
) *
136 compptr
->MCU_sample_width
;
137 for (yindex
= 0; yindex
< compptr
->MCU_height
; yindex
++) {
138 if (cinfo
->input_iMCU_row
< last_iMCU_row
||
139 yoffset
+ yindex
< compptr
->last_row_height
) {
140 output_col
= start_col
;
141 for (xindex
= 0; xindex
< useful_width
; xindex
++) {
142 (*inverse_DCT
) (cinfo
, compptr
,
143 (JCOEFPTR
)coef
->MCU_buffer
[blkn
+ xindex
],
144 output_ptr
, output_col
);
145 output_col
+= compptr
->_DCT_scaled_size
;
148 blkn
+= compptr
->MCU_width
;
149 output_ptr
+= compptr
->_DCT_scaled_size
;
154 /* Completed an MCU row, but perhaps not an iMCU row */
157 /* Completed the iMCU row, advance counters for next one */
158 cinfo
->output_iMCU_row
++;
159 if (++(cinfo
->input_iMCU_row
) < cinfo
->total_iMCU_rows
) {
160 start_iMCU_row(cinfo
);
161 return JPEG_ROW_COMPLETED
;
163 /* Completed the scan */
164 (*cinfo
->inputctl
->finish_input_pass
) (cinfo
);
165 return JPEG_SCAN_COMPLETED
;
170 * Dummy consume-input routine for single-pass operation.
174 dummy_consume_data(j_decompress_ptr cinfo
)
176 return JPEG_SUSPENDED
; /* Always indicate nothing was done */
180 #ifdef D_MULTISCAN_FILES_SUPPORTED
183 * Consume input data and store it in the full-image coefficient buffer.
184 * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
185 * ie, v_samp_factor block rows for each component in the scan.
186 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
190 consume_data(j_decompress_ptr cinfo
)
192 my_coef_ptr coef
= (my_coef_ptr
)cinfo
->coef
;
193 JDIMENSION MCU_col_num
; /* index of current MCU within row */
194 int blkn
, ci
, xindex
, yindex
, yoffset
;
195 JDIMENSION start_col
;
196 JBLOCKARRAY buffer
[MAX_COMPS_IN_SCAN
];
197 JBLOCKROW buffer_ptr
;
198 jpeg_component_info
*compptr
;
200 /* Align the virtual buffers for the components used in this scan. */
201 for (ci
= 0; ci
< cinfo
->comps_in_scan
; ci
++) {
202 compptr
= cinfo
->cur_comp_info
[ci
];
203 buffer
[ci
] = (*cinfo
->mem
->access_virt_barray
)
204 ((j_common_ptr
)cinfo
, coef
->whole_image
[compptr
->component_index
],
205 cinfo
->input_iMCU_row
* compptr
->v_samp_factor
,
206 (JDIMENSION
)compptr
->v_samp_factor
, TRUE
);
207 /* Note: entropy decoder expects buffer to be zeroed,
208 * but this is handled automatically by the memory manager
209 * because we requested a pre-zeroed array.
213 /* Loop to process one whole iMCU row */
214 for (yoffset
= coef
->MCU_vert_offset
; yoffset
< coef
->MCU_rows_per_iMCU_row
;
216 for (MCU_col_num
= coef
->MCU_ctr
; MCU_col_num
< cinfo
->MCUs_per_row
;
218 /* Construct list of pointers to DCT blocks belonging to this MCU */
219 blkn
= 0; /* index of current DCT block within MCU */
220 for (ci
= 0; ci
< cinfo
->comps_in_scan
; ci
++) {
221 compptr
= cinfo
->cur_comp_info
[ci
];
222 start_col
= MCU_col_num
* compptr
->MCU_width
;
223 for (yindex
= 0; yindex
< compptr
->MCU_height
; yindex
++) {
224 buffer_ptr
= buffer
[ci
][yindex
+ yoffset
] + start_col
;
225 for (xindex
= 0; xindex
< compptr
->MCU_width
; xindex
++) {
226 coef
->MCU_buffer
[blkn
++] = buffer_ptr
++;
230 /* Try to fetch the MCU. */
231 if (!(*cinfo
->entropy
->decode_mcu
) (cinfo
, coef
->MCU_buffer
)) {
232 /* Suspension forced; update state counters and exit */
233 coef
->MCU_vert_offset
= yoffset
;
234 coef
->MCU_ctr
= MCU_col_num
;
235 return JPEG_SUSPENDED
;
238 /* Completed an MCU row, but perhaps not an iMCU row */
241 /* Completed the iMCU row, advance counters for next one */
242 if (++(cinfo
->input_iMCU_row
) < cinfo
->total_iMCU_rows
) {
243 start_iMCU_row(cinfo
);
244 return JPEG_ROW_COMPLETED
;
246 /* Completed the scan */
247 (*cinfo
->inputctl
->finish_input_pass
) (cinfo
);
248 return JPEG_SCAN_COMPLETED
;
253 * Decompress and return some data in the multi-pass case.
254 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
255 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
257 * NB: output_buf contains a plane for each component in image.
261 decompress_data(j_decompress_ptr cinfo
, JSAMPIMAGE output_buf
)
263 my_coef_ptr coef
= (my_coef_ptr
)cinfo
->coef
;
264 JDIMENSION last_iMCU_row
= cinfo
->total_iMCU_rows
- 1;
265 JDIMENSION block_num
;
266 int ci
, block_row
, block_rows
;
268 JBLOCKROW buffer_ptr
;
269 JSAMPARRAY output_ptr
;
270 JDIMENSION output_col
;
271 jpeg_component_info
*compptr
;
272 inverse_DCT_method_ptr inverse_DCT
;
274 /* Force some input to be done if we are getting ahead of the input. */
275 while (cinfo
->input_scan_number
< cinfo
->output_scan_number
||
276 (cinfo
->input_scan_number
== cinfo
->output_scan_number
&&
277 cinfo
->input_iMCU_row
<= cinfo
->output_iMCU_row
)) {
278 if ((*cinfo
->inputctl
->consume_input
) (cinfo
) == JPEG_SUSPENDED
)
279 return JPEG_SUSPENDED
;
282 /* OK, output from the virtual arrays. */
283 for (ci
= 0, compptr
= cinfo
->comp_info
; ci
< cinfo
->num_components
;
285 /* Don't bother to IDCT an uninteresting component. */
286 if (!compptr
->component_needed
)
288 /* Align the virtual buffer for this component. */
289 buffer
= (*cinfo
->mem
->access_virt_barray
)
290 ((j_common_ptr
)cinfo
, coef
->whole_image
[ci
],
291 cinfo
->output_iMCU_row
* compptr
->v_samp_factor
,
292 (JDIMENSION
)compptr
->v_samp_factor
, FALSE
);
293 /* Count non-dummy DCT block rows in this iMCU row. */
294 if (cinfo
->output_iMCU_row
< last_iMCU_row
)
295 block_rows
= compptr
->v_samp_factor
;
297 /* NB: can't use last_row_height here; it is input-side-dependent! */
298 block_rows
= (int)(compptr
->height_in_blocks
% compptr
->v_samp_factor
);
299 if (block_rows
== 0) block_rows
= compptr
->v_samp_factor
;
301 inverse_DCT
= cinfo
->idct
->inverse_DCT
[ci
];
302 output_ptr
= output_buf
[ci
];
303 /* Loop over all DCT blocks to be processed. */
304 for (block_row
= 0; block_row
< block_rows
; block_row
++) {
305 buffer_ptr
= buffer
[block_row
] + cinfo
->master
->first_MCU_col
[ci
];
307 for (block_num
= cinfo
->master
->first_MCU_col
[ci
];
308 block_num
<= cinfo
->master
->last_MCU_col
[ci
]; block_num
++) {
309 (*inverse_DCT
) (cinfo
, compptr
, (JCOEFPTR
)buffer_ptr
, output_ptr
,
312 output_col
+= compptr
->_DCT_scaled_size
;
314 output_ptr
+= compptr
->_DCT_scaled_size
;
318 if (++(cinfo
->output_iMCU_row
) < cinfo
->total_iMCU_rows
)
319 return JPEG_ROW_COMPLETED
;
320 return JPEG_SCAN_COMPLETED
;
323 #endif /* D_MULTISCAN_FILES_SUPPORTED */
326 #ifdef BLOCK_SMOOTHING_SUPPORTED
329 * This code applies interblock smoothing as described by section K.8
330 * of the JPEG standard: the first 5 AC coefficients are estimated from
331 * the DC values of a DCT block and its 8 neighboring blocks.
332 * We apply smoothing only for progressive JPEG decoding, and only if
333 * the coefficients it can estimate are not yet known to full precision.
336 /* Natural-order array positions of the first 5 zigzag-order coefficients */
344 * Determine whether block smoothing is applicable and safe.
345 * We also latch the current states of the coef_bits[] entries for the
346 * AC coefficients; otherwise, if the input side of the decompressor
347 * advances into a new scan, we might think the coefficients are known
348 * more accurately than they really are.
352 smoothing_ok(j_decompress_ptr cinfo
)
354 my_coef_ptr coef
= (my_coef_ptr
)cinfo
->coef
;
355 boolean smoothing_useful
= FALSE
;
357 jpeg_component_info
*compptr
;
360 int *coef_bits_latch
;
362 if (!cinfo
->progressive_mode
|| cinfo
->coef_bits
== NULL
)
365 /* Allocate latch area if not already done */
366 if (coef
->coef_bits_latch
== NULL
)
367 coef
->coef_bits_latch
= (int *)
368 (*cinfo
->mem
->alloc_small
) ((j_common_ptr
)cinfo
, JPOOL_IMAGE
,
369 cinfo
->num_components
*
370 (SAVED_COEFS
* sizeof(int)));
371 coef_bits_latch
= coef
->coef_bits_latch
;
373 for (ci
= 0, compptr
= cinfo
->comp_info
; ci
< cinfo
->num_components
;
375 /* All components' quantization values must already be latched. */
376 if ((qtable
= compptr
->quant_table
) == NULL
)
378 /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */
379 if (qtable
->quantval
[0] == 0 ||
380 qtable
->quantval
[Q01_POS
] == 0 ||
381 qtable
->quantval
[Q10_POS
] == 0 ||
382 qtable
->quantval
[Q20_POS
] == 0 ||
383 qtable
->quantval
[Q11_POS
] == 0 ||
384 qtable
->quantval
[Q02_POS
] == 0)
386 /* DC values must be at least partly known for all components. */
387 coef_bits
= cinfo
->coef_bits
[ci
];
388 if (coef_bits
[0] < 0)
390 /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
391 for (coefi
= 1; coefi
<= 5; coefi
++) {
392 coef_bits_latch
[coefi
] = coef_bits
[coefi
];
393 if (coef_bits
[coefi
] != 0)
394 smoothing_useful
= TRUE
;
396 coef_bits_latch
+= SAVED_COEFS
;
399 return smoothing_useful
;
404 * Variant of decompress_data for use when doing block smoothing.
408 decompress_smooth_data(j_decompress_ptr cinfo
, JSAMPIMAGE output_buf
)
410 my_coef_ptr coef
= (my_coef_ptr
)cinfo
->coef
;
411 JDIMENSION last_iMCU_row
= cinfo
->total_iMCU_rows
- 1;
412 JDIMENSION block_num
, last_block_column
;
413 int ci
, block_row
, block_rows
, access_rows
;
415 JBLOCKROW buffer_ptr
, prev_block_row
, next_block_row
;
416 JSAMPARRAY output_ptr
;
417 JDIMENSION output_col
;
418 jpeg_component_info
*compptr
;
419 inverse_DCT_method_ptr inverse_DCT
;
420 boolean first_row
, last_row
;
423 JQUANT_TBL
*quanttbl
;
424 JLONG Q00
, Q01
, Q02
, Q10
, Q11
, Q20
, num
;
425 int DC1
, DC2
, DC3
, DC4
, DC5
, DC6
, DC7
, DC8
, DC9
;
428 /* Keep a local variable to avoid looking it up more than once */
429 workspace
= coef
->workspace
;
431 /* Force some input to be done if we are getting ahead of the input. */
432 while (cinfo
->input_scan_number
<= cinfo
->output_scan_number
&&
433 !cinfo
->inputctl
->eoi_reached
) {
434 if (cinfo
->input_scan_number
== cinfo
->output_scan_number
) {
435 /* If input is working on current scan, we ordinarily want it to
436 * have completed the current row. But if input scan is DC,
437 * we want it to keep one row ahead so that next block row's DC
438 * values are up to date.
440 JDIMENSION delta
= (cinfo
->Ss
== 0) ? 1 : 0;
441 if (cinfo
->input_iMCU_row
> cinfo
->output_iMCU_row
+ delta
)
444 if ((*cinfo
->inputctl
->consume_input
) (cinfo
) == JPEG_SUSPENDED
)
445 return JPEG_SUSPENDED
;
448 /* OK, output from the virtual arrays. */
449 for (ci
= 0, compptr
= cinfo
->comp_info
; ci
< cinfo
->num_components
;
451 /* Don't bother to IDCT an uninteresting component. */
452 if (!compptr
->component_needed
)
454 /* Count non-dummy DCT block rows in this iMCU row. */
455 if (cinfo
->output_iMCU_row
< last_iMCU_row
) {
456 block_rows
= compptr
->v_samp_factor
;
457 access_rows
= block_rows
* 2; /* this and next iMCU row */
460 /* NB: can't use last_row_height here; it is input-side-dependent! */
461 block_rows
= (int)(compptr
->height_in_blocks
% compptr
->v_samp_factor
);
462 if (block_rows
== 0) block_rows
= compptr
->v_samp_factor
;
463 access_rows
= block_rows
; /* this iMCU row only */
466 /* Align the virtual buffer for this component. */
467 if (cinfo
->output_iMCU_row
> 0) {
468 access_rows
+= compptr
->v_samp_factor
; /* prior iMCU row too */
469 buffer
= (*cinfo
->mem
->access_virt_barray
)
470 ((j_common_ptr
)cinfo
, coef
->whole_image
[ci
],
471 (cinfo
->output_iMCU_row
- 1) * compptr
->v_samp_factor
,
472 (JDIMENSION
)access_rows
, FALSE
);
473 buffer
+= compptr
->v_samp_factor
; /* point to current iMCU row */
476 buffer
= (*cinfo
->mem
->access_virt_barray
)
477 ((j_common_ptr
)cinfo
, coef
->whole_image
[ci
],
478 (JDIMENSION
)0, (JDIMENSION
)access_rows
, FALSE
);
481 /* Fetch component-dependent info */
482 coef_bits
= coef
->coef_bits_latch
+ (ci
* SAVED_COEFS
);
483 quanttbl
= compptr
->quant_table
;
484 Q00
= quanttbl
->quantval
[0];
485 Q01
= quanttbl
->quantval
[Q01_POS
];
486 Q10
= quanttbl
->quantval
[Q10_POS
];
487 Q20
= quanttbl
->quantval
[Q20_POS
];
488 Q11
= quanttbl
->quantval
[Q11_POS
];
489 Q02
= quanttbl
->quantval
[Q02_POS
];
490 inverse_DCT
= cinfo
->idct
->inverse_DCT
[ci
];
491 output_ptr
= output_buf
[ci
];
492 /* Loop over all DCT blocks to be processed. */
493 for (block_row
= 0; block_row
< block_rows
; block_row
++) {
494 buffer_ptr
= buffer
[block_row
] + cinfo
->master
->first_MCU_col
[ci
];
495 if (first_row
&& block_row
== 0)
496 prev_block_row
= buffer_ptr
;
498 prev_block_row
= buffer
[block_row
- 1] +
499 cinfo
->master
->first_MCU_col
[ci
];
500 if (last_row
&& block_row
== block_rows
- 1)
501 next_block_row
= buffer_ptr
;
503 next_block_row
= buffer
[block_row
+ 1] +
504 cinfo
->master
->first_MCU_col
[ci
];
505 /* We fetch the surrounding DC values using a sliding-register approach.
506 * Initialize all nine here so as to do the right thing on narrow pics.
508 DC1
= DC2
= DC3
= (int)prev_block_row
[0][0];
509 DC4
= DC5
= DC6
= (int)buffer_ptr
[0][0];
510 DC7
= DC8
= DC9
= (int)next_block_row
[0][0];
512 last_block_column
= compptr
->width_in_blocks
- 1;
513 for (block_num
= cinfo
->master
->first_MCU_col
[ci
];
514 block_num
<= cinfo
->master
->last_MCU_col
[ci
]; block_num
++) {
515 /* Fetch current DCT block into workspace so we can modify it. */
516 jcopy_block_row(buffer_ptr
, (JBLOCKROW
)workspace
, (JDIMENSION
)1);
517 /* Update DC values */
518 if (block_num
< last_block_column
) {
519 DC3
= (int)prev_block_row
[1][0];
520 DC6
= (int)buffer_ptr
[1][0];
521 DC9
= (int)next_block_row
[1][0];
523 /* Compute coefficient estimates per K.8.
524 * An estimate is applied only if coefficient is still zero,
525 * and is not known to be fully accurate.
528 if ((Al
= coef_bits
[1]) != 0 && workspace
[1] == 0) {
529 num
= 36 * Q00
* (DC4
- DC6
);
531 pred
= (int)(((Q01
<< 7) + num
) / (Q01
<< 8));
532 if (Al
> 0 && pred
>= (1 << Al
))
533 pred
= (1 << Al
) - 1;
535 pred
= (int)(((Q01
<< 7) - num
) / (Q01
<< 8));
536 if (Al
> 0 && pred
>= (1 << Al
))
537 pred
= (1 << Al
) - 1;
540 workspace
[1] = (JCOEF
)pred
;
543 if ((Al
= coef_bits
[2]) != 0 && workspace
[8] == 0) {
544 num
= 36 * Q00
* (DC2
- DC8
);
546 pred
= (int)(((Q10
<< 7) + num
) / (Q10
<< 8));
547 if (Al
> 0 && pred
>= (1 << Al
))
548 pred
= (1 << Al
) - 1;
550 pred
= (int)(((Q10
<< 7) - num
) / (Q10
<< 8));
551 if (Al
> 0 && pred
>= (1 << Al
))
552 pred
= (1 << Al
) - 1;
555 workspace
[8] = (JCOEF
)pred
;
558 if ((Al
= coef_bits
[3]) != 0 && workspace
[16] == 0) {
559 num
= 9 * Q00
* (DC2
+ DC8
- 2 * DC5
);
561 pred
= (int)(((Q20
<< 7) + num
) / (Q20
<< 8));
562 if (Al
> 0 && pred
>= (1 << Al
))
563 pred
= (1 << Al
) - 1;
565 pred
= (int)(((Q20
<< 7) - num
) / (Q20
<< 8));
566 if (Al
> 0 && pred
>= (1 << Al
))
567 pred
= (1 << Al
) - 1;
570 workspace
[16] = (JCOEF
)pred
;
573 if ((Al
= coef_bits
[4]) != 0 && workspace
[9] == 0) {
574 num
= 5 * Q00
* (DC1
- DC3
- DC7
+ DC9
);
576 pred
= (int)(((Q11
<< 7) + num
) / (Q11
<< 8));
577 if (Al
> 0 && pred
>= (1 << Al
))
578 pred
= (1 << Al
) - 1;
580 pred
= (int)(((Q11
<< 7) - num
) / (Q11
<< 8));
581 if (Al
> 0 && pred
>= (1 << Al
))
582 pred
= (1 << Al
) - 1;
585 workspace
[9] = (JCOEF
)pred
;
588 if ((Al
= coef_bits
[5]) != 0 && workspace
[2] == 0) {
589 num
= 9 * Q00
* (DC4
+ DC6
- 2 * DC5
);
591 pred
= (int)(((Q02
<< 7) + num
) / (Q02
<< 8));
592 if (Al
> 0 && pred
>= (1 << Al
))
593 pred
= (1 << Al
) - 1;
595 pred
= (int)(((Q02
<< 7) - num
) / (Q02
<< 8));
596 if (Al
> 0 && pred
>= (1 << Al
))
597 pred
= (1 << Al
) - 1;
600 workspace
[2] = (JCOEF
)pred
;
602 /* OK, do the IDCT */
603 (*inverse_DCT
) (cinfo
, compptr
, (JCOEFPTR
)workspace
, output_ptr
,
605 /* Advance for next column */
606 DC1
= DC2
; DC2
= DC3
;
607 DC4
= DC5
; DC5
= DC6
;
608 DC7
= DC8
; DC8
= DC9
;
609 buffer_ptr
++, prev_block_row
++, next_block_row
++;
610 output_col
+= compptr
->_DCT_scaled_size
;
612 output_ptr
+= compptr
->_DCT_scaled_size
;
616 if (++(cinfo
->output_iMCU_row
) < cinfo
->total_iMCU_rows
)
617 return JPEG_ROW_COMPLETED
;
618 return JPEG_SCAN_COMPLETED
;
621 #endif /* BLOCK_SMOOTHING_SUPPORTED */
625 * Initialize coefficient buffer controller.
629 jinit_d_coef_controller(j_decompress_ptr cinfo
, boolean need_full_buffer
)
634 (*cinfo
->mem
->alloc_small
) ((j_common_ptr
)cinfo
, JPOOL_IMAGE
,
635 sizeof(my_coef_controller
));
636 cinfo
->coef
= (struct jpeg_d_coef_controller
*)coef
;
637 coef
->pub
.start_input_pass
= start_input_pass
;
638 coef
->pub
.start_output_pass
= start_output_pass
;
639 #ifdef BLOCK_SMOOTHING_SUPPORTED
640 coef
->coef_bits_latch
= NULL
;
643 /* Create the coefficient buffer. */
644 if (need_full_buffer
) {
645 #ifdef D_MULTISCAN_FILES_SUPPORTED
646 /* Allocate a full-image virtual array for each component, */
647 /* padded to a multiple of samp_factor DCT blocks in each direction. */
648 /* Note we ask for a pre-zeroed array. */
650 jpeg_component_info
*compptr
;
652 for (ci
= 0, compptr
= cinfo
->comp_info
; ci
< cinfo
->num_components
;
654 access_rows
= compptr
->v_samp_factor
;
655 #ifdef BLOCK_SMOOTHING_SUPPORTED
656 /* If block smoothing could be used, need a bigger window */
657 if (cinfo
->progressive_mode
)
660 coef
->whole_image
[ci
] = (*cinfo
->mem
->request_virt_barray
)
661 ((j_common_ptr
)cinfo
, JPOOL_IMAGE
, TRUE
,
662 (JDIMENSION
)jround_up((long)compptr
->width_in_blocks
,
663 (long)compptr
->h_samp_factor
),
664 (JDIMENSION
)jround_up((long)compptr
->height_in_blocks
,
665 (long)compptr
->v_samp_factor
),
666 (JDIMENSION
)access_rows
);
668 coef
->pub
.consume_data
= consume_data
;
669 coef
->pub
.decompress_data
= decompress_data
;
670 coef
->pub
.coef_arrays
= coef
->whole_image
; /* link to virtual arrays */
672 ERREXIT(cinfo
, JERR_NOT_COMPILED
);
675 /* We only need a single-MCU buffer. */
680 (*cinfo
->mem
->alloc_large
) ((j_common_ptr
)cinfo
, JPOOL_IMAGE
,
681 D_MAX_BLOCKS_IN_MCU
* sizeof(JBLOCK
));
682 for (i
= 0; i
< D_MAX_BLOCKS_IN_MCU
; i
++) {
683 coef
->MCU_buffer
[i
] = buffer
+ i
;
685 coef
->pub
.consume_data
= dummy_consume_data
;
686 coef
->pub
.decompress_data
= decompress_onepass
;
687 coef
->pub
.coef_arrays
= NULL
; /* flag for no virtual arrays */
690 /* Allocate the workspace buffer */
691 coef
->workspace
= (JCOEF
*)
692 (*cinfo
->mem
->alloc_small
) ((j_common_ptr
)cinfo
, JPOOL_IMAGE
,
693 sizeof(JCOEF
) * DCTSIZE2
);