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