Index: jcphuff.c |
diff --git a/jcphuff.c b/jcphuff.c |
index 310287175ab46aa85d63c74ac7320282eb058cae..046e2e18d4876502f0bce0e7f064eb8b71f6b122 100644 |
--- a/jcphuff.c |
+++ b/jcphuff.c |
@@ -1,9 +1,12 @@ |
/* |
* jcphuff.c |
* |
+ * This file was part of the Independent JPEG Group's software: |
* Copyright (C) 1995-1997, Thomas G. Lane. |
- * This file is part of the Independent JPEG Group's software. |
- * For conditions of distribution and use, see the accompanying README file. |
+ * libjpeg-turbo Modifications: |
+ * Copyright (C) 2015, D. R. Commander. |
+ * For conditions of distribution and use, see the accompanying README.ijg |
+ * file. |
* |
* This file contains Huffman entropy encoding routines for progressive JPEG. |
* |
@@ -15,7 +18,7 @@ |
#define JPEG_INTERNALS |
#include "jinclude.h" |
#include "jpeglib.h" |
-#include "jchuff.h" /* Declarations shared with jchuff.c */ |
+#include "jchuff.h" /* Declarations shared with jchuff.c */ |
#ifdef C_PROGRESSIVE_SUPPORTED |
@@ -30,36 +33,36 @@ typedef struct { |
/* Bit-level coding status. |
* next_output_byte/free_in_buffer are local copies of cinfo->dest fields. |
*/ |
- JOCTET * next_output_byte; /* => next byte to write in buffer */ |
- size_t free_in_buffer; /* # of byte spaces remaining in buffer */ |
- INT32 put_buffer; /* current bit-accumulation buffer */ |
- int put_bits; /* # of bits now in it */ |
- j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */ |
+ JOCTET *next_output_byte; /* => next byte to write in buffer */ |
+ size_t free_in_buffer; /* # of byte spaces remaining in buffer */ |
+ size_t put_buffer; /* current bit-accumulation buffer */ |
+ int put_bits; /* # of bits now in it */ |
+ j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */ |
/* Coding status for DC components */ |
int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ |
/* Coding status for AC components */ |
- int ac_tbl_no; /* the table number of the single component */ |
- unsigned int EOBRUN; /* run length of EOBs */ |
- unsigned int BE; /* # of buffered correction bits before MCU */ |
- char * bit_buffer; /* buffer for correction bits (1 per char) */ |
+ int ac_tbl_no; /* the table number of the single component */ |
+ unsigned int EOBRUN; /* run length of EOBs */ |
+ unsigned int BE; /* # of buffered correction bits before MCU */ |
+ char *bit_buffer; /* buffer for correction bits (1 per char) */ |
/* packing correction bits tightly would save some space but cost time... */ |
- unsigned int restarts_to_go; /* MCUs left in this restart interval */ |
- int next_restart_num; /* next restart number to write (0-7) */ |
+ unsigned int restarts_to_go; /* MCUs left in this restart interval */ |
+ int next_restart_num; /* next restart number to write (0-7) */ |
/* Pointers to derived tables (these workspaces have image lifespan). |
* Since any one scan codes only DC or only AC, we only need one set |
* of tables, not one for DC and one for AC. |
*/ |
- c_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; |
+ c_derived_tbl *derived_tbls[NUM_HUFF_TBLS]; |
/* Statistics tables for optimization; again, one set is enough */ |
- long * count_ptrs[NUM_HUFF_TBLS]; |
+ long *count_ptrs[NUM_HUFF_TBLS]; |
} phuff_entropy_encoder; |
-typedef phuff_entropy_encoder * phuff_entropy_ptr; |
+typedef phuff_entropy_encoder *phuff_entropy_ptr; |
/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit |
* buffer can hold. Larger sizes may slightly improve compression, but |
@@ -67,35 +70,35 @@ typedef phuff_entropy_encoder * phuff_entropy_ptr; |
* The minimum safe size is 64 bits. |
*/ |
-#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */ |
+#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */ |
-/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32. |
- * We assume that int right shift is unsigned if INT32 right shift is, |
+/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than JLONG. |
+ * We assume that int right shift is unsigned if JLONG right shift is, |
* which should be safe. |
*/ |
#ifdef RIGHT_SHIFT_IS_UNSIGNED |
-#define ISHIFT_TEMPS int ishift_temp; |
+#define ISHIFT_TEMPS int ishift_temp; |
#define IRIGHT_SHIFT(x,shft) \ |
- ((ishift_temp = (x)) < 0 ? \ |
- (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ |
- (ishift_temp >> (shft))) |
+ ((ishift_temp = (x)) < 0 ? \ |
+ (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ |
+ (ishift_temp >> (shft))) |
#else |
#define ISHIFT_TEMPS |
-#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) |
+#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) |
#endif |
/* Forward declarations */ |
-METHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo, |
- JBLOCKROW *MCU_data)); |
-METHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo, |
- JBLOCKROW *MCU_data)); |
-METHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo, |
- JBLOCKROW *MCU_data)); |
-METHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo, |
- JBLOCKROW *MCU_data)); |
-METHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo)); |
-METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo)); |
+METHODDEF(boolean) encode_mcu_DC_first (j_compress_ptr cinfo, |
+ JBLOCKROW *MCU_data); |
+METHODDEF(boolean) encode_mcu_AC_first (j_compress_ptr cinfo, |
+ JBLOCKROW *MCU_data); |
+METHODDEF(boolean) encode_mcu_DC_refine (j_compress_ptr cinfo, |
+ JBLOCKROW *MCU_data); |
+METHODDEF(boolean) encode_mcu_AC_refine (j_compress_ptr cinfo, |
+ JBLOCKROW *MCU_data); |
+METHODDEF(void) finish_pass_phuff (j_compress_ptr cinfo); |
+METHODDEF(void) finish_pass_gather_phuff (j_compress_ptr cinfo); |
/* |
@@ -104,11 +107,11 @@ METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo)); |
METHODDEF(void) |
start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics) |
-{ |
+{ |
phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; |
boolean is_DC_band; |
int ci, tbl; |
- jpeg_component_info * compptr; |
+ jpeg_component_info *compptr; |
entropy->cinfo = cinfo; |
entropy->gather_statistics = gather_statistics; |
@@ -130,9 +133,9 @@ start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics) |
entropy->pub.encode_mcu = encode_mcu_AC_refine; |
/* AC refinement needs a correction bit buffer */ |
if (entropy->bit_buffer == NULL) |
- entropy->bit_buffer = (char *) |
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
- MAX_CORR_BITS * SIZEOF(char)); |
+ entropy->bit_buffer = (char *) |
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
+ MAX_CORR_BITS * sizeof(char)); |
} |
} |
if (gather_statistics) |
@@ -149,8 +152,8 @@ start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics) |
entropy->last_dc_val[ci] = 0; |
/* Get table index */ |
if (is_DC_band) { |
- if (cinfo->Ah != 0) /* DC refinement needs no table */ |
- continue; |
+ if (cinfo->Ah != 0) /* DC refinement needs no table */ |
+ continue; |
tbl = compptr->dc_tbl_no; |
} else { |
entropy->ac_tbl_no = tbl = compptr->ac_tbl_no; |
@@ -163,15 +166,15 @@ start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics) |
/* Allocate and zero the statistics tables */ |
/* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ |
if (entropy->count_ptrs[tbl] == NULL) |
- entropy->count_ptrs[tbl] = (long *) |
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
- 257 * SIZEOF(long)); |
- MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long)); |
+ entropy->count_ptrs[tbl] = (long *) |
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
+ 257 * sizeof(long)); |
+ MEMZERO(entropy->count_ptrs[tbl], 257 * sizeof(long)); |
} else { |
/* Compute derived values for Huffman table */ |
/* We may do this more than once for a table, but it's not expensive */ |
jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl, |
- & entropy->derived_tbls[tbl]); |
+ & entropy->derived_tbls[tbl]); |
} |
} |
@@ -196,16 +199,16 @@ start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics) |
/* Emit a byte */ |
#define emit_byte(entropy,val) \ |
- { *(entropy)->next_output_byte++ = (JOCTET) (val); \ |
- if (--(entropy)->free_in_buffer == 0) \ |
- dump_buffer(entropy); } |
+ { *(entropy)->next_output_byte++ = (JOCTET) (val); \ |
+ if (--(entropy)->free_in_buffer == 0) \ |
+ dump_buffer(entropy); } |
LOCAL(void) |
dump_buffer (phuff_entropy_ptr entropy) |
/* Empty the output buffer; we do not support suspension in this module. */ |
{ |
- struct jpeg_destination_mgr * dest = entropy->cinfo->dest; |
+ struct jpeg_destination_mgr *dest = entropy->cinfo->dest; |
if (! (*dest->empty_output_buffer) (entropy->cinfo)) |
ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND); |
@@ -228,7 +231,7 @@ emit_bits (phuff_entropy_ptr entropy, unsigned int code, int size) |
/* Emit some bits, unless we are in gather mode */ |
{ |
/* This routine is heavily used, so it's worth coding tightly. */ |
- register INT32 put_buffer = (INT32) code; |
+ register size_t put_buffer = (size_t) code; |
register int put_bits = entropy->put_bits; |
/* if size is 0, caller used an invalid Huffman table entry */ |
@@ -236,21 +239,21 @@ emit_bits (phuff_entropy_ptr entropy, unsigned int code, int size) |
ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); |
if (entropy->gather_statistics) |
- return; /* do nothing if we're only getting stats */ |
+ return; /* do nothing if we're only getting stats */ |
+ |
+ put_buffer &= (((size_t) 1)<<size) - 1; /* mask off any extra bits in code */ |
+ |
+ put_bits += size; /* new number of bits in buffer */ |
- put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */ |
- |
- put_bits += size; /* new number of bits in buffer */ |
- |
put_buffer <<= 24 - put_bits; /* align incoming bits */ |
put_buffer |= entropy->put_buffer; /* and merge with old buffer contents */ |
while (put_bits >= 8) { |
int c = (int) ((put_buffer >> 16) & 0xFF); |
- |
+ |
emit_byte(entropy, c); |
- if (c == 0xFF) { /* need to stuff a zero byte? */ |
+ if (c == 0xFF) { /* need to stuff a zero byte? */ |
emit_byte(entropy, 0); |
} |
put_buffer <<= 8; |
@@ -281,7 +284,7 @@ emit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol) |
if (entropy->gather_statistics) |
entropy->count_ptrs[tbl_no][symbol]++; |
else { |
- c_derived_tbl * tbl = entropy->derived_tbls[tbl_no]; |
+ c_derived_tbl *tbl = entropy->derived_tbls[tbl_no]; |
emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); |
} |
} |
@@ -292,11 +295,11 @@ emit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol) |
*/ |
LOCAL(void) |
-emit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart, |
- unsigned int nbits) |
+emit_buffered_bits (phuff_entropy_ptr entropy, char *bufstart, |
+ unsigned int nbits) |
{ |
if (entropy->gather_statistics) |
- return; /* no real work */ |
+ return; /* no real work */ |
while (nbits > 0) { |
emit_bits(entropy, (unsigned int) (*bufstart), 1); |
@@ -315,7 +318,7 @@ emit_eobrun (phuff_entropy_ptr entropy) |
{ |
register int temp, nbits; |
- if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */ |
+ if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */ |
temp = entropy->EOBRUN; |
nbits = 0; |
while ((temp >>= 1)) |
@@ -380,7 +383,7 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
int blkn, ci; |
int Al = cinfo->Al; |
JBLOCKROW block; |
- jpeg_component_info * compptr; |
+ jpeg_component_info *compptr; |
ISHIFT_TEMPS |
entropy->next_output_byte = cinfo->dest->next_output_byte; |
@@ -409,12 +412,12 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
/* Encode the DC coefficient difference per section G.1.2.1 */ |
temp2 = temp; |
if (temp < 0) { |
- temp = -temp; /* temp is abs value of input */ |
+ temp = -temp; /* temp is abs value of input */ |
/* For a negative input, want temp2 = bitwise complement of abs(input) */ |
/* This code assumes we are on a two's complement machine */ |
temp2--; |
} |
- |
+ |
/* Find the number of bits needed for the magnitude of the coefficient */ |
nbits = 0; |
while (temp) { |
@@ -426,13 +429,13 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
*/ |
if (nbits > MAX_COEF_BITS+1) |
ERREXIT(cinfo, JERR_BAD_DCT_COEF); |
- |
+ |
/* Count/emit the Huffman-coded symbol for the number of bits */ |
emit_symbol(entropy, compptr->dc_tbl_no, nbits); |
- |
+ |
/* Emit that number of bits of the value, if positive, */ |
/* or the complement of its magnitude, if negative. */ |
- if (nbits) /* emit_bits rejects calls with size 0 */ |
+ if (nbits) /* emit_bits rejects calls with size 0 */ |
emit_bits(entropy, (unsigned int) temp2, nbits); |
} |
@@ -481,9 +484,9 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
block = MCU_data[0]; |
/* Encode the AC coefficients per section G.1.2.2, fig. G.3 */ |
- |
- r = 0; /* r = run length of zeros */ |
- |
+ |
+ r = 0; /* r = run length of zeros */ |
+ |
for (k = cinfo->Ss; k <= Se; k++) { |
if ((temp = (*block)[jpeg_natural_order[k]]) == 0) { |
r++; |
@@ -495,12 +498,12 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
* interwoven with finding the abs value (temp) and output bits (temp2). |
*/ |
if (temp < 0) { |
- temp = -temp; /* temp is abs value of input */ |
- temp >>= Al; /* apply the point transform */ |
+ temp = -temp; /* temp is abs value of input */ |
+ temp >>= Al; /* apply the point transform */ |
/* For a negative coef, want temp2 = bitwise complement of abs(coef) */ |
temp2 = ~temp; |
} else { |
- temp >>= Al; /* apply the point transform */ |
+ temp >>= Al; /* apply the point transform */ |
temp2 = temp; |
} |
/* Watch out for case that nonzero coef is zero after point transform */ |
@@ -519,7 +522,7 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
} |
/* Find the number of bits needed for the magnitude of the coefficient */ |
- nbits = 1; /* there must be at least one 1 bit */ |
+ nbits = 1; /* there must be at least one 1 bit */ |
while ((temp >>= 1)) |
nbits++; |
/* Check for out-of-range coefficient values */ |
@@ -533,13 +536,13 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
/* or the complement of its magnitude, if negative. */ |
emit_bits(entropy, (unsigned int) temp2, nbits); |
- r = 0; /* reset zero run length */ |
+ r = 0; /* reset zero run length */ |
} |
- if (r > 0) { /* If there are trailing zeroes, */ |
- entropy->EOBRUN++; /* count an EOB */ |
+ if (r > 0) { /* If there are trailing zeroes, */ |
+ entropy->EOBRUN++; /* count an EOB */ |
if (entropy->EOBRUN == 0x7FFF) |
- emit_eobrun(entropy); /* force it out to avoid overflow */ |
+ emit_eobrun(entropy); /* force it out to avoid overflow */ |
} |
cinfo->dest->next_output_byte = entropy->next_output_byte; |
@@ -648,17 +651,17 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
* in C, we shift after obtaining the absolute value. |
*/ |
if (temp < 0) |
- temp = -temp; /* temp is abs value of input */ |
- temp >>= Al; /* apply the point transform */ |
- absvalues[k] = temp; /* save abs value for main pass */ |
+ temp = -temp; /* temp is abs value of input */ |
+ temp >>= Al; /* apply the point transform */ |
+ absvalues[k] = temp; /* save abs value for main pass */ |
if (temp == 1) |
- EOB = k; /* EOB = index of last newly-nonzero coef */ |
+ EOB = k; /* EOB = index of last newly-nonzero coef */ |
} |
/* Encode the AC coefficients per section G.1.2.3, fig. G.7 */ |
- |
- r = 0; /* r = run length of zeros */ |
- BR = 0; /* BR = count of buffered bits added now */ |
+ |
+ r = 0; /* r = run length of zeros */ |
+ BR = 0; /* BR = count of buffered bits added now */ |
BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */ |
for (k = cinfo->Ss; k <= Se; k++) { |
@@ -705,12 +708,12 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
emit_buffered_bits(entropy, BR_buffer, BR); |
BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ |
BR = 0; |
- r = 0; /* reset zero run length */ |
+ r = 0; /* reset zero run length */ |
} |
- if (r > 0 || BR > 0) { /* If there are trailing zeroes, */ |
- entropy->EOBRUN++; /* count an EOB */ |
- entropy->BE += BR; /* concat my correction bits to older ones */ |
+ if (r > 0 || BR > 0) { /* If there are trailing zeroes, */ |
+ entropy->EOBRUN++; /* count an EOB */ |
+ entropy->BE += BR; /* concat my correction bits to older ones */ |
/* We force out the EOB if we risk either: |
* 1. overflow of the EOB counter; |
* 2. overflow of the correction bit buffer during the next MCU. |
@@ -742,7 +745,7 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
METHODDEF(void) |
finish_pass_phuff (j_compress_ptr cinfo) |
-{ |
+{ |
phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; |
entropy->next_output_byte = cinfo->dest->next_output_byte; |
@@ -767,7 +770,7 @@ finish_pass_gather_phuff (j_compress_ptr cinfo) |
phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; |
boolean is_DC_band; |
int ci, tbl; |
- jpeg_component_info * compptr; |
+ jpeg_component_info *compptr; |
JHUFF_TBL **htblptr; |
boolean did[NUM_HUFF_TBLS]; |
@@ -779,13 +782,13 @@ finish_pass_gather_phuff (j_compress_ptr cinfo) |
/* It's important not to apply jpeg_gen_optimal_table more than once |
* per table, because it clobbers the input frequency counts! |
*/ |
- MEMZERO(did, SIZEOF(did)); |
+ MEMZERO(did, sizeof(did)); |
for (ci = 0; ci < cinfo->comps_in_scan; ci++) { |
compptr = cinfo->cur_comp_info[ci]; |
if (is_DC_band) { |
- if (cinfo->Ah != 0) /* DC refinement needs no table */ |
- continue; |
+ if (cinfo->Ah != 0) /* DC refinement needs no table */ |
+ continue; |
tbl = compptr->dc_tbl_no; |
} else { |
tbl = compptr->ac_tbl_no; |
@@ -816,7 +819,7 @@ jinit_phuff_encoder (j_compress_ptr cinfo) |
entropy = (phuff_entropy_ptr) |
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
- SIZEOF(phuff_entropy_encoder)); |
+ sizeof(phuff_entropy_encoder)); |
cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; |
entropy->pub.start_pass = start_pass_phuff; |
@@ -825,7 +828,7 @@ jinit_phuff_encoder (j_compress_ptr cinfo) |
entropy->derived_tbls[i] = NULL; |
entropy->count_ptrs[i] = NULL; |
} |
- entropy->bit_buffer = NULL; /* needed only in AC refinement scan */ |
+ entropy->bit_buffer = NULL; /* needed only in AC refinement scan */ |
} |
#endif /* C_PROGRESSIVE_SUPPORTED */ |