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