📄 ispwky.h
字号:
//“星载大压缩比数据压缩技术”压缩编解码核心算法
// 预扫描无链表零树编码 designed by 陈军 2000-5-15
//2000-6-29修改,完成左遍历扫描
// 解码部分
//2000-7-18 跳转控制,比特译码
char state,bitin; //state 为0表示象素编码,为1表示集合编码
short row,col,off/*=0*/,nFc,nFd,nFl;
char *Fc2,*Fd2,*Fl2,*Fsign,*B,*BB;
char *oldFc,*oldFd,*oldFl,*newFc,*newFd,*newFl;
char Fc1[WV_IMGSIZE0];
char Fd1[WV_IMGSIZE0];
char Fs[WV_IMGSIZE0];
char Fl1[WV_IMGSIZE0];
char Fl_ext(int i, int j) //节点L集合是否存在
{
if(i>=height/4 || j>=width/4) return 0;
else return 1;
}
int p(short i,short j) //父节点坐标
{
//(i,j)为非根节点的子节点
if(i>=2*unitlen_y || j>=2*unitlen_x ) return (i/2)*width+(j/2);
//(i,j)为根节点的HH子带的子节点
else if(i>=unitlen_y && j>=unitlen_x) return (i-unitlen_y)*width+j-unitlen_x;
//(i,j)为根节点的LH子带的子节点
else if(i>=unitlen_y && j<unitlen_x) return (i-unitlen_y)*width+j;
//(i,j)为根节点的HL子带的子节点
else if(i<unitlen_y && j>=unitlen_x) return i*width+j-unitlen_x;
else
{
return 0;
}
}
#define jump()\
{\
if(nFd==1 || oldFd[row*width+col]==1) oldFd[row*width+col]=1;\
if(nFl==1 || oldFl[row*width+col]==1) oldFl[row*width+col]=1;\
if(nFc==1 || oldFc[row*width+col]==1) oldFc[row*width+col]=1;\
if(oldFd[row*width+col] == 1){\
if(row<unitlen_y && col<unitlen_x)\
row+=unitlen_y;\
else{\
row <<= 1;\
col <<= 1;\
}\
}\
else\
{\
if(row<unitlen_y && col<unitlen_x )\
{\
off++;\
if(off == unitlen_x0*unitlen_y0)\
{\
thres >>= 1;\
off = 0;\
}\
data = coef+off*imgsize;\
Fsign = Fs+off*imgsize;\
oldFc = Fc1+off*imgsize;\
oldFd = Fd1+off*imgsize;\
oldFl = Fl1+off*imgsize;\
row = 0;\
col = 0;\
}\
else\
{\
if(row%2==0 && col%2==0) row++;\
else if(row%2==1 && col%2==0) col++;\
else if(row%2==1 && col%2==1) row--;\
else if(row%2==0 && col%2==1)\
{\
do{\
row>>=1;\
col>>=1;\
}while(row%2==0 && col%2==1);\
if(row<unitlen_y && col<unitlen_x){\
off++;\
if(off==unitlen_x0*unitlen_y0)\
{\
thres/=2;\
off=0;\
}\
data = coef+off*imgsize;\
Fsign = Fs+off*imgsize;\
oldFc = Fc1+off*imgsize;\
oldFd = Fd1+off*imgsize;\
oldFl = Fl1+off*imgsize;\
row = 0;\
col = 0;\
}\
else\
{\
if(row%2==0 && col%2==0) {row++;}\
else if(row%2==1 && col%2==0) {col++;}\
else if(row%2==1 && col%2==1) {row--;}\
}\
}\
}\
}\
state = 0;\
nFc = 0;\
nFd = 0;\
nFl = 0;\
}
//void jump()
//{
// if(nFd==1 ||oldFd[row*width+col]==1)
// oldFd[row*width+col]=1;
//
// if(nFl==1 ||oldFl[row*width+col]==1)
// oldFl[row*width+col]=1;
//
// if(nFc==1||oldFc[row*width+col]==1)
// oldFc[row*width+col]=1;
//
// if(oldFd[row*width+col]==1)
// {
// if(row<unitlen_y && col<unitlen_x ) row+=unitlen_y;
// else
// {
// row*=2;
// col*=2;
// }
// }
// else
// {
// if(row<unitlen_y && col<unitlen_x )
// {
// off++;
// if(off == unitlen_x0*unitlen_y0)
// {
// thres/=2;
// off=0;
// }
// data = coef+off*imgsize;
// Fsign = Fs+off*imgsize;
// oldFc = Fc1+off*imgsize;
// oldFd = Fd1+off*imgsize;
// oldFl = Fl1+off*imgsize;
// row = 0;
// col = 0;
// }
// else
// {
// if(row%2==0 && col%2==0) row++;
// else if(row%2==1 && col%2==0) col++;
// else if(row%2==1 && col%2==1) row--;
// else if(row%2==0 && col%2==1)
// {
// do
// {
// row/=2;
// col/=2;
// }while(row%2==0 && col%2==1);
//
// if(row<unitlen_y && col<unitlen_x )
// {
// off++;
// if(off==unitlen_x0*unitlen_y0)
// {
// thres/=2;
// off=0;
// }
// data=coef+off*imgsize;
// Fsign=Fs+off*imgsize;
// oldFc=Fc1+off*imgsize;
// oldFd=Fd1+off*imgsize;
// oldFl=Fl1+off*imgsize;
// row=0;col=0;
// }
// else
// {
// if(row%2==0 && col%2==0) {row++;}
// else if(row%2==1 && col%2==0) {col++;}
// else if(row%2==1 && col%2==1) {row--;}
// }
// }
// }
// }
//
// state=0;
// nFc=0;nFd=0;nFl=0;
//}
void spiht_decode()
{
int i,par,pre,k;
long int len;
int level;
short shThresTmp; //modify by Mabel [05.12.16]
int nLeftBits; //modify by Mabel [05.12.16]
int times; //modify by Mabel [05.12.16]
OpenInputBitStream();
times = 0;
//
// Fc1 = (char *) calloc(,sizeof(char));
// Fd1 = (char *) calloc(imgsize0,sizeof(char));
// Fs = (char *) calloc(imgsize0,sizeof(char));
// Fl1 = (char *) calloc(imgsize0,sizeof(char));
// if(Fl1==NULL) exit(0);
memset(Fc1,0,WV_IMGSIZE0);
memset(Fd1,0,WV_IMGSIZE0);
// memset(Fs,0,WV_IMGSIZE0);
memset(Fl1,0,WV_IMGSIZE0);
off = 0;
data = coef+off*imgsize;
Fsign = Fs+off*imgsize;
oldFc = Fc1+off*imgsize;
oldFd = Fd1+off*imgsize;
oldFl = Fl1+off*imgsize;
nFc = 0;
nFd = 0;
nFl = 0;
row = 0;
col = 0;
state = 0;
//读门限 Modify by Mabel [2005.04.22]
thres_ori = bit[bitlen];
thres_ori -= 1;
thres = 1 << thres_ori; //比特平面编码门限
thres_ori = thres;
bitlen += 1;
len = 0;
level = 0;
shThresTmp = thres; //modify by Mabel [05.12.16]
while(thres>=thres_ori/512 && len<(maxbitlength-1)*8) //modify by Mabel [05.12.20]
{
par = p(row,col);
pre = row*width+col;
bitin = InputBit();
if(state==0)
{
if(oldFc[pre]==0 && nFc==1)
{
Fsign[pre] =bitin;
if((oldFl[par] ==1 || (row==0 && col==0))
&& (oldFd[pre] ==0 || (oldFl[pre]==0 && Fl_ext(row,col)==1)))
state=1;
else
jump();
}
else
{
nFc=bitin;
if(oldFc[pre]==0 && nFc==1)
data[pre]=3*thres/2;
else
{
if(oldFc[pre]==1 && nFc==1)
data[pre] += thres/2;
else if(oldFc[pre]==1 && nFc==0)
data[pre] -= thres/2;
else if(oldFc[pre]==0 && nFc==0)
data[pre] = 0;
if ((oldFl[par] ==1 || (row==0 && col==0))
&& (oldFd[pre] ==0 || (oldFl[pre]==0 && Fl_ext(row,col)==1)))
state=1;
else
jump();
}
}
}
else if(state==1)
{
if(oldFd[pre] ==0 && nFd==0)
{
nFd=bitin;
if(nFd==0 ||Fl_ext(row,col)==0)
jump();
}
else
{
nFl=bitin;
jump();
}
}
//modify by Mabel [05.12.16]
len++; //比特计数器加1
if (shThresTmp != thres) //该比特平面解码完毕
{
// printf("N0.%d: bitlen=%8d bblen=%2d len=%8d thresh=%d\n", \
// times, bitlen, bblen, len, shThresTmp);
if (len % 16 != 0)
{
nLeftBits = 16 - len % 16;
}
else nLeftBits = 0;
// printf(" nLeftBits=%d\n", nLeftBits);
for (i=0; i<nLeftBits; i++)
{
bitin = InputBit();
len++; //比特计数器加1 [modify by Mabel][05.12.20]
}
// printf(" bitlen=%8d bblen=%2d len=%8d\n", \
// bitlen, bblen, len);
times++;
shThresTmp = thres;
}
//modify by Mabel [05.12.16]
}
for(k=0;k<unitlen_y0*unitlen_x0;k++)
{
off = k;
data = coef+off*imgsize;
Fsign = Fs+off*imgsize;
for(i=0; i<imgsize; i++)
if(Fsign[i] == 1) data[i] *= -1;
}
// free(Fc1);
// free(Fd1);
// free(Fl1);
// free(Fs);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -