|
<html><head><title>dlib C++ Library - jdarith.c</title></head><body bgcolor='white'><pre> |
|
<font color='#009900'>/*
|
|
* jdarith.c
|
|
*
|
|
* Developed 1997-2011 by Guido Vollbeding.
|
|
* This file is part of the Independent JPEG Group's software.
|
|
* For conditions of distribution and use, see the accompanying README file.
|
|
*
|
|
* This file contains portable arithmetic entropy decoding routines for JPEG
|
|
* (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81).
|
|
*
|
|
* Both sequential and progressive modes are supported in this single module.
|
|
*
|
|
* Suspension is not currently supported in this module.
|
|
*/</font>
|
|
|
|
<font color='#0000FF'>#define</font> JPEG_INTERNALS
|
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='jinclude.h.html'>jinclude.h</a>"
|
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='jpeglib.h.html'>jpeglib.h</a>"
|
|
|
|
|
|
<font color='#009900'>/* Expanded entropy decoder object for arithmetic decoding. */</font>
|
|
|
|
<font color='#0000FF'>typedef</font> <font color='#0000FF'>struct</font> <b>{</b>
|
|
<font color='#0000FF'>struct</font> jpeg_entropy_decoder pub; <font color='#009900'>/* public fields */</font>
|
|
|
|
INT32 c; <font color='#009900'>/* C register, base of coding interval + input bit buffer */</font>
|
|
INT32 a; <font color='#009900'>/* A register, normalized size of coding interval */</font>
|
|
<font color='#0000FF'><u>int</u></font> ct; <font color='#009900'>/* bit shift counter, # of bits left in bit buffer part of C */</font>
|
|
<font color='#009900'>/* init: ct = -16 */</font>
|
|
<font color='#009900'>/* run: ct = 0..7 */</font>
|
|
<font color='#009900'>/* error: ct = -1 */</font>
|
|
<font color='#0000FF'><u>int</u></font> last_dc_val[MAX_COMPS_IN_SCAN]; <font color='#009900'>/* last DC coef for each component */</font>
|
|
<font color='#0000FF'><u>int</u></font> dc_context[MAX_COMPS_IN_SCAN]; <font color='#009900'>/* context index for DC conditioning */</font>
|
|
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>int</u></font> restarts_to_go; <font color='#009900'>/* MCUs left in this restart interval */</font>
|
|
|
|
<font color='#009900'>/* Pointers to statistics areas (these workspaces have image lifespan) */</font>
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font> dc_stats[NUM_ARITH_TBLS];
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font> ac_stats[NUM_ARITH_TBLS];
|
|
|
|
<font color='#009900'>/* Statistics bin for coding with fixed probability 0.5 */</font>
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> fixed_bin[<font color='#979000'>4</font>];
|
|
<b>}</b> arith_entropy_decoder;
|
|
|
|
<font color='#0000FF'>typedef</font> arith_entropy_decoder <font color='#5555FF'>*</font> arith_entropy_ptr;
|
|
|
|
<font color='#009900'>/* The following two definitions specify the allocation chunk size
|
|
* for the statistics area.
|
|
* According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least
|
|
* 49 statistics bins for DC, and 245 statistics bins for AC coding.
|
|
*
|
|
* We use a compact representation with 1 byte per statistics bin,
|
|
* thus the numbers directly represent byte sizes.
|
|
* This 1 byte per statistics bin contains the meaning of the MPS
|
|
* (more probable symbol) in the highest bit (mask 0x80), and the
|
|
* index into the probability estimation state machine table
|
|
* in the lower bits (mask 0x7F).
|
|
*/</font>
|
|
|
|
<font color='#0000FF'>#define</font> DC_STAT_BINS <font color='#979000'>64</font>
|
|
<font color='#0000FF'>#define</font> AC_STAT_BINS <font color='#979000'>256</font>
|
|
|
|
|
|
<b><a name='LOCAL'></a>LOCAL</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font>
|
|
<b><a name='get_byte'></a>get_byte</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo<font face='Lucida Console'>)</font>
|
|
<font color='#009900'>/* Read next input byte; we do not support suspension in this module. */</font>
|
|
<b>{</b>
|
|
<font color='#0000FF'>struct</font> jpeg_source_mgr <font color='#5555FF'>*</font> src <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>src;
|
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>src<font color='#5555FF'>-</font><font color='#5555FF'>></font>bytes_in_buffer <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>src<font color='#5555FF'>-</font><font color='#5555FF'>></font>fill_input_buffer<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
|
|
<font color='#BB00BB'>ERREXIT</font><font face='Lucida Console'>(</font>cinfo, JERR_CANT_SUSPEND<font face='Lucida Console'>)</font>;
|
|
src<font color='#5555FF'>-</font><font color='#5555FF'>></font>bytes_in_buffer<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;
|
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>GETJOCTET</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>src<font color='#5555FF'>-</font><font color='#5555FF'>></font>next_input_byte<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font>;
|
|
<b>}</b>
|
|
|
|
|
|
<font color='#009900'>/*
|
|
* The core arithmetic decoding routine (common in JPEG and JBIG).
|
|
* This needs to go as fast as possible.
|
|
* Machine-dependent optimization facilities
|
|
* are not utilized in this portable implementation.
|
|
* However, this code should be fairly efficient and
|
|
* may be a good base for further optimizations anyway.
|
|
*
|
|
* Return value is 0 or 1 (binary decision).
|
|
*
|
|
* Note: I've changed the handling of the code base & bit
|
|
* buffer register C compared to other implementations
|
|
* based on the standards layout & procedures.
|
|
* While it also contains both the actual base of the
|
|
* coding interval (16 bits) and the next-bits buffer,
|
|
* the cut-point between these two parts is floating
|
|
* (instead of fixed) with the bit shift counter CT.
|
|
* Thus, we also need only one (variable instead of
|
|
* fixed size) shift for the LPS/MPS decision, and
|
|
* we can get away with any renormalization update
|
|
* of C (except for new data insertion, of course).
|
|
*
|
|
* I've also introduced a new scheme for accessing
|
|
* the probability estimation state machine table,
|
|
* derived from Markus Kuhn's JBIG implementation.
|
|
*/</font>
|
|
|
|
<b><a name='LOCAL'></a>LOCAL</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font>
|
|
<b><a name='arith_decode'></a>arith_decode</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font>st<font face='Lucida Console'>)</font>
|
|
<b>{</b>
|
|
<font color='#0000FF'>register</font> arith_entropy_ptr e <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>arith_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>entropy;
|
|
<font color='#0000FF'>register</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> nl, nm;
|
|
<font color='#0000FF'>register</font> INT32 qe, temp;
|
|
<font color='#0000FF'>register</font> <font color='#0000FF'><u>int</u></font> sv, data;
|
|
|
|
<font color='#009900'>/* Renormalization & data input per section D.2.6 */</font>
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>e<font color='#5555FF'>-</font><font color='#5555FF'>></font>a <font color='#5555FF'><</font> <font color='#979000'>0x8000L</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>-</font><font color='#5555FF'>-</font>e<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'><</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#009900'>/* Need to fetch next data byte */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>unread_marker<font face='Lucida Console'>)</font>
|
|
data <font color='#5555FF'>=</font> <font color='#979000'>0</font>; <font color='#009900'>/* stuff zero data */</font>
|
|
<font color='#0000FF'>else</font> <b>{</b>
|
|
data <font color='#5555FF'>=</font> <font color='#BB00BB'>get_byte</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font>; <font color='#009900'>/* read next input byte */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0xFF</font><font face='Lucida Console'>)</font> <b>{</b> <font color='#009900'>/* zero stuff or marker code */</font>
|
|
<font color='#0000FF'>do</font> data <font color='#5555FF'>=</font> <font color='#BB00BB'>get_byte</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font>;
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>data <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0xFF</font><font face='Lucida Console'>)</font>; <font color='#009900'>/* swallow extra 0xFF bytes */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
data <font color='#5555FF'>=</font> <font color='#979000'>0xFF</font>; <font color='#009900'>/* discard stuffed zero byte */</font>
|
|
<font color='#0000FF'>else</font> <b>{</b>
|
|
<font color='#009900'>/* Note: Different from the Huffman decoder, hitting
|
|
* a marker while processing the compressed data
|
|
* segment is legal in arithmetic coding.
|
|
* The convention is to supply zero data
|
|
* then until decoding is complete.
|
|
*/</font>
|
|
cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>unread_marker <font color='#5555FF'>=</font> data;
|
|
data <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
|
|
<b>}</b>
|
|
<b>}</b>
|
|
<b>}</b>
|
|
e<font color='#5555FF'>-</font><font color='#5555FF'>></font>c <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>e<font color='#5555FF'>-</font><font color='#5555FF'>></font>c <font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>|</font> data; <font color='#009900'>/* insert data into C register */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>e<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'><</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#009900'>/* update bit shift counter */</font>
|
|
<font color='#009900'>/* Need more initial bytes */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>+</font><font color='#5555FF'>+</font>e<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
<font color='#009900'>/* Got 2 initial bytes -> re-init A and exit loop */</font>
|
|
e<font color='#5555FF'>-</font><font color='#5555FF'>></font>a <font color='#5555FF'>=</font> <font color='#979000'>0x8000L</font>; <font color='#009900'>/* => e->a = 0x10000L after loop exit */</font>
|
|
<b>}</b>
|
|
e<font color='#5555FF'>-</font><font color='#5555FF'>></font>a <font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>;
|
|
<b>}</b>
|
|
|
|
<font color='#009900'>/* Fetch values from our compact representation of Table D.3(D.2):
|
|
* Qe values and probability estimation state machine
|
|
*/</font>
|
|
sv <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>st;
|
|
qe <font color='#5555FF'>=</font> jpeg_aritab[sv <font color='#5555FF'>&</font> <font color='#979000'>0x7F</font>]; <font color='#009900'>/* => Qe_Value */</font>
|
|
nl <font color='#5555FF'>=</font> qe <font color='#5555FF'>&</font> <font color='#979000'>0xFF</font>; qe <font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>8</font>; <font color='#009900'>/* Next_Index_LPS + Switch_MPS */</font>
|
|
nm <font color='#5555FF'>=</font> qe <font color='#5555FF'>&</font> <font color='#979000'>0xFF</font>; qe <font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>8</font>; <font color='#009900'>/* Next_Index_MPS */</font>
|
|
|
|
<font color='#009900'>/* Decode & estimation procedures per sections D.2.4 & D.2.5 */</font>
|
|
temp <font color='#5555FF'>=</font> e<font color='#5555FF'>-</font><font color='#5555FF'>></font>a <font color='#5555FF'>-</font> qe;
|
|
e<font color='#5555FF'>-</font><font color='#5555FF'>></font>a <font color='#5555FF'>=</font> temp;
|
|
temp <font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#5555FF'>=</font> e<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct;
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>e<font color='#5555FF'>-</font><font color='#5555FF'>></font>c <font color='#5555FF'>></font><font color='#5555FF'>=</font> temp<font face='Lucida Console'>)</font> <b>{</b>
|
|
e<font color='#5555FF'>-</font><font color='#5555FF'>></font>c <font color='#5555FF'>-</font><font color='#5555FF'>=</font> temp;
|
|
<font color='#009900'>/* Conditional LPS (less probable symbol) exchange */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>e<font color='#5555FF'>-</font><font color='#5555FF'>></font>a <font color='#5555FF'><</font> qe<font face='Lucida Console'>)</font> <b>{</b>
|
|
e<font color='#5555FF'>-</font><font color='#5555FF'>></font>a <font color='#5555FF'>=</font> qe;
|
|
<font color='#5555FF'>*</font>st <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>sv <font color='#5555FF'>&</font> <font color='#979000'>0x80</font><font face='Lucida Console'>)</font> ^ nm; <font color='#009900'>/* Estimate_after_MPS */</font>
|
|
<b>}</b> <font color='#0000FF'>else</font> <b>{</b>
|
|
e<font color='#5555FF'>-</font><font color='#5555FF'>></font>a <font color='#5555FF'>=</font> qe;
|
|
<font color='#5555FF'>*</font>st <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>sv <font color='#5555FF'>&</font> <font color='#979000'>0x80</font><font face='Lucida Console'>)</font> ^ nl; <font color='#009900'>/* Estimate_after_LPS */</font>
|
|
sv ^<font color='#5555FF'>=</font> <font color='#979000'>0x80</font>; <font color='#009900'>/* Exchange LPS/MPS */</font>
|
|
<b>}</b>
|
|
<b>}</b> <font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>e<font color='#5555FF'>-</font><font color='#5555FF'>></font>a <font color='#5555FF'><</font> <font color='#979000'>0x8000L</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#009900'>/* Conditional MPS (more probable symbol) exchange */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>e<font color='#5555FF'>-</font><font color='#5555FF'>></font>a <font color='#5555FF'><</font> qe<font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#5555FF'>*</font>st <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>sv <font color='#5555FF'>&</font> <font color='#979000'>0x80</font><font face='Lucida Console'>)</font> ^ nl; <font color='#009900'>/* Estimate_after_LPS */</font>
|
|
sv ^<font color='#5555FF'>=</font> <font color='#979000'>0x80</font>; <font color='#009900'>/* Exchange LPS/MPS */</font>
|
|
<b>}</b> <font color='#0000FF'>else</font> <b>{</b>
|
|
<font color='#5555FF'>*</font>st <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>sv <font color='#5555FF'>&</font> <font color='#979000'>0x80</font><font face='Lucida Console'>)</font> ^ nm; <font color='#009900'>/* Estimate_after_MPS */</font>
|
|
<b>}</b>
|
|
<b>}</b>
|
|
|
|
<font color='#0000FF'>return</font> sv <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>7</font>;
|
|
<b>}</b>
|
|
|
|
|
|
<font color='#009900'>/*
|
|
* Check for a restart marker & resynchronize decoder.
|
|
*/</font>
|
|
|
|
<b><a name='LOCAL'></a>LOCAL</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font>
|
|
<b><a name='process_restart'></a>process_restart</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo<font face='Lucida Console'>)</font>
|
|
<b>{</b>
|
|
arith_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>arith_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>entropy;
|
|
<font color='#0000FF'><u>int</u></font> ci;
|
|
jpeg_component_info <font color='#5555FF'>*</font> compptr;
|
|
|
|
<font color='#009900'>/* Advance past the RSTn marker */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>marker<font color='#5555FF'>-</font><font color='#5555FF'>></font>read_restart_marker<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
|
|
<font color='#BB00BB'>ERREXIT</font><font face='Lucida Console'>(</font>cinfo, JERR_CANT_SUSPEND<font face='Lucida Console'>)</font>;
|
|
|
|
<font color='#009900'>/* Re-initialize statistics areas */</font>
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>=</font> <font color='#979000'>0</font>; ci <font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>comps_in_scan; ci<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
compptr <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>cur_comp_info[ci];
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>progressive_mode <font color='#5555FF'>|</font><font color='#5555FF'>|</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ah <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#BB00BB'>MEMZERO</font><font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_stats[compptr<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_tbl_no], DC_STAT_BINS<font face='Lucida Console'>)</font>;
|
|
<font color='#009900'>/* Reset DC predictions to 0 */</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>last_dc_val[ci] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_context[ci] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
|
|
<b>}</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#5555FF'>!</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>progressive_mode <font color='#5555FF'>&</font><font color='#5555FF'>&</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>lim_Se<font face='Lucida Console'>)</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font>
|
|
<font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>progressive_mode <font color='#5555FF'>&</font><font color='#5555FF'>&</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#BB00BB'>MEMZERO</font><font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_stats[compptr<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_tbl_no], AC_STAT_BINS<font face='Lucida Console'>)</font>;
|
|
<b>}</b>
|
|
<b>}</b>
|
|
|
|
<font color='#009900'>/* Reset arithmetic decoding variables */</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>c <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>a <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>16</font>; <font color='#009900'>/* force reading 2 initial bytes to fill C */</font>
|
|
|
|
<font color='#009900'>/* Reset restart counter */</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>restart_interval;
|
|
<b>}</b>
|
|
|
|
|
|
<font color='#009900'>/*
|
|
* Arithmetic MCU decoding.
|
|
* Each of these routines decodes and returns one MCU's worth of
|
|
* arithmetic-compressed coefficients.
|
|
* The coefficients are reordered from zigzag order into natural array order,
|
|
* but are not dequantized.
|
|
*
|
|
* The i'th block of the MCU is stored into the block pointed to by
|
|
* MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.
|
|
*/</font>
|
|
|
|
<font color='#009900'>/*
|
|
* MCU decoding for DC initial scan (either spectral selection,
|
|
* or first pass of successive approximation).
|
|
*/</font>
|
|
|
|
<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
|
|
<b><a name='decode_mcu_DC_first'></a>decode_mcu_DC_first</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, JBLOCKROW <font color='#5555FF'>*</font>MCU_data<font face='Lucida Console'>)</font>
|
|
<b>{</b>
|
|
arith_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>arith_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>entropy;
|
|
JBLOCKROW block;
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font>st;
|
|
<font color='#0000FF'><u>int</u></font> blkn, ci, tbl, sign;
|
|
<font color='#0000FF'><u>int</u></font> v, m;
|
|
|
|
<font color='#009900'>/* Process restart marker if needed */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>restart_interval<font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
<font color='#BB00BB'>process_restart</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;
|
|
<b>}</b>
|
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> TRUE; <font color='#009900'>/* if error do nothing */</font>
|
|
|
|
<font color='#009900'>/* Outer loop handles each block in the MCU */</font>
|
|
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>blkn <font color='#5555FF'>=</font> <font color='#979000'>0</font>; blkn <font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>blocks_in_MCU; blkn<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
block <font color='#5555FF'>=</font> MCU_data[blkn];
|
|
ci <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>MCU_membership[blkn];
|
|
tbl <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>cur_comp_info[ci]<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_tbl_no;
|
|
|
|
<font color='#009900'>/* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */</font>
|
|
|
|
<font color='#009900'>/* Table F.4: Point to statistics bin S0 for DC coefficient coding */</font>
|
|
st <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_stats[tbl] <font color='#5555FF'>+</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_context[ci];
|
|
|
|
<font color='#009900'>/* Figure F.19: Decode_DC_DIFF */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_context[ci] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
|
|
<font color='#0000FF'>else</font> <b>{</b>
|
|
<font color='#009900'>/* Figure F.21: Decoding nonzero value v */</font>
|
|
<font color='#009900'>/* Figure F.22: Decoding the sign of v */</font>
|
|
sign <font color='#5555FF'>=</font> <font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st <font color='#5555FF'>+</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>;
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>2</font>; st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> sign;
|
|
<font color='#009900'>/* Figure F.23: Decoding the magnitude category of v */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>m <font color='#5555FF'>=</font> <font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
st <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_stats[tbl] <font color='#5555FF'>+</font> <font color='#979000'>20</font>; <font color='#009900'>/* Table F.4: X1 = 20 */</font>
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>m <font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0x8000</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#BB00BB'>WARNMS</font><font face='Lucida Console'>(</font>cinfo, JWRN_ARITH_BAD_CODE<font face='Lucida Console'>)</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>; <font color='#009900'>/* magnitude overflow */</font>
|
|
<font color='#0000FF'>return</font> TRUE;
|
|
<b>}</b>
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>;
|
|
<b>}</b>
|
|
<b>}</b>
|
|
<font color='#009900'>/* Section F.1.4.4.1.2: Establish dc_context conditioning category */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>m <font color='#5555FF'><</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>1</font>L <font color='#5555FF'><</font><font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>arith_dc_L[tbl]<font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>1</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_context[ci] <font color='#5555FF'>=</font> <font color='#979000'>0</font>; <font color='#009900'>/* zero diff category */</font>
|
|
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>m <font color='#5555FF'>></font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>1</font>L <font color='#5555FF'><</font><font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>arith_dc_U[tbl]<font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>1</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_context[ci] <font color='#5555FF'>=</font> <font color='#979000'>12</font> <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>sign <font color='#5555FF'>*</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font>; <font color='#009900'>/* large diff category */</font>
|
|
<font color='#0000FF'>else</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_context[ci] <font color='#5555FF'>=</font> <font color='#979000'>4</font> <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>sign <font color='#5555FF'>*</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font>; <font color='#009900'>/* small diff category */</font>
|
|
v <font color='#5555FF'>=</font> m;
|
|
<font color='#009900'>/* Figure F.24: Decoding the magnitude bit pattern of v */</font>
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>14</font>;
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>m <font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> v <font color='#5555FF'>|</font><font color='#5555FF'>=</font> m;
|
|
v <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>sign<font face='Lucida Console'>)</font> v <font color='#5555FF'>=</font> <font color='#5555FF'>-</font>v;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>last_dc_val[ci] <font color='#5555FF'>+</font><font color='#5555FF'>=</font> v;
|
|
<b>}</b>
|
|
|
|
<font color='#009900'>/* Scale and output the DC coefficient (assumes jpeg_natural_order[0]=0) */</font>
|
|
<font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>JCOEF<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>last_dc_val[ci] <font color='#5555FF'><</font><font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Al<font face='Lucida Console'>)</font>;
|
|
<b>}</b>
|
|
|
|
<font color='#0000FF'>return</font> TRUE;
|
|
<b>}</b>
|
|
|
|
|
|
<font color='#009900'>/*
|
|
* MCU decoding for AC initial scan (either spectral selection,
|
|
* or first pass of successive approximation).
|
|
*/</font>
|
|
|
|
<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
|
|
<b><a name='decode_mcu_AC_first'></a>decode_mcu_AC_first</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, JBLOCKROW <font color='#5555FF'>*</font>MCU_data<font face='Lucida Console'>)</font>
|
|
<b>{</b>
|
|
arith_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>arith_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>entropy;
|
|
JBLOCKROW block;
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font>st;
|
|
<font color='#0000FF'><u>int</u></font> tbl, sign, k;
|
|
<font color='#0000FF'><u>int</u></font> v, m;
|
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> <font color='#5555FF'>*</font> natural_order;
|
|
|
|
<font color='#009900'>/* Process restart marker if needed */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>restart_interval<font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
<font color='#BB00BB'>process_restart</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;
|
|
<b>}</b>
|
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> TRUE; <font color='#009900'>/* if error do nothing */</font>
|
|
|
|
natural_order <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>natural_order;
|
|
|
|
<font color='#009900'>/* There is always only one block per MCU */</font>
|
|
block <font color='#5555FF'>=</font> MCU_data[<font color='#979000'>0</font>];
|
|
tbl <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>cur_comp_info[<font color='#979000'>0</font>]<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_tbl_no;
|
|
|
|
<font color='#009900'>/* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */</font>
|
|
|
|
<font color='#009900'>/* Figure F.20: Decode_AC_coefficients */</font>
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss; k <font color='#5555FF'><</font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
st <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_stats[tbl] <font color='#5555FF'>+</font> <font color='#979000'>3</font> <font color='#5555FF'>*</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>-</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>;
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>; <font color='#009900'>/* EOB flag */</font>
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st <font color='#5555FF'>+</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>3</font>; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font>;
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>></font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se<font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#BB00BB'>WARNMS</font><font face='Lucida Console'>(</font>cinfo, JWRN_ARITH_BAD_CODE<font face='Lucida Console'>)</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>; <font color='#009900'>/* spectral overflow */</font>
|
|
<font color='#0000FF'>return</font> TRUE;
|
|
<b>}</b>
|
|
<b>}</b>
|
|
<font color='#009900'>/* Figure F.21: Decoding nonzero value v */</font>
|
|
<font color='#009900'>/* Figure F.22: Decoding the sign of v */</font>
|
|
sign <font color='#5555FF'>=</font> <font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>fixed_bin<font face='Lucida Console'>)</font>;
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>2</font>;
|
|
<font color='#009900'>/* Figure F.23: Decoding the magnitude category of v */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>m <font color='#5555FF'>=</font> <font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
m <font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>;
|
|
st <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_stats[tbl] <font color='#5555FF'>+</font>
|
|
<font face='Lucida Console'>(</font>k <font color='#5555FF'><</font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>arith_ac_K[tbl] ? <font color='#979000'>189</font> : <font color='#979000'>217</font><font face='Lucida Console'>)</font>;
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>m <font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0x8000</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#BB00BB'>WARNMS</font><font face='Lucida Console'>(</font>cinfo, JWRN_ARITH_BAD_CODE<font face='Lucida Console'>)</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>; <font color='#009900'>/* magnitude overflow */</font>
|
|
<font color='#0000FF'>return</font> TRUE;
|
|
<b>}</b>
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>;
|
|
<b>}</b>
|
|
<b>}</b>
|
|
<b>}</b>
|
|
v <font color='#5555FF'>=</font> m;
|
|
<font color='#009900'>/* Figure F.24: Decoding the magnitude bit pattern of v */</font>
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>14</font>;
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>m <font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> v <font color='#5555FF'>|</font><font color='#5555FF'>=</font> m;
|
|
v <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>sign<font face='Lucida Console'>)</font> v <font color='#5555FF'>=</font> <font color='#5555FF'>-</font>v;
|
|
<font color='#009900'>/* Scale and output coefficient in natural (dezigzagged) order */</font>
|
|
<font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[natural_order[k]] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>JCOEF<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font>v <font color='#5555FF'><</font><font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Al<font face='Lucida Console'>)</font>;
|
|
<b>}</b>
|
|
|
|
<font color='#0000FF'>return</font> TRUE;
|
|
<b>}</b>
|
|
|
|
|
|
<font color='#009900'>/*
|
|
* MCU decoding for DC successive approximation refinement scan.
|
|
*/</font>
|
|
|
|
<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
|
|
<b><a name='decode_mcu_DC_refine'></a>decode_mcu_DC_refine</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, JBLOCKROW <font color='#5555FF'>*</font>MCU_data<font face='Lucida Console'>)</font>
|
|
<b>{</b>
|
|
arith_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>arith_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>entropy;
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font>st;
|
|
<font color='#0000FF'><u>int</u></font> p1, blkn;
|
|
|
|
<font color='#009900'>/* Process restart marker if needed */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>restart_interval<font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
<font color='#BB00BB'>process_restart</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;
|
|
<b>}</b>
|
|
|
|
st <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>fixed_bin; <font color='#009900'>/* use fixed probability estimation */</font>
|
|
p1 <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'><</font><font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Al; <font color='#009900'>/* 1 in the bit position being coded */</font>
|
|
|
|
<font color='#009900'>/* Outer loop handles each block in the MCU */</font>
|
|
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>blkn <font color='#5555FF'>=</font> <font color='#979000'>0</font>; blkn <font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>blocks_in_MCU; blkn<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#009900'>/* Encoded data is simply the next bit of the two's-complement DC value */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
|
|
MCU_data[blkn][<font color='#979000'>0</font>][<font color='#979000'>0</font>] <font color='#5555FF'>|</font><font color='#5555FF'>=</font> p1;
|
|
<b>}</b>
|
|
|
|
<font color='#0000FF'>return</font> TRUE;
|
|
<b>}</b>
|
|
|
|
|
|
<font color='#009900'>/*
|
|
* MCU decoding for AC successive approximation refinement scan.
|
|
*/</font>
|
|
|
|
<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
|
|
<b><a name='decode_mcu_AC_refine'></a>decode_mcu_AC_refine</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, JBLOCKROW <font color='#5555FF'>*</font>MCU_data<font face='Lucida Console'>)</font>
|
|
<b>{</b>
|
|
arith_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>arith_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>entropy;
|
|
JBLOCKROW block;
|
|
JCOEFPTR thiscoef;
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font>st;
|
|
<font color='#0000FF'><u>int</u></font> tbl, k, kex;
|
|
<font color='#0000FF'><u>int</u></font> p1, m1;
|
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> <font color='#5555FF'>*</font> natural_order;
|
|
|
|
<font color='#009900'>/* Process restart marker if needed */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>restart_interval<font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
<font color='#BB00BB'>process_restart</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;
|
|
<b>}</b>
|
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> TRUE; <font color='#009900'>/* if error do nothing */</font>
|
|
|
|
natural_order <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>natural_order;
|
|
|
|
<font color='#009900'>/* There is always only one block per MCU */</font>
|
|
block <font color='#5555FF'>=</font> MCU_data[<font color='#979000'>0</font>];
|
|
tbl <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>cur_comp_info[<font color='#979000'>0</font>]<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_tbl_no;
|
|
|
|
p1 <font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'><</font><font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Al; <font color='#009900'>/* 1 in the bit position being coded */</font>
|
|
m1 <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Al; <font color='#009900'>/* -1 in the bit position being coded */</font>
|
|
|
|
<font color='#009900'>/* Establish EOBx (previous stage end-of-block) index */</font>
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>kex <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se; kex <font color='#5555FF'>></font> <font color='#979000'>0</font>; kex<font color='#5555FF'>-</font><font color='#5555FF'>-</font><font face='Lucida Console'>)</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[natural_order[kex]]<font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>;
|
|
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss; k <font color='#5555FF'><</font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
st <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_stats[tbl] <font color='#5555FF'>+</font> <font color='#979000'>3</font> <font color='#5555FF'>*</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>-</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>;
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>></font> kex<font face='Lucida Console'>)</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>; <font color='#009900'>/* EOB flag */</font>
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>;;<font face='Lucida Console'>)</font> <b>{</b>
|
|
thiscoef <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>block <font color='#5555FF'>+</font> natural_order[k];
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>thiscoef<font face='Lucida Console'>)</font> <b>{</b> <font color='#009900'>/* previously nonzero coef */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st <font color='#5555FF'>+</font> <font color='#979000'>2</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>thiscoef <font color='#5555FF'><</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
<font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>+</font><font color='#5555FF'>=</font> m1;
|
|
<font color='#0000FF'>else</font>
|
|
<font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>+</font><font color='#5555FF'>=</font> p1;
|
|
<b>}</b>
|
|
<font color='#0000FF'>break</font>;
|
|
<b>}</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st <font color='#5555FF'>+</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b> <font color='#009900'>/* newly nonzero coef */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>fixed_bin<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
|
|
<font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>=</font> m1;
|
|
<font color='#0000FF'>else</font>
|
|
<font color='#5555FF'>*</font>thiscoef <font color='#5555FF'>=</font> p1;
|
|
<font color='#0000FF'>break</font>;
|
|
<b>}</b>
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>3</font>; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font>;
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>></font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se<font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#BB00BB'>WARNMS</font><font face='Lucida Console'>(</font>cinfo, JWRN_ARITH_BAD_CODE<font face='Lucida Console'>)</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>; <font color='#009900'>/* spectral overflow */</font>
|
|
<font color='#0000FF'>return</font> TRUE;
|
|
<b>}</b>
|
|
<b>}</b>
|
|
<b>}</b>
|
|
|
|
<font color='#0000FF'>return</font> TRUE;
|
|
<b>}</b>
|
|
|
|
|
|
<font color='#009900'>/*
|
|
* Decode one MCU's worth of arithmetic-compressed coefficients.
|
|
*/</font>
|
|
|
|
<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font>boolean<font face='Lucida Console'>)</font>
|
|
<b><a name='decode_mcu'></a>decode_mcu</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo, JBLOCKROW <font color='#5555FF'>*</font>MCU_data<font face='Lucida Console'>)</font>
|
|
<b>{</b>
|
|
arith_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>arith_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>entropy;
|
|
jpeg_component_info <font color='#5555FF'>*</font> compptr;
|
|
JBLOCKROW block;
|
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font>st;
|
|
<font color='#0000FF'><u>int</u></font> blkn, ci, tbl, sign, k;
|
|
<font color='#0000FF'><u>int</u></font> v, m;
|
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>int</u></font> <font color='#5555FF'>*</font> natural_order;
|
|
|
|
<font color='#009900'>/* Process restart marker if needed */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>restart_interval<font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
<font color='#BB00BB'>process_restart</font><font face='Lucida Console'>(</font>cinfo<font face='Lucida Console'>)</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go<font color='#5555FF'>-</font><font color='#5555FF'>-</font>;
|
|
<b>}</b>
|
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> TRUE; <font color='#009900'>/* if error do nothing */</font>
|
|
|
|
natural_order <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>natural_order;
|
|
|
|
<font color='#009900'>/* Outer loop handles each block in the MCU */</font>
|
|
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>blkn <font color='#5555FF'>=</font> <font color='#979000'>0</font>; blkn <font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>blocks_in_MCU; blkn<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
block <font color='#5555FF'>=</font> MCU_data[blkn];
|
|
ci <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>MCU_membership[blkn];
|
|
compptr <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>cur_comp_info[ci];
|
|
|
|
<font color='#009900'>/* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */</font>
|
|
|
|
tbl <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_tbl_no;
|
|
|
|
<font color='#009900'>/* Table F.4: Point to statistics bin S0 for DC coefficient coding */</font>
|
|
st <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_stats[tbl] <font color='#5555FF'>+</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_context[ci];
|
|
|
|
<font color='#009900'>/* Figure F.19: Decode_DC_DIFF */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_context[ci] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
|
|
<font color='#0000FF'>else</font> <b>{</b>
|
|
<font color='#009900'>/* Figure F.21: Decoding nonzero value v */</font>
|
|
<font color='#009900'>/* Figure F.22: Decoding the sign of v */</font>
|
|
sign <font color='#5555FF'>=</font> <font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st <font color='#5555FF'>+</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>;
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>2</font>; st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> sign;
|
|
<font color='#009900'>/* Figure F.23: Decoding the magnitude category of v */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>m <font color='#5555FF'>=</font> <font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
st <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_stats[tbl] <font color='#5555FF'>+</font> <font color='#979000'>20</font>; <font color='#009900'>/* Table F.4: X1 = 20 */</font>
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>m <font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0x8000</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#BB00BB'>WARNMS</font><font face='Lucida Console'>(</font>cinfo, JWRN_ARITH_BAD_CODE<font face='Lucida Console'>)</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>; <font color='#009900'>/* magnitude overflow */</font>
|
|
<font color='#0000FF'>return</font> TRUE;
|
|
<b>}</b>
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>;
|
|
<b>}</b>
|
|
<b>}</b>
|
|
<font color='#009900'>/* Section F.1.4.4.1.2: Establish dc_context conditioning category */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>m <font color='#5555FF'><</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>1</font>L <font color='#5555FF'><</font><font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>arith_dc_L[tbl]<font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>1</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_context[ci] <font color='#5555FF'>=</font> <font color='#979000'>0</font>; <font color='#009900'>/* zero diff category */</font>
|
|
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>m <font color='#5555FF'>></font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#979000'>1</font>L <font color='#5555FF'><</font><font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>arith_dc_U[tbl]<font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>1</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_context[ci] <font color='#5555FF'>=</font> <font color='#979000'>12</font> <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>sign <font color='#5555FF'>*</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font>; <font color='#009900'>/* large diff category */</font>
|
|
<font color='#0000FF'>else</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_context[ci] <font color='#5555FF'>=</font> <font color='#979000'>4</font> <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>sign <font color='#5555FF'>*</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font>; <font color='#009900'>/* small diff category */</font>
|
|
v <font color='#5555FF'>=</font> m;
|
|
<font color='#009900'>/* Figure F.24: Decoding the magnitude bit pattern of v */</font>
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>14</font>;
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>m <font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> v <font color='#5555FF'>|</font><font color='#5555FF'>=</font> m;
|
|
v <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>sign<font face='Lucida Console'>)</font> v <font color='#5555FF'>=</font> <font color='#5555FF'>-</font>v;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>last_dc_val[ci] <font color='#5555FF'>+</font><font color='#5555FF'>=</font> v;
|
|
<b>}</b>
|
|
|
|
<font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>JCOEF<font face='Lucida Console'>)</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>last_dc_val[ci];
|
|
|
|
<font color='#009900'>/* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */</font>
|
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>lim_Se <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#0000FF'>continue</font>;
|
|
tbl <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_tbl_no;
|
|
k <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
|
|
|
|
<font color='#009900'>/* Figure F.20: Decode_AC_coefficients */</font>
|
|
<font color='#0000FF'>do</font> <b>{</b>
|
|
st <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_stats[tbl] <font color='#5555FF'>+</font> <font color='#979000'>3</font> <font color='#5555FF'>*</font> k;
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>; <font color='#009900'>/* EOB flag */</font>
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>;;<font face='Lucida Console'>)</font> <b>{</b>
|
|
k<font color='#5555FF'>+</font><font color='#5555FF'>+</font>;
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st <font color='#5555FF'>+</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#0000FF'>break</font>;
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>3</font>;
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>></font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>lim_Se<font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#BB00BB'>WARNMS</font><font face='Lucida Console'>(</font>cinfo, JWRN_ARITH_BAD_CODE<font face='Lucida Console'>)</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>; <font color='#009900'>/* spectral overflow */</font>
|
|
<font color='#0000FF'>return</font> TRUE;
|
|
<b>}</b>
|
|
<b>}</b>
|
|
<font color='#009900'>/* Figure F.21: Decoding nonzero value v */</font>
|
|
<font color='#009900'>/* Figure F.22: Decoding the sign of v */</font>
|
|
sign <font color='#5555FF'>=</font> <font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>fixed_bin<font face='Lucida Console'>)</font>;
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>2</font>;
|
|
<font color='#009900'>/* Figure F.23: Decoding the magnitude category of v */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>m <font color='#5555FF'>=</font> <font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
m <font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>;
|
|
st <font color='#5555FF'>=</font> entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_stats[tbl] <font color='#5555FF'>+</font>
|
|
<font face='Lucida Console'>(</font>k <font color='#5555FF'><</font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>arith_ac_K[tbl] ? <font color='#979000'>189</font> : <font color='#979000'>217</font><font face='Lucida Console'>)</font>;
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>m <font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0x8000</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#BB00BB'>WARNMS</font><font face='Lucida Console'>(</font>cinfo, JWRN_ARITH_BAD_CODE<font face='Lucida Console'>)</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>; <font color='#009900'>/* magnitude overflow */</font>
|
|
<font color='#0000FF'>return</font> TRUE;
|
|
<b>}</b>
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>;
|
|
<b>}</b>
|
|
<b>}</b>
|
|
<b>}</b>
|
|
v <font color='#5555FF'>=</font> m;
|
|
<font color='#009900'>/* Figure F.24: Decoding the magnitude bit pattern of v */</font>
|
|
st <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>14</font>;
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>m <font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>arith_decode</font><font face='Lucida Console'>(</font>cinfo, st<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> v <font color='#5555FF'>|</font><font color='#5555FF'>=</font> m;
|
|
v <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>sign<font face='Lucida Console'>)</font> v <font color='#5555FF'>=</font> <font color='#5555FF'>-</font>v;
|
|
<font face='Lucida Console'>(</font><font color='#5555FF'>*</font>block<font face='Lucida Console'>)</font>[natural_order[k]] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>JCOEF<font face='Lucida Console'>)</font> v;
|
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>lim_Se<font face='Lucida Console'>)</font>;
|
|
<b>}</b>
|
|
|
|
<font color='#0000FF'>return</font> TRUE;
|
|
<b>}</b>
|
|
|
|
|
|
<font color='#009900'>/*
|
|
* Initialize for an arithmetic-compressed scan.
|
|
*/</font>
|
|
|
|
<b><a name='METHODDEF'></a>METHODDEF</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font>
|
|
<b><a name='start_pass'></a>start_pass</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo<font face='Lucida Console'>)</font>
|
|
<b>{</b>
|
|
arith_entropy_ptr entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>arith_entropy_ptr<font face='Lucida Console'>)</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>entropy;
|
|
<font color='#0000FF'><u>int</u></font> ci, tbl;
|
|
jpeg_component_info <font color='#5555FF'>*</font> compptr;
|
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>progressive_mode<font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#009900'>/* Validate progressive scan parameters */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
<font color='#0000FF'>goto</font> bad;
|
|
<b>}</b> <font color='#0000FF'>else</font> <b>{</b>
|
|
<font color='#009900'>/* need not check Ss/Se < 0 since they came from unsigned bytes */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se <font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss <font color='#5555FF'>|</font><font color='#5555FF'>|</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se <font color='#5555FF'>></font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>lim_Se<font face='Lucida Console'>)</font>
|
|
<font color='#0000FF'>goto</font> bad;
|
|
<font color='#009900'>/* AC scans may have only one component */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>comps_in_scan <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>
|
|
<font color='#0000FF'>goto</font> bad;
|
|
<b>}</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ah <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#009900'>/* Successive approximation refinement scan: must have Al = Ah-1. */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ah<font color='#5555FF'>-</font><font color='#979000'>1</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Al<font face='Lucida Console'>)</font>
|
|
<font color='#0000FF'>goto</font> bad;
|
|
<b>}</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Al <font color='#5555FF'>></font> <font color='#979000'>13</font><font face='Lucida Console'>)</font> <b>{</b> <font color='#009900'>/* need not check for < 0 */</font>
|
|
bad:
|
|
<font color='#BB00BB'>ERREXIT4</font><font face='Lucida Console'>(</font>cinfo, JERR_BAD_PROGRESSION,
|
|
cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss, cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se, cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ah, cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Al<font face='Lucida Console'>)</font>;
|
|
<b>}</b>
|
|
<font color='#009900'>/* Update progression status, and verify that scan order is legal.
|
|
* Note that inter-scan inconsistencies are treated as warnings
|
|
* not fatal errors ... not clear if this is right way to behave.
|
|
*/</font>
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>=</font> <font color='#979000'>0</font>; ci <font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>comps_in_scan; ci<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'><u>int</u></font> coefi, cindex <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>cur_comp_info[ci]<font color='#5555FF'>-</font><font color='#5555FF'>></font>component_index;
|
|
<font color='#0000FF'><u>int</u></font> <font color='#5555FF'>*</font>coef_bit_ptr <font color='#5555FF'>=</font> <font color='#5555FF'>&</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>coef_bits[cindex][<font color='#979000'>0</font>];
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss <font color='#5555FF'>&</font><font color='#5555FF'>&</font> coef_bit_ptr[<font color='#979000'>0</font>] <font color='#5555FF'><</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#009900'>/* AC without prior DC scan */</font>
|
|
<font color='#BB00BB'>WARNMS2</font><font face='Lucida Console'>(</font>cinfo, JWRN_BOGUS_PROGRESSION, cindex, <font color='#979000'>0</font><font face='Lucida Console'>)</font>;
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>coefi <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss; coefi <font color='#5555FF'><</font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se; coefi<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'><u>int</u></font> expected <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>coef_bit_ptr[coefi] <font color='#5555FF'><</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> ? <font color='#979000'>0</font> : coef_bit_ptr[coefi];
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ah <font color='#5555FF'>!</font><font color='#5555FF'>=</font> expected<font face='Lucida Console'>)</font>
|
|
<font color='#BB00BB'>WARNMS2</font><font face='Lucida Console'>(</font>cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi<font face='Lucida Console'>)</font>;
|
|
coef_bit_ptr[coefi] <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Al;
|
|
<b>}</b>
|
|
<b>}</b>
|
|
<font color='#009900'>/* Select MCU decoding routine */</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ah <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>pub.decode_mcu <font color='#5555FF'>=</font> decode_mcu_DC_first;
|
|
<font color='#0000FF'>else</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>pub.decode_mcu <font color='#5555FF'>=</font> decode_mcu_AC_first;
|
|
<b>}</b> <font color='#0000FF'>else</font> <b>{</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>pub.decode_mcu <font color='#5555FF'>=</font> decode_mcu_DC_refine;
|
|
<font color='#0000FF'>else</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>pub.decode_mcu <font color='#5555FF'>=</font> decode_mcu_AC_refine;
|
|
<b>}</b>
|
|
<b>}</b> <font color='#0000FF'>else</font> <b>{</b>
|
|
<font color='#009900'>/* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
|
|
* This ought to be an error condition, but we make it a warning.
|
|
*/</font>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ah <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Al <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font>
|
|
<font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se <font color='#5555FF'><</font> DCTSIZE2 <font color='#5555FF'>&</font><font color='#5555FF'>&</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Se <font color='#5555FF'>!</font><font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>lim_Se<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
|
|
<font color='#BB00BB'>WARNMS</font><font face='Lucida Console'>(</font>cinfo, JWRN_NOT_SEQUENTIAL<font face='Lucida Console'>)</font>;
|
|
<font color='#009900'>/* Select MCU decoding routine */</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>pub.decode_mcu <font color='#5555FF'>=</font> decode_mcu;
|
|
<b>}</b>
|
|
|
|
<font color='#009900'>/* Allocate & initialize requested statistics areas */</font>
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>=</font> <font color='#979000'>0</font>; ci <font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>comps_in_scan; ci<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
compptr <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>cur_comp_info[ci];
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>progressive_mode <font color='#5555FF'>|</font><font color='#5555FF'>|</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ah <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
tbl <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_tbl_no;
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>tbl <font color='#5555FF'><</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> tbl <font color='#5555FF'>></font><font color='#5555FF'>=</font> NUM_ARITH_TBLS<font face='Lucida Console'>)</font>
|
|
<font color='#BB00BB'>ERREXIT1</font><font face='Lucida Console'>(</font>cinfo, JERR_NO_ARITH_TABLE, tbl<font face='Lucida Console'>)</font>;
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_stats[tbl] <font color='#5555FF'>=</font><font color='#5555FF'>=</font> NULL<font face='Lucida Console'>)</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_stats[tbl] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>mem<font color='#5555FF'>-</font><font color='#5555FF'>></font>alloc_small<font face='Lucida Console'>)</font>
|
|
<font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>j_common_ptr<font face='Lucida Console'>)</font> cinfo, JPOOL_IMAGE, DC_STAT_BINS<font face='Lucida Console'>)</font>;
|
|
<font color='#BB00BB'>MEMZERO</font><font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_stats[tbl], DC_STAT_BINS<font face='Lucida Console'>)</font>;
|
|
<font color='#009900'>/* Initialize DC predictions to 0 */</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>last_dc_val[ci] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_context[ci] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
|
|
<b>}</b>
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#5555FF'>!</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>progressive_mode <font color='#5555FF'>&</font><font color='#5555FF'>&</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>lim_Se<font face='Lucida Console'>)</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font>
|
|
<font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>progressive_mode <font color='#5555FF'>&</font><font color='#5555FF'>&</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>Ss<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
tbl <font color='#5555FF'>=</font> compptr<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_tbl_no;
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>tbl <font color='#5555FF'><</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> tbl <font color='#5555FF'>></font><font color='#5555FF'>=</font> NUM_ARITH_TBLS<font face='Lucida Console'>)</font>
|
|
<font color='#BB00BB'>ERREXIT1</font><font face='Lucida Console'>(</font>cinfo, JERR_NO_ARITH_TABLE, tbl<font face='Lucida Console'>)</font>;
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_stats[tbl] <font color='#5555FF'>=</font><font color='#5555FF'>=</font> NULL<font face='Lucida Console'>)</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_stats[tbl] <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>mem<font color='#5555FF'>-</font><font color='#5555FF'>></font>alloc_small<font face='Lucida Console'>)</font>
|
|
<font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>j_common_ptr<font face='Lucida Console'>)</font> cinfo, JPOOL_IMAGE, AC_STAT_BINS<font face='Lucida Console'>)</font>;
|
|
<font color='#BB00BB'>MEMZERO</font><font face='Lucida Console'>(</font>entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_stats[tbl], AC_STAT_BINS<font face='Lucida Console'>)</font>;
|
|
<b>}</b>
|
|
<b>}</b>
|
|
|
|
<font color='#009900'>/* Initialize arithmetic decoding variables */</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>c <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>a <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ct <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>16</font>; <font color='#009900'>/* force reading 2 initial bytes to fill C */</font>
|
|
|
|
<font color='#009900'>/* Initialize restart counter */</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>restarts_to_go <font color='#5555FF'>=</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>restart_interval;
|
|
<b>}</b>
|
|
|
|
|
|
<font color='#009900'>/*
|
|
* Module initialization routine for arithmetic entropy decoding.
|
|
*/</font>
|
|
|
|
<b><a name='GLOBAL'></a>GLOBAL</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font>
|
|
<b><a name='jinit_arith_decoder'></a>jinit_arith_decoder</b> <font face='Lucida Console'>(</font>j_decompress_ptr cinfo<font face='Lucida Console'>)</font>
|
|
<b>{</b>
|
|
arith_entropy_ptr entropy;
|
|
<font color='#0000FF'><u>int</u></font> i;
|
|
|
|
entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>arith_entropy_ptr<font face='Lucida Console'>)</font>
|
|
<font face='Lucida Console'>(</font><font color='#5555FF'>*</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>mem<font color='#5555FF'>-</font><font color='#5555FF'>></font>alloc_small<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>j_common_ptr<font face='Lucida Console'>)</font> cinfo, JPOOL_IMAGE,
|
|
<font color='#BB00BB'>SIZEOF</font><font face='Lucida Console'>(</font>arith_entropy_decoder<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
|
|
cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>entropy <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>struct</font> jpeg_entropy_decoder <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> entropy;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>pub.start_pass <font color='#5555FF'>=</font> start_pass;
|
|
|
|
<font color='#009900'>/* Mark tables unallocated */</font>
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'><</font> NUM_ARITH_TBLS; i<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>dc_stats[i] <font color='#5555FF'>=</font> NULL;
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>ac_stats[i] <font color='#5555FF'>=</font> NULL;
|
|
<b>}</b>
|
|
|
|
<font color='#009900'>/* Initialize index for fixed probability estimation */</font>
|
|
entropy<font color='#5555FF'>-</font><font color='#5555FF'>></font>fixed_bin[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font color='#979000'>113</font>;
|
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>progressive_mode<font face='Lucida Console'>)</font> <b>{</b>
|
|
<font color='#009900'>/* Create progression status table */</font>
|
|
<font color='#0000FF'><u>int</u></font> <font color='#5555FF'>*</font>coef_bit_ptr, ci;
|
|
cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>coef_bits <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font face='Lucida Console'>)</font>[DCTSIZE2]<font face='Lucida Console'>)</font>
|
|
<font face='Lucida Console'>(</font><font color='#5555FF'>*</font>cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>mem<font color='#5555FF'>-</font><font color='#5555FF'>></font>alloc_small<font face='Lucida Console'>)</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>j_common_ptr<font face='Lucida Console'>)</font> cinfo, JPOOL_IMAGE,
|
|
cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>num_components<font color='#5555FF'>*</font>DCTSIZE2<font color='#5555FF'>*</font><font color='#BB00BB'>SIZEOF</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
|
|
coef_bit_ptr <font color='#5555FF'>=</font> <font color='#5555FF'>&</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>coef_bits[<font color='#979000'>0</font>][<font color='#979000'>0</font>];
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>ci <font color='#5555FF'>=</font> <font color='#979000'>0</font>; ci <font color='#5555FF'><</font> cinfo<font color='#5555FF'>-</font><font color='#5555FF'>></font>num_components; ci<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font>
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'><</font> DCTSIZE2; i<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font>
|
|
<font color='#5555FF'>*</font>coef_bit_ptr<font color='#5555FF'>+</font><font color='#5555FF'>+</font> <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>;
|
|
<b>}</b>
|
|
<b>}</b>
|
|
|
|
</pre></body></html> |