19862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/*
29862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * jcarith.c
39862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org *
49862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Developed 1997-2009 by Guido Vollbeding.
59862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * This file is part of the Independent JPEG Group's software.
69862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * For conditions of distribution and use, see the accompanying README file.
79862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org *
89862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * This file contains portable arithmetic entropy encoding routines for JPEG
99862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81).
109862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org *
119862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Both sequential and progressive modes are supported in this single module.
129862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org *
139862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Suspension is not currently supported in this module.
149862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
159862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
169862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#define JPEG_INTERNALS
179862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#include "jinclude.h"
189862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#include "jpeglib.h"
199862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
209862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
219862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/* Expanded entropy encoder object for arithmetic encoding. */
229862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
239862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgtypedef struct {
249862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  struct jpeg_entropy_encoder pub; /* public fields */
259862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
269862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  INT32 c; /* C register, base of coding interval, layout as in sec. D.1.3 */
279862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  INT32 a;               /* A register, normalized size of coding interval */
289862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  INT32 sc;        /* counter for stacked 0xFF values which might overflow */
299862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  INT32 zc;          /* counter for pending 0x00 output values which might *
309862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org                          * be discarded at the end ("Pacman" termination) */
319862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int ct;  /* bit shift counter, determines when next byte will be written */
329862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int buffer;                /* buffer for most recent output byte != 0xFF */
339862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
349862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
359862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */
369862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
379862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  unsigned int restarts_to_go;	/* MCUs left in this restart interval */
389862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int next_restart_num;		/* next restart number to write (0-7) */
399862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
409862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Pointers to statistics areas (these workspaces have image lifespan) */
419862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  unsigned char * dc_stats[NUM_ARITH_TBLS];
429862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  unsigned char * ac_stats[NUM_ARITH_TBLS];
439862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
449862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Statistics bin for coding with fixed probability 0.5 */
459862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  unsigned char fixed_bin[4];
469862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org} arith_entropy_encoder;
479862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
489862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgtypedef arith_entropy_encoder * arith_entropy_ptr;
499862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
509862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/* The following two definitions specify the allocation chunk size
519862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * for the statistics area.
529862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least
539862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * 49 statistics bins for DC, and 245 statistics bins for AC coding.
549862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org *
559862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * We use a compact representation with 1 byte per statistics bin,
569862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * thus the numbers directly represent byte sizes.
579862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * This 1 byte per statistics bin contains the meaning of the MPS
589862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * (more probable symbol) in the highest bit (mask 0x80), and the
599862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * index into the probability estimation state machine table
609862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * in the lower bits (mask 0x7F).
619862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
629862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
639862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#define DC_STAT_BINS 64
649862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#define AC_STAT_BINS 256
659862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
669862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/* NOTE: Uncomment the following #define if you want to use the
679862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * given formula for calculating the AC conditioning parameter Kx
689862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * for spectral selection progressive coding in section G.1.3.2
699862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * of the spec (Kx = Kmin + SRL (8 + Se - Kmin) 4).
709862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Although the spec and P&M authors claim that this "has proven
719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * to give good results for 8 bit precision samples", I'm not
729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * convinced yet that this is really beneficial.
739862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Early tests gave only very marginal compression enhancements
749862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * (a few - around 5 or so - bytes even for very large files),
759862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * which would turn out rather negative if we'd suppress the
769862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * DAC (Define Arithmetic Conditioning) marker segments for
779862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * the default parameters in the future.
789862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Note that currently the marker writing module emits 12-byte
799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * DAC segments for a full-component scan in a color image.
809862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * This is not worth worrying about IMHO. However, since the
819862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * spec defines the default values to be used if the tables
829862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * are omitted (unlike Huffman tables, which are required
839862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * anyway), one might optimize this behaviour in the future,
849862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * and then it would be disadvantageous to use custom tables if
859862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * they don't provide sufficient gain to exceed the DAC size.
869862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org *
879862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * On the other hand, I'd consider it as a reasonable result
889862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * that the conditioning has no significant influence on the
899862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * compression performance. This means that the basic
909862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * statistical model is already rather stable.
919862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org *
929862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Thus, at the moment, we use the default conditioning values
939862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * anyway, and do not use the custom formula.
949862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org *
959862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#define CALCULATE_SPECTRAL_CONDITIONING
969862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
979862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
989862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
999862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * We assume that int right shift is unsigned if INT32 right shift is,
1009862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * which should be safe.
1019862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
1029862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
1039862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#ifdef RIGHT_SHIFT_IS_UNSIGNED
1049862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#define ISHIFT_TEMPS	int ishift_temp;
1059862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#define IRIGHT_SHIFT(x,shft)  \
1069862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	((ishift_temp = (x)) < 0 ? \
1079862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	 (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
1089862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	 (ishift_temp >> (shft)))
1099862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#else
1109862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#define ISHIFT_TEMPS
1119862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#define IRIGHT_SHIFT(x,shft)	((x) >> (shft))
1129862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#endif
1139862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
1149862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
1159862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgLOCAL(void)
1169862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgemit_byte (int val, j_compress_ptr cinfo)
1179862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/* Write next output byte; we do not support suspension in this module. */
1189862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{
1199862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  struct jpeg_destination_mgr * dest = cinfo->dest;
1209862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
1219862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  *dest->next_output_byte++ = (JOCTET) val;
1229862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (--dest->free_in_buffer == 0)
1239862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (! (*dest->empty_output_buffer) (cinfo))
1249862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      ERREXIT(cinfo, JERR_CANT_SUSPEND);
1259862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}
1269862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
1279862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
1289862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/*
1299862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Finish up at the end of an arithmetic-compressed scan.
1309862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
1319862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
1329862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgMETHODDEF(void)
1339862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgfinish_pass (j_compress_ptr cinfo)
1349862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{
1359862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
1369862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  INT32 temp;
1379862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
1389862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Section D.1.8: Termination of encoding */
1399862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
1409862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Find the e->c in the coding interval with the largest
1419862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org   * number of trailing zero bits */
1429862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if ((temp = (e->a - 1 + e->c) & 0xFFFF0000L) < e->c)
1439862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    e->c = temp + 0x8000L;
1449862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  else
1459862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    e->c = temp;
1469862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Send remaining bytes to output */
1479862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  e->c <<= e->ct;
1489862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (e->c & 0xF8000000L) {
1499862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* One final overflow has to be handled */
1509862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (e->buffer >= 0) {
1519862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (e->zc)
1529862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	do emit_byte(0x00, cinfo);
1539862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	while (--e->zc);
1549862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      emit_byte(e->buffer + 1, cinfo);
1559862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (e->buffer + 1 == 0xFF)
1569862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	emit_byte(0x00, cinfo);
1579862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
1589862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    e->zc += e->sc;  /* carry-over converts stacked 0xFF bytes to 0x00 */
1599862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    e->sc = 0;
1609862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  } else {
1619862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (e->buffer == 0)
1629862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      ++e->zc;
1639862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    else if (e->buffer >= 0) {
1649862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (e->zc)
1659862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	do emit_byte(0x00, cinfo);
1669862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	while (--e->zc);
1679862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      emit_byte(e->buffer, cinfo);
1689862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
1699862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (e->sc) {
1709862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (e->zc)
1719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	do emit_byte(0x00, cinfo);
1729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	while (--e->zc);
1739862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      do {
1749862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	emit_byte(0xFF, cinfo);
1759862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	emit_byte(0x00, cinfo);
1769862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      } while (--e->sc);
1779862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
1789862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
1799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Output final bytes only if they are not 0x00 */
1809862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (e->c & 0x7FFF800L) {
1819862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (e->zc)  /* output final pending zero bytes */
1829862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      do emit_byte(0x00, cinfo);
1839862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      while (--e->zc);
1849862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    emit_byte((e->c >> 19) & 0xFF, cinfo);
1859862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (((e->c >> 19) & 0xFF) == 0xFF)
1869862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      emit_byte(0x00, cinfo);
1879862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (e->c & 0x7F800L) {
1889862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      emit_byte((e->c >> 11) & 0xFF, cinfo);
1899862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (((e->c >> 11) & 0xFF) == 0xFF)
1909862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	emit_byte(0x00, cinfo);
1919862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
1929862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
1939862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}
1949862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
1959862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
1969862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/*
1979862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * The core arithmetic encoding routine (common in JPEG and JBIG).
1989862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * This needs to go as fast as possible.
1999862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Machine-dependent optimization facilities
2009862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * are not utilized in this portable implementation.
2019862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * However, this code should be fairly efficient and
2029862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * may be a good base for further optimizations anyway.
2039862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org *
2049862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Parameter 'val' to be encoded may be 0 or 1 (binary decision).
2059862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org *
2069862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Note: I've added full "Pacman" termination support to the
2079862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * byte output routines, which is equivalent to the optional
2089862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Discard_final_zeros procedure (Figure D.15) in the spec.
2099862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Thus, we always produce the shortest possible output
2109862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * stream compliant to the spec (no trailing zero bytes,
2119862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * except for FF stuffing).
2129862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org *
2139862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * I've also introduced a new scheme for accessing
2149862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * the probability estimation state machine table,
2159862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * derived from Markus Kuhn's JBIG implementation.
2169862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
2179862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
2189862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgLOCAL(void)
2199862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgarith_encode (j_compress_ptr cinfo, unsigned char *st, int val)
2209862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{
2219862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
2229862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  register unsigned char nl, nm;
2239862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  register INT32 qe, temp;
2249862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  register int sv;
2259862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
2269862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Fetch values from our compact representation of Table D.2:
2279862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org   * Qe values and probability estimation state machine
2289862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org   */
2299862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  sv = *st;
2309862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  qe = jpeg_aritab[sv & 0x7F];	/* => Qe_Value */
2319862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  nl = qe & 0xFF; qe >>= 8;	/* Next_Index_LPS + Switch_MPS */
2329862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  nm = qe & 0xFF; qe >>= 8;	/* Next_Index_MPS */
2339862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
2349862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Encode & estimation procedures per sections D.1.4 & D.1.5 */
2359862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  e->a -= qe;
2369862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (val != (sv >> 7)) {
2379862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Encode the less probable symbol */
2389862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (e->a >= qe) {
2399862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* If the interval size (qe) for the less probable symbol (LPS)
2409862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org       * is larger than the interval size for the MPS, then exchange
2419862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org       * the two symbols for coding efficiency, otherwise code the LPS
2429862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org       * as usual: */
2439862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      e->c += e->a;
2449862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      e->a = qe;
2459862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
2469862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    *st = (sv & 0x80) ^ nl;	/* Estimate_after_LPS */
2479862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  } else {
2489862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Encode the more probable symbol */
2499862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (e->a >= 0x8000L)
2509862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      return;  /* A >= 0x8000 -> ready, no renormalization required */
2519862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (e->a < qe) {
2529862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* If the interval size (qe) for the less probable symbol (LPS)
2539862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org       * is larger than the interval size for the MPS, then exchange
2549862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org       * the two symbols for coding efficiency: */
2559862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      e->c += e->a;
2569862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      e->a = qe;
2579862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
2589862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    *st = (sv & 0x80) ^ nm;	/* Estimate_after_MPS */
2599862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
2609862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
2619862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Renormalization & data output per section D.1.6 */
2629862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  do {
2639862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    e->a <<= 1;
2649862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    e->c <<= 1;
2659862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (--e->ct == 0) {
2669862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Another byte is ready for output */
2679862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      temp = e->c >> 19;
2689862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (temp > 0xFF) {
2699862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	/* Handle overflow over all stacked 0xFF bytes */
2709862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	if (e->buffer >= 0) {
2719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  if (e->zc)
2729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    do emit_byte(0x00, cinfo);
2739862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    while (--e->zc);
2749862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  emit_byte(e->buffer + 1, cinfo);
2759862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  if (e->buffer + 1 == 0xFF)
2769862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    emit_byte(0x00, cinfo);
2779862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	}
2789862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	e->zc += e->sc;  /* carry-over converts stacked 0xFF bytes to 0x00 */
2799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	e->sc = 0;
2809862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	/* Note: The 3 spacer bits in the C register guarantee
2819862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	 * that the new buffer byte can't be 0xFF here
2829862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	 * (see page 160 in the P&M JPEG book). */
2839862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	e->buffer = temp & 0xFF;  /* new output byte, might overflow later */
2849862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      } else if (temp == 0xFF) {
2859862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	++e->sc;  /* stack 0xFF byte (which might overflow later) */
2869862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      } else {
2879862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	/* Output all stacked 0xFF bytes, they will not overflow any more */
2889862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	if (e->buffer == 0)
2899862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  ++e->zc;
2909862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	else if (e->buffer >= 0) {
2919862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  if (e->zc)
2929862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    do emit_byte(0x00, cinfo);
2939862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    while (--e->zc);
2949862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  emit_byte(e->buffer, cinfo);
2959862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	}
2969862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	if (e->sc) {
2979862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  if (e->zc)
2989862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    do emit_byte(0x00, cinfo);
2999862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    while (--e->zc);
3009862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  do {
3019862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    emit_byte(0xFF, cinfo);
3029862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    emit_byte(0x00, cinfo);
3039862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  } while (--e->sc);
3049862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	}
3059862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	e->buffer = temp & 0xFF;  /* new output byte (can still overflow) */
3069862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      }
3079862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      e->c &= 0x7FFFFL;
3089862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      e->ct += 8;
3099862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
3109862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  } while (e->a < 0x8000L);
3119862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}
3129862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3139862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3149862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/*
3159862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Emit a restart marker & resynchronize predictions.
3169862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
3179862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3189862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgLOCAL(void)
3199862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgemit_restart (j_compress_ptr cinfo, int restart_num)
3209862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{
3219862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
3229862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int ci;
3239862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  jpeg_component_info * compptr;
3249862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3259862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  finish_pass(cinfo);
3269862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3279862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  emit_byte(0xFF, cinfo);
3289862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  emit_byte(JPEG_RST0 + restart_num, cinfo);
3299862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3309862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Re-initialize statistics areas */
3319862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
3329862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    compptr = cinfo->cur_comp_info[ci];
3339862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* DC needs no table for refinement scan */
3349862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
3359862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
3369862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Reset DC predictions to 0 */
3379862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->last_dc_val[ci] = 0;
3389862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->dc_context[ci] = 0;
3399862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
3409862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* AC needs no table when not present */
3419862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (cinfo->progressive_mode == 0 || cinfo->Se) {
3429862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
3439862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
3449862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
3459862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3469862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Reset arithmetic encoding variables */
3479862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->c = 0;
3489862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->a = 0x10000L;
3499862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->sc = 0;
3509862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->zc = 0;
3519862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->ct = 11;
3529862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->buffer = -1;  /* empty */
3539862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}
3549862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3559862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3569862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/*
3579862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * MCU encoding for DC initial scan (either spectral selection,
3589862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * or first pass of successive approximation).
3599862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
3609862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3619862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgMETHODDEF(boolean)
3629862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgencode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
3639862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{
3649862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
3659862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  JBLOCKROW block;
3669862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  unsigned char *st;
3679862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int blkn, ci, tbl;
3689862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int v, v2, m;
3699862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  ISHIFT_TEMPS
3709862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Emit restart marker if needed */
3729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (cinfo->restart_interval) {
3739862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (entropy->restarts_to_go == 0) {
3749862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      emit_restart(cinfo, entropy->next_restart_num);
3759862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->restarts_to_go = cinfo->restart_interval;
3769862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->next_restart_num++;
3779862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->next_restart_num &= 7;
3789862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
3799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    entropy->restarts_to_go--;
3809862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
3819862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3829862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Encode the MCU data blocks */
3839862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
3849862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    block = MCU_data[blkn];
3859862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    ci = cinfo->MCU_membership[blkn];
3869862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
3879862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3889862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Compute the DC value after the required point transform by Al.
3899862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org     * This is simply an arithmetic right shift.
3909862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org     */
3919862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    m = IRIGHT_SHIFT((int) ((*block)[0]), cinfo->Al);
3929862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3939862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
3949862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3959862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
3969862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
3979862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
3989862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Figure F.4: Encode_DC_DIFF */
3999862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if ((v = m - entropy->last_dc_val[ci]) == 0) {
4009862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st, 0);
4019862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->dc_context[ci] = 0;	/* zero diff category */
4029862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    } else {
4039862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->last_dc_val[ci] = m;
4049862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st, 1);
4059862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Figure F.6: Encoding nonzero value v */
4069862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Figure F.7: Encoding the sign of v */
4079862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v > 0) {
4089862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, st + 1, 0);	/* Table F.4: SS = S0 + 1 */
4099862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	st += 2;			/* Table F.4: SP = S0 + 2 */
4109862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->dc_context[ci] = 4;	/* small positive diff category */
4119862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      } else {
4129862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	v = -v;
4139862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, st + 1, 1);	/* Table F.4: SS = S0 + 1 */
4149862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	st += 3;			/* Table F.4: SN = S0 + 3 */
4159862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->dc_context[ci] = 8;	/* small negative diff category */
4169862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      }
4179862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Figure F.8: Encoding the magnitude category of v */
4189862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      m = 0;
4199862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v -= 1) {
4209862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, st, 1);
4219862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	m = 1;
4229862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	v2 = v;
4239862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
4249862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	while (v2 >>= 1) {
4259862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  arith_encode(cinfo, st, 1);
4269862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  m <<= 1;
4279862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  st += 1;
4289862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	}
4299862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      }
4309862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st, 0);
4319862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
4329862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
4339862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->dc_context[ci] = 0;	/* zero diff category */
4349862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
4359862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->dc_context[ci] += 8;	/* large diff category */
4369862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Figure F.9: Encoding the magnitude bit pattern of v */
4379862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      st += 14;
4389862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      while (m >>= 1)
4399862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, st, (m & v) ? 1 : 0);
4409862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
4419862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
4429862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
4439862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  return TRUE;
4449862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}
4459862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
4469862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
4479862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/*
4489862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * MCU encoding for AC initial scan (either spectral selection,
4499862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * or first pass of successive approximation).
4509862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
4519862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
4529862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgMETHODDEF(boolean)
4539862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgencode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
4549862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{
4559862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
4569862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  JBLOCKROW block;
4579862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  unsigned char *st;
4589862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int tbl, k, ke;
4599862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int v, v2, m;
4609862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
4619862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Emit restart marker if needed */
4629862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (cinfo->restart_interval) {
4639862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (entropy->restarts_to_go == 0) {
4649862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      emit_restart(cinfo, entropy->next_restart_num);
4659862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->restarts_to_go = cinfo->restart_interval;
4669862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->next_restart_num++;
4679862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->next_restart_num &= 7;
4689862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
4699862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    entropy->restarts_to_go--;
4709862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
4719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
4729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Encode the MCU data block */
4739862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  block = MCU_data[0];
4749862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
4759862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
4769862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
4779862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
4789862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Establish EOB (end-of-block) index */
4799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  for (ke = cinfo->Se; ke > 0; ke--)
4809862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* We must apply the point transform by Al.  For AC coefficients this
4819862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org     * is an integer division with rounding towards 0.  To do this portably
4829862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org     * in C, we shift after obtaining the absolute value.
4839862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org     */
4849862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if ((v = (*block)[jpeg_natural_order[ke]]) >= 0) {
4859862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v >>= cinfo->Al) break;
4869862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    } else {
4879862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      v = -v;
4889862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v >>= cinfo->Al) break;
4899862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
4909862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
4919862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Figure F.5: Encode_AC_Coefficients */
4929862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  for (k = cinfo->Ss; k <= ke; k++) {
4939862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    st = entropy->ac_stats[tbl] + 3 * (k - 1);
4949862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    arith_encode(cinfo, st, 0);		/* EOB decision */
4959862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    for (;;) {
4969862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
4979862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	if (v >>= cinfo->Al) {
4989862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  arith_encode(cinfo, st + 1, 1);
4999862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  arith_encode(cinfo, entropy->fixed_bin, 0);
5009862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  break;
5019862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	}
5029862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      } else {
5039862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	v = -v;
5049862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	if (v >>= cinfo->Al) {
5059862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  arith_encode(cinfo, st + 1, 1);
5069862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  arith_encode(cinfo, entropy->fixed_bin, 1);
5079862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  break;
5089862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	}
5099862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      }
5109862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st + 1, 0); st += 3; k++;
5119862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
5129862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    st += 2;
5139862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Figure F.8: Encoding the magnitude category of v */
5149862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    m = 0;
5159862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (v -= 1) {
5169862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st, 1);
5179862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      m = 1;
5189862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      v2 = v;
5199862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v2 >>= 1) {
5209862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, st, 1);
5219862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	m <<= 1;
5229862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	st = entropy->ac_stats[tbl] +
5239862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	     (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
5249862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	while (v2 >>= 1) {
5259862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  arith_encode(cinfo, st, 1);
5269862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  m <<= 1;
5279862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  st += 1;
5289862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	}
5299862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      }
5309862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
5319862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    arith_encode(cinfo, st, 0);
5329862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Figure F.9: Encoding the magnitude bit pattern of v */
5339862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    st += 14;
5349862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    while (m >>= 1)
5359862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st, (m & v) ? 1 : 0);
5369862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
5379862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Encode EOB decision only if k <= cinfo->Se */
5389862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (k <= cinfo->Se) {
5399862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    st = entropy->ac_stats[tbl] + 3 * (k - 1);
5409862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    arith_encode(cinfo, st, 1);
5419862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
5429862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
5439862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  return TRUE;
5449862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}
5459862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
5469862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
5479862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/*
5489862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * MCU encoding for DC successive approximation refinement scan.
5499862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
5509862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
5519862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgMETHODDEF(boolean)
5529862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgencode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
5539862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{
5549862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
5559862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  unsigned char *st;
5569862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int Al, blkn;
5579862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
5589862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Emit restart marker if needed */
5599862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (cinfo->restart_interval) {
5609862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (entropy->restarts_to_go == 0) {
5619862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      emit_restart(cinfo, entropy->next_restart_num);
5629862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->restarts_to_go = cinfo->restart_interval;
5639862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->next_restart_num++;
5649862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->next_restart_num &= 7;
5659862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
5669862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    entropy->restarts_to_go--;
5679862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
5689862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
5699862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  st = entropy->fixed_bin;	/* use fixed probability estimation */
5709862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  Al = cinfo->Al;
5719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
5729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Encode the MCU data blocks */
5739862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
5749862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* We simply emit the Al'th bit of the DC coefficient value. */
5759862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1);
5769862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
5779862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
5789862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  return TRUE;
5799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}
5809862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
5819862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
5829862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/*
5839862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * MCU encoding for AC successive approximation refinement scan.
5849862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
5859862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
5869862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgMETHODDEF(boolean)
5879862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgencode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
5889862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{
5899862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
5909862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  JBLOCKROW block;
5919862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  unsigned char *st;
5929862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int tbl, k, ke, kex;
5939862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int v;
5949862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
5959862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Emit restart marker if needed */
5969862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (cinfo->restart_interval) {
5979862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (entropy->restarts_to_go == 0) {
5989862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      emit_restart(cinfo, entropy->next_restart_num);
5999862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->restarts_to_go = cinfo->restart_interval;
6009862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->next_restart_num++;
6019862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->next_restart_num &= 7;
6029862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
6039862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    entropy->restarts_to_go--;
6049862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
6059862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
6069862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Encode the MCU data block */
6079862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  block = MCU_data[0];
6089862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
6099862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
6109862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Section G.1.3.3: Encoding of AC coefficients */
6119862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
6129862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Establish EOB (end-of-block) index */
6139862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  for (ke = cinfo->Se; ke > 0; ke--)
6149862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* We must apply the point transform by Al.  For AC coefficients this
6159862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org     * is an integer division with rounding towards 0.  To do this portably
6169862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org     * in C, we shift after obtaining the absolute value.
6179862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org     */
6189862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if ((v = (*block)[jpeg_natural_order[ke]]) >= 0) {
6199862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v >>= cinfo->Al) break;
6209862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    } else {
6219862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      v = -v;
6229862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v >>= cinfo->Al) break;
6239862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
6249862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
6259862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Establish EOBx (previous stage end-of-block) index */
6269862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  for (kex = ke; kex > 0; kex--)
6279862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if ((v = (*block)[jpeg_natural_order[kex]]) >= 0) {
6289862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v >>= cinfo->Ah) break;
6299862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    } else {
6309862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      v = -v;
6319862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v >>= cinfo->Ah) break;
6329862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
6339862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
6349862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Figure G.10: Encode_AC_Coefficients_SA */
6359862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  for (k = cinfo->Ss; k <= ke; k++) {
6369862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    st = entropy->ac_stats[tbl] + 3 * (k - 1);
6379862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (k > kex)
6389862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st, 0);	/* EOB decision */
6399862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    for (;;) {
6409862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
6419862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	if (v >>= cinfo->Al) {
6429862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  if (v >> 1)			/* previously nonzero coef */
6439862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    arith_encode(cinfo, st + 2, (v & 1));
6449862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  else {			/* newly nonzero coef */
6459862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    arith_encode(cinfo, st + 1, 1);
6469862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    arith_encode(cinfo, entropy->fixed_bin, 0);
6479862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  }
6489862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  break;
6499862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	}
6509862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      } else {
6519862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	v = -v;
6529862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	if (v >>= cinfo->Al) {
6539862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  if (v >> 1)			/* previously nonzero coef */
6549862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    arith_encode(cinfo, st + 2, (v & 1));
6559862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  else {			/* newly nonzero coef */
6569862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    arith_encode(cinfo, st + 1, 1);
6579862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    arith_encode(cinfo, entropy->fixed_bin, 1);
6589862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  }
6599862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  break;
6609862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	}
6619862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      }
6629862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st + 1, 0); st += 3; k++;
6639862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
6649862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
6659862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Encode EOB decision only if k <= cinfo->Se */
6669862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (k <= cinfo->Se) {
6679862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    st = entropy->ac_stats[tbl] + 3 * (k - 1);
6689862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    arith_encode(cinfo, st, 1);
6699862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
6709862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
6719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  return TRUE;
6729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}
6739862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
6749862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
6759862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/*
6769862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Encode and output one MCU's worth of arithmetic-compressed coefficients.
6779862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
6789862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
6799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgMETHODDEF(boolean)
6809862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgencode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
6819862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{
6829862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
6839862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  jpeg_component_info * compptr;
6849862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  JBLOCKROW block;
6859862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  unsigned char *st;
6869862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int blkn, ci, tbl, k, ke;
6879862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int v, v2, m;
6889862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
6899862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Emit restart marker if needed */
6909862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (cinfo->restart_interval) {
6919862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (entropy->restarts_to_go == 0) {
6929862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      emit_restart(cinfo, entropy->next_restart_num);
6939862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->restarts_to_go = cinfo->restart_interval;
6949862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->next_restart_num++;
6959862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->next_restart_num &= 7;
6969862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
6979862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    entropy->restarts_to_go--;
6989862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
6999862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
7009862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Encode the MCU data blocks */
7019862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
7029862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    block = MCU_data[blkn];
7039862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    ci = cinfo->MCU_membership[blkn];
7049862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    compptr = cinfo->cur_comp_info[ci];
7059862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
7069862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
7079862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
7089862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    tbl = compptr->dc_tbl_no;
7099862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
7109862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
7119862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
7129862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
7139862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Figure F.4: Encode_DC_DIFF */
7149862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) {
7159862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st, 0);
7169862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->dc_context[ci] = 0;	/* zero diff category */
7179862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    } else {
7189862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->last_dc_val[ci] = (*block)[0];
7199862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st, 1);
7209862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Figure F.6: Encoding nonzero value v */
7219862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Figure F.7: Encoding the sign of v */
7229862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v > 0) {
7239862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, st + 1, 0);	/* Table F.4: SS = S0 + 1 */
7249862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	st += 2;			/* Table F.4: SP = S0 + 2 */
7259862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->dc_context[ci] = 4;	/* small positive diff category */
7269862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      } else {
7279862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	v = -v;
7289862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, st + 1, 1);	/* Table F.4: SS = S0 + 1 */
7299862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	st += 3;			/* Table F.4: SN = S0 + 3 */
7309862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->dc_context[ci] = 8;	/* small negative diff category */
7319862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      }
7329862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Figure F.8: Encoding the magnitude category of v */
7339862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      m = 0;
7349862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v -= 1) {
7359862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, st, 1);
7369862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	m = 1;
7379862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	v2 = v;
7389862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
7399862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	while (v2 >>= 1) {
7409862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  arith_encode(cinfo, st, 1);
7419862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  m <<= 1;
7429862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  st += 1;
7439862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	}
7449862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      }
7459862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st, 0);
7469862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
7479862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
7489862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->dc_context[ci] = 0;	/* zero diff category */
7499862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
7509862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->dc_context[ci] += 8;	/* large diff category */
7519862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Figure F.9: Encoding the magnitude bit pattern of v */
7529862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      st += 14;
7539862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      while (m >>= 1)
7549862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, st, (m & v) ? 1 : 0);
7559862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
7569862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
7579862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
7589862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
7599862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    tbl = compptr->ac_tbl_no;
7609862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
7619862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Establish EOB (end-of-block) index */
7629862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    for (ke = DCTSIZE2 - 1; ke > 0; ke--)
7639862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if ((*block)[jpeg_natural_order[ke]]) break;
7649862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
7659862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Figure F.5: Encode_AC_Coefficients */
7669862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    for (k = 1; k <= ke; k++) {
7679862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      st = entropy->ac_stats[tbl] + 3 * (k - 1);
7689862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st, 0);	/* EOB decision */
7699862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      while ((v = (*block)[jpeg_natural_order[k]]) == 0) {
7709862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, st + 1, 0); st += 3; k++;
7719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      }
7729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st + 1, 1);
7739862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Figure F.6: Encoding nonzero value v */
7749862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Figure F.7: Encoding the sign of v */
7759862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v > 0) {
7769862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, entropy->fixed_bin, 0);
7779862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      } else {
7789862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	v = -v;
7799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, entropy->fixed_bin, 1);
7809862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      }
7819862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      st += 2;
7829862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Figure F.8: Encoding the magnitude category of v */
7839862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      m = 0;
7849862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (v -= 1) {
7859862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, st, 1);
7869862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	m = 1;
7879862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	v2 = v;
7889862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	if (v2 >>= 1) {
7899862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  arith_encode(cinfo, st, 1);
7909862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  m <<= 1;
7919862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  st = entropy->ac_stats[tbl] +
7929862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	       (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
7939862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  while (v2 >>= 1) {
7949862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    arith_encode(cinfo, st, 1);
7959862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    m <<= 1;
7969862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	    st += 1;
7979862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  }
7989862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	}
7999862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      }
8009862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st, 0);
8019862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Figure F.9: Encoding the magnitude bit pattern of v */
8029862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      st += 14;
8039862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      while (m >>= 1)
8049862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	arith_encode(cinfo, st, (m & v) ? 1 : 0);
8059862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
8069862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Encode EOB decision only if k <= DCTSIZE2 - 1 */
8079862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (k <= DCTSIZE2 - 1) {
8089862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      st = entropy->ac_stats[tbl] + 3 * (k - 1);
8099862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      arith_encode(cinfo, st, 1);
8109862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
8119862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
8129862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
8139862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  return TRUE;
8149862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}
8159862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
8169862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
8179862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/*
8189862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Initialize for an arithmetic-compressed scan.
8199862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
8209862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
8219862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgMETHODDEF(void)
8229862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgstart_pass (j_compress_ptr cinfo, boolean gather_statistics)
8239862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{
8249862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
8259862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int ci, tbl;
8269862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  jpeg_component_info * compptr;
8279862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
8289862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (gather_statistics)
8299862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* Make sure to avoid that in the master control logic!
8309862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org     * We are fully adaptive here and need no extra
8319862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org     * statistics gathering pass!
8329862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org     */
8339862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    ERREXIT(cinfo, JERR_NOT_COMPILED);
8349862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
8359862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* We assume jcmaster.c already validated the progressive scan parameters. */
8369862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
8379862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Select execution routines */
8389862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  if (cinfo->progressive_mode) {
8399862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (cinfo->Ah == 0) {
8409862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (cinfo->Ss == 0)
8419862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->pub.encode_mcu = encode_mcu_DC_first;
8429862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      else
8439862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->pub.encode_mcu = encode_mcu_AC_first;
8449862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    } else {
8459862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (cinfo->Ss == 0)
8469862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->pub.encode_mcu = encode_mcu_DC_refine;
8479862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      else
8489862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->pub.encode_mcu = encode_mcu_AC_refine;
8499862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
8509862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  } else
8519862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    entropy->pub.encode_mcu = encode_mcu;
8529862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
8539862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Allocate & initialize requested statistics areas */
8549862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
8559862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    compptr = cinfo->cur_comp_info[ci];
8569862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* DC needs no table for refinement scan */
8579862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
8589862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      tbl = compptr->dc_tbl_no;
8599862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
8609862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
8619862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (entropy->dc_stats[tbl] == NULL)
8629862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
8639862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS);
8649862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);
8659862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      /* Initialize DC predictions to 0 */
8669862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->last_dc_val[ci] = 0;
8679862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      entropy->dc_context[ci] = 0;
8689862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
8699862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    /* AC needs no table when not present */
8709862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    if (cinfo->progressive_mode == 0 || cinfo->Se) {
8719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      tbl = compptr->ac_tbl_no;
8729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
8739862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
8749862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (entropy->ac_stats[tbl] == NULL)
8759862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
8769862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	  ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS);
8779862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);
8789862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#ifdef CALCULATE_SPECTRAL_CONDITIONING
8799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org      if (cinfo->progressive_mode)
8809862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	/* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */
8819862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org	cinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4);
8829862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#endif
8839862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    }
8849862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
8859862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
8869862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Initialize arithmetic encoding variables */
8879862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->c = 0;
8889862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->a = 0x10000L;
8899862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->sc = 0;
8909862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->zc = 0;
8919862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->ct = 11;
8929862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->buffer = -1;  /* empty */
8939862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
8949862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Initialize restart stuff */
8959862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->restarts_to_go = cinfo->restart_interval;
8969862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->next_restart_num = 0;
8979862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}
8989862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
8999862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
9009862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org/*
9019862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Module initialization routine for arithmetic entropy encoding.
9029862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org */
9039862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
9049862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgGLOBAL(void)
9059862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.orgjinit_arith_encoder (j_compress_ptr cinfo)
9069862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org{
9079862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  arith_entropy_ptr entropy;
9089862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  int i;
9099862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
9109862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy = (arith_entropy_ptr)
9119862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
9129862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org				SIZEOF(arith_entropy_encoder));
9139862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
9149862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->pub.start_pass = start_pass;
9159862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->pub.finish_pass = finish_pass;
9169862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
9179862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Mark tables unallocated */
9189862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  for (i = 0; i < NUM_ARITH_TBLS; i++) {
9199862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    entropy->dc_stats[i] = NULL;
9209862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org    entropy->ac_stats[i] = NULL;
9219862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  }
9229862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org
9239862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  /* Initialize index for fixed probability estimation */
9249862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org  entropy->fixed_bin[0] = 113;
9259862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org}
926