19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jdhuff.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 decoding routines.
99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Much of the complexity here has to do with supporting input suspension.
119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If the data source module demands suspension, we want to be able to back
129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * up to the start of the current MCU.  To do this, we copy state variables
139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * into local working storage, and update them back to the permanent
149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * storage 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 "jdhuff.h"		/* Declarations shared with jdphuff.c */
219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
22f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph WenLOCAL(boolean) process_restart (j_decompress_ptr cinfo);
23f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen
249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Expanded entropy decoder object for Huffman decoding.
279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The savable_state subrecord contains fields that change within an MCU,
299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * but must not be updated permanently until we complete the MCU.
309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct {
339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} savable_state;
359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* This macro is to work around compilers with missing or broken
379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * structure assignment.  You'll need to fix this code if you have
389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * such a compiler and you change MAX_COMPS_IN_SCAN.
399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifndef NO_STRUCT_ASSIGN
429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define ASSIGN_STATE(dest,src)  ((dest) = (src))
439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#if MAX_COMPS_IN_SCAN == 4
459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define ASSIGN_STATE(dest,src)  \
469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	((dest).last_dc_val[0] = (src).last_dc_val[0], \
479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 (dest).last_dc_val[1] = (src).last_dc_val[1], \
489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 (dest).last_dc_val[2] = (src).last_dc_val[2], \
499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 (dest).last_dc_val[3] = (src).last_dc_val[3])
509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct {
559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  struct jpeg_entropy_decoder pub; /* public fields */
569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* These fields are loaded into local variables at start of each MCU.
589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * In case of suspension, we exit WITHOUT updating them.
599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  bitread_perm_state bitstate;	/* Bit buffer at start of MCU */
619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  savable_state saved;		/* Other state at start of MCU */
629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* These fields are NOT loaded into local working state. */
649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  unsigned int restarts_to_go;	/* MCUs left in this restart interval */
659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Pointers to derived tables (these workspaces have image lifespan) */
679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Precalculated info set up by start_pass for use in decode_mcu: */
719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Pointers to derived tables to be used for each block within an MCU */
739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU];
749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU];
759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Whether we care about the DC and AC coefficient values for each block */
769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  boolean dc_needed[D_MAX_BLOCKS_IN_MCU];
779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  boolean ac_needed[D_MAX_BLOCKS_IN_MCU];
789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} huff_entropy_decoder;
799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef huff_entropy_decoder * huff_entropy_ptr;
819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Initialize for a Huffman-compressed scan.
849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstart_pass_huff_decoder (j_decompress_ptr cinfo)
889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int ci, blkn, dctbl, actbl;
919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jpeg_component_info * compptr;
929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * This ought to be an error condition, but we make it a warning because
959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * there are some baseline files out there with all zeroes in these bytes.
969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 ||
989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->Ah != 0 || cinfo->Al != 0)
999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    compptr = cinfo->cur_comp_info[ci];
1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    dctbl = compptr->dc_tbl_no;
1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    actbl = compptr->ac_tbl_no;
1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Compute derived values for Huffman tables */
1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* We may do this more than once for a table, but it's not expensive */
1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl,
1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			    & entropy->dc_derived_tbls[dctbl]);
1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    jpeg_make_d_derived_tbl(cinfo, FALSE, actbl,
1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			    & entropy->ac_derived_tbls[actbl]);
1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Initialize DC predictions to 0 */
1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->saved.last_dc_val[ci] = 0;
1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Precalculate decoding info for each block in an MCU of this scan */
1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ci = cinfo->MCU_membership[blkn];
1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    compptr = cinfo->cur_comp_info[ci];
1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Precalculate which table to use for each block */
1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];
1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no];
1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Decide whether we really care about the coefficient values */
1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (compptr->component_needed) {
1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->dc_needed[blkn] = TRUE;
1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* we don't need the ACs if producing a 1/8th-size image */
1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1);
1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE;
1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize bitread state variables */
1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->bitstate.bits_left = 0;
1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->pub.insufficient_data = FALSE;
1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize restart counter */
1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->restarts_to_go = cinfo->restart_interval;
1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Compute the derived values for a Huffman table.
1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This routine also performs some validation checks on the table.
1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note this is also used by jdphuff.c.
1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno,
1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			 d_derived_tbl ** pdtbl)
1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JHUFF_TBL *htbl;
1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  d_derived_tbl *dtbl;
1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int p, i, l, si, numsymbols;
1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int lookbits, ctr;
1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  char huffsize[257];
1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  unsigned int huffcode[257];
1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  unsigned int code;
1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Note that huffsize[] and huffcode[] are filled in code-length order,
1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * paralleling the order of the symbols themselves in htbl->huffval[].
1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Find the input Huffman table */
1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  htbl =
1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (htbl == NULL)
1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Allocate a workspace if we haven't already done so. */
1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (*pdtbl == NULL)
1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    *pdtbl = (d_derived_tbl *)
1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				  SIZEOF(d_derived_tbl));
1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  dtbl = *pdtbl;
1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  dtbl->pub = htbl;		/* fill in back link */
1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Figure C.1: make table of Huffman code length for each symbol */
1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  p = 0;
1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (l = 1; l <= 16; l++) {
1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    i = (int) htbl->bits[l];
1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (i < 0 || p + i > 256)	/* protect against table overrun */
1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while (i--)
1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      huffsize[p++] = (char) l;
1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  huffsize[p] = 0;
1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  numsymbols = p;
1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Figure C.2: generate the codes themselves */
1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* We also validate that the counts represent a legal Huffman code tree. */
1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  code = 0;
1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  si = huffsize[0];
1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  p = 0;
2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  while (huffsize[p]) {
2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while (((int) huffsize[p]) == si) {
2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      huffcode[p++] = code;
2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      code++;
2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* code is now 1 more than the last code used for codelength si; but
2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * it must still fit in si bits, since no code is allowed to be all ones.
2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (((INT32) code) >= (((INT32) 1) << si))
2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    code <<= 1;
2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    si++;
2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Figure F.15: generate decoding tables for bit-sequential decoding */
2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  p = 0;
2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (l = 1; l <= 16; l++) {
2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (htbl->bits[l]) {
2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* valoffset[l] = huffval[] index of 1st symbol of code length l,
2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project       * minus the minimum code of length l
2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project       */
2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p];
2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      p += htbl->bits[l];
2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */
2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      dtbl->maxcode[l] = -1;	/* -1 if no codes of this length */
2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */
2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Compute lookahead tables to speed up decoding.
2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * First we set all the table entries to 0, indicating "too long";
2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * then we iterate through the Huffman codes that are short enough and
2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * fill in all the entries that correspond to bit sequences starting
2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * with that code.
2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits));
2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  p = 0;
2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (l = 1; l <= HUFF_LOOKAHEAD; l++) {
2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    for (i = 1; i <= (int) htbl->bits[l]; i++, p++) {
2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* l = current code's length, p = its index in huffcode[] & huffval[]. */
2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Generate left-justified code followed by all possible bit sequences */
2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);
2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) {
2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	dtbl->look_nbits[lookbits] = l;
2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	dtbl->look_sym[lookbits] = htbl->huffval[p];
2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	lookbits++;
2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Validate symbols as being reasonable.
2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * For AC tables, we make no check, but accept all byte values 0..255.
2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * For DC tables, we require the symbols to be in range 0..15.
2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * (Tighter bounds could be applied depending on the data depth and mode,
2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * but this is sufficient to ensure safe decoding.)
2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (isDC) {
2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    for (i = 0; i < numsymbols; i++) {
2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      int sym = htbl->huffval[i];
2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (sym < 0 || sym > 15)
2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Out-of-line code for bit fetching (shared with jdphuff.c).
2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * See jdhuff.h for info about usage.
2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note: current values of get_buffer and bits_left are passed as parameters,
2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * but are returned in the corresponding fields of the state struct.
2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width
2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * of get_buffer to be used.  (On machines with wider words, an even larger
2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * buffer could be used.)  However, on some machines 32-bit shifts are
2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * quite slow and take time proportional to the number of places shifted.
2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (This is true with most PC compilers, for instance.)  In this case it may
2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * be a win to set MIN_GET_BITS to the minimum value of 15.  This reduces the
2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * average shift distance at the cost of more calls to jpeg_fill_bit_buffer.
2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef SLOW_SHIFT_32
2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define MIN_GET_BITS  15	/* minimum allowable value */
2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define MIN_GET_BITS  (BIT_BUF_SIZE-7)
2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(boolean)
2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_fill_bit_buffer (bitread_working_state * state,
2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		      register bit_buf_type get_buffer, register int bits_left,
2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		      int nbits)
2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Load up the bit buffer to a depth of at least nbits */
2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Copy heavily used state fields into locals (hopefully registers) */
2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register const JOCTET * next_input_byte = state->next_input_byte;
3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register size_t bytes_in_buffer = state->bytes_in_buffer;
30127c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  j_decompress_ptr cinfo = state->cinfo;
3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */
3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* (It is assumed that no request will be for more than that many bits.) */
3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* We fail to do so only if we hit a marker or are forced to suspend. */
3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->unread_marker == 0) {	/* cannot advance past a marker */
3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while (bits_left < MIN_GET_BITS) {
3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      register int c;
3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Attempt to read a byte */
3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (bytes_in_buffer == 0) {
3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	if (! (*cinfo->src->fill_input_buffer) (cinfo))
3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  return FALSE;
3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	next_input_byte = cinfo->src->next_input_byte;
3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	bytes_in_buffer = cinfo->src->bytes_in_buffer;
3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      bytes_in_buffer--;
3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      c = GETJOCTET(*next_input_byte++);
3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* If it's 0xFF, check and discard stuffed zero byte */
3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (c == 0xFF) {
3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	/* Loop here to discard any padding FF's on terminating marker,
3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 * so that we can save a valid unread_marker value.  NOTE: we will
3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 * accept multiple FF's followed by a 0 as meaning a single FF data
3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 * byte.  This data pattern is not valid according to the standard.
3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	 */
3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	do {
3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  if (bytes_in_buffer == 0) {
3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    if (! (*cinfo->src->fill_input_buffer) (cinfo))
3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	      return FALSE;
3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    next_input_byte = cinfo->src->next_input_byte;
3339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    bytes_in_buffer = cinfo->src->bytes_in_buffer;
3349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  }
3359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  bytes_in_buffer--;
3369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  c = GETJOCTET(*next_input_byte++);
3379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	} while (c == 0xFF);
3389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	if (c == 0) {
3409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  /* Found FF/00, which represents an FF data byte */
3419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  c = 0xFF;
3429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	} else {
3439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  /* Oops, it's actually a marker indicating end of compressed data.
3449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	   * Save the marker code for later use.
3459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	   * Fine point: it might appear that we should save the marker into
3469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	   * bitread working state, not straight into permanent state.  But
3479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	   * once we have hit a marker, we cannot need to suspend within the
3489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	   * current MCU, because we will read no more bytes from the data
3499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	   * source.  So it is OK to update permanent state right away.
3509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	   */
3519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  cinfo->unread_marker = c;
3529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  /* See if we need to insert some fake zero bits. */
3539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  goto no_more_bytes;
3549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	}
3559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
3569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* OK, load c into get_buffer */
3589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      get_buffer = (get_buffer << 8) | c;
3599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      bits_left += 8;
3609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } /* end while */
3619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else {
3629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  no_more_bytes:
3639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* We get here if we've read the marker that terminates the compressed
3649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * data segment.  There should be enough bits in the buffer register
3659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * to satisfy the request; if so, no problem.
3669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
3679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (nbits > bits_left) {
3689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Uh-oh.  Report corrupted data to user and stuff zeroes into
3699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project       * the data stream, so that we can produce some kind of image.
3709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project       * We use a nonvolatile flag to ensure that only one warning message
3719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project       * appears per data segment.
3729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project       */
3739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (! cinfo->entropy->insufficient_data) {
3749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	WARNMS(cinfo, JWRN_HIT_MARKER);
3759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	cinfo->entropy->insufficient_data = TRUE;
3769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
3779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Fill the buffer with zero bits */
3789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      get_buffer <<= MIN_GET_BITS - bits_left;
3799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      bits_left = MIN_GET_BITS;
3809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
3819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Unload the local registers */
3849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state->next_input_byte = next_input_byte;
3859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state->bytes_in_buffer = bytes_in_buffer;
3869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state->get_buffer = get_buffer;
3879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state->bits_left = bits_left;
3889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
3909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
3919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
3949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Out-of-line code for Huffman code decoding.
3959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * See jdhuff.h for info about usage.
3969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
3979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(int)
3999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_huff_decode (bitread_working_state * state,
4009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		  register bit_buf_type get_buffer, register int bits_left,
4019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		  d_derived_tbl * htbl, int min_bits)
4029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
4039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int l = min_bits;
4049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register INT32 code;
4059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* HUFF_DECODE has determined that the code is at least min_bits */
4079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* bits long, so fetch that many bits in one swoop. */
4089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  CHECK_BIT_BUFFER(*state, l, return -1);
4109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  code = GET_BITS(l);
4119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Collect the rest of the Huffman code one bit at a time. */
4139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* This is per Figure F.16 in the JPEG spec. */
4149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  while (code > htbl->maxcode[l]) {
4169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    code <<= 1;
4179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    CHECK_BIT_BUFFER(*state, 1, return -1);
4189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    code |= GET_BITS(1);
4199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    l++;
4209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
4219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Unload the local registers */
4239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state->get_buffer = get_buffer;
4249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  state->bits_left = bits_left;
4259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* With garbage input we may reach the sentinel value l = 17. */
4279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (l > 16) {
4299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE);
4309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return 0;			/* fake a zero as the safest result */
4319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
4329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ];
4349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
4359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
4389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Figure F.12: extend sign bit.
4399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * On some machines, a shift and add will be faster than a table lookup.
4409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
4419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef AVOID_TABLES
4439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define HUFF_EXTEND(x,s)  ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))
4459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
4479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define HUFF_EXTEND(x,s)  ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
4499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic const int extend_test[16] =   /* entry n is 2**(n-1) */
4519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
4529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };
4539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic const int extend_offset[16] = /* entry n is (-1 << n) + 1 */
4559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,
4569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,
4579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,
4589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };
4599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* AVOID_TABLES */
4619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
4649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Check for a restart marker & resynchronize decoder.
4659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Returns FALSE if must suspend.
4669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
4679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(boolean)
4699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectprocess_restart (j_decompress_ptr cinfo)
4709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
4719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
4729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int ci;
4739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Throw away any unused bits remaining in bit buffer; */
4759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* include any full bytes in next_marker's count of discarded bytes */
4769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
4779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->bitstate.bits_left = 0;
4789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Advance past the RSTn marker */
4809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! (*cinfo->marker->read_restart_marker) (cinfo))
4819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return FALSE;
4829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Re-initialize DC predictions to 0 */
4849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (ci = 0; ci < cinfo->comps_in_scan; ci++)
4859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->saved.last_dc_val[ci] = 0;
4869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Reset restart counter */
4889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->restarts_to_go = cinfo->restart_interval;
4899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Reset out-of-data flag, unless read_restart_marker left us smack up
4919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * against a marker.  In that case we will end up treating the next data
4929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * segment as empty, and we can avoid producing bogus output pixels by
4939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * leaving the flag set.
4949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
4959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->unread_marker == 0)
4969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    entropy->pub.insufficient_data = FALSE;
4979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
4999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
5009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5013147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen/*
50227c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen * Save the current Huffman deocde position and the DC coefficients
50327c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen * for each component into bitstream_offset and dc_info[], respectively.
5043147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen */
50527c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta ChenMETHODDEF(void)
50627c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chenget_huffman_decoder_configuration(j_decompress_ptr cinfo,
50727c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen        huffman_offset_data *offset)
5083147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen{
50927c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
51027c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  short int *dc_info = offset->prev_dc;
51127c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  int i;
51227c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  jpeg_get_huffman_decoder_configuration(cinfo, offset);
51327c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  for (i = 0; i < cinfo->comps_in_scan; i++) {
51427c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen    dc_info[i] = entropy->saved.last_dc_val[i];
51527c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  }
516f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen}
5173147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
518f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen/*
519f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen * Save the current Huffman decoder position and the bit buffer
520f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen * into bitstream_offset and get_buffer, respectively.
521f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen */
522f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph WenGLOBAL(void)
523f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wenjpeg_get_huffman_decoder_configuration(j_decompress_ptr cinfo,
524f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        huffman_offset_data *offset)
525f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen{
526f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
5273147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
528f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  if (cinfo->restart_interval) {
529f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    // We are at the end of a data segment
530f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    if (entropy->restarts_to_go == 0)
531f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      if (! process_restart(cinfo))
532f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen	return;
5333147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  }
5343147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
53527c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  // Save restarts_to_go and next_restart_num
53627c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  offset->restarts_to_go = (unsigned short) entropy->restarts_to_go;
53727c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  offset->next_restart_num = cinfo->marker->next_restart_num;
53827c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen
539f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  offset->bitstream_offset =
540f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      (jget_input_stream_position(cinfo) << LOG_TWO_BIT_BUF_SIZE)
541f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      + entropy->bitstate.bits_left;
542f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen
543f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  offset->get_buffer = entropy->bitstate.get_buffer;
544f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen}
5453147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
546f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen/*
547f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen * Configure the Huffman decoder to decode the image
548f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen * starting from the bitstream position recorded in offset.
549f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen */
550f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph WenMETHODDEF(void)
551f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wenconfigure_huffman_decoder(j_decompress_ptr cinfo, huffman_offset_data offset)
552f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen{
553f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
554f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  short int *dc_info = offset.prev_dc;
555f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  int i;
556f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  jpeg_configure_huffman_decoder(cinfo, offset);
5573147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  for (i = 0; i < cinfo->comps_in_scan; i++) {
5583147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    entropy->saved.last_dc_val[i] = dc_info[i];
5593147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  }
5603147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen}
5613147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
5623147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen/*
56327c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen * Configure the Huffman decoder reader position and bit buffer.
5643147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen */
56527c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta ChenGLOBAL(void)
56627c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chenjpeg_configure_huffman_decoder(j_decompress_ptr cinfo,
56727c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen        huffman_offset_data offset)
5683147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen{
5693147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
57027c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen
57127c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  // Restore restarts_to_go and next_restart_num
57227c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  cinfo->unread_marker = 0;
57327c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  entropy->restarts_to_go = offset.restarts_to_go;
57427c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  cinfo->marker->next_restart_num = offset.next_restart_num;
57527c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen
57627c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  unsigned int bitstream_offset = offset.bitstream_offset;
57727c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  int blkn, i;
57827c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen
57927c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  unsigned int byte_offset = bitstream_offset >> LOG_TWO_BIT_BUF_SIZE;
58027c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  unsigned int bit_in_bit_buffer =
58127c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen      bitstream_offset & ((1 << LOG_TWO_BIT_BUF_SIZE) - 1);
58227c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen
58327c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen  jset_input_stream_position_bit(cinfo, byte_offset,
58427c2e1a63730561332f4d3c406c7e9b7c36963d2Wei-Ta Chen          bit_in_bit_buffer, offset.get_buffer);
5853147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen}
5869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
5889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Decode and return one MCU's worth of Huffman-compressed coefficients.
5899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The coefficients are reordered from zigzag order into natural array order,
5909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * but are not dequantized.
5919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
5929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The i'th block of the MCU is stored into the block pointed to by
5939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * MCU_data[i].  WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER.
5949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (Wholesale zeroing is usually a little faster than retail...)
5959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
5969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Returns FALSE if data source requested suspension.  In that case no
5979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * changes have been made to permanent state.  (Exception: some output
5989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * coefficients may already have been assigned.  This is harmless for
5999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * this module, since we'll just re-assign them on the next call.)
6009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
6019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(boolean)
6039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectdecode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
6049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
6059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
6069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int blkn;
6079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  BITREAD_STATE_VARS;
6089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  savable_state state;
6099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Process restart marker if needed; may have to suspend */
6119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->restart_interval) {
6129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (entropy->restarts_to_go == 0)
6139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (! process_restart(cinfo))
6149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	return FALSE;
6159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
6169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* If we've run out of data, just leave the MCU set to zeroes.
6189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * This way, we return uniform gray for the remainder of the segment.
6199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
6209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! entropy->pub.insufficient_data) {
6219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Load up working state */
6229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
6239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ASSIGN_STATE(state, entropy->saved);
6249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Outer loop handles each block in the MCU */
6269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
6289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      JBLOCKROW block = MCU_data[blkn];
6299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn];
6309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn];
6319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      register int s, k, r;
6329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Decode a single block's worth of coefficients */
6349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Section F.2.2.1: decode the DC coefficient difference */
6369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      HUFF_DECODE(s, br_state, dctbl, return FALSE, label1);
6379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (s) {
6389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	CHECK_BIT_BUFFER(br_state, s, return FALSE);
6399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	r = GET_BITS(s);
6409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	s = HUFF_EXTEND(r, s);
6419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
6429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (entropy->dc_needed[blkn]) {
6449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	/* Convert DC difference to actual value, update last_dc_val */
6459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	int ci = cinfo->MCU_membership[blkn];
6469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	s += state.last_dc_val[ci];
6479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	state.last_dc_val[ci] = s;
6489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	/* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */
6499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	(*block)[0] = (JCOEF) s;
6509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
6519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (entropy->ac_needed[blkn]) {
6539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	/* Section F.2.2.2: decode the AC coefficients */
6559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	/* Since zeroes are skipped, output area must be cleared beforehand */
6569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	for (k = 1; k < DCTSIZE2; k++) {
6579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  HUFF_DECODE(s, br_state, actbl, return FALSE, label2);
6589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  r = s >> 4;
6609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  s &= 15;
6619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  if (s) {
6639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    k += r;
6649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    CHECK_BIT_BUFFER(br_state, s, return FALSE);
6659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    r = GET_BITS(s);
6669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    s = HUFF_EXTEND(r, s);
6679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    /* Output coefficient in natural (dezigzagged) order.
6689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	     * Note: the extra entries in jpeg_natural_order[] will save us
6699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	     * if k >= DCTSIZE2, which could happen if the data is corrupted.
6709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	     */
6719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    (*block)[jpeg_natural_order[k]] = (JCOEF) s;
6729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  } else {
6739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    if (r != 15)
6749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	      break;
6759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    k += 15;
6769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  }
6779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	}
6789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      } else {
6809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	/* Section F.2.2.2: decode the AC coefficients */
6829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	/* In this path we just discard the values */
6839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	for (k = 1; k < DCTSIZE2; k++) {
6849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  HUFF_DECODE(s, br_state, actbl, return FALSE, label3);
6859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  r = s >> 4;
6879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  s &= 15;
6889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
6899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  if (s) {
6909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    k += r;
6919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    CHECK_BIT_BUFFER(br_state, s, return FALSE);
6929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    DROP_BITS(s);
6939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  } else {
6949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    if (r != 15)
6959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	      break;
6969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    k += 15;
6979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  }
6989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	}
6999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
7019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
7029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Completed MCU, so update state */
7049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
7059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ASSIGN_STATE(entropy->saved, state);
7069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
7079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Account for restart interval (no-op if not using restarts) */
7099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->restarts_to_go--;
7109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;
7129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
7139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7143147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen/*
7153147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen * Decode one MCU's worth of Huffman-compressed coefficients.
7163147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen * The propose of this method is to calculate the
7173147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen * data length of one MCU in Huffman-coded format.
7183147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen * Therefore, all coefficients are discarded.
7193147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen */
7203147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7213147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph WenMETHODDEF(boolean)
7223147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wendecode_mcu_discard_coef (j_decompress_ptr cinfo)
7233147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen{
7243147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
7253147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  int blkn;
7263147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  BITREAD_STATE_VARS;
7273147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  savable_state state;
7283147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7293147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  /* Process restart marker if needed; may have to suspend */
7303147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  if (cinfo->restart_interval) {
7313147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    if (entropy->restarts_to_go == 0)
7323147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      if (! process_restart(cinfo))
7333147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen	return FALSE;
7343147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  }
7353147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7363147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  if (! entropy->pub.insufficient_data) {
7373147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7383147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    /* Load up working state */
7393147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
7403147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    ASSIGN_STATE(state, entropy->saved);
7413147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7423147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    /* Outer loop handles each block in the MCU */
7433147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7443147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
7453147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn];
7463147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn];
7473147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      register int s, k, r;
7483147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7493147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      /* Decode a single block's worth of coefficients */
7503147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7513147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      /* Section F.2.2.1: decode the DC coefficient difference */
7523147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      HUFF_DECODE(s, br_state, dctbl, return FALSE, label1);
7533147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      if (s) {
7543147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen	CHECK_BIT_BUFFER(br_state, s, return FALSE);
7553147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen	r = GET_BITS(s);
7563147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen	s = HUFF_EXTEND(r, s);
7573147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      }
7583147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7593147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      /* discard all coefficients */
7603147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      if (entropy->dc_needed[blkn]) {
7613147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen	/* Convert DC difference to actual value, update last_dc_val */
7623147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen	int ci = cinfo->MCU_membership[blkn];
7633147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen	s += state.last_dc_val[ci];
7643147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen	state.last_dc_val[ci] = s;
7653147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      }
7663147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      for (k = 1; k < DCTSIZE2; k++) {
7673147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        HUFF_DECODE(s, br_state, actbl, return FALSE, label3);
7683147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7693147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        r = s >> 4;
7703147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        s &= 15;
7713147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7723147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        if (s) {
7733147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen          k += r;
7743147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen          CHECK_BIT_BUFFER(br_state, s, return FALSE);
7753147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen          DROP_BITS(s);
7763147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        } else {
7773147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen          if (r != 15)
7783147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen            break;
7793147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen          k += 15;
7803147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        }
7813147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      }
7823147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    }
7833147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7843147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    /* Completed MCU, so update state */
7853147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
7863147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    ASSIGN_STATE(entropy->saved, state);
7873147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  }
7883147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7893147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  /* Account for restart interval (no-op if not using restarts) */
7903147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  entropy->restarts_to_go--;
7913147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7923147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  return TRUE;
7933147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen}
7943147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
7959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
7969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
7979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Module initialization routine for Huffman entropy decoding.
7989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
7999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
8019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjinit_huff_decoder (j_decompress_ptr cinfo)
8029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
8039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  huff_entropy_ptr entropy;
8049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int i;
8059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
8069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy = (huff_entropy_ptr)
8079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
8089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				SIZEOF(huff_entropy_decoder));
8099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
8109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->pub.start_pass = start_pass_huff_decoder;
8119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  entropy->pub.decode_mcu = decode_mcu;
8123147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  entropy->pub.decode_mcu_discard_coef = decode_mcu_discard_coef;
813f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  entropy->pub.configure_huffman_decoder = configure_huffman_decoder;
814f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  entropy->pub.get_huffman_decoder_configuration =
815f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        get_huffman_decoder_configuration;
816f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  entropy->pub.index = NULL;
8173147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
8183147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  /* Mark tables unallocated */
8193147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  for (i = 0; i < NUM_HUFF_TBLS; i++) {
8203147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
8213147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  }
8223147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen}
8233147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
8243147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen/*
8253147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen * Call after jpeg_read_header
8263147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen */
8273147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph WenGLOBAL(void)
8283147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wenjpeg_create_huffman_index(j_decompress_ptr cinfo, huffman_index *index)
8293147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen{
8303147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  int i, s;
8313147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  index->scan_count = 1;
832f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  index->total_iMCU_rows = cinfo->total_iMCU_rows;
8333147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  index->scan = (huffman_scan_header*)malloc(index->scan_count
8343147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen          * sizeof(huffman_scan_header));
8353147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  index->scan[0].offset = (huffman_offset_data**)malloc(cinfo->total_iMCU_rows
8363147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen          * sizeof(huffman_offset_data*));
837f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  index->scan[0].prev_MCU_offset.bitstream_offset = 0;
8383147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  index->MCU_sample_size = DEFAULT_MCU_SAMPLE_SIZE;
8393147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
8403147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  index->mem_used = sizeof(huffman_scan_header)
841f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      + cinfo->total_iMCU_rows * sizeof(huffman_offset_data*);
8423147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen}
8433147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
8443147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph WenGLOBAL(void)
8453147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wenjpeg_destroy_huffman_index(huffman_index *index)
8463147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen{
8473147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    int i, j;
8483147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    for (i = 0; i < index->scan_count; i++) {
8493147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        for(j = 0; j < index->total_iMCU_rows; j++) {
8503147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen            free(index->scan[i].offset[j]);
8513147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        }
8523147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        free(index->scan[i].offset);
8533147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    }
8543147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    free(index->scan);
8553147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen}
856f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen
857f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen/*
858f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen * Set the reader byte position to offset
859f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen */
860f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph WenGLOBAL(void)
861f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wenjset_input_stream_position(j_decompress_ptr cinfo, int offset)
862f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen{
863f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  if (cinfo->src->seek_input_data) {
864f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    cinfo->src->seek_input_data(cinfo, offset);
865f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  } else {
866f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    cinfo->src->bytes_in_buffer = cinfo->src->current_offset - offset;
867f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    cinfo->src->next_input_byte = cinfo->src->start_input_byte + offset;
868f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  }
869f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen}
870f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen
871f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen/*
872f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen * Set the reader byte position to offset and bit position to bit_left
873f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen * with bit buffer set to buf.
874f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen */
875f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph WenGLOBAL(void)
876f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wenjset_input_stream_position_bit(j_decompress_ptr cinfo,
877f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        int byte_offset, int bit_left, INT32 buf)
878f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen{
879f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
880f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen
881f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  entropy->bitstate.bits_left = bit_left;
882f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  entropy->bitstate.get_buffer = buf;
883f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen
884f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  jset_input_stream_position(cinfo, byte_offset);
885f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen}
886f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen
887f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen/*
888f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen * Get the current reader byte position.
889f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen */
890f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph WenGLOBAL(int)
891f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wenjget_input_stream_position(j_decompress_ptr cinfo)
892f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen{
893f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  return cinfo->src->current_offset - cinfo->src->bytes_in_buffer;
894f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen}
895