19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jcphuff.c
39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1995-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 for progressive JPEG.
99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We do not support output suspension in this module, since the library
119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * currently does not allow multiple-scan files to be written with output
129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * suspension.
139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define JPEG_INTERNALS
169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jinclude.h"
179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jpeglib.h"
189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jchuff.h"		/* Declarations shared with jchuff.c */
199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef C_PROGRESSIVE_SUPPORTED
219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Expanded entropy encoder object for progressive Huffman encoding. */
239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct {
259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  struct jpeg_entropy_encoder pub; /* public fields */
269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Mode flag: TRUE for optimization, FALSE for actual data output */
289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  boolean gather_statistics;
299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Bit-level coding status.
319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * next_output_byte/free_in_buffer are local copies of cinfo->dest fields.
329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JOCTET * next_output_byte;	/* => next byte to write in buffer */
349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  size_t free_in_buffer;	/* # of byte spaces remaining in buffer */
359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  INT32 put_buffer;		/* current bit-accumulation buffer */
369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int put_bits;			/* # of bits now in it */
379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  j_compress_ptr cinfo;		/* link to cinfo (needed for dump_buffer) */
389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Coding status for DC components */
409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Coding status for AC components */
439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int ac_tbl_no;		/* the table number of the single component */
449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  unsigned int EOBRUN;		/* run length of EOBs */
459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  unsigned int BE;		/* # of buffered correction bits before MCU */
469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  char * bit_buffer;		/* buffer for correction bits (1 per char) */
479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* packing correction bits tightly would save some space but cost time... */
489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  unsigned int restarts_to_go;	/* MCUs left in this restart interval */
509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int next_restart_num;		/* next restart number to write (0-7) */
519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Pointers to derived tables (these workspaces have image lifespan).
539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * Since any one scan codes only DC or only AC, we only need one set
549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * of tables, not one for DC and one for AC.
559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  c_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Statistics tables for optimization; again, one set is enough */
599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  long * count_ptrs[NUM_HUFF_TBLS];
609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} phuff_entropy_encoder;
619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef phuff_entropy_encoder * phuff_entropy_ptr;
639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit
659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * buffer can hold.  Larger sizes may slightly improve compression, but
669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 1000 is already well into the realm of overkill.
679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The minimum safe size is 64 bits.
689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define MAX_CORR_BITS  1000	/* Max # of correction bits I can buffer */
719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We assume that int right shift is unsigned if INT32 right shift is,
749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * which should be safe.
759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef RIGHT_SHIFT_IS_UNSIGNED
789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define ISHIFT_TEMPS	int ishift_temp;
799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define IRIGHT_SHIFT(x,shft)  \
809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	((ishift_temp = (x)) < 0 ? \
819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 (ishift_temp >> (shft)))
839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define ISHIFT_TEMPS
859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define IRIGHT_SHIFT(x,shft)	((x) >> (shft))
869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Forward declarations */
899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo,
909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project					    JBLOCKROW *MCU_data));
919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo,
929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project					    JBLOCKROW *MCU_data));
939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo,
949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project					     JBLOCKROW *MCU_data));
959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo,
969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project					     JBLOCKROW *MCU_data));
979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo));
989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo));
999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Initialize for a Huffman-compressed scan using progressive JPEG.
1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstart_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics)
1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  boolean is_DC_band;
1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int ci, tbl;
1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jpeg_component_info * compptr;
1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->cinfo = cinfo;
1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->gather_statistics = gather_statistics;
1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  is_DC_band = (cinfo->Ss == 0);
1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* We assume jcmaster.c already validated the scan parameters. */
1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Select execution routines */
1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->Ah == 0) {
1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (is_DC_band)
1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->pub.encode_mcu = encode_mcu_DC_first;
1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    else
1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->pub.encode_mcu = encode_mcu_AC_first;
1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else {
1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (is_DC_band)
1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->pub.encode_mcu = encode_mcu_DC_refine;
1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    else {
1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->pub.encode_mcu = encode_mcu_AC_refine;
1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* AC refinement needs a correction bit buffer */
1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (entropy->bit_buffer == NULL)
1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	entropy->bit_buffer = (char *)
1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				      MAX_CORR_BITS * SIZEOF(char));
1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (gather_statistics)
1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->pub.finish_pass = finish_pass_gather_phuff;
1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  else
1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->pub.finish_pass = finish_pass_phuff;
1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1
1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * for AC coefficients.
1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    compptr = cinfo->cur_comp_info[ci];
1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Initialize DC predictions to 0 */
1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->last_dc_val[ci] = 0;
1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Get table index */
1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (is_DC_band) {
1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (cinfo->Ah != 0)	/* DC refinement needs no table */
1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	continue;
1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      tbl = compptr->dc_tbl_no;
1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->ac_tbl_no = tbl = compptr->ac_tbl_no;
1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (gather_statistics) {
1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Check for invalid table index */
1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* (make_c_derived_tbl does this in the other path) */
1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project        ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Allocate and zero the statistics tables */
1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (entropy->count_ptrs[tbl] == NULL)
1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	entropy->count_ptrs[tbl] = (long *)
1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				      257 * SIZEOF(long));
1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long));
1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Compute derived values for Huffman table */
1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* We may do this more than once for a table, but it's not expensive */
1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl,
1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			      & entropy->derived_tbls[tbl]);
1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize AC stuff */
1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->EOBRUN = 0;
1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->BE = 0;
1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize bit buffer to empty */
1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->put_buffer = 0;
1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->put_bits = 0;
1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize restart stuff */
1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->restarts_to_go = cinfo->restart_interval;
1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->next_restart_num = 0;
1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Outputting bytes to the file.
1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * NB: these must be called only when actually outputting,
1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * that is, entropy->gather_statistics == FALSE.
1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Emit a byte */
1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define emit_byte(entropy,val)  \
1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	{ *(entropy)->next_output_byte++ = (JOCTET) (val);  \
2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  if (--(entropy)->free_in_buffer == 0)  \
2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    dump_buffer(entropy); }
2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectdump_buffer (phuff_entropy_ptr entropy)
2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Empty the output buffer; we do not support suspension in this module. */
2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  struct jpeg_destination_mgr * dest = entropy->cinfo->dest;
2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! (*dest->empty_output_buffer) (entropy->cinfo))
2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND);
2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* After a successful buffer dump, must reset buffer pointers */
2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->next_output_byte = dest->next_output_byte;
2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->free_in_buffer = dest->free_in_buffer;
2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Outputting bits to the file */
2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Only the right 24 bits of put_buffer are used; the valid bits are
2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * left-justified in this part.  At most 16 bits can be passed to emit_bits
2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * in one call, and we never retain more than 7 bits in put_buffer
2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * between calls, so 24 bits are sufficient.
2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectINLINE
2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectemit_bits (phuff_entropy_ptr entropy, unsigned int code, int size)
2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Emit some bits, unless we are in gather mode */
2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* This routine is heavily used, so it's worth coding tightly. */
2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register INT32 put_buffer = (INT32) code;
2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int put_bits = entropy->put_bits;
2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* if size is 0, caller used an invalid Huffman table entry */
2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (size == 0)
2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (entropy->gather_statistics)
2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return;			/* do nothing if we're only getting stats */
2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  put_bits += size;		/* new number of bits in buffer */
2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  put_buffer <<= 24 - put_bits; /* align incoming bits */
2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  put_buffer |= entropy->put_buffer; /* and merge with old buffer contents */
2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  while (put_bits >= 8) {
2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    int c = (int) ((put_buffer >> 16) & 0xFF);
2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_byte(entropy, c);
2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (c == 0xFF) {		/* need to stuff a zero byte? */
2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_byte(entropy, 0);
2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    put_buffer <<= 8;
2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    put_bits -= 8;
2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->put_buffer = put_buffer; /* update variables */
2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->put_bits = put_bits;
2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectflush_bits (phuff_entropy_ptr entropy)
2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */
2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->put_buffer = 0;     /* and reset bit-buffer to empty */
2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->put_bits = 0;
2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Emit (or just count) a Huffman symbol.
2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectINLINE
2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectemit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol)
2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (entropy->gather_statistics)
2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->count_ptrs[tbl_no][symbol]++;
2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  else {
2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    c_derived_tbl * tbl = entropy->derived_tbls[tbl_no];
2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);
2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Emit bits from a correction bit buffer.
2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectemit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart,
2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		    unsigned int nbits)
2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (entropy->gather_statistics)
3019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return;			/* no real work */
3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  while (nbits > 0) {
3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_bits(entropy, (unsigned int) (*bufstart), 1);
3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    bufstart++;
3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    nbits--;
3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Emit any pending EOBRUN symbol.
3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectemit_eobrun (phuff_entropy_ptr entropy)
3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int temp, nbits;
3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (entropy->EOBRUN > 0) {	/* if there is any pending EOBRUN */
3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp = entropy->EOBRUN;
3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    nbits = 0;
3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while ((temp >>= 1))
3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      nbits++;
3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* safety check: shouldn't happen given limited correction-bit buffer */
3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (nbits > 14)
3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4);
3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (nbits)
3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_bits(entropy, entropy->EOBRUN, nbits);
3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->EOBRUN = 0;
3349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Emit any buffered correction bits */
3369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE);
3379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->BE = 0;
3389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
3409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
3439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Emit a restart marker & resynchronize predictions.
3449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
3459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
3479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectemit_restart (phuff_entropy_ptr entropy, int restart_num)
3489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
3499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int ci;
3509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  emit_eobrun(entropy);
3529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! entropy->gather_statistics) {
3549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    flush_bits(entropy);
3559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_byte(entropy, 0xFF);
3569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_byte(entropy, JPEG_RST0 + restart_num);
3579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (entropy->cinfo->Ss == 0) {
3609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Re-initialize DC predictions to 0 */
3619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++)
3629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->last_dc_val[ci] = 0;
3639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else {
3649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Re-initialize all AC-related fields to 0 */
3659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->EOBRUN = 0;
3669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->BE = 0;
3679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
3699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
3729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * MCU encoding for DC initial scan (either spectral selection,
3739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * or first pass of successive approximation).
3749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
3759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean)
3779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectencode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
3789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
3799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
3809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int temp, temp2;
3819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int nbits;
3829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int blkn, ci;
3839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int Al = cinfo->Al;
3849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JBLOCKROW block;
3859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jpeg_component_info * compptr;
3869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ISHIFT_TEMPS
3879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->next_output_byte = cinfo->dest->next_output_byte;
3899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
3909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Emit restart marker if needed */
3929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->restart_interval)
3939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->restarts_to_go == 0)
3949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_restart(entropy, entropy->next_restart_num);
3959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Encode the MCU data blocks */
3979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
3989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    block = MCU_data[blkn];
3999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ci = cinfo->MCU_membership[blkn];
4009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    compptr = cinfo->cur_comp_info[ci];
4019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Compute the DC value after the required point transform by Al.
4039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * This is simply an arithmetic right shift.
4049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
4059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);
4069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* DC differences are figured on the point-transformed values. */
4089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp = temp2 - entropy->last_dc_val[ci];
4099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->last_dc_val[ci] = temp2;
4109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Encode the DC coefficient difference per section G.1.2.1 */
4129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp2 = temp;
4139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (temp < 0) {
4149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      temp = -temp;		/* temp is abs value of input */
4159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* For a negative input, want temp2 = bitwise complement of abs(input) */
4169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* This code assumes we are on a two's complement machine */
4179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      temp2--;
4189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
4199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Find the number of bits needed for the magnitude of the coefficient */
4219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    nbits = 0;
4229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while (temp) {
4239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      nbits++;
4249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      temp >>= 1;
4259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
4269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Check for out-of-range coefficient values.
4279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * Since we're encoding a difference, the range limit is twice as much.
4289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
4299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (nbits > MAX_COEF_BITS+1)
4309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_BAD_DCT_COEF);
4319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Count/emit the Huffman-coded symbol for the number of bits */
4339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_symbol(entropy, compptr->dc_tbl_no, nbits);
4349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Emit that number of bits of the value, if positive, */
4369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* or the complement of its magnitude, if negative. */
4379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (nbits)			/* emit_bits rejects calls with size 0 */
4389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_bits(entropy, (unsigned int) temp2, nbits);
4399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
4409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->next_output_byte = entropy->next_output_byte;
4429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
4439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Update restart-interval state too */
4459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->restart_interval) {
4469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->restarts_to_go == 0) {
4479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->restarts_to_go = cinfo->restart_interval;
4489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->next_restart_num++;
4499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->next_restart_num &= 7;
4509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
4519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->restarts_to_go--;
4529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
4539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
4559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
4569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
4599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * MCU encoding for AC initial scan (either spectral selection,
4609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * or first pass of successive approximation).
4619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
4629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean)
4649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectencode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
4659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
4669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
4679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int temp, temp2;
4689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int nbits;
4699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int r, k;
4709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int Se = cinfo->Se;
4719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int Al = cinfo->Al;
4729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JBLOCKROW block;
4739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->next_output_byte = cinfo->dest->next_output_byte;
4759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
4769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Emit restart marker if needed */
4789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->restart_interval)
4799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->restarts_to_go == 0)
4809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_restart(entropy, entropy->next_restart_num);
4819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Encode the MCU data block */
4839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  block = MCU_data[0];
4849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */
4869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  r = 0;			/* r = run length of zeros */
4889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (k = cinfo->Ss; k <= Se; k++) {
4909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if ((temp = (*block)[jpeg_natural_order[k]]) == 0) {
4919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      r++;
4929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      continue;
4939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
4949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* We must apply the point transform by Al.  For AC coefficients this
4959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * is an integer division with rounding towards 0.  To do this portably
4969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * in C, we shift after obtaining the absolute value; so the code is
4979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * interwoven with finding the abs value (temp) and output bits (temp2).
4989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
4999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (temp < 0) {
5009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      temp = -temp;		/* temp is abs value of input */
5019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      temp >>= Al;		/* apply the point transform */
5029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* For a negative coef, want temp2 = bitwise complement of abs(coef) */
5039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      temp2 = ~temp;
5049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
5059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      temp >>= Al;		/* apply the point transform */
5069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      temp2 = temp;
5079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
5089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Watch out for case that nonzero coef is zero after point transform */
5099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (temp == 0) {
5109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      r++;
5119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      continue;
5129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
5139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Emit any pending EOBRUN */
5159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->EOBRUN > 0)
5169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_eobrun(entropy);
5179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* if run length > 15, must emit special run-length-16 codes (0xF0) */
5189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while (r > 15) {
5199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
5209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      r -= 16;
5219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
5229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Find the number of bits needed for the magnitude of the coefficient */
5249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    nbits = 1;			/* there must be at least one 1 bit */
5259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while ((temp >>= 1))
5269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      nbits++;
5279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Check for out-of-range coefficient values */
5289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (nbits > MAX_COEF_BITS)
5299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_BAD_DCT_COEF);
5309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Count/emit Huffman symbol for run length / number of bits */
5329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits);
5339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Emit that number of bits of the value, if positive, */
5359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* or the complement of its magnitude, if negative. */
5369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_bits(entropy, (unsigned int) temp2, nbits);
5379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    r = 0;			/* reset zero run length */
5399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
5409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (r > 0) {			/* If there are trailing zeroes, */
5429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->EOBRUN++;		/* count an EOB */
5439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->EOBRUN == 0x7FFF)
5449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_eobrun(entropy);	/* force it out to avoid overflow */
5459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
5469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->next_output_byte = entropy->next_output_byte;
5489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
5499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Update restart-interval state too */
5519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->restart_interval) {
5529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->restarts_to_go == 0) {
5539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->restarts_to_go = cinfo->restart_interval;
5549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->next_restart_num++;
5559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->next_restart_num &= 7;
5569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
5579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->restarts_to_go--;
5589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
5599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
5619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
5629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
5659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * MCU encoding for DC successive approximation refinement scan.
5669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note: we assume such scans can be multi-component, although the spec
5679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * is not very clear on the point.
5689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
5699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean)
5719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectencode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
5729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
5739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
5749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int temp;
5759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int blkn;
5769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int Al = cinfo->Al;
5779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JBLOCKROW block;
5789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->next_output_byte = cinfo->dest->next_output_byte;
5809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
5819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Emit restart marker if needed */
5839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->restart_interval)
5849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->restarts_to_go == 0)
5859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_restart(entropy, entropy->next_restart_num);
5869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Encode the MCU data blocks */
5889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
5899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    block = MCU_data[blkn];
5909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* We simply emit the Al'th bit of the DC coefficient value. */
5929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp = (*block)[0];
5939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_bits(entropy, (unsigned int) (temp >> Al), 1);
5949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
5959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->next_output_byte = entropy->next_output_byte;
5979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
5989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Update restart-interval state too */
6009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->restart_interval) {
6019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->restarts_to_go == 0) {
6029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->restarts_to_go = cinfo->restart_interval;
6039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->next_restart_num++;
6049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->next_restart_num &= 7;
6059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
6069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->restarts_to_go--;
6079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
6089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
6109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
6119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
6149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * MCU encoding for AC successive approximation refinement scan.
6159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
6169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean)
6189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectencode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
6199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
6209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
6219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int temp;
6229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int r, k;
6239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int EOB;
6249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  char *BR_buffer;
6259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  unsigned int BR;
6269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int Se = cinfo->Se;
6279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int Al = cinfo->Al;
6289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JBLOCKROW block;
6299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int absvalues[DCTSIZE2];
6309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->next_output_byte = cinfo->dest->next_output_byte;
6329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
6339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Emit restart marker if needed */
6359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->restart_interval)
6369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->restarts_to_go == 0)
6379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_restart(entropy, entropy->next_restart_num);
6389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Encode the MCU data block */
6409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  block = MCU_data[0];
6419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* It is convenient to make a pre-pass to determine the transformed
6439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * coefficients' absolute values and the EOB position.
6449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
6459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  EOB = 0;
6469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (k = cinfo->Ss; k <= Se; k++) {
6479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp = (*block)[jpeg_natural_order[k]];
6489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* We must apply the point transform by Al.  For AC coefficients this
6499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * is an integer division with rounding towards 0.  To do this portably
6509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * in C, we shift after obtaining the absolute value.
6519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
6529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (temp < 0)
6539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      temp = -temp;		/* temp is abs value of input */
6549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp >>= Al;		/* apply the point transform */
6559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    absvalues[k] = temp;	/* save abs value for main pass */
6569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (temp == 1)
6579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      EOB = k;			/* EOB = index of last newly-nonzero coef */
6589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
6599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */
6619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  r = 0;			/* r = run length of zeros */
6639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  BR = 0;			/* BR = count of buffered bits added now */
6649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */
6659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (k = cinfo->Ss; k <= Se; k++) {
6679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if ((temp = absvalues[k]) == 0) {
6689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      r++;
6699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      continue;
6709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
6719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Emit any required ZRLs, but not if they can be folded into EOB */
6739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while (r > 15 && k <= EOB) {
6749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* emit any pending EOBRUN and the BE correction bits */
6759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_eobrun(entropy);
6769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Emit ZRL */
6779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
6789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      r -= 16;
6799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Emit buffered correction bits that must be associated with ZRL */
6809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_buffered_bits(entropy, BR_buffer, BR);
6819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
6829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      BR = 0;
6839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
6849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* If the coef was previously nonzero, it only needs a correction bit.
6869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * NOTE: a straight translation of the spec's figure G.7 would suggest
6879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * that we also need to test r > 15.  But if r > 15, we can only get here
6889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * if k > EOB, which implies that this coefficient is not 1.
6899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
6909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (temp > 1) {
6919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* The correction bit is the next bit of the absolute value. */
6929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      BR_buffer[BR++] = (char) (temp & 1);
6939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      continue;
6949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
6959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Emit any pending EOBRUN and the BE correction bits */
6979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_eobrun(entropy);
6989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Count/emit Huffman symbol for run length / number of bits */
7009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1);
7019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Emit output bit for newly-nonzero coef */
7039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1;
7049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_bits(entropy, (unsigned int) temp, 1);
7059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Emit buffered correction bits that must be associated with this code */
7079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    emit_buffered_bits(entropy, BR_buffer, BR);
7089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
7099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    BR = 0;
7109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    r = 0;			/* reset zero run length */
7119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
7129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (r > 0 || BR > 0) {	/* If there are trailing zeroes, */
7149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->EOBRUN++;		/* count an EOB */
7159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->BE += BR;		/* concat my correction bits to older ones */
7169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* We force out the EOB if we risk either:
7179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * 1. overflow of the EOB counter;
7189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * 2. overflow of the correction bit buffer during the next MCU.
7199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
7209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1))
7219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      emit_eobrun(entropy);
7229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
7239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->next_output_byte = entropy->next_output_byte;
7259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
7269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Update restart-interval state too */
7289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->restart_interval) {
7299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->restarts_to_go == 0) {
7309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->restarts_to_go = cinfo->restart_interval;
7319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->next_restart_num++;
7329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->next_restart_num &= 7;
7339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
7349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->restarts_to_go--;
7359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
7369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
7389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
7399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
7429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Finish up at the end of a Huffman-compressed progressive scan.
7439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
7449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
7469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectfinish_pass_phuff (j_compress_ptr cinfo)
7479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
7489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
7499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->next_output_byte = cinfo->dest->next_output_byte;
7519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->free_in_buffer = cinfo->dest->free_in_buffer;
7529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Flush out any buffered data */
7549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  emit_eobrun(entropy);
7559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  flush_bits(entropy);
7569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->next_output_byte = entropy->next_output_byte;
7589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->dest->free_in_buffer = entropy->free_in_buffer;
7599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
7609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
7639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Finish up a statistics-gathering pass and create the new Huffman tables.
7649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
7659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
7679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectfinish_pass_gather_phuff (j_compress_ptr cinfo)
7689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
7699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
7709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  boolean is_DC_band;
7719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int ci, tbl;
7729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jpeg_component_info * compptr;
7739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JHUFF_TBL **htblptr;
7749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  boolean did[NUM_HUFF_TBLS];
7759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Flush out buffered data (all we care about is counting the EOB symbol) */
7779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  emit_eobrun(entropy);
7789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  is_DC_band = (cinfo->Ss == 0);
7809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* It's important not to apply jpeg_gen_optimal_table more than once
7829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * per table, because it clobbers the input frequency counts!
7839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
7849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  MEMZERO(did, SIZEOF(did));
7859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
7879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    compptr = cinfo->cur_comp_info[ci];
7889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (is_DC_band) {
7899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (cinfo->Ah != 0)	/* DC refinement needs no table */
7909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	continue;
7919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      tbl = compptr->dc_tbl_no;
7929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
7939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      tbl = compptr->ac_tbl_no;
7949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
7959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (! did[tbl]) {
7969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (is_DC_band)
7979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project        htblptr = & cinfo->dc_huff_tbl_ptrs[tbl];
7989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      else
7999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project        htblptr = & cinfo->ac_huff_tbl_ptrs[tbl];
8009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (*htblptr == NULL)
8019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project        *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
8029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]);
8039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      did[tbl] = TRUE;
8049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
8059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
8069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
8079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
8109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Module initialization routine for progressive Huffman entropy encoding.
8119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
8129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
8149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjinit_phuff_encoder (j_compress_ptr cinfo)
8159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
8169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  phuff_entropy_ptr entropy;
8179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int i;
8189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy = (phuff_entropy_ptr)
8209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
8219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				SIZEOF(phuff_entropy_encoder));
8229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
8239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->pub.start_pass = start_pass_phuff;
8249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Mark tables unallocated */
8269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = 0; i < NUM_HUFF_TBLS; i++) {
8279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->derived_tbls[i] = NULL;
8289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->count_ptrs[i] = NULL;
8299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
8309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->bit_buffer = NULL;	/* needed only in AC refinement scan */
8319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
8329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* C_PROGRESSIVE_SUPPORTED */
834