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