xref: /plan9/sys/src/cmd/gs/jpeg/jchuff.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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