11e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* 21e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * jdarith.c 31e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * 45de454b291f48382648a5d1dc2aa0fca8b5786d4DRC * This file was part of the Independent JPEG Group's software: 56eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis * Developed 1997-2015 by Guido Vollbeding. 6ac30a1bf12751bd82e56158eb9456a28d9c086f3DRC * libjpeg-turbo Modifications: 76eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis * Copyright (C) 2015-2016, D. R. Commander. 86eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis * For conditions of distribution and use, see the accompanying README.ijg 96eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis * file. 101e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * 111e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * This file contains portable arithmetic entropy decoding routines for JPEG 121e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81). 131e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * 141e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Both sequential and progressive modes are supported in this single module. 151e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * 161e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Suspension is not currently supported in this module. 171e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 181e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 191e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding#define JPEG_INTERNALS 201e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding#include "jinclude.h" 211e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding#include "jpeglib.h" 221e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 231e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 24bd7903e2a5584fe8d4c1103da25dff429e77c304Leon Scroggins III#define NEG_1 ((unsigned int)-1) 25bd7903e2a5584fe8d4c1103da25dff429e77c304Leon Scroggins III 26bd7903e2a5584fe8d4c1103da25dff429e77c304Leon Scroggins III 271e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* Expanded entropy decoder object for arithmetic decoding. */ 281e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 291e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbedingtypedef struct { 301e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding struct jpeg_entropy_decoder pub; /* public fields */ 311e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 326eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis JLONG c; /* C register, base of coding interval + input bit buffer */ 336eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis JLONG a; /* A register, normalized size of coding interval */ 341e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int ct; /* bit shift counter, # of bits left in bit buffer part of C */ 351e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* init: ct = -16 */ 361e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* run: ct = 0..7 */ 371e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* error: ct = -1 */ 381e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ 391e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */ 401e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 41e5eaf37440b8e337ab150c017df7c03faf846c51DRC unsigned int restarts_to_go; /* MCUs left in this restart interval */ 421e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 431e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Pointers to statistics areas (these workspaces have image lifespan) */ 446eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis unsigned char *dc_stats[NUM_ARITH_TBLS]; 456eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis unsigned char *ac_stats[NUM_ARITH_TBLS]; 46989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding 47989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding /* Statistics bin for coding with fixed probability 0.5 */ 48989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding unsigned char fixed_bin[4]; 491e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding} arith_entropy_decoder; 501e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 516eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidistypedef arith_entropy_decoder *arith_entropy_ptr; 521e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 531e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* The following two definitions specify the allocation chunk size 541e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * for the statistics area. 551e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least 561e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * 49 statistics bins for DC, and 245 statistics bins for AC coding. 571e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * 581e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * We use a compact representation with 1 byte per statistics bin, 591e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * thus the numbers directly represent byte sizes. 601e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * This 1 byte per statistics bin contains the meaning of the MPS 611e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * (more probable symbol) in the highest bit (mask 0x80), and the 621e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * index into the probability estimation state machine table 631e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * in the lower bits (mask 0x7F). 641e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 651e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 661e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding#define DC_STAT_BINS 64 671e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding#define AC_STAT_BINS 256 681e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 691e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 701e247ac854f8e33682bcfea475f6bccc42377208Guido VollbedingLOCAL(int) 711e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbedingget_byte (j_decompress_ptr cinfo) 721e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* Read next input byte; we do not support suspension in this module. */ 731e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding{ 746eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis struct jpeg_source_mgr *src = cinfo->src; 751e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 761e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (src->bytes_in_buffer == 0) 771e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (! (*src->fill_input_buffer) (cinfo)) 781e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding ERREXIT(cinfo, JERR_CANT_SUSPEND); 791e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding src->bytes_in_buffer--; 801e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding return GETJOCTET(*src->next_input_byte++); 811e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding} 821e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 831e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 841e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* 851e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * The core arithmetic decoding routine (common in JPEG and JBIG). 861e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * This needs to go as fast as possible. 871e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Machine-dependent optimization facilities 881e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * are not utilized in this portable implementation. 891e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * However, this code should be fairly efficient and 901e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * may be a good base for further optimizations anyway. 911e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * 921e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Return value is 0 or 1 (binary decision). 931e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * 941e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Note: I've changed the handling of the code base & bit 951e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * buffer register C compared to other implementations 961e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * based on the standards layout & procedures. 971e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * While it also contains both the actual base of the 981e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * coding interval (16 bits) and the next-bits buffer, 991e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * the cut-point between these two parts is floating 1001e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * (instead of fixed) with the bit shift counter CT. 1011e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Thus, we also need only one (variable instead of 1021e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * fixed size) shift for the LPS/MPS decision, and 1036eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis * we can do away with any renormalization update 1041e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * of C (except for new data insertion, of course). 1051e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * 1061e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * I've also introduced a new scheme for accessing 1071e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * the probability estimation state machine table, 1081e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * derived from Markus Kuhn's JBIG implementation. 1091e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 1101e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 1111e247ac854f8e33682bcfea475f6bccc42377208Guido VollbedingLOCAL(int) 1121e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbedingarith_decode (j_decompress_ptr cinfo, unsigned char *st) 1131e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding{ 1141e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; 1151e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding register unsigned char nl, nm; 1166eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis register JLONG qe, temp; 1171e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding register int sv, data; 1181e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 1191e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Renormalization & data input per section D.2.6 */ 1201e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding while (e->a < 0x8000L) { 1211e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (--e->ct < 0) { 1221e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Need to fetch next data byte */ 1231e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->unread_marker) 124e5eaf37440b8e337ab150c017df7c03faf846c51DRC data = 0; /* stuff zero data */ 1251e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding else { 126e5eaf37440b8e337ab150c017df7c03faf846c51DRC data = get_byte(cinfo); /* read next input byte */ 127e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (data == 0xFF) { /* zero stuff or marker code */ 128e5eaf37440b8e337ab150c017df7c03faf846c51DRC do data = get_byte(cinfo); 129e5eaf37440b8e337ab150c017df7c03faf846c51DRC while (data == 0xFF); /* swallow extra 0xFF bytes */ 130e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (data == 0) 131e5eaf37440b8e337ab150c017df7c03faf846c51DRC data = 0xFF; /* discard stuffed zero byte */ 132e5eaf37440b8e337ab150c017df7c03faf846c51DRC else { 133e5eaf37440b8e337ab150c017df7c03faf846c51DRC /* Note: Different from the Huffman decoder, hitting 134e5eaf37440b8e337ab150c017df7c03faf846c51DRC * a marker while processing the compressed data 135e5eaf37440b8e337ab150c017df7c03faf846c51DRC * segment is legal in arithmetic coding. 136e5eaf37440b8e337ab150c017df7c03faf846c51DRC * The convention is to supply zero data 137e5eaf37440b8e337ab150c017df7c03faf846c51DRC * then until decoding is complete. 138e5eaf37440b8e337ab150c017df7c03faf846c51DRC */ 139e5eaf37440b8e337ab150c017df7c03faf846c51DRC cinfo->unread_marker = data; 140e5eaf37440b8e337ab150c017df7c03faf846c51DRC data = 0; 141e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 142e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 1431e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 1441e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding e->c = (e->c << 8) | data; /* insert data into C register */ 145e5eaf37440b8e337ab150c017df7c03faf846c51DRC if ((e->ct += 8) < 0) /* update bit shift counter */ 146e5eaf37440b8e337ab150c017df7c03faf846c51DRC /* Need more initial bytes */ 147e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (++e->ct == 0) 148e5eaf37440b8e337ab150c017df7c03faf846c51DRC /* Got 2 initial bytes -> re-init A and exit loop */ 149e5eaf37440b8e337ab150c017df7c03faf846c51DRC e->a = 0x8000L; /* => e->a = 0x10000L after loop exit */ 1501e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 1511e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding e->a <<= 1; 1521e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 1531e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 1541e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Fetch values from our compact representation of Table D.2: 1551e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Qe values and probability estimation state machine 1561e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 1571e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding sv = *st; 158e5eaf37440b8e337ab150c017df7c03faf846c51DRC qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */ 159e5eaf37440b8e337ab150c017df7c03faf846c51DRC nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */ 160e5eaf37440b8e337ab150c017df7c03faf846c51DRC nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */ 1611e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 1621e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Decode & estimation procedures per sections D.2.4 & D.2.5 */ 1631e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding temp = e->a - qe; 1641e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding e->a = temp; 1651e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding temp <<= e->ct; 1661e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (e->c >= temp) { 1671e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding e->c -= temp; 1681e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Conditional LPS (less probable symbol) exchange */ 1691e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (e->a < qe) { 1701e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding e->a = qe; 171e5eaf37440b8e337ab150c017df7c03faf846c51DRC *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ 1721e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } else { 1731e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding e->a = qe; 174e5eaf37440b8e337ab150c017df7c03faf846c51DRC *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ 175e5eaf37440b8e337ab150c017df7c03faf846c51DRC sv ^= 0x80; /* Exchange LPS/MPS */ 1761e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 1771e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } else if (e->a < 0x8000L) { 1781e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Conditional MPS (more probable symbol) exchange */ 1791e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (e->a < qe) { 180e5eaf37440b8e337ab150c017df7c03faf846c51DRC *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ 181e5eaf37440b8e337ab150c017df7c03faf846c51DRC sv ^= 0x80; /* Exchange LPS/MPS */ 1821e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } else { 183e5eaf37440b8e337ab150c017df7c03faf846c51DRC *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ 1841e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 1851e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 1861e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 1871e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding return sv >> 7; 1881e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding} 1891e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 1901e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 1911e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* 1921e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Check for a restart marker & resynchronize decoder. 1931e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 1941e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 1951e247ac854f8e33682bcfea475f6bccc42377208Guido VollbedingLOCAL(void) 1961e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbedingprocess_restart (j_decompress_ptr cinfo) 1971e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding{ 1981e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; 1991e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int ci; 2006eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis jpeg_component_info *compptr; 2011e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2021e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Advance past the RSTn marker */ 2031e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (! (*cinfo->marker->read_restart_marker) (cinfo)) 2041e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding ERREXIT(cinfo, JERR_CANT_SUSPEND); 2051e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 206989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding /* Re-initialize statistics areas */ 2071e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 2081e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding compptr = cinfo->cur_comp_info[ci]; 2096eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis if (!cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) { 2101e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS); 2111e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Reset DC predictions to 0 */ 2121e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->last_dc_val[ci] = 0; 2131e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->dc_context[ci] = 0; 2141e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 2156eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis if (!cinfo->progressive_mode || cinfo->Ss) { 2161e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS); 2171e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 2181e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 2191e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2201e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Reset arithmetic decoding variables */ 2211e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->c = 0; 2221e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->a = 0; 223e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->ct = -16; /* force reading 2 initial bytes to fill C */ 2241e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2251e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Reset restart counter */ 2261e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->restarts_to_go = cinfo->restart_interval; 2271e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding} 2281e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2291e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2301e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* 2311e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Arithmetic MCU decoding. 2321e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Each of these routines decodes and returns one MCU's worth of 2331e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * arithmetic-compressed coefficients. 2341e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * The coefficients are reordered from zigzag order into natural array order, 2351e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * but are not dequantized. 2361e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * 2371e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * The i'th block of the MCU is stored into the block pointed to by 2381e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. 2391e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 2401e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2411e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* 2421e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * MCU decoding for DC initial scan (either spectral selection, 2431e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * or first pass of successive approximation). 2441e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 2451e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2461e247ac854f8e33682bcfea475f6bccc42377208Guido VollbedingMETHODDEF(boolean) 2471e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbedingdecode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) 2481e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding{ 2491e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; 2501e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding JBLOCKROW block; 2511e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding unsigned char *st; 2521e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int blkn, ci, tbl, sign; 2531e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int v, m; 2541e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2551e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Process restart marker if needed */ 2561e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->restart_interval) { 2571e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (entropy->restarts_to_go == 0) 2581e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding process_restart(cinfo); 2591e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->restarts_to_go--; 2601e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 2611e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 262e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (entropy->ct == -1) return TRUE; /* if error do nothing */ 2631e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2641e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Outer loop handles each block in the MCU */ 2651e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2661e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { 2671e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding block = MCU_data[blkn]; 2681e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding ci = cinfo->MCU_membership[blkn]; 2691e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding tbl = cinfo->cur_comp_info[ci]->dc_tbl_no; 2701e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2711e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */ 2721e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2731e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ 2741e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; 2751e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 2761e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.19: Decode_DC_DIFF */ 2771e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (arith_decode(cinfo, st) == 0) 2781e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->dc_context[ci] = 0; 2791e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding else { 2801e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.21: Decoding nonzero value v */ 2811e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.22: Decoding the sign of v */ 2821e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding sign = arith_decode(cinfo, st + 1); 2831e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st += 2; st += sign; 2841e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.23: Decoding the magnitude category of v */ 2851e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if ((m = arith_decode(cinfo, st)) != 0) { 286e5eaf37440b8e337ab150c017df7c03faf846c51DRC st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ 287e5eaf37440b8e337ab150c017df7c03faf846c51DRC while (arith_decode(cinfo, st)) { 288e5eaf37440b8e337ab150c017df7c03faf846c51DRC if ((m <<= 1) == 0x8000) { 289e5eaf37440b8e337ab150c017df7c03faf846c51DRC WARNMS(cinfo, JWRN_ARITH_BAD_CODE); 290e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->ct = -1; /* magnitude overflow */ 291e5eaf37440b8e337ab150c017df7c03faf846c51DRC return TRUE; 292e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 293e5eaf37440b8e337ab150c017df7c03faf846c51DRC st += 1; 294e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 2951e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 2961e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ 297989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) 298e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->dc_context[ci] = 0; /* zero diff category */ 299989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) 300e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */ 3011e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding else 302e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */ 3031e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding v = m; 3041e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.24: Decoding the magnitude bit pattern of v */ 3051e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st += 14; 3061e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding while (m >>= 1) 307e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (arith_decode(cinfo, st)) v |= m; 3081e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding v += 1; if (sign) v = -v; 3091e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->last_dc_val[ci] += v; 3101e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 3111e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3121e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Scale and output the DC coefficient (assumes jpeg_natural_order[0]=0) */ 3138e9cef2e6f5156c4b055a04a8f979b7291fc6b7aDRC (*block)[0] = (JCOEF) LEFT_SHIFT(entropy->last_dc_val[ci], cinfo->Al); 3141e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 3151e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3161e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding return TRUE; 3171e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding} 3181e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3191e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3201e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* 3211e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * MCU decoding for AC initial scan (either spectral selection, 3221e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * or first pass of successive approximation). 3231e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 3241e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3251e247ac854f8e33682bcfea475f6bccc42377208Guido VollbedingMETHODDEF(boolean) 3261e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbedingdecode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) 3271e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding{ 3281e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; 3291e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding JBLOCKROW block; 3301e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding unsigned char *st; 3311e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int tbl, sign, k; 3321e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int v, m; 3331e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3341e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Process restart marker if needed */ 3351e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->restart_interval) { 3361e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (entropy->restarts_to_go == 0) 3371e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding process_restart(cinfo); 3381e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->restarts_to_go--; 3391e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 3401e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 341e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (entropy->ct == -1) return TRUE; /* if error do nothing */ 3421e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3431e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* There is always only one block per MCU */ 3441e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding block = MCU_data[0]; 3451e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding tbl = cinfo->cur_comp_info[0]->ac_tbl_no; 3461e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3471e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */ 3481e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3491e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.20: Decode_AC_coefficients */ 3501e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding for (k = cinfo->Ss; k <= cinfo->Se; k++) { 3511e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st = entropy->ac_stats[tbl] + 3 * (k - 1); 352e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (arith_decode(cinfo, st)) break; /* EOB flag */ 3531e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding while (arith_decode(cinfo, st + 1) == 0) { 3541e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st += 3; k++; 3551e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (k > cinfo->Se) { 356e5eaf37440b8e337ab150c017df7c03faf846c51DRC WARNMS(cinfo, JWRN_ARITH_BAD_CODE); 357e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->ct = -1; /* spectral overflow */ 358e5eaf37440b8e337ab150c017df7c03faf846c51DRC return TRUE; 3591e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 3601e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 3611e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.21: Decoding nonzero value v */ 3621e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.22: Decoding the sign of v */ 363989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding sign = arith_decode(cinfo, entropy->fixed_bin); 3641e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st += 2; 3651e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.23: Decoding the magnitude category of v */ 3661e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if ((m = arith_decode(cinfo, st)) != 0) { 3671e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (arith_decode(cinfo, st)) { 368e5eaf37440b8e337ab150c017df7c03faf846c51DRC m <<= 1; 369e5eaf37440b8e337ab150c017df7c03faf846c51DRC st = entropy->ac_stats[tbl] + 370e5eaf37440b8e337ab150c017df7c03faf846c51DRC (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); 371e5eaf37440b8e337ab150c017df7c03faf846c51DRC while (arith_decode(cinfo, st)) { 372e5eaf37440b8e337ab150c017df7c03faf846c51DRC if ((m <<= 1) == 0x8000) { 373e5eaf37440b8e337ab150c017df7c03faf846c51DRC WARNMS(cinfo, JWRN_ARITH_BAD_CODE); 374e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->ct = -1; /* magnitude overflow */ 375e5eaf37440b8e337ab150c017df7c03faf846c51DRC return TRUE; 376e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 377e5eaf37440b8e337ab150c017df7c03faf846c51DRC st += 1; 378e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 3791e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 3801e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 3811e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding v = m; 3821e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.24: Decoding the magnitude bit pattern of v */ 3831e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st += 14; 3841e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding while (m >>= 1) 3851e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (arith_decode(cinfo, st)) v |= m; 3861e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding v += 1; if (sign) v = -v; 3871e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Scale and output coefficient in natural (dezigzagged) order */ 3886eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis (*block)[jpeg_natural_order[k]] = (JCOEF) ((unsigned)v << cinfo->Al); 3891e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 3901e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3911e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding return TRUE; 3921e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding} 3931e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3941e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3951e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* 3961e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * MCU decoding for DC successive approximation refinement scan. 3971e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 3981e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 3991e247ac854f8e33682bcfea475f6bccc42377208Guido VollbedingMETHODDEF(boolean) 4001e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbedingdecode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) 4011e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding{ 4021e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; 403989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding unsigned char *st; 4041e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int p1, blkn; 4051e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4061e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Process restart marker if needed */ 4071e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->restart_interval) { 4081e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (entropy->restarts_to_go == 0) 4091e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding process_restart(cinfo); 4101e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->restarts_to_go--; 4111e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 4121e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 413e5eaf37440b8e337ab150c017df7c03faf846c51DRC st = entropy->fixed_bin; /* use fixed probability estimation */ 414e5eaf37440b8e337ab150c017df7c03faf846c51DRC p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ 4151e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4161e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Outer loop handles each block in the MCU */ 4171e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4181e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { 4191e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Encoded data is simply the next bit of the two's-complement DC value */ 4201e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (arith_decode(cinfo, st)) 4211e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding MCU_data[blkn][0][0] |= p1; 4221e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 4231e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4241e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding return TRUE; 4251e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding} 4261e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4271e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4281e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* 4291e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * MCU decoding for AC successive approximation refinement scan. 4301e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 4311e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4321e247ac854f8e33682bcfea475f6bccc42377208Guido VollbedingMETHODDEF(boolean) 4331e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbedingdecode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) 4341e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding{ 4351e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; 4361e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding JBLOCKROW block; 4371e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding JCOEFPTR thiscoef; 4381e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding unsigned char *st; 4391e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int tbl, k, kex; 4401e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int p1, m1; 4411e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4421e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Process restart marker if needed */ 4431e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->restart_interval) { 4441e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (entropy->restarts_to_go == 0) 4451e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding process_restart(cinfo); 4461e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->restarts_to_go--; 4471e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 4481e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 449e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (entropy->ct == -1) return TRUE; /* if error do nothing */ 4501e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4511e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* There is always only one block per MCU */ 4521e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding block = MCU_data[0]; 4531e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding tbl = cinfo->cur_comp_info[0]->ac_tbl_no; 4541e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 455e5eaf37440b8e337ab150c017df7c03faf846c51DRC p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ 456bd7903e2a5584fe8d4c1103da25dff429e77c304Leon Scroggins III m1 = (NEG_1) << cinfo->Al; /* -1 in the bit position being coded */ 4571e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4581e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Establish EOBx (previous stage end-of-block) index */ 459989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding for (kex = cinfo->Se; kex > 0; kex--) 46066f97e6820e2cc9ef7429ea36285c80ffda87c8fDRC if ((*block)[jpeg_natural_order[kex]]) break; 4611e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4621e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding for (k = cinfo->Ss; k <= cinfo->Se; k++) { 4631e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st = entropy->ac_stats[tbl] + 3 * (k - 1); 464989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding if (k > kex) 465e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (arith_decode(cinfo, st)) break; /* EOB flag */ 4661e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding for (;;) { 46766f97e6820e2cc9ef7429ea36285c80ffda87c8fDRC thiscoef = *block + jpeg_natural_order[k]; 468e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (*thiscoef) { /* previously nonzero coef */ 469e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (arith_decode(cinfo, st + 2)) { 470e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (*thiscoef < 0) 471e5eaf37440b8e337ab150c017df7c03faf846c51DRC *thiscoef += m1; 472e5eaf37440b8e337ab150c017df7c03faf846c51DRC else 473e5eaf37440b8e337ab150c017df7c03faf846c51DRC *thiscoef += p1; 474e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 475e5eaf37440b8e337ab150c017df7c03faf846c51DRC break; 4761e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 477e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (arith_decode(cinfo, st + 1)) { /* newly nonzero coef */ 478e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (arith_decode(cinfo, entropy->fixed_bin)) 479e5eaf37440b8e337ab150c017df7c03faf846c51DRC *thiscoef = m1; 480e5eaf37440b8e337ab150c017df7c03faf846c51DRC else 481e5eaf37440b8e337ab150c017df7c03faf846c51DRC *thiscoef = p1; 482e5eaf37440b8e337ab150c017df7c03faf846c51DRC break; 4831e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 4841e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st += 3; k++; 4851e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (k > cinfo->Se) { 486e5eaf37440b8e337ab150c017df7c03faf846c51DRC WARNMS(cinfo, JWRN_ARITH_BAD_CODE); 487e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->ct = -1; /* spectral overflow */ 488e5eaf37440b8e337ab150c017df7c03faf846c51DRC return TRUE; 4891e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 4901e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 4911e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 4921e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4931e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding return TRUE; 4941e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding} 4951e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4961e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 4971e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* 4981e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Decode one MCU's worth of arithmetic-compressed coefficients. 4991e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 5001e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 5011e247ac854f8e33682bcfea475f6bccc42377208Guido VollbedingMETHODDEF(boolean) 5021e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbedingdecode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) 5031e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding{ 5041e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; 5056eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis jpeg_component_info *compptr; 5061e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding JBLOCKROW block; 5071e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding unsigned char *st; 5081e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int blkn, ci, tbl, sign, k; 5091e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int v, m; 5101e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 5111e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Process restart marker if needed */ 5121e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->restart_interval) { 5131e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (entropy->restarts_to_go == 0) 5141e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding process_restart(cinfo); 5151e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->restarts_to_go--; 5161e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 5171e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 518e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (entropy->ct == -1) return TRUE; /* if error do nothing */ 5191e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 5201e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Outer loop handles each block in the MCU */ 5211e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 5221e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { 523ac30a1bf12751bd82e56158eb9456a28d9c086f3DRC block = MCU_data ? MCU_data[blkn] : NULL; 5241e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding ci = cinfo->MCU_membership[blkn]; 5251e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding compptr = cinfo->cur_comp_info[ci]; 5261e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 5271e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */ 5281e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 5291e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding tbl = compptr->dc_tbl_no; 5301e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 5311e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ 5321e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; 5331e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 5341e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.19: Decode_DC_DIFF */ 5351e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (arith_decode(cinfo, st) == 0) 5361e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->dc_context[ci] = 0; 5371e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding else { 5381e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.21: Decoding nonzero value v */ 5391e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.22: Decoding the sign of v */ 5401e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding sign = arith_decode(cinfo, st + 1); 5411e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st += 2; st += sign; 5421e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.23: Decoding the magnitude category of v */ 5431e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if ((m = arith_decode(cinfo, st)) != 0) { 544e5eaf37440b8e337ab150c017df7c03faf846c51DRC st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ 545e5eaf37440b8e337ab150c017df7c03faf846c51DRC while (arith_decode(cinfo, st)) { 546e5eaf37440b8e337ab150c017df7c03faf846c51DRC if ((m <<= 1) == 0x8000) { 547e5eaf37440b8e337ab150c017df7c03faf846c51DRC WARNMS(cinfo, JWRN_ARITH_BAD_CODE); 548e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->ct = -1; /* magnitude overflow */ 549e5eaf37440b8e337ab150c017df7c03faf846c51DRC return TRUE; 550e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 551e5eaf37440b8e337ab150c017df7c03faf846c51DRC st += 1; 552e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 5531e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 5541e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ 555989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1)) 556e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->dc_context[ci] = 0; /* zero diff category */ 557989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1)) 558e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */ 5591e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding else 560e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */ 5611e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding v = m; 5621e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.24: Decoding the magnitude bit pattern of v */ 5631e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st += 14; 5641e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding while (m >>= 1) 565e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (arith_decode(cinfo, st)) v |= m; 5661e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding v += 1; if (sign) v = -v; 5671e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->last_dc_val[ci] += v; 5681e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 5691e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 570ac30a1bf12751bd82e56158eb9456a28d9c086f3DRC if (block) 571ac30a1bf12751bd82e56158eb9456a28d9c086f3DRC (*block)[0] = (JCOEF) entropy->last_dc_val[ci]; 5721e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 5731e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */ 5741e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 5751e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding tbl = compptr->ac_tbl_no; 5761e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 5771e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.20: Decode_AC_coefficients */ 57866f97e6820e2cc9ef7429ea36285c80ffda87c8fDRC for (k = 1; k <= DCTSIZE2 - 1; k++) { 5791e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st = entropy->ac_stats[tbl] + 3 * (k - 1); 580e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (arith_decode(cinfo, st)) break; /* EOB flag */ 5811e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding while (arith_decode(cinfo, st + 1) == 0) { 582e5eaf37440b8e337ab150c017df7c03faf846c51DRC st += 3; k++; 583e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (k > DCTSIZE2 - 1) { 584e5eaf37440b8e337ab150c017df7c03faf846c51DRC WARNMS(cinfo, JWRN_ARITH_BAD_CODE); 585e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->ct = -1; /* spectral overflow */ 586e5eaf37440b8e337ab150c017df7c03faf846c51DRC return TRUE; 587e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 5881e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 5891e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.21: Decoding nonzero value v */ 5901e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.22: Decoding the sign of v */ 591989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding sign = arith_decode(cinfo, entropy->fixed_bin); 5921e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st += 2; 5931e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.23: Decoding the magnitude category of v */ 5941e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if ((m = arith_decode(cinfo, st)) != 0) { 595e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (arith_decode(cinfo, st)) { 596e5eaf37440b8e337ab150c017df7c03faf846c51DRC m <<= 1; 597e5eaf37440b8e337ab150c017df7c03faf846c51DRC st = entropy->ac_stats[tbl] + 598e5eaf37440b8e337ab150c017df7c03faf846c51DRC (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); 599e5eaf37440b8e337ab150c017df7c03faf846c51DRC while (arith_decode(cinfo, st)) { 600e5eaf37440b8e337ab150c017df7c03faf846c51DRC if ((m <<= 1) == 0x8000) { 601e5eaf37440b8e337ab150c017df7c03faf846c51DRC WARNMS(cinfo, JWRN_ARITH_BAD_CODE); 602e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->ct = -1; /* magnitude overflow */ 603e5eaf37440b8e337ab150c017df7c03faf846c51DRC return TRUE; 604e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 605e5eaf37440b8e337ab150c017df7c03faf846c51DRC st += 1; 606e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 607e5eaf37440b8e337ab150c017df7c03faf846c51DRC } 6081e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 6091e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding v = m; 6101e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Figure F.24: Decoding the magnitude bit pattern of v */ 6111e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding st += 14; 6121e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding while (m >>= 1) 613e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (arith_decode(cinfo, st)) v |= m; 6141e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding v += 1; if (sign) v = -v; 615ac30a1bf12751bd82e56158eb9456a28d9c086f3DRC if (block) 616ac30a1bf12751bd82e56158eb9456a28d9c086f3DRC (*block)[jpeg_natural_order[k]] = (JCOEF) v; 6171e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 6181e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 6191e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 6201e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding return TRUE; 6211e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding} 6221e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 6231e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 6241e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* 6251e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Initialize for an arithmetic-compressed scan. 6261e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 6271e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 6281e247ac854f8e33682bcfea475f6bccc42377208Guido VollbedingMETHODDEF(void) 6291e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbedingstart_pass (j_decompress_ptr cinfo) 6301e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding{ 6311e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; 6321e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int ci, tbl; 6336eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis jpeg_component_info *compptr; 6341e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 6351e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->progressive_mode) { 6361e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Validate progressive scan parameters */ 6371e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->Ss == 0) { 6381e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->Se != 0) 639e5eaf37440b8e337ab150c017df7c03faf846c51DRC goto bad; 6401e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } else { 6411e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* need not check Ss/Se < 0 since they came from unsigned bytes */ 64266f97e6820e2cc9ef7429ea36285c80ffda87c8fDRC if (cinfo->Se < cinfo->Ss || cinfo->Se > DCTSIZE2 - 1) 643e5eaf37440b8e337ab150c017df7c03faf846c51DRC goto bad; 6441e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* AC scans may have only one component */ 6451e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->comps_in_scan != 1) 646e5eaf37440b8e337ab150c017df7c03faf846c51DRC goto bad; 6471e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 6481e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->Ah != 0) { 6491e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Successive approximation refinement scan: must have Al = Ah-1. */ 6501e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->Ah-1 != cinfo->Al) 651e5eaf37440b8e337ab150c017df7c03faf846c51DRC goto bad; 6521e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 653e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (cinfo->Al > 13) { /* need not check for < 0 */ 6541e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding bad: 6551e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding ERREXIT4(cinfo, JERR_BAD_PROGRESSION, 656e5eaf37440b8e337ab150c017df7c03faf846c51DRC cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); 6571e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 6581e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Update progression status, and verify that scan order is legal. 6591e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Note that inter-scan inconsistencies are treated as warnings 6601e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * not fatal errors ... not clear if this is right way to behave. 6611e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 6621e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 6631e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int coefi, cindex = cinfo->cur_comp_info[ci]->component_index; 6641e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int *coef_bit_ptr = & cinfo->coef_bits[cindex][0]; 6651e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ 666e5eaf37440b8e337ab150c017df7c03faf846c51DRC WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); 6671e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { 668e5eaf37440b8e337ab150c017df7c03faf846c51DRC int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; 669e5eaf37440b8e337ab150c017df7c03faf846c51DRC if (cinfo->Ah != expected) 670e5eaf37440b8e337ab150c017df7c03faf846c51DRC WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); 671e5eaf37440b8e337ab150c017df7c03faf846c51DRC coef_bit_ptr[coefi] = cinfo->Al; 6721e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 6731e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 6741e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Select MCU decoding routine */ 6751e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->Ah == 0) { 6761e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->Ss == 0) 677e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->pub.decode_mcu = decode_mcu_DC_first; 6781e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding else 679e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->pub.decode_mcu = decode_mcu_AC_first; 6801e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } else { 6811e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->Ss == 0) 682e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->pub.decode_mcu = decode_mcu_DC_refine; 6831e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding else 684e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->pub.decode_mcu = decode_mcu_AC_refine; 6851e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 6861e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } else { 6871e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. 688989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding * This ought to be an error condition, but we make it a warning. 6891e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 690989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 || 691e5eaf37440b8e337ab150c017df7c03faf846c51DRC (cinfo->Se < DCTSIZE2 && cinfo->Se != DCTSIZE2 - 1)) 6921e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); 6931e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Select MCU decoding routine */ 6941e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->pub.decode_mcu = decode_mcu; 6951e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 6961e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 697989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding /* Allocate & initialize requested statistics areas */ 6981e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 6991e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding compptr = cinfo->cur_comp_info[ci]; 7006eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis if (!cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) { 7011e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding tbl = compptr->dc_tbl_no; 7021e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (tbl < 0 || tbl >= NUM_ARITH_TBLS) 703e5eaf37440b8e337ab150c017df7c03faf846c51DRC ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); 7041e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (entropy->dc_stats[tbl] == NULL) 705e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) 706e5eaf37440b8e337ab150c017df7c03faf846c51DRC ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS); 7071e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS); 7081e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Initialize DC predictions to 0 */ 7091e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->last_dc_val[ci] = 0; 7101e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->dc_context[ci] = 0; 7111e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 7126eb7d3798b5a79347c62825fc4c16f7ce673bdd0Alex Naidis if (!cinfo->progressive_mode || cinfo->Ss) { 7131e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding tbl = compptr->ac_tbl_no; 7141e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (tbl < 0 || tbl >= NUM_ARITH_TBLS) 715e5eaf37440b8e337ab150c017df7c03faf846c51DRC ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); 7161e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (entropy->ac_stats[tbl] == NULL) 717e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small) 718e5eaf37440b8e337ab150c017df7c03faf846c51DRC ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS); 7191e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS); 7201e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 7211e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 7221e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 7231e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Initialize arithmetic decoding variables */ 7241e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->c = 0; 7251e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->a = 0; 726e5eaf37440b8e337ab150c017df7c03faf846c51DRC entropy->ct = -16; /* force reading 2 initial bytes to fill C */ 7271e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 7281e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Initialize restart counter */ 7291e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->restarts_to_go = cinfo->restart_interval; 7301e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding} 7311e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 7321e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 7331e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding/* 7341e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding * Module initialization routine for arithmetic entropy decoding. 7351e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding */ 7361e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 7371e247ac854f8e33682bcfea475f6bccc42377208Guido VollbedingGLOBAL(void) 7381e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbedingjinit_arith_decoder (j_decompress_ptr cinfo) 7391e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding{ 7401e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding arith_entropy_ptr entropy; 7411e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int i; 7421e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 7431e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy = (arith_entropy_ptr) 7441e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 7455de454b291f48382648a5d1dc2aa0fca8b5786d4DRC sizeof(arith_entropy_decoder)); 7461e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; 7471e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->pub.start_pass = start_pass; 7481e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 7491e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Mark tables unallocated */ 7501e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding for (i = 0; i < NUM_ARITH_TBLS; i++) { 7511e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->dc_stats[i] = NULL; 7521e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding entropy->ac_stats[i] = NULL; 7531e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 7541e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding 755989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding /* Initialize index for fixed probability estimation */ 756989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding entropy->fixed_bin[0] = 113; 757989630f70cf1af69ebfefca8910d1647bf189712Guido Vollbeding 7581e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding if (cinfo->progressive_mode) { 7591e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding /* Create progression status table */ 7601e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding int *coef_bit_ptr, ci; 7611e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding cinfo->coef_bits = (int (*)[DCTSIZE2]) 7621e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 7635de454b291f48382648a5d1dc2aa0fca8b5786d4DRC cinfo->num_components*DCTSIZE2*sizeof(int)); 7641e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding coef_bit_ptr = & cinfo->coef_bits[0][0]; 765e5eaf37440b8e337ab150c017df7c03faf846c51DRC for (ci = 0; ci < cinfo->num_components; ci++) 7661e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding for (i = 0; i < DCTSIZE2; i++) 767e5eaf37440b8e337ab150c017df7c03faf846c51DRC *coef_bit_ptr++ = -1; 7681e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding } 7691e247ac854f8e33682bcfea475f6bccc42377208Guido Vollbeding} 770