1f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 2f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jcphuff.c 3f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 4f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Copyright (C) 1995-1997, Thomas G. Lane. 5f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This file is part of the Independent JPEG Group's software. 6f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * For conditions of distribution and use, see the accompanying README file. 7f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 8f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This file contains Huffman entropy encoding routines for progressive JPEG. 9f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 10f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * We do not support output suspension in this module, since the library 11f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * currently does not allow multiple-scan files to be written with output 12f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * suspension. 13f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 14f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 15f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define JPEG_INTERNALS 16f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jinclude.h" 17f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jpeglib.h" 18f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jchuff.h" /* Declarations shared with jchuff.c */ 19f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 20f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifdef C_PROGRESSIVE_SUPPORTED 21f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 22f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Expanded entropy encoder object for progressive Huffman encoding. */ 23f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 24f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgtypedef struct { 25f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org struct jpeg_entropy_encoder pub; /* public fields */ 26f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 27f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Mode flag: TRUE for optimization, FALSE for actual data output */ 28f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org boolean gather_statistics; 29f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 30f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Bit-level coding status. 31f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * next_output_byte/free_in_buffer are local copies of cinfo->dest fields. 32f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 33f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JOCTET * next_output_byte; /* => next byte to write in buffer */ 34f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org size_t free_in_buffer; /* # of byte spaces remaining in buffer */ 35f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INT32 put_buffer; /* current bit-accumulation buffer */ 36f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int put_bits; /* # of bits now in it */ 37f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */ 38f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 39f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Coding status for DC components */ 40f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ 41f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 42f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Coding status for AC components */ 43f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int ac_tbl_no; /* the table number of the single component */ 44f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int EOBRUN; /* run length of EOBs */ 45f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int BE; /* # of buffered correction bits before MCU */ 46f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org char * bit_buffer; /* buffer for correction bits (1 per char) */ 47f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* packing correction bits tightly would save some space but cost time... */ 48f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 49f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int restarts_to_go; /* MCUs left in this restart interval */ 50f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int next_restart_num; /* next restart number to write (0-7) */ 51f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 52f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Pointers to derived tables (these workspaces have image lifespan). 53f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Since any one scan codes only DC or only AC, we only need one set 54f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * of tables, not one for DC and one for AC. 55f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 56f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org c_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; 57f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 58f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Statistics tables for optimization; again, one set is enough */ 59f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org long * count_ptrs[NUM_HUFF_TBLS]; 60f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} phuff_entropy_encoder; 61f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 62f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgtypedef phuff_entropy_encoder * phuff_entropy_ptr; 63f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 64f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit 65f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * buffer can hold. Larger sizes may slightly improve compression, but 66f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 1000 is already well into the realm of overkill. 67f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * The minimum safe size is 64 bits. 68f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 69f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 70f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */ 71f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 72f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32. 73f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * We assume that int right shift is unsigned if INT32 right shift is, 74f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * which should be safe. 75f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 76f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 77f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifdef RIGHT_SHIFT_IS_UNSIGNED 78f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define ISHIFT_TEMPS int ishift_temp; 79f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define IRIGHT_SHIFT(x,shft) \ 80f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ((ishift_temp = (x)) < 0 ? \ 81f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ 82f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (ishift_temp >> (shft))) 83f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#else 84f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define ISHIFT_TEMPS 85f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) 86f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif 87f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 88f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Forward declarations */ 89f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo, 90f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW *MCU_data)); 91f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo, 92f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW *MCU_data)); 93f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo, 94f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW *MCU_data)); 95f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo, 96f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW *MCU_data)); 97f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo)); 98f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo)); 99f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 100f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 101f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 102f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Initialize for a Huffman-compressed scan using progressive JPEG. 103f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 104f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 105f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void) 106f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgstart_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics) 107f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 108f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 109f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org boolean is_DC_band; 110f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int ci, tbl; 111f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_component_info * compptr; 112f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 113f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->cinfo = cinfo; 114f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->gather_statistics = gather_statistics; 115f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 116f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org is_DC_band = (cinfo->Ss == 0); 117f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 118f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We assume jcmaster.c already validated the scan parameters. */ 119f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 120f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Select execution routines */ 121f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->Ah == 0) { 122f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (is_DC_band) 123f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.encode_mcu = encode_mcu_DC_first; 124f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 125f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.encode_mcu = encode_mcu_AC_first; 126f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 127f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (is_DC_band) 128f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.encode_mcu = encode_mcu_DC_refine; 129f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else { 130f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.encode_mcu = encode_mcu_AC_refine; 131f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* AC refinement needs a correction bit buffer */ 132f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->bit_buffer == NULL) 133f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->bit_buffer = (char *) 134f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 135f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MAX_CORR_BITS * SIZEOF(char)); 136f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 137f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 138f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (gather_statistics) 139f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.finish_pass = finish_pass_gather_phuff; 140f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 141f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.finish_pass = finish_pass_phuff; 142f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 143f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1 144f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * for AC coefficients. 145f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 146f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 147f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr = cinfo->cur_comp_info[ci]; 148f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize DC predictions to 0 */ 149f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->last_dc_val[ci] = 0; 150f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Get table index */ 151f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (is_DC_band) { 152f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->Ah != 0) /* DC refinement needs no table */ 153f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org continue; 154f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org tbl = compptr->dc_tbl_no; 155f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 156f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->ac_tbl_no = tbl = compptr->ac_tbl_no; 157f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 158f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (gather_statistics) { 159f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Check for invalid table index */ 160f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* (make_c_derived_tbl does this in the other path) */ 161f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (tbl < 0 || tbl >= NUM_HUFF_TBLS) 162f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl); 163f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Allocate and zero the statistics tables */ 164f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ 165f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->count_ptrs[tbl] == NULL) 166f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->count_ptrs[tbl] = (long *) 167f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 168f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 257 * SIZEOF(long)); 169f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long)); 170f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 171f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Compute derived values for Huffman table */ 172f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We may do this more than once for a table, but it's not expensive */ 173f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl, 174f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org & entropy->derived_tbls[tbl]); 175f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 176f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 177f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 178f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize AC stuff */ 179f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->EOBRUN = 0; 180f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->BE = 0; 181f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 182f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize bit buffer to empty */ 183f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->put_buffer = 0; 184f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->put_bits = 0; 185f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 186f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize restart stuff */ 187f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go = cinfo->restart_interval; 188f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_restart_num = 0; 189f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 190f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 191f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 192f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Outputting bytes to the file. 193f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * NB: these must be called only when actually outputting, 194f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * that is, entropy->gather_statistics == FALSE. 195f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 196f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 197f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Emit a byte */ 198f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define emit_byte(entropy,val) \ 199f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { *(entropy)->next_output_byte++ = (JOCTET) (val); \ 200f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (--(entropy)->free_in_buffer == 0) \ 201f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org dump_buffer(entropy); } 202f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 203f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 204f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(void) 205f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgdump_buffer (phuff_entropy_ptr entropy) 206f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Empty the output buffer; we do not support suspension in this module. */ 207f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 208f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org struct jpeg_destination_mgr * dest = entropy->cinfo->dest; 209f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 210f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! (*dest->empty_output_buffer) (entropy->cinfo)) 211f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND); 212f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* After a successful buffer dump, must reset buffer pointers */ 213f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_output_byte = dest->next_output_byte; 214f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->free_in_buffer = dest->free_in_buffer; 215f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 216f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 217f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 218f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Outputting bits to the file */ 219f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 220f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Only the right 24 bits of put_buffer are used; the valid bits are 221f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * left-justified in this part. At most 16 bits can be passed to emit_bits 222f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * in one call, and we never retain more than 7 bits in put_buffer 223f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * between calls, so 24 bits are sufficient. 224f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 225f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 226f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(void) 227f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgemit_bits (phuff_entropy_ptr entropy, unsigned int code, int size) 228f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Emit some bits, unless we are in gather mode */ 229f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 230f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* This routine is heavily used, so it's worth coding tightly. */ 231f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register INT32 put_buffer = (INT32) code; 232f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int put_bits = entropy->put_bits; 233f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 234f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* if size is 0, caller used an invalid Huffman table entry */ 235f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (size == 0) 236f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); 237f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 238f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->gather_statistics) 239f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return; /* do nothing if we're only getting stats */ 240f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 241f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */ 242f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 243f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org put_bits += size; /* new number of bits in buffer */ 244f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 245f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org put_buffer <<= 24 - put_bits; /* align incoming bits */ 246f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 247f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org put_buffer |= entropy->put_buffer; /* and merge with old buffer contents */ 248f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 249f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (put_bits >= 8) { 250f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int c = (int) ((put_buffer >> 16) & 0xFF); 251f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 252f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_byte(entropy, c); 253f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (c == 0xFF) { /* need to stuff a zero byte? */ 254f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_byte(entropy, 0); 255f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 256f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org put_buffer <<= 8; 257f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org put_bits -= 8; 258f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 259f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 260f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->put_buffer = put_buffer; /* update variables */ 261f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->put_bits = put_bits; 262f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 263f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 264f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 265f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(void) 266f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgflush_bits (phuff_entropy_ptr entropy) 267f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 268f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */ 269f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->put_buffer = 0; /* and reset bit-buffer to empty */ 270f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->put_bits = 0; 271f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 272f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 273f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 274f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 275f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Emit (or just count) a Huffman symbol. 276f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 277f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 278f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(void) 279f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgemit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol) 280f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 281f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->gather_statistics) 282f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->count_ptrs[tbl_no][symbol]++; 283f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else { 284f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org c_derived_tbl * tbl = entropy->derived_tbls[tbl_no]; 285f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); 286f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 287f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 288f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 289f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 290f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 291f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Emit bits from a correction bit buffer. 292f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 293f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 294f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(void) 295f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgemit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart, 296f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int nbits) 297f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 298f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->gather_statistics) 299f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return; /* no real work */ 300f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 301f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (nbits > 0) { 302f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_bits(entropy, (unsigned int) (*bufstart), 1); 303f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bufstart++; 304f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nbits--; 305f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 306f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 307f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 308f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 309f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 310f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Emit any pending EOBRUN symbol. 311f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 312f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 313f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(void) 314f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgemit_eobrun (phuff_entropy_ptr entropy) 315f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 316f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int temp, nbits; 317f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 318f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */ 319f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp = entropy->EOBRUN; 320f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nbits = 0; 321f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while ((temp >>= 1)) 322f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nbits++; 323f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* safety check: shouldn't happen given limited correction-bit buffer */ 324f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (nbits > 14) 325f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); 326f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 327f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4); 328f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (nbits) 329f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_bits(entropy, entropy->EOBRUN, nbits); 330f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 331f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->EOBRUN = 0; 332f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 333f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit any buffered correction bits */ 334f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE); 335f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->BE = 0; 336f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 337f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 338f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 339f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 340f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 341f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Emit a restart marker & resynchronize predictions. 342f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 343f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 344f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(void) 345f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgemit_restart (phuff_entropy_ptr entropy, int restart_num) 346f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 347f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int ci; 348f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 349f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_eobrun(entropy); 350f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 351f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! entropy->gather_statistics) { 352f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org flush_bits(entropy); 353f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_byte(entropy, 0xFF); 354f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_byte(entropy, JPEG_RST0 + restart_num); 355f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 356f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 357f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->cinfo->Ss == 0) { 358f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Re-initialize DC predictions to 0 */ 359f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++) 360f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->last_dc_val[ci] = 0; 361f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 362f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Re-initialize all AC-related fields to 0 */ 363f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->EOBRUN = 0; 364f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->BE = 0; 365f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 366f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 367f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 368f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 369f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 370f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * MCU encoding for DC initial scan (either spectral selection, 371f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * or first pass of successive approximation). 372f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 373f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 374f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 375f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgencode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) 376f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 377f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 378f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int temp, temp2; 379f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int nbits; 380f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int blkn, ci; 381f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int Al = cinfo->Al; 382f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW block; 383f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_component_info * compptr; 384f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ISHIFT_TEMPS 385f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 386f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_output_byte = cinfo->dest->next_output_byte; 387f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->free_in_buffer = cinfo->dest->free_in_buffer; 388f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 389f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit restart marker if needed */ 390f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->restart_interval) 391f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->restarts_to_go == 0) 392f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_restart(entropy, entropy->next_restart_num); 393f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 394f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Encode the MCU data blocks */ 395f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { 396f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org block = MCU_data[blkn]; 397f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ci = cinfo->MCU_membership[blkn]; 398f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr = cinfo->cur_comp_info[ci]; 399f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 400f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Compute the DC value after the required point transform by Al. 401f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This is simply an arithmetic right shift. 402f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 403f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al); 404f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 405f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* DC differences are figured on the point-transformed values. */ 406f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp = temp2 - entropy->last_dc_val[ci]; 407f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->last_dc_val[ci] = temp2; 408f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 409f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Encode the DC coefficient difference per section G.1.2.1 */ 410f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp2 = temp; 411f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (temp < 0) { 412f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp = -temp; /* temp is abs value of input */ 413f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* For a negative input, want temp2 = bitwise complement of abs(input) */ 414f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* This code assumes we are on a two's complement machine */ 415f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp2--; 416f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 417f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 418f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Find the number of bits needed for the magnitude of the coefficient */ 419f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nbits = 0; 420f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (temp) { 421f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nbits++; 422f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp >>= 1; 423f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 424f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Check for out-of-range coefficient values. 425f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Since we're encoding a difference, the range limit is twice as much. 426f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 427f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (nbits > MAX_COEF_BITS+1) 428f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BAD_DCT_COEF); 429f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 430f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Count/emit the Huffman-coded symbol for the number of bits */ 431f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_symbol(entropy, compptr->dc_tbl_no, nbits); 432f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 433f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit that number of bits of the value, if positive, */ 434f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* or the complement of its magnitude, if negative. */ 435f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (nbits) /* emit_bits rejects calls with size 0 */ 436f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_bits(entropy, (unsigned int) temp2, nbits); 437f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 438f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 439f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dest->next_output_byte = entropy->next_output_byte; 440f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dest->free_in_buffer = entropy->free_in_buffer; 441f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 442f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Update restart-interval state too */ 443f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->restart_interval) { 444f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->restarts_to_go == 0) { 445f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go = cinfo->restart_interval; 446f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_restart_num++; 447f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_restart_num &= 7; 448f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 449f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go--; 450f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 451f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 452f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 453f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 454f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 455f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 456f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 457f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * MCU encoding for AC initial scan (either spectral selection, 458f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * or first pass of successive approximation). 459f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 460f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 461f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 462f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgencode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) 463f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 464f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 465f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int temp, temp2; 466f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int nbits; 467f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int r, k; 468f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int Se = cinfo->Se; 469f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int Al = cinfo->Al; 470f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW block; 471f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 472f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_output_byte = cinfo->dest->next_output_byte; 473f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->free_in_buffer = cinfo->dest->free_in_buffer; 474f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 475f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit restart marker if needed */ 476f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->restart_interval) 477f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->restarts_to_go == 0) 478f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_restart(entropy, entropy->next_restart_num); 479f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 480f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Encode the MCU data block */ 481f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org block = MCU_data[0]; 482f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 483f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */ 484f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 485f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r = 0; /* r = run length of zeros */ 486f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 487f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (k = cinfo->Ss; k <= Se; k++) { 488f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if ((temp = (*block)[jpeg_natural_order[k]]) == 0) { 489f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r++; 490f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org continue; 491f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 492f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We must apply the point transform by Al. For AC coefficients this 493f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * is an integer division with rounding towards 0. To do this portably 494f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * in C, we shift after obtaining the absolute value; so the code is 495f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * interwoven with finding the abs value (temp) and output bits (temp2). 496f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 497f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (temp < 0) { 498f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp = -temp; /* temp is abs value of input */ 499f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp >>= Al; /* apply the point transform */ 500f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* For a negative coef, want temp2 = bitwise complement of abs(coef) */ 501f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp2 = ~temp; 502f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 503f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp >>= Al; /* apply the point transform */ 504f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp2 = temp; 505f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 506f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Watch out for case that nonzero coef is zero after point transform */ 507f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (temp == 0) { 508f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r++; 509f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org continue; 510f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 511f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 512f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit any pending EOBRUN */ 513f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->EOBRUN > 0) 514f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_eobrun(entropy); 515f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* if run length > 15, must emit special run-length-16 codes (0xF0) */ 516f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (r > 15) { 517f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_symbol(entropy, entropy->ac_tbl_no, 0xF0); 518f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r -= 16; 519f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 520f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 521f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Find the number of bits needed for the magnitude of the coefficient */ 522f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nbits = 1; /* there must be at least one 1 bit */ 523f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while ((temp >>= 1)) 524f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org nbits++; 525f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Check for out-of-range coefficient values */ 526f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (nbits > MAX_COEF_BITS) 527f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BAD_DCT_COEF); 528f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 529f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Count/emit Huffman symbol for run length / number of bits */ 530f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits); 531f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 532f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit that number of bits of the value, if positive, */ 533f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* or the complement of its magnitude, if negative. */ 534f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_bits(entropy, (unsigned int) temp2, nbits); 535f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 536f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r = 0; /* reset zero run length */ 537f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 538f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 539f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (r > 0) { /* If there are trailing zeroes, */ 540f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->EOBRUN++; /* count an EOB */ 541f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->EOBRUN == 0x7FFF) 542f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_eobrun(entropy); /* force it out to avoid overflow */ 543f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 544f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 545f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dest->next_output_byte = entropy->next_output_byte; 546f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dest->free_in_buffer = entropy->free_in_buffer; 547f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 548f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Update restart-interval state too */ 549f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->restart_interval) { 550f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->restarts_to_go == 0) { 551f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go = cinfo->restart_interval; 552f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_restart_num++; 553f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_restart_num &= 7; 554f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 555f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go--; 556f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 557f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 558f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 559f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 560f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 561f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 562f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 563f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * MCU encoding for DC successive approximation refinement scan. 564f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Note: we assume such scans can be multi-component, although the spec 565f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * is not very clear on the point. 566f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 567f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 568f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 569f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgencode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) 570f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 571f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 572f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int temp; 573f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int blkn; 574f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int Al = cinfo->Al; 575f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW block; 576f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 577f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_output_byte = cinfo->dest->next_output_byte; 578f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->free_in_buffer = cinfo->dest->free_in_buffer; 579f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 580f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit restart marker if needed */ 581f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->restart_interval) 582f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->restarts_to_go == 0) 583f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_restart(entropy, entropy->next_restart_num); 584f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 585f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Encode the MCU data blocks */ 586f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { 587f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org block = MCU_data[blkn]; 588f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 589f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We simply emit the Al'th bit of the DC coefficient value. */ 590f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp = (*block)[0]; 591f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_bits(entropy, (unsigned int) (temp >> Al), 1); 592f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 593f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 594f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dest->next_output_byte = entropy->next_output_byte; 595f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dest->free_in_buffer = entropy->free_in_buffer; 596f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 597f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Update restart-interval state too */ 598f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->restart_interval) { 599f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->restarts_to_go == 0) { 600f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go = cinfo->restart_interval; 601f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_restart_num++; 602f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_restart_num &= 7; 603f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 604f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go--; 605f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 606f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 607f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 608f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 609f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 610f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 611f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 612f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * MCU encoding for AC successive approximation refinement scan. 613f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 614f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 615f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 616f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgencode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) 617f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 618f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 619f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int temp; 620f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org register int r, k; 621f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int EOB; 622f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org char *BR_buffer; 623f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int BR; 624f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int Se = cinfo->Se; 625f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int Al = cinfo->Al; 626f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JBLOCKROW block; 627f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int absvalues[DCTSIZE2]; 628f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 629f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_output_byte = cinfo->dest->next_output_byte; 630f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->free_in_buffer = cinfo->dest->free_in_buffer; 631f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 632f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit restart marker if needed */ 633f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->restart_interval) 634f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->restarts_to_go == 0) 635f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_restart(entropy, entropy->next_restart_num); 636f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 637f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Encode the MCU data block */ 638f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org block = MCU_data[0]; 639f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 640f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* It is convenient to make a pre-pass to determine the transformed 641f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * coefficients' absolute values and the EOB position. 642f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 643f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org EOB = 0; 644f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (k = cinfo->Ss; k <= Se; k++) { 645f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp = (*block)[jpeg_natural_order[k]]; 646f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We must apply the point transform by Al. For AC coefficients this 647f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * is an integer division with rounding towards 0. To do this portably 648f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * in C, we shift after obtaining the absolute value. 649f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 650f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (temp < 0) 651f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp = -temp; /* temp is abs value of input */ 652f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp >>= Al; /* apply the point transform */ 653f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org absvalues[k] = temp; /* save abs value for main pass */ 654f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (temp == 1) 655f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org EOB = k; /* EOB = index of last newly-nonzero coef */ 656f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 657f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 658f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */ 659f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 660f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r = 0; /* r = run length of zeros */ 661f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BR = 0; /* BR = count of buffered bits added now */ 662f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */ 663f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 664f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (k = cinfo->Ss; k <= Se; k++) { 665f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if ((temp = absvalues[k]) == 0) { 666f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r++; 667f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org continue; 668f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 669f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 670f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit any required ZRLs, but not if they can be folded into EOB */ 671f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (r > 15 && k <= EOB) { 672f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* emit any pending EOBRUN and the BE correction bits */ 673f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_eobrun(entropy); 674f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit ZRL */ 675f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_symbol(entropy, entropy->ac_tbl_no, 0xF0); 676f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r -= 16; 677f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit buffered correction bits that must be associated with ZRL */ 678f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_buffered_bits(entropy, BR_buffer, BR); 679f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ 680f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BR = 0; 681f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 682f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 683f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* If the coef was previously nonzero, it only needs a correction bit. 684f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * NOTE: a straight translation of the spec's figure G.7 would suggest 685f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * that we also need to test r > 15. But if r > 15, we can only get here 686f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * if k > EOB, which implies that this coefficient is not 1. 687f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 688f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (temp > 1) { 689f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* The correction bit is the next bit of the absolute value. */ 690f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BR_buffer[BR++] = (char) (temp & 1); 691f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org continue; 692f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 693f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 694f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit any pending EOBRUN and the BE correction bits */ 695f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_eobrun(entropy); 696f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 697f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Count/emit Huffman symbol for run length / number of bits */ 698f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1); 699f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 700f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit output bit for newly-nonzero coef */ 701f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1; 702f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_bits(entropy, (unsigned int) temp, 1); 703f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 704f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Emit buffered correction bits that must be associated with this code */ 705f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_buffered_bits(entropy, BR_buffer, BR); 706f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ 707f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org BR = 0; 708f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org r = 0; /* reset zero run length */ 709f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 710f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 711f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (r > 0 || BR > 0) { /* If there are trailing zeroes, */ 712f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->EOBRUN++; /* count an EOB */ 713f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->BE += BR; /* concat my correction bits to older ones */ 714f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We force out the EOB if we risk either: 715f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 1. overflow of the EOB counter; 716f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 2. overflow of the correction bit buffer during the next MCU. 717f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 718f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1)) 719f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_eobrun(entropy); 720f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 721f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 722f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dest->next_output_byte = entropy->next_output_byte; 723f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dest->free_in_buffer = entropy->free_in_buffer; 724f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 725f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Update restart-interval state too */ 726f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->restart_interval) { 727f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (entropy->restarts_to_go == 0) { 728f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go = cinfo->restart_interval; 729f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_restart_num++; 730f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_restart_num &= 7; 731f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 732f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->restarts_to_go--; 733f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 734f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 735f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 736f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 737f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 738f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 739f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 740f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Finish up at the end of a Huffman-compressed progressive scan. 741f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 742f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 743f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void) 744f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgfinish_pass_phuff (j_compress_ptr cinfo) 745f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 746f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 747f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 748f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->next_output_byte = cinfo->dest->next_output_byte; 749f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->free_in_buffer = cinfo->dest->free_in_buffer; 750f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 751f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Flush out any buffered data */ 752f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_eobrun(entropy); 753f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org flush_bits(entropy); 754f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 755f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dest->next_output_byte = entropy->next_output_byte; 756f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dest->free_in_buffer = entropy->free_in_buffer; 757f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 758f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 759f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 760f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 761f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Finish up a statistics-gathering pass and create the new Huffman tables. 762f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 763f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 764f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void) 765f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgfinish_pass_gather_phuff (j_compress_ptr cinfo) 766f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 767f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; 768f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org boolean is_DC_band; 769f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int ci, tbl; 770f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_component_info * compptr; 771f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JHUFF_TBL **htblptr; 772f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org boolean did[NUM_HUFF_TBLS]; 773f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 774f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Flush out buffered data (all we care about is counting the EOB symbol) */ 775f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org emit_eobrun(entropy); 776f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 777f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org is_DC_band = (cinfo->Ss == 0); 778f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 779f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* It's important not to apply jpeg_gen_optimal_table more than once 780f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * per table, because it clobbers the input frequency counts! 781f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 782f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MEMZERO(did, SIZEOF(did)); 783f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 784f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 785f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr = cinfo->cur_comp_info[ci]; 786f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (is_DC_band) { 787f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->Ah != 0) /* DC refinement needs no table */ 788f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org continue; 789f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org tbl = compptr->dc_tbl_no; 790f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 791f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org tbl = compptr->ac_tbl_no; 792f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 793f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! did[tbl]) { 794f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (is_DC_band) 795f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org htblptr = & cinfo->dc_huff_tbl_ptrs[tbl]; 796f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 797f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org htblptr = & cinfo->ac_huff_tbl_ptrs[tbl]; 798f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (*htblptr == NULL) 799f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 800f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]); 801f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org did[tbl] = TRUE; 802f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 803f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 804f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 805f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 806f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 807f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 808f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Module initialization routine for progressive Huffman entropy encoding. 809f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 810f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 811f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 812f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjinit_phuff_encoder (j_compress_ptr cinfo) 813f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 814f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org phuff_entropy_ptr entropy; 815f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int i; 816f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 817f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy = (phuff_entropy_ptr) 818f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 819f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SIZEOF(phuff_entropy_encoder)); 820f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; 821f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->pub.start_pass = start_pass_phuff; 822f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 823f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Mark tables unallocated */ 824f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < NUM_HUFF_TBLS; i++) { 825f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->derived_tbls[i] = NULL; 826f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->count_ptrs[i] = NULL; 827f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 828f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org entropy->bit_buffer = NULL; /* needed only in AC refinement scan */ 829f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 830f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 831f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif /* C_PROGRESSIVE_SUPPORTED */ 832