19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jchuff.c
39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1991-1997, Thomas G. Lane.
59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file is part of the Independent JPEG Group's software.
69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For conditions of distribution and use, see the accompanying README file.
79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file contains Huffman entropy encoding routines.
99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Much of the complexity here has to do with supporting output suspension.
119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If the data destination module demands suspension, we want to be able to
129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * back up to the start of the current MCU.  To do this, we copy state
139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * variables into local working storage, and update them back to the
149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * permanent JPEG objects only upon successful completion of an MCU.
159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define JPEG_INTERNALS
189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jinclude.h"
199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jpeglib.h"
209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jchuff.h"		/* Declarations shared with jcphuff.c */
219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Expanded entropy encoder object for Huffman encoding.
249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The savable_state subrecord contains fields that change within an MCU,
269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * but must not be updated permanently until we complete the MCU.
279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct {
309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  INT32 put_buffer;		/* current bit-accumulation buffer */
319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int put_bits;			/* # of bits now in it */
329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} savable_state;
349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* This macro is to work around compilers with missing or broken
369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * structure assignment.  You'll need to fix this code if you have
379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * such a compiler and you change MAX_COMPS_IN_SCAN.
389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifndef NO_STRUCT_ASSIGN
419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define ASSIGN_STATE(dest,src)  ((dest) = (src))
429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#if MAX_COMPS_IN_SCAN == 4
449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define ASSIGN_STATE(dest,src)  \
459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	((dest).put_buffer = (src).put_buffer, \
469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 (dest).put_bits = (src).put_bits, \
479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 (dest).last_dc_val[0] = (src).last_dc_val[0], \
489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 (dest).last_dc_val[1] = (src).last_dc_val[1], \
499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 (dest).last_dc_val[2] = (src).last_dc_val[2], \
509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 (dest).last_dc_val[3] = (src).last_dc_val[3])
519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct {
569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  struct jpeg_entropy_encoder pub; /* public fields */
579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  savable_state saved;		/* Bit buffer & DC state at start of MCU */
599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* These fields are NOT loaded into local working state. */
619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  unsigned int restarts_to_go;	/* MCUs left in this restart interval */
629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int next_restart_num;		/* next restart number to write (0-7) */
639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Pointers to derived tables (these workspaces have image lifespan) */
659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ENTROPY_OPT_SUPPORTED	/* Statistics tables for optimization */
699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  long * dc_count_ptrs[NUM_HUFF_TBLS];
709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  long * ac_count_ptrs[NUM_HUFF_TBLS];
719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} huff_entropy_encoder;
739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef huff_entropy_encoder * huff_entropy_ptr;
759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Working state while writing an MCU.
779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This struct contains all the fields that are needed by subroutines.
789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct {
819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JOCTET * next_output_byte;	/* => next byte to write in buffer */
829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  size_t free_in_buffer;	/* # of byte spaces remaining in buffer */
839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  savable_state cur;		/* Current bit buffer & DC state */
849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  j_compress_ptr cinfo;		/* dump_buffer needs access to this */
859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} working_state;
869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Forward declarations */
899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo,
909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project					JBLOCKROW *MCU_data));
919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo));
929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ENTROPY_OPT_SUPPORTED
939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo,
949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project					  JBLOCKROW *MCU_data));
959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo));
969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Initialize for a Huffman-compressed scan.
1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If gather_statistics is TRUE, we do not output anything during the scan,
1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * just count the Huffman symbols used and generate Huffman code tables.
1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstart_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int ci, dctbl, actbl;
1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jpeg_component_info * compptr;
1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (gather_statistics) {
1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ENTROPY_OPT_SUPPORTED
1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->pub.encode_mcu = encode_mcu_gather;
1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->pub.finish_pass = finish_pass_gather;
1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_NOT_COMPILED);
1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else {
1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->pub.encode_mcu = encode_mcu_huff;
1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->pub.finish_pass = finish_pass_huff;
1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    compptr = cinfo->cur_comp_info[ci];
1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    dctbl = compptr->dc_tbl_no;
1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    actbl = compptr->ac_tbl_no;
1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (gather_statistics) {
1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ENTROPY_OPT_SUPPORTED
1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Check for invalid table indexes */
1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* (make_c_derived_tbl does this in the other path) */
1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS)
1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl);
1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (actbl < 0 || actbl >= NUM_HUFF_TBLS)
1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl);
1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Allocate and zero the statistics tables */
1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (entropy->dc_count_ptrs[dctbl] == NULL)
1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	entropy->dc_count_ptrs[dctbl] = (long *)
1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				      257 * SIZEOF(long));
1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long));
1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (entropy->ac_count_ptrs[actbl] == NULL)
1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	entropy->ac_count_ptrs[actbl] = (long *)
1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				      257 * SIZEOF(long));
1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long));
1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Compute derived values for Huffman tables */
1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* We may do this more than once for a table, but it's not expensive */
1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl,
1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			      & entropy->dc_derived_tbls[dctbl]);
1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jpeg_make_c_derived_tbl(cinfo, FALSE, actbl,
1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			      & entropy->ac_derived_tbls[actbl]);
1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Initialize DC predictions to 0 */
1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->saved.last_dc_val[ci] = 0;
1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize bit buffer to empty */
1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->saved.put_buffer = 0;
1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->saved.put_bits = 0;
1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize restart stuff */
1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->restarts_to_go = cinfo->restart_interval;
1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->next_restart_num = 0;
1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Compute the derived values for a Huffman table.
1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This routine also performs some validation checks on the table.
1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note this is also used by jcphuff.c.
1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,
1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			 c_derived_tbl ** pdtbl)
1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JHUFF_TBL *htbl;
1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  c_derived_tbl *dtbl;
1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int p, i, l, lastp, si, maxsymbol;
1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  char huffsize[257];
1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  unsigned int huffcode[257];
1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  unsigned int code;
1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Note that huffsize[] and huffcode[] are filled in code-length order,
1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * paralleling the order of the symbols themselves in htbl->huffval[].
1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Find the input Huffman table */
1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  htbl =
1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (htbl == NULL)
1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Allocate a workspace if we haven't already done so. */
2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (*pdtbl == NULL)
2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    *pdtbl = (c_derived_tbl *)
2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				  SIZEOF(c_derived_tbl));
2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  dtbl = *pdtbl;
2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Figure C.1: make table of Huffman code length for each symbol */
2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  p = 0;
2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (l = 1; l <= 16; l++) {
2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    i = (int) htbl->bits[l];
2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (i < 0 || p + i > 256)	/* protect against table overrun */
2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while (i--)
2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      huffsize[p++] = (char) l;
2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  huffsize[p] = 0;
2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  lastp = p;
2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Figure C.2: generate the codes themselves */
2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* We also validate that the counts represent a legal Huffman code tree. */
2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  code = 0;
2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  si = huffsize[0];
2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  p = 0;
2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  while (huffsize[p]) {
2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while (((int) huffsize[p]) == si) {
2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      huffcode[p++] = code;
2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      code++;
2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* code is now 1 more than the last code used for codelength si; but
2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * it must still fit in si bits, since no code is allowed to be all ones.
2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (((INT32) code) >= (((INT32) 1) << si))
2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    code <<= 1;
2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    si++;
2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Figure C.3: generate encoding tables */
2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* These are code and size indexed by symbol value */
2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Set all codeless symbols to have code length 0;
2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * this lets us detect duplicate VAL entries here, and later
2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * allows emit_bits to detect any attempt to emit such symbols.
2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi));
2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* This is also a convenient place to check for out-of-range
2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * and duplicated VAL entries.  We allow 0..255 for AC symbols
2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * but only 0..15 for DC.  (We could constrain them further
2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * based on data depth and mode, but this seems enough.)
2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  maxsymbol = isDC ? 15 : 255;
2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (p = 0; p < lastp; p++) {
2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    i = htbl->huffval[p];
2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (i < 0 || i > maxsymbol || dtbl->ehufsi[i])
2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    dtbl->ehufco[i] = huffcode[p];
2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    dtbl->ehufsi[i] = huffsize[p];
2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Outputting bytes to the file */
2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Emit a byte, taking 'action' if must suspend. */
2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define emit_byte(state,val,action)  \
2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	{ *(state)->next_output_byte++ = (JOCTET) (val);  \
2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  if (--(state)->free_in_buffer == 0)  \
2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    if (! dump_buffer(state))  \
2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	      { action; } }
2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(boolean)
2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectdump_buffer (working_state * state)
2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */
2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  struct jpeg_destination_mgr * dest = state->cinfo->dest;
2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! (*dest->empty_output_buffer) (state->cinfo))
2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return FALSE;
2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* After a successful buffer dump, must reset buffer pointers */
2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state->next_output_byte = dest->next_output_byte;
2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state->free_in_buffer = dest->free_in_buffer;
2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Outputting bits to the file */
2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Only the right 24 bits of put_buffer are used; the valid bits are
2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * left-justified in this part.  At most 16 bits can be passed to emit_bits
2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * in one call, and we never retain more than 7 bits in put_buffer
2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * between calls, so 24 bits are sufficient.
2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectINLINE
3019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(boolean)
3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectemit_bits (working_state * state, unsigned int code, int size)
3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Emit some bits; return TRUE if successful, FALSE if must suspend */
3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* This routine is heavily used, so it's worth coding tightly. */
3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register INT32 put_buffer = (INT32) code;
3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int put_bits = state->cur.put_bits;
3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* if size is 0, caller used an invalid Huffman table entry */
3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (size == 0)
3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);
3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  put_bits += size;		/* new number of bits in buffer */
3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  put_buffer <<= 24 - put_bits; /* align incoming bits */
3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */
3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  while (put_bits >= 8) {
3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    int c = (int) ((put_buffer >> 16) & 0xFF);
3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_byte(state, c, return FALSE);
3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (c == 0xFF) {		/* need to stuff a zero byte? */
3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_byte(state, 0, return FALSE);
3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    put_buffer <<= 8;
3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    put_bits -= 8;
3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state->cur.put_buffer = put_buffer; /* update state variables */
3339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state->cur.put_bits = put_bits;
3349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
3369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
3379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(boolean)
3409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectflush_bits (working_state * state)
3419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
3429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */
3439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return FALSE;
3449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state->cur.put_buffer = 0;	/* and reset bit-buffer to empty */
3459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state->cur.put_bits = 0;
3469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
3479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
3489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Encode a single block's worth of coefficients */
3519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(boolean)
3539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectencode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
3549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		  c_derived_tbl *dctbl, c_derived_tbl *actbl)
3559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
3569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int temp, temp2;
3579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int nbits;
3589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int k, r, i;
3599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Encode the DC coefficient difference per section F.1.2.1 */
3619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  temp = temp2 = block[0] - last_dc_val;
3639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (temp < 0) {
3659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp = -temp;		/* temp is abs value of input */
3669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* For a negative input, want temp2 = bitwise complement of abs(input) */
3679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* This code assumes we are on a two's complement machine */
3689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp2--;
3699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Find the number of bits needed for the magnitude of the coefficient */
3729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  nbits = 0;
3739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  while (temp) {
3749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    nbits++;
3759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp >>= 1;
3769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Check for out-of-range coefficient values.
3789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * Since we're encoding a difference, the range limit is twice as much.
3799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
3809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (nbits > MAX_COEF_BITS+1)
3819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
3829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Emit the Huffman-coded symbol for the number of bits */
3849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits]))
3859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return FALSE;
3869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Emit that number of bits of the value, if positive, */
3889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* or the complement of its magnitude, if negative. */
3899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (nbits)			/* emit_bits rejects calls with size 0 */
3909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (! emit_bits(state, (unsigned int) temp2, nbits))
3919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      return FALSE;
3929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Encode the AC coefficients per section F.1.2.2 */
3949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  r = 0;			/* r = run length of zeros */
3969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (k = 1; k < DCTSIZE2; k++) {
3989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if ((temp = block[jpeg_natural_order[k]]) == 0) {
3999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      r++;
4009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
4019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* if run length > 15, must emit special run-length-16 codes (0xF0) */
4029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      while (r > 15) {
4039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	if (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0]))
4049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  return FALSE;
4059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	r -= 16;
4069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
4079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      temp2 = temp;
4099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (temp < 0) {
4109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	temp = -temp;		/* temp is abs value of input */
4119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	/* This code assumes we are on a two's complement machine */
4129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	temp2--;
4139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
4149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Find the number of bits needed for the magnitude of the coefficient */
4169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      nbits = 1;		/* there must be at least one 1 bit */
4179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      while ((temp >>= 1))
4189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	nbits++;
4199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Check for out-of-range coefficient values */
4209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (nbits > MAX_COEF_BITS)
4219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
4229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Emit Huffman symbol for run length / number of bits */
4249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      i = (r << 4) + nbits;
4259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i]))
4269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	return FALSE;
4279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Emit that number of bits of the value, if positive, */
4299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* or the complement of its magnitude, if negative. */
4309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (! emit_bits(state, (unsigned int) temp2, nbits))
4319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	return FALSE;
4329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      r = 0;
4349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
4359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
4369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* If the last coef(s) were zero, emit an end-of-block code */
4389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (r > 0)
4399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0]))
4409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      return FALSE;
4419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
4439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
4449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
4479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Emit a restart marker & resynchronize predictions.
4489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
4499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(boolean)
4519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectemit_restart (working_state * state, int restart_num)
4529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
4539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int ci;
4549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! flush_bits(state))
4569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return FALSE;
4579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  emit_byte(state, 0xFF, return FALSE);
4599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  emit_byte(state, JPEG_RST0 + restart_num, return FALSE);
4609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Re-initialize DC predictions to 0 */
4629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (ci = 0; ci < state->cinfo->comps_in_scan; ci++)
4639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    state->cur.last_dc_val[ci] = 0;
4649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* The restart counter is not updated until we successfully write the MCU. */
4669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
4689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
4699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
4729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Encode and output one MCU's worth of Huffman-compressed coefficients.
4739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
4749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean)
4769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectencode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
4779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
4789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
4799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  working_state state;
4809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int blkn, ci;
4819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jpeg_component_info * compptr;
4829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Load up working state */
4849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state.next_output_byte = cinfo->dest->next_output_byte;
4859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state.free_in_buffer = cinfo->dest->free_in_buffer;
4869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ASSIGN_STATE(state.cur, entropy->saved);
4879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state.cinfo = cinfo;
4889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Emit restart marker if needed */
4909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->restart_interval) {
4919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->restarts_to_go == 0)
4929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (! emit_restart(&state, entropy->next_restart_num))
4939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	return FALSE;
4949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
4959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Encode the MCU data blocks */
4979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
4989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ci = cinfo->MCU_membership[blkn];
4999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    compptr = cinfo->cur_comp_info[ci];
5009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (! encode_one_block(&state,
5019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			   MCU_data[blkn][0], state.cur.last_dc_val[ci],
5029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			   entropy->dc_derived_tbls[compptr->dc_tbl_no],
5039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			   entropy->ac_derived_tbls[compptr->ac_tbl_no]))
5049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      return FALSE;
5059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Update last_dc_val */
5069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];
5079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
5089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Completed MCU, so update state */
5109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->next_output_byte = state.next_output_byte;
5119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->free_in_buffer = state.free_in_buffer;
5129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ASSIGN_STATE(entropy->saved, state.cur);
5139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Update restart-interval state too */
5159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->restart_interval) {
5169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->restarts_to_go == 0) {
5179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->restarts_to_go = cinfo->restart_interval;
5189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->next_restart_num++;
5199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->next_restart_num &= 7;
5209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
5219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->restarts_to_go--;
5229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
5239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
5259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
5269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
5299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Finish up at the end of a Huffman-compressed scan.
5309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
5319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
5339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectfinish_pass_huff (j_compress_ptr cinfo)
5349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
5359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
5369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  working_state state;
5379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Load up working state ... flush_bits needs it */
5399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state.next_output_byte = cinfo->dest->next_output_byte;
5409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state.free_in_buffer = cinfo->dest->free_in_buffer;
5419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ASSIGN_STATE(state.cur, entropy->saved);
5429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state.cinfo = cinfo;
5439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Flush out the last data */
5459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! flush_bits(&state))
5469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_CANT_SUSPEND);
5479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Update state */
5499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->next_output_byte = state.next_output_byte;
5509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->free_in_buffer = state.free_in_buffer;
5519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ASSIGN_STATE(entropy->saved, state.cur);
5529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
5539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
5569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Huffman coding optimization.
5579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
5589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We first scan the supplied data and count the number of uses of each symbol
5599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * that is to be Huffman-coded. (This process MUST agree with the code above.)
5609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Then we build a Huffman coding tree for the observed counts.
5619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Symbols which are not needed at all for the particular image are not
5629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * assigned any code, which saves space in the DHT marker as well as in
5639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the compressed data.
5649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
5659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ENTROPY_OPT_SUPPORTED
5679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Process a single block's worth of coefficients */
5709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
5729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecthtest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
5739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		 long dc_counts[], long ac_counts[])
5749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
5759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int temp;
5769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int nbits;
5779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int k, r;
5789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Encode the DC coefficient difference per section F.1.2.1 */
5809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  temp = block[0] - last_dc_val;
5829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (temp < 0)
5839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp = -temp;
5849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Find the number of bits needed for the magnitude of the coefficient */
5869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  nbits = 0;
5879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  while (temp) {
5889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    nbits++;
5899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp >>= 1;
5909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
5919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Check for out-of-range coefficient values.
5929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * Since we're encoding a difference, the range limit is twice as much.
5939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
5949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (nbits > MAX_COEF_BITS+1)
5959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_BAD_DCT_COEF);
5969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Count the Huffman symbol for the number of bits */
5989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  dc_counts[nbits]++;
5999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Encode the AC coefficients per section F.1.2.2 */
6019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  r = 0;			/* r = run length of zeros */
6039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (k = 1; k < DCTSIZE2; k++) {
6059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if ((temp = block[jpeg_natural_order[k]]) == 0) {
6069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      r++;
6079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
6089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* if run length > 15, must emit special run-length-16 codes (0xF0) */
6099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      while (r > 15) {
6109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	ac_counts[0xF0]++;
6119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	r -= 16;
6129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
6139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Find the number of bits needed for the magnitude of the coefficient */
6159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (temp < 0)
6169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	temp = -temp;
6179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Find the number of bits needed for the magnitude of the coefficient */
6199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      nbits = 1;		/* there must be at least one 1 bit */
6209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      while ((temp >>= 1))
6219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	nbits++;
6229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Check for out-of-range coefficient values */
6239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (nbits > MAX_COEF_BITS)
6249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	ERREXIT(cinfo, JERR_BAD_DCT_COEF);
6259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Count Huffman symbol for run length / number of bits */
6279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ac_counts[(r << 4) + nbits]++;
6289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      r = 0;
6309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
6319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
6329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* If the last coef(s) were zero, emit an end-of-block code */
6349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (r > 0)
6359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ac_counts[0]++;
6369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
6379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
6409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Trial-encode one MCU's worth of Huffman-compressed coefficients.
6419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * No data is actually output, so no suspension return is possible.
6429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
6439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean)
6459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectencode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
6469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
6479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
6489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int blkn, ci;
6499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jpeg_component_info * compptr;
6509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Take care of restart intervals if needed */
6529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->restart_interval) {
6539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->restarts_to_go == 0) {
6549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Re-initialize DC predictions to 0 */
6559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      for (ci = 0; ci < cinfo->comps_in_scan; ci++)
6569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	entropy->saved.last_dc_val[ci] = 0;
6579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Update restart state */
6589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->restarts_to_go = cinfo->restart_interval;
6599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
6609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->restarts_to_go--;
6619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
6629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
6649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ci = cinfo->MCU_membership[blkn];
6659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    compptr = cinfo->cur_comp_info[ci];
6669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci],
6679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		    entropy->dc_count_ptrs[compptr->dc_tbl_no],
6689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		    entropy->ac_count_ptrs[compptr->ac_tbl_no]);
6699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0];
6709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
6719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
6739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
6749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
6779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Generate the best Huffman code table for the given counts, fill htbl.
6789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note this is also used by jcphuff.c.
6799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
6809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The JPEG standard requires that no symbol be assigned a codeword of all
6819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * one bits (so that padding bits added at the end of a compressed segment
6829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * can't look like a valid code).  Because of the canonical ordering of
6839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * codewords, this just means that there must be an unused slot in the
6849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * longest codeword length category.  Section K.2 of the JPEG spec suggests
6859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * reserving such a slot by pretending that symbol 256 is a valid symbol
6869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * with count 1.  In theory that's not optimal; giving it count zero but
6879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * including it in the symbol set anyway should give a better Huffman code.
6889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * But the theoretically better code actually seems to come out worse in
6899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * practice, because it produces more all-ones bytes (which incur stuffed
6909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * zero bytes in the final file).  In any case the difference is tiny.
6919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
6929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The JPEG standard requires Huffman codes to be no more than 16 bits long.
6939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If some symbols have a very small but nonzero probability, the Huffman tree
6949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * must be adjusted to meet the code length restriction.  We currently use
6959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the adjustment method suggested in JPEG section K.2.  This method is *not*
6969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * optimal; it may not choose the best possible limited-length code.  But
6979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * typically only very-low-frequency symbols will be given less-than-optimal
6989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * lengths, so the code is almost optimal.  Experimental comparisons against
6999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * an optimal limited-length-code algorithm indicate that the difference is
7009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * microscopic --- usually less than a hundredth of a percent of total size.
7019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * So the extra complexity of an optimal algorithm doesn't seem worthwhile.
7029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
7039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
7059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
7069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
7079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define MAX_CLEN 32		/* assumed maximum initial code length */
7089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  UINT8 bits[MAX_CLEN+1];	/* bits[k] = # of symbols with code length k */
7099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int codesize[257];		/* codesize[k] = code length of symbol k */
7109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int others[257];		/* next symbol in current branch of tree */
7119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int c1, c2;
7129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int p, i, j;
7139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  long v;
7149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* This algorithm is explained in section K.2 of the JPEG standard */
7169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  MEMZERO(bits, SIZEOF(bits));
7189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  MEMZERO(codesize, SIZEOF(codesize));
7199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = 0; i < 257; i++)
7209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    others[i] = -1;		/* init links to empty */
7219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  freq[256] = 1;		/* make sure 256 has a nonzero count */
7239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Including the pseudo-symbol 256 in the Huffman procedure guarantees
7249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * that no real symbol is given code-value of all ones, because 256
7259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * will be placed last in the largest codeword category.
7269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
7279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Huffman's basic algorithm to assign optimal code lengths to symbols */
7299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (;;) {
7319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Find the smallest nonzero frequency, set c1 = its symbol */
7329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* In case of ties, take the larger symbol number */
7339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    c1 = -1;
7349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    v = 1000000000L;
7359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    for (i = 0; i <= 256; i++) {
7369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (freq[i] && freq[i] <= v) {
7379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	v = freq[i];
7389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	c1 = i;
7399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
7409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
7419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Find the next smallest nonzero frequency, set c2 = its symbol */
7439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* In case of ties, take the larger symbol number */
7449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    c2 = -1;
7459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    v = 1000000000L;
7469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    for (i = 0; i <= 256; i++) {
7479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (freq[i] && freq[i] <= v && i != c1) {
7489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	v = freq[i];
7499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	c2 = i;
7509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
7519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
7529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Done if we've merged everything into one frequency */
7549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (c2 < 0)
7559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      break;
7569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Else merge the two counts/trees */
7589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    freq[c1] += freq[c2];
7599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    freq[c2] = 0;
7609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Increment the codesize of everything in c1's tree branch */
7629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    codesize[c1]++;
7639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while (others[c1] >= 0) {
7649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      c1 = others[c1];
7659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      codesize[c1]++;
7669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
7679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    others[c1] = c2;		/* chain c2 onto c1's tree branch */
7699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Increment the codesize of everything in c2's tree branch */
7719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    codesize[c2]++;
7729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while (others[c2] >= 0) {
7739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      c2 = others[c2];
7749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      codesize[c2]++;
7759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
7769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
7779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Now count the number of symbols of each code length */
7799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = 0; i <= 256; i++) {
7809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (codesize[i]) {
7819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* The JPEG standard seems to think that this can't happen, */
7829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* but I'm paranoid... */
7839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (codesize[i] > MAX_CLEN)
7849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);
7859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      bits[codesize[i]]++;
7879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
7889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
7899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
7919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * Huffman procedure assigned any such lengths, we must adjust the coding.
7929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * Here is what the JPEG spec says about how this next bit works:
7939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * Since symbols are paired for the longest Huffman code, the symbols are
7949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * removed from this length category two at a time.  The prefix for the pair
7959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * (which is one bit shorter) is allocated to one of the pair; then,
7969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * skipping the BITS entry for that prefix length, a code word from the next
7979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * shortest nonzero BITS entry is converted into a prefix for two code words
7989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * one bit longer.
7999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
8009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = MAX_CLEN; i > 16; i--) {
8029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while (bits[i] > 0) {
8039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      j = i - 2;		/* find length of new prefix to be used */
8049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      while (bits[j] == 0)
8059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	j--;
8069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      bits[i] -= 2;		/* remove two symbols */
8089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      bits[i-1]++;		/* one goes in this length */
8099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      bits[j+1] += 2;		/* two new symbols in this length */
8109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      bits[j]--;		/* symbol of this length is now a prefix */
8119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
8129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
8139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Remove the count for the pseudo-symbol 256 from the largest codelength */
8159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  while (bits[i] == 0)		/* find largest codelength still in use */
8169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    i--;
8179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  bits[i]--;
8189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Return final symbol counts (only for lengths 0..16) */
8209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
8219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Return a list of the symbols sorted by code length */
8239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* It's not real clear to me why we don't need to consider the codelength
8249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * changes made above, but the JPEG spec seems to think this works.
8259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
8269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  p = 0;
8279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = 1; i <= MAX_CLEN; i++) {
8289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    for (j = 0; j <= 255; j++) {
8299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (codesize[j] == i) {
8309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	htbl->huffval[p] = (UINT8) j;
8319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	p++;
8329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
8339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
8349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
8359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Set sent_table FALSE so updated table will be written to JPEG file. */
8379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  htbl->sent_table = FALSE;
8389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
8399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
8429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Finish up a statistics-gathering pass and create the new Huffman tables.
8439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
8449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
8469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectfinish_pass_gather (j_compress_ptr cinfo)
8479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
8489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
8499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int ci, dctbl, actbl;
8509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jpeg_component_info * compptr;
8519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JHUFF_TBL **htblptr;
8529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  boolean did_dc[NUM_HUFF_TBLS];
8539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  boolean did_ac[NUM_HUFF_TBLS];
8549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* It's important not to apply jpeg_gen_optimal_table more than once
8569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * per table, because it clobbers the input frequency counts!
8579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
8589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  MEMZERO(did_dc, SIZEOF(did_dc));
8599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  MEMZERO(did_ac, SIZEOF(did_ac));
8609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
8629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    compptr = cinfo->cur_comp_info[ci];
8639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    dctbl = compptr->dc_tbl_no;
8649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    actbl = compptr->ac_tbl_no;
8659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (! did_dc[dctbl]) {
8669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl];
8679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (*htblptr == NULL)
8689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
8699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]);
8709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      did_dc[dctbl] = TRUE;
8719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
8729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (! did_ac[actbl]) {
8739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      htblptr = & cinfo->ac_huff_tbl_ptrs[actbl];
8749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (*htblptr == NULL)
8759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
8769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]);
8779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      did_ac[actbl] = TRUE;
8789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
8799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
8809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
8819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* ENTROPY_OPT_SUPPORTED */
8849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
8879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Module initialization routine for Huffman entropy encoding.
8889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
8899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
8919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjinit_huff_encoder (j_compress_ptr cinfo)
8929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
8939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  huff_entropy_ptr entropy;
8949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int i;
8959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy = (huff_entropy_ptr)
8979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
8989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				SIZEOF(huff_entropy_encoder));
8999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
9009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->pub.start_pass = start_pass_huff;
9019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
9029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Mark tables unallocated */
9039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = 0; i < NUM_HUFF_TBLS; i++) {
9049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
9059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ENTROPY_OPT_SUPPORTED
9069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;
9079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
9089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
9099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
910