17dd7cddfSDavid du Colombier /*
27dd7cddfSDavid du Colombier * jchuff.c
37dd7cddfSDavid du Colombier *
4*593dc095SDavid du Colombier * Copyright (C) 1991-1997, Thomas G. Lane.
57dd7cddfSDavid du Colombier * This file is part of the Independent JPEG Group's software.
67dd7cddfSDavid du Colombier * For conditions of distribution and use, see the accompanying README file.
77dd7cddfSDavid du Colombier *
87dd7cddfSDavid du Colombier * This file contains Huffman entropy encoding routines.
97dd7cddfSDavid du Colombier *
107dd7cddfSDavid du Colombier * Much of the complexity here has to do with supporting output suspension.
117dd7cddfSDavid du Colombier * If the data destination module demands suspension, we want to be able to
127dd7cddfSDavid du Colombier * back up to the start of the current MCU. To do this, we copy state
137dd7cddfSDavid du Colombier * variables into local working storage, and update them back to the
147dd7cddfSDavid du Colombier * permanent JPEG objects only upon successful completion of an MCU.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier
177dd7cddfSDavid du Colombier #define JPEG_INTERNALS
187dd7cddfSDavid du Colombier #include "jinclude.h"
197dd7cddfSDavid du Colombier #include "jpeglib.h"
207dd7cddfSDavid du Colombier #include "jchuff.h" /* Declarations shared with jcphuff.c */
217dd7cddfSDavid du Colombier
227dd7cddfSDavid du Colombier
237dd7cddfSDavid du Colombier /* Expanded entropy encoder object for Huffman encoding.
247dd7cddfSDavid du Colombier *
257dd7cddfSDavid du Colombier * The savable_state subrecord contains fields that change within an MCU,
267dd7cddfSDavid du Colombier * but must not be updated permanently until we complete the MCU.
277dd7cddfSDavid du Colombier */
287dd7cddfSDavid du Colombier
297dd7cddfSDavid du Colombier typedef struct {
307dd7cddfSDavid du Colombier INT32 put_buffer; /* current bit-accumulation buffer */
317dd7cddfSDavid du Colombier int put_bits; /* # of bits now in it */
327dd7cddfSDavid du Colombier int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
337dd7cddfSDavid du Colombier } savable_state;
347dd7cddfSDavid du Colombier
357dd7cddfSDavid du Colombier /* This macro is to work around compilers with missing or broken
367dd7cddfSDavid du Colombier * structure assignment. You'll need to fix this code if you have
377dd7cddfSDavid du Colombier * such a compiler and you change MAX_COMPS_IN_SCAN.
387dd7cddfSDavid du Colombier */
397dd7cddfSDavid du Colombier
407dd7cddfSDavid du Colombier #ifndef NO_STRUCT_ASSIGN
417dd7cddfSDavid du Colombier #define ASSIGN_STATE(dest,src) ((dest) = (src))
427dd7cddfSDavid du Colombier #else
437dd7cddfSDavid du Colombier #if MAX_COMPS_IN_SCAN == 4
447dd7cddfSDavid du Colombier #define ASSIGN_STATE(dest,src) \
457dd7cddfSDavid du Colombier ((dest).put_buffer = (src).put_buffer, \
467dd7cddfSDavid du Colombier (dest).put_bits = (src).put_bits, \
477dd7cddfSDavid du Colombier (dest).last_dc_val[0] = (src).last_dc_val[0], \
487dd7cddfSDavid du Colombier (dest).last_dc_val[1] = (src).last_dc_val[1], \
497dd7cddfSDavid du Colombier (dest).last_dc_val[2] = (src).last_dc_val[2], \
507dd7cddfSDavid du Colombier (dest).last_dc_val[3] = (src).last_dc_val[3])
517dd7cddfSDavid du Colombier #endif
527dd7cddfSDavid du Colombier #endif
537dd7cddfSDavid du Colombier
547dd7cddfSDavid du Colombier
557dd7cddfSDavid du Colombier typedef struct {
567dd7cddfSDavid du Colombier struct jpeg_entropy_encoder pub; /* public fields */
577dd7cddfSDavid du Colombier
587dd7cddfSDavid du Colombier savable_state saved; /* Bit buffer & DC state at start of MCU */
597dd7cddfSDavid du Colombier
607dd7cddfSDavid du Colombier /* These fields are NOT loaded into local working state. */
617dd7cddfSDavid du Colombier unsigned int restarts_to_go; /* MCUs left in this restart interval */
627dd7cddfSDavid du Colombier int next_restart_num; /* next restart number to write (0-7) */
637dd7cddfSDavid du Colombier
647dd7cddfSDavid du Colombier /* Pointers to derived tables (these workspaces have image lifespan) */
657dd7cddfSDavid du Colombier c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
667dd7cddfSDavid du Colombier c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
677dd7cddfSDavid du Colombier
687dd7cddfSDavid du Colombier #ifdef ENTROPY_OPT_SUPPORTED /* Statistics tables for optimization */
697dd7cddfSDavid du Colombier long * dc_count_ptrs[NUM_HUFF_TBLS];
707dd7cddfSDavid du Colombier long * ac_count_ptrs[NUM_HUFF_TBLS];
717dd7cddfSDavid du Colombier #endif
727dd7cddfSDavid du Colombier } huff_entropy_encoder;
737dd7cddfSDavid du Colombier
747dd7cddfSDavid du Colombier typedef huff_entropy_encoder * huff_entropy_ptr;
757dd7cddfSDavid du Colombier
767dd7cddfSDavid du Colombier /* Working state while writing an MCU.
777dd7cddfSDavid du Colombier * This struct contains all the fields that are needed by subroutines.
787dd7cddfSDavid du Colombier */
797dd7cddfSDavid du Colombier
807dd7cddfSDavid du Colombier typedef struct {
817dd7cddfSDavid du Colombier JOCTET * next_output_byte; /* => next byte to write in buffer */
827dd7cddfSDavid du Colombier size_t free_in_buffer; /* # of byte spaces remaining in buffer */
837dd7cddfSDavid du Colombier savable_state cur; /* Current bit buffer & DC state */
847dd7cddfSDavid du Colombier j_compress_ptr cinfo; /* dump_buffer needs access to this */
857dd7cddfSDavid du Colombier } working_state;
867dd7cddfSDavid du Colombier
877dd7cddfSDavid du Colombier
887dd7cddfSDavid du Colombier /* Forward declarations */
897dd7cddfSDavid du Colombier METHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo,
907dd7cddfSDavid du Colombier JBLOCKROW *MCU_data));
917dd7cddfSDavid du Colombier METHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo));
927dd7cddfSDavid du Colombier #ifdef ENTROPY_OPT_SUPPORTED
937dd7cddfSDavid du Colombier METHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo,
947dd7cddfSDavid du Colombier JBLOCKROW *MCU_data));
957dd7cddfSDavid du Colombier METHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo));
967dd7cddfSDavid du Colombier #endif
977dd7cddfSDavid du Colombier
987dd7cddfSDavid du Colombier
997dd7cddfSDavid du Colombier /*
1007dd7cddfSDavid du Colombier * Initialize for a Huffman-compressed scan.
1017dd7cddfSDavid du Colombier * If gather_statistics is TRUE, we do not output anything during the scan,
1027dd7cddfSDavid du Colombier * just count the Huffman symbols used and generate Huffman code tables.
1037dd7cddfSDavid du Colombier */
1047dd7cddfSDavid du Colombier
1057dd7cddfSDavid du Colombier METHODDEF(void)
start_pass_huff(j_compress_ptr cinfo,boolean gather_statistics)1067dd7cddfSDavid du Colombier start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
1077dd7cddfSDavid du Colombier {
1087dd7cddfSDavid du Colombier huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
1097dd7cddfSDavid du Colombier int ci, dctbl, actbl;
1107dd7cddfSDavid du Colombier jpeg_component_info * compptr;
1117dd7cddfSDavid du Colombier
1127dd7cddfSDavid du Colombier if (gather_statistics) {
1137dd7cddfSDavid du Colombier #ifdef ENTROPY_OPT_SUPPORTED
1147dd7cddfSDavid du Colombier entropy->pub.encode_mcu = encode_mcu_gather;
1157dd7cddfSDavid du Colombier entropy->pub.finish_pass = finish_pass_gather;
1167dd7cddfSDavid du Colombier #else
1177dd7cddfSDavid du Colombier ERREXIT(cinfo, JERR_NOT_COMPILED);
1187dd7cddfSDavid du Colombier #endif
1197dd7cddfSDavid du Colombier } else {
1207dd7cddfSDavid du Colombier entropy->pub.encode_mcu = encode_mcu_huff;
1217dd7cddfSDavid du Colombier entropy->pub.finish_pass = finish_pass_huff;
1227dd7cddfSDavid du Colombier }
1237dd7cddfSDavid du Colombier
1247dd7cddfSDavid du Colombier for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
1257dd7cddfSDavid du Colombier compptr = cinfo->cur_comp_info[ci];
1267dd7cddfSDavid du Colombier dctbl = compptr->dc_tbl_no;
1277dd7cddfSDavid du Colombier actbl = compptr->ac_tbl_no;
1287dd7cddfSDavid du Colombier if (gather_statistics) {
1297dd7cddfSDavid du Colombier #ifdef ENTROPY_OPT_SUPPORTED
130*593dc095SDavid du Colombier /* Check for invalid table indexes */
131*593dc095SDavid du Colombier /* (make_c_derived_tbl does this in the other path) */
132*593dc095SDavid du Colombier if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS)
133*593dc095SDavid du Colombier ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl);
134*593dc095SDavid du Colombier if (actbl < 0 || actbl >= NUM_HUFF_TBLS)
135*593dc095SDavid du Colombier ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl);
1367dd7cddfSDavid du Colombier /* Allocate and zero the statistics tables */
1377dd7cddfSDavid du Colombier /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
1387dd7cddfSDavid du Colombier if (entropy->dc_count_ptrs[dctbl] == NULL)
1397dd7cddfSDavid du Colombier entropy->dc_count_ptrs[dctbl] = (long *)
1407dd7cddfSDavid du Colombier (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
1417dd7cddfSDavid du Colombier 257 * SIZEOF(long));
1427dd7cddfSDavid du Colombier MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long));
1437dd7cddfSDavid du Colombier if (entropy->ac_count_ptrs[actbl] == NULL)
1447dd7cddfSDavid du Colombier entropy->ac_count_ptrs[actbl] = (long *)
1457dd7cddfSDavid du Colombier (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
1467dd7cddfSDavid du Colombier 257 * SIZEOF(long));
1477dd7cddfSDavid du Colombier MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long));
1487dd7cddfSDavid du Colombier #endif
1497dd7cddfSDavid du Colombier } else {
1507dd7cddfSDavid du Colombier /* Compute derived values for Huffman tables */
1517dd7cddfSDavid du Colombier /* We may do this more than once for a table, but it's not expensive */
152*593dc095SDavid du Colombier jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl,
1537dd7cddfSDavid du Colombier & entropy->dc_derived_tbls[dctbl]);
154*593dc095SDavid du Colombier jpeg_make_c_derived_tbl(cinfo, FALSE, actbl,
1557dd7cddfSDavid du Colombier & entropy->ac_derived_tbls[actbl]);
1567dd7cddfSDavid du Colombier }
1577dd7cddfSDavid du Colombier /* Initialize DC predictions to 0 */
1587dd7cddfSDavid du Colombier entropy->saved.last_dc_val[ci] = 0;
1597dd7cddfSDavid du Colombier }
1607dd7cddfSDavid du Colombier
1617dd7cddfSDavid du Colombier /* Initialize bit buffer to empty */
1627dd7cddfSDavid du Colombier entropy->saved.put_buffer = 0;
1637dd7cddfSDavid du Colombier entropy->saved.put_bits = 0;
1647dd7cddfSDavid du Colombier
1657dd7cddfSDavid du Colombier /* Initialize restart stuff */
1667dd7cddfSDavid du Colombier entropy->restarts_to_go = cinfo->restart_interval;
1677dd7cddfSDavid du Colombier entropy->next_restart_num = 0;
1687dd7cddfSDavid du Colombier }
1697dd7cddfSDavid du Colombier
1707dd7cddfSDavid du Colombier
1717dd7cddfSDavid du Colombier /*
1727dd7cddfSDavid du Colombier * Compute the derived values for a Huffman table.
173*593dc095SDavid du Colombier * This routine also performs some validation checks on the table.
174*593dc095SDavid du Colombier *
1757dd7cddfSDavid du Colombier * Note this is also used by jcphuff.c.
1767dd7cddfSDavid du Colombier */
1777dd7cddfSDavid du Colombier
1787dd7cddfSDavid du Colombier GLOBAL(void)
jpeg_make_c_derived_tbl(j_compress_ptr cinfo,boolean isDC,int tblno,c_derived_tbl ** pdtbl)179*593dc095SDavid du Colombier jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,
1807dd7cddfSDavid du Colombier c_derived_tbl ** pdtbl)
1817dd7cddfSDavid du Colombier {
182*593dc095SDavid du Colombier JHUFF_TBL *htbl;
1837dd7cddfSDavid du Colombier c_derived_tbl *dtbl;
184*593dc095SDavid du Colombier int p, i, l, lastp, si, maxsymbol;
1857dd7cddfSDavid du Colombier char huffsize[257];
1867dd7cddfSDavid du Colombier unsigned int huffcode[257];
1877dd7cddfSDavid du Colombier unsigned int code;
1887dd7cddfSDavid du Colombier
189*593dc095SDavid du Colombier /* Note that huffsize[] and huffcode[] are filled in code-length order,
190*593dc095SDavid du Colombier * paralleling the order of the symbols themselves in htbl->huffval[].
191*593dc095SDavid du Colombier */
192*593dc095SDavid du Colombier
193*593dc095SDavid du Colombier /* Find the input Huffman table */
194*593dc095SDavid du Colombier if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
195*593dc095SDavid du Colombier ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
196*593dc095SDavid du Colombier htbl =
197*593dc095SDavid du Colombier isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
198*593dc095SDavid du Colombier if (htbl == NULL)
199*593dc095SDavid du Colombier ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
200*593dc095SDavid du Colombier
2017dd7cddfSDavid du Colombier /* Allocate a workspace if we haven't already done so. */
2027dd7cddfSDavid du Colombier if (*pdtbl == NULL)
2037dd7cddfSDavid du Colombier *pdtbl = (c_derived_tbl *)
2047dd7cddfSDavid du Colombier (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
2057dd7cddfSDavid du Colombier SIZEOF(c_derived_tbl));
2067dd7cddfSDavid du Colombier dtbl = *pdtbl;
2077dd7cddfSDavid du Colombier
2087dd7cddfSDavid du Colombier /* Figure C.1: make table of Huffman code length for each symbol */
2097dd7cddfSDavid du Colombier
2107dd7cddfSDavid du Colombier p = 0;
2117dd7cddfSDavid du Colombier for (l = 1; l <= 16; l++) {
212*593dc095SDavid du Colombier i = (int) htbl->bits[l];
213*593dc095SDavid du Colombier if (i < 0 || p + i > 256) /* protect against table overrun */
214*593dc095SDavid du Colombier ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
215*593dc095SDavid du Colombier while (i--)
2167dd7cddfSDavid du Colombier huffsize[p++] = (char) l;
2177dd7cddfSDavid du Colombier }
2187dd7cddfSDavid du Colombier huffsize[p] = 0;
2197dd7cddfSDavid du Colombier lastp = p;
2207dd7cddfSDavid du Colombier
2217dd7cddfSDavid du Colombier /* Figure C.2: generate the codes themselves */
222*593dc095SDavid du Colombier /* We also validate that the counts represent a legal Huffman code tree. */
2237dd7cddfSDavid du Colombier
2247dd7cddfSDavid du Colombier code = 0;
2257dd7cddfSDavid du Colombier si = huffsize[0];
2267dd7cddfSDavid du Colombier p = 0;
2277dd7cddfSDavid du Colombier while (huffsize[p]) {
2287dd7cddfSDavid du Colombier while (((int) huffsize[p]) == si) {
2297dd7cddfSDavid du Colombier huffcode[p++] = code;
2307dd7cddfSDavid du Colombier code++;
2317dd7cddfSDavid du Colombier }
232*593dc095SDavid du Colombier /* code is now 1 more than the last code used for codelength si; but
233*593dc095SDavid du Colombier * it must still fit in si bits, since no code is allowed to be all ones.
234*593dc095SDavid du Colombier */
235*593dc095SDavid du Colombier if (((INT32) code) >= (((INT32) 1) << si))
236*593dc095SDavid du Colombier ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
2377dd7cddfSDavid du Colombier code <<= 1;
2387dd7cddfSDavid du Colombier si++;
2397dd7cddfSDavid du Colombier }
2407dd7cddfSDavid du Colombier
2417dd7cddfSDavid du Colombier /* Figure C.3: generate encoding tables */
2427dd7cddfSDavid du Colombier /* These are code and size indexed by symbol value */
2437dd7cddfSDavid du Colombier
244*593dc095SDavid du Colombier /* Set all codeless symbols to have code length 0;
245*593dc095SDavid du Colombier * this lets us detect duplicate VAL entries here, and later
246*593dc095SDavid du Colombier * allows emit_bits to detect any attempt to emit such symbols.
2477dd7cddfSDavid du Colombier */
2487dd7cddfSDavid du Colombier MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi));
2497dd7cddfSDavid du Colombier
250*593dc095SDavid du Colombier /* This is also a convenient place to check for out-of-range
251*593dc095SDavid du Colombier * and duplicated VAL entries. We allow 0..255 for AC symbols
252*593dc095SDavid du Colombier * but only 0..15 for DC. (We could constrain them further
253*593dc095SDavid du Colombier * based on data depth and mode, but this seems enough.)
254*593dc095SDavid du Colombier */
255*593dc095SDavid du Colombier maxsymbol = isDC ? 15 : 255;
256*593dc095SDavid du Colombier
2577dd7cddfSDavid du Colombier for (p = 0; p < lastp; p++) {
258*593dc095SDavid du Colombier i = htbl->huffval[p];
259*593dc095SDavid du Colombier if (i < 0 || i > maxsymbol || dtbl->ehufsi[i])
260*593dc095SDavid du Colombier ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
261*593dc095SDavid du Colombier dtbl->ehufco[i] = huffcode[p];
262*593dc095SDavid du Colombier dtbl->ehufsi[i] = huffsize[p];
2637dd7cddfSDavid du Colombier }
2647dd7cddfSDavid du Colombier }
2657dd7cddfSDavid du Colombier
2667dd7cddfSDavid du Colombier
2677dd7cddfSDavid du Colombier /* Outputting bytes to the file */
2687dd7cddfSDavid du Colombier
2697dd7cddfSDavid du Colombier /* Emit a byte, taking 'action' if must suspend. */
2707dd7cddfSDavid du Colombier #define emit_byte(state,val,action) \
2717dd7cddfSDavid du Colombier { *(state)->next_output_byte++ = (JOCTET) (val); \
2727dd7cddfSDavid du Colombier if (--(state)->free_in_buffer == 0) \
2737dd7cddfSDavid du Colombier if (! dump_buffer(state)) \
2747dd7cddfSDavid du Colombier { action; } }
2757dd7cddfSDavid du Colombier
2767dd7cddfSDavid du Colombier
2777dd7cddfSDavid du Colombier LOCAL(boolean)
dump_buffer(working_state * state)2787dd7cddfSDavid du Colombier dump_buffer (working_state * state)
2797dd7cddfSDavid du Colombier /* Empty the output buffer; return TRUE if successful, FALSE if must suspend */
2807dd7cddfSDavid du Colombier {
2817dd7cddfSDavid du Colombier struct jpeg_destination_mgr * dest = state->cinfo->dest;
2827dd7cddfSDavid du Colombier
2837dd7cddfSDavid du Colombier if (! (*dest->empty_output_buffer) (state->cinfo))
2847dd7cddfSDavid du Colombier return FALSE;
2857dd7cddfSDavid du Colombier /* After a successful buffer dump, must reset buffer pointers */
2867dd7cddfSDavid du Colombier state->next_output_byte = dest->next_output_byte;
2877dd7cddfSDavid du Colombier state->free_in_buffer = dest->free_in_buffer;
2887dd7cddfSDavid du Colombier return TRUE;
2897dd7cddfSDavid du Colombier }
2907dd7cddfSDavid du Colombier
2917dd7cddfSDavid du Colombier
2927dd7cddfSDavid du Colombier /* Outputting bits to the file */
2937dd7cddfSDavid du Colombier
2947dd7cddfSDavid du Colombier /* Only the right 24 bits of put_buffer are used; the valid bits are
2957dd7cddfSDavid du Colombier * left-justified in this part. At most 16 bits can be passed to emit_bits
2967dd7cddfSDavid du Colombier * in one call, and we never retain more than 7 bits in put_buffer
2977dd7cddfSDavid du Colombier * between calls, so 24 bits are sufficient.
2987dd7cddfSDavid du Colombier */
2997dd7cddfSDavid du Colombier
3007dd7cddfSDavid du Colombier INLINE
LOCAL(boolean)3017dd7cddfSDavid du Colombier LOCAL(boolean)
3027dd7cddfSDavid du Colombier emit_bits (working_state * state, unsigned int code, int size)
3037dd7cddfSDavid du Colombier /* Emit some bits; return TRUE if successful, FALSE if must suspend */
3047dd7cddfSDavid du Colombier {
3057dd7cddfSDavid du Colombier /* This routine is heavily used, so it's worth coding tightly. */
3067dd7cddfSDavid du Colombier register INT32 put_buffer = (INT32) code;
3077dd7cddfSDavid du Colombier register int put_bits = state->cur.put_bits;
3087dd7cddfSDavid du Colombier
3097dd7cddfSDavid du Colombier /* if size is 0, caller used an invalid Huffman table entry */
3107dd7cddfSDavid du Colombier if (size == 0)
3117dd7cddfSDavid du Colombier ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);
3127dd7cddfSDavid du Colombier
3137dd7cddfSDavid du Colombier put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
3147dd7cddfSDavid du Colombier
3157dd7cddfSDavid du Colombier put_bits += size; /* new number of bits in buffer */
3167dd7cddfSDavid du Colombier
3177dd7cddfSDavid du Colombier put_buffer <<= 24 - put_bits; /* align incoming bits */
3187dd7cddfSDavid du Colombier
3197dd7cddfSDavid du Colombier put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */
3207dd7cddfSDavid du Colombier
3217dd7cddfSDavid du Colombier while (put_bits >= 8) {
3227dd7cddfSDavid du Colombier int c = (int) ((put_buffer >> 16) & 0xFF);
3237dd7cddfSDavid du Colombier
3247dd7cddfSDavid du Colombier emit_byte(state, c, return FALSE);
3257dd7cddfSDavid du Colombier if (c == 0xFF) { /* need to stuff a zero byte? */
3267dd7cddfSDavid du Colombier emit_byte(state, 0, return FALSE);
3277dd7cddfSDavid du Colombier }
3287dd7cddfSDavid du Colombier put_buffer <<= 8;
3297dd7cddfSDavid du Colombier put_bits -= 8;
3307dd7cddfSDavid du Colombier }
3317dd7cddfSDavid du Colombier
3327dd7cddfSDavid du Colombier state->cur.put_buffer = put_buffer; /* update state variables */
3337dd7cddfSDavid du Colombier state->cur.put_bits = put_bits;
3347dd7cddfSDavid du Colombier
3357dd7cddfSDavid du Colombier return TRUE;
3367dd7cddfSDavid du Colombier }
3377dd7cddfSDavid du Colombier
3387dd7cddfSDavid du Colombier
3397dd7cddfSDavid du Colombier LOCAL(boolean)
flush_bits(working_state * state)3407dd7cddfSDavid du Colombier flush_bits (working_state * state)
3417dd7cddfSDavid du Colombier {
3427dd7cddfSDavid du Colombier if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */
3437dd7cddfSDavid du Colombier return FALSE;
3447dd7cddfSDavid du Colombier state->cur.put_buffer = 0; /* and reset bit-buffer to empty */
3457dd7cddfSDavid du Colombier state->cur.put_bits = 0;
3467dd7cddfSDavid du Colombier return TRUE;
3477dd7cddfSDavid du Colombier }
3487dd7cddfSDavid du Colombier
3497dd7cddfSDavid du Colombier
3507dd7cddfSDavid du Colombier /* Encode a single block's worth of coefficients */
3517dd7cddfSDavid du Colombier
3527dd7cddfSDavid du Colombier LOCAL(boolean)
encode_one_block(working_state * state,JCOEFPTR block,int last_dc_val,c_derived_tbl * dctbl,c_derived_tbl * actbl)3537dd7cddfSDavid du Colombier encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
3547dd7cddfSDavid du Colombier c_derived_tbl *dctbl, c_derived_tbl *actbl)
3557dd7cddfSDavid du Colombier {
3567dd7cddfSDavid du Colombier register int temp, temp2;
3577dd7cddfSDavid du Colombier register int nbits;
3587dd7cddfSDavid du Colombier register int k, r, i;
3597dd7cddfSDavid du Colombier
3607dd7cddfSDavid du Colombier /* Encode the DC coefficient difference per section F.1.2.1 */
3617dd7cddfSDavid du Colombier
3627dd7cddfSDavid du Colombier temp = temp2 = block[0] - last_dc_val;
3637dd7cddfSDavid du Colombier
3647dd7cddfSDavid du Colombier if (temp < 0) {
3657dd7cddfSDavid du Colombier temp = -temp; /* temp is abs value of input */
3667dd7cddfSDavid du Colombier /* For a negative input, want temp2 = bitwise complement of abs(input) */
3677dd7cddfSDavid du Colombier /* This code assumes we are on a two's complement machine */
3687dd7cddfSDavid du Colombier temp2--;
3697dd7cddfSDavid du Colombier }
3707dd7cddfSDavid du Colombier
3717dd7cddfSDavid du Colombier /* Find the number of bits needed for the magnitude of the coefficient */
3727dd7cddfSDavid du Colombier nbits = 0;
3737dd7cddfSDavid du Colombier while (temp) {
3747dd7cddfSDavid du Colombier nbits++;
3757dd7cddfSDavid du Colombier temp >>= 1;
3767dd7cddfSDavid du Colombier }
377*593dc095SDavid du Colombier /* Check for out-of-range coefficient values.
378*593dc095SDavid du Colombier * Since we're encoding a difference, the range limit is twice as much.
379*593dc095SDavid du Colombier */
380*593dc095SDavid du Colombier if (nbits > MAX_COEF_BITS+1)
381*593dc095SDavid du Colombier ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
3827dd7cddfSDavid du Colombier
3837dd7cddfSDavid du Colombier /* Emit the Huffman-coded symbol for the number of bits */
3847dd7cddfSDavid du Colombier if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits]))
3857dd7cddfSDavid du Colombier return FALSE;
3867dd7cddfSDavid du Colombier
3877dd7cddfSDavid du Colombier /* Emit that number of bits of the value, if positive, */
3887dd7cddfSDavid du Colombier /* or the complement of its magnitude, if negative. */
3897dd7cddfSDavid du Colombier if (nbits) /* emit_bits rejects calls with size 0 */
3907dd7cddfSDavid du Colombier if (! emit_bits(state, (unsigned int) temp2, nbits))
3917dd7cddfSDavid du Colombier return FALSE;
3927dd7cddfSDavid du Colombier
3937dd7cddfSDavid du Colombier /* Encode the AC coefficients per section F.1.2.2 */
3947dd7cddfSDavid du Colombier
3957dd7cddfSDavid du Colombier r = 0; /* r = run length of zeros */
3967dd7cddfSDavid du Colombier
3977dd7cddfSDavid du Colombier for (k = 1; k < DCTSIZE2; k++) {
3987dd7cddfSDavid du Colombier if ((temp = block[jpeg_natural_order[k]]) == 0) {
3997dd7cddfSDavid du Colombier r++;
4007dd7cddfSDavid du Colombier } else {
4017dd7cddfSDavid du Colombier /* if run length > 15, must emit special run-length-16 codes (0xF0) */
4027dd7cddfSDavid du Colombier while (r > 15) {
4037dd7cddfSDavid du Colombier if (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0]))
4047dd7cddfSDavid du Colombier return FALSE;
4057dd7cddfSDavid du Colombier r -= 16;
4067dd7cddfSDavid du Colombier }
4077dd7cddfSDavid du Colombier
4087dd7cddfSDavid du Colombier temp2 = temp;
4097dd7cddfSDavid du Colombier if (temp < 0) {
4107dd7cddfSDavid du Colombier temp = -temp; /* temp is abs value of input */
4117dd7cddfSDavid du Colombier /* This code assumes we are on a two's complement machine */
4127dd7cddfSDavid du Colombier temp2--;
4137dd7cddfSDavid du Colombier }
4147dd7cddfSDavid du Colombier
4157dd7cddfSDavid du Colombier /* Find the number of bits needed for the magnitude of the coefficient */
4167dd7cddfSDavid du Colombier nbits = 1; /* there must be at least one 1 bit */
4177dd7cddfSDavid du Colombier while ((temp >>= 1))
4187dd7cddfSDavid du Colombier nbits++;
419*593dc095SDavid du Colombier /* Check for out-of-range coefficient values */
420*593dc095SDavid du Colombier if (nbits > MAX_COEF_BITS)
421*593dc095SDavid du Colombier ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
4227dd7cddfSDavid du Colombier
4237dd7cddfSDavid du Colombier /* Emit Huffman symbol for run length / number of bits */
4247dd7cddfSDavid du Colombier i = (r << 4) + nbits;
4257dd7cddfSDavid du Colombier if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i]))
4267dd7cddfSDavid du Colombier return FALSE;
4277dd7cddfSDavid du Colombier
4287dd7cddfSDavid du Colombier /* Emit that number of bits of the value, if positive, */
4297dd7cddfSDavid du Colombier /* or the complement of its magnitude, if negative. */
4307dd7cddfSDavid du Colombier if (! emit_bits(state, (unsigned int) temp2, nbits))
4317dd7cddfSDavid du Colombier return FALSE;
4327dd7cddfSDavid du Colombier
4337dd7cddfSDavid du Colombier r = 0;
4347dd7cddfSDavid du Colombier }
4357dd7cddfSDavid du Colombier }
4367dd7cddfSDavid du Colombier
4377dd7cddfSDavid du Colombier /* If the last coef(s) were zero, emit an end-of-block code */
4387dd7cddfSDavid du Colombier if (r > 0)
4397dd7cddfSDavid du Colombier if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0]))
4407dd7cddfSDavid du Colombier return FALSE;
4417dd7cddfSDavid du Colombier
4427dd7cddfSDavid du Colombier return TRUE;
4437dd7cddfSDavid du Colombier }
4447dd7cddfSDavid du Colombier
4457dd7cddfSDavid du Colombier
4467dd7cddfSDavid du Colombier /*
4477dd7cddfSDavid du Colombier * Emit a restart marker & resynchronize predictions.
4487dd7cddfSDavid du Colombier */
4497dd7cddfSDavid du Colombier
4507dd7cddfSDavid du Colombier LOCAL(boolean)
emit_restart(working_state * state,int restart_num)4517dd7cddfSDavid du Colombier emit_restart (working_state * state, int restart_num)
4527dd7cddfSDavid du Colombier {
4537dd7cddfSDavid du Colombier int ci;
4547dd7cddfSDavid du Colombier
4557dd7cddfSDavid du Colombier if (! flush_bits(state))
4567dd7cddfSDavid du Colombier return FALSE;
4577dd7cddfSDavid du Colombier
4587dd7cddfSDavid du Colombier emit_byte(state, 0xFF, return FALSE);
4597dd7cddfSDavid du Colombier emit_byte(state, JPEG_RST0 + restart_num, return FALSE);
4607dd7cddfSDavid du Colombier
4617dd7cddfSDavid du Colombier /* Re-initialize DC predictions to 0 */
4627dd7cddfSDavid du Colombier for (ci = 0; ci < state->cinfo->comps_in_scan; ci++)
4637dd7cddfSDavid du Colombier state->cur.last_dc_val[ci] = 0;
4647dd7cddfSDavid du Colombier
4657dd7cddfSDavid du Colombier /* The restart counter is not updated until we successfully write the MCU. */
4667dd7cddfSDavid du Colombier
4677dd7cddfSDavid du Colombier return TRUE;
4687dd7cddfSDavid du Colombier }
4697dd7cddfSDavid du Colombier
4707dd7cddfSDavid du Colombier
4717dd7cddfSDavid du Colombier /*
4727dd7cddfSDavid du Colombier * Encode and output one MCU's worth of Huffman-compressed coefficients.
4737dd7cddfSDavid du Colombier */
4747dd7cddfSDavid du Colombier
4757dd7cddfSDavid du Colombier METHODDEF(boolean)
encode_mcu_huff(j_compress_ptr cinfo,JBLOCKROW * MCU_data)4767dd7cddfSDavid du Colombier encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
4777dd7cddfSDavid du Colombier {
4787dd7cddfSDavid du Colombier huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
4797dd7cddfSDavid du Colombier working_state state;
4807dd7cddfSDavid du Colombier int blkn, ci;
4817dd7cddfSDavid du Colombier jpeg_component_info * compptr;
4827dd7cddfSDavid du Colombier
4837dd7cddfSDavid du Colombier /* Load up working state */
4847dd7cddfSDavid du Colombier state.next_output_byte = cinfo->dest->next_output_byte;
4857dd7cddfSDavid du Colombier state.free_in_buffer = cinfo->dest->free_in_buffer;
4867dd7cddfSDavid du Colombier ASSIGN_STATE(state.cur, entropy->saved);
4877dd7cddfSDavid du Colombier state.cinfo = cinfo;
4887dd7cddfSDavid du Colombier
4897dd7cddfSDavid du Colombier /* Emit restart marker if needed */
4907dd7cddfSDavid du Colombier if (cinfo->restart_interval) {
4917dd7cddfSDavid du Colombier if (entropy->restarts_to_go == 0)
4927dd7cddfSDavid du Colombier if (! emit_restart(&state, entropy->next_restart_num))
4937dd7cddfSDavid du Colombier return FALSE;
4947dd7cddfSDavid du Colombier }
4957dd7cddfSDavid du Colombier
4967dd7cddfSDavid du Colombier /* Encode the MCU data blocks */
4977dd7cddfSDavid du Colombier for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
4987dd7cddfSDavid du Colombier ci = cinfo->MCU_membership[blkn];
4997dd7cddfSDavid du Colombier compptr = cinfo->cur_comp_info[ci];
5007dd7cddfSDavid du Colombier if (! encode_one_block(&state,
5017dd7cddfSDavid du Colombier MCU_data[blkn][0], state.cur.last_dc_val[ci],
5027dd7cddfSDavid du Colombier entropy->dc_derived_tbls[compptr->dc_tbl_no],
5037dd7cddfSDavid du Colombier entropy->ac_derived_tbls[compptr->ac_tbl_no]))
5047dd7cddfSDavid du Colombier return FALSE;
5057dd7cddfSDavid du Colombier /* Update last_dc_val */
5067dd7cddfSDavid du Colombier state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];
5077dd7cddfSDavid du Colombier }
5087dd7cddfSDavid du Colombier
5097dd7cddfSDavid du Colombier /* Completed MCU, so update state */
5107dd7cddfSDavid du Colombier cinfo->dest->next_output_byte = state.next_output_byte;
5117dd7cddfSDavid du Colombier cinfo->dest->free_in_buffer = state.free_in_buffer;
5127dd7cddfSDavid du Colombier ASSIGN_STATE(entropy->saved, state.cur);
5137dd7cddfSDavid du Colombier
5147dd7cddfSDavid du Colombier /* Update restart-interval state too */
5157dd7cddfSDavid du Colombier if (cinfo->restart_interval) {
5167dd7cddfSDavid du Colombier if (entropy->restarts_to_go == 0) {
5177dd7cddfSDavid du Colombier entropy->restarts_to_go = cinfo->restart_interval;
5187dd7cddfSDavid du Colombier entropy->next_restart_num++;
5197dd7cddfSDavid du Colombier entropy->next_restart_num &= 7;
5207dd7cddfSDavid du Colombier }
5217dd7cddfSDavid du Colombier entropy->restarts_to_go--;
5227dd7cddfSDavid du Colombier }
5237dd7cddfSDavid du Colombier
5247dd7cddfSDavid du Colombier return TRUE;
5257dd7cddfSDavid du Colombier }
5267dd7cddfSDavid du Colombier
5277dd7cddfSDavid du Colombier
5287dd7cddfSDavid du Colombier /*
5297dd7cddfSDavid du Colombier * Finish up at the end of a Huffman-compressed scan.
5307dd7cddfSDavid du Colombier */
5317dd7cddfSDavid du Colombier
5327dd7cddfSDavid du Colombier METHODDEF(void)
finish_pass_huff(j_compress_ptr cinfo)5337dd7cddfSDavid du Colombier finish_pass_huff (j_compress_ptr cinfo)
5347dd7cddfSDavid du Colombier {
5357dd7cddfSDavid du Colombier huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
5367dd7cddfSDavid du Colombier working_state state;
5377dd7cddfSDavid du Colombier
5387dd7cddfSDavid du Colombier /* Load up working state ... flush_bits needs it */
5397dd7cddfSDavid du Colombier state.next_output_byte = cinfo->dest->next_output_byte;
5407dd7cddfSDavid du Colombier state.free_in_buffer = cinfo->dest->free_in_buffer;
5417dd7cddfSDavid du Colombier ASSIGN_STATE(state.cur, entropy->saved);
5427dd7cddfSDavid du Colombier state.cinfo = cinfo;
5437dd7cddfSDavid du Colombier
5447dd7cddfSDavid du Colombier /* Flush out the last data */
5457dd7cddfSDavid du Colombier if (! flush_bits(&state))
5467dd7cddfSDavid du Colombier ERREXIT(cinfo, JERR_CANT_SUSPEND);
5477dd7cddfSDavid du Colombier
5487dd7cddfSDavid du Colombier /* Update state */
5497dd7cddfSDavid du Colombier cinfo->dest->next_output_byte = state.next_output_byte;
5507dd7cddfSDavid du Colombier cinfo->dest->free_in_buffer = state.free_in_buffer;
5517dd7cddfSDavid du Colombier ASSIGN_STATE(entropy->saved, state.cur);
5527dd7cddfSDavid du Colombier }
5537dd7cddfSDavid du Colombier
5547dd7cddfSDavid du Colombier
5557dd7cddfSDavid du Colombier /*
5567dd7cddfSDavid du Colombier * Huffman coding optimization.
5577dd7cddfSDavid du Colombier *
558*593dc095SDavid du Colombier * We first scan the supplied data and count the number of uses of each symbol
559*593dc095SDavid du Colombier * that is to be Huffman-coded. (This process MUST agree with the code above.)
560*593dc095SDavid du Colombier * Then we build a Huffman coding tree for the observed counts.
561*593dc095SDavid du Colombier * Symbols which are not needed at all for the particular image are not
562*593dc095SDavid du Colombier * assigned any code, which saves space in the DHT marker as well as in
563*593dc095SDavid du Colombier * the compressed data.
5647dd7cddfSDavid du Colombier */
5657dd7cddfSDavid du Colombier
5667dd7cddfSDavid du Colombier #ifdef ENTROPY_OPT_SUPPORTED
5677dd7cddfSDavid du Colombier
5687dd7cddfSDavid du Colombier
5697dd7cddfSDavid du Colombier /* Process a single block's worth of coefficients */
5707dd7cddfSDavid du Colombier
5717dd7cddfSDavid du Colombier LOCAL(void)
htest_one_block(j_compress_ptr cinfo,JCOEFPTR block,int last_dc_val,long dc_counts[],long ac_counts[])572*593dc095SDavid du Colombier htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
5737dd7cddfSDavid du Colombier long dc_counts[], long ac_counts[])
5747dd7cddfSDavid du Colombier {
5757dd7cddfSDavid du Colombier register int temp;
5767dd7cddfSDavid du Colombier register int nbits;
5777dd7cddfSDavid du Colombier register int k, r;
5787dd7cddfSDavid du Colombier
5797dd7cddfSDavid du Colombier /* Encode the DC coefficient difference per section F.1.2.1 */
5807dd7cddfSDavid du Colombier
5817dd7cddfSDavid du Colombier temp = block[0] - last_dc_val;
5827dd7cddfSDavid du Colombier if (temp < 0)
5837dd7cddfSDavid du Colombier temp = -temp;
5847dd7cddfSDavid du Colombier
5857dd7cddfSDavid du Colombier /* Find the number of bits needed for the magnitude of the coefficient */
5867dd7cddfSDavid du Colombier nbits = 0;
5877dd7cddfSDavid du Colombier while (temp) {
5887dd7cddfSDavid du Colombier nbits++;
5897dd7cddfSDavid du Colombier temp >>= 1;
5907dd7cddfSDavid du Colombier }
591*593dc095SDavid du Colombier /* Check for out-of-range coefficient values.
592*593dc095SDavid du Colombier * Since we're encoding a difference, the range limit is twice as much.
593*593dc095SDavid du Colombier */
594*593dc095SDavid du Colombier if (nbits > MAX_COEF_BITS+1)
595*593dc095SDavid du Colombier ERREXIT(cinfo, JERR_BAD_DCT_COEF);
5967dd7cddfSDavid du Colombier
5977dd7cddfSDavid du Colombier /* Count the Huffman symbol for the number of bits */
5987dd7cddfSDavid du Colombier dc_counts[nbits]++;
5997dd7cddfSDavid du Colombier
6007dd7cddfSDavid du Colombier /* Encode the AC coefficients per section F.1.2.2 */
6017dd7cddfSDavid du Colombier
6027dd7cddfSDavid du Colombier r = 0; /* r = run length of zeros */
6037dd7cddfSDavid du Colombier
6047dd7cddfSDavid du Colombier for (k = 1; k < DCTSIZE2; k++) {
6057dd7cddfSDavid du Colombier if ((temp = block[jpeg_natural_order[k]]) == 0) {
6067dd7cddfSDavid du Colombier r++;
6077dd7cddfSDavid du Colombier } else {
6087dd7cddfSDavid du Colombier /* if run length > 15, must emit special run-length-16 codes (0xF0) */
6097dd7cddfSDavid du Colombier while (r > 15) {
6107dd7cddfSDavid du Colombier ac_counts[0xF0]++;
6117dd7cddfSDavid du Colombier r -= 16;
6127dd7cddfSDavid du Colombier }
6137dd7cddfSDavid du Colombier
6147dd7cddfSDavid du Colombier /* Find the number of bits needed for the magnitude of the coefficient */
6157dd7cddfSDavid du Colombier if (temp < 0)
6167dd7cddfSDavid du Colombier temp = -temp;
6177dd7cddfSDavid du Colombier
6187dd7cddfSDavid du Colombier /* Find the number of bits needed for the magnitude of the coefficient */
6197dd7cddfSDavid du Colombier nbits = 1; /* there must be at least one 1 bit */
6207dd7cddfSDavid du Colombier while ((temp >>= 1))
6217dd7cddfSDavid du Colombier nbits++;
622*593dc095SDavid du Colombier /* Check for out-of-range coefficient values */
623*593dc095SDavid du Colombier if (nbits > MAX_COEF_BITS)
624*593dc095SDavid du Colombier ERREXIT(cinfo, JERR_BAD_DCT_COEF);
6257dd7cddfSDavid du Colombier
6267dd7cddfSDavid du Colombier /* Count Huffman symbol for run length / number of bits */
6277dd7cddfSDavid du Colombier ac_counts[(r << 4) + nbits]++;
6287dd7cddfSDavid du Colombier
6297dd7cddfSDavid du Colombier r = 0;
6307dd7cddfSDavid du Colombier }
6317dd7cddfSDavid du Colombier }
6327dd7cddfSDavid du Colombier
6337dd7cddfSDavid du Colombier /* If the last coef(s) were zero, emit an end-of-block code */
6347dd7cddfSDavid du Colombier if (r > 0)
6357dd7cddfSDavid du Colombier ac_counts[0]++;
6367dd7cddfSDavid du Colombier }
6377dd7cddfSDavid du Colombier
6387dd7cddfSDavid du Colombier
6397dd7cddfSDavid du Colombier /*
6407dd7cddfSDavid du Colombier * Trial-encode one MCU's worth of Huffman-compressed coefficients.
6417dd7cddfSDavid du Colombier * No data is actually output, so no suspension return is possible.
6427dd7cddfSDavid du Colombier */
6437dd7cddfSDavid du Colombier
6447dd7cddfSDavid du Colombier METHODDEF(boolean)
encode_mcu_gather(j_compress_ptr cinfo,JBLOCKROW * MCU_data)6457dd7cddfSDavid du Colombier encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
6467dd7cddfSDavid du Colombier {
6477dd7cddfSDavid du Colombier huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
6487dd7cddfSDavid du Colombier int blkn, ci;
6497dd7cddfSDavid du Colombier jpeg_component_info * compptr;
6507dd7cddfSDavid du Colombier
6517dd7cddfSDavid du Colombier /* Take care of restart intervals if needed */
6527dd7cddfSDavid du Colombier if (cinfo->restart_interval) {
6537dd7cddfSDavid du Colombier if (entropy->restarts_to_go == 0) {
6547dd7cddfSDavid du Colombier /* Re-initialize DC predictions to 0 */
6557dd7cddfSDavid du Colombier for (ci = 0; ci < cinfo->comps_in_scan; ci++)
6567dd7cddfSDavid du Colombier entropy->saved.last_dc_val[ci] = 0;
6577dd7cddfSDavid du Colombier /* Update restart state */
6587dd7cddfSDavid du Colombier entropy->restarts_to_go = cinfo->restart_interval;
6597dd7cddfSDavid du Colombier }
6607dd7cddfSDavid du Colombier entropy->restarts_to_go--;
6617dd7cddfSDavid du Colombier }
6627dd7cddfSDavid du Colombier
6637dd7cddfSDavid du Colombier for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
6647dd7cddfSDavid du Colombier ci = cinfo->MCU_membership[blkn];
6657dd7cddfSDavid du Colombier compptr = cinfo->cur_comp_info[ci];
666*593dc095SDavid du Colombier htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci],
6677dd7cddfSDavid du Colombier entropy->dc_count_ptrs[compptr->dc_tbl_no],
6687dd7cddfSDavid du Colombier entropy->ac_count_ptrs[compptr->ac_tbl_no]);
6697dd7cddfSDavid du Colombier entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0];
6707dd7cddfSDavid du Colombier }
6717dd7cddfSDavid du Colombier
6727dd7cddfSDavid du Colombier return TRUE;
6737dd7cddfSDavid du Colombier }
6747dd7cddfSDavid du Colombier
6757dd7cddfSDavid du Colombier
6767dd7cddfSDavid du Colombier /*
677*593dc095SDavid du Colombier * Generate the best Huffman code table for the given counts, fill htbl.
6787dd7cddfSDavid du Colombier * Note this is also used by jcphuff.c.
679*593dc095SDavid du Colombier *
680*593dc095SDavid du Colombier * The JPEG standard requires that no symbol be assigned a codeword of all
681*593dc095SDavid du Colombier * one bits (so that padding bits added at the end of a compressed segment
682*593dc095SDavid du Colombier * can't look like a valid code). Because of the canonical ordering of
683*593dc095SDavid du Colombier * codewords, this just means that there must be an unused slot in the
684*593dc095SDavid du Colombier * longest codeword length category. Section K.2 of the JPEG spec suggests
685*593dc095SDavid du Colombier * reserving such a slot by pretending that symbol 256 is a valid symbol
686*593dc095SDavid du Colombier * with count 1. In theory that's not optimal; giving it count zero but
687*593dc095SDavid du Colombier * including it in the symbol set anyway should give a better Huffman code.
688*593dc095SDavid du Colombier * But the theoretically better code actually seems to come out worse in
689*593dc095SDavid du Colombier * practice, because it produces more all-ones bytes (which incur stuffed
690*593dc095SDavid du Colombier * zero bytes in the final file). In any case the difference is tiny.
691*593dc095SDavid du Colombier *
692*593dc095SDavid du Colombier * The JPEG standard requires Huffman codes to be no more than 16 bits long.
693*593dc095SDavid du Colombier * If some symbols have a very small but nonzero probability, the Huffman tree
694*593dc095SDavid du Colombier * must be adjusted to meet the code length restriction. We currently use
695*593dc095SDavid du Colombier * the adjustment method suggested in JPEG section K.2. This method is *not*
696*593dc095SDavid du Colombier * optimal; it may not choose the best possible limited-length code. But
697*593dc095SDavid du Colombier * typically only very-low-frequency symbols will be given less-than-optimal
698*593dc095SDavid du Colombier * lengths, so the code is almost optimal. Experimental comparisons against
699*593dc095SDavid du Colombier * an optimal limited-length-code algorithm indicate that the difference is
700*593dc095SDavid du Colombier * microscopic --- usually less than a hundredth of a percent of total size.
701*593dc095SDavid du Colombier * So the extra complexity of an optimal algorithm doesn't seem worthwhile.
7027dd7cddfSDavid du Colombier */
7037dd7cddfSDavid du Colombier
7047dd7cddfSDavid du Colombier GLOBAL(void)
jpeg_gen_optimal_table(j_compress_ptr cinfo,JHUFF_TBL * htbl,long freq[])7057dd7cddfSDavid du Colombier jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
7067dd7cddfSDavid du Colombier {
7077dd7cddfSDavid du Colombier #define MAX_CLEN 32 /* assumed maximum initial code length */
7087dd7cddfSDavid du Colombier UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */
7097dd7cddfSDavid du Colombier int codesize[257]; /* codesize[k] = code length of symbol k */
7107dd7cddfSDavid du Colombier int others[257]; /* next symbol in current branch of tree */
7117dd7cddfSDavid du Colombier int c1, c2;
7127dd7cddfSDavid du Colombier int p, i, j;
7137dd7cddfSDavid du Colombier long v;
7147dd7cddfSDavid du Colombier
7157dd7cddfSDavid du Colombier /* This algorithm is explained in section K.2 of the JPEG standard */
7167dd7cddfSDavid du Colombier
7177dd7cddfSDavid du Colombier MEMZERO(bits, SIZEOF(bits));
7187dd7cddfSDavid du Colombier MEMZERO(codesize, SIZEOF(codesize));
7197dd7cddfSDavid du Colombier for (i = 0; i < 257; i++)
7207dd7cddfSDavid du Colombier others[i] = -1; /* init links to empty */
7217dd7cddfSDavid du Colombier
722*593dc095SDavid du Colombier freq[256] = 1; /* make sure 256 has a nonzero count */
7237dd7cddfSDavid du Colombier /* Including the pseudo-symbol 256 in the Huffman procedure guarantees
7247dd7cddfSDavid du Colombier * that no real symbol is given code-value of all ones, because 256
725*593dc095SDavid du Colombier * will be placed last in the largest codeword category.
7267dd7cddfSDavid du Colombier */
7277dd7cddfSDavid du Colombier
7287dd7cddfSDavid du Colombier /* Huffman's basic algorithm to assign optimal code lengths to symbols */
7297dd7cddfSDavid du Colombier
7307dd7cddfSDavid du Colombier for (;;) {
7317dd7cddfSDavid du Colombier /* Find the smallest nonzero frequency, set c1 = its symbol */
7327dd7cddfSDavid du Colombier /* In case of ties, take the larger symbol number */
7337dd7cddfSDavid du Colombier c1 = -1;
7347dd7cddfSDavid du Colombier v = 1000000000L;
7357dd7cddfSDavid du Colombier for (i = 0; i <= 256; i++) {
7367dd7cddfSDavid du Colombier if (freq[i] && freq[i] <= v) {
7377dd7cddfSDavid du Colombier v = freq[i];
7387dd7cddfSDavid du Colombier c1 = i;
7397dd7cddfSDavid du Colombier }
7407dd7cddfSDavid du Colombier }
7417dd7cddfSDavid du Colombier
7427dd7cddfSDavid du Colombier /* Find the next smallest nonzero frequency, set c2 = its symbol */
7437dd7cddfSDavid du Colombier /* In case of ties, take the larger symbol number */
7447dd7cddfSDavid du Colombier c2 = -1;
7457dd7cddfSDavid du Colombier v = 1000000000L;
7467dd7cddfSDavid du Colombier for (i = 0; i <= 256; i++) {
7477dd7cddfSDavid du Colombier if (freq[i] && freq[i] <= v && i != c1) {
7487dd7cddfSDavid du Colombier v = freq[i];
7497dd7cddfSDavid du Colombier c2 = i;
7507dd7cddfSDavid du Colombier }
7517dd7cddfSDavid du Colombier }
7527dd7cddfSDavid du Colombier
7537dd7cddfSDavid du Colombier /* Done if we've merged everything into one frequency */
7547dd7cddfSDavid du Colombier if (c2 < 0)
7557dd7cddfSDavid du Colombier break;
7567dd7cddfSDavid du Colombier
7577dd7cddfSDavid du Colombier /* Else merge the two counts/trees */
7587dd7cddfSDavid du Colombier freq[c1] += freq[c2];
7597dd7cddfSDavid du Colombier freq[c2] = 0;
7607dd7cddfSDavid du Colombier
7617dd7cddfSDavid du Colombier /* Increment the codesize of everything in c1's tree branch */
7627dd7cddfSDavid du Colombier codesize[c1]++;
7637dd7cddfSDavid du Colombier while (others[c1] >= 0) {
7647dd7cddfSDavid du Colombier c1 = others[c1];
7657dd7cddfSDavid du Colombier codesize[c1]++;
7667dd7cddfSDavid du Colombier }
7677dd7cddfSDavid du Colombier
7687dd7cddfSDavid du Colombier others[c1] = c2; /* chain c2 onto c1's tree branch */
7697dd7cddfSDavid du Colombier
7707dd7cddfSDavid du Colombier /* Increment the codesize of everything in c2's tree branch */
7717dd7cddfSDavid du Colombier codesize[c2]++;
7727dd7cddfSDavid du Colombier while (others[c2] >= 0) {
7737dd7cddfSDavid du Colombier c2 = others[c2];
7747dd7cddfSDavid du Colombier codesize[c2]++;
7757dd7cddfSDavid du Colombier }
7767dd7cddfSDavid du Colombier }
7777dd7cddfSDavid du Colombier
7787dd7cddfSDavid du Colombier /* Now count the number of symbols of each code length */
7797dd7cddfSDavid du Colombier for (i = 0; i <= 256; i++) {
7807dd7cddfSDavid du Colombier if (codesize[i]) {
7817dd7cddfSDavid du Colombier /* The JPEG standard seems to think that this can't happen, */
7827dd7cddfSDavid du Colombier /* but I'm paranoid... */
7837dd7cddfSDavid du Colombier if (codesize[i] > MAX_CLEN)
7847dd7cddfSDavid du Colombier ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);
7857dd7cddfSDavid du Colombier
7867dd7cddfSDavid du Colombier bits[codesize[i]]++;
7877dd7cddfSDavid du Colombier }
7887dd7cddfSDavid du Colombier }
7897dd7cddfSDavid du Colombier
7907dd7cddfSDavid du Colombier /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
7917dd7cddfSDavid du Colombier * Huffman procedure assigned any such lengths, we must adjust the coding.
7927dd7cddfSDavid du Colombier * Here is what the JPEG spec says about how this next bit works:
7937dd7cddfSDavid du Colombier * Since symbols are paired for the longest Huffman code, the symbols are
7947dd7cddfSDavid du Colombier * removed from this length category two at a time. The prefix for the pair
7957dd7cddfSDavid du Colombier * (which is one bit shorter) is allocated to one of the pair; then,
7967dd7cddfSDavid du Colombier * skipping the BITS entry for that prefix length, a code word from the next
7977dd7cddfSDavid du Colombier * shortest nonzero BITS entry is converted into a prefix for two code words
7987dd7cddfSDavid du Colombier * one bit longer.
7997dd7cddfSDavid du Colombier */
8007dd7cddfSDavid du Colombier
8017dd7cddfSDavid du Colombier for (i = MAX_CLEN; i > 16; i--) {
8027dd7cddfSDavid du Colombier while (bits[i] > 0) {
8037dd7cddfSDavid du Colombier j = i - 2; /* find length of new prefix to be used */
8047dd7cddfSDavid du Colombier while (bits[j] == 0)
8057dd7cddfSDavid du Colombier j--;
8067dd7cddfSDavid du Colombier
8077dd7cddfSDavid du Colombier bits[i] -= 2; /* remove two symbols */
8087dd7cddfSDavid du Colombier bits[i-1]++; /* one goes in this length */
8097dd7cddfSDavid du Colombier bits[j+1] += 2; /* two new symbols in this length */
8107dd7cddfSDavid du Colombier bits[j]--; /* symbol of this length is now a prefix */
8117dd7cddfSDavid du Colombier }
8127dd7cddfSDavid du Colombier }
8137dd7cddfSDavid du Colombier
8147dd7cddfSDavid du Colombier /* Remove the count for the pseudo-symbol 256 from the largest codelength */
8157dd7cddfSDavid du Colombier while (bits[i] == 0) /* find largest codelength still in use */
8167dd7cddfSDavid du Colombier i--;
8177dd7cddfSDavid du Colombier bits[i]--;
8187dd7cddfSDavid du Colombier
8197dd7cddfSDavid du Colombier /* Return final symbol counts (only for lengths 0..16) */
8207dd7cddfSDavid du Colombier MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
8217dd7cddfSDavid du Colombier
8227dd7cddfSDavid du Colombier /* Return a list of the symbols sorted by code length */
8237dd7cddfSDavid du Colombier /* It's not real clear to me why we don't need to consider the codelength
8247dd7cddfSDavid du Colombier * changes made above, but the JPEG spec seems to think this works.
8257dd7cddfSDavid du Colombier */
8267dd7cddfSDavid du Colombier p = 0;
8277dd7cddfSDavid du Colombier for (i = 1; i <= MAX_CLEN; i++) {
8287dd7cddfSDavid du Colombier for (j = 0; j <= 255; j++) {
8297dd7cddfSDavid du Colombier if (codesize[j] == i) {
8307dd7cddfSDavid du Colombier htbl->huffval[p] = (UINT8) j;
8317dd7cddfSDavid du Colombier p++;
8327dd7cddfSDavid du Colombier }
8337dd7cddfSDavid du Colombier }
8347dd7cddfSDavid du Colombier }
8357dd7cddfSDavid du Colombier
8367dd7cddfSDavid du Colombier /* Set sent_table FALSE so updated table will be written to JPEG file. */
8377dd7cddfSDavid du Colombier htbl->sent_table = FALSE;
8387dd7cddfSDavid du Colombier }
8397dd7cddfSDavid du Colombier
8407dd7cddfSDavid du Colombier
8417dd7cddfSDavid du Colombier /*
8427dd7cddfSDavid du Colombier * Finish up a statistics-gathering pass and create the new Huffman tables.
8437dd7cddfSDavid du Colombier */
8447dd7cddfSDavid du Colombier
8457dd7cddfSDavid du Colombier METHODDEF(void)
finish_pass_gather(j_compress_ptr cinfo)8467dd7cddfSDavid du Colombier finish_pass_gather (j_compress_ptr cinfo)
8477dd7cddfSDavid du Colombier {
8487dd7cddfSDavid du Colombier huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
8497dd7cddfSDavid du Colombier int ci, dctbl, actbl;
8507dd7cddfSDavid du Colombier jpeg_component_info * compptr;
8517dd7cddfSDavid du Colombier JHUFF_TBL **htblptr;
8527dd7cddfSDavid du Colombier boolean did_dc[NUM_HUFF_TBLS];
8537dd7cddfSDavid du Colombier boolean did_ac[NUM_HUFF_TBLS];
8547dd7cddfSDavid du Colombier
8557dd7cddfSDavid du Colombier /* It's important not to apply jpeg_gen_optimal_table more than once
8567dd7cddfSDavid du Colombier * per table, because it clobbers the input frequency counts!
8577dd7cddfSDavid du Colombier */
8587dd7cddfSDavid du Colombier MEMZERO(did_dc, SIZEOF(did_dc));
8597dd7cddfSDavid du Colombier MEMZERO(did_ac, SIZEOF(did_ac));
8607dd7cddfSDavid du Colombier
8617dd7cddfSDavid du Colombier for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
8627dd7cddfSDavid du Colombier compptr = cinfo->cur_comp_info[ci];
8637dd7cddfSDavid du Colombier dctbl = compptr->dc_tbl_no;
8647dd7cddfSDavid du Colombier actbl = compptr->ac_tbl_no;
8657dd7cddfSDavid du Colombier if (! did_dc[dctbl]) {
8667dd7cddfSDavid du Colombier htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl];
8677dd7cddfSDavid du Colombier if (*htblptr == NULL)
8687dd7cddfSDavid du Colombier *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
8697dd7cddfSDavid du Colombier jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]);
8707dd7cddfSDavid du Colombier did_dc[dctbl] = TRUE;
8717dd7cddfSDavid du Colombier }
8727dd7cddfSDavid du Colombier if (! did_ac[actbl]) {
8737dd7cddfSDavid du Colombier htblptr = & cinfo->ac_huff_tbl_ptrs[actbl];
8747dd7cddfSDavid du Colombier if (*htblptr == NULL)
8757dd7cddfSDavid du Colombier *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
8767dd7cddfSDavid du Colombier jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]);
8777dd7cddfSDavid du Colombier did_ac[actbl] = TRUE;
8787dd7cddfSDavid du Colombier }
8797dd7cddfSDavid du Colombier }
8807dd7cddfSDavid du Colombier }
8817dd7cddfSDavid du Colombier
8827dd7cddfSDavid du Colombier
8837dd7cddfSDavid du Colombier #endif /* ENTROPY_OPT_SUPPORTED */
8847dd7cddfSDavid du Colombier
8857dd7cddfSDavid du Colombier
8867dd7cddfSDavid du Colombier /*
8877dd7cddfSDavid du Colombier * Module initialization routine for Huffman entropy encoding.
8887dd7cddfSDavid du Colombier */
8897dd7cddfSDavid du Colombier
8907dd7cddfSDavid du Colombier GLOBAL(void)
jinit_huff_encoder(j_compress_ptr cinfo)8917dd7cddfSDavid du Colombier jinit_huff_encoder (j_compress_ptr cinfo)
8927dd7cddfSDavid du Colombier {
8937dd7cddfSDavid du Colombier huff_entropy_ptr entropy;
8947dd7cddfSDavid du Colombier int i;
8957dd7cddfSDavid du Colombier
8967dd7cddfSDavid du Colombier entropy = (huff_entropy_ptr)
8977dd7cddfSDavid du Colombier (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
8987dd7cddfSDavid du Colombier SIZEOF(huff_entropy_encoder));
8997dd7cddfSDavid du Colombier cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
9007dd7cddfSDavid du Colombier entropy->pub.start_pass = start_pass_huff;
9017dd7cddfSDavid du Colombier
9027dd7cddfSDavid du Colombier /* Mark tables unallocated */
9037dd7cddfSDavid du Colombier for (i = 0; i < NUM_HUFF_TBLS; i++) {
9047dd7cddfSDavid du Colombier entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
9057dd7cddfSDavid du Colombier #ifdef ENTROPY_OPT_SUPPORTED
9067dd7cddfSDavid du Colombier entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;
9077dd7cddfSDavid du Colombier #endif
9087dd7cddfSDavid du Colombier }
9097dd7cddfSDavid du Colombier }
910