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

📄 jchuff.c

📁 这是一个JPEG编码源代码
💻 C
字号:
#include "jinclude.h"

/* huffman encode OUTPUT
 */
union buffer_tag {
  UINT32 all;
  UINT8 c[4];
};
static union buffer_tag buffer;
static int bits_in_buffer;

int bit_num(int a) 
{
  int bit = 0;
  if (a==0)
    return 0;
  a = a>0 ? a : -a;
  while((1<<bit)<=a)
    bit++;
  return bit;
}

void 
jhuff_write_bits (jpeg_compress_info *cinfo, UINT32 data, int len) 
{
  #ifdef DEBUG
    printf("(b:%d;%d/%d)", bits_in_buffer, data, len);
  #endif
  UINT32 tdata;
  
  while (len>0) {
    tdata = (data<<(32-len));
    buffer.all |= ((tdata >> bits_in_buffer));
    bits_in_buffer += len;
    /* output buffer */
    if (bits_in_buffer >= 32) { 
      int i;
      /* must be BIG ENDIAN */
      for (i=3; i>=0; i--) {
        jutl_write_byte(buffer.c[i], cinfo->output);
        if (buffer.c[i]==0xFF)
          jutl_write_byte(0x00, cinfo->output);
      }
      buffer.all = 0;
      len = bits_in_buffer - 32;
      bits_in_buffer=0;
    }else{
      len=0;
    }
  }
  #ifdef DEBUG
    printf("..buffer..%08X\n", buffer.all);  
  #endif
}

void 
jhuff_flush_buffer(jpeg_compress_info *cinfo) 
{
  int i;
  i = 3;
 
  while (bits_in_buffer > 8) {
    jutl_write_byte(buffer.c[i], cinfo->output);
    if (buffer.c[i]==0xFF)
      jutl_write_byte(0x00, cinfo->output);
    i--;
    bits_in_buffer -= 8;
  }
  if(bits_in_buffer > 0) {
    buffer.c[i] |= ((unsigned char)(0xFF) >> bits_in_buffer);
    jutl_write_byte(buffer.c[i], cinfo->output);
    if (buffer.c[i]==0xFF) 
      jutl_write_byte(0x00, cinfo->output);
  }
  buffer.all = 0;
  bits_in_buffer = 0;
}

/* huffman encode 
 */
void 
jhuff_encode_one_block (jpeg_compress_info *cinfo, DCTBLOCK src, 
                       JHUFF_TBL *dc_tbl, JHUFF_TBL *ac_tbl ) 
{
  int diff, ssss, rrrr, code;
  int rs, k;
  
  /* encode DC */
  diff = src[0];
  ssss = bit_num(diff);
  
  jhuff_write_bits(cinfo, dc_tbl->ecode[ssss], dc_tbl->esize[ssss]);
  if (diff<0) {
    diff -= 1;
  }
  jhuff_write_bits(cinfo, diff, ssss);
  
  /* encode AC */
  rrrr = 0;
  for (k=1; k<DCTSIZE2; k++) {
    if (src[k]==0) {
      rrrr++;
      continue;
    }else{
      while(rrrr>15) {
        /* write EHUFSI(0xF0) bits of EHUFCO(0xF0) */
        #ifdef DEBUG
          show_msg(" <AC:15,0\n");
        #endif
        jhuff_write_bits(cinfo, ac_tbl->ecode[0xF0], ac_tbl->esize[0xF0]);
        rrrr-=16;
      }
      ssss = bit_num(src[k]);
      rs = ((rrrr<<4) | ssss);
      
      /* write EHUFSI(rs) bits of EHUFCO(rs) */
      jhuff_write_bits(cinfo, ac_tbl->ecode[rs], ac_tbl->esize[rs]);
      code = src[k];
      if (code < 0) 
        code -= 1;
      /* write ssss bits of rs */
      jhuff_write_bits(cinfo, code, ssss);
      rrrr=0;
    }
  }
  if (rrrr!=0) {
    /* write EOB */
   
    jhuff_write_bits(cinfo, ac_tbl->ecode[0x00], ac_tbl->esize[0x00]);
  }
}


⌨️ 快捷键说明

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