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

📄 ac_de.h

📁 C:新建文件夹ch4熵编码.rar是JGP文件编码的基础
💻 H
字号:
/////////////////////////////////////////////
//
//    AC_De.h
//    文件内容:算术解码
//    
//    作    者:丁贵广
//    制作日期:2003.7.26
//    西安电子科技大学 AI Lab    
//
/////////////////////////////////////////////
# include "stdlib.h"
# include "stdio.h"
# include "math.h"

long unpack1(short,short *,short);
void bytein();

void Init_AC_QM_Decoder(void)
{  short i;

  a_register=0x8000;
  c_register=0;
  ct=12;
  bp=0;
  sc=0;
  
	fread(&b0,sizeof(char),1,fp_in);
	sc=1;
	c_register=b0<<16;
	bytein();
	c_register<<=7;
	ct-=7;
	a_register=0x8000;
	for(i=0;i<20;i++){
		index[i]=0;
		mps[i]=0;
		if(i==0)  index[i]=4;
		if(i==17) index[i]=3;
		if((i==18)||(i==19)) index[i]=46;
	 }
}
long unpack1(
	 short bit_num,
	 short *bit_value,
	 short con)
{
 unsigned short i,d;
  unsigned long chigh;

	*bit_value=0;
	for(i=0;i<bit_num;i++) {

	  chigh=c_register>>16;
	  a_register-=qe_value[index[con]];

	  if(chigh<qe_value[index[con]]){

			if(a_register<qe_value[index[con]]){
				a_register=qe_value[index[con]];
				d=mps[con];
				index[con]=nmps[index[con]];
			 }
			else {
				a_register=qe_value[index[con]];
				d=1-mps[con];
				if(flag[index[con]]==1)  mps[con]=1-mps[con];
				index[con]=nlps[index[con]];
			 }

			do{
				if(ct==0){
					bytein();
					if(sc>=BytesLimit) return -1;
				 }
				a_register<<=1;
				c_register<<=1;
				ct--;
			}while((a_register&0x8000)==0);
		}

	  else{
		 chigh-=qe_value[index[con]];
		 c_register&=0xffff;
		 c_register+=chigh<<16;

		 if((a_register&0x8000)==0){

			  if(a_register<qe_value[index[con]]){
				  d=1-mps[con];
				  if(flag[index[con]]==1) mps[con]=1-mps[con];
				  index[con]=nlps[index[con]];
				}
			  else {
				  d=mps[con];
				  index[con]=nmps[index[con]];
				}

			  do{
				  if(ct==0){
					  bytein();
					  if(sc>=BytesLimit) return -1;
					}
				  a_register<<=1;
				  c_register<<=1;
				  ct--;
			  }while((a_register&0x8000)==0);
		}
	  else d=mps[con];
	 }
	*bit_value+=(short)(d<<i);

 }
 return 0;
}  

void bytein(void)
{
  fread(&b1,sizeof(char),1,fp_in);
  sc++;
  if(b0==0xff){
	  if(b1>0x8f) {
		  c_register+=0xff00;
		  ct=8;
		}
	  else{
		  bp++;
		  c_register+=b1<<9;
		  ct=7;
	  }
	}
  else{
	  bp++;
	  c_register+=b1<<8;
	  ct=8;
	}
  b0=b1;
}
short Decodepass(
  BYTE *image,
  short n,
  short x_size,
  short y_size)
{
	int Bit,i,j;
	short Sn;
	Bit=1<<n;
  for (i=0;i<x_size;i++)
	 for(j=0;j<y_size;j++)
	 {
		 if(unpack1(1,&Sn,0)==-1) return -1;
		 if(Sn)
			 image[i*x_size+j]|=Bit;
	 }
	return 0;
}
short Decoding_Pass(
	 BYTE *image,
	 short x_size,
	 short y_size)
{
	  short n;
	  
	  if(unpack1(4,&n,0)==-1) return -1;

	  while(n>=0) {
		  if(Decodepass(image,n,x_size,y_size)==-1) return -1;
		   n--;
	  }

	 return 0;
}
BYTE *AC_decode(
	  short x_size,
	  short y_size)
{
	  BYTE *image;
	  short i,j,mark;
	  BytesLimit=(long)(x_size*y_size);              // lossless.
	  image=(BYTE *)new BYTE [x_size*y_size];
	  Init_AC_QM_Decoder();
	  for(i=0;i<x_size;++i)
		for(j=0;j<y_size;++j)
			image[i*x_size+j]=0;
	  mark=Decoding_Pass(image,x_size,y_size);
	  if(mark==-1) goto END;
END:
	  for(i=0;i<y_size;i++)
	{
		fwrite(&image[i*x_size],sizeof(unsigned char),y_size,fp_out);
	}
	fclose(fp_out);
	fclose(fp_in);
    return image;
}

⌨️ 快捷键说明

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