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