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

📄 ispwky.h

📁 GPS programme for changchun at 8X
💻 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 + -