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