⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jchuff.c

📁 Linux下的基于X11的图形开发环境。
💻 C
📖 第 1 页 / 共 2 页
字号:
    return FALSE;  emit_byte(state, 0xFF, return FALSE);  emit_byte(state, JPEG_RST0 + restart_num, return FALSE);  /* Re-initialize DC predictions to 0 */  for (ci = 0; ci < state->cinfo->comps_in_scan; ci++)    state->cur.last_dc_val[ci] = 0;  /* The restart counter is not updated until we successfully write the MCU. */  return TRUE;}/* * Encode and output one MCU's worth of Huffman-compressed coefficients. */METHODDEF(boolean)encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data){  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;  working_state state;  int blkn, ci;  jpeg_component_info * compptr;  /* Load up working state */  state.next_output_byte = cinfo->dest->next_output_byte;  state.free_in_buffer = cinfo->dest->free_in_buffer;  ASSIGN_STATE(state.cur, entropy->saved);  state.cinfo = cinfo;  /* Emit restart marker if needed */  if (cinfo->restart_interval) {    if (entropy->restarts_to_go == 0)      if (! emit_restart(&state, entropy->next_restart_num))	return FALSE;  }  /* Encode the MCU data blocks */  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {    ci = cinfo->MCU_membership[blkn];    compptr = cinfo->cur_comp_info[ci];    if (! encode_one_block(&state,			   MCU_data[blkn][0], state.cur.last_dc_val[ci],			   entropy->dc_derived_tbls[compptr->dc_tbl_no],			   entropy->ac_derived_tbls[compptr->ac_tbl_no]))      return FALSE;    /* Update last_dc_val */    state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];  }  /* Completed MCU, so update state */  cinfo->dest->next_output_byte = state.next_output_byte;  cinfo->dest->free_in_buffer = state.free_in_buffer;  ASSIGN_STATE(entropy->saved, state.cur);  /* Update restart-interval state too */  if (cinfo->restart_interval) {    if (entropy->restarts_to_go == 0) {      entropy->restarts_to_go = cinfo->restart_interval;      entropy->next_restart_num++;      entropy->next_restart_num &= 7;    }    entropy->restarts_to_go--;  }  return TRUE;}/* * Finish up at the end of a Huffman-compressed scan. */METHODDEF(void)finish_pass_huff (j_compress_ptr cinfo){  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;  working_state state;  /* Load up working state ... flush_bits needs it */  state.next_output_byte = cinfo->dest->next_output_byte;  state.free_in_buffer = cinfo->dest->free_in_buffer;  ASSIGN_STATE(state.cur, entropy->saved);  state.cinfo = cinfo;  /* Flush out the last data */  if (! flush_bits(&state))    ERREXIT(cinfo, JERR_CANT_SUSPEND);  /* Update state */  cinfo->dest->next_output_byte = state.next_output_byte;  cinfo->dest->free_in_buffer = state.free_in_buffer;  ASSIGN_STATE(entropy->saved, state.cur);}/* * Huffman coding optimization. * * We first scan the supplied data and count the number of uses of each symbol * that is to be Huffman-coded. (This process MUST agree with the code above.) * Then we build a Huffman coding tree for the observed counts. * Symbols which are not needed at all for the particular image are not * assigned any code, which saves space in the DHT marker as well as in * the compressed data. */#ifdef ENTROPY_OPT_SUPPORTED/* Process a single block's worth of coefficients */LOCAL(void)htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,		 long dc_counts[], long ac_counts[]){  register int temp;  register int nbits;  register int k, r;    /* Encode the DC coefficient difference per section F.1.2.1 */    temp = block[0] - last_dc_val;  if (temp < 0)    temp = -temp;    /* Find the number of bits needed for the magnitude of the coefficient */  nbits = 0;  while (temp) {    nbits++;    temp >>= 1;  }  /* Check for out-of-range coefficient values.   * Since we're encoding a difference, the range limit is twice as much.   */  if (nbits > MAX_COEF_BITS+1)    ERREXIT(cinfo, JERR_BAD_DCT_COEF);  /* Count the Huffman symbol for the number of bits */  dc_counts[nbits]++;    /* Encode the AC coefficients per section F.1.2.2 */    r = 0;			/* r = run length of zeros */    for (k = 1; k < DCTSIZE2; k++) {    if ((temp = block[jpeg_natural_order[k]]) == 0) {      r++;    } else {      /* if run length > 15, must emit special run-length-16 codes (0xF0) */      while (r > 15) {	ac_counts[0xF0]++;	r -= 16;      }            /* Find the number of bits needed for the magnitude of the coefficient */      if (temp < 0)	temp = -temp;            /* Find the number of bits needed for the magnitude of the coefficient */      nbits = 1;		/* there must be at least one 1 bit */      while ((temp >>= 1))	nbits++;      /* Check for out-of-range coefficient values */      if (nbits > MAX_COEF_BITS)	ERREXIT(cinfo, JERR_BAD_DCT_COEF);            /* Count Huffman symbol for run length / number of bits */      ac_counts[(r << 4) + nbits]++;            r = 0;    }  }  /* If the last coef(s) were zero, emit an end-of-block code */  if (r > 0)    ac_counts[0]++;}/* * Trial-encode one MCU's worth of Huffman-compressed coefficients. * No data is actually output, so no suspension return is possible. */METHODDEF(boolean)encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data){  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;  int blkn, ci;  jpeg_component_info * compptr;  /* Take care of restart intervals if needed */  if (cinfo->restart_interval) {    if (entropy->restarts_to_go == 0) {      /* Re-initialize DC predictions to 0 */      for (ci = 0; ci < cinfo->comps_in_scan; ci++)	entropy->saved.last_dc_val[ci] = 0;      /* Update restart state */      entropy->restarts_to_go = cinfo->restart_interval;    }    entropy->restarts_to_go--;  }  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {    ci = cinfo->MCU_membership[blkn];    compptr = cinfo->cur_comp_info[ci];    htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci],		    entropy->dc_count_ptrs[compptr->dc_tbl_no],		    entropy->ac_count_ptrs[compptr->ac_tbl_no]);    entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0];  }  return TRUE;}/* * Generate the best Huffman code table for the given counts, fill htbl. * Note this is also used by jcphuff.c. * * The JPEG standard requires that no symbol be assigned a codeword of all * one bits (so that padding bits added at the end of a compressed segment * can't look like a valid code).  Because of the canonical ordering of * codewords, this just means that there must be an unused slot in the * longest codeword length category.  Section K.2 of the JPEG spec suggests * reserving such a slot by pretending that symbol 256 is a valid symbol * with count 1.  In theory that's not optimal; giving it count zero but * including it in the symbol set anyway should give a better Huffman code. * But the theoretically better code actually seems to come out worse in * practice, because it produces more all-ones bytes (which incur stuffed * zero bytes in the final file).  In any case the difference is tiny. * * The JPEG standard requires Huffman codes to be no more than 16 bits long. * If some symbols have a very small but nonzero probability, the Huffman tree * must be adjusted to meet the code length restriction.  We currently use * the adjustment method suggested in JPEG section K.2.  This method is *not* * optimal; it may not choose the best possible limited-length code.  But * typically only very-low-frequency symbols will be given less-than-optimal * lengths, so the code is almost optimal.  Experimental comparisons against * an optimal limited-length-code algorithm indicate that the difference is * microscopic --- usually less than a hundredth of a percent of total size. * So the extra complexity of an optimal algorithm doesn't seem worthwhile. */GLOBAL(void)jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]){#define MAX_CLEN 32		/* assumed maximum initial code length */  UINT8 bits[MAX_CLEN+1];	/* bits[k] = # of symbols with code length k */  int codesize[257];		/* codesize[k] = code length of symbol k */  int others[257];		/* next symbol in current branch of tree */  int c1, c2;  int p, i, j;  long v;  /* This algorithm is explained in section K.2 of the JPEG standard */  MEMZERO(bits, SIZEOF(bits));  MEMZERO(codesize, SIZEOF(codesize));  for (i = 0; i < 257; i++)    others[i] = -1;		/* init links to empty */    freq[256] = 1;		/* make sure 256 has a nonzero count */  /* Including the pseudo-symbol 256 in the Huffman procedure guarantees   * that no real symbol is given code-value of all ones, because 256   * will be placed last in the largest codeword category.   */  /* Huffman's basic algorithm to assign optimal code lengths to symbols */  for (;;) {    /* Find the smallest nonzero frequency, set c1 = its symbol */    /* In case of ties, take the larger symbol number */    c1 = -1;    v = 1000000000L;    for (i = 0; i <= 256; i++) {      if (freq[i] && freq[i] <= v) {	v = freq[i];	c1 = i;      }    }    /* Find the next smallest nonzero frequency, set c2 = its symbol */    /* In case of ties, take the larger symbol number */    c2 = -1;    v = 1000000000L;    for (i = 0; i <= 256; i++) {      if (freq[i] && freq[i] <= v && i != c1) {	v = freq[i];	c2 = i;      }    }    /* Done if we've merged everything into one frequency */    if (c2 < 0)      break;        /* Else merge the two counts/trees */    freq[c1] += freq[c2];    freq[c2] = 0;    /* Increment the codesize of everything in c1's tree branch */    codesize[c1]++;    while (others[c1] >= 0) {      c1 = others[c1];      codesize[c1]++;    }        others[c1] = c2;		/* chain c2 onto c1's tree branch */        /* Increment the codesize of everything in c2's tree branch */    codesize[c2]++;    while (others[c2] >= 0) {      c2 = others[c2];      codesize[c2]++;    }  }  /* Now count the number of symbols of each code length */  for (i = 0; i <= 256; i++) {    if (codesize[i]) {      /* The JPEG standard seems to think that this can't happen, */      /* but I'm paranoid... */      if (codesize[i] > MAX_CLEN)	ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);      bits[codesize[i]]++;    }  }  /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure   * Huffman procedure assigned any such lengths, we must adjust the coding.   * Here is what the JPEG spec says about how this next bit works:   * Since symbols are paired for the longest Huffman code, the symbols are   * removed from this length category two at a time.  The prefix for the pair   * (which is one bit shorter) is allocated to one of the pair; then,   * skipping the BITS entry for that prefix length, a code word from the next   * shortest nonzero BITS entry is converted into a prefix for two code words   * one bit longer.   */    for (i = MAX_CLEN; i > 16; i--) {    while (bits[i] > 0) {      j = i - 2;		/* find length of new prefix to be used */      while (bits[j] == 0)	j--;            bits[i] -= 2;		/* remove two symbols */      bits[i-1]++;		/* one goes in this length */      bits[j+1] += 2;		/* two new symbols in this length */      bits[j]--;		/* symbol of this length is now a prefix */    }  }  /* Remove the count for the pseudo-symbol 256 from the largest codelength */  while (bits[i] == 0)		/* find largest codelength still in use */    i--;  bits[i]--;    /* Return final symbol counts (only for lengths 0..16) */  MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));    /* Return a list of the symbols sorted by code length */  /* It's not real clear to me why we don't need to consider the codelength   * changes made above, but the JPEG spec seems to think this works.   */  p = 0;  for (i = 1; i <= MAX_CLEN; i++) {    for (j = 0; j <= 255; j++) {      if (codesize[j] == i) {	htbl->huffval[p] = (UINT8) j;	p++;      }    }  }  /* Set sent_table FALSE so updated table will be written to JPEG file. */  htbl->sent_table = FALSE;}/* * Finish up a statistics-gathering pass and create the new Huffman tables. */METHODDEF(void)finish_pass_gather (j_compress_ptr cinfo){  huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;  int ci, dctbl, actbl;  jpeg_component_info * compptr;  JHUFF_TBL **htblptr;  boolean did_dc[NUM_HUFF_TBLS];  boolean did_ac[NUM_HUFF_TBLS];  /* It's important not to apply jpeg_gen_optimal_table more than once   * per table, because it clobbers the input frequency counts!   */  MEMZERO(did_dc, SIZEOF(did_dc));  MEMZERO(did_ac, SIZEOF(did_ac));  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {    compptr = cinfo->cur_comp_info[ci];    dctbl = compptr->dc_tbl_no;    actbl = compptr->ac_tbl_no;    if (! did_dc[dctbl]) {      htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl];      if (*htblptr == NULL)	*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]);      did_dc[dctbl] = TRUE;    }    if (! did_ac[actbl]) {      htblptr = & cinfo->ac_huff_tbl_ptrs[actbl];      if (*htblptr == NULL)	*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);      jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]);      did_ac[actbl] = TRUE;    }  }}#endif /* ENTROPY_OPT_SUPPORTED *//* * Module initialization routine for Huffman entropy encoding. */GLOBAL(void)jinit_huff_encoder (j_compress_ptr cinfo){  huff_entropy_ptr entropy;  int i;  entropy = (huff_entropy_ptr)    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,				SIZEOF(huff_entropy_encoder));  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;  entropy->pub.start_pass = start_pass_huff;  /* Mark tables unallocated */  for (i = 0; i < NUM_HUFF_TBLS; i++) {    entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;#ifdef ENTROPY_OPT_SUPPORTED    entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;#endif  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -