1f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 2f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jdphuff.c 3f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 4f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Copyright (C) 1995-1997, Thomas G. Lane. 5f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This file is part of the Independent JPEG Group's software. 6f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * For conditions of distribution and use, see the accompanying README file. 7f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 8f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This file contains Huffman entropy decoding routines for progressive JPEG. 9f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 10f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Much of the complexity here has to do with supporting input suspension. 11f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * If the data source module demands suspension, we want to be able to back 12f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * up to the start of the current MCU. To do this, we copy state variables 13f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * into local working storage, and update them back to the permanent 14f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * storage only upon successful completion of an MCU. 15f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 16f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 17f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define JPEG_INTERNALS 18f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jinclude.h" 19f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jpeglib.h" 20f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jdhuff.h" /* Declarations shared with jdhuff.c */ 21f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 22f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 23f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifdef D_PROGRESSIVE_SUPPORTED 24f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 25f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 26f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Expanded entropy decoder object for progressive Huffman decoding. 27f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 28f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * The savable_state subrecord contains fields that change within an MCU, 29f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * but must not be updated permanently until we complete the MCU. 30f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 31f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 32f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgtypedef struct { 33f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int EOBRUN; /* remaining EOBs in EOBRUN */ 34f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ 35f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} savable_state; 36f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 37f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* This macro is to work around compilers with missing or broken 38f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * structure assignment. You'll need to fix this code if you have 39f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * such a compiler and you change MAX_COMPS_IN_SCAN. 40f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 41f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 42f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifndef NO_STRUCT_ASSIGN 43f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define ASSIGN_STATE(dest,src) ((dest) = (src)) 44f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#else 45f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#if MAX_COMPS_IN_SCAN == 4 46f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define ASSIGN_STATE(dest,src) \ 47f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ((dest).EOBRUN = (src).EOBRUN, \ 48f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (dest).last_dc_val[0] = (src).last_dc_val[0], \ 49f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (dest).last_dc_val[1] = (src).last_dc_val[1], \ 50f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (dest).last_dc_val[2] = (src).last_dc_val[2], \ 51f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (dest).last_dc_val[3] = (src).last_dc_val[3]) 52f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif 53f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif 54f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 55f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 56f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgtypedef struct { 57f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org struct jpeg_entropy_decoder pub; /* public fields */ 58f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 59f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* These fields are loaded into local variables at start of each MCU. 60f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * In case of suspension, we exit WITHOUT updating them. 61f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 62f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bitread_perm_state bitstate; /* Bit buffer at start of MCU */ 63f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org savable_state saved; /* Other state at start of MCU */ 64f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 65f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* These fields are NOT loaded into local working state. */ 66f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int restarts_to_go; /* MCUs left in this restart interval */ 67f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 68f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Pointers to derived tables (these workspaces have image lifespan) */ 69f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org d_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; 70f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 71f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */ 72f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} phuff_entropy_decoder; 73f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 74f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgtypedef phuff_entropy_decoder * phuff_entropy_ptr; 75f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 76f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Forward declarations */ 77f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo, 78f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW *MCU_data)); 79f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo, 80f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW *MCU_data)); 81f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo, 82f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW *MCU_data)); 83f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo, 84f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW *MCU_data)); 85f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 86f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 87f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 88f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Initialize for a Huffman-compressed scan. 89f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 90f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 91f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void) 92f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgstart_pass_phuff_decoder (j_decompress_ptr cinfo) 93f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 94f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 95f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org boolean is_DC_band, bad; 96f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int ci, coefi, tbl; 97f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int *coef_bit_ptr; 98f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_component_info * compptr; 99f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 100f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org is_DC_band = (cinfo->Ss == 0); 101f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 102f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Validate scan parameters */ 103f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bad = FALSE; 104f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (is_DC_band) { 105f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->Se != 0) 106f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bad = TRUE; 107f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 108f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* need not check Ss/Se < 0 since they came from unsigned bytes */ 109f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2) 110f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bad = TRUE; 111f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* AC scans may have only one component */ 112f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->comps_in_scan != 1) 113f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bad = TRUE; 114f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 115f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->Ah != 0) { 116f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Successive approximation refinement scan: must have Al = Ah-1. */ 117f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->Al != cinfo->Ah-1) 118f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bad = TRUE; 119f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 120f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->Al > 13) /* need not check for < 0 */ 121f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bad = TRUE; 122f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Arguably the maximum Al value should be less than 13 for 8-bit precision, 123f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * but the spec doesn't say so, and we try to be liberal about what we 124f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * accept. Note: large Al values could result in out-of-range DC 125f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * coefficients during early scans, leading to bizarre displays due to 126f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * overflows in the IDCT math. But we won't crash. 127f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 128f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (bad) 129f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT4(cinfo, JERR_BAD_PROGRESSION, 130f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); 131f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Update progression status, and verify that scan order is legal. 132f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Note that inter-scan inconsistencies are treated as warnings 133f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * not fatal errors ... not clear if this is right way to behave. 134f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 135f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 136f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int cindex = cinfo->cur_comp_info[ci]->component_index; 137f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org coef_bit_ptr = & cinfo->coef_bits[cindex][0]; 138f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ 139f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); 140f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { 141f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; 142f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->Ah != expected) 143f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); 144f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org coef_bit_ptr[coefi] = cinfo->Al; 145f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 146f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 147f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 148f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Select MCU decoding routine */ 149f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->Ah == 0) { 150f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (is_DC_band) 151f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.decode_mcu = decode_mcu_DC_first; 152f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 153f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.decode_mcu = decode_mcu_AC_first; 154f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 155f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (is_DC_band) 156f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.decode_mcu = decode_mcu_DC_refine; 157f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 158f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.decode_mcu = decode_mcu_AC_refine; 159f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 160f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 161f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 162f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr = cinfo->cur_comp_info[ci]; 163f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Make sure requested tables are present, and compute derived tables. 164f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * We may build same derived table more than once, but it's not expensive. 165f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 166f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (is_DC_band) { 167f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->Ah == 0) { /* DC refinement needs no table */ 168f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org tbl = compptr->dc_tbl_no; 169f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, 170f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org & entropy->derived_tbls[tbl]); 171f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 172f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 173f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org tbl = compptr->ac_tbl_no; 174f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, 175f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org & entropy->derived_tbls[tbl]); 176f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* remember the single active table */ 177f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->ac_derived_tbl = entropy->derived_tbls[tbl]; 178f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 179f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize DC predictions to 0 */ 180f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->saved.last_dc_val[ci] = 0; 181f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 182f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 183f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize bitread state variables */ 184f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->bitstate.bits_left = 0; 185f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ 186f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.insufficient_data = FALSE; 187f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 188f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize private state variables */ 189f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->saved.EOBRUN = 0; 190f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 191f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize restart counter */ 192f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go = cinfo->restart_interval; 193f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 194f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 195f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 196f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 197f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Figure F.12: extend sign bit. 198f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * On some machines, a shift and add will be faster than a table lookup. 199f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 200f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 2013395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org#define AVOID_TABLES 202f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifdef AVOID_TABLES 203f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 204f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x)) 205f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 206f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#else 207f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 208f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)) 209f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 210f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgstatic const int extend_test[16] = /* entry n is 2**(n-1) */ 211f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 212f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; 213f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 214f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgstatic const int extend_offset[16] = /* entry n is (-1 << n) + 1 */ 215f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, 216f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, 217f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, 218f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; 219f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 220f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif /* AVOID_TABLES */ 221f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 222f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 223f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 224f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Check for a restart marker & resynchronize decoder. 225f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Returns FALSE if must suspend. 226f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 227f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 228f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(boolean) 229f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgprocess_restart (j_decompress_ptr cinfo) 230f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 231f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 232f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int ci; 233f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 234f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Throw away any unused bits remaining in bit buffer; */ 235f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* include any full bytes in next_marker's count of discarded bytes */ 236f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; 237f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->bitstate.bits_left = 0; 238f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 239f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Advance past the RSTn marker */ 240f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! (*cinfo->marker->read_restart_marker) (cinfo)) 241f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return FALSE; 242f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 243f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Re-initialize DC predictions to 0 */ 244f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (ci = 0; ci < cinfo->comps_in_scan; ci++) 245f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->saved.last_dc_val[ci] = 0; 246f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Re-init EOB run count, too */ 247f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->saved.EOBRUN = 0; 248f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 249f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Reset restart counter */ 250f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go = cinfo->restart_interval; 251f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 252f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Reset out-of-data flag, unless read_restart_marker left us smack up 253f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * against a marker. In that case we will end up treating the next data 254f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * segment as empty, and we can avoid producing bogus output pixels by 255f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * leaving the flag set. 256f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 257f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->unread_marker == 0) 258f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.insufficient_data = FALSE; 259f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 260f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 261f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 262f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 263f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 264f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 265f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Huffman MCU decoding. 266f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Each of these routines decodes and returns one MCU's worth of 267f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Huffman-compressed coefficients. 268f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * The coefficients are reordered from zigzag order into natural array order, 269f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * but are not dequantized. 270f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 271f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * The i'th block of the MCU is stored into the block pointed to by 272f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. 273f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 274f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * We return FALSE if data source requested suspension. In that case no 275f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * changes have been made to permanent state. (Exception: some output 276f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * coefficients may already have been assigned. This is harmless for 277f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * spectral selection, since we'll just re-assign them on the next call. 278f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Successive approximation AC refinement has to be more careful, however.) 279f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 280f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 281f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 282f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * MCU decoding for DC initial scan (either spectral selection, 283f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * or first pass of successive approximation). 284f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 285f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 286f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 287f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgdecode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) 288f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 289f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 290f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int Al = cinfo->Al; 291f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int s, r; 292f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int blkn, ci; 293f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW block; 294f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BITREAD_STATE_VARS; 295f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org savable_state state; 296f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org d_derived_tbl * tbl; 297f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_component_info * compptr; 298f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 299f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Process restart marker if needed; may have to suspend */ 300f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->restart_interval) { 301f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->restarts_to_go == 0) 302f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! process_restart(cinfo)) 303f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return FALSE; 304f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 305f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 306f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* If we've run out of data, just leave the MCU set to zeroes. 307f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This way, we return uniform gray for the remainder of the segment. 308f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 309f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! entropy->pub.insufficient_data) { 310f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 311f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Load up working state */ 312f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BITREAD_LOAD_STATE(cinfo,entropy->bitstate); 313f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ASSIGN_STATE(state, entropy->saved); 314f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 315f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Outer loop handles each block in the MCU */ 316f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 317f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { 318f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org block = MCU_data[blkn]; 319f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ci = cinfo->MCU_membership[blkn]; 320f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr = cinfo->cur_comp_info[ci]; 321f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org tbl = entropy->derived_tbls[compptr->dc_tbl_no]; 322f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 323f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Decode a single block's worth of coefficients */ 324f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 325f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Section F.2.2.1: decode the DC coefficient difference */ 326f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org HUFF_DECODE(s, br_state, tbl, return FALSE, label1); 327f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (s) { 328f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org CHECK_BIT_BUFFER(br_state, s, return FALSE); 329f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r = GET_BITS(s); 330f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org s = HUFF_EXTEND(r, s); 331f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 332f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 333f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Convert DC difference to actual value, update last_dc_val */ 334f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org s += state.last_dc_val[ci]; 335f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org state.last_dc_val[ci] = s; 336f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */ 337f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*block)[0] = (JCOEF) (s << Al); 338f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 339f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 340f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Completed MCU, so update state */ 341f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BITREAD_SAVE_STATE(cinfo,entropy->bitstate); 342f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ASSIGN_STATE(entropy->saved, state); 343f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 344f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 345f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Account for restart interval (no-op if not using restarts) */ 346f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go--; 347f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 348f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 349f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 350f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 351f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 352f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 353f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * MCU decoding for AC initial scan (either spectral selection, 354f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * or first pass of successive approximation). 355f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 356f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 357f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 358f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgdecode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) 359f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 360f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 361f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int Se = cinfo->Se; 362f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int Al = cinfo->Al; 363f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int s, k, r; 364f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int EOBRUN; 365f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW block; 366f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BITREAD_STATE_VARS; 367f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org d_derived_tbl * tbl; 368f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 369f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Process restart marker if needed; may have to suspend */ 370f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->restart_interval) { 371f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->restarts_to_go == 0) 372f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! process_restart(cinfo)) 373f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return FALSE; 374f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 375f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 376f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* If we've run out of data, just leave the MCU set to zeroes. 377f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This way, we return uniform gray for the remainder of the segment. 378f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 379f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! entropy->pub.insufficient_data) { 380f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 381f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Load up working state. 382f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * We can avoid loading/saving bitread state if in an EOB run. 383f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 384f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ 385f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 386f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* There is always only one block per MCU */ 387f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 388f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (EOBRUN > 0) /* if it's a band of zeroes... */ 389f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org EOBRUN--; /* ...process it now (we do nothing) */ 390f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else { 391f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BITREAD_LOAD_STATE(cinfo,entropy->bitstate); 392f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org block = MCU_data[0]; 393f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org tbl = entropy->ac_derived_tbl; 394f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 395f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (k = cinfo->Ss; k <= Se; k++) { 396f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org HUFF_DECODE(s, br_state, tbl, return FALSE, label2); 397f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r = s >> 4; 398f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org s &= 15; 399f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (s) { 400f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org k += r; 401f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org CHECK_BIT_BUFFER(br_state, s, return FALSE); 402f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r = GET_BITS(s); 403f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org s = HUFF_EXTEND(r, s); 404f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Scale and output coefficient in natural (dezigzagged) order */ 405f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al); 406f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 407f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (r == 15) { /* ZRL */ 408f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org k += 15; /* skip 15 zeroes in band */ 409f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { /* EOBr, run length is 2^r + appended bits */ 410f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org EOBRUN = 1 << r; 411f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (r) { /* EOBr, r > 0 */ 412f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org CHECK_BIT_BUFFER(br_state, r, return FALSE); 413f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r = GET_BITS(r); 414f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org EOBRUN += r; 415f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 416f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org EOBRUN--; /* this band is processed at this moment */ 417f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; /* force end-of-band */ 418f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 419f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 420f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 421f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 422f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BITREAD_SAVE_STATE(cinfo,entropy->bitstate); 423f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 424f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 425f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Completed MCU, so update state */ 426f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ 427f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 428f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 429f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Account for restart interval (no-op if not using restarts) */ 430f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go--; 431f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 432f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 433f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 434f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 435f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 436f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 437f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * MCU decoding for DC successive approximation refinement scan. 438f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Note: we assume such scans can be multi-component, although the spec 439f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * is not very clear on the point. 440f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 441f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 442f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 443f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgdecode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) 444f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 445f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 446f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ 447f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int blkn; 448f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW block; 449f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BITREAD_STATE_VARS; 450f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 451f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Process restart marker if needed; may have to suspend */ 452f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->restart_interval) { 453f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->restarts_to_go == 0) 454f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! process_restart(cinfo)) 455f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return FALSE; 456f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 457f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 458f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Not worth the cycles to check insufficient_data here, 459f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * since we will not change the data anyway if we read zeroes. 460f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 461f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 462f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Load up working state */ 463f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BITREAD_LOAD_STATE(cinfo,entropy->bitstate); 464f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 465f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Outer loop handles each block in the MCU */ 466f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 467f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { 468f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org block = MCU_data[blkn]; 469f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 470f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Encoded data is simply the next bit of the two's-complement DC value */ 471f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org CHECK_BIT_BUFFER(br_state, 1, return FALSE); 472f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (GET_BITS(1)) 473f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*block)[0] |= p1; 474f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Note: since we use |=, repeating the assignment later is safe */ 475f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 476f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 477f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Completed MCU, so update state */ 478f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BITREAD_SAVE_STATE(cinfo,entropy->bitstate); 479f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 480f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Account for restart interval (no-op if not using restarts) */ 481f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go--; 482f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 483f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 484f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 485f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 486f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 487f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 488f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * MCU decoding for AC successive approximation refinement scan. 489f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 490f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 491f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 492f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgdecode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) 493f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 494f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 495f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int Se = cinfo->Se; 496f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ 497f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ 498f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int s, k, r; 499f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int EOBRUN; 500f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW block; 501f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JCOEFPTR thiscoef; 502f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BITREAD_STATE_VARS; 503f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org d_derived_tbl * tbl; 504f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int num_newnz; 505f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int newnz_pos[DCTSIZE2]; 506f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 507f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Process restart marker if needed; may have to suspend */ 508f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->restart_interval) { 509f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->restarts_to_go == 0) 510f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! process_restart(cinfo)) 511f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return FALSE; 512f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 513f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 514f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* If we've run out of data, don't modify the MCU. 515f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 516f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! entropy->pub.insufficient_data) { 517f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 518f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Load up working state */ 519f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BITREAD_LOAD_STATE(cinfo,entropy->bitstate); 520f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ 521f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 522f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* There is always only one block per MCU */ 523f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org block = MCU_data[0]; 524f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org tbl = entropy->ac_derived_tbl; 525f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 526f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* If we are forced to suspend, we must undo the assignments to any newly 527f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * nonzero coefficients in the block, because otherwise we'd get confused 528f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * next time about which coefficients were already nonzero. 529f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * But we need not undo addition of bits to already-nonzero coefficients; 530f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * instead, we can test the current bit to see if we already did it. 531f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 532f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org num_newnz = 0; 533f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 534f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* initialize coefficient loop counter to start of band */ 535f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org k = cinfo->Ss; 536f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 537f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (EOBRUN == 0) { 538f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (; k <= Se; k++) { 539f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org HUFF_DECODE(s, br_state, tbl, goto undoit, label3); 540f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r = s >> 4; 541f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org s &= 15; 542f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (s) { 543f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (s != 1) /* size of new coef should always be 1 */ 544f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org WARNMS(cinfo, JWRN_HUFF_BAD_CODE); 545f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org CHECK_BIT_BUFFER(br_state, 1, goto undoit); 546f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (GET_BITS(1)) 547f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org s = p1; /* newly nonzero coef is positive */ 548f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 549f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org s = m1; /* newly nonzero coef is negative */ 550f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 551f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (r != 15) { 552f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */ 553f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (r) { 554f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org CHECK_BIT_BUFFER(br_state, r, goto undoit); 555f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r = GET_BITS(r); 556f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org EOBRUN += r; 557f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 558f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; /* rest of block is handled by EOB logic */ 559f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 560f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* note s = 0 for processing ZRL */ 561f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 562f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Advance over already-nonzero coefs and r still-zero coefs, 563f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * appending correction bits to the nonzeroes. A correction bit is 1 564f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * if the absolute value of the coefficient must be increased. 565f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 566f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org do { 567f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org thiscoef = *block + jpeg_natural_order[k]; 568f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (*thiscoef != 0) { 569f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org CHECK_BIT_BUFFER(br_state, 1, goto undoit); 570f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (GET_BITS(1)) { 571f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if ((*thiscoef & p1) == 0) { /* do nothing if already set it */ 572f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (*thiscoef >= 0) 573f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *thiscoef += p1; 574f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 575f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *thiscoef += m1; 576f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 577f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 578f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 579f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (--r < 0) 580f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; /* reached target zero coefficient */ 581f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 582f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org k++; 583f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } while (k <= Se); 584f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (s) { 585f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int pos = jpeg_natural_order[k]; 586f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Output newly nonzero coefficient */ 587f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*block)[pos] = (JCOEF) s; 588f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Remember its position in case we have to suspend */ 589f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org newnz_pos[num_newnz++] = pos; 590f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 591f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 592f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 593f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 594f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (EOBRUN > 0) { 595f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Scan any remaining coefficient positions after the end-of-band 596f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * (the last newly nonzero coefficient, if any). Append a correction 597f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * bit to each already-nonzero coefficient. A correction bit is 1 598f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * if the absolute value of the coefficient must be increased. 599f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 600f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (; k <= Se; k++) { 601f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org thiscoef = *block + jpeg_natural_order[k]; 602f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (*thiscoef != 0) { 603f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org CHECK_BIT_BUFFER(br_state, 1, goto undoit); 604f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (GET_BITS(1)) { 605f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */ 606f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (*thiscoef >= 0) 607f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *thiscoef += p1; 608f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 609f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *thiscoef += m1; 610f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 611f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 612f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 613f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 614f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Count one block completed in EOB run */ 615f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org EOBRUN--; 616f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 617f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 618f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Completed MCU, so update state */ 619f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BITREAD_SAVE_STATE(cinfo,entropy->bitstate); 620f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ 621f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 622f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 623f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Account for restart interval (no-op if not using restarts) */ 624f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go--; 625f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 626f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 627f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 628f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgundoit: 629f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Re-zero any output coefficients that we made newly nonzero */ 630f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (num_newnz > 0) 631f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*block)[newnz_pos[--num_newnz]] = 0; 632f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 633f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return FALSE; 634f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 635f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 636f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 637f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 638f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Module initialization routine for progressive Huffman entropy decoding. 639f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 640f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 641f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 642f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjinit_phuff_decoder (j_decompress_ptr cinfo) 643f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 644f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy; 645f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int *coef_bit_ptr; 646f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int ci, i; 647f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 648f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy = (phuff_entropy_ptr) 649f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 650f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SIZEOF(phuff_entropy_decoder)); 651f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; 652f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.start_pass = start_pass_phuff_decoder; 653f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 654f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Mark derived tables unallocated */ 655f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < NUM_HUFF_TBLS; i++) { 656f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->derived_tbls[i] = NULL; 657f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 658f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 659f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Create progression status table */ 660f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->coef_bits = (int (*)[DCTSIZE2]) 661f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 662f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->num_components*DCTSIZE2*SIZEOF(int)); 663f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org coef_bit_ptr = & cinfo->coef_bits[0][0]; 664f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (ci = 0; ci < cinfo->num_components; ci++) 665f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < DCTSIZE2; i++) 666f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *coef_bit_ptr++ = -1; 667f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 668f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 669f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif /* D_PROGRESSIVE_SUPPORTED */ 670