1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * jdarith.c
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Developed 1997-2012 by Guido Vollbeding.
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This file is part of the Independent JPEG Group's software.
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * For conditions of distribution and use, see the accompanying README file.
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This file contains portable arithmetic entropy decoding routines for JPEG
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81).
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Both sequential and progressive modes are supported in this single module.
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Suspension is not currently supported in this module.
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define JPEG_INTERNALS
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "jinclude.h"
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "jpeglib.h"
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Expanded entropy decoder object for arithmetic decoding. */
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct {
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  struct jpeg_entropy_decoder pub; /* public fields */
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  INT32 c;       /* C register, base of coding interval + input bit buffer */
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  INT32 a;               /* A register, normalized size of coding interval */
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int ct;     /* bit shift counter, # of bits left in bit buffer part of C */
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                                         /* init: ct = -16 */
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                                         /* run: ct = 0..7 */
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                                         /* error: ct = -1 */
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  unsigned int restarts_to_go;	/* MCUs left in this restart interval */
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Pointers to statistics areas (these workspaces have image lifespan) */
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  unsigned char * dc_stats[NUM_ARITH_TBLS];
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  unsigned char * ac_stats[NUM_ARITH_TBLS];
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Statistics bin for coding with fixed probability 0.5 */
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  unsigned char fixed_bin[4];
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} arith_entropy_decoder;
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef arith_entropy_decoder * arith_entropy_ptr;
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* The following two definitions specify the allocation chunk size
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * for the statistics area.
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * 49 statistics bins for DC, and 245 statistics bins for AC coding.
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * We use a compact representation with 1 byte per statistics bin,
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * thus the numbers directly represent byte sizes.
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This 1 byte per statistics bin contains the meaning of the MPS
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * (more probable symbol) in the highest bit (mask 0x80), and the
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * index into the probability estimation state machine table
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * in the lower bits (mask 0x7F).
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define DC_STAT_BINS 64
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define AC_STAT_BINS 256
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLOCAL(int)
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerget_byte (j_decompress_ptr cinfo)
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Read next input byte; we do not support suspension in this module. */
67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  struct jpeg_source_mgr * src = cinfo->src;
69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (src->bytes_in_buffer == 0)
71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (! (*src->fill_input_buffer) (cinfo))
72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      ERREXIT(cinfo, JERR_CANT_SUSPEND);
73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  src->bytes_in_buffer--;
74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  return GETJOCTET(*src->next_input_byte++);
75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * The core arithmetic decoding routine (common in JPEG and JBIG).
80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This needs to go as fast as possible.
81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Machine-dependent optimization facilities
82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * are not utilized in this portable implementation.
83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * However, this code should be fairly efficient and
84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * may be a good base for further optimizations anyway.
85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Return value is 0 or 1 (binary decision).
87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Note: I've changed the handling of the code base & bit
89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * buffer register C compared to other implementations
90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * based on the standards layout & procedures.
91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * While it also contains both the actual base of the
92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * coding interval (16 bits) and the next-bits buffer,
93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * the cut-point between these two parts is floating
94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * (instead of fixed) with the bit shift counter CT.
95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Thus, we also need only one (variable instead of
96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * fixed size) shift for the LPS/MPS decision, and
97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * we can get away with any renormalization update
98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * of C (except for new data insertion, of course).
99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * I've also introduced a new scheme for accessing
101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * the probability estimation state machine table,
102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * derived from Markus Kuhn's JBIG implementation.
103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
105793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLOCAL(int)
106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerarith_decode (j_decompress_ptr cinfo, unsigned char *st)
107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  register unsigned char nl, nm;
110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  register INT32 qe, temp;
111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  register int sv, data;
112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Renormalization & data input per section D.2.6 */
114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  while (e->a < 0x8000L) {
115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (--e->ct < 0) {
116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Need to fetch next data byte */
117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (cinfo->unread_marker)
118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        data = 0;		/* stuff zero data */
119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else {
120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        data = get_byte(cinfo);	/* read next input byte */
121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (data == 0xFF) {	/* zero stuff or marker code */
122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          do data = get_byte(cinfo);
123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          while (data == 0xFF);	/* swallow extra 0xFF bytes */
124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          if (data == 0)
125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            data = 0xFF;	/* discard stuffed zero byte */
126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          else {
127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            /* Note: Different from the Huffman decoder, hitting
128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * a marker while processing the compressed data
129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * segment is legal in arithmetic coding.
130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * The convention is to supply zero data
131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             * then until decoding is complete.
132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             */
133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            cinfo->unread_marker = data;
134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            data = 0;
135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          }
136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      e->c = (e->c << 8) | data; /* insert data into C register */
139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if ((e->ct += 8) < 0)	 /* update bit shift counter */
140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /* Need more initial bytes */
141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (++e->ct == 0)
142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          /* Got 2 initial bytes -> re-init A and exit loop */
143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          e->a = 0x8000L; /* => e->a = 0x10000L after loop exit */
144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    e->a <<= 1;
146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Fetch values from our compact representation of Table D.3(D.2):
149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   * Qe values and probability estimation state machine
150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler   */
151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  sv = *st;
152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  qe = jpeg_aritab[sv & 0x7F];	/* => Qe_Value */
153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  nl = qe & 0xFF; qe >>= 8;	/* Next_Index_LPS + Switch_MPS */
154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  nm = qe & 0xFF; qe >>= 8;	/* Next_Index_MPS */
155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Decode & estimation procedures per sections D.2.4 & D.2.5 */
157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  temp = e->a - qe;
158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  e->a = temp;
159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  temp <<= e->ct;
160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (e->c >= temp) {
161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    e->c -= temp;
162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Conditional LPS (less probable symbol) exchange */
163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (e->a < qe) {
164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      e->a = qe;
165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      *st = (sv & 0x80) ^ nm;	/* Estimate_after_MPS */
166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      e->a = qe;
168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      *st = (sv & 0x80) ^ nl;	/* Estimate_after_LPS */
169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      sv ^= 0x80;		/* Exchange LPS/MPS */
170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  } else if (e->a < 0x8000L) {
172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Conditional MPS (more probable symbol) exchange */
173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (e->a < qe) {
174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      *st = (sv & 0x80) ^ nl;	/* Estimate_after_LPS */
175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      sv ^= 0x80;		/* Exchange LPS/MPS */
176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      *st = (sv & 0x80) ^ nm;	/* Estimate_after_MPS */
178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  return sv >> 7;
182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Check for a restart marker & resynchronize decoder.
187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
189793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLOCAL(void)
190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprocess_restart (j_decompress_ptr cinfo)
191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int ci;
194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  jpeg_component_info * compptr;
195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Advance past the RSTn marker */
197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (! (*cinfo->marker->read_restart_marker) (cinfo))
198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ERREXIT(cinfo, JERR_CANT_SUSPEND);
199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Re-initialize statistics areas */
201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    compptr = cinfo->cur_comp_info[ci];
203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Reset DC predictions to 0 */
206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      entropy->last_dc_val[ci] = 0;
207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      entropy->dc_context[ci] = 0;
208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((! cinfo->progressive_mode && cinfo->lim_Se) ||
210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        (cinfo->progressive_mode && cinfo->Ss)) {
211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Reset arithmetic decoding variables */
216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  entropy->c = 0;
217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  entropy->a = 0;
218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  entropy->ct = -16;	/* force reading 2 initial bytes to fill C */
219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Reset restart counter */
221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  entropy->restarts_to_go = cinfo->restart_interval;
222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Arithmetic MCU decoding.
227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Each of these routines decodes and returns one MCU's worth of
228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * arithmetic-compressed coefficients.
229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * The coefficients are reordered from zigzag order into natural array order,
230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * but are not dequantized.
231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *
232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * The i'th block of the MCU is stored into the block pointed to by
233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * MCU_data[i].  WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.
234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * MCU decoding for DC initial scan (either spectral selection,
238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * or first pass of successive approximation).
239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
241793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMETHODDEF(boolean)
242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdecode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  JBLOCKROW block;
246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  unsigned char *st;
247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int blkn, ci, tbl, sign;
248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int v, m;
249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Process restart marker if needed */
251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->restart_interval) {
252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (entropy->restarts_to_go == 0)
253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      process_restart(cinfo);
254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    entropy->restarts_to_go--;
255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (entropy->ct == -1) return TRUE;	/* if error do nothing */
258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Outer loop handles each block in the MCU */
260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    block = MCU_data[blkn];
263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ci = cinfo->MCU_membership[blkn];
264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */
267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Figure F.19: Decode_DC_DIFF */
272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (arith_decode(cinfo, st) == 0)
273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      entropy->dc_context[ci] = 0;
274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else {
275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Figure F.21: Decoding nonzero value v */
276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Figure F.22: Decoding the sign of v */
277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      sign = arith_decode(cinfo, st + 1);
278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      st += 2; st += sign;
279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Figure F.23: Decoding the magnitude category of v */
280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if ((m = arith_decode(cinfo, st)) != 0) {
281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        st = entropy->dc_stats[tbl] + 20;	/* Table F.4: X1 = 20 */
282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        while (arith_decode(cinfo, st)) {
283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          if ((m <<= 1) == 0x8000) {
284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            entropy->ct = -1;			/* magnitude overflow */
286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return TRUE;
287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          }
288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          st += 1;
289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->dc_context[ci] = 0;		   /* zero diff category */
294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */
296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->dc_context[ci] = 4 + (sign * 4);  /* small diff category */
298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      v = m;
299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Figure F.24: Decoding the magnitude bit pattern of v */
300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      st += 14;
301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      while (m >>= 1)
302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (arith_decode(cinfo, st)) v |= m;
303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      v += 1; if (sign) v = -v;
304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      entropy->last_dc_val[ci] += v;
305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Scale and output the DC coefficient (assumes jpeg_natural_order[0]=0) */
308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*block)[0] = (JCOEF) (entropy->last_dc_val[ci] << cinfo->Al);
309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  return TRUE;
312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * MCU decoding for AC initial scan (either spectral selection,
317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * or first pass of successive approximation).
318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
320793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMETHODDEF(boolean)
321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdecode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  JBLOCKROW block;
325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  unsigned char *st;
326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int tbl, sign, k;
327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int v, m;
328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  const int * natural_order;
329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Process restart marker if needed */
331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->restart_interval) {
332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (entropy->restarts_to_go == 0)
333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      process_restart(cinfo);
334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    entropy->restarts_to_go--;
335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (entropy->ct == -1) return TRUE;	/* if error do nothing */
338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  natural_order = cinfo->natural_order;
340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* There is always only one block per MCU */
342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  block = MCU_data[0];
343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Figure F.20: Decode_AC_coefficients */
348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  k = cinfo->Ss - 1;
349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  do {
350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    st = entropy->ac_stats[tbl] + 3 * k;
351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (arith_decode(cinfo, st)) break;		/* EOB flag */
352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for (;;) {
353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      k++;
354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (arith_decode(cinfo, st + 1)) break;
355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      st += 3;
356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (k >= cinfo->Se) {
357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->ct = -1;			/* spectral overflow */
359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return TRUE;
360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Figure F.21: Decoding nonzero value v */
363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Figure F.22: Decoding the sign of v */
364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    sign = arith_decode(cinfo, entropy->fixed_bin);
365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    st += 2;
366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Figure F.23: Decoding the magnitude category of v */
367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((m = arith_decode(cinfo, st)) != 0) {
368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (arith_decode(cinfo, st)) {
369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        m <<= 1;
370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        st = entropy->ac_stats[tbl] +
371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        while (arith_decode(cinfo, st)) {
373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          if ((m <<= 1) == 0x8000) {
374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            entropy->ct = -1;			/* magnitude overflow */
376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return TRUE;
377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          }
378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          st += 1;
379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    v = m;
383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Figure F.24: Decoding the magnitude bit pattern of v */
384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    st += 14;
385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    while (m >>= 1)
386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (arith_decode(cinfo, st)) v |= m;
387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    v += 1; if (sign) v = -v;
388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Scale and output coefficient in natural (dezigzagged) order */
389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*block)[natural_order[k]] = (JCOEF) (v << cinfo->Al);
390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  } while (k < cinfo->Se);
391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  return TRUE;
393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * MCU decoding for DC successive approximation refinement scan.
398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
400793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMETHODDEF(boolean)
401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdecode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  unsigned char *st;
405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int p1, blkn;
406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Process restart marker if needed */
408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->restart_interval) {
409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (entropy->restarts_to_go == 0)
410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      process_restart(cinfo);
411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    entropy->restarts_to_go--;
412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  st = entropy->fixed_bin;	/* use fixed probability estimation */
415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  p1 = 1 << cinfo->Al;		/* 1 in the bit position being coded */
416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Outer loop handles each block in the MCU */
418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Encoded data is simply the next bit of the two's-complement DC value */
421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (arith_decode(cinfo, st))
422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      MCU_data[blkn][0][0] |= p1;
423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  return TRUE;
426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * MCU decoding for AC successive approximation refinement scan.
431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
433793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMETHODDEF(boolean)
434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdecode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  JBLOCKROW block;
438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  JCOEFPTR thiscoef;
439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  unsigned char *st;
440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int tbl, k, kex;
441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int p1, m1;
442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  const int * natural_order;
443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Process restart marker if needed */
445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->restart_interval) {
446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (entropy->restarts_to_go == 0)
447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      process_restart(cinfo);
448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    entropy->restarts_to_go--;
449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (entropy->ct == -1) return TRUE;	/* if error do nothing */
452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  natural_order = cinfo->natural_order;
454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* There is always only one block per MCU */
456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  block = MCU_data[0];
457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  p1 = 1 << cinfo->Al;		/* 1 in the bit position being coded */
460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  m1 = (-1) << cinfo->Al;	/* -1 in the bit position being coded */
461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Establish EOBx (previous stage end-of-block) index */
463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  kex = cinfo->Se;
464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  do {
465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((*block)[natural_order[kex]]) break;
466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  } while (--kex);
467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  k = cinfo->Ss - 1;
469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  do {
470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    st = entropy->ac_stats[tbl] + 3 * k;
471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (k >= kex)
472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (arith_decode(cinfo, st)) break;	/* EOB flag */
473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for (;;) {
474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      thiscoef = *block + natural_order[++k];
475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (*thiscoef) {				/* previously nonzero coef */
476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (arith_decode(cinfo, st + 2)) {
477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          if (*thiscoef < 0)
478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *thiscoef += m1;
479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          else
480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            *thiscoef += p1;
481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (arith_decode(cinfo, st + 1)) {	/* newly nonzero coef */
485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (arith_decode(cinfo, entropy->fixed_bin))
486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          *thiscoef = m1;
487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else
488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          *thiscoef = p1;
489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      st += 3;
492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (k >= cinfo->Se) {
493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->ct = -1;			/* spectral overflow */
495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return TRUE;
496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  } while (k < cinfo->Se);
499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  return TRUE;
501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Decode one MCU's worth of arithmetic-compressed coefficients.
506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
508793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMETHODDEF(boolean)
509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdecode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  jpeg_component_info * compptr;
513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  JBLOCKROW block;
514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  unsigned char *st;
515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int blkn, ci, tbl, sign, k;
516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int v, m;
517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  const int * natural_order;
518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Process restart marker if needed */
520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->restart_interval) {
521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (entropy->restarts_to_go == 0)
522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      process_restart(cinfo);
523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    entropy->restarts_to_go--;
524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (entropy->ct == -1) return TRUE;	/* if error do nothing */
527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  natural_order = cinfo->natural_order;
529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Outer loop handles each block in the MCU */
531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    block = MCU_data[blkn];
534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ci = cinfo->MCU_membership[blkn];
535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    compptr = cinfo->cur_comp_info[ci];
536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */
538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tbl = compptr->dc_tbl_no;
540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Figure F.19: Decode_DC_DIFF */
545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (arith_decode(cinfo, st) == 0)
546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      entropy->dc_context[ci] = 0;
547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    else {
548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Figure F.21: Decoding nonzero value v */
549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Figure F.22: Decoding the sign of v */
550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      sign = arith_decode(cinfo, st + 1);
551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      st += 2; st += sign;
552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Figure F.23: Decoding the magnitude category of v */
553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if ((m = arith_decode(cinfo, st)) != 0) {
554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        st = entropy->dc_stats[tbl] + 20;	/* Table F.4: X1 = 20 */
555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        while (arith_decode(cinfo, st)) {
556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          if ((m <<= 1) == 0x8000) {
557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            entropy->ct = -1;			/* magnitude overflow */
559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return TRUE;
560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          }
561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          st += 1;
562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->dc_context[ci] = 0;		   /* zero diff category */
567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */
569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->dc_context[ci] = 4 + (sign * 4);  /* small diff category */
571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      v = m;
572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Figure F.24: Decoding the magnitude bit pattern of v */
573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      st += 14;
574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      while (m >>= 1)
575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (arith_decode(cinfo, st)) v |= m;
576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      v += 1; if (sign) v = -v;
577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      entropy->last_dc_val[ci] += v;
578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*block)[0] = (JCOEF) entropy->last_dc_val[ci];
581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->lim_Se == 0) continue;
585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    tbl = compptr->ac_tbl_no;
586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    k = 0;
587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Figure F.20: Decode_AC_coefficients */
589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    do {
590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      st = entropy->ac_stats[tbl] + 3 * k;
591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (arith_decode(cinfo, st)) break;	/* EOB flag */
592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      for (;;) {
593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        k++;
594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (arith_decode(cinfo, st + 1)) break;
595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        st += 3;
596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (k >= cinfo->lim_Se) {
597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          entropy->ct = -1;			/* spectral overflow */
599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          return TRUE;
600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Figure F.21: Decoding nonzero value v */
603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Figure F.22: Decoding the sign of v */
604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      sign = arith_decode(cinfo, entropy->fixed_bin);
605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      st += 2;
606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Figure F.23: Decoding the magnitude category of v */
607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if ((m = arith_decode(cinfo, st)) != 0) {
608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (arith_decode(cinfo, st)) {
609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          m <<= 1;
610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          st = entropy->ac_stats[tbl] +
611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          while (arith_decode(cinfo, st)) {
613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if ((m <<= 1) == 0x8000) {
614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler              WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler              entropy->ct = -1;			/* magnitude overflow */
616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler              return TRUE;
617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            }
618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            st += 1;
619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          }
620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        }
621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      v = m;
623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Figure F.24: Decoding the magnitude bit pattern of v */
624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      st += 14;
625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      while (m >>= 1)
626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (arith_decode(cinfo, st)) v |= m;
627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      v += 1; if (sign) v = -v;
628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      (*block)[natural_order[k]] = (JCOEF) v;
629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } while (k < cinfo->lim_Se);
630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  return TRUE;
633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Initialize for an arithmetic-compressed scan.
638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
640793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMETHODDEF(void)
641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstart_pass (j_decompress_ptr cinfo)
642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int ci, tbl;
645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  jpeg_component_info * compptr;
646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->progressive_mode) {
648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Validate progressive scan parameters */
649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->Ss == 0) {
650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (cinfo->Se != 0)
651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        goto bad;
652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* need not check Ss/Se < 0 since they came from unsigned bytes */
654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se)
655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        goto bad;
656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* AC scans may have only one component */
657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (cinfo->comps_in_scan != 1)
658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        goto bad;
659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->Ah != 0) {
661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Successive approximation refinement scan: must have Al = Ah-1. */
662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (cinfo->Ah-1 != cinfo->Al)
663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        goto bad;
664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->Al > 13) {	/* need not check for < 0 */
666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      bad:
667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Update progression status, and verify that scan order is legal.
671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * Note that inter-scan inconsistencies are treated as warnings
672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * not fatal errors ... not clear if this is right way to behave.
673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      int coefi, cindex = cinfo->cur_comp_info[ci]->component_index;
676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      int *coef_bit_ptr = & cinfo->coef_bits[cindex][0];
677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if (cinfo->Ah != expected)
682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);
683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        coef_bit_ptr[coefi] = cinfo->Al;
684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      }
685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Select MCU decoding routine */
687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->Ah == 0) {
688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (cinfo->Ss == 0)
689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->pub.decode_mcu = decode_mcu_DC_first;
690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->pub.decode_mcu = decode_mcu_AC_first;
692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    } else {
693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (cinfo->Ss == 0)
694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->pub.decode_mcu = decode_mcu_DC_refine;
695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      else
696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->pub.decode_mcu = decode_mcu_AC_refine;
697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  } else {
699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     * This ought to be an error condition, but we make it a warning.
701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     */
702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 ||
703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        (cinfo->Se < DCTSIZE2 && cinfo->Se != cinfo->lim_Se))
704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Select MCU decoding routine */
706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    entropy->pub.decode_mcu = decode_mcu;
707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Allocate & initialize requested statistics areas */
710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    compptr = cinfo->cur_comp_info[ci];
712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      tbl = compptr->dc_tbl_no;
714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (entropy->dc_stats[tbl] == NULL)
717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS);
719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);
720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      /* Initialize DC predictions to 0 */
721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      entropy->last_dc_val[ci] = 0;
722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      entropy->dc_context[ci] = 0;
723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ((! cinfo->progressive_mode && cinfo->lim_Se) ||
725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        (cinfo->progressive_mode && cinfo->Ss)) {
726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      tbl = compptr->ac_tbl_no;
727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      if (entropy->ac_stats[tbl] == NULL)
730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler          ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS);
732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);
733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Initialize arithmetic decoding variables */
737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  entropy->c = 0;
738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  entropy->a = 0;
739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  entropy->ct = -16;	/* force reading 2 initial bytes to fill C */
740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Initialize restart counter */
742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  entropy->restarts_to_go = cinfo->restart_interval;
743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/*
747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Module initialization routine for arithmetic entropy decoding.
748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */
749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
750793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerGLOBAL(void)
751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerjinit_arith_decoder (j_decompress_ptr cinfo)
752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  arith_entropy_ptr entropy;
754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  int i;
755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  entropy = (arith_entropy_ptr)
757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                SIZEOF(arith_entropy_decoder));
759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  cinfo->entropy = &entropy->pub;
760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  entropy->pub.start_pass = start_pass;
761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Mark tables unallocated */
763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  for (i = 0; i < NUM_ARITH_TBLS; i++) {
764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    entropy->dc_stats[i] = NULL;
765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    entropy->ac_stats[i] = NULL;
766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  /* Initialize index for fixed probability estimation */
769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  entropy->fixed_bin[0] = 113;
770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  if (cinfo->progressive_mode) {
772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    /* Create progression status table */
773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int *coef_bit_ptr, ci;
774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cinfo->coef_bits = (int (*)[DCTSIZE2])
775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                  cinfo->num_components*DCTSIZE2*SIZEOF(int));
777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    coef_bit_ptr = & cinfo->coef_bits[0][0];
778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for (ci = 0; ci < cinfo->num_components; ci++)
779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler      for (i = 0; i < DCTSIZE2; i++)
780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        *coef_bit_ptr++ = -1;
781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler  }
782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
783