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