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