source: trunk/third/firefox/jpeg/jcphuff.c @ 21695

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