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

📄 bpeblockcoding.c

📁 CCSDS空间图像图像压缩标准c源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
					{
						p = 0;
						break;
					}

				if (p == 0) // not all TypeCi hitted so far. scan TypeCi
				{
					counter = 0;		
					if (BlockInfo[BlockSeq].SymbolsBlock[si].sym_len != 0)
						si++;
					BlockInfo[BlockSeq].SymbolsBlock[si].type = ENUM_TYPE_CI;
					for ( i = temp_x ; i < temp_x + 2; i ++)
						for ( j = temp_y; j < temp_y + 2; j ++)
						{
							// check the BitPlane to see if the bit plane is one. 
							if((BlockInfo[BlockSeq].StrPlaneHitHistory.TypeCi[k].TypeC & ( 1 << (3 - counter))) == 0)
							{
								if(	(Bit_Set_Plane & AMPLITUDE(block[i][j])) > 0) 
								{
									BlockInfo[BlockSeq].StrPlaneHitHistory.TypeCi[k].TypeC += (1 << ( 3 - counter));
									BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
									BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
									BlockInfo[BlockSeq].SymbolsBlock[si].sym_val ++;
									BlockInfo[BlockSeq].SymbolsBlock[si].sign <<= 1;
									BlockInfo[BlockSeq].SymbolsBlock[si].sign += SIGN(block[i][j]);	
								}
								else
								{
									BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
									BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
								}
							}
							else
							{
								temp = ((AMPLITUDE(block[i][j]) & Bit_Set_Plane) > 0 ? 1 : 0); 

								if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
								{
									if(((k == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL2_2bits < BitPlane)) // HL3 band. 										
										|| ((k == 1) && (PtrCoding->PtrHeader->Header.Part4.CustomWtLH2_2bits < BitPlane )) // HL3 band. 
										|| ((k == 2) &&	(PtrCoding->PtrHeader->Header.Part4.CustomWtHH2_2bits < BitPlane))) // HL3 band. 
									{
													
										BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol <<= 1;
										BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol += temp;
										BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength ++;
										
									}
								}
								else
								{
										BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol <<= 1;
										BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol += temp;
										BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength ++;
								}									
							}
							counter ++;
						}
				}
				else
				{	// refinement bits		
					for ( i = temp_x ; i < temp_x + 2; i ++)
						for ( j = temp_y; j < temp_y + 2; j ++)
						{
								temp = ((AMPLITUDE(block[i][j]) & Bit_Set_Plane) > 0 ? 1 : 0); 
							if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
							{
								if(((k == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL2_2bits < BitPlane )) // HL3 band. 										
									|| ((k == 1) &&	(PtrCoding->PtrHeader->Header.Part4.CustomWtLH2_2bits < BitPlane )) // HL3 band. 
									|| ((k == 2) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHH2_2bits < BitPlane )))// HL3 band. 
								{							
										BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol <<= 1;
										BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol += temp;
										BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength ++;
								}
							}
							else
							{
										BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol <<= 1;
										BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenRefSymbol += temp;
										BlockInfo[BlockSeq].RefineBits.RefineChildren.ChildrenSymbolLength ++;

							}


						}
				}
			}
		}			
	// determine if we need TranGi, which determine if 
	// we need to scan the grand children.
	
	// TranGi is needed whenver TranD is 1 unless it has been set to in the 
	// previous bit planes. 
		if(BlockInfo[BlockSeq].SymbolsBlock[si].sym_len != 0)
			si ++;
		for(k = 0; k < 3; k++)
		{		
			
			if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
			{
				if((((k == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL1_2bits >= BitPlane)) // HL3 band. 
					|| ((k == 1) &&	(PtrCoding->PtrHeader->Header.Part4.CustomWtLH1_2bits >= BitPlane)) // HL3 band. 
					|| ((k == 2) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHH1_2bits >= BitPlane)))) // HL3 band. 
					continue;
			}
			
			if (((BlockInfo[BlockSeq].StrPlaneHitHistory.TranD & (1 << (2 - k))) 
				!= 0) && ((BlockInfo[BlockSeq].StrPlaneHitHistory.TranGi & (1 << (2 - k)))  == 0))
			{
				// TranGi is needed. 
				BlockInfo[BlockSeq].SymbolsBlock[si].type = ENUM_TRAN_GI;
				temp_x = (k >= 1 ? 1 : 0);
				temp_x *= 4;
				temp_y = (k != 1 ? 1 : 0);
 				temp_y *= 4;

				for ( i= temp_x; i < temp_x + 4; i ++)
					for ( j = temp_y; j < temp_y + 4; j++)
					{
						if(	(Bit_Set_Plane & AMPLITUDE(block[i][j])) > 0) 
						{
							BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
							BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
							BlockInfo[BlockSeq].SymbolsBlock[si].sym_val ++;
							BlockInfo[BlockSeq].StrPlaneHitHistory.TranGi += ( 1 << (2 - k));			
							goto NEW_Gi;
						}
					}
				BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
				BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
			}
	NEW_Gi:;
		} 

		if(BlockInfo[BlockSeq].SymbolsBlock[si].sym_len != 0)
			si ++;

	// now based TranHi. 
		for (i = 0; i < 3; i ++)
		{
			if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
			{
				if(((i == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL1_2bits >= BitPlane)) // HL3 band. 
					|| ((i == 1) &&	(PtrCoding->PtrHeader->Header.Part4.CustomWtLH1_2bits >= BitPlane)) // HL3 band. 
					|| ((i == 2) &&	(PtrCoding->PtrHeader->Header.Part4.CustomWtHH1_2bits >= BitPlane))) // HL3 band. 
					continue;
			}
			
			if(BlockInfo[BlockSeq].SymbolsBlock[si].sym_len != 0)
				si ++;

			for ( j = 0; j < 4; j ++)
			{	
				temp_x = (i >= 1 ? 1 : 0) * 4 + (j >= 2 ? 1 : 0) * 2;
				temp_y = (i != 1 ? 1 : 0) * 4 + (j % 2) * 2;			

				if (((BlockInfo[BlockSeq].StrPlaneHitHistory.TranGi & (1 << ( 2 - i))) != 0)
					&& ((BlockInfo[BlockSeq].StrPlaneHitHistory.TranHi[i].TranH & (1 << ( 3 - j))) == 0))
				{					
					BlockInfo[BlockSeq].SymbolsBlock[si].type = ENUM_TRAN_HI;
					for ( k = temp_x; k < temp_x + 2; k ++)
						for ( p = temp_y; p < temp_y + 2; p ++)
						{
							if(	(Bit_Set_Plane & AMPLITUDE(block[k][p])) > 0) 
							{
								BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
								BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
								BlockInfo[BlockSeq].SymbolsBlock[si].sym_val ++;
								BlockInfo[BlockSeq].StrPlaneHitHistory.TranHi[i].TranH += (1 << ( 3 - j));
								goto NEW_Gij;
							}
						}
					BlockInfo[BlockSeq].SymbolsBlock[si].sym_len++;
					BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
				}
NEW_Gij:;	
			}
		}

		for (i = 0; i < 3; i ++)
		{
			if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
			{
				if(((i == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL1_2bits >= BitPlane)) // HL3 band. 
					|| ((i == 1) &&	(PtrCoding->PtrHeader->Header.Part4.CustomWtLH1_2bits >= BitPlane)) // HL3 band. 
					|| ((i == 2) &&	(PtrCoding->PtrHeader->Header.Part4.CustomWtHH1_2bits >= BitPlane))) // HL3 band. 
					continue;
			}			

			for ( j = 0; j < 4; j ++)
			{	
				temp_x = (i >= 1 ? 1 : 0) * 4 + (j >= 2 ? 1 : 0) * 2;
				temp_y = (i != 1 ? 1 : 0) * 4 + (j % 2) * 2;

				if((BlockInfo[BlockSeq].StrPlaneHitHistory.TranHi[i].TranH & (1 << (3 - j))) != 0)
				{ 
					short t = 0;
					counter = 0;
					for ( k = 0; k < 4; k ++)
						if ((BlockInfo[BlockSeq].StrPlaneHitHistory.TypeHij[i].TypeHij[j].TranH & ( 1 << (3 - k))) == 0)
							counter ++;
				
					if (counter == 0) // refinement bits. all bits have been hit before. 
					{
						for ( k = temp_x; k < temp_x + 2; k ++)
							for ( p = temp_y; p < temp_y + 2; p ++)
							{
								temp = ((AMPLITUDE(block[k][p]) & Bit_Set_Plane) > 0 ? 1 : 0); 

								if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
								{
									if(((i == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL1_2bits < BitPlane )) // HL3 band. 
										|| ((i == 1) &&	(PtrCoding->PtrHeader->Header.Part4.CustomWtLH1_2bits < BitPlane )) // HL3 band. 
										|| ((i == 2) &&	(PtrCoding->PtrHeader->Header.Part4.CustomWtHH1_2bits < BitPlane ))) // HL3 band. 
									{									
										BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol <<= 1;
										BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol += temp;
										BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength ++;
									}
								}
								else
								{
										BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol <<= 1;
										BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol += temp;
										BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength ++;
								}
							}
							continue;
					} 

				// if TranHi == 1, then four grand children TypeHij will be scanned/ 
	

					if(BlockInfo[BlockSeq].SymbolsBlock[si].sym_len != 0)
						si ++;

					BlockInfo[BlockSeq].SymbolsBlock[si].type = ENUM_TYPE_HIJ;				
					
					t = 0;
					for ( k = temp_x; k < temp_x + 2; k ++)
						for ( p = temp_y; p < temp_y + 2; p ++)
						{
							if((BlockInfo[BlockSeq].StrPlaneHitHistory.TypeHij[i].TypeHij[j].TranH & (1 << (3 - t))) == 0)
							{
								if((Bit_Set_Plane & AMPLITUDE(block[k][p])) > 0) 
								{
									BlockInfo[BlockSeq].StrPlaneHitHistory.TypeHij[i].TypeHij[j].TranH += (1 << (3 - t));
									BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
									BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
									BlockInfo[BlockSeq].SymbolsBlock[si].sym_val ++;
									BlockInfo[BlockSeq].SymbolsBlock[si].sign <<= 1;
									BlockInfo[BlockSeq].SymbolsBlock[si].sign += SIGN(block[k][p]);	
								}
								else
								{
									BlockInfo[BlockSeq].SymbolsBlock[si].sym_len ++;
									BlockInfo[BlockSeq].SymbolsBlock[si].sym_val <<= 1;
								}
							}						
							else
							{	//refinement. 
								temp = ((AMPLITUDE(block[k][p]) & Bit_Set_Plane) > 0 ? 1 : 0); 	
								if((PtrCoding->PtrHeader->Header.Part4).DWTType == INTEGER_WAVELET)
								{
									if(((i == 0) && (PtrCoding->PtrHeader->Header.Part4.CustomWtHL1_2bits < BitPlane )) // HL3 band.
										|| ((i == 1) && (PtrCoding->PtrHeader->Header.Part4.CustomWtLH1_2bits < BitPlane ))
										|| ((i == 2) &&	(PtrCoding->PtrHeader->Header.Part4.CustomWtHH1_2bits < BitPlane )))
									{
										BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol <<= 1;
										BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol += temp;
										BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength ++;							
									}	
								}
								else
								{
										BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol <<= 1;
										BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenRefSymbol += temp;
										BlockInfo[BlockSeq].RefineBits.RefineGrandChildren[i].GrandChildrenSymbolLength ++;			
								}
							}
							t++;
						}
				}		
			}
		}
	}
	
return;
}



⌨️ 快捷键说明

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