170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jdcoefct.c 370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1994-1997, Thomas G. Lane. 570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file is part of the Independent JPEG Group's software. 670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For conditions of distribution and use, see the accompanying README file. 770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file contains the coefficient buffer controller for decompression. 970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This controller is the top level of the JPEG decompressor proper. 1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The coefficient buffer lies between entropy decoding and inverse-DCT steps. 1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * In buffered-image mode, this controller is the interface between 1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * input-oriented processing and output-oriented processing. 1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Also, the input side (only) is used when reading a file for transcoding. 1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define JPEG_INTERNALS 1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jinclude.h" 1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jpeglib.h" 2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Block smoothing is only applicable for progressive JPEG, so: */ 2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifndef D_PROGRESSIVE_SUPPORTED 2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#undef BLOCK_SMOOTHING_SUPPORTED 2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Private buffer controller object */ 2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef struct { 2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine struct jpeg_d_coef_controller pub; /* public fields */ 3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* These variables keep track of the current location of the input side. */ 3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* cinfo->input_iMCU_row is also used for this. */ 3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION MCU_ctr; /* counts MCUs processed in current row */ 3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int MCU_vert_offset; /* counts MCU rows within iMCU row */ 3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int MCU_rows_per_iMCU_row; /* number of such rows needed */ 3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* The output side's location is represented by cinfo->output_iMCU_row. */ 3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* In single-pass modes, it's sufficient to buffer just one MCU. 4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks, 4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * and let the entropy decoder write into that workspace each time. 4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * (On 80x86, the workspace is FAR even though it's not really very big; 4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * this is to keep the module interfaces unchanged when a large coefficient 4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * buffer is necessary.) 4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * In multi-pass modes, this array points to the current MCU's blocks 4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * within the virtual arrays; it is used only by the input side. 4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU]; 4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef D_MULTISCAN_FILES_SUPPORTED 5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* In multi-pass modes, we need a virtual block array for each component. */ 5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jvirt_barray_ptr whole_image[MAX_COMPONENTS]; 5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef BLOCK_SMOOTHING_SUPPORTED 5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* When doing block smoothing, we latch coefficient Al values here */ 5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * coef_bits_latch; 5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define SAVED_COEFS 6 /* we save coef_bits[0..5] */ 5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} my_coef_controller; 6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef my_coef_controller * my_coef_ptr; 6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Forward declarations */ 6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(int) decompress_onepass 6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); 6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef D_MULTISCAN_FILES_SUPPORTED 6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(int) decompress_data 6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); 7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef BLOCK_SMOOTHING_SUPPORTED 7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo)); 7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(int) decompress_smooth_data 7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); 7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void) 7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestart_iMCU_row (j_decompress_ptr cinfo) 8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Reset within-iMCU-row counters for a new row (input side) */ 8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* In an interleaved scan, an MCU row is the same as an iMCU row. 8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. 8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * But at the bottom of the image, process only what's left. 8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->comps_in_scan > 1) { 8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_rows_per_iMCU_row = 1; 9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1)) 9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; 9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; 9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_ctr = 0; 9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_vert_offset = 0; 9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Initialize for an input processing pass. 10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestart_input_pass (j_decompress_ptr cinfo) 10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->input_iMCU_row = 0; 11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine start_iMCU_row(cinfo); 11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Initialize for an output processing pass. 11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestart_output_pass (j_decompress_ptr cinfo) 12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef BLOCK_SMOOTHING_SUPPORTED 12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* If multipass, check to see whether to use block smoothing on this pass */ 12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (coef->pub.coef_arrays != NULL) { 12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->do_block_smoothing && smoothing_ok(cinfo)) 12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.decompress_data = decompress_smooth_data; 12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.decompress_data = decompress_data; 13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->output_iMCU_row = 0; 13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Decompress and return some data in the single-pass case. 13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Always attempts to emit one fully interleaved MCU row ("iMCU" row). 13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Input and output must run in lockstep since we have only a one-MCU buffer. 14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. 14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * NB: output_buf contains a plane for each component in image, 14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * which we index according to the component's SOF position. 14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(int) 14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinedecompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) 14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION MCU_col_num; /* index of current MCU within row */ 15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; 15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; 15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int blkn, ci, xindex, yindex, yoffset, useful_width; 15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_ptr; 15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION start_col, output_col; 15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_component_info *compptr; 15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inverse_DCT_method_ptr inverse_DCT; 15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_TILE_BASED_DECODE 16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->tile_decode) { 16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine last_MCU_col = 16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (cinfo->coef->MCU_column_right_boundary - 16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->coef->MCU_column_left_boundary) - 1; 16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Loop to process as much as one whole iMCU row */ 16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; 16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine yoffset++) { 17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; 17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine MCU_col_num++) { 17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ 17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (MCU_col_num < coef->pub.MCU_columns_to_skip) { 17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->entropy->decode_mcu_discard_coef) (cinfo); 17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine continue; 17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jzero_far((void FAR *) coef->MCU_buffer[0], 17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK))); 17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { 18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Suspension forced; update state counters and exit */ 18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_vert_offset = yoffset; 18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_ctr = MCU_col_num; 18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SUSPENDED; 18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Determine where data should go in output_buf and do the IDCT thing. 18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We skip dummy blocks at the right and bottom edges (but blkn gets 18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * incremented past them!). Note the inner loop relies on having 18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * allocated the MCU_buffer[] blocks sequentially. 19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine blkn = 0; /* index of current DCT block within MCU */ 19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr = cinfo->cur_comp_info[ci]; 19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Don't bother to IDCT an uninteresting component. */ 19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! compptr->component_needed) { 19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine blkn += compptr->MCU_blocks; 19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine continue; 19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index]; 20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width 20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine : compptr->last_col_width; 20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_ptr = output_buf[compptr->component_index] + 20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine yoffset * compptr->DCT_scaled_size; 20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine start_col = MCU_col_num * compptr->MCU_sample_width; 20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (yindex = 0; yindex < compptr->MCU_height; yindex++) { 20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->input_iMCU_row < last_iMCU_row || 20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine yoffset+yindex < compptr->last_row_height) { 20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_col = start_col; 20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (xindex = 0; xindex < useful_width; xindex++) { 21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*inverse_DCT) (cinfo, compptr, 21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JCOEFPTR) coef->MCU_buffer[blkn+xindex], 21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_ptr, output_col); 21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_col += compptr->DCT_scaled_size; 21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine blkn += compptr->MCU_width; 21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_ptr += compptr->DCT_scaled_size; 21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Completed an MCU row, but perhaps not an iMCU row */ 22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_ctr = 0; 22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Completed the iMCU row, advance counters for next one */ 22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->output_iMCU_row++; 22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { 22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine start_iMCU_row(cinfo); 22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_ROW_COMPLETED; 22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Completed the scan */ 23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->inputctl->finish_input_pass) (cinfo); 23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SCAN_COMPLETED; 23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Dummy consume-input routine for single-pass operation. 23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(int) 24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinedummy_consume_data (j_decompress_ptr cinfo) 24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SUSPENDED; /* Always indicate nothing was done */ 24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef D_MULTISCAN_FILES_SUPPORTED 24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Consume input data and store it in the full-image coefficient buffer. 24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We read as much as one fully interleaved MCU row ("iMCU" row) per call, 25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * ie, v_samp_factor block rows for each component in the scan. 25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. 25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(int) 25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineconsume_data (j_decompress_ptr cinfo) 25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION MCU_col_num; /* index of current MCU within row */ 25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int blkn, ci, xindex, yindex, yoffset; 26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION start_col; 26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; 26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCKROW buffer_ptr; 26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_component_info *compptr; 26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Align the virtual buffers for the components used in this scan. */ 26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr = cinfo->cur_comp_info[ci]; 26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer[ci] = (*cinfo->mem->access_virt_barray) 26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], 27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->tile_decode ? 0 : cinfo->input_iMCU_row * compptr->v_samp_factor, 27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) compptr->v_samp_factor, TRUE); 27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Note: entropy decoder expects buffer to be zeroed, 27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * but this is handled automatically by the memory manager 27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * because we requested a pre-zeroed array. 27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine unsigned int MCUs_per_row = cinfo->MCUs_per_row; 27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_TILE_BASED_DECODE 27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->tile_decode) { 28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int iMCU_width_To_MCU_width; 28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->comps_in_scan > 1) { 28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine // Interleaved 28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine iMCU_width_To_MCU_width = 1; 28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine // Non-intervleaved 28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine iMCU_width_To_MCU_width = cinfo->cur_comp_info[0]->h_samp_factor; 28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine MCUs_per_row = jmin(MCUs_per_row, 28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (cinfo->coef->column_right_boundary - cinfo->coef->column_left_boundary) 29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * cinfo->entropy->index->MCU_sample_size * iMCU_width_To_MCU_width); 29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Loop to process one whole iMCU row */ 29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; 29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine yoffset++) { 29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine // configure huffman decoder 29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_TILE_BASED_DECODE 29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->tile_decode) { 30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine huffman_scan_header scan_header = 30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->entropy->index->scan[cinfo->input_scan_number]; 30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int col_offset = cinfo->coef->column_left_boundary; 30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->entropy->configure_huffman_decoder) (cinfo, 30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scan_header.offset[cinfo->input_iMCU_row] 30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine [col_offset + yoffset * scan_header.MCUs_per_row]); 30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine // zero all blocks 31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (MCU_col_num = coef->MCU_ctr; MCU_col_num < MCUs_per_row; 31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine MCU_col_num++) { 31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Construct list of pointers to DCT blocks belonging to this MCU */ 31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine blkn = 0; /* index of current DCT block within MCU */ 31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr = cinfo->cur_comp_info[ci]; 31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine start_col = MCU_col_num * compptr->MCU_width; 31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (yindex = 0; yindex < compptr->MCU_height; yindex++) { 31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer_ptr = buffer[ci][yindex+yoffset] + start_col; 31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (xindex = 0; xindex < compptr->MCU_width; xindex++) { 32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_buffer[blkn++] = buffer_ptr++; 32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_TILE_BASED_DECODE 32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->tile_decode && cinfo->input_scan_number == 0) { 32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine // need to do pre-zero ourselves. 32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jzero_far((void FAR *) coef->MCU_buffer[blkn-1], 32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (size_t) (SIZEOF(JBLOCK))); 32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 32970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 33070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 33170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 33270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 33370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Try to fetch the MCU. */ 33470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { 33570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Suspension forced; update state counters and exit */ 33670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_vert_offset = yoffset; 33770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_ctr = MCU_col_num; 33870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SUSPENDED; 33970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 34070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 34170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Completed an MCU row, but perhaps not an iMCU row */ 34270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_ctr = 0; 34370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 34470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Completed the iMCU row, advance counters for next one */ 34570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { 34670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine start_iMCU_row(cinfo); 34770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_ROW_COMPLETED; 34870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 34970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Completed the scan */ 35070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->inputctl->finish_input_pass) (cinfo); 35170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SCAN_COMPLETED; 35270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 35370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 35470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 35570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Consume input data and store it in the coefficient buffer. 35670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Read one fully interleaved MCU row ("iMCU" row) per call. 35770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 35870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 35970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(int) 36070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineconsume_data_multi_scan (j_decompress_ptr cinfo) 36170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 36270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine huffman_index *index = cinfo->entropy->index; 36370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int i, retcode, ci; 36470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int mcu = cinfo->input_iMCU_row; 36570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jinit_phuff_decoder(cinfo); 36670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (i = 0; i < index->scan_count; i++) { 36770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->inputctl->finish_input_pass) (cinfo); 36870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jset_input_stream_position(cinfo, index->scan[i].bitstream_offset); 36970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->output_iMCU_row = mcu; 37070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->unread_marker = 0; 37170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine // Consume SOS and DHT headers 37270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine retcode = (*cinfo->inputctl->consume_markers) (cinfo, index, i); 37370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->input_iMCU_row = mcu; 37470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->input_scan_number = i; 37570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->entropy->index = index; 37670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine // Consume scan block data 37770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine consume_data(cinfo); 37870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 37970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->input_iMCU_row = mcu + 1; 38070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->input_scan_number = 0; 38170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->output_scan_number = 0; 38270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_ROW_COMPLETED; 38370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 38470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 38570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 38670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Same as consume_data, expect for saving the Huffman decode information 38770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * - bitstream offset and DC coefficient to index. 38870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 38970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 39070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(int) 39170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineconsume_data_build_huffman_index_baseline (j_decompress_ptr cinfo, 39270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine huffman_index *index, int current_scan) 39370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 39470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 39570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION MCU_col_num; /* index of current MCU within row */ 39670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci, xindex, yindex, yoffset; 39770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION start_col; 39870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCKROW buffer_ptr; 39970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 40070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine huffman_scan_header *scan_header = index->scan + current_scan; 40170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scan_header->MCU_rows_per_iMCU_row = coef->MCU_rows_per_iMCU_row; 40270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 40370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine size_t allocate_size = coef->MCU_rows_per_iMCU_row 40470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jdiv_round_up(cinfo->MCUs_per_row, index->MCU_sample_size) 40570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * sizeof(huffman_offset_data); 40670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scan_header->offset[cinfo->input_iMCU_row] = 40770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (huffman_offset_data*)malloc(allocate_size); 40870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine index->mem_used += allocate_size; 40970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 41070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine huffman_offset_data *offset_data = scan_header->offset[cinfo->input_iMCU_row]; 41170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 41270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Loop to process one whole iMCU row */ 41370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; 41470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine yoffset++) { 41570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row; 41670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine MCU_col_num++) { 41770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine // Record huffman bit offset 41870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (MCU_col_num % index->MCU_sample_size == 0) { 41970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->entropy->get_huffman_decoder_configuration) 42070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (cinfo, offset_data); 42170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ++offset_data; 42270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 42370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 42470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Try to fetch the MCU. */ 42570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! (*cinfo->entropy->decode_mcu_discard_coef) (cinfo)) { 42670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Suspension forced; update state counters and exit */ 42770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_vert_offset = yoffset; 42870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_ctr = MCU_col_num; 42970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SUSPENDED; 43070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 43170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 43270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Completed an MCU row, but perhaps not an iMCU row */ 43370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_ctr = 0; 43470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 43570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Completed the iMCU row, advance counters for next one */ 43670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { 43770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine start_iMCU_row(cinfo); 43870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_ROW_COMPLETED; 43970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 44070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Completed the scan */ 44170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->inputctl->finish_input_pass) (cinfo); 44270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SCAN_COMPLETED; 44370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 44470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 44570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 44670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Same as consume_data, expect for saving the Huffman decode information 44770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * - bitstream offset and DC coefficient to index. 44870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 44970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 45070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(int) 45170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineconsume_data_build_huffman_index_progressive (j_decompress_ptr cinfo, 45270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine huffman_index *index, int current_scan) 45370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 45470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 45570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION MCU_col_num; /* index of current MCU within row */ 45670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int blkn, ci, xindex, yindex, yoffset; 45770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION start_col; 45870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; 45970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCKROW buffer_ptr; 46070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_component_info *compptr; 46170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 46270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int factor = 4; // maximum factor is 4. 46370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0; ci < cinfo->comps_in_scan; ci++) 46470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine factor = jmin(factor, cinfo->cur_comp_info[ci]->h_samp_factor); 46570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 46670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int sample_size = index->MCU_sample_size * factor; 46770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine huffman_scan_header *scan_header = index->scan + current_scan; 46870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scan_header->MCU_rows_per_iMCU_row = coef->MCU_rows_per_iMCU_row; 46970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scan_header->MCUs_per_row = jdiv_round_up(cinfo->MCUs_per_row, sample_size); 47070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scan_header->comps_in_scan = cinfo->comps_in_scan; 47170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 47270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine size_t allocate_size = coef->MCU_rows_per_iMCU_row 47370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * scan_header->MCUs_per_row * sizeof(huffman_offset_data); 47470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scan_header->offset[cinfo->input_iMCU_row] = 47570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (huffman_offset_data*)malloc(allocate_size); 47670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine index->mem_used += allocate_size; 47770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 47870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine huffman_offset_data *offset_data = scan_header->offset[cinfo->input_iMCU_row]; 47970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 48070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Align the virtual buffers for the components used in this scan. */ 48170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 48270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr = cinfo->cur_comp_info[ci]; 48370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer[ci] = (*cinfo->mem->access_virt_barray) 48470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], 48570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 0, // Only need one row buffer 48670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) compptr->v_samp_factor, TRUE); 48770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 48870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Loop to process one whole iMCU row */ 48970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; 49070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine yoffset++) { 49170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row; 49270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine MCU_col_num++) { 49370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* For each MCU, we loop through different color components. 49470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Then, for each color component we will get a list of pointers to DCT 49570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * blocks in the virtual buffer. 49670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 49770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine blkn = 0; /* index of current DCT block within MCU */ 49870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 49970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr = cinfo->cur_comp_info[ci]; 50070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine start_col = MCU_col_num * compptr->MCU_width; 50170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Get the list of pointers to DCT blocks in 50270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * the virtual buffer in a color component of the MCU. 50370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 50470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (yindex = 0; yindex < compptr->MCU_height; yindex++) { 50570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer_ptr = buffer[ci][yindex+yoffset] + start_col; 50670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (xindex = 0; xindex < compptr->MCU_width; xindex++) { 50770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_buffer[blkn++] = buffer_ptr++; 50870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->input_scan_number == 0) { 50970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine // need to do pre-zero by ourself. 51070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jzero_far((void FAR *) coef->MCU_buffer[blkn-1], 51170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (size_t) (SIZEOF(JBLOCK))); 51270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 51370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 51470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 51570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 51670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine // Record huffman bit offset 51770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (MCU_col_num % sample_size == 0) { 51870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->entropy->get_huffman_decoder_configuration) 51970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (cinfo, offset_data); 52070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ++offset_data; 52170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 52270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Try to fetch the MCU. */ 52370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { 52470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Suspension forced; update state counters and exit */ 52570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_vert_offset = yoffset; 52670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_ctr = MCU_col_num; 52770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SUSPENDED; 52870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 52970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 53070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Completed an MCU row, but perhaps not an iMCU row */ 53170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_ctr = 0; 53270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 53370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->entropy->get_huffman_decoder_configuration) 53470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (cinfo, &scan_header->prev_MCU_offset); 53570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Completed the iMCU row, advance counters for next one */ 53670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { 53770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine start_iMCU_row(cinfo); 53870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_ROW_COMPLETED; 53970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 54070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Completed the scan */ 54170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->inputctl->finish_input_pass) (cinfo); 54270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SCAN_COMPLETED; 54370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 54470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 54570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 54670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Decompress and return some data in the multi-pass case. 54770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Always attempts to emit one fully interleaved MCU row ("iMCU" row). 54870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. 54970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 55070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * NB: output_buf contains a plane for each component in image. 55170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 55270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 55370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(int) 55470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinedecompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) 55570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 55670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 55770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; 55870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION block_num; 55970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci, block_row, block_rows; 56070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCKARRAY buffer; 56170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCKROW buffer_ptr; 56270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_ptr; 56370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION output_col; 56470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_component_info *compptr; 56570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inverse_DCT_method_ptr inverse_DCT; 56670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 56770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Force some input to be done if we are getting ahead of the input. */ 56870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while (cinfo->input_scan_number < cinfo->output_scan_number || 56970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (cinfo->input_scan_number == cinfo->output_scan_number && 57070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) { 57170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) 57270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SUSPENDED; 57370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 57470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 57570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* OK, output from the virtual arrays. */ 57670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 57770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ci++, compptr++) { 57870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Don't bother to IDCT an uninteresting component. */ 57970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! compptr->component_needed) 58070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine continue; 58170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Align the virtual buffer for this component. */ 58270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer = (*cinfo->mem->access_virt_barray) 58370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, coef->whole_image[ci], 58470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->tile_decode ? 0 : cinfo->output_iMCU_row * compptr->v_samp_factor, 58570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) compptr->v_samp_factor, FALSE); 58670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Count non-dummy DCT block rows in this iMCU row. */ 58770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->output_iMCU_row < last_iMCU_row) 58870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine block_rows = compptr->v_samp_factor; 58970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else { 59070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* NB: can't use last_row_height here; it is input-side-dependent! */ 59170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); 59270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (block_rows == 0) block_rows = compptr->v_samp_factor; 59370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 59470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inverse_DCT = cinfo->idct->inverse_DCT[ci]; 59570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_ptr = output_buf[ci]; 59670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int width_in_blocks = compptr->width_in_blocks; 59770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int start_block = 0; 59870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#if ANDROID_TILE_BASED_DECODE 59970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->tile_decode) { 60070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine // width_in_blocks for a component depends on its h_samp_factor. 60170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine width_in_blocks = jmin(width_in_blocks, 60270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (cinfo->coef->MCU_column_right_boundary - 60370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->coef->MCU_column_left_boundary) * 60470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr->h_samp_factor); 60570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine start_block = coef->pub.MCU_columns_to_skip * 60670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr->h_samp_factor; 60770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 60870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 60970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Loop over all DCT blocks to be processed. */ 61070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (block_row = 0; block_row < block_rows; block_row++) { 61170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer_ptr = buffer[block_row]; 61270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_col = start_block * compptr->DCT_scaled_size; 61370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer_ptr += start_block; 61470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (block_num = start_block; block_num < width_in_blocks; block_num++) { 61570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr, 61670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_ptr, output_col); 61770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer_ptr++; 61870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_col += compptr->DCT_scaled_size; 61970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 62070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_ptr += compptr->DCT_scaled_size; 62170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 62270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 62370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 62470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) 62570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_ROW_COMPLETED; 62670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SCAN_COMPLETED; 62770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 62870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 62970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* D_MULTISCAN_FILES_SUPPORTED */ 63070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 63170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 63270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef BLOCK_SMOOTHING_SUPPORTED 63370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 63470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 63570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This code applies interblock smoothing as described by section K.8 63670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * of the JPEG standard: the first 5 AC coefficients are estimated from 63770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * the DC values of a DCT block and its 8 neighboring blocks. 63870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We apply smoothing only for progressive JPEG decoding, and only if 63970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * the coefficients it can estimate are not yet known to full precision. 64070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 64170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 64270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Natural-order array positions of the first 5 zigzag-order coefficients */ 64370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define Q01_POS 1 64470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define Q10_POS 8 64570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define Q20_POS 16 64670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define Q11_POS 9 64770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define Q02_POS 2 64870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 64970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 65070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Determine whether block smoothing is applicable and safe. 65170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We also latch the current states of the coef_bits[] entries for the 65270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * AC coefficients; otherwise, if the input side of the decompressor 65370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * advances into a new scan, we might think the coefficients are known 65470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * more accurately than they really are. 65570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 65670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 65770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(boolean) 65870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinesmoothing_ok (j_decompress_ptr cinfo) 65970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 66070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 66170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine boolean smoothing_useful = FALSE; 66270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci, coefi; 66370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_component_info *compptr; 66470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JQUANT_TBL * qtable; 66570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * coef_bits; 66670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int * coef_bits_latch; 66770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 66870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! cinfo->progressive_mode || cinfo->coef_bits == NULL) 66970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 67070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 67170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Allocate latch area if not already done */ 67270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (coef->coef_bits_latch == NULL) 67370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->coef_bits_latch = (int *) 67470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 67570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->num_components * 67670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (SAVED_COEFS * SIZEOF(int))); 67770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef_bits_latch = coef->coef_bits_latch; 67870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 67970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 68070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ci++, compptr++) { 68170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* All components' quantization values must already be latched. */ 68270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((qtable = compptr->quant_table) == NULL) 68370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 68470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */ 68570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (qtable->quantval[0] == 0 || 68670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine qtable->quantval[Q01_POS] == 0 || 68770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine qtable->quantval[Q10_POS] == 0 || 68870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine qtable->quantval[Q20_POS] == 0 || 68970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine qtable->quantval[Q11_POS] == 0 || 69070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine qtable->quantval[Q02_POS] == 0) 69170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 69270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* DC values must be at least partly known for all components. */ 69370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef_bits = cinfo->coef_bits[ci]; 69470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (coef_bits[0] < 0) 69570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 69670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Block smoothing is helpful if some AC coefficients remain inaccurate. */ 69770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (coefi = 1; coefi <= 5; coefi++) { 69870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef_bits_latch[coefi] = coef_bits[coefi]; 69970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (coef_bits[coefi] != 0) 70070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine smoothing_useful = TRUE; 70170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 70270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef_bits_latch += SAVED_COEFS; 70370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 70470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 70570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return smoothing_useful; 70670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 70770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 70870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 70970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 71070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Variant of decompress_data for use when doing block smoothing. 71170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 71270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 71370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(int) 71470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinedecompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) 71570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 71670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_coef_ptr coef = (my_coef_ptr) cinfo->coef; 71770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; 71870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION block_num, last_block_column; 71970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci, block_row, block_rows, access_rows; 72070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCKARRAY buffer; 72170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCKROW buffer_ptr, prev_block_row, next_block_row; 72270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_ptr; 72370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION output_col; 72470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_component_info *compptr; 72570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inverse_DCT_method_ptr inverse_DCT; 72670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine boolean first_row, last_row; 72770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCK workspace; 72870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int *coef_bits; 72970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JQUANT_TBL *quanttbl; 73070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 Q00,Q01,Q02,Q10,Q11,Q20, num; 73170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9; 73270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int Al, pred; 73370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 73470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Force some input to be done if we are getting ahead of the input. */ 73570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while (cinfo->input_scan_number <= cinfo->output_scan_number && 73670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ! cinfo->inputctl->eoi_reached) { 73770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->input_scan_number == cinfo->output_scan_number) { 73870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* If input is working on current scan, we ordinarily want it to 73970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * have completed the current row. But if input scan is DC, 74070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * we want it to keep one row ahead so that next block row's DC 74170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * values are up to date. 74270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 74370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0; 74470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta) 74570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 74670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 74770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) 74870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SUSPENDED; 74970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 75070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 75170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* OK, output from the virtual arrays. */ 75270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 75370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ci++, compptr++) { 75470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Don't bother to IDCT an uninteresting component. */ 75570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! compptr->component_needed) 75670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine continue; 75770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Count non-dummy DCT block rows in this iMCU row. */ 75870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->output_iMCU_row < last_iMCU_row) { 75970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine block_rows = compptr->v_samp_factor; 76070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine access_rows = block_rows * 2; /* this and next iMCU row */ 76170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine last_row = FALSE; 76270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 76370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* NB: can't use last_row_height here; it is input-side-dependent! */ 76470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); 76570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (block_rows == 0) block_rows = compptr->v_samp_factor; 76670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine access_rows = block_rows; /* this iMCU row only */ 76770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine last_row = TRUE; 76870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 76970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Align the virtual buffer for this component. */ 77070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->output_iMCU_row > 0) { 77170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine access_rows += compptr->v_samp_factor; /* prior iMCU row too */ 77270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer = (*cinfo->mem->access_virt_barray) 77370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, coef->whole_image[ci], 77470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor, 77570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) access_rows, FALSE); 77670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer += compptr->v_samp_factor; /* point to current iMCU row */ 77770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine first_row = FALSE; 77870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 77970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer = (*cinfo->mem->access_virt_barray) 78070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, coef->whole_image[ci], 78170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE); 78270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine first_row = TRUE; 78370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 78470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fetch component-dependent info */ 78570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS); 78670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine quanttbl = compptr->quant_table; 78770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Q00 = quanttbl->quantval[0]; 78870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Q01 = quanttbl->quantval[Q01_POS]; 78970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Q10 = quanttbl->quantval[Q10_POS]; 79070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Q20 = quanttbl->quantval[Q20_POS]; 79170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Q11 = quanttbl->quantval[Q11_POS]; 79270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine Q02 = quanttbl->quantval[Q02_POS]; 79370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inverse_DCT = cinfo->idct->inverse_DCT[ci]; 79470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_ptr = output_buf[ci]; 79570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Loop over all DCT blocks to be processed. */ 79670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (block_row = 0; block_row < block_rows; block_row++) { 79770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer_ptr = buffer[block_row]; 79870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (first_row && block_row == 0) 79970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine prev_block_row = buffer_ptr; 80070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 80170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine prev_block_row = buffer[block_row-1]; 80270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (last_row && block_row == block_rows-1) 80370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine next_block_row = buffer_ptr; 80470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 80570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine next_block_row = buffer[block_row+1]; 80670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* We fetch the surrounding DC values using a sliding-register approach. 80770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Initialize all nine here so as to do the right thing on narrow pics. 80870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 80970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine DC1 = DC2 = DC3 = (int) prev_block_row[0][0]; 81070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine DC4 = DC5 = DC6 = (int) buffer_ptr[0][0]; 81170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine DC7 = DC8 = DC9 = (int) next_block_row[0][0]; 81270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_col = 0; 81370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine last_block_column = compptr->width_in_blocks - 1; 81470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (block_num = 0; block_num <= last_block_column; block_num++) { 81570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fetch current DCT block into workspace so we can modify it. */ 81670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1); 81770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Update DC values */ 81870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (block_num < last_block_column) { 81970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine DC3 = (int) prev_block_row[1][0]; 82070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine DC6 = (int) buffer_ptr[1][0]; 82170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine DC9 = (int) next_block_row[1][0]; 82270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 82370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Compute coefficient estimates per K.8. 82470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * An estimate is applied only if coefficient is still zero, 82570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * and is not known to be fully accurate. 82670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 82770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* AC01 */ 82870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) { 82970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine num = 36 * Q00 * (DC4 - DC6); 83070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (num >= 0) { 83170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (int) (((Q01<<7) + num) / (Q01<<8)); 83270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (Al > 0 && pred >= (1<<Al)) 83370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (1<<Al)-1; 83470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 83570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (int) (((Q01<<7) - num) / (Q01<<8)); 83670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (Al > 0 && pred >= (1<<Al)) 83770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (1<<Al)-1; 83870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = -pred; 83970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 84070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine workspace[1] = (JCOEF) pred; 84170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 84270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* AC10 */ 84370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((Al=coef_bits[2]) != 0 && workspace[8] == 0) { 84470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine num = 36 * Q00 * (DC2 - DC8); 84570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (num >= 0) { 84670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (int) (((Q10<<7) + num) / (Q10<<8)); 84770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (Al > 0 && pred >= (1<<Al)) 84870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (1<<Al)-1; 84970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 85070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (int) (((Q10<<7) - num) / (Q10<<8)); 85170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (Al > 0 && pred >= (1<<Al)) 85270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (1<<Al)-1; 85370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = -pred; 85470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 85570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine workspace[8] = (JCOEF) pred; 85670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 85770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* AC20 */ 85870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((Al=coef_bits[3]) != 0 && workspace[16] == 0) { 85970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine num = 9 * Q00 * (DC2 + DC8 - 2*DC5); 86070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (num >= 0) { 86170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (int) (((Q20<<7) + num) / (Q20<<8)); 86270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (Al > 0 && pred >= (1<<Al)) 86370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (1<<Al)-1; 86470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 86570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (int) (((Q20<<7) - num) / (Q20<<8)); 86670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (Al > 0 && pred >= (1<<Al)) 86770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (1<<Al)-1; 86870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = -pred; 86970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 87070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine workspace[16] = (JCOEF) pred; 87170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 87270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* AC11 */ 87370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((Al=coef_bits[4]) != 0 && workspace[9] == 0) { 87470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9); 87570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (num >= 0) { 87670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (int) (((Q11<<7) + num) / (Q11<<8)); 87770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (Al > 0 && pred >= (1<<Al)) 87870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (1<<Al)-1; 87970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 88070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (int) (((Q11<<7) - num) / (Q11<<8)); 88170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (Al > 0 && pred >= (1<<Al)) 88270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (1<<Al)-1; 88370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = -pred; 88470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 88570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine workspace[9] = (JCOEF) pred; 88670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 88770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* AC02 */ 88870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((Al=coef_bits[5]) != 0 && workspace[2] == 0) { 88970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine num = 9 * Q00 * (DC4 + DC6 - 2*DC5); 89070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (num >= 0) { 89170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (int) (((Q02<<7) + num) / (Q02<<8)); 89270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (Al > 0 && pred >= (1<<Al)) 89370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (1<<Al)-1; 89470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 89570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (int) (((Q02<<7) - num) / (Q02<<8)); 89670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (Al > 0 && pred >= (1<<Al)) 89770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = (1<<Al)-1; 89870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine pred = -pred; 89970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 90070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine workspace[2] = (JCOEF) pred; 90170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 90270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* OK, do the IDCT */ 90370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) workspace, 90470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_ptr, output_col); 90570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Advance for next column */ 90670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine DC1 = DC2; DC2 = DC3; 90770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine DC4 = DC5; DC5 = DC6; 90870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine DC7 = DC8; DC8 = DC9; 90970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer_ptr++, prev_block_row++, next_block_row++; 91070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_col += compptr->DCT_scaled_size; 91170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 91270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine output_ptr += compptr->DCT_scaled_size; 91370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 91470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 91570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 91670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) 91770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_ROW_COMPLETED; 91870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return JPEG_SCAN_COMPLETED; 91970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 92070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 92170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* BLOCK_SMOOTHING_SUPPORTED */ 92270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 92370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 92470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 92570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Initialize coefficient buffer controller. 92670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 92770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 92870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void) 92970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer) 93070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 93170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_coef_ptr coef; 93270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 93370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef = (my_coef_ptr) 93470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 93570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SIZEOF(my_coef_controller)); 93670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->coef = (struct jpeg_d_coef_controller *) coef; 93770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.start_input_pass = start_input_pass; 93870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.start_output_pass = start_output_pass; 93970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.column_left_boundary = 0; 94070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.column_right_boundary = 0; 94170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.MCU_columns_to_skip = 0; 94270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef BLOCK_SMOOTHING_SUPPORTED 94370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->coef_bits_latch = NULL; 94470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 94570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 94670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_TILE_BASED_DECODE 94770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->tile_decode) { 94870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->progressive_mode) { 94970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Allocate one iMCU row virtual array, coef->whole_image[ci], 95070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * for each color component, padded to a multiple of h_samp_factor 95170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * DCT blocks in the horizontal direction. 95270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 95370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci, access_rows; 95470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_component_info *compptr; 95570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 95670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 95770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ci++, compptr++) { 95870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine access_rows = compptr->v_samp_factor; 95970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) 96070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE, 96170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) jround_up((long) compptr->width_in_blocks, 96270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (long) compptr->h_samp_factor), 96370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) compptr->v_samp_factor, // one iMCU row 96470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) access_rows); 96570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 96670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.consume_data_build_huffman_index = 96770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine consume_data_build_huffman_index_progressive; 96870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.consume_data = consume_data_multi_scan; 96970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */ 97070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.decompress_data = decompress_onepass; 97170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 97270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* We only need a single-MCU buffer. */ 97370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCKROW buffer; 97470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int i; 97570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 97670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer = (JBLOCKROW) 97770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, 97870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); 97970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) { 98070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_buffer[i] = buffer + i; 98170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 98270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.consume_data_build_huffman_index = 98370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine consume_data_build_huffman_index_baseline; 98470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.consume_data = dummy_consume_data; 98570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */ 98670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.decompress_data = decompress_onepass; 98770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 98870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return; 98970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 99070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 99170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 99270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Create the coefficient buffer. */ 99370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (need_full_buffer) { 99470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef D_MULTISCAN_FILES_SUPPORTED 99570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Allocate a full-image virtual array for each component, */ 99670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* padded to a multiple of samp_factor DCT blocks in each direction. */ 99770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Note we ask for a pre-zeroed array. */ 99870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci, access_rows; 99970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_component_info *compptr; 100070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 100170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 100270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ci++, compptr++) { 100370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine access_rows = compptr->v_samp_factor; 100470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef BLOCK_SMOOTHING_SUPPORTED 100570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* If block smoothing could be used, need a bigger window */ 100670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->progressive_mode) 100770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine access_rows *= 3; 100870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 100970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) 101070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE, 101170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) jround_up((long) compptr->width_in_blocks, 101270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (long) compptr->h_samp_factor), 101370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) jround_up((long) compptr->height_in_blocks, 101470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (long) compptr->v_samp_factor), 101570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) access_rows); 101670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 101770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.consume_data = consume_data; 101870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.decompress_data = decompress_data; 101970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */ 102070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 102170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_NOT_COMPILED); 102270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 102370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 102470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* We only need a single-MCU buffer. */ 102570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JBLOCKROW buffer; 102670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int i; 102770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 102870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine buffer = (JBLOCKROW) 102970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, 103070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); 103170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) { 103270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->MCU_buffer[i] = buffer + i; 103370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 103470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.consume_data = dummy_consume_data; 103570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.decompress_data = decompress_onepass; 103670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */ 103770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 103870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 1039