?? ac_de.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 + -