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

📄 patterncoding.c

📁 CCSDS空间图像图像压缩标准c源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			{
				UCHAR8 temp_x = 0; 
				UCHAR8 temp_y = 0;
				if ((BlockInfo[BlockSeq].RefineBits.RefineParent.ParentRefSymbol &  (1 << (2 - i))) > 0) 
				{
					UCHAR8 code = 0;
					BitsRead(PtrCoding, &TempWord, 1);
					code = (UCHAR8) TempWord;
				    BlockInfo[BlockSeq].RefineBits.RefineParent.ParentSymbolLength --;
					temp_x = (i >= 1 ? 1 : 0);
					temp_y = (i != 1 ? 1 : 0);	
					if( code > 0) 
					{
						if (block[temp_x][temp_y] > 0)
							block[temp_x][temp_y] +=  (1 << (BitPlane - 1));
						else
							block[temp_x][temp_y] -=  (1 << (BitPlane - 1));
					} 
				}		
				if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
						&& (PtrCoding->RateReached == TRUE)
						&& (!PtrCoding->DecodingStopLocations.LocationFind))
				{
					PtrCoding->DecodingStopLocations.BlockNoStopDecoding = BlockSeq;
					PtrCoding->DecodingStopLocations.X_LocationStopDecoding = temp_x;						
					PtrCoding->DecodingStopLocations.Y_LocationStopDecoding = temp_y;
					PtrCoding->DecodingStopLocations.LocationFind = TRUE;
					return;
				}
			} 
			BlockInfo[BlockSeq].RefineBits.RefineParent.ParentRefSymbol = 0;
			BlockInfo[BlockSeq].RefineBits.RefineParent.ParentSymbolLength = 0;
		}

		if (BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength > 0)
		{	
			
			if((PtrCoding->SegmentFull == TRUE) || (PtrCoding->RateReached == TRUE))
				break;		
			for ( k = 0; k < 3; k ++)
			{			
				UCHAR8 counter = 3;		
				UCHAR8 temp_x; 
				UCHAR8 temp_y;

				temp_x = (k >= 1 ? 1 : 0);
				temp_x *= 2;
				temp_y = (k != 1 ? 1 : 0);
				temp_y *= 2;
				
				for ( i = temp_x ; i < temp_x + 2; i ++)
					for ( j =temp_y; j < temp_y + 2; j ++)
					{						
						if ((BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol & (1 << (8 - k * 4 + counter ))) > 0) 
						{
							UCHAR8 code = 0;
							BitsRead(PtrCoding,&TempWord, 1);
							code = (UCHAR8) TempWord;

							BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength --;
							if(code > 0) 	
							{							
								if (block[i][j]  > 0)
									block[i][j]  +=  (1 << (BitPlane - 1));
								else
									block[i][j]  -=  (1 << (BitPlane - 1));
							}
						}
						counter --;				
						if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
							&& PtrCoding->RateReached == TRUE
							&& (!PtrCoding->DecodingStopLocations.LocationFind))
						{
							PtrCoding->DecodingStopLocations.BlockNoStopDecoding = BlockSeq;
							PtrCoding->DecodingStopLocations.X_LocationStopDecoding = i;						
							PtrCoding->DecodingStopLocations.Y_LocationStopDecoding = j;
							PtrCoding->DecodingStopLocations.LocationFind = TRUE;
							return;
						}
					}
			}
			// reset to 0			
			BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol = 0;
			BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength = 0;
		}

		// refinement Gi

		for( i = 0; i < 3; i ++)
		{
			if (BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength > 0)
			{
			  short refine_stop_point_counter = 0;
				if((PtrCoding->SegmentFull == TRUE) || (PtrCoding->RateReached == TRUE))
					break;
					for ( j = 0; j < 4; j ++)
				{	
					UCHAR8 temp_x; 
					UCHAR8 temp_y;
					UCHAR8 counter = 3;
					temp_x = (i >= 1 ? 1 : 0) * 4 + (j >= 2 ? 1 : 0) * 2;
					temp_y = (i != 1 ? 1 : 0) * 4 + (j % 2) * 2;
				
					for ( k = temp_x; k < temp_x + 2; k ++)
						for ( p = temp_y; p < temp_y + 2; p ++)
						{
							if ((BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol & (1 << (12 - j * 4 + counter ))) > 0) 
							{
								UCHAR8 code = 0;
								BitsRead(PtrCoding, &TempWord, 1);
								code = (UCHAR8) TempWord;

								BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength --;
								refine_stop_point_counter ++;
								if(code > 0) 
								{									
									if (block[k][p]  > 0)
										block[k][p]  +=  (1 << (BitPlane - 1));
									else
										block[k][p]  -=  (1 << (BitPlane - 1));
								} 
							}
							counter --;
							if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
									&& PtrCoding->RateReached == TRUE &&
									(!PtrCoding->DecodingStopLocations.LocationFind))
							{ 
	//						if (refine_stop_point_counter == PtrCoding->DecodingStopLocations.TotalBitsReadThisTime)
								{
								PtrCoding->DecodingStopLocations.BlockNoStopDecoding = BlockSeq;
								PtrCoding->DecodingStopLocations.X_LocationStopDecoding = k;						
								PtrCoding->DecodingStopLocations.Y_LocationStopDecoding = p;
								PtrCoding->DecodingStopLocations.LocationFind = TRUE;
								return;
								}
							}
						}
				}
			}
			BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol = 0;
			BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength = 0;			
		}

		if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
			&& PtrCoding->RateReached == TRUE)
		{
			PtrCoding->DecodingStopLocations.BlockNoStopDecoding = BlockSeq;
		}
	}
} 
void RefBitsEn(BitPlaneBits * BlockInfo,
			   StructCodingPara *PtrCoding)
{
	UINT32 i;
	UCHAR8 j;

	for( i = 0; i < PtrCoding->PtrHeader->Header.Part3.S_20Bits; i ++)
	{
		// encoding TypeP first.
		if (BlockInfo[i].RefineBits.RefineParent.ParentSymbolLength > 0)
		{
			BitsOutput(PtrCoding, 
					   BlockInfo[i].RefineBits.RefineParent.ParentRefSymbol, 
					   BlockInfo[i].RefineBits.RefineParent.ParentSymbolLength);
			// reset to 0:
			BlockInfo[i].RefineBits.RefineParent.ParentRefSymbol = 0;
			BlockInfo[i].RefineBits.RefineParent.ParentSymbolLength = 0;
		}

		if (BlockInfo[i].RefineBits.RefineChildren.ChildrenSymbolLength > 0)
		{
			BitsOutput(PtrCoding, 
					   BlockInfo[i].RefineBits.RefineChildren.ChildrenRefSymbol,
					   BlockInfo[i].RefineBits.RefineChildren.ChildrenSymbolLength);
			// reset to 0
			
			BlockInfo[i].RefineBits.RefineChildren.ChildrenRefSymbol = 0;
			BlockInfo[i].RefineBits.RefineChildren.ChildrenSymbolLength = 0;

		}
		for( j = 0; j < 3; j ++)
		{
			if (BlockInfo[i].RefineBits.RefineGrandChildren[j].GrandChildrenSymbolLength > 0)
				BitsOutput(PtrCoding, 
							BlockInfo[i].RefineBits.RefineGrandChildren[j].GrandChildrenRefSymbol,
							BlockInfo[i].RefineBits.RefineGrandChildren[j].GrandChildrenSymbolLength);

			BlockInfo[i].RefineBits.RefineGrandChildren[j].GrandChildrenRefSymbol = 0;
			BlockInfo[i].RefineBits.RefineGrandChildren[j].GrandChildrenSymbolLength = 0;			
		}
	}
	return;
}

void StagesEnCoding(StructCodingPara *PtrCoding,
				   BitPlaneBits *BlockInfo)
{
	// try various options for the 2-bit, 3-bit, and 4 bit coding. 
	UCHAR8 BlocksInLastGaggle = 0;
	DWORD32 TotalGaggles; 
	DWORD32 GaggleIndex = 0;
	UCHAR8 **CodeOptionsAllGaggles;	
	UCHAR8 BlocksInGaggle = 0;
	UINT32 BlockStartIndex = 0;
	BOOL **OptionHitFlag;

	BlocksInLastGaggle = (UCHAR8) (PtrCoding->PtrHeader->Header.Part3.S_20Bits % GAGGLE_SIZE) ;
	TotalGaggles = PtrCoding->PtrHeader->Header.Part3.S_20Bits / GAGGLE_SIZE;
	// bit length is equal to 1, nk = 0;

	if( BlocksInLastGaggle!= 0) 
		TotalGaggles++;
	CodeOptionsAllGaggles = (UCHAR8 **)calloc(TotalGaggles, sizeof(UCHAR8 *)) ;
	OptionHitFlag = (BOOL **) calloc(TotalGaggles, sizeof(BOOL *)) ;

	// 4.1 Pattern values.  

	for (GaggleIndex = 0; GaggleIndex < TotalGaggles; GaggleIndex ++)	
	{
		BlockStartIndex = GaggleIndex * GAGGLE_SIZE;
		CodeOptionsAllGaggles[GaggleIndex] = (UCHAR8 *)calloc(3, sizeof(UCHAR8)) ;
		OptionHitFlag[GaggleIndex] =  (BOOL *)calloc(3, sizeof(BOOL)) ;
		OptionHitFlag[GaggleIndex][0] = FALSE;		
		OptionHitFlag[GaggleIndex][1] = FALSE;		
		OptionHitFlag[GaggleIndex][2] = FALSE;
		BlocksInGaggle = (UCHAR8)((BlockStartIndex + GAGGLE_SIZE < PtrCoding->PtrHeader->Header.Part3.S_20Bits) ? 
						 GAGGLE_SIZE : (PtrCoding->PtrHeader->Header.Part3.S_20Bits - BlockStartIndex)) ;

		CodingOptions(PtrCoding, &(BlockInfo[BlockStartIndex]) , BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]));
		
		StagesEnCodingGaggles1(PtrCoding, &(BlockInfo[BlockStartIndex]) , 
			BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]), OptionHitFlag[GaggleIndex] );
	}

		for (GaggleIndex = 0; GaggleIndex < TotalGaggles; GaggleIndex ++)	
	{ 
		BlockStartIndex = GaggleIndex * GAGGLE_SIZE;
		BlocksInGaggle = (UCHAR8) ((BlockStartIndex + GAGGLE_SIZE < PtrCoding->PtrHeader->Header.Part3.S_20Bits) ? 
							GAGGLE_SIZE : (PtrCoding->PtrHeader->Header.Part3.S_20Bits - BlockStartIndex))  ;
		StagesEnCodingGaggles2(PtrCoding, &(BlockInfo[BlockStartIndex]) ,
			BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]), OptionHitFlag[GaggleIndex] );
	}
	for (GaggleIndex = 0; GaggleIndex < TotalGaggles; GaggleIndex ++)	
	{
		BlockStartIndex = GaggleIndex * GAGGLE_SIZE;
		BlocksInGaggle = (UCHAR8) ((BlockStartIndex + GAGGLE_SIZE < PtrCoding->PtrHeader->Header.Part3.S_20Bits) ? 
							GAGGLE_SIZE : (PtrCoding->PtrHeader->Header.Part3.S_20Bits - BlockStartIndex)) ;
		StagesEnCodingGaggles3(PtrCoding, &(BlockInfo[BlockStartIndex]) , 
			BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]), OptionHitFlag[GaggleIndex] );
	}
	RefBitsEn(BlockInfo, PtrCoding);		
	return;
}
extern void StagesDeCodingGaggles1(StructCodingPara *PtrCoding,
							BitPlaneBits *BlockCodingInfo, 
							UCHAR8 BlocksInGaggles,
							UCHAR8 *CodeOptionsAllGaggles,
							BOOL *FlagCodeOptionOutput);


extern void StagesDeCodingGaggles2(StructCodingPara *PtrCoding,
							BitPlaneBits *BlockCodingInfo, 
							UCHAR8 BlocksInGaggles,
							UCHAR8 *CodeOptionsAllGaggles,
							BOOL *FlagCodeOptionOutput);

extern void StagesDeCodingGaggles3(StructCodingPara *PtrCoding,
							BitPlaneBits *BlockCodingInfo, 
							UCHAR8 BlocksInGaggles,
							UCHAR8 *CodeOptionsAllGaggles,
							BOOL *FlagCodeOptionOutput);

void StagesDeCoding(StructCodingPara *PtrCoding,
				   BitPlaneBits *BlockInfo)
{
	// try various options for the 2-bit, 3-bit, and 4 bit coding. 
	UCHAR8 BlocksInLastGaggle = 0;
	DWORD32 TotalGaggles; 
	DWORD32 GaggleIndex = 0;
	UCHAR8 **CodeOptionsAllGaggles;	
	UCHAR8 BlocksInGaggle = 0;
	UINT32 BlockStartIndex = 0;
	BOOL **OptionHitFlag;

	BlocksInLastGaggle = (UCHAR8) (PtrCoding->PtrHeader->Header.Part3.S_20Bits % GAGGLE_SIZE) ;
	TotalGaggles = PtrCoding->PtrHeader->Header.Part3.S_20Bits / GAGGLE_SIZE;
	// bit length is equal to 1, nk = 0;
	if( BlocksInLastGaggle!= 0) 
		TotalGaggles++;
	CodeOptionsAllGaggles = (UCHAR8 **)calloc(TotalGaggles, sizeof(UCHAR8 *)) ;
	OptionHitFlag = (BOOL **) calloc(TotalGaggles, sizeof(BOOL *)) ;
	PtrCoding->DecodingStopLocations.BlockNoStopDecoding = 0;

	// 4.1 Pattern values.  
	for (GaggleIndex = 0; GaggleIndex < TotalGaggles; GaggleIndex ++)	
	{
		BlockStartIndex = GaggleIndex * GAGGLE_SIZE;
		CodeOptionsAllGaggles[GaggleIndex] = (UCHAR8 *)calloc(3, sizeof(UCHAR8)) ;
		OptionHitFlag[GaggleIndex] =  (BOOL *)calloc(3, sizeof(BOOL)) ;
		OptionHitFlag[GaggleIndex][0] = FALSE;		
		OptionHitFlag[GaggleIndex][1] = FALSE;		
		OptionHitFlag[GaggleIndex][2] = FALSE;
		BlocksInGaggle = (UCHAR8)((BlockStartIndex + GAGGLE_SIZE < PtrCoding->PtrHeader->Header.Part3.S_20Bits) ? 
						 GAGGLE_SIZE : (PtrCoding->PtrHeader->Header.Part3.S_20Bits - BlockStartIndex)) ;
		StagesDeCodingGaggles1(PtrCoding, &(BlockInfo[BlockStartIndex]) , 
			BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]), OptionHitFlag[GaggleIndex] );
		
		if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
			&& PtrCoding->RateReached == TRUE)
		{
			PtrCoding->DecodingStopLocations.BlockNoStopDecoding+=GaggleIndex * 16;
			PtrCoding->DecodingStopLocations.stoppedstage = 1;	
			return;
		}
	}
	for (GaggleIndex = 0; GaggleIndex < TotalGaggles; GaggleIndex ++)	
	{
		BlockStartIndex = GaggleIndex * GAGGLE_SIZE;
		BlocksInGaggle = (UCHAR8) ((BlockStartIndex + GAGGLE_SIZE < PtrCoding->PtrHeader->Header.Part3.S_20Bits) ? 
							GAGGLE_SIZE : (PtrCoding->PtrHeader->Header.Part3.S_20Bits - BlockStartIndex))  ;
		StagesDeCodingGaggles2(PtrCoding, &(BlockInfo[BlockStartIndex]) ,
			BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]), OptionHitFlag[GaggleIndex] );
		
		if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
			&& PtrCoding->RateReached == TRUE)
		{
			PtrCoding->DecodingStopLocations.BlockNoStopDecoding += GaggleIndex * 16;			
			PtrCoding->DecodingStopLocations.stoppedstage = 2;
			return;
		}
	}

	if( PtrCoding->RateReached == TRUE)
	{
		PtrCoding->DecodingStopLocations.stoppedstage = 2;
		return;
	}

	for (GaggleIndex = 0; GaggleIndex < TotalGaggles; GaggleIndex ++)	
	{
		BlockStartIndex = GaggleIndex * GAGGLE_SIZE;
		BlocksInGaggle = (UCHAR8) ((BlockStartIndex + GAGGLE_SIZE < PtrCoding->PtrHeader->Header.Part3.S_20Bits) ? 
							GAGGLE_SIZE : (PtrCoding->PtrHeader->Header.Part3.S_20Bits - BlockStartIndex)) ;

		StagesDeCodingGaggles3(PtrCoding, &(BlockInfo[BlockStartIndex]) , 
			BlocksInGaggle, (CodeOptionsAllGaggles[GaggleIndex]), OptionHitFlag[GaggleIndex] );
		
		if ((PtrCoding->DecodingStopLocations.BitPlaneStopDecoding != -1)
			&& PtrCoding->RateReached == TRUE)
		{
			PtrCoding->DecodingStopLocations.BlockNoStopDecoding += GaggleIndex * 16;
			PtrCoding->DecodingStopLocations.stoppedstage = 3;
			return;
		}
	}
	
	if( PtrCoding->RateReached == TRUE) 
	{
		PtrCoding->DecodingStopLocations.stoppedstage = 3;
		return;
	}
	RefBitsDe(PtrCoding, BlockInfo);

	if( PtrCoding->RateReached == TRUE)
	{		
		PtrCoding->DecodingStopLocations.stoppedstage = 4;
		return;
	}

	return;
}

⌨️ 快捷键说明

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