1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if !defined(_FX_JPEG_TURBO_)
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * jcphuff.c
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (C) 1995-1997, Thomas G. Lane.
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This file is part of the Independent JPEG Group's software.
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * For conditions of distribution and use, see the accompanying README file.
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * This file contains Huffman entropy encoding routines for progressive JPEG.
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * We do not support output suspension in this module, since the library
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * currently does not allow multiple-scan files to be written with output
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * suspension.
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define JPEG_INTERNALS
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "jinclude.h"
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "jpeglib.h"
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "jchuff.h"		/* Declarations shared with jchuff.c */
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef C_PROGRESSIVE_SUPPORTED
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Expanded entropy encoder object for progressive Huffman encoding. */
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct {
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  struct jpeg_entropy_encoder pub; /* public fields */
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Mode flag: TRUE for optimization, FALSE for actual data output */
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  boolean gather_statistics;
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Bit-level coding status.
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * next_output_byte/free_in_buffer are local copies of cinfo->dest fields.
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JOCTET * next_output_byte;	/* => next byte to write in buffer */
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  size_t free_in_buffer;	/* # of byte spaces remaining in buffer */
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  INT32 put_buffer;		/* current bit-accumulation buffer */
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int put_bits;			/* # of bits now in it */
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  j_compress_ptr cinfo;		/* link to cinfo (needed for dump_buffer) */
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Coding status for DC components */
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Coding status for AC components */
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int ac_tbl_no;		/* the table number of the single component */
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  unsigned int EOBRUN;		/* run length of EOBs */
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  unsigned int BE;		/* # of buffered correction bits before MCU */
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  char * bit_buffer;		/* buffer for correction bits (1 per char) */
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* packing correction bits tightly would save some space but cost time... */
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  unsigned int restarts_to_go;	/* MCUs left in this restart interval */
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int next_restart_num;		/* next restart number to write (0-7) */
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Pointers to derived tables (these workspaces have image lifespan).
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * Since any one scan codes only DC or only AC, we only need one set
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * of tables, not one for DC and one for AC.
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  c_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Statistics tables for optimization; again, one set is enough */
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  long * count_ptrs[NUM_HUFF_TBLS];
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} phuff_entropy_encoder;
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef phuff_entropy_encoder * phuff_entropy_ptr;
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * buffer can hold.  Larger sizes may slightly improve compression, but
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * 1000 is already well into the realm of overkill.
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * The minimum safe size is 64 bits.
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define MAX_CORR_BITS  1000	/* Max # of correction bits I can buffer */
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * We assume that int right shift is unsigned if INT32 right shift is,
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * which should be safe.
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef RIGHT_SHIFT_IS_UNSIGNED
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define ISHIFT_TEMPS	int ishift_temp;
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define IRIGHT_SHIFT(x,shft)  \
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	((ishift_temp = (x)) < 0 ? \
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	 (ishift_temp >> (shft)))
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define ISHIFT_TEMPS
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define IRIGHT_SHIFT(x,shft)	((x) >> (shft))
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Forward declarations */
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo,
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					    JBLOCKROW *MCU_data));
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo,
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					    JBLOCKROW *MCU_data));
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo,
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					     JBLOCKROW *MCU_data));
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo,
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					     JBLOCKROW *MCU_data));
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo));
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo));
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Initialize for a Huffman-compressed scan using progressive JPEG.
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(void)
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstart_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics)
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  boolean is_DC_band;
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int ci, tbl;
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  jpeg_component_info * compptr;
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->cinfo = cinfo;
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->gather_statistics = gather_statistics;
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  is_DC_band = (cinfo->Ss == 0);
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* We assume jcmaster.c already validated the scan parameters. */
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Select execution routines */
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (cinfo->Ah == 0) {
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (is_DC_band)
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->pub.encode_mcu = encode_mcu_DC_first;
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    else
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->pub.encode_mcu = encode_mcu_AC_first;
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  } else {
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (is_DC_band)
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->pub.encode_mcu = encode_mcu_DC_refine;
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    else {
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->pub.encode_mcu = encode_mcu_AC_refine;
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* AC refinement needs a correction bit buffer */
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if (entropy->bit_buffer == NULL)
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	entropy->bit_buffer = (char *)
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				      MAX_CORR_BITS * SIZEOF(char));
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (gather_statistics)
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->pub.finish_pass = finish_pass_gather_phuff;
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  else
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->pub.finish_pass = finish_pass_phuff;
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * for AC coefficients.
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    compptr = cinfo->cur_comp_info[ci];
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Initialize DC predictions to 0 */
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->last_dc_val[ci] = 0;
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Get table index */
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (is_DC_band) {
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if (cinfo->Ah != 0)	/* DC refinement needs no table */
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	continue;
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      tbl = compptr->dc_tbl_no;
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->ac_tbl_no = tbl = compptr->ac_tbl_no;
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (gather_statistics) {
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* Check for invalid table index */
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* (make_c_derived_tbl does this in the other path) */
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* Allocate and zero the statistics tables */
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if (entropy->count_ptrs[tbl] == NULL)
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	entropy->count_ptrs[tbl] = (long *)
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				      257 * SIZEOF(long));
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long));
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* Compute derived values for Huffman table */
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* We may do this more than once for a table, but it's not expensive */
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl,
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			      & entropy->derived_tbls[tbl]);
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Initialize AC stuff */
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->EOBRUN = 0;
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->BE = 0;
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Initialize bit buffer to empty */
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->put_buffer = 0;
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->put_bits = 0;
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Initialize restart stuff */
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->restarts_to_go = cinfo->restart_interval;
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->next_restart_num = 0;
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Outputting bytes to the file.
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * NB: these must be called only when actually outputting,
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * that is, entropy->gather_statistics == FALSE.
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Emit a byte */
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define emit_byte(entropy,val)  \
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{ *(entropy)->next_output_byte++ = (JOCTET) (val);  \
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	  if (--(entropy)->free_in_buffer == 0)  \
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	    dump_buffer(entropy); }
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLOCAL(void)
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovdump_buffer (phuff_entropy_ptr entropy)
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Empty the output buffer; we do not support suspension in this module. */
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  struct jpeg_destination_mgr * dest = entropy->cinfo->dest;
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (! (*dest->empty_output_buffer) (entropy->cinfo))
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND);
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* After a successful buffer dump, must reset buffer pointers */
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->next_output_byte = dest->next_output_byte;
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->free_in_buffer = dest->free_in_buffer;
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Outputting bits to the file */
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Only the right 24 bits of put_buffer are used; the valid bits are
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * left-justified in this part.  At most 16 bits can be passed to emit_bits
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * in one call, and we never retain more than 7 bits in put_buffer
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * between calls, so 24 bits are sufficient.
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovINLINE
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLOCAL(void)
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovemit_bits (phuff_entropy_ptr entropy, unsigned int code, int size)
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Emit some bits, unless we are in gather mode */
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* This routine is heavily used, so it's worth coding tightly. */
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register INT32 put_buffer = (INT32) code;
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register int put_bits = entropy->put_bits;
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* if size is 0, caller used an invalid Huffman table entry */
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (size == 0)
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (entropy->gather_statistics)
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return;			/* do nothing if we're only getting stats */
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  put_bits += size;		/* new number of bits in buffer */
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  put_buffer <<= 24 - put_bits; /* align incoming bits */
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  put_buffer |= entropy->put_buffer; /* and merge with old buffer contents */
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  while (put_bits >= 8) {
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int c = (int) ((put_buffer >> 16) & 0xFF);
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_byte(entropy, c);
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (c == 0xFF) {		/* need to stuff a zero byte? */
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_byte(entropy, 0);
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    put_buffer <<= 8;
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    put_bits -= 8;
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->put_buffer = put_buffer; /* update variables */
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->put_bits = put_bits;
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLOCAL(void)
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovflush_bits (phuff_entropy_ptr entropy)
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->put_buffer = 0;     /* and reset bit-buffer to empty */
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->put_bits = 0;
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Emit (or just count) a Huffman symbol.
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovINLINE
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLOCAL(void)
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovemit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol)
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (entropy->gather_statistics)
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->count_ptrs[tbl_no][symbol]++;
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  else {
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    c_derived_tbl * tbl = entropy->derived_tbls[tbl_no];
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Emit bits from a correction bit buffer.
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLOCAL(void)
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovemit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart,
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		    unsigned int nbits)
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (entropy->gather_statistics)
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return;			/* no real work */
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  while (nbits > 0) {
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_bits(entropy, (unsigned int) (*bufstart), 1);
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bufstart++;
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    nbits--;
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Emit any pending EOBRUN symbol.
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLOCAL(void)
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovemit_eobrun (phuff_entropy_ptr entropy)
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register int temp, nbits;
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (entropy->EOBRUN > 0) {	/* if there is any pending EOBRUN */
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    temp = entropy->EOBRUN;
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    nbits = 0;
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while ((temp >>= 1))
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      nbits++;
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* safety check: shouldn't happen given limited correction-bit buffer */
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (nbits > 14)
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4);
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (nbits)
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_bits(entropy, entropy->EOBRUN, nbits);
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->EOBRUN = 0;
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Emit any buffered correction bits */
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE);
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->BE = 0;
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Emit a restart marker & resynchronize predictions.
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLOCAL(void)
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovemit_restart (phuff_entropy_ptr entropy, int restart_num)
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int ci;
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  emit_eobrun(entropy);
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (! entropy->gather_statistics) {
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    flush_bits(entropy);
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_byte(entropy, 0xFF);
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_byte(entropy, JPEG_RST0 + restart_num);
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (entropy->cinfo->Ss == 0) {
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Re-initialize DC predictions to 0 */
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++)
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->last_dc_val[ci] = 0;
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  } else {
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Re-initialize all AC-related fields to 0 */
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->EOBRUN = 0;
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->BE = 0;
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * MCU encoding for DC initial scan (either spectral selection,
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * or first pass of successive approximation).
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(boolean)
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovencode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register int temp, temp2;
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register int nbits;
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int blkn, ci;
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int Al = cinfo->Al;
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JBLOCKROW block;
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  jpeg_component_info * compptr;
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ISHIFT_TEMPS
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->next_output_byte = cinfo->dest->next_output_byte;
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Emit restart marker if needed */
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (cinfo->restart_interval)
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (entropy->restarts_to_go == 0)
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_restart(entropy, entropy->next_restart_num);
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Encode the MCU data blocks */
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    block = MCU_data[blkn];
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ci = cinfo->MCU_membership[blkn];
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    compptr = cinfo->cur_comp_info[ci];
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Compute the DC value after the required point transform by Al.
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * This is simply an arithmetic right shift.
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     */
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* DC differences are figured on the point-transformed values. */
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    temp = temp2 - entropy->last_dc_val[ci];
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->last_dc_val[ci] = temp2;
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Encode the DC coefficient difference per section G.1.2.1 */
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    temp2 = temp;
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (temp < 0) {
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      temp = -temp;		/* temp is abs value of input */
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* For a negative input, want temp2 = bitwise complement of abs(input) */
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* This code assumes we are on a two's complement machine */
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      temp2--;
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Find the number of bits needed for the magnitude of the coefficient */
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    nbits = 0;
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (temp) {
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      nbits++;
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      temp >>= 1;
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Check for out-of-range coefficient values.
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * Since we're encoding a difference, the range limit is twice as much.
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     */
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (nbits > MAX_COEF_BITS+1)
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      ERREXIT(cinfo, JERR_BAD_DCT_COEF);
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Count/emit the Huffman-coded symbol for the number of bits */
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_symbol(entropy, compptr->dc_tbl_no, nbits);
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Emit that number of bits of the value, if positive, */
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* or the complement of its magnitude, if negative. */
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (nbits)			/* emit_bits rejects calls with size 0 */
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_bits(entropy, (unsigned int) temp2, nbits);
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cinfo->dest->next_output_byte = entropy->next_output_byte;
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Update restart-interval state too */
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (cinfo->restart_interval) {
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (entropy->restarts_to_go == 0) {
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->restarts_to_go = cinfo->restart_interval;
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->next_restart_num++;
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->next_restart_num &= 7;
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->restarts_to_go--;
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return TRUE;
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * MCU encoding for AC initial scan (either spectral selection,
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * or first pass of successive approximation).
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(boolean)
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovencode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register int temp, temp2;
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register int nbits;
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register int r, k;
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int Se = cinfo->Se;
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int Al = cinfo->Al;
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JBLOCKROW block;
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->next_output_byte = cinfo->dest->next_output_byte;
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Emit restart marker if needed */
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (cinfo->restart_interval)
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (entropy->restarts_to_go == 0)
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_restart(entropy, entropy->next_restart_num);
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Encode the MCU data block */
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  block = MCU_data[0];
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  r = 0;			/* r = run length of zeros */
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (k = cinfo->Ss; k <= Se; k++) {
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ((temp = (*block)[jpeg_natural_order[k]]) == 0) {
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      r++;
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      continue;
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* We must apply the point transform by Al.  For AC coefficients this
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * is an integer division with rounding towards 0.  To do this portably
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * in C, we shift after obtaining the absolute value; so the code is
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * interwoven with finding the abs value (temp) and output bits (temp2).
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     */
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (temp < 0) {
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      temp = -temp;		/* temp is abs value of input */
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      temp >>= Al;		/* apply the point transform */
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* For a negative coef, want temp2 = bitwise complement of abs(coef) */
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      temp2 = ~temp;
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      temp >>= Al;		/* apply the point transform */
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      temp2 = temp;
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Watch out for case that nonzero coef is zero after point transform */
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (temp == 0) {
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      r++;
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      continue;
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Emit any pending EOBRUN */
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (entropy->EOBRUN > 0)
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_eobrun(entropy);
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* if run length > 15, must emit special run-length-16 codes (0xF0) */
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (r > 15) {
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      r -= 16;
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Find the number of bits needed for the magnitude of the coefficient */
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    nbits = 1;			/* there must be at least one 1 bit */
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while ((temp >>= 1))
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      nbits++;
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Check for out-of-range coefficient values */
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (nbits > MAX_COEF_BITS)
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      ERREXIT(cinfo, JERR_BAD_DCT_COEF);
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Count/emit Huffman symbol for run length / number of bits */
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits);
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Emit that number of bits of the value, if positive, */
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* or the complement of its magnitude, if negative. */
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_bits(entropy, (unsigned int) temp2, nbits);
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    r = 0;			/* reset zero run length */
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (r > 0) {			/* If there are trailing zeroes, */
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->EOBRUN++;		/* count an EOB */
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (entropy->EOBRUN == 0x7FFF)
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_eobrun(entropy);	/* force it out to avoid overflow */
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cinfo->dest->next_output_byte = entropy->next_output_byte;
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Update restart-interval state too */
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (cinfo->restart_interval) {
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (entropy->restarts_to_go == 0) {
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->restarts_to_go = cinfo->restart_interval;
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->next_restart_num++;
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->next_restart_num &= 7;
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->restarts_to_go--;
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return TRUE;
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * MCU encoding for DC successive approximation refinement scan.
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Note: we assume such scans can be multi-component, although the spec
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * is not very clear on the point.
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(boolean)
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovencode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register int temp;
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int blkn;
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int Al = cinfo->Al;
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JBLOCKROW block;
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->next_output_byte = cinfo->dest->next_output_byte;
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Emit restart marker if needed */
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (cinfo->restart_interval)
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (entropy->restarts_to_go == 0)
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_restart(entropy, entropy->next_restart_num);
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Encode the MCU data blocks */
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    block = MCU_data[blkn];
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* We simply emit the Al'th bit of the DC coefficient value. */
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    temp = (*block)[0];
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_bits(entropy, (unsigned int) (temp >> Al), 1);
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cinfo->dest->next_output_byte = entropy->next_output_byte;
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Update restart-interval state too */
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (cinfo->restart_interval) {
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (entropy->restarts_to_go == 0) {
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->restarts_to_go = cinfo->restart_interval;
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->next_restart_num++;
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->next_restart_num &= 7;
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->restarts_to_go--;
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return TRUE;
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * MCU encoding for AC successive approximation refinement scan.
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(boolean)
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovencode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register int temp;
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  register int r, k;
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int EOB;
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  char *BR_buffer;
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  unsigned int BR;
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int Se = cinfo->Se;
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int Al = cinfo->Al;
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JBLOCKROW block;
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int absvalues[DCTSIZE2];
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->next_output_byte = cinfo->dest->next_output_byte;
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Emit restart marker if needed */
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (cinfo->restart_interval)
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (entropy->restarts_to_go == 0)
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_restart(entropy, entropy->next_restart_num);
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Encode the MCU data block */
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  block = MCU_data[0];
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* It is convenient to make a pre-pass to determine the transformed
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * coefficients' absolute values and the EOB position.
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  EOB = 0;
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (k = cinfo->Ss; k <= Se; k++) {
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    temp = (*block)[jpeg_natural_order[k]];
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* We must apply the point transform by Al.  For AC coefficients this
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * is an integer division with rounding towards 0.  To do this portably
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * in C, we shift after obtaining the absolute value.
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     */
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (temp < 0)
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      temp = -temp;		/* temp is abs value of input */
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    temp >>= Al;		/* apply the point transform */
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    absvalues[k] = temp;	/* save abs value for main pass */
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (temp == 1)
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      EOB = k;			/* EOB = index of last newly-nonzero coef */
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  r = 0;			/* r = run length of zeros */
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  BR = 0;			/* BR = count of buffered bits added now */
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (k = cinfo->Ss; k <= Se; k++) {
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ((temp = absvalues[k]) == 0) {
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      r++;
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      continue;
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Emit any required ZRLs, but not if they can be folded into EOB */
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (r > 15 && k <= EOB) {
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* emit any pending EOBRUN and the BE correction bits */
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_eobrun(entropy);
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* Emit ZRL */
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      r -= 16;
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* Emit buffered correction bits that must be associated with ZRL */
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_buffered_bits(entropy, BR_buffer, BR);
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      BR = 0;
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* If the coef was previously nonzero, it only needs a correction bit.
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * NOTE: a straight translation of the spec's figure G.7 would suggest
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * that we also need to test r > 15.  But if r > 15, we can only get here
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * if k > EOB, which implies that this coefficient is not 1.
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     */
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (temp > 1) {
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      /* The correction bit is the next bit of the absolute value. */
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      BR_buffer[BR++] = (char) (temp & 1);
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      continue;
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Emit any pending EOBRUN and the BE correction bits */
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_eobrun(entropy);
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Count/emit Huffman symbol for run length / number of bits */
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1);
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Emit output bit for newly-nonzero coef */
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1;
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_bits(entropy, (unsigned int) temp, 1);
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Emit buffered correction bits that must be associated with this code */
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    emit_buffered_bits(entropy, BR_buffer, BR);
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BR = 0;
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    r = 0;			/* reset zero run length */
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (r > 0 || BR > 0) {	/* If there are trailing zeroes, */
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->EOBRUN++;		/* count an EOB */
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->BE += BR;		/* concat my correction bits to older ones */
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* We force out the EOB if we risk either:
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * 1. overflow of the EOB counter;
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     * 2. overflow of the correction bit buffer during the next MCU.
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     */
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1))
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      emit_eobrun(entropy);
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cinfo->dest->next_output_byte = entropy->next_output_byte;
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Update restart-interval state too */
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  if (cinfo->restart_interval) {
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (entropy->restarts_to_go == 0) {
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->restarts_to_go = cinfo->restart_interval;
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->next_restart_num++;
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      entropy->next_restart_num &= 7;
734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->restarts_to_go--;
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  return TRUE;
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Finish up at the end of a Huffman-compressed progressive scan.
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(void)
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovfinish_pass_phuff (j_compress_ptr cinfo)
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->next_output_byte = cinfo->dest->next_output_byte;
752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Flush out any buffered data */
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  emit_eobrun(entropy);
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  flush_bits(entropy);
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cinfo->dest->next_output_byte = entropy->next_output_byte;
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Finish up a statistics-gathering pass and create the new Huffman tables.
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovMETHODDEF(void)
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovfinish_pass_gather_phuff (j_compress_ptr cinfo)
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  boolean is_DC_band;
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int ci, tbl;
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  jpeg_component_info * compptr;
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  JHUFF_TBL **htblptr;
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  boolean did[NUM_HUFF_TBLS];
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Flush out buffered data (all we care about is counting the EOB symbol) */
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  emit_eobrun(entropy);
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  is_DC_band = (cinfo->Ss == 0);
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* It's important not to apply jpeg_gen_optimal_table more than once
783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   * per table, because it clobbers the input frequency counts!
784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   */
785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  MEMZERO(did, SIZEOF(did));
786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    compptr = cinfo->cur_comp_info[ci];
789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (is_DC_band) {
790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if (cinfo->Ah != 0)	/* DC refinement needs no table */
791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	continue;
792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      tbl = compptr->dc_tbl_no;
793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      tbl = compptr->ac_tbl_no;
795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (! did[tbl]) {
797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if (is_DC_band)
798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        htblptr = & cinfo->dc_huff_tbl_ptrs[tbl];
799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      else
800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        htblptr = & cinfo->ac_huff_tbl_ptrs[tbl];
801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if (*htblptr == NULL)
802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]);
804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      did[tbl] = TRUE;
805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*
811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Module initialization routine for progressive Huffman entropy encoding.
812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
814ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovGLOBAL(void)
815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovjinit_phuff_encoder (j_compress_ptr cinfo)
816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  phuff_entropy_ptr entropy;
818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int i;
819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy = (phuff_entropy_ptr)
821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				SIZEOF(phuff_entropy_encoder));
823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->pub.start_pass = start_pass_phuff;
825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* Mark tables unallocated */
827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  for (i = 0; i < NUM_HUFF_TBLS; i++) {
828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->derived_tbls[i] = NULL;
829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    entropy->count_ptrs[i] = NULL;
830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  entropy->bit_buffer = NULL;	/* needed only in AC refinement scan */
832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* C_PROGRESSIVE_SUPPORTED */
835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif //_FX_JPEG_TURBO_
837