170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jcphuff.c
370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1995-1997, Thomas G. Lane.
570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file is part of the Independent JPEG Group's software.
670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For conditions of distribution and use, see the accompanying README file.
770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file contains Huffman entropy encoding routines for progressive JPEG.
970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We do not support output suspension in this module, since the library
1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * currently does not allow multiple-scan files to be written with output
1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * suspension.
1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define JPEG_INTERNALS
1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jinclude.h"
1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jpeglib.h"
1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jchuff.h"		/* Declarations shared with jchuff.c */
1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef C_PROGRESSIVE_SUPPORTED
2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Expanded entropy encoder object for progressive Huffman encoding. */
2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef struct {
2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  struct jpeg_entropy_encoder pub; /* public fields */
2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Mode flag: TRUE for optimization, FALSE for actual data output */
2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  boolean gather_statistics;
2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Bit-level coding status.
3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * next_output_byte/free_in_buffer are local copies of cinfo->dest fields.
3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   */
3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JOCTET * next_output_byte;	/* => next byte to write in buffer */
3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  size_t free_in_buffer;	/* # of byte spaces remaining in buffer */
3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  INT32 put_buffer;		/* current bit-accumulation buffer */
3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int put_bits;			/* # of bits now in it */
3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  j_compress_ptr cinfo;		/* link to cinfo (needed for dump_buffer) */
3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Coding status for DC components */
4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Coding status for AC components */
4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int ac_tbl_no;		/* the table number of the single component */
4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  unsigned int EOBRUN;		/* run length of EOBs */
4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  unsigned int BE;		/* # of buffered correction bits before MCU */
4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  char * bit_buffer;		/* buffer for correction bits (1 per char) */
4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* packing correction bits tightly would save some space but cost time... */
4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  unsigned int restarts_to_go;	/* MCUs left in this restart interval */
5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int next_restart_num;		/* next restart number to write (0-7) */
5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Pointers to derived tables (these workspaces have image lifespan).
5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * Since any one scan codes only DC or only AC, we only need one set
5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * of tables, not one for DC and one for AC.
5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   */
5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  c_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Statistics tables for optimization; again, one set is enough */
5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  long * count_ptrs[NUM_HUFF_TBLS];
6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} phuff_entropy_encoder;
6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef phuff_entropy_encoder * phuff_entropy_ptr;
6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit
6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * buffer can hold.  Larger sizes may slightly improve compression, but
6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 1000 is already well into the realm of overkill.
6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The minimum safe size is 64 bits.
6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define MAX_CORR_BITS  1000	/* Max # of correction bits I can buffer */
7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We assume that int right shift is unsigned if INT32 right shift is,
7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * which should be safe.
7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef RIGHT_SHIFT_IS_UNSIGNED
7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define ISHIFT_TEMPS	int ishift_temp;
7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define IRIGHT_SHIFT(x,shft)  \
8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	((ishift_temp = (x)) < 0 ? \
8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 (ishift_temp >> (shft)))
8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else
8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define ISHIFT_TEMPS
8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define IRIGHT_SHIFT(x,shft)	((x) >> (shft))
8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Forward declarations */
8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo,
9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine					    JBLOCKROW *MCU_data));
9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo,
9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine					    JBLOCKROW *MCU_data));
9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo,
9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine					     JBLOCKROW *MCU_data));
9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo,
9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine					     JBLOCKROW *MCU_data));
9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo));
9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo));
9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Initialize for a Huffman-compressed scan using progressive JPEG.
10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestart_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics)
10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  boolean is_DC_band;
11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int ci, tbl;
11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  jpeg_component_info * compptr;
11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->cinfo = cinfo;
11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->gather_statistics = gather_statistics;
11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  is_DC_band = (cinfo->Ss == 0);
11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* We assume jcmaster.c already validated the scan parameters. */
11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Select execution routines */
12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->Ah == 0) {
12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (is_DC_band)
12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->pub.encode_mcu = encode_mcu_DC_first;
12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    else
12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->pub.encode_mcu = encode_mcu_AC_first;
12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  } else {
12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (is_DC_band)
12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->pub.encode_mcu = encode_mcu_DC_refine;
12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    else {
13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->pub.encode_mcu = encode_mcu_AC_refine;
13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* AC refinement needs a correction bit buffer */
13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (entropy->bit_buffer == NULL)
13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	entropy->bit_buffer = (char *)
13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine				      MAX_CORR_BITS * SIZEOF(char));
13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (gather_statistics)
13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->pub.finish_pass = finish_pass_gather_phuff;
14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  else
14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->pub.finish_pass = finish_pass_phuff;
14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1
14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * for AC coefficients.
14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   */
14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    compptr = cinfo->cur_comp_info[ci];
14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Initialize DC predictions to 0 */
14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->last_dc_val[ci] = 0;
15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Get table index */
15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (is_DC_band) {
15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (cinfo->Ah != 0)	/* DC refinement needs no table */
15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	continue;
15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      tbl = compptr->dc_tbl_no;
15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else {
15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->ac_tbl_no = tbl = compptr->ac_tbl_no;
15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (gather_statistics) {
15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Check for invalid table index */
16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* (make_c_derived_tbl does this in the other path) */
16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Allocate and zero the statistics tables */
16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (entropy->count_ptrs[tbl] == NULL)
16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	entropy->count_ptrs[tbl] = (long *)
16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine				      257 * SIZEOF(long));
16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long));
17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else {
17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Compute derived values for Huffman table */
17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* We may do this more than once for a table, but it's not expensive */
17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl,
17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine			      & entropy->derived_tbls[tbl]);
17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Initialize AC stuff */
17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->EOBRUN = 0;
18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->BE = 0;
18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Initialize bit buffer to empty */
18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->put_buffer = 0;
18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->put_bits = 0;
18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Initialize restart stuff */
18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->restarts_to_go = cinfo->restart_interval;
18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->next_restart_num = 0;
18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Outputting bytes to the file.
19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * NB: these must be called only when actually outputting,
19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * that is, entropy->gather_statistics == FALSE.
19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Emit a byte */
19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define emit_byte(entropy,val)  \
19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	{ *(entropy)->next_output_byte++ = (JOCTET) (val);  \
20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  if (--(entropy)->free_in_buffer == 0)  \
20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	    dump_buffer(entropy); }
20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void)
20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinedump_buffer (phuff_entropy_ptr entropy)
20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Empty the output buffer; we do not support suspension in this module. */
20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  struct jpeg_destination_mgr * dest = entropy->cinfo->dest;
20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (! (*dest->empty_output_buffer) (entropy->cinfo))
21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND);
21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* After a successful buffer dump, must reset buffer pointers */
21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->next_output_byte = dest->next_output_byte;
21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->free_in_buffer = dest->free_in_buffer;
21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Outputting bits to the file */
21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Only the right 24 bits of put_buffer are used; the valid bits are
22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * left-justified in this part.  At most 16 bits can be passed to emit_bits
22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * in one call, and we never retain more than 7 bits in put_buffer
22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * between calls, so 24 bits are sufficient.
22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineINLINE
22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void)
22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineemit_bits (phuff_entropy_ptr entropy, unsigned int code, int size)
22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Emit some bits, unless we are in gather mode */
23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* This routine is heavily used, so it's worth coding tightly. */
23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register INT32 put_buffer = (INT32) code;
23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int put_bits = entropy->put_bits;
23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* if size is 0, caller used an invalid Huffman table entry */
23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (size == 0)
23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (entropy->gather_statistics)
24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    return;			/* do nothing if we're only getting stats */
24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  put_bits += size;		/* new number of bits in buffer */
24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  put_buffer <<= 24 - put_bits; /* align incoming bits */
24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  put_buffer |= entropy->put_buffer; /* and merge with old buffer contents */
24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (put_bits >= 8) {
25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    int c = (int) ((put_buffer >> 16) & 0xFF);
25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_byte(entropy, c);
25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (c == 0xFF) {		/* need to stuff a zero byte? */
25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_byte(entropy, 0);
25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    put_buffer <<= 8;
25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    put_bits -= 8;
25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->put_buffer = put_buffer; /* update variables */
26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->put_bits = put_bits;
26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void)
26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineflush_bits (phuff_entropy_ptr entropy)
26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */
27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->put_buffer = 0;     /* and reset bit-buffer to empty */
27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->put_bits = 0;
27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Emit (or just count) a Huffman symbol.
27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineINLINE
28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void)
28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineemit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol)
28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (entropy->gather_statistics)
28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->count_ptrs[tbl_no][symbol]++;
28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  else {
28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    c_derived_tbl * tbl = entropy->derived_tbls[tbl_no];
28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);
28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Emit bits from a correction bit buffer.
29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void)
29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineemit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart,
29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		    unsigned int nbits)
29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (entropy->gather_statistics)
30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    return;			/* no real work */
30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  while (nbits > 0) {
30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_bits(entropy, (unsigned int) (*bufstart), 1);
30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    bufstart++;
30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    nbits--;
30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Emit any pending EOBRUN symbol.
31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void)
31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineemit_eobrun (phuff_entropy_ptr entropy)
31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int temp, nbits;
31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (entropy->EOBRUN > 0) {	/* if there is any pending EOBRUN */
32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    temp = entropy->EOBRUN;
32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    nbits = 0;
32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    while ((temp >>= 1))
32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      nbits++;
32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* safety check: shouldn't happen given limited correction-bit buffer */
32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (nbits > 14)
32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
32970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4);
33070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (nbits)
33170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_bits(entropy, entropy->EOBRUN, nbits);
33270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
33370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->EOBRUN = 0;
33470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
33570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Emit any buffered correction bits */
33670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE);
33770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->BE = 0;
33870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
33970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
34070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
34170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
34270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
34370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Emit a restart marker & resynchronize predictions.
34470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
34570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
34670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void)
34770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineemit_restart (phuff_entropy_ptr entropy, int restart_num)
34870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
34970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int ci;
35070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
35170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  emit_eobrun(entropy);
35270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
35370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (! entropy->gather_statistics) {
35470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    flush_bits(entropy);
35570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_byte(entropy, 0xFF);
35670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_byte(entropy, JPEG_RST0 + restart_num);
35770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
35870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
35970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (entropy->cinfo->Ss == 0) {
36070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Re-initialize DC predictions to 0 */
36170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++)
36270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->last_dc_val[ci] = 0;
36370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  } else {
36470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Re-initialize all AC-related fields to 0 */
36570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->EOBRUN = 0;
36670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->BE = 0;
36770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
36870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
36970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
37070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
37170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
37270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * MCU encoding for DC initial scan (either spectral selection,
37370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * or first pass of successive approximation).
37470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
37570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
37670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(boolean)
37770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineencode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
37870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
37970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
38070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int temp, temp2;
38170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int nbits;
38270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int blkn, ci;
38370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int Al = cinfo->Al;
38470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JBLOCKROW block;
38570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  jpeg_component_info * compptr;
38670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  ISHIFT_TEMPS
38770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
38870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->next_output_byte = cinfo->dest->next_output_byte;
38970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
39070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
39170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Emit restart marker if needed */
39270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->restart_interval)
39370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (entropy->restarts_to_go == 0)
39470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_restart(entropy, entropy->next_restart_num);
39570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
39670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Encode the MCU data blocks */
39770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
39870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    block = MCU_data[blkn];
39970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ci = cinfo->MCU_membership[blkn];
40070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    compptr = cinfo->cur_comp_info[ci];
40170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
40270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Compute the DC value after the required point transform by Al.
40370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * This is simply an arithmetic right shift.
40470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     */
40570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);
40670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
40770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* DC differences are figured on the point-transformed values. */
40870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    temp = temp2 - entropy->last_dc_val[ci];
40970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->last_dc_val[ci] = temp2;
41070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
41170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Encode the DC coefficient difference per section G.1.2.1 */
41270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    temp2 = temp;
41370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (temp < 0) {
41470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      temp = -temp;		/* temp is abs value of input */
41570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* For a negative input, want temp2 = bitwise complement of abs(input) */
41670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* This code assumes we are on a two's complement machine */
41770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      temp2--;
41870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
41970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
42070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Find the number of bits needed for the magnitude of the coefficient */
42170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    nbits = 0;
42270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    while (temp) {
42370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      nbits++;
42470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      temp >>= 1;
42570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
42670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Check for out-of-range coefficient values.
42770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * Since we're encoding a difference, the range limit is twice as much.
42870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     */
42970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (nbits > MAX_COEF_BITS+1)
43070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_DCT_COEF);
43170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
43270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Count/emit the Huffman-coded symbol for the number of bits */
43370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_symbol(entropy, compptr->dc_tbl_no, nbits);
43470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
43570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Emit that number of bits of the value, if positive, */
43670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* or the complement of its magnitude, if negative. */
43770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (nbits)			/* emit_bits rejects calls with size 0 */
43870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_bits(entropy, (unsigned int) temp2, nbits);
43970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
44070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
44170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->dest->next_output_byte = entropy->next_output_byte;
44270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
44370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
44470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Update restart-interval state too */
44570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->restart_interval) {
44670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (entropy->restarts_to_go == 0) {
44770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->restarts_to_go = cinfo->restart_interval;
44870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->next_restart_num++;
44970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->next_restart_num &= 7;
45070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
45170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->restarts_to_go--;
45270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
45370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
45470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  return TRUE;
45570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
45670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
45770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
45870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
45970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * MCU encoding for AC initial scan (either spectral selection,
46070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * or first pass of successive approximation).
46170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
46270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
46370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(boolean)
46470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineencode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
46570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
46670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
46770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int temp, temp2;
46870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int nbits;
46970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int r, k;
47070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int Se = cinfo->Se;
47170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int Al = cinfo->Al;
47270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JBLOCKROW block;
47370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
47470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->next_output_byte = cinfo->dest->next_output_byte;
47570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
47670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
47770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Emit restart marker if needed */
47870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->restart_interval)
47970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (entropy->restarts_to_go == 0)
48070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_restart(entropy, entropy->next_restart_num);
48170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
48270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Encode the MCU data block */
48370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  block = MCU_data[0];
48470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
48570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */
48670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
48770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  r = 0;			/* r = run length of zeros */
48870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
48970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (k = cinfo->Ss; k <= Se; k++) {
49070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if ((temp = (*block)[jpeg_natural_order[k]]) == 0) {
49170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r++;
49270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      continue;
49370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
49470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* We must apply the point transform by Al.  For AC coefficients this
49570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * is an integer division with rounding towards 0.  To do this portably
49670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * in C, we shift after obtaining the absolute value; so the code is
49770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * interwoven with finding the abs value (temp) and output bits (temp2).
49870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     */
49970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (temp < 0) {
50070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      temp = -temp;		/* temp is abs value of input */
50170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      temp >>= Al;		/* apply the point transform */
50270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* For a negative coef, want temp2 = bitwise complement of abs(coef) */
50370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      temp2 = ~temp;
50470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else {
50570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      temp >>= Al;		/* apply the point transform */
50670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      temp2 = temp;
50770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
50870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Watch out for case that nonzero coef is zero after point transform */
50970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (temp == 0) {
51070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r++;
51170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      continue;
51270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
51370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
51470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Emit any pending EOBRUN */
51570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (entropy->EOBRUN > 0)
51670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_eobrun(entropy);
51770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* if run length > 15, must emit special run-length-16 codes (0xF0) */
51870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    while (r > 15) {
51970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
52070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r -= 16;
52170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
52270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
52370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Find the number of bits needed for the magnitude of the coefficient */
52470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    nbits = 1;			/* there must be at least one 1 bit */
52570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    while ((temp >>= 1))
52670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      nbits++;
52770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Check for out-of-range coefficient values */
52870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (nbits > MAX_COEF_BITS)
52970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_BAD_DCT_COEF);
53070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
53170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Count/emit Huffman symbol for run length / number of bits */
53270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits);
53370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
53470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Emit that number of bits of the value, if positive, */
53570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* or the complement of its magnitude, if negative. */
53670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_bits(entropy, (unsigned int) temp2, nbits);
53770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
53870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    r = 0;			/* reset zero run length */
53970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
54070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
54170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (r > 0) {			/* If there are trailing zeroes, */
54270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->EOBRUN++;		/* count an EOB */
54370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (entropy->EOBRUN == 0x7FFF)
54470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_eobrun(entropy);	/* force it out to avoid overflow */
54570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
54670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
54770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->dest->next_output_byte = entropy->next_output_byte;
54870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
54970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
55070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Update restart-interval state too */
55170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->restart_interval) {
55270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (entropy->restarts_to_go == 0) {
55370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->restarts_to_go = cinfo->restart_interval;
55470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->next_restart_num++;
55570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->next_restart_num &= 7;
55670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
55770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->restarts_to_go--;
55870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
55970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
56070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  return TRUE;
56170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
56270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
56370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
56470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
56570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * MCU encoding for DC successive approximation refinement scan.
56670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Note: we assume such scans can be multi-component, although the spec
56770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * is not very clear on the point.
56870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
56970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
57070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(boolean)
57170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineencode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
57270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
57370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
57470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int temp;
57570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int blkn;
57670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int Al = cinfo->Al;
57770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JBLOCKROW block;
57870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
57970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->next_output_byte = cinfo->dest->next_output_byte;
58070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
58170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
58270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Emit restart marker if needed */
58370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->restart_interval)
58470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (entropy->restarts_to_go == 0)
58570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_restart(entropy, entropy->next_restart_num);
58670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
58770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Encode the MCU data blocks */
58870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
58970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    block = MCU_data[blkn];
59070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
59170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* We simply emit the Al'th bit of the DC coefficient value. */
59270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    temp = (*block)[0];
59370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_bits(entropy, (unsigned int) (temp >> Al), 1);
59470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
59570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
59670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->dest->next_output_byte = entropy->next_output_byte;
59770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
59870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
59970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Update restart-interval state too */
60070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->restart_interval) {
60170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (entropy->restarts_to_go == 0) {
60270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->restarts_to_go = cinfo->restart_interval;
60370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->next_restart_num++;
60470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->next_restart_num &= 7;
60570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
60670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->restarts_to_go--;
60770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
60870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
60970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  return TRUE;
61070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
61170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
61270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
61370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
61470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * MCU encoding for AC successive approximation refinement scan.
61570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
61670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
61770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(boolean)
61870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineencode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
61970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
62070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
62170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int temp;
62270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  register int r, k;
62370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int EOB;
62470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  char *BR_buffer;
62570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  unsigned int BR;
62670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int Se = cinfo->Se;
62770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int Al = cinfo->Al;
62870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JBLOCKROW block;
62970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int absvalues[DCTSIZE2];
63070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
63170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->next_output_byte = cinfo->dest->next_output_byte;
63270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
63370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
63470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Emit restart marker if needed */
63570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->restart_interval)
63670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (entropy->restarts_to_go == 0)
63770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_restart(entropy, entropy->next_restart_num);
63870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
63970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Encode the MCU data block */
64070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  block = MCU_data[0];
64170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
64270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* It is convenient to make a pre-pass to determine the transformed
64370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * coefficients' absolute values and the EOB position.
64470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   */
64570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  EOB = 0;
64670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (k = cinfo->Ss; k <= Se; k++) {
64770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    temp = (*block)[jpeg_natural_order[k]];
64870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* We must apply the point transform by Al.  For AC coefficients this
64970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * is an integer division with rounding towards 0.  To do this portably
65070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * in C, we shift after obtaining the absolute value.
65170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     */
65270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (temp < 0)
65370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      temp = -temp;		/* temp is abs value of input */
65470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    temp >>= Al;		/* apply the point transform */
65570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    absvalues[k] = temp;	/* save abs value for main pass */
65670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (temp == 1)
65770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      EOB = k;			/* EOB = index of last newly-nonzero coef */
65870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
65970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
66070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */
66170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
66270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  r = 0;			/* r = run length of zeros */
66370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  BR = 0;			/* BR = count of buffered bits added now */
66470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */
66570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
66670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (k = cinfo->Ss; k <= Se; k++) {
66770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if ((temp = absvalues[k]) == 0) {
66870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r++;
66970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      continue;
67070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
67170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
67270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Emit any required ZRLs, but not if they can be folded into EOB */
67370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    while (r > 15 && k <= EOB) {
67470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* emit any pending EOBRUN and the BE correction bits */
67570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_eobrun(entropy);
67670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Emit ZRL */
67770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
67870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      r -= 16;
67970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Emit buffered correction bits that must be associated with ZRL */
68070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_buffered_bits(entropy, BR_buffer, BR);
68170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
68270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      BR = 0;
68370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
68470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
68570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* If the coef was previously nonzero, it only needs a correction bit.
68670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * NOTE: a straight translation of the spec's figure G.7 would suggest
68770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * that we also need to test r > 15.  But if r > 15, we can only get here
68870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * if k > EOB, which implies that this coefficient is not 1.
68970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     */
69070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (temp > 1) {
69170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* The correction bit is the next bit of the absolute value. */
69270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      BR_buffer[BR++] = (char) (temp & 1);
69370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      continue;
69470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
69570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
69670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Emit any pending EOBRUN and the BE correction bits */
69770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_eobrun(entropy);
69870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
69970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Count/emit Huffman symbol for run length / number of bits */
70070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1);
70170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
70270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Emit output bit for newly-nonzero coef */
70370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1;
70470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_bits(entropy, (unsigned int) temp, 1);
70570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
70670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Emit buffered correction bits that must be associated with this code */
70770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    emit_buffered_bits(entropy, BR_buffer, BR);
70870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
70970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    BR = 0;
71070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    r = 0;			/* reset zero run length */
71170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
71270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
71370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (r > 0 || BR > 0) {	/* If there are trailing zeroes, */
71470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->EOBRUN++;		/* count an EOB */
71570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->BE += BR;		/* concat my correction bits to older ones */
71670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* We force out the EOB if we risk either:
71770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * 1. overflow of the EOB counter;
71870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * 2. overflow of the correction bit buffer during the next MCU.
71970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     */
72070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1))
72170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      emit_eobrun(entropy);
72270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
72370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
72470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->dest->next_output_byte = entropy->next_output_byte;
72570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
72670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
72770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Update restart-interval state too */
72870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->restart_interval) {
72970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (entropy->restarts_to_go == 0) {
73070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->restarts_to_go = cinfo->restart_interval;
73170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->next_restart_num++;
73270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      entropy->next_restart_num &= 7;
73370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
73470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->restarts_to_go--;
73570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
73670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
73770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  return TRUE;
73870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
73970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
74070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
74170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
74270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Finish up at the end of a Huffman-compressed progressive scan.
74370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
74470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
74570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
74670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinefinish_pass_phuff (j_compress_ptr cinfo)
74770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
74870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
74970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
75070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->next_output_byte = cinfo->dest->next_output_byte;
75170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
75270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
75370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Flush out any buffered data */
75470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  emit_eobrun(entropy);
75570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  flush_bits(entropy);
75670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
75770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->dest->next_output_byte = entropy->next_output_byte;
75870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
75970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
76070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
76170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
76270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
76370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Finish up a statistics-gathering pass and create the new Huffman tables.
76470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
76570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
76670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
76770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinefinish_pass_gather_phuff (j_compress_ptr cinfo)
76870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
76970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
77070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  boolean is_DC_band;
77170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int ci, tbl;
77270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  jpeg_component_info * compptr;
77370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JHUFF_TBL **htblptr;
77470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  boolean did[NUM_HUFF_TBLS];
77570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
77670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Flush out buffered data (all we care about is counting the EOB symbol) */
77770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  emit_eobrun(entropy);
77870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
77970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  is_DC_band = (cinfo->Ss == 0);
78070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
78170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* It's important not to apply jpeg_gen_optimal_table more than once
78270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * per table, because it clobbers the input frequency counts!
78370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   */
78470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  MEMZERO(did, SIZEOF(did));
78570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
78670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
78770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    compptr = cinfo->cur_comp_info[ci];
78870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (is_DC_band) {
78970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (cinfo->Ah != 0)	/* DC refinement needs no table */
79070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	continue;
79170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      tbl = compptr->dc_tbl_no;
79270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else {
79370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      tbl = compptr->ac_tbl_no;
79470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
79570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (! did[tbl]) {
79670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (is_DC_band)
79770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        htblptr = & cinfo->dc_huff_tbl_ptrs[tbl];
79870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      else
79970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        htblptr = & cinfo->ac_huff_tbl_ptrs[tbl];
80070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (*htblptr == NULL)
80170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
80270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]);
80370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      did[tbl] = TRUE;
80470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
80570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
80670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
80770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
80870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
80970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
81070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Module initialization routine for progressive Huffman entropy encoding.
81170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
81270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
81370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void)
81470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejinit_phuff_encoder (j_compress_ptr cinfo)
81570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
81670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  phuff_entropy_ptr entropy;
81770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int i;
81870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
81970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy = (phuff_entropy_ptr)
82070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
82170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine				SIZEOF(phuff_entropy_encoder));
82270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
82370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->pub.start_pass = start_pass_phuff;
82470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
82570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Mark tables unallocated */
82670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (i = 0; i < NUM_HUFF_TBLS; i++) {
82770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->derived_tbls[i] = NULL;
82870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    entropy->count_ptrs[i] = NULL;
82970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
83070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  entropy->bit_buffer = NULL;	/* needed only in AC refinement scan */
83170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
83270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
83370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* C_PROGRESSIVE_SUPPORTED */
834