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