1*dfc6aa5cSAndroid Build Coastguard Worker /*
2*dfc6aa5cSAndroid Build Coastguard Worker * jcarith.c
3*dfc6aa5cSAndroid Build Coastguard Worker *
4*dfc6aa5cSAndroid Build Coastguard Worker * This file was part of the Independent JPEG Group's software:
5*dfc6aa5cSAndroid Build Coastguard Worker * Developed 1997-2009 by Guido Vollbeding.
6*dfc6aa5cSAndroid Build Coastguard Worker * libjpeg-turbo Modifications:
7*dfc6aa5cSAndroid Build Coastguard Worker * Copyright (C) 2015, 2018, 2021-2022, D. R. Commander.
8*dfc6aa5cSAndroid Build Coastguard Worker * For conditions of distribution and use, see the accompanying README.ijg
9*dfc6aa5cSAndroid Build Coastguard Worker * file.
10*dfc6aa5cSAndroid Build Coastguard Worker *
11*dfc6aa5cSAndroid Build Coastguard Worker * This file contains portable arithmetic entropy encoding routines for JPEG
12*dfc6aa5cSAndroid Build Coastguard Worker * (implementing Recommendation ITU-T T.81 | ISO/IEC 10918-1).
13*dfc6aa5cSAndroid Build Coastguard Worker *
14*dfc6aa5cSAndroid Build Coastguard Worker * Both sequential and progressive modes are supported in this single module.
15*dfc6aa5cSAndroid Build Coastguard Worker *
16*dfc6aa5cSAndroid Build Coastguard Worker * Suspension is not currently supported in this module.
17*dfc6aa5cSAndroid Build Coastguard Worker *
18*dfc6aa5cSAndroid Build Coastguard Worker * NOTE: All referenced figures are from
19*dfc6aa5cSAndroid Build Coastguard Worker * Recommendation ITU-T T.81 (1992) | ISO/IEC 10918-1:1994.
20*dfc6aa5cSAndroid Build Coastguard Worker */
21*dfc6aa5cSAndroid Build Coastguard Worker
22*dfc6aa5cSAndroid Build Coastguard Worker #define JPEG_INTERNALS
23*dfc6aa5cSAndroid Build Coastguard Worker #include "jinclude.h"
24*dfc6aa5cSAndroid Build Coastguard Worker #include "jpeglib.h"
25*dfc6aa5cSAndroid Build Coastguard Worker
26*dfc6aa5cSAndroid Build Coastguard Worker
27*dfc6aa5cSAndroid Build Coastguard Worker /* Expanded entropy encoder object for arithmetic encoding. */
28*dfc6aa5cSAndroid Build Coastguard Worker
29*dfc6aa5cSAndroid Build Coastguard Worker typedef struct {
30*dfc6aa5cSAndroid Build Coastguard Worker struct jpeg_entropy_encoder pub; /* public fields */
31*dfc6aa5cSAndroid Build Coastguard Worker
32*dfc6aa5cSAndroid Build Coastguard Worker JLONG c; /* C register, base of coding interval, layout as in sec. D.1.3 */
33*dfc6aa5cSAndroid Build Coastguard Worker JLONG a; /* A register, normalized size of coding interval */
34*dfc6aa5cSAndroid Build Coastguard Worker JLONG sc; /* counter for stacked 0xFF values which might overflow */
35*dfc6aa5cSAndroid Build Coastguard Worker JLONG zc; /* counter for pending 0x00 output values which might *
36*dfc6aa5cSAndroid Build Coastguard Worker * be discarded at the end ("Pacman" termination) */
37*dfc6aa5cSAndroid Build Coastguard Worker int ct; /* bit shift counter, determines when next byte will be written */
38*dfc6aa5cSAndroid Build Coastguard Worker int buffer; /* buffer for most recent output byte != 0xFF */
39*dfc6aa5cSAndroid Build Coastguard Worker
40*dfc6aa5cSAndroid Build Coastguard Worker int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
41*dfc6aa5cSAndroid Build Coastguard Worker int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */
42*dfc6aa5cSAndroid Build Coastguard Worker
43*dfc6aa5cSAndroid Build Coastguard Worker unsigned int restarts_to_go; /* MCUs left in this restart interval */
44*dfc6aa5cSAndroid Build Coastguard Worker int next_restart_num; /* next restart number to write (0-7) */
45*dfc6aa5cSAndroid Build Coastguard Worker
46*dfc6aa5cSAndroid Build Coastguard Worker /* Pointers to statistics areas (these workspaces have image lifespan) */
47*dfc6aa5cSAndroid Build Coastguard Worker unsigned char *dc_stats[NUM_ARITH_TBLS];
48*dfc6aa5cSAndroid Build Coastguard Worker unsigned char *ac_stats[NUM_ARITH_TBLS];
49*dfc6aa5cSAndroid Build Coastguard Worker
50*dfc6aa5cSAndroid Build Coastguard Worker /* Statistics bin for coding with fixed probability 0.5 */
51*dfc6aa5cSAndroid Build Coastguard Worker unsigned char fixed_bin[4];
52*dfc6aa5cSAndroid Build Coastguard Worker } arith_entropy_encoder;
53*dfc6aa5cSAndroid Build Coastguard Worker
54*dfc6aa5cSAndroid Build Coastguard Worker typedef arith_entropy_encoder *arith_entropy_ptr;
55*dfc6aa5cSAndroid Build Coastguard Worker
56*dfc6aa5cSAndroid Build Coastguard Worker /* The following two definitions specify the allocation chunk size
57*dfc6aa5cSAndroid Build Coastguard Worker * for the statistics area.
58*dfc6aa5cSAndroid Build Coastguard Worker * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least
59*dfc6aa5cSAndroid Build Coastguard Worker * 49 statistics bins for DC, and 245 statistics bins for AC coding.
60*dfc6aa5cSAndroid Build Coastguard Worker *
61*dfc6aa5cSAndroid Build Coastguard Worker * We use a compact representation with 1 byte per statistics bin,
62*dfc6aa5cSAndroid Build Coastguard Worker * thus the numbers directly represent byte sizes.
63*dfc6aa5cSAndroid Build Coastguard Worker * This 1 byte per statistics bin contains the meaning of the MPS
64*dfc6aa5cSAndroid Build Coastguard Worker * (more probable symbol) in the highest bit (mask 0x80), and the
65*dfc6aa5cSAndroid Build Coastguard Worker * index into the probability estimation state machine table
66*dfc6aa5cSAndroid Build Coastguard Worker * in the lower bits (mask 0x7F).
67*dfc6aa5cSAndroid Build Coastguard Worker */
68*dfc6aa5cSAndroid Build Coastguard Worker
69*dfc6aa5cSAndroid Build Coastguard Worker #define DC_STAT_BINS 64
70*dfc6aa5cSAndroid Build Coastguard Worker #define AC_STAT_BINS 256
71*dfc6aa5cSAndroid Build Coastguard Worker
72*dfc6aa5cSAndroid Build Coastguard Worker /* NOTE: Uncomment the following #define if you want to use the
73*dfc6aa5cSAndroid Build Coastguard Worker * given formula for calculating the AC conditioning parameter Kx
74*dfc6aa5cSAndroid Build Coastguard Worker * for spectral selection progressive coding in section G.1.3.2
75*dfc6aa5cSAndroid Build Coastguard Worker * of the spec (Kx = Kmin + SRL (8 + Se - Kmin) 4).
76*dfc6aa5cSAndroid Build Coastguard Worker * Although the spec and P&M authors claim that this "has proven
77*dfc6aa5cSAndroid Build Coastguard Worker * to give good results for 8 bit precision samples", I'm not
78*dfc6aa5cSAndroid Build Coastguard Worker * convinced yet that this is really beneficial.
79*dfc6aa5cSAndroid Build Coastguard Worker * Early tests gave only very marginal compression enhancements
80*dfc6aa5cSAndroid Build Coastguard Worker * (a few - around 5 or so - bytes even for very large files),
81*dfc6aa5cSAndroid Build Coastguard Worker * which would turn out rather negative if we'd suppress the
82*dfc6aa5cSAndroid Build Coastguard Worker * DAC (Define Arithmetic Conditioning) marker segments for
83*dfc6aa5cSAndroid Build Coastguard Worker * the default parameters in the future.
84*dfc6aa5cSAndroid Build Coastguard Worker * Note that currently the marker writing module emits 12-byte
85*dfc6aa5cSAndroid Build Coastguard Worker * DAC segments for a full-component scan in a color image.
86*dfc6aa5cSAndroid Build Coastguard Worker * This is not worth worrying about IMHO. However, since the
87*dfc6aa5cSAndroid Build Coastguard Worker * spec defines the default values to be used if the tables
88*dfc6aa5cSAndroid Build Coastguard Worker * are omitted (unlike Huffman tables, which are required
89*dfc6aa5cSAndroid Build Coastguard Worker * anyway), one might optimize this behaviour in the future,
90*dfc6aa5cSAndroid Build Coastguard Worker * and then it would be disadvantageous to use custom tables if
91*dfc6aa5cSAndroid Build Coastguard Worker * they don't provide sufficient gain to exceed the DAC size.
92*dfc6aa5cSAndroid Build Coastguard Worker *
93*dfc6aa5cSAndroid Build Coastguard Worker * On the other hand, I'd consider it as a reasonable result
94*dfc6aa5cSAndroid Build Coastguard Worker * that the conditioning has no significant influence on the
95*dfc6aa5cSAndroid Build Coastguard Worker * compression performance. This means that the basic
96*dfc6aa5cSAndroid Build Coastguard Worker * statistical model is already rather stable.
97*dfc6aa5cSAndroid Build Coastguard Worker *
98*dfc6aa5cSAndroid Build Coastguard Worker * Thus, at the moment, we use the default conditioning values
99*dfc6aa5cSAndroid Build Coastguard Worker * anyway, and do not use the custom formula.
100*dfc6aa5cSAndroid Build Coastguard Worker *
101*dfc6aa5cSAndroid Build Coastguard Worker #define CALCULATE_SPECTRAL_CONDITIONING
102*dfc6aa5cSAndroid Build Coastguard Worker */
103*dfc6aa5cSAndroid Build Coastguard Worker
104*dfc6aa5cSAndroid Build Coastguard Worker /* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than JLONG.
105*dfc6aa5cSAndroid Build Coastguard Worker * We assume that int right shift is unsigned if JLONG right shift is,
106*dfc6aa5cSAndroid Build Coastguard Worker * which should be safe.
107*dfc6aa5cSAndroid Build Coastguard Worker */
108*dfc6aa5cSAndroid Build Coastguard Worker
109*dfc6aa5cSAndroid Build Coastguard Worker #ifdef RIGHT_SHIFT_IS_UNSIGNED
110*dfc6aa5cSAndroid Build Coastguard Worker #define ISHIFT_TEMPS int ishift_temp;
111*dfc6aa5cSAndroid Build Coastguard Worker #define IRIGHT_SHIFT(x, shft) \
112*dfc6aa5cSAndroid Build Coastguard Worker ((ishift_temp = (x)) < 0 ? \
113*dfc6aa5cSAndroid Build Coastguard Worker (ishift_temp >> (shft)) | ((~0) << (16 - (shft))) : \
114*dfc6aa5cSAndroid Build Coastguard Worker (ishift_temp >> (shft)))
115*dfc6aa5cSAndroid Build Coastguard Worker #else
116*dfc6aa5cSAndroid Build Coastguard Worker #define ISHIFT_TEMPS
117*dfc6aa5cSAndroid Build Coastguard Worker #define IRIGHT_SHIFT(x, shft) ((x) >> (shft))
118*dfc6aa5cSAndroid Build Coastguard Worker #endif
119*dfc6aa5cSAndroid Build Coastguard Worker
120*dfc6aa5cSAndroid Build Coastguard Worker
121*dfc6aa5cSAndroid Build Coastguard Worker LOCAL(void)
emit_byte(int val,j_compress_ptr cinfo)122*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(int val, j_compress_ptr cinfo)
123*dfc6aa5cSAndroid Build Coastguard Worker /* Write next output byte; we do not support suspension in this module. */
124*dfc6aa5cSAndroid Build Coastguard Worker {
125*dfc6aa5cSAndroid Build Coastguard Worker struct jpeg_destination_mgr *dest = cinfo->dest;
126*dfc6aa5cSAndroid Build Coastguard Worker
127*dfc6aa5cSAndroid Build Coastguard Worker *dest->next_output_byte++ = (JOCTET)val;
128*dfc6aa5cSAndroid Build Coastguard Worker if (--dest->free_in_buffer == 0)
129*dfc6aa5cSAndroid Build Coastguard Worker if (!(*dest->empty_output_buffer) (cinfo))
130*dfc6aa5cSAndroid Build Coastguard Worker ERREXIT(cinfo, JERR_CANT_SUSPEND);
131*dfc6aa5cSAndroid Build Coastguard Worker }
132*dfc6aa5cSAndroid Build Coastguard Worker
133*dfc6aa5cSAndroid Build Coastguard Worker
134*dfc6aa5cSAndroid Build Coastguard Worker /*
135*dfc6aa5cSAndroid Build Coastguard Worker * Finish up at the end of an arithmetic-compressed scan.
136*dfc6aa5cSAndroid Build Coastguard Worker */
137*dfc6aa5cSAndroid Build Coastguard Worker
138*dfc6aa5cSAndroid Build Coastguard Worker METHODDEF(void)
finish_pass(j_compress_ptr cinfo)139*dfc6aa5cSAndroid Build Coastguard Worker finish_pass(j_compress_ptr cinfo)
140*dfc6aa5cSAndroid Build Coastguard Worker {
141*dfc6aa5cSAndroid Build Coastguard Worker arith_entropy_ptr e = (arith_entropy_ptr)cinfo->entropy;
142*dfc6aa5cSAndroid Build Coastguard Worker JLONG temp;
143*dfc6aa5cSAndroid Build Coastguard Worker
144*dfc6aa5cSAndroid Build Coastguard Worker /* Section D.1.8: Termination of encoding */
145*dfc6aa5cSAndroid Build Coastguard Worker
146*dfc6aa5cSAndroid Build Coastguard Worker /* Find the e->c in the coding interval with the largest
147*dfc6aa5cSAndroid Build Coastguard Worker * number of trailing zero bits */
148*dfc6aa5cSAndroid Build Coastguard Worker if ((temp = (e->a - 1 + e->c) & 0xFFFF0000UL) < e->c)
149*dfc6aa5cSAndroid Build Coastguard Worker e->c = temp + 0x8000L;
150*dfc6aa5cSAndroid Build Coastguard Worker else
151*dfc6aa5cSAndroid Build Coastguard Worker e->c = temp;
152*dfc6aa5cSAndroid Build Coastguard Worker /* Send remaining bytes to output */
153*dfc6aa5cSAndroid Build Coastguard Worker e->c <<= e->ct;
154*dfc6aa5cSAndroid Build Coastguard Worker if (e->c & 0xF8000000UL) {
155*dfc6aa5cSAndroid Build Coastguard Worker /* One final overflow has to be handled */
156*dfc6aa5cSAndroid Build Coastguard Worker if (e->buffer >= 0) {
157*dfc6aa5cSAndroid Build Coastguard Worker if (e->zc)
158*dfc6aa5cSAndroid Build Coastguard Worker do emit_byte(0x00, cinfo);
159*dfc6aa5cSAndroid Build Coastguard Worker while (--e->zc);
160*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(e->buffer + 1, cinfo);
161*dfc6aa5cSAndroid Build Coastguard Worker if (e->buffer + 1 == 0xFF)
162*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(0x00, cinfo);
163*dfc6aa5cSAndroid Build Coastguard Worker }
164*dfc6aa5cSAndroid Build Coastguard Worker e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */
165*dfc6aa5cSAndroid Build Coastguard Worker e->sc = 0;
166*dfc6aa5cSAndroid Build Coastguard Worker } else {
167*dfc6aa5cSAndroid Build Coastguard Worker if (e->buffer == 0)
168*dfc6aa5cSAndroid Build Coastguard Worker ++e->zc;
169*dfc6aa5cSAndroid Build Coastguard Worker else if (e->buffer >= 0) {
170*dfc6aa5cSAndroid Build Coastguard Worker if (e->zc)
171*dfc6aa5cSAndroid Build Coastguard Worker do emit_byte(0x00, cinfo);
172*dfc6aa5cSAndroid Build Coastguard Worker while (--e->zc);
173*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(e->buffer, cinfo);
174*dfc6aa5cSAndroid Build Coastguard Worker }
175*dfc6aa5cSAndroid Build Coastguard Worker if (e->sc) {
176*dfc6aa5cSAndroid Build Coastguard Worker if (e->zc)
177*dfc6aa5cSAndroid Build Coastguard Worker do emit_byte(0x00, cinfo);
178*dfc6aa5cSAndroid Build Coastguard Worker while (--e->zc);
179*dfc6aa5cSAndroid Build Coastguard Worker do {
180*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(0xFF, cinfo);
181*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(0x00, cinfo);
182*dfc6aa5cSAndroid Build Coastguard Worker } while (--e->sc);
183*dfc6aa5cSAndroid Build Coastguard Worker }
184*dfc6aa5cSAndroid Build Coastguard Worker }
185*dfc6aa5cSAndroid Build Coastguard Worker /* Output final bytes only if they are not 0x00 */
186*dfc6aa5cSAndroid Build Coastguard Worker if (e->c & 0x7FFF800L) {
187*dfc6aa5cSAndroid Build Coastguard Worker if (e->zc) /* output final pending zero bytes */
188*dfc6aa5cSAndroid Build Coastguard Worker do emit_byte(0x00, cinfo);
189*dfc6aa5cSAndroid Build Coastguard Worker while (--e->zc);
190*dfc6aa5cSAndroid Build Coastguard Worker emit_byte((e->c >> 19) & 0xFF, cinfo);
191*dfc6aa5cSAndroid Build Coastguard Worker if (((e->c >> 19) & 0xFF) == 0xFF)
192*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(0x00, cinfo);
193*dfc6aa5cSAndroid Build Coastguard Worker if (e->c & 0x7F800L) {
194*dfc6aa5cSAndroid Build Coastguard Worker emit_byte((e->c >> 11) & 0xFF, cinfo);
195*dfc6aa5cSAndroid Build Coastguard Worker if (((e->c >> 11) & 0xFF) == 0xFF)
196*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(0x00, cinfo);
197*dfc6aa5cSAndroid Build Coastguard Worker }
198*dfc6aa5cSAndroid Build Coastguard Worker }
199*dfc6aa5cSAndroid Build Coastguard Worker }
200*dfc6aa5cSAndroid Build Coastguard Worker
201*dfc6aa5cSAndroid Build Coastguard Worker
202*dfc6aa5cSAndroid Build Coastguard Worker /*
203*dfc6aa5cSAndroid Build Coastguard Worker * The core arithmetic encoding routine (common in JPEG and JBIG).
204*dfc6aa5cSAndroid Build Coastguard Worker * This needs to go as fast as possible.
205*dfc6aa5cSAndroid Build Coastguard Worker * Machine-dependent optimization facilities
206*dfc6aa5cSAndroid Build Coastguard Worker * are not utilized in this portable implementation.
207*dfc6aa5cSAndroid Build Coastguard Worker * However, this code should be fairly efficient and
208*dfc6aa5cSAndroid Build Coastguard Worker * may be a good base for further optimizations anyway.
209*dfc6aa5cSAndroid Build Coastguard Worker *
210*dfc6aa5cSAndroid Build Coastguard Worker * Parameter 'val' to be encoded may be 0 or 1 (binary decision).
211*dfc6aa5cSAndroid Build Coastguard Worker *
212*dfc6aa5cSAndroid Build Coastguard Worker * Note: I've added full "Pacman" termination support to the
213*dfc6aa5cSAndroid Build Coastguard Worker * byte output routines, which is equivalent to the optional
214*dfc6aa5cSAndroid Build Coastguard Worker * Discard_final_zeros procedure (Figure D.15) in the spec.
215*dfc6aa5cSAndroid Build Coastguard Worker * Thus, we always produce the shortest possible output
216*dfc6aa5cSAndroid Build Coastguard Worker * stream compliant to the spec (no trailing zero bytes,
217*dfc6aa5cSAndroid Build Coastguard Worker * except for FF stuffing).
218*dfc6aa5cSAndroid Build Coastguard Worker *
219*dfc6aa5cSAndroid Build Coastguard Worker * I've also introduced a new scheme for accessing
220*dfc6aa5cSAndroid Build Coastguard Worker * the probability estimation state machine table,
221*dfc6aa5cSAndroid Build Coastguard Worker * derived from Markus Kuhn's JBIG implementation.
222*dfc6aa5cSAndroid Build Coastguard Worker */
223*dfc6aa5cSAndroid Build Coastguard Worker
224*dfc6aa5cSAndroid Build Coastguard Worker LOCAL(void)
arith_encode(j_compress_ptr cinfo,unsigned char * st,int val)225*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(j_compress_ptr cinfo, unsigned char *st, int val)
226*dfc6aa5cSAndroid Build Coastguard Worker {
227*dfc6aa5cSAndroid Build Coastguard Worker register arith_entropy_ptr e = (arith_entropy_ptr)cinfo->entropy;
228*dfc6aa5cSAndroid Build Coastguard Worker register unsigned char nl, nm;
229*dfc6aa5cSAndroid Build Coastguard Worker register JLONG qe, temp;
230*dfc6aa5cSAndroid Build Coastguard Worker register int sv;
231*dfc6aa5cSAndroid Build Coastguard Worker
232*dfc6aa5cSAndroid Build Coastguard Worker /* Fetch values from our compact representation of Table D.2:
233*dfc6aa5cSAndroid Build Coastguard Worker * Qe values and probability estimation state machine
234*dfc6aa5cSAndroid Build Coastguard Worker */
235*dfc6aa5cSAndroid Build Coastguard Worker sv = *st;
236*dfc6aa5cSAndroid Build Coastguard Worker qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */
237*dfc6aa5cSAndroid Build Coastguard Worker nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */
238*dfc6aa5cSAndroid Build Coastguard Worker nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */
239*dfc6aa5cSAndroid Build Coastguard Worker
240*dfc6aa5cSAndroid Build Coastguard Worker /* Encode & estimation procedures per sections D.1.4 & D.1.5 */
241*dfc6aa5cSAndroid Build Coastguard Worker e->a -= qe;
242*dfc6aa5cSAndroid Build Coastguard Worker if (val != (sv >> 7)) {
243*dfc6aa5cSAndroid Build Coastguard Worker /* Encode the less probable symbol */
244*dfc6aa5cSAndroid Build Coastguard Worker if (e->a >= qe) {
245*dfc6aa5cSAndroid Build Coastguard Worker /* If the interval size (qe) for the less probable symbol (LPS)
246*dfc6aa5cSAndroid Build Coastguard Worker * is larger than the interval size for the MPS, then exchange
247*dfc6aa5cSAndroid Build Coastguard Worker * the two symbols for coding efficiency, otherwise code the LPS
248*dfc6aa5cSAndroid Build Coastguard Worker * as usual: */
249*dfc6aa5cSAndroid Build Coastguard Worker e->c += e->a;
250*dfc6aa5cSAndroid Build Coastguard Worker e->a = qe;
251*dfc6aa5cSAndroid Build Coastguard Worker }
252*dfc6aa5cSAndroid Build Coastguard Worker *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */
253*dfc6aa5cSAndroid Build Coastguard Worker } else {
254*dfc6aa5cSAndroid Build Coastguard Worker /* Encode the more probable symbol */
255*dfc6aa5cSAndroid Build Coastguard Worker if (e->a >= 0x8000L)
256*dfc6aa5cSAndroid Build Coastguard Worker return; /* A >= 0x8000 -> ready, no renormalization required */
257*dfc6aa5cSAndroid Build Coastguard Worker if (e->a < qe) {
258*dfc6aa5cSAndroid Build Coastguard Worker /* If the interval size (qe) for the less probable symbol (LPS)
259*dfc6aa5cSAndroid Build Coastguard Worker * is larger than the interval size for the MPS, then exchange
260*dfc6aa5cSAndroid Build Coastguard Worker * the two symbols for coding efficiency: */
261*dfc6aa5cSAndroid Build Coastguard Worker e->c += e->a;
262*dfc6aa5cSAndroid Build Coastguard Worker e->a = qe;
263*dfc6aa5cSAndroid Build Coastguard Worker }
264*dfc6aa5cSAndroid Build Coastguard Worker *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */
265*dfc6aa5cSAndroid Build Coastguard Worker }
266*dfc6aa5cSAndroid Build Coastguard Worker
267*dfc6aa5cSAndroid Build Coastguard Worker /* Renormalization & data output per section D.1.6 */
268*dfc6aa5cSAndroid Build Coastguard Worker do {
269*dfc6aa5cSAndroid Build Coastguard Worker e->a <<= 1;
270*dfc6aa5cSAndroid Build Coastguard Worker e->c <<= 1;
271*dfc6aa5cSAndroid Build Coastguard Worker if (--e->ct == 0) {
272*dfc6aa5cSAndroid Build Coastguard Worker /* Another byte is ready for output */
273*dfc6aa5cSAndroid Build Coastguard Worker temp = e->c >> 19;
274*dfc6aa5cSAndroid Build Coastguard Worker if (temp > 0xFF) {
275*dfc6aa5cSAndroid Build Coastguard Worker /* Handle overflow over all stacked 0xFF bytes */
276*dfc6aa5cSAndroid Build Coastguard Worker if (e->buffer >= 0) {
277*dfc6aa5cSAndroid Build Coastguard Worker if (e->zc)
278*dfc6aa5cSAndroid Build Coastguard Worker do emit_byte(0x00, cinfo);
279*dfc6aa5cSAndroid Build Coastguard Worker while (--e->zc);
280*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(e->buffer + 1, cinfo);
281*dfc6aa5cSAndroid Build Coastguard Worker if (e->buffer + 1 == 0xFF)
282*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(0x00, cinfo);
283*dfc6aa5cSAndroid Build Coastguard Worker }
284*dfc6aa5cSAndroid Build Coastguard Worker e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */
285*dfc6aa5cSAndroid Build Coastguard Worker e->sc = 0;
286*dfc6aa5cSAndroid Build Coastguard Worker /* Note: The 3 spacer bits in the C register guarantee
287*dfc6aa5cSAndroid Build Coastguard Worker * that the new buffer byte can't be 0xFF here
288*dfc6aa5cSAndroid Build Coastguard Worker * (see page 160 in the P&M JPEG book). */
289*dfc6aa5cSAndroid Build Coastguard Worker e->buffer = temp & 0xFF; /* new output byte, might overflow later */
290*dfc6aa5cSAndroid Build Coastguard Worker } else if (temp == 0xFF) {
291*dfc6aa5cSAndroid Build Coastguard Worker ++e->sc; /* stack 0xFF byte (which might overflow later) */
292*dfc6aa5cSAndroid Build Coastguard Worker } else {
293*dfc6aa5cSAndroid Build Coastguard Worker /* Output all stacked 0xFF bytes, they will not overflow any more */
294*dfc6aa5cSAndroid Build Coastguard Worker if (e->buffer == 0)
295*dfc6aa5cSAndroid Build Coastguard Worker ++e->zc;
296*dfc6aa5cSAndroid Build Coastguard Worker else if (e->buffer >= 0) {
297*dfc6aa5cSAndroid Build Coastguard Worker if (e->zc)
298*dfc6aa5cSAndroid Build Coastguard Worker do emit_byte(0x00, cinfo);
299*dfc6aa5cSAndroid Build Coastguard Worker while (--e->zc);
300*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(e->buffer, cinfo);
301*dfc6aa5cSAndroid Build Coastguard Worker }
302*dfc6aa5cSAndroid Build Coastguard Worker if (e->sc) {
303*dfc6aa5cSAndroid Build Coastguard Worker if (e->zc)
304*dfc6aa5cSAndroid Build Coastguard Worker do emit_byte(0x00, cinfo);
305*dfc6aa5cSAndroid Build Coastguard Worker while (--e->zc);
306*dfc6aa5cSAndroid Build Coastguard Worker do {
307*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(0xFF, cinfo);
308*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(0x00, cinfo);
309*dfc6aa5cSAndroid Build Coastguard Worker } while (--e->sc);
310*dfc6aa5cSAndroid Build Coastguard Worker }
311*dfc6aa5cSAndroid Build Coastguard Worker e->buffer = temp & 0xFF; /* new output byte (can still overflow) */
312*dfc6aa5cSAndroid Build Coastguard Worker }
313*dfc6aa5cSAndroid Build Coastguard Worker e->c &= 0x7FFFFL;
314*dfc6aa5cSAndroid Build Coastguard Worker e->ct += 8;
315*dfc6aa5cSAndroid Build Coastguard Worker }
316*dfc6aa5cSAndroid Build Coastguard Worker } while (e->a < 0x8000L);
317*dfc6aa5cSAndroid Build Coastguard Worker }
318*dfc6aa5cSAndroid Build Coastguard Worker
319*dfc6aa5cSAndroid Build Coastguard Worker
320*dfc6aa5cSAndroid Build Coastguard Worker /*
321*dfc6aa5cSAndroid Build Coastguard Worker * Emit a restart marker & resynchronize predictions.
322*dfc6aa5cSAndroid Build Coastguard Worker */
323*dfc6aa5cSAndroid Build Coastguard Worker
324*dfc6aa5cSAndroid Build Coastguard Worker LOCAL(void)
emit_restart(j_compress_ptr cinfo,int restart_num)325*dfc6aa5cSAndroid Build Coastguard Worker emit_restart(j_compress_ptr cinfo, int restart_num)
326*dfc6aa5cSAndroid Build Coastguard Worker {
327*dfc6aa5cSAndroid Build Coastguard Worker arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
328*dfc6aa5cSAndroid Build Coastguard Worker int ci;
329*dfc6aa5cSAndroid Build Coastguard Worker jpeg_component_info *compptr;
330*dfc6aa5cSAndroid Build Coastguard Worker
331*dfc6aa5cSAndroid Build Coastguard Worker finish_pass(cinfo);
332*dfc6aa5cSAndroid Build Coastguard Worker
333*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(0xFF, cinfo);
334*dfc6aa5cSAndroid Build Coastguard Worker emit_byte(JPEG_RST0 + restart_num, cinfo);
335*dfc6aa5cSAndroid Build Coastguard Worker
336*dfc6aa5cSAndroid Build Coastguard Worker /* Re-initialize statistics areas */
337*dfc6aa5cSAndroid Build Coastguard Worker for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
338*dfc6aa5cSAndroid Build Coastguard Worker compptr = cinfo->cur_comp_info[ci];
339*dfc6aa5cSAndroid Build Coastguard Worker /* DC needs no table for refinement scan */
340*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
341*dfc6aa5cSAndroid Build Coastguard Worker memset(entropy->dc_stats[compptr->dc_tbl_no], 0, DC_STAT_BINS);
342*dfc6aa5cSAndroid Build Coastguard Worker /* Reset DC predictions to 0 */
343*dfc6aa5cSAndroid Build Coastguard Worker entropy->last_dc_val[ci] = 0;
344*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_context[ci] = 0;
345*dfc6aa5cSAndroid Build Coastguard Worker }
346*dfc6aa5cSAndroid Build Coastguard Worker /* AC needs no table when not present */
347*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->progressive_mode == 0 || cinfo->Se) {
348*dfc6aa5cSAndroid Build Coastguard Worker memset(entropy->ac_stats[compptr->ac_tbl_no], 0, AC_STAT_BINS);
349*dfc6aa5cSAndroid Build Coastguard Worker }
350*dfc6aa5cSAndroid Build Coastguard Worker }
351*dfc6aa5cSAndroid Build Coastguard Worker
352*dfc6aa5cSAndroid Build Coastguard Worker /* Reset arithmetic encoding variables */
353*dfc6aa5cSAndroid Build Coastguard Worker entropy->c = 0;
354*dfc6aa5cSAndroid Build Coastguard Worker entropy->a = 0x10000L;
355*dfc6aa5cSAndroid Build Coastguard Worker entropy->sc = 0;
356*dfc6aa5cSAndroid Build Coastguard Worker entropy->zc = 0;
357*dfc6aa5cSAndroid Build Coastguard Worker entropy->ct = 11;
358*dfc6aa5cSAndroid Build Coastguard Worker entropy->buffer = -1; /* empty */
359*dfc6aa5cSAndroid Build Coastguard Worker }
360*dfc6aa5cSAndroid Build Coastguard Worker
361*dfc6aa5cSAndroid Build Coastguard Worker
362*dfc6aa5cSAndroid Build Coastguard Worker /*
363*dfc6aa5cSAndroid Build Coastguard Worker * MCU encoding for DC initial scan (either spectral selection,
364*dfc6aa5cSAndroid Build Coastguard Worker * or first pass of successive approximation).
365*dfc6aa5cSAndroid Build Coastguard Worker */
366*dfc6aa5cSAndroid Build Coastguard Worker
367*dfc6aa5cSAndroid Build Coastguard Worker METHODDEF(boolean)
encode_mcu_DC_first(j_compress_ptr cinfo,JBLOCKROW * MCU_data)368*dfc6aa5cSAndroid Build Coastguard Worker encode_mcu_DC_first(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
369*dfc6aa5cSAndroid Build Coastguard Worker {
370*dfc6aa5cSAndroid Build Coastguard Worker arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
371*dfc6aa5cSAndroid Build Coastguard Worker JBLOCKROW block;
372*dfc6aa5cSAndroid Build Coastguard Worker unsigned char *st;
373*dfc6aa5cSAndroid Build Coastguard Worker int blkn, ci, tbl;
374*dfc6aa5cSAndroid Build Coastguard Worker int v, v2, m;
375*dfc6aa5cSAndroid Build Coastguard Worker ISHIFT_TEMPS
376*dfc6aa5cSAndroid Build Coastguard Worker
377*dfc6aa5cSAndroid Build Coastguard Worker /* Emit restart marker if needed */
378*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->restart_interval) {
379*dfc6aa5cSAndroid Build Coastguard Worker if (entropy->restarts_to_go == 0) {
380*dfc6aa5cSAndroid Build Coastguard Worker emit_restart(cinfo, entropy->next_restart_num);
381*dfc6aa5cSAndroid Build Coastguard Worker entropy->restarts_to_go = cinfo->restart_interval;
382*dfc6aa5cSAndroid Build Coastguard Worker entropy->next_restart_num++;
383*dfc6aa5cSAndroid Build Coastguard Worker entropy->next_restart_num &= 7;
384*dfc6aa5cSAndroid Build Coastguard Worker }
385*dfc6aa5cSAndroid Build Coastguard Worker entropy->restarts_to_go--;
386*dfc6aa5cSAndroid Build Coastguard Worker }
387*dfc6aa5cSAndroid Build Coastguard Worker
388*dfc6aa5cSAndroid Build Coastguard Worker /* Encode the MCU data blocks */
389*dfc6aa5cSAndroid Build Coastguard Worker for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
390*dfc6aa5cSAndroid Build Coastguard Worker block = MCU_data[blkn];
391*dfc6aa5cSAndroid Build Coastguard Worker ci = cinfo->MCU_membership[blkn];
392*dfc6aa5cSAndroid Build Coastguard Worker tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
393*dfc6aa5cSAndroid Build Coastguard Worker
394*dfc6aa5cSAndroid Build Coastguard Worker /* Compute the DC value after the required point transform by Al.
395*dfc6aa5cSAndroid Build Coastguard Worker * This is simply an arithmetic right shift.
396*dfc6aa5cSAndroid Build Coastguard Worker */
397*dfc6aa5cSAndroid Build Coastguard Worker m = IRIGHT_SHIFT((int)((*block)[0]), cinfo->Al);
398*dfc6aa5cSAndroid Build Coastguard Worker
399*dfc6aa5cSAndroid Build Coastguard Worker /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
400*dfc6aa5cSAndroid Build Coastguard Worker
401*dfc6aa5cSAndroid Build Coastguard Worker /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
402*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
403*dfc6aa5cSAndroid Build Coastguard Worker
404*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.4: Encode_DC_DIFF */
405*dfc6aa5cSAndroid Build Coastguard Worker if ((v = m - entropy->last_dc_val[ci]) == 0) {
406*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 0);
407*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_context[ci] = 0; /* zero diff category */
408*dfc6aa5cSAndroid Build Coastguard Worker } else {
409*dfc6aa5cSAndroid Build Coastguard Worker entropy->last_dc_val[ci] = m;
410*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
411*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.6: Encoding nonzero value v */
412*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.7: Encoding the sign of v */
413*dfc6aa5cSAndroid Build Coastguard Worker if (v > 0) {
414*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
415*dfc6aa5cSAndroid Build Coastguard Worker st += 2; /* Table F.4: SP = S0 + 2 */
416*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_context[ci] = 4; /* small positive diff category */
417*dfc6aa5cSAndroid Build Coastguard Worker } else {
418*dfc6aa5cSAndroid Build Coastguard Worker v = -v;
419*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
420*dfc6aa5cSAndroid Build Coastguard Worker st += 3; /* Table F.4: SN = S0 + 3 */
421*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_context[ci] = 8; /* small negative diff category */
422*dfc6aa5cSAndroid Build Coastguard Worker }
423*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.8: Encoding the magnitude category of v */
424*dfc6aa5cSAndroid Build Coastguard Worker m = 0;
425*dfc6aa5cSAndroid Build Coastguard Worker if (v -= 1) {
426*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
427*dfc6aa5cSAndroid Build Coastguard Worker m = 1;
428*dfc6aa5cSAndroid Build Coastguard Worker v2 = v;
429*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
430*dfc6aa5cSAndroid Build Coastguard Worker while (v2 >>= 1) {
431*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
432*dfc6aa5cSAndroid Build Coastguard Worker m <<= 1;
433*dfc6aa5cSAndroid Build Coastguard Worker st += 1;
434*dfc6aa5cSAndroid Build Coastguard Worker }
435*dfc6aa5cSAndroid Build Coastguard Worker }
436*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 0);
437*dfc6aa5cSAndroid Build Coastguard Worker /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
438*dfc6aa5cSAndroid Build Coastguard Worker if (m < (int)((1L << cinfo->arith_dc_L[tbl]) >> 1))
439*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_context[ci] = 0; /* zero diff category */
440*dfc6aa5cSAndroid Build Coastguard Worker else if (m > (int)((1L << cinfo->arith_dc_U[tbl]) >> 1))
441*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_context[ci] += 8; /* large diff category */
442*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.9: Encoding the magnitude bit pattern of v */
443*dfc6aa5cSAndroid Build Coastguard Worker st += 14;
444*dfc6aa5cSAndroid Build Coastguard Worker while (m >>= 1)
445*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, (m & v) ? 1 : 0);
446*dfc6aa5cSAndroid Build Coastguard Worker }
447*dfc6aa5cSAndroid Build Coastguard Worker }
448*dfc6aa5cSAndroid Build Coastguard Worker
449*dfc6aa5cSAndroid Build Coastguard Worker return TRUE;
450*dfc6aa5cSAndroid Build Coastguard Worker }
451*dfc6aa5cSAndroid Build Coastguard Worker
452*dfc6aa5cSAndroid Build Coastguard Worker
453*dfc6aa5cSAndroid Build Coastguard Worker /*
454*dfc6aa5cSAndroid Build Coastguard Worker * MCU encoding for AC initial scan (either spectral selection,
455*dfc6aa5cSAndroid Build Coastguard Worker * or first pass of successive approximation).
456*dfc6aa5cSAndroid Build Coastguard Worker */
457*dfc6aa5cSAndroid Build Coastguard Worker
458*dfc6aa5cSAndroid Build Coastguard Worker METHODDEF(boolean)
encode_mcu_AC_first(j_compress_ptr cinfo,JBLOCKROW * MCU_data)459*dfc6aa5cSAndroid Build Coastguard Worker encode_mcu_AC_first(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
460*dfc6aa5cSAndroid Build Coastguard Worker {
461*dfc6aa5cSAndroid Build Coastguard Worker arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
462*dfc6aa5cSAndroid Build Coastguard Worker JBLOCKROW block;
463*dfc6aa5cSAndroid Build Coastguard Worker unsigned char *st;
464*dfc6aa5cSAndroid Build Coastguard Worker int tbl, k, ke;
465*dfc6aa5cSAndroid Build Coastguard Worker int v, v2, m;
466*dfc6aa5cSAndroid Build Coastguard Worker
467*dfc6aa5cSAndroid Build Coastguard Worker /* Emit restart marker if needed */
468*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->restart_interval) {
469*dfc6aa5cSAndroid Build Coastguard Worker if (entropy->restarts_to_go == 0) {
470*dfc6aa5cSAndroid Build Coastguard Worker emit_restart(cinfo, entropy->next_restart_num);
471*dfc6aa5cSAndroid Build Coastguard Worker entropy->restarts_to_go = cinfo->restart_interval;
472*dfc6aa5cSAndroid Build Coastguard Worker entropy->next_restart_num++;
473*dfc6aa5cSAndroid Build Coastguard Worker entropy->next_restart_num &= 7;
474*dfc6aa5cSAndroid Build Coastguard Worker }
475*dfc6aa5cSAndroid Build Coastguard Worker entropy->restarts_to_go--;
476*dfc6aa5cSAndroid Build Coastguard Worker }
477*dfc6aa5cSAndroid Build Coastguard Worker
478*dfc6aa5cSAndroid Build Coastguard Worker /* Encode the MCU data block */
479*dfc6aa5cSAndroid Build Coastguard Worker block = MCU_data[0];
480*dfc6aa5cSAndroid Build Coastguard Worker tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
481*dfc6aa5cSAndroid Build Coastguard Worker
482*dfc6aa5cSAndroid Build Coastguard Worker /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
483*dfc6aa5cSAndroid Build Coastguard Worker
484*dfc6aa5cSAndroid Build Coastguard Worker /* Establish EOB (end-of-block) index */
485*dfc6aa5cSAndroid Build Coastguard Worker for (ke = cinfo->Se; ke > 0; ke--)
486*dfc6aa5cSAndroid Build Coastguard Worker /* We must apply the point transform by Al. For AC coefficients this
487*dfc6aa5cSAndroid Build Coastguard Worker * is an integer division with rounding towards 0. To do this portably
488*dfc6aa5cSAndroid Build Coastguard Worker * in C, we shift after obtaining the absolute value.
489*dfc6aa5cSAndroid Build Coastguard Worker */
490*dfc6aa5cSAndroid Build Coastguard Worker if ((v = (*block)[jpeg_natural_order[ke]]) >= 0) {
491*dfc6aa5cSAndroid Build Coastguard Worker if (v >>= cinfo->Al) break;
492*dfc6aa5cSAndroid Build Coastguard Worker } else {
493*dfc6aa5cSAndroid Build Coastguard Worker v = -v;
494*dfc6aa5cSAndroid Build Coastguard Worker if (v >>= cinfo->Al) break;
495*dfc6aa5cSAndroid Build Coastguard Worker }
496*dfc6aa5cSAndroid Build Coastguard Worker
497*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.5: Encode_AC_Coefficients */
498*dfc6aa5cSAndroid Build Coastguard Worker for (k = cinfo->Ss; k <= ke; k++) {
499*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->ac_stats[tbl] + 3 * (k - 1);
500*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 0); /* EOB decision */
501*dfc6aa5cSAndroid Build Coastguard Worker for (;;) {
502*dfc6aa5cSAndroid Build Coastguard Worker if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
503*dfc6aa5cSAndroid Build Coastguard Worker if (v >>= cinfo->Al) {
504*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 1, 1);
505*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, entropy->fixed_bin, 0);
506*dfc6aa5cSAndroid Build Coastguard Worker break;
507*dfc6aa5cSAndroid Build Coastguard Worker }
508*dfc6aa5cSAndroid Build Coastguard Worker } else {
509*dfc6aa5cSAndroid Build Coastguard Worker v = -v;
510*dfc6aa5cSAndroid Build Coastguard Worker if (v >>= cinfo->Al) {
511*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 1, 1);
512*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, entropy->fixed_bin, 1);
513*dfc6aa5cSAndroid Build Coastguard Worker break;
514*dfc6aa5cSAndroid Build Coastguard Worker }
515*dfc6aa5cSAndroid Build Coastguard Worker }
516*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 1, 0); st += 3; k++;
517*dfc6aa5cSAndroid Build Coastguard Worker }
518*dfc6aa5cSAndroid Build Coastguard Worker st += 2;
519*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.8: Encoding the magnitude category of v */
520*dfc6aa5cSAndroid Build Coastguard Worker m = 0;
521*dfc6aa5cSAndroid Build Coastguard Worker if (v -= 1) {
522*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
523*dfc6aa5cSAndroid Build Coastguard Worker m = 1;
524*dfc6aa5cSAndroid Build Coastguard Worker v2 = v;
525*dfc6aa5cSAndroid Build Coastguard Worker if (v2 >>= 1) {
526*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
527*dfc6aa5cSAndroid Build Coastguard Worker m <<= 1;
528*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->ac_stats[tbl] +
529*dfc6aa5cSAndroid Build Coastguard Worker (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
530*dfc6aa5cSAndroid Build Coastguard Worker while (v2 >>= 1) {
531*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
532*dfc6aa5cSAndroid Build Coastguard Worker m <<= 1;
533*dfc6aa5cSAndroid Build Coastguard Worker st += 1;
534*dfc6aa5cSAndroid Build Coastguard Worker }
535*dfc6aa5cSAndroid Build Coastguard Worker }
536*dfc6aa5cSAndroid Build Coastguard Worker }
537*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 0);
538*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.9: Encoding the magnitude bit pattern of v */
539*dfc6aa5cSAndroid Build Coastguard Worker st += 14;
540*dfc6aa5cSAndroid Build Coastguard Worker while (m >>= 1)
541*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, (m & v) ? 1 : 0);
542*dfc6aa5cSAndroid Build Coastguard Worker }
543*dfc6aa5cSAndroid Build Coastguard Worker /* Encode EOB decision only if k <= cinfo->Se */
544*dfc6aa5cSAndroid Build Coastguard Worker if (k <= cinfo->Se) {
545*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->ac_stats[tbl] + 3 * (k - 1);
546*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
547*dfc6aa5cSAndroid Build Coastguard Worker }
548*dfc6aa5cSAndroid Build Coastguard Worker
549*dfc6aa5cSAndroid Build Coastguard Worker return TRUE;
550*dfc6aa5cSAndroid Build Coastguard Worker }
551*dfc6aa5cSAndroid Build Coastguard Worker
552*dfc6aa5cSAndroid Build Coastguard Worker
553*dfc6aa5cSAndroid Build Coastguard Worker /*
554*dfc6aa5cSAndroid Build Coastguard Worker * MCU encoding for DC successive approximation refinement scan.
555*dfc6aa5cSAndroid Build Coastguard Worker */
556*dfc6aa5cSAndroid Build Coastguard Worker
557*dfc6aa5cSAndroid Build Coastguard Worker METHODDEF(boolean)
encode_mcu_DC_refine(j_compress_ptr cinfo,JBLOCKROW * MCU_data)558*dfc6aa5cSAndroid Build Coastguard Worker encode_mcu_DC_refine(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
559*dfc6aa5cSAndroid Build Coastguard Worker {
560*dfc6aa5cSAndroid Build Coastguard Worker arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
561*dfc6aa5cSAndroid Build Coastguard Worker unsigned char *st;
562*dfc6aa5cSAndroid Build Coastguard Worker int Al, blkn;
563*dfc6aa5cSAndroid Build Coastguard Worker
564*dfc6aa5cSAndroid Build Coastguard Worker /* Emit restart marker if needed */
565*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->restart_interval) {
566*dfc6aa5cSAndroid Build Coastguard Worker if (entropy->restarts_to_go == 0) {
567*dfc6aa5cSAndroid Build Coastguard Worker emit_restart(cinfo, entropy->next_restart_num);
568*dfc6aa5cSAndroid Build Coastguard Worker entropy->restarts_to_go = cinfo->restart_interval;
569*dfc6aa5cSAndroid Build Coastguard Worker entropy->next_restart_num++;
570*dfc6aa5cSAndroid Build Coastguard Worker entropy->next_restart_num &= 7;
571*dfc6aa5cSAndroid Build Coastguard Worker }
572*dfc6aa5cSAndroid Build Coastguard Worker entropy->restarts_to_go--;
573*dfc6aa5cSAndroid Build Coastguard Worker }
574*dfc6aa5cSAndroid Build Coastguard Worker
575*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->fixed_bin; /* use fixed probability estimation */
576*dfc6aa5cSAndroid Build Coastguard Worker Al = cinfo->Al;
577*dfc6aa5cSAndroid Build Coastguard Worker
578*dfc6aa5cSAndroid Build Coastguard Worker /* Encode the MCU data blocks */
579*dfc6aa5cSAndroid Build Coastguard Worker for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
580*dfc6aa5cSAndroid Build Coastguard Worker /* We simply emit the Al'th bit of the DC coefficient value. */
581*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1);
582*dfc6aa5cSAndroid Build Coastguard Worker }
583*dfc6aa5cSAndroid Build Coastguard Worker
584*dfc6aa5cSAndroid Build Coastguard Worker return TRUE;
585*dfc6aa5cSAndroid Build Coastguard Worker }
586*dfc6aa5cSAndroid Build Coastguard Worker
587*dfc6aa5cSAndroid Build Coastguard Worker
588*dfc6aa5cSAndroid Build Coastguard Worker /*
589*dfc6aa5cSAndroid Build Coastguard Worker * MCU encoding for AC successive approximation refinement scan.
590*dfc6aa5cSAndroid Build Coastguard Worker */
591*dfc6aa5cSAndroid Build Coastguard Worker
592*dfc6aa5cSAndroid Build Coastguard Worker METHODDEF(boolean)
encode_mcu_AC_refine(j_compress_ptr cinfo,JBLOCKROW * MCU_data)593*dfc6aa5cSAndroid Build Coastguard Worker encode_mcu_AC_refine(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
594*dfc6aa5cSAndroid Build Coastguard Worker {
595*dfc6aa5cSAndroid Build Coastguard Worker arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
596*dfc6aa5cSAndroid Build Coastguard Worker JBLOCKROW block;
597*dfc6aa5cSAndroid Build Coastguard Worker unsigned char *st;
598*dfc6aa5cSAndroid Build Coastguard Worker int tbl, k, ke, kex;
599*dfc6aa5cSAndroid Build Coastguard Worker int v;
600*dfc6aa5cSAndroid Build Coastguard Worker
601*dfc6aa5cSAndroid Build Coastguard Worker /* Emit restart marker if needed */
602*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->restart_interval) {
603*dfc6aa5cSAndroid Build Coastguard Worker if (entropy->restarts_to_go == 0) {
604*dfc6aa5cSAndroid Build Coastguard Worker emit_restart(cinfo, entropy->next_restart_num);
605*dfc6aa5cSAndroid Build Coastguard Worker entropy->restarts_to_go = cinfo->restart_interval;
606*dfc6aa5cSAndroid Build Coastguard Worker entropy->next_restart_num++;
607*dfc6aa5cSAndroid Build Coastguard Worker entropy->next_restart_num &= 7;
608*dfc6aa5cSAndroid Build Coastguard Worker }
609*dfc6aa5cSAndroid Build Coastguard Worker entropy->restarts_to_go--;
610*dfc6aa5cSAndroid Build Coastguard Worker }
611*dfc6aa5cSAndroid Build Coastguard Worker
612*dfc6aa5cSAndroid Build Coastguard Worker /* Encode the MCU data block */
613*dfc6aa5cSAndroid Build Coastguard Worker block = MCU_data[0];
614*dfc6aa5cSAndroid Build Coastguard Worker tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
615*dfc6aa5cSAndroid Build Coastguard Worker
616*dfc6aa5cSAndroid Build Coastguard Worker /* Section G.1.3.3: Encoding of AC coefficients */
617*dfc6aa5cSAndroid Build Coastguard Worker
618*dfc6aa5cSAndroid Build Coastguard Worker /* Establish EOB (end-of-block) index */
619*dfc6aa5cSAndroid Build Coastguard Worker for (ke = cinfo->Se; ke > 0; ke--)
620*dfc6aa5cSAndroid Build Coastguard Worker /* We must apply the point transform by Al. For AC coefficients this
621*dfc6aa5cSAndroid Build Coastguard Worker * is an integer division with rounding towards 0. To do this portably
622*dfc6aa5cSAndroid Build Coastguard Worker * in C, we shift after obtaining the absolute value.
623*dfc6aa5cSAndroid Build Coastguard Worker */
624*dfc6aa5cSAndroid Build Coastguard Worker if ((v = (*block)[jpeg_natural_order[ke]]) >= 0) {
625*dfc6aa5cSAndroid Build Coastguard Worker if (v >>= cinfo->Al) break;
626*dfc6aa5cSAndroid Build Coastguard Worker } else {
627*dfc6aa5cSAndroid Build Coastguard Worker v = -v;
628*dfc6aa5cSAndroid Build Coastguard Worker if (v >>= cinfo->Al) break;
629*dfc6aa5cSAndroid Build Coastguard Worker }
630*dfc6aa5cSAndroid Build Coastguard Worker
631*dfc6aa5cSAndroid Build Coastguard Worker /* Establish EOBx (previous stage end-of-block) index */
632*dfc6aa5cSAndroid Build Coastguard Worker for (kex = ke; kex > 0; kex--)
633*dfc6aa5cSAndroid Build Coastguard Worker if ((v = (*block)[jpeg_natural_order[kex]]) >= 0) {
634*dfc6aa5cSAndroid Build Coastguard Worker if (v >>= cinfo->Ah) break;
635*dfc6aa5cSAndroid Build Coastguard Worker } else {
636*dfc6aa5cSAndroid Build Coastguard Worker v = -v;
637*dfc6aa5cSAndroid Build Coastguard Worker if (v >>= cinfo->Ah) break;
638*dfc6aa5cSAndroid Build Coastguard Worker }
639*dfc6aa5cSAndroid Build Coastguard Worker
640*dfc6aa5cSAndroid Build Coastguard Worker /* Figure G.10: Encode_AC_Coefficients_SA */
641*dfc6aa5cSAndroid Build Coastguard Worker for (k = cinfo->Ss; k <= ke; k++) {
642*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->ac_stats[tbl] + 3 * (k - 1);
643*dfc6aa5cSAndroid Build Coastguard Worker if (k > kex)
644*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 0); /* EOB decision */
645*dfc6aa5cSAndroid Build Coastguard Worker for (;;) {
646*dfc6aa5cSAndroid Build Coastguard Worker if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
647*dfc6aa5cSAndroid Build Coastguard Worker if (v >>= cinfo->Al) {
648*dfc6aa5cSAndroid Build Coastguard Worker if (v >> 1) /* previously nonzero coef */
649*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 2, (v & 1));
650*dfc6aa5cSAndroid Build Coastguard Worker else { /* newly nonzero coef */
651*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 1, 1);
652*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, entropy->fixed_bin, 0);
653*dfc6aa5cSAndroid Build Coastguard Worker }
654*dfc6aa5cSAndroid Build Coastguard Worker break;
655*dfc6aa5cSAndroid Build Coastguard Worker }
656*dfc6aa5cSAndroid Build Coastguard Worker } else {
657*dfc6aa5cSAndroid Build Coastguard Worker v = -v;
658*dfc6aa5cSAndroid Build Coastguard Worker if (v >>= cinfo->Al) {
659*dfc6aa5cSAndroid Build Coastguard Worker if (v >> 1) /* previously nonzero coef */
660*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 2, (v & 1));
661*dfc6aa5cSAndroid Build Coastguard Worker else { /* newly nonzero coef */
662*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 1, 1);
663*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, entropy->fixed_bin, 1);
664*dfc6aa5cSAndroid Build Coastguard Worker }
665*dfc6aa5cSAndroid Build Coastguard Worker break;
666*dfc6aa5cSAndroid Build Coastguard Worker }
667*dfc6aa5cSAndroid Build Coastguard Worker }
668*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 1, 0); st += 3; k++;
669*dfc6aa5cSAndroid Build Coastguard Worker }
670*dfc6aa5cSAndroid Build Coastguard Worker }
671*dfc6aa5cSAndroid Build Coastguard Worker /* Encode EOB decision only if k <= cinfo->Se */
672*dfc6aa5cSAndroid Build Coastguard Worker if (k <= cinfo->Se) {
673*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->ac_stats[tbl] + 3 * (k - 1);
674*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
675*dfc6aa5cSAndroid Build Coastguard Worker }
676*dfc6aa5cSAndroid Build Coastguard Worker
677*dfc6aa5cSAndroid Build Coastguard Worker return TRUE;
678*dfc6aa5cSAndroid Build Coastguard Worker }
679*dfc6aa5cSAndroid Build Coastguard Worker
680*dfc6aa5cSAndroid Build Coastguard Worker
681*dfc6aa5cSAndroid Build Coastguard Worker /*
682*dfc6aa5cSAndroid Build Coastguard Worker * Encode and output one MCU's worth of arithmetic-compressed coefficients.
683*dfc6aa5cSAndroid Build Coastguard Worker */
684*dfc6aa5cSAndroid Build Coastguard Worker
685*dfc6aa5cSAndroid Build Coastguard Worker METHODDEF(boolean)
encode_mcu(j_compress_ptr cinfo,JBLOCKROW * MCU_data)686*dfc6aa5cSAndroid Build Coastguard Worker encode_mcu(j_compress_ptr cinfo, JBLOCKROW *MCU_data)
687*dfc6aa5cSAndroid Build Coastguard Worker {
688*dfc6aa5cSAndroid Build Coastguard Worker arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
689*dfc6aa5cSAndroid Build Coastguard Worker jpeg_component_info *compptr;
690*dfc6aa5cSAndroid Build Coastguard Worker JBLOCKROW block;
691*dfc6aa5cSAndroid Build Coastguard Worker unsigned char *st;
692*dfc6aa5cSAndroid Build Coastguard Worker int blkn, ci, tbl, k, ke;
693*dfc6aa5cSAndroid Build Coastguard Worker int v, v2, m;
694*dfc6aa5cSAndroid Build Coastguard Worker
695*dfc6aa5cSAndroid Build Coastguard Worker /* Emit restart marker if needed */
696*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->restart_interval) {
697*dfc6aa5cSAndroid Build Coastguard Worker if (entropy->restarts_to_go == 0) {
698*dfc6aa5cSAndroid Build Coastguard Worker emit_restart(cinfo, entropy->next_restart_num);
699*dfc6aa5cSAndroid Build Coastguard Worker entropy->restarts_to_go = cinfo->restart_interval;
700*dfc6aa5cSAndroid Build Coastguard Worker entropy->next_restart_num++;
701*dfc6aa5cSAndroid Build Coastguard Worker entropy->next_restart_num &= 7;
702*dfc6aa5cSAndroid Build Coastguard Worker }
703*dfc6aa5cSAndroid Build Coastguard Worker entropy->restarts_to_go--;
704*dfc6aa5cSAndroid Build Coastguard Worker }
705*dfc6aa5cSAndroid Build Coastguard Worker
706*dfc6aa5cSAndroid Build Coastguard Worker /* Encode the MCU data blocks */
707*dfc6aa5cSAndroid Build Coastguard Worker for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
708*dfc6aa5cSAndroid Build Coastguard Worker block = MCU_data[blkn];
709*dfc6aa5cSAndroid Build Coastguard Worker ci = cinfo->MCU_membership[blkn];
710*dfc6aa5cSAndroid Build Coastguard Worker compptr = cinfo->cur_comp_info[ci];
711*dfc6aa5cSAndroid Build Coastguard Worker
712*dfc6aa5cSAndroid Build Coastguard Worker /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
713*dfc6aa5cSAndroid Build Coastguard Worker
714*dfc6aa5cSAndroid Build Coastguard Worker tbl = compptr->dc_tbl_no;
715*dfc6aa5cSAndroid Build Coastguard Worker
716*dfc6aa5cSAndroid Build Coastguard Worker /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
717*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
718*dfc6aa5cSAndroid Build Coastguard Worker
719*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.4: Encode_DC_DIFF */
720*dfc6aa5cSAndroid Build Coastguard Worker if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) {
721*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 0);
722*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_context[ci] = 0; /* zero diff category */
723*dfc6aa5cSAndroid Build Coastguard Worker } else {
724*dfc6aa5cSAndroid Build Coastguard Worker entropy->last_dc_val[ci] = (*block)[0];
725*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
726*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.6: Encoding nonzero value v */
727*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.7: Encoding the sign of v */
728*dfc6aa5cSAndroid Build Coastguard Worker if (v > 0) {
729*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
730*dfc6aa5cSAndroid Build Coastguard Worker st += 2; /* Table F.4: SP = S0 + 2 */
731*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_context[ci] = 4; /* small positive diff category */
732*dfc6aa5cSAndroid Build Coastguard Worker } else {
733*dfc6aa5cSAndroid Build Coastguard Worker v = -v;
734*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
735*dfc6aa5cSAndroid Build Coastguard Worker st += 3; /* Table F.4: SN = S0 + 3 */
736*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_context[ci] = 8; /* small negative diff category */
737*dfc6aa5cSAndroid Build Coastguard Worker }
738*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.8: Encoding the magnitude category of v */
739*dfc6aa5cSAndroid Build Coastguard Worker m = 0;
740*dfc6aa5cSAndroid Build Coastguard Worker if (v -= 1) {
741*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
742*dfc6aa5cSAndroid Build Coastguard Worker m = 1;
743*dfc6aa5cSAndroid Build Coastguard Worker v2 = v;
744*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
745*dfc6aa5cSAndroid Build Coastguard Worker while (v2 >>= 1) {
746*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
747*dfc6aa5cSAndroid Build Coastguard Worker m <<= 1;
748*dfc6aa5cSAndroid Build Coastguard Worker st += 1;
749*dfc6aa5cSAndroid Build Coastguard Worker }
750*dfc6aa5cSAndroid Build Coastguard Worker }
751*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 0);
752*dfc6aa5cSAndroid Build Coastguard Worker /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
753*dfc6aa5cSAndroid Build Coastguard Worker if (m < (int)((1L << cinfo->arith_dc_L[tbl]) >> 1))
754*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_context[ci] = 0; /* zero diff category */
755*dfc6aa5cSAndroid Build Coastguard Worker else if (m > (int)((1L << cinfo->arith_dc_U[tbl]) >> 1))
756*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_context[ci] += 8; /* large diff category */
757*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.9: Encoding the magnitude bit pattern of v */
758*dfc6aa5cSAndroid Build Coastguard Worker st += 14;
759*dfc6aa5cSAndroid Build Coastguard Worker while (m >>= 1)
760*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, (m & v) ? 1 : 0);
761*dfc6aa5cSAndroid Build Coastguard Worker }
762*dfc6aa5cSAndroid Build Coastguard Worker
763*dfc6aa5cSAndroid Build Coastguard Worker /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
764*dfc6aa5cSAndroid Build Coastguard Worker
765*dfc6aa5cSAndroid Build Coastguard Worker tbl = compptr->ac_tbl_no;
766*dfc6aa5cSAndroid Build Coastguard Worker
767*dfc6aa5cSAndroid Build Coastguard Worker /* Establish EOB (end-of-block) index */
768*dfc6aa5cSAndroid Build Coastguard Worker for (ke = DCTSIZE2 - 1; ke > 0; ke--)
769*dfc6aa5cSAndroid Build Coastguard Worker if ((*block)[jpeg_natural_order[ke]]) break;
770*dfc6aa5cSAndroid Build Coastguard Worker
771*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.5: Encode_AC_Coefficients */
772*dfc6aa5cSAndroid Build Coastguard Worker for (k = 1; k <= ke; k++) {
773*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->ac_stats[tbl] + 3 * (k - 1);
774*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 0); /* EOB decision */
775*dfc6aa5cSAndroid Build Coastguard Worker while ((v = (*block)[jpeg_natural_order[k]]) == 0) {
776*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 1, 0); st += 3; k++;
777*dfc6aa5cSAndroid Build Coastguard Worker }
778*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st + 1, 1);
779*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.6: Encoding nonzero value v */
780*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.7: Encoding the sign of v */
781*dfc6aa5cSAndroid Build Coastguard Worker if (v > 0) {
782*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, entropy->fixed_bin, 0);
783*dfc6aa5cSAndroid Build Coastguard Worker } else {
784*dfc6aa5cSAndroid Build Coastguard Worker v = -v;
785*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, entropy->fixed_bin, 1);
786*dfc6aa5cSAndroid Build Coastguard Worker }
787*dfc6aa5cSAndroid Build Coastguard Worker st += 2;
788*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.8: Encoding the magnitude category of v */
789*dfc6aa5cSAndroid Build Coastguard Worker m = 0;
790*dfc6aa5cSAndroid Build Coastguard Worker if (v -= 1) {
791*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
792*dfc6aa5cSAndroid Build Coastguard Worker m = 1;
793*dfc6aa5cSAndroid Build Coastguard Worker v2 = v;
794*dfc6aa5cSAndroid Build Coastguard Worker if (v2 >>= 1) {
795*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
796*dfc6aa5cSAndroid Build Coastguard Worker m <<= 1;
797*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->ac_stats[tbl] +
798*dfc6aa5cSAndroid Build Coastguard Worker (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
799*dfc6aa5cSAndroid Build Coastguard Worker while (v2 >>= 1) {
800*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
801*dfc6aa5cSAndroid Build Coastguard Worker m <<= 1;
802*dfc6aa5cSAndroid Build Coastguard Worker st += 1;
803*dfc6aa5cSAndroid Build Coastguard Worker }
804*dfc6aa5cSAndroid Build Coastguard Worker }
805*dfc6aa5cSAndroid Build Coastguard Worker }
806*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 0);
807*dfc6aa5cSAndroid Build Coastguard Worker /* Figure F.9: Encoding the magnitude bit pattern of v */
808*dfc6aa5cSAndroid Build Coastguard Worker st += 14;
809*dfc6aa5cSAndroid Build Coastguard Worker while (m >>= 1)
810*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, (m & v) ? 1 : 0);
811*dfc6aa5cSAndroid Build Coastguard Worker }
812*dfc6aa5cSAndroid Build Coastguard Worker /* Encode EOB decision only if k <= DCTSIZE2 - 1 */
813*dfc6aa5cSAndroid Build Coastguard Worker if (k <= DCTSIZE2 - 1) {
814*dfc6aa5cSAndroid Build Coastguard Worker st = entropy->ac_stats[tbl] + 3 * (k - 1);
815*dfc6aa5cSAndroid Build Coastguard Worker arith_encode(cinfo, st, 1);
816*dfc6aa5cSAndroid Build Coastguard Worker }
817*dfc6aa5cSAndroid Build Coastguard Worker }
818*dfc6aa5cSAndroid Build Coastguard Worker
819*dfc6aa5cSAndroid Build Coastguard Worker return TRUE;
820*dfc6aa5cSAndroid Build Coastguard Worker }
821*dfc6aa5cSAndroid Build Coastguard Worker
822*dfc6aa5cSAndroid Build Coastguard Worker
823*dfc6aa5cSAndroid Build Coastguard Worker /*
824*dfc6aa5cSAndroid Build Coastguard Worker * Initialize for an arithmetic-compressed scan.
825*dfc6aa5cSAndroid Build Coastguard Worker */
826*dfc6aa5cSAndroid Build Coastguard Worker
827*dfc6aa5cSAndroid Build Coastguard Worker METHODDEF(void)
start_pass(j_compress_ptr cinfo,boolean gather_statistics)828*dfc6aa5cSAndroid Build Coastguard Worker start_pass(j_compress_ptr cinfo, boolean gather_statistics)
829*dfc6aa5cSAndroid Build Coastguard Worker {
830*dfc6aa5cSAndroid Build Coastguard Worker arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
831*dfc6aa5cSAndroid Build Coastguard Worker int ci, tbl;
832*dfc6aa5cSAndroid Build Coastguard Worker jpeg_component_info *compptr;
833*dfc6aa5cSAndroid Build Coastguard Worker
834*dfc6aa5cSAndroid Build Coastguard Worker if (gather_statistics)
835*dfc6aa5cSAndroid Build Coastguard Worker /* Make sure to avoid that in the master control logic!
836*dfc6aa5cSAndroid Build Coastguard Worker * We are fully adaptive here and need no extra
837*dfc6aa5cSAndroid Build Coastguard Worker * statistics gathering pass!
838*dfc6aa5cSAndroid Build Coastguard Worker */
839*dfc6aa5cSAndroid Build Coastguard Worker ERREXIT(cinfo, JERR_NOTIMPL);
840*dfc6aa5cSAndroid Build Coastguard Worker
841*dfc6aa5cSAndroid Build Coastguard Worker /* We assume jcmaster.c already validated the progressive scan parameters. */
842*dfc6aa5cSAndroid Build Coastguard Worker
843*dfc6aa5cSAndroid Build Coastguard Worker /* Select execution routines */
844*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->progressive_mode) {
845*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->Ah == 0) {
846*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->Ss == 0)
847*dfc6aa5cSAndroid Build Coastguard Worker entropy->pub.encode_mcu = encode_mcu_DC_first;
848*dfc6aa5cSAndroid Build Coastguard Worker else
849*dfc6aa5cSAndroid Build Coastguard Worker entropy->pub.encode_mcu = encode_mcu_AC_first;
850*dfc6aa5cSAndroid Build Coastguard Worker } else {
851*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->Ss == 0)
852*dfc6aa5cSAndroid Build Coastguard Worker entropy->pub.encode_mcu = encode_mcu_DC_refine;
853*dfc6aa5cSAndroid Build Coastguard Worker else
854*dfc6aa5cSAndroid Build Coastguard Worker entropy->pub.encode_mcu = encode_mcu_AC_refine;
855*dfc6aa5cSAndroid Build Coastguard Worker }
856*dfc6aa5cSAndroid Build Coastguard Worker } else
857*dfc6aa5cSAndroid Build Coastguard Worker entropy->pub.encode_mcu = encode_mcu;
858*dfc6aa5cSAndroid Build Coastguard Worker
859*dfc6aa5cSAndroid Build Coastguard Worker /* Allocate & initialize requested statistics areas */
860*dfc6aa5cSAndroid Build Coastguard Worker for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
861*dfc6aa5cSAndroid Build Coastguard Worker compptr = cinfo->cur_comp_info[ci];
862*dfc6aa5cSAndroid Build Coastguard Worker /* DC needs no table for refinement scan */
863*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
864*dfc6aa5cSAndroid Build Coastguard Worker tbl = compptr->dc_tbl_no;
865*dfc6aa5cSAndroid Build Coastguard Worker if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
866*dfc6aa5cSAndroid Build Coastguard Worker ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
867*dfc6aa5cSAndroid Build Coastguard Worker if (entropy->dc_stats[tbl] == NULL)
868*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
869*dfc6aa5cSAndroid Build Coastguard Worker ((j_common_ptr)cinfo, JPOOL_IMAGE, DC_STAT_BINS);
870*dfc6aa5cSAndroid Build Coastguard Worker memset(entropy->dc_stats[tbl], 0, DC_STAT_BINS);
871*dfc6aa5cSAndroid Build Coastguard Worker /* Initialize DC predictions to 0 */
872*dfc6aa5cSAndroid Build Coastguard Worker entropy->last_dc_val[ci] = 0;
873*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_context[ci] = 0;
874*dfc6aa5cSAndroid Build Coastguard Worker }
875*dfc6aa5cSAndroid Build Coastguard Worker /* AC needs no table when not present */
876*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->progressive_mode == 0 || cinfo->Se) {
877*dfc6aa5cSAndroid Build Coastguard Worker tbl = compptr->ac_tbl_no;
878*dfc6aa5cSAndroid Build Coastguard Worker if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
879*dfc6aa5cSAndroid Build Coastguard Worker ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
880*dfc6aa5cSAndroid Build Coastguard Worker if (entropy->ac_stats[tbl] == NULL)
881*dfc6aa5cSAndroid Build Coastguard Worker entropy->ac_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
882*dfc6aa5cSAndroid Build Coastguard Worker ((j_common_ptr)cinfo, JPOOL_IMAGE, AC_STAT_BINS);
883*dfc6aa5cSAndroid Build Coastguard Worker memset(entropy->ac_stats[tbl], 0, AC_STAT_BINS);
884*dfc6aa5cSAndroid Build Coastguard Worker #ifdef CALCULATE_SPECTRAL_CONDITIONING
885*dfc6aa5cSAndroid Build Coastguard Worker if (cinfo->progressive_mode)
886*dfc6aa5cSAndroid Build Coastguard Worker /* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */
887*dfc6aa5cSAndroid Build Coastguard Worker cinfo->arith_ac_K[tbl] = cinfo->Ss +
888*dfc6aa5cSAndroid Build Coastguard Worker ((8 + cinfo->Se - cinfo->Ss) >> 4);
889*dfc6aa5cSAndroid Build Coastguard Worker #endif
890*dfc6aa5cSAndroid Build Coastguard Worker }
891*dfc6aa5cSAndroid Build Coastguard Worker }
892*dfc6aa5cSAndroid Build Coastguard Worker
893*dfc6aa5cSAndroid Build Coastguard Worker /* Initialize arithmetic encoding variables */
894*dfc6aa5cSAndroid Build Coastguard Worker entropy->c = 0;
895*dfc6aa5cSAndroid Build Coastguard Worker entropy->a = 0x10000L;
896*dfc6aa5cSAndroid Build Coastguard Worker entropy->sc = 0;
897*dfc6aa5cSAndroid Build Coastguard Worker entropy->zc = 0;
898*dfc6aa5cSAndroid Build Coastguard Worker entropy->ct = 11;
899*dfc6aa5cSAndroid Build Coastguard Worker entropy->buffer = -1; /* empty */
900*dfc6aa5cSAndroid Build Coastguard Worker
901*dfc6aa5cSAndroid Build Coastguard Worker /* Initialize restart stuff */
902*dfc6aa5cSAndroid Build Coastguard Worker entropy->restarts_to_go = cinfo->restart_interval;
903*dfc6aa5cSAndroid Build Coastguard Worker entropy->next_restart_num = 0;
904*dfc6aa5cSAndroid Build Coastguard Worker }
905*dfc6aa5cSAndroid Build Coastguard Worker
906*dfc6aa5cSAndroid Build Coastguard Worker
907*dfc6aa5cSAndroid Build Coastguard Worker /*
908*dfc6aa5cSAndroid Build Coastguard Worker * Module initialization routine for arithmetic entropy encoding.
909*dfc6aa5cSAndroid Build Coastguard Worker */
910*dfc6aa5cSAndroid Build Coastguard Worker
911*dfc6aa5cSAndroid Build Coastguard Worker GLOBAL(void)
jinit_arith_encoder(j_compress_ptr cinfo)912*dfc6aa5cSAndroid Build Coastguard Worker jinit_arith_encoder(j_compress_ptr cinfo)
913*dfc6aa5cSAndroid Build Coastguard Worker {
914*dfc6aa5cSAndroid Build Coastguard Worker arith_entropy_ptr entropy;
915*dfc6aa5cSAndroid Build Coastguard Worker int i;
916*dfc6aa5cSAndroid Build Coastguard Worker
917*dfc6aa5cSAndroid Build Coastguard Worker entropy = (arith_entropy_ptr)
918*dfc6aa5cSAndroid Build Coastguard Worker (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
919*dfc6aa5cSAndroid Build Coastguard Worker sizeof(arith_entropy_encoder));
920*dfc6aa5cSAndroid Build Coastguard Worker cinfo->entropy = (struct jpeg_entropy_encoder *)entropy;
921*dfc6aa5cSAndroid Build Coastguard Worker entropy->pub.start_pass = start_pass;
922*dfc6aa5cSAndroid Build Coastguard Worker entropy->pub.finish_pass = finish_pass;
923*dfc6aa5cSAndroid Build Coastguard Worker
924*dfc6aa5cSAndroid Build Coastguard Worker /* Mark tables unallocated */
925*dfc6aa5cSAndroid Build Coastguard Worker for (i = 0; i < NUM_ARITH_TBLS; i++) {
926*dfc6aa5cSAndroid Build Coastguard Worker entropy->dc_stats[i] = NULL;
927*dfc6aa5cSAndroid Build Coastguard Worker entropy->ac_stats[i] = NULL;
928*dfc6aa5cSAndroid Build Coastguard Worker }
929*dfc6aa5cSAndroid Build Coastguard Worker
930*dfc6aa5cSAndroid Build Coastguard Worker /* Initialize index for fixed probability estimation */
931*dfc6aa5cSAndroid Build Coastguard Worker entropy->fixed_bin[0] = 113;
932*dfc6aa5cSAndroid Build Coastguard Worker }
933