6dd0fd5c64
IJG JPEG library, hack requred by libtiff will be compiled and used in-place.
92 lines
3.1 KiB
C
92 lines
3.1 KiB
C
/*
|
|
* jdhuff.c
|
|
*
|
|
* Copyright (C) 1991-1997, Thomas G. Lane.
|
|
* This file is part of the Independent JPEG Group's software.
|
|
* For conditions of distribution and use, see the accompanying README file.
|
|
*
|
|
* This file contains Huffman entropy decoding routines.
|
|
*
|
|
* Much of the complexity here has to do with supporting input suspension.
|
|
* If the data source module demands suspension, we want to be able to back
|
|
* up to the start of the current MCU. To do this, we copy state variables
|
|
* into local working storage, and update them back to the permanent
|
|
* storage only upon successful completion of an MCU.
|
|
*/
|
|
|
|
#define JPEG_INTERNALS
|
|
#include "jinclude.h"
|
|
#include "jpeglib.h"
|
|
#include "jdhuff.h" /* Declarations shared with jdphuff.c */
|
|
|
|
|
|
/*
|
|
* Expanded entropy decoder object for Huffman decoding.
|
|
*
|
|
* The savable_state subrecord contains fields that change within an MCU,
|
|
* but must not be updated permanently until we complete the MCU.
|
|
*/
|
|
|
|
typedef struct {
|
|
int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
|
|
} savable_state;
|
|
|
|
/* This macro is to work around compilers with missing or broken
|
|
* structure assignment. You'll need to fix this code if you have
|
|
* such a compiler and you change MAX_COMPS_IN_SCAN.
|
|
*/
|
|
|
|
#ifndef NO_STRUCT_ASSIGN
|
|
#define ASSIGN_STATE(dest,src) ((dest) = (src))
|
|
#else
|
|
#if MAX_COMPS_IN_SCAN == 4
|
|
#define ASSIGN_STATE(dest,src) \
|
|
((dest).last_dc_val[0] = (src).last_dc_val[0], \
|
|
(dest).last_dc_val[1] = (src).last_dc_val[1], \
|
|
(dest).last_dc_val[2] = (src).last_dc_val[2], \
|
|
(dest).last_dc_val[3] = (src).last_dc_val[3])
|
|
#endif
|
|
#endif
|
|
|
|
|
|
typedef struct {
|
|
struct jpeg_entropy_decoder pub; /* public fields */
|
|
|
|
/* These fields are loaded into local variables at start of each MCU.
|
|
* In case of suspension, we exit WITHOUT updating them.
|
|
*/
|
|
bitread_perm_state bitstate; /* Bit buffer at start of MCU */
|
|
savable_state saved; /* Other state at start of MCU */
|
|
|
|
/* These fields are NOT loaded into local working state. */
|
|
unsigned int restarts_to_go; /* MCUs left in this restart interval */
|
|
|
|
/* Pointers to derived tables (these workspaces have image lifespan) */
|
|
d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
|
|
d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
|
|
|
|
/* Precalculated info set up by start_pass for use in decode_mcu: */
|
|
|
|
/* Pointers to derived tables to be used for each block within an MCU */
|
|
d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU];
|
|
d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU];
|
|
/* Whether we care about the DC and AC coefficient values for each block */
|
|
boolean dc_needed[D_MAX_BLOCKS_IN_MCU];
|
|
boolean ac_needed[D_MAX_BLOCKS_IN_MCU];
|
|
} huff_entropy_decoder;
|
|
|
|
typedef huff_entropy_decoder * huff_entropy_ptr;
|
|
|
|
GLOBAL(void)
|
|
jpeg_reset_huff_decode (register j_decompress_ptr cinfo)
|
|
{ register huff_entropy_ptr entropy = (huff_entropy_ptr)cinfo->entropy;
|
|
register int ci = 0;
|
|
|
|
/* Discard encoded input bits, up to the next Byte boundary */
|
|
entropy->bitstate.bits_left &= ~7;
|
|
/* Re-initialize DC predictions to 0 */
|
|
do entropy->saved.last_dc_val[ci] = 0; while (++ci < cinfo->comps_in_scan);
|
|
}
|
|
|
|
|