1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if !defined(_FX_JPEG_TURBO_) 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * jdcoefct.c 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (C) 1994-1997, Thomas G. Lane. 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This file is part of the Independent JPEG Group's software. 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * For conditions of distribution and use, see the accompanying README file. 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This file contains the coefficient buffer controller for decompression. 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This controller is the top level of the JPEG decompressor proper. 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * The coefficient buffer lies between entropy decoding and inverse-DCT steps. 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * In buffered-image mode, this controller is the interface between 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * input-oriented processing and output-oriented processing. 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Also, the input side (only) is used when reading a file for transcoding. 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JPEG_INTERNALS 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "jinclude.h" 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "jpeglib.h" 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Block smoothing is only applicable for progressive JPEG, so: */ 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef D_PROGRESSIVE_SUPPORTED 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef BLOCK_SMOOTHING_SUPPORTED 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Private buffer controller object */ 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct { 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct jpeg_d_coef_controller pub; /* public fields */ 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* These variables keep track of the current location of the input side. */ 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* cinfo->input_iMCU_row is also used for this. */ 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION MCU_ctr; /* counts MCUs processed in current row */ 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int MCU_vert_offset; /* counts MCU rows within iMCU row */ 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int MCU_rows_per_iMCU_row; /* number of such rows needed */ 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The output side's location is represented by cinfo->output_iMCU_row. */ 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* In single-pass modes, it's sufficient to buffer just one MCU. 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks, 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * and let the entropy decoder write into that workspace each time. 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * (On 80x86, the workspace is FAR even though it's not really very big; 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * this is to keep the module interfaces unchanged when a large coefficient 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * buffer is necessary.) 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * In multi-pass modes, this array points to the current MCU's blocks 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * within the virtual arrays; it is used only by the input side. 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU]; 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef D_MULTISCAN_FILES_SUPPORTED 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* In multi-pass modes, we need a virtual block array for each component. */ 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov jvirt_barray_ptr whole_image[MAX_COMPONENTS]; 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef BLOCK_SMOOTHING_SUPPORTED 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* When doing block smoothing, we latch coefficient Al values here */ 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int * coef_bits_latch; 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define SAVED_COEFS 6 /* we save coef_bits[0..5] */ 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} my_coef_controller; 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef my_coef_controller * my_coef_ptr; 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Forward declarations */ 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(int) decompress_onepass 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef D_MULTISCAN_FILES_SUPPORTED 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(int) decompress_data 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef BLOCK_SMOOTHING_SUPPORTED 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo)); 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(int) decompress_smooth_data 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLOCAL(void) 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstart_iMCU_row (j_decompress_ptr cinfo) 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Reset within-iMCU-row counters for a new row (input side) */ 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* In an interleaved scan, an MCU row is the same as an iMCU row. 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * But at the bottom of the image, process only what's left. 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cinfo->comps_in_scan > 1) { 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_rows_per_iMCU_row = 1; 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1)) 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_ctr = 0; 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_vert_offset = 0; 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Initialize for an input processing pass. 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(void) 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstart_input_pass (j_decompress_ptr cinfo) 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cinfo->input_iMCU_row = 0; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov start_iMCU_row(cinfo); 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Initialize for an output processing pass. 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(void) 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstart_output_pass (j_decompress_ptr cinfo) 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef BLOCK_SMOOTHING_SUPPORTED 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* If multipass, check to see whether to use block smoothing on this pass */ 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (coef->pub.coef_arrays != NULL) { 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cinfo->do_block_smoothing && smoothing_ok(cinfo)) 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->pub.decompress_data = decompress_smooth_data; 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->pub.decompress_data = decompress_data; 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cinfo->output_iMCU_row = 0; 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Decompress and return some data in the single-pass case. 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Always attempts to emit one fully interleaved MCU row ("iMCU" row). 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Input and output must run in lockstep since we have only a one-MCU buffer. 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * NB: output_buf contains a plane for each component in image, 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * which we index according to the component's SOF position. 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(int) 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdecompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION MCU_col_num; /* index of current MCU within row */ 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int blkn, ci, xindex, yindex, yoffset, useful_width; 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JSAMPARRAY output_ptr; 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION start_col, output_col; 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov jpeg_component_info *compptr; 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inverse_DCT_method_ptr inverse_DCT; 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Loop to process as much as one whole iMCU row */ 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov yoffset++) { 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov MCU_col_num++) { 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov jzero_far((void FAR *) coef->MCU_buffer[0], 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK))); 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Suspension forced; update state counters and exit */ 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_vert_offset = yoffset; 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_ctr = MCU_col_num; 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_SUSPENDED; 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Determine where data should go in output_buf and do the IDCT thing. 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * We skip dummy blocks at the right and bottom edges (but blkn gets 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * incremented past them!). Note the inner loop relies on having 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * allocated the MCU_buffer[] blocks sequentially. 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov blkn = 0; /* index of current DCT block within MCU */ 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov compptr = cinfo->cur_comp_info[ci]; 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Don't bother to IDCT an uninteresting component. */ 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! compptr->component_needed) { 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov blkn += compptr->MCU_blocks; 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index]; 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov : compptr->last_col_width; 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_ptr = output_buf[compptr->component_index] + 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov yoffset * compptr->DCT_scaled_size; 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov start_col = MCU_col_num * compptr->MCU_sample_width; 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (yindex = 0; yindex < compptr->MCU_height; yindex++) { 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cinfo->input_iMCU_row < last_iMCU_row || 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov yoffset+yindex < compptr->last_row_height) { 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_col = start_col; 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (xindex = 0; xindex < useful_width; xindex++) { 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (*inverse_DCT) (cinfo, compptr, 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (JCOEFPTR) coef->MCU_buffer[blkn+xindex], 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_ptr, output_col); 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_col += compptr->DCT_scaled_size; 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov blkn += compptr->MCU_width; 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_ptr += compptr->DCT_scaled_size; 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Completed an MCU row, but perhaps not an iMCU row */ 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_ctr = 0; 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Completed the iMCU row, advance counters for next one */ 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cinfo->output_iMCU_row++; 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov start_iMCU_row(cinfo); 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_ROW_COMPLETED; 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Completed the scan */ 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (*cinfo->inputctl->finish_input_pass) (cinfo); 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_SCAN_COMPLETED; 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Dummy consume-input routine for single-pass operation. 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(int) 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdummy_consume_data (j_decompress_ptr cinfo) 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_SUSPENDED; /* Always indicate nothing was done */ 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef D_MULTISCAN_FILES_SUPPORTED 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Consume input data and store it in the full-image coefficient buffer. 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * We read as much as one fully interleaved MCU row ("iMCU" row) per call, 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * ie, v_samp_factor block rows for each component in the scan. 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(int) 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovconsume_data (j_decompress_ptr cinfo) 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION MCU_col_num; /* index of current MCU within row */ 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int blkn, ci, xindex, yindex, yoffset; 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION start_col; 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JBLOCKROW buffer_ptr; 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov jpeg_component_info *compptr; 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Align the virtual buffers for the components used in this scan. */ 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov compptr = cinfo->cur_comp_info[ci]; 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buffer[ci] = (*cinfo->mem->access_virt_barray) 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cinfo->input_iMCU_row * compptr->v_samp_factor, 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (JDIMENSION) compptr->v_samp_factor, TRUE); 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Note: entropy decoder expects buffer to be zeroed, 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * but this is handled automatically by the memory manager 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * because we requested a pre-zeroed array. 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Loop to process one whole iMCU row */ 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov yoffset++) { 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row; 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov MCU_col_num++) { 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Construct list of pointers to DCT blocks belonging to this MCU */ 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov blkn = 0; /* index of current DCT block within MCU */ 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov compptr = cinfo->cur_comp_info[ci]; 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov start_col = MCU_col_num * compptr->MCU_width; 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (yindex = 0; yindex < compptr->MCU_height; yindex++) { 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buffer_ptr = buffer[ci][yindex+yoffset] + start_col; 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (xindex = 0; xindex < compptr->MCU_width; xindex++) { 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_buffer[blkn++] = buffer_ptr++; 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Try to fetch the MCU. */ 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Suspension forced; update state counters and exit */ 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_vert_offset = yoffset; 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_ctr = MCU_col_num; 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_SUSPENDED; 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Completed an MCU row, but perhaps not an iMCU row */ 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_ctr = 0; 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Completed the iMCU row, advance counters for next one */ 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov start_iMCU_row(cinfo); 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_ROW_COMPLETED; 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Completed the scan */ 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (*cinfo->inputctl->finish_input_pass) (cinfo); 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_SCAN_COMPLETED; 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Decompress and return some data in the multi-pass case. 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Always attempts to emit one fully interleaved MCU row ("iMCU" row). 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * NB: output_buf contains a plane for each component in image. 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(int) 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdecompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION block_num; 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ci, block_row, block_rows; 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JBLOCKARRAY buffer; 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JBLOCKROW buffer_ptr; 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JSAMPARRAY output_ptr; 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION output_col; 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov jpeg_component_info *compptr; 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inverse_DCT_method_ptr inverse_DCT; 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Force some input to be done if we are getting ahead of the input. */ 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (cinfo->input_scan_number < cinfo->output_scan_number || 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (cinfo->input_scan_number == cinfo->output_scan_number && 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) { 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_SUSPENDED; 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* OK, output from the virtual arrays. */ 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ci++, compptr++) { 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Don't bother to IDCT an uninteresting component. */ 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! compptr->component_needed) 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Align the virtual buffer for this component. */ 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buffer = (*cinfo->mem->access_virt_barray) 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((j_common_ptr) cinfo, coef->whole_image[ci], 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cinfo->output_iMCU_row * compptr->v_samp_factor, 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (JDIMENSION) compptr->v_samp_factor, FALSE); 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Count non-dummy DCT block rows in this iMCU row. */ 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cinfo->output_iMCU_row < last_iMCU_row) 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov block_rows = compptr->v_samp_factor; 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else { 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* NB: can't use last_row_height here; it is input-side-dependent! */ 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (block_rows == 0) block_rows = compptr->v_samp_factor; 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inverse_DCT = cinfo->idct->inverse_DCT[ci]; 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_ptr = output_buf[ci]; 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Loop over all DCT blocks to be processed. */ 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (block_row = 0; block_row < block_rows; block_row++) { 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buffer_ptr = buffer[block_row]; 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_col = 0; 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) { 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr, 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_ptr, output_col); 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buffer_ptr++; 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_col += compptr->DCT_scaled_size; 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_ptr += compptr->DCT_scaled_size; 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_ROW_COMPLETED; 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_SCAN_COMPLETED; 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* D_MULTISCAN_FILES_SUPPORTED */ 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef BLOCK_SMOOTHING_SUPPORTED 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This code applies interblock smoothing as described by section K.8 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * of the JPEG standard: the first 5 AC coefficients are estimated from 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * the DC values of a DCT block and its 8 neighboring blocks. 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * We apply smoothing only for progressive JPEG decoding, and only if 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * the coefficients it can estimate are not yet known to full precision. 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Natural-order array positions of the first 5 zigzag-order coefficients */ 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define Q01_POS 1 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define Q10_POS 8 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define Q20_POS 16 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define Q11_POS 9 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define Q02_POS 2 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Determine whether block smoothing is applicable and safe. 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * We also latch the current states of the coef_bits[] entries for the 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * AC coefficients; otherwise, if the input side of the decompressor 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * advances into a new scan, we might think the coefficients are known 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * more accurately than they really are. 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLOCAL(boolean) 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovsmoothing_ok (j_decompress_ptr cinfo) 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov boolean smoothing_useful = FALSE; 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ci, coefi; 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov jpeg_component_info *compptr; 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JQUANT_TBL * qtable; 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int * coef_bits; 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int * coef_bits_latch; 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! cinfo->progressive_mode || cinfo->coef_bits == NULL) 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Allocate latch area if not already done */ 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (coef->coef_bits_latch == NULL) 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->coef_bits_latch = (int *) 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cinfo->num_components * 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (SAVED_COEFS * SIZEOF(int))); 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef_bits_latch = coef->coef_bits_latch; 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ci++, compptr++) { 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* All components' quantization values must already be latched. */ 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((qtable = compptr->quant_table) == NULL) 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */ 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (qtable->quantval[0] == 0 || 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov qtable->quantval[Q01_POS] == 0 || 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov qtable->quantval[Q10_POS] == 0 || 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov qtable->quantval[Q20_POS] == 0 || 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov qtable->quantval[Q11_POS] == 0 || 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov qtable->quantval[Q02_POS] == 0) 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* DC values must be at least partly known for all components. */ 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef_bits = cinfo->coef_bits[ci]; 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (coef_bits[0] < 0) 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Block smoothing is helpful if some AC coefficients remain inaccurate. */ 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (coefi = 1; coefi <= 5; coefi++) { 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef_bits_latch[coefi] = coef_bits[coefi]; 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (coef_bits[coefi] != 0) 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov smoothing_useful = TRUE; 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef_bits_latch += SAVED_COEFS; 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return smoothing_useful; 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Variant of decompress_data for use when doing block smoothing. 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(int) 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdecompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION block_num, last_block_column; 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ci, block_row, block_rows, access_rows; 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JBLOCKARRAY buffer; 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JBLOCKROW buffer_ptr, prev_block_row, next_block_row; 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JSAMPARRAY output_ptr; 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION output_col; 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov jpeg_component_info *compptr; 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inverse_DCT_method_ptr inverse_DCT; 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov boolean first_row, last_row; 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JBLOCK workspace; 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int *coef_bits; 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JQUANT_TBL *quanttbl; 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov INT32 Q00,Q01,Q02,Q10,Q11,Q20, num; 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9; 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int Al, pred; 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Force some input to be done if we are getting ahead of the input. */ 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (cinfo->input_scan_number <= cinfo->output_scan_number && 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ! cinfo->inputctl->eoi_reached) { 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cinfo->input_scan_number == cinfo->output_scan_number) { 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* If input is working on current scan, we ordinarily want it to 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * have completed the current row. But if input scan is DC, 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * we want it to keep one row ahead so that next block row's DC 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * values are up to date. 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0; 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta) 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_SUSPENDED; 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* OK, output from the virtual arrays. */ 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ci++, compptr++) { 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Don't bother to IDCT an uninteresting component. */ 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (! compptr->component_needed) 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Count non-dummy DCT block rows in this iMCU row. */ 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cinfo->output_iMCU_row < last_iMCU_row) { 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov block_rows = compptr->v_samp_factor; 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov access_rows = block_rows * 2; /* this and next iMCU row */ 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last_row = FALSE; 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* NB: can't use last_row_height here; it is input-side-dependent! */ 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (block_rows == 0) block_rows = compptr->v_samp_factor; 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov access_rows = block_rows; /* this iMCU row only */ 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last_row = TRUE; 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Align the virtual buffer for this component. */ 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cinfo->output_iMCU_row > 0) { 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov access_rows += compptr->v_samp_factor; /* prior iMCU row too */ 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buffer = (*cinfo->mem->access_virt_barray) 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((j_common_ptr) cinfo, coef->whole_image[ci], 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor, 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (JDIMENSION) access_rows, FALSE); 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buffer += compptr->v_samp_factor; /* point to current iMCU row */ 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov first_row = FALSE; 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buffer = (*cinfo->mem->access_virt_barray) 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((j_common_ptr) cinfo, coef->whole_image[ci], 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE); 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov first_row = TRUE; 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Fetch component-dependent info */ 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS); 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov quanttbl = compptr->quant_table; 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Q00 = quanttbl->quantval[0]; 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Q01 = quanttbl->quantval[Q01_POS]; 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Q10 = quanttbl->quantval[Q10_POS]; 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Q20 = quanttbl->quantval[Q20_POS]; 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Q11 = quanttbl->quantval[Q11_POS]; 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Q02 = quanttbl->quantval[Q02_POS]; 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inverse_DCT = cinfo->idct->inverse_DCT[ci]; 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_ptr = output_buf[ci]; 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Loop over all DCT blocks to be processed. */ 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (block_row = 0; block_row < block_rows; block_row++) { 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buffer_ptr = buffer[block_row]; 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (first_row && block_row == 0) 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prev_block_row = buffer_ptr; 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prev_block_row = buffer[block_row-1]; 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (last_row && block_row == block_rows-1) 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov next_block_row = buffer_ptr; 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov next_block_row = buffer[block_row+1]; 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* We fetch the surrounding DC values using a sliding-register approach. 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Initialize all nine here so as to do the right thing on narrow pics. 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DC1 = DC2 = DC3 = (int) prev_block_row[0][0]; 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DC4 = DC5 = DC6 = (int) buffer_ptr[0][0]; 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DC7 = DC8 = DC9 = (int) next_block_row[0][0]; 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_col = 0; 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last_block_column = compptr->width_in_blocks - 1; 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (block_num = 0; block_num <= last_block_column; block_num++) { 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Fetch current DCT block into workspace so we can modify it. */ 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1); 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Update DC values */ 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (block_num < last_block_column) { 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DC3 = (int) prev_block_row[1][0]; 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DC6 = (int) buffer_ptr[1][0]; 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DC9 = (int) next_block_row[1][0]; 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Compute coefficient estimates per K.8. 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * An estimate is applied only if coefficient is still zero, 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * and is not known to be fully accurate. 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* AC01 */ 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) { 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov num = 36 * Q00 * (DC4 - DC6); 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (num >= 0) { 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (int) (((Q01<<7) + num) / (Q01<<8)); 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Al > 0 && pred >= (1<<Al)) 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (1<<Al)-1; 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (int) (((Q01<<7) - num) / (Q01<<8)); 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Al > 0 && pred >= (1<<Al)) 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (1<<Al)-1; 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = -pred; 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov workspace[1] = (JCOEF) pred; 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* AC10 */ 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((Al=coef_bits[2]) != 0 && workspace[8] == 0) { 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov num = 36 * Q00 * (DC2 - DC8); 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (num >= 0) { 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (int) (((Q10<<7) + num) / (Q10<<8)); 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Al > 0 && pred >= (1<<Al)) 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (1<<Al)-1; 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (int) (((Q10<<7) - num) / (Q10<<8)); 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Al > 0 && pred >= (1<<Al)) 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (1<<Al)-1; 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = -pred; 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov workspace[8] = (JCOEF) pred; 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* AC20 */ 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((Al=coef_bits[3]) != 0 && workspace[16] == 0) { 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov num = 9 * Q00 * (DC2 + DC8 - 2*DC5); 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (num >= 0) { 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (int) (((Q20<<7) + num) / (Q20<<8)); 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Al > 0 && pred >= (1<<Al)) 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (1<<Al)-1; 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (int) (((Q20<<7) - num) / (Q20<<8)); 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Al > 0 && pred >= (1<<Al)) 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (1<<Al)-1; 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = -pred; 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov workspace[16] = (JCOEF) pred; 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* AC11 */ 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((Al=coef_bits[4]) != 0 && workspace[9] == 0) { 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9); 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (num >= 0) { 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (int) (((Q11<<7) + num) / (Q11<<8)); 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Al > 0 && pred >= (1<<Al)) 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (1<<Al)-1; 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (int) (((Q11<<7) - num) / (Q11<<8)); 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Al > 0 && pred >= (1<<Al)) 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (1<<Al)-1; 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = -pred; 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov workspace[9] = (JCOEF) pred; 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* AC02 */ 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((Al=coef_bits[5]) != 0 && workspace[2] == 0) { 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov num = 9 * Q00 * (DC4 + DC6 - 2*DC5); 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (num >= 0) { 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (int) (((Q02<<7) + num) / (Q02<<8)); 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Al > 0 && pred >= (1<<Al)) 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (1<<Al)-1; 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (int) (((Q02<<7) - num) / (Q02<<8)); 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Al > 0 && pred >= (1<<Al)) 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = (1<<Al)-1; 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pred = -pred; 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov workspace[2] = (JCOEF) pred; 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* OK, do the IDCT */ 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) workspace, 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_ptr, output_col); 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Advance for next column */ 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DC1 = DC2; DC2 = DC3; 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DC4 = DC5; DC5 = DC6; 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov DC7 = DC8; DC8 = DC9; 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buffer_ptr++, prev_block_row++, next_block_row++; 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_col += compptr->DCT_scaled_size; 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov output_ptr += compptr->DCT_scaled_size; 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_ROW_COMPLETED; 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return JPEG_SCAN_COMPLETED; 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* BLOCK_SMOOTHING_SUPPORTED */ 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Initialize coefficient buffer controller. 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */ 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovGLOBAL(void) 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovjinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer) 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov my_coef_ptr coef; 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef = (my_coef_ptr) 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov SIZEOF(my_coef_controller)); 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov cinfo->coef = (struct jpeg_d_coef_controller *) coef; 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->pub.start_input_pass = start_input_pass; 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->pub.start_output_pass = start_output_pass; 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef BLOCK_SMOOTHING_SUPPORTED 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->coef_bits_latch = NULL; 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Create the coefficient buffer. */ 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (need_full_buffer) { 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef D_MULTISCAN_FILES_SUPPORTED 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Allocate a full-image virtual array for each component, */ 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* padded to a multiple of samp_factor DCT blocks in each direction. */ 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Note we ask for a pre-zeroed array. */ 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ci, access_rows; 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov jpeg_component_info *compptr; 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ci++, compptr++) { 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov access_rows = compptr->v_samp_factor; 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef BLOCK_SMOOTHING_SUPPORTED 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* If block smoothing could be used, need a bigger window */ 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (cinfo->progressive_mode) 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov access_rows *= 3; 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE, 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (JDIMENSION) jround_up((long) compptr->width_in_blocks, 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (long) compptr->h_samp_factor), 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (JDIMENSION) jround_up((long) compptr->height_in_blocks, 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (long) compptr->v_samp_factor), 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (JDIMENSION) access_rows); 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->pub.consume_data = consume_data; 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->pub.decompress_data = decompress_data; 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */ 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ERREXIT(cinfo, JERR_NOT_COMPILED); 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* We only need a single-MCU buffer. */ 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov JBLOCKROW buffer; 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i; 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov buffer = (JBLOCKROW) 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) { 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->MCU_buffer[i] = buffer + i; 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->pub.consume_data = dummy_consume_data; 734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->pub.decompress_data = decompress_onepass; 735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */ 736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif //_FX_JPEG_TURBO_ 740