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

📄 header.c

📁 CCSDS空间图像图像压缩标准c源代码
💻 C
📖 第 1 页 / 共 2 页
字号:

	BitsRead(PtrCoding, &Byte, 1);
	PtrCoding->PtrHeader->Header.Part1.StartImgFlag = (BOOL)Byte;
	BitsRead(PtrCoding, &Byte, 1);
	PtrCoding->PtrHeader->Header.Part1.EngImgFlg = (BOOL)Byte;

	BitsRead(PtrCoding, &Byte, 8);
	PtrCoding->PtrHeader->Header.Part1.SegmentCount_8Bits = (UCHAR8)Byte;

	BitsRead(PtrCoding, &Byte, 5);
	PtrCoding->PtrHeader->Header.Part1.BitDepthDC_5Bits = (UCHAR8)Byte;

	BitsRead(PtrCoding, &Byte, 5);
	PtrCoding->PtrHeader->Header.Part1.BitDepthAC_5Bits = (UCHAR8)Byte;

	BitsRead(PtrCoding, &Byte, 1);
	PtrCoding->PtrHeader->Header.Part1.Reserved = (UCHAR8)Byte;

	BitsRead(PtrCoding, &Byte, 1);
	PtrCoding->PtrHeader->Header.Part1.Part2Flag = (BOOL)Byte;
	
	BitsRead(PtrCoding, &Byte, 1);
	PtrCoding->PtrHeader->Header.Part1.Part3Flag= (BOOL)Byte;	

	BitsRead(PtrCoding,&Byte, 1);
	PtrCoding->PtrHeader->Header.Part1.Part4Flag= (BOOL)Byte;

	if((PtrCoding->PtrHeader->Header.Part1).EngImgFlg == TRUE)
	{
		BitsRead(PtrCoding, &Byte, 3);
		PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits= (UCHAR8)Byte;
		BitsRead(PtrCoding, &Byte, 5);
		PtrCoding->PtrHeader->Header.Part1.Reserved_5Bits= (UCHAR8)Byte;
	}

	if(PtrCoding->PtrHeader->Header.Part1.Part2Flag == TRUE)
	{		
		BitsRead(PtrCoding, &Byte, 27);
		PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits = Byte;

		BitsRead(PtrCoding, &Byte, 1);
		PtrCoding->PtrHeader->Header.Part2.DCstop = (BOOL)Byte; //indicate whether the compressed output stops. 
		
		BitsRead(PtrCoding, &Byte, 5);
		PtrCoding->PtrHeader->Header.Part2.BitPlaneStop_5Bits = (UCHAR8)Byte;
		
		BitsRead(PtrCoding, &Byte, 2);
		PtrCoding->PtrHeader->Header.Part2.StageStop_2Bits = (UCHAR8)Byte;
		
		BitsRead(PtrCoding, &Byte, 1);
		PtrCoding->PtrHeader->Header.Part2.UseFill = (BOOL)Byte;
		
		BitsRead(PtrCoding, &Byte, 4);
		PtrCoding->PtrHeader->Header.Part2.Reserved_4Bits = (UCHAR8)Byte; // 4 bits
	}

	if((PtrCoding->PtrHeader->Header.Part1).Part3Flag == TRUE)
	{
		
		BitsRead(PtrCoding, &Byte, 20);
		PtrCoding->PtrHeader->Header.Part3.S_20Bits = Byte;
		if(PtrCoding->BitsPerPixel != 0)
		{
			PtrCoding->DecodingAllowedBitsSizeInSegment = (DWORD32)(PtrCoding->BitsPerPixel * 
					PtrCoding->PtrHeader->Header.Part3.S_20Bits * 64);

			if (PtrCoding->DecodingAllowedBitsSizeInSegment > (PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits  << 3))
				PtrCoding->DecodingAllowedBitsSizeInSegment = (PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits << 3);
		}
		else
		{
			PtrCoding->DecodingAllowedBitsSizeInSegment = 0;
			if(PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits  != 0)
				PtrCoding->DecodingAllowedBitsSizeInSegment = (PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits << 3);
		}

		BitsRead(PtrCoding, &Byte, 1);
		PtrCoding->PtrHeader->Header.Part3.OptDCSelect = (BOOL)Byte;
		
		BitsRead(PtrCoding, &Byte, 1);
		PtrCoding->PtrHeader->Header.Part3.OptACSelect = (BOOL)Byte;

		BitsRead(PtrCoding, &Byte, 2);
		PtrCoding->PtrHeader->Header.Part3.Reserved_2Bits = (UCHAR8)Byte;
	}
	else
	{
		PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits = 0;  //even user specify a rate, in this case, there is no rate control.
	}


	if((PtrCoding->PtrHeader->Header.Part1).Part4Flag == TRUE)
	{
		BitsRead(PtrCoding, &Byte, 1);
		PtrCoding->PtrHeader->Header.Part4.DWTType = (BOOL)Byte;
		BitsRead(PtrCoding, &Byte, 2);
			PtrCoding->PtrHeader->Header.Part4.Reserved_2Bits = (UCHAR8)Byte;
		BitsRead(PtrCoding, &Byte, 1);
			PtrCoding->PtrHeader->Header.Part4.SignedPixels = (BOOL)Byte;
		BitsRead(PtrCoding, &Byte, 4);
			PtrCoding->PtrHeader->Header.Part4.PixelBitDepth_4Bits = (UCHAR8)Byte;
		BitsRead(PtrCoding, &Byte, 20);
			PtrCoding->PtrHeader->Header.Part4.ImageWidth_20Bits = (DWORD32)Byte;
		BitsRead(PtrCoding, &Byte, 1);
			PtrCoding->PtrHeader->Header.Part4.TransposeImg  = (BOOL)Byte;
		BitsRead(PtrCoding, &Byte, 2);
			PtrCoding->PtrHeader->Header.Part4.CodewordLength_2Bits = (UCHAR8)Byte;

		if (PtrCoding->PtrHeader->Header.Part4.CodewordLength_2Bits == 00)
			PtrCoding->Bits->CodeWord_Length = 8;
		else if(PtrCoding->PtrHeader->Header.Part4.CodewordLength_2Bits == 01)
			PtrCoding->Bits->CodeWord_Length = 16;
		else if(PtrCoding->PtrHeader->Header.Part4.CodewordLength_2Bits == 2)
			PtrCoding->Bits->CodeWord_Length = 24;
		else if(PtrCoding->PtrHeader->Header.Part4.CodewordLength_2Bits == 3)
			PtrCoding->Bits->CodeWord_Length = 32;

		BitsRead(PtrCoding, &Byte, 1);
			PtrCoding->PtrHeader->Header.Part4.Reserved = (BOOL)Byte;
		BitsRead(PtrCoding, &Byte, 1);
			PtrCoding->PtrHeader->Header.Part4.CustomWtFlag = (BOOL)Byte;
		if(Byte == TRUE) 
		{
			BitsRead(PtrCoding, &Byte, 2);
				PtrCoding->PtrHeader->Header.Part4.CustomWtHH1_2bits = (UCHAR8)Byte;
			BitsRead(PtrCoding, &Byte, 2);
				PtrCoding->PtrHeader->Header.Part4.CustomWtHL1_2bits = (UCHAR8)Byte;
			BitsRead(PtrCoding, &Byte, 2);
				PtrCoding->PtrHeader->Header.Part4.CustomWtLH1_2bits = (UCHAR8)Byte;
			BitsRead(PtrCoding, &Byte, 2);
				PtrCoding->PtrHeader->Header.Part4.CustomWtHH2_2bits = (UCHAR8)Byte;
			BitsRead(PtrCoding, &Byte, 2);
				PtrCoding->PtrHeader->Header.Part4.CustomWtHL2_2bits = (UCHAR8)Byte;
			BitsRead(PtrCoding, &Byte, 2);
				PtrCoding->PtrHeader->Header.Part4.CustomWtLH2_2bits = (UCHAR8)Byte;
			BitsRead(PtrCoding, &Byte, 2);
				PtrCoding->PtrHeader->Header.Part4.CustomWtHH3_2bits = (UCHAR8)Byte;
			BitsRead(PtrCoding, &Byte, 2);
				PtrCoding->PtrHeader->Header.Part4.CustomWtHL3_2bits = (UCHAR8)Byte;
			BitsRead(PtrCoding, &Byte, 2);
				PtrCoding->PtrHeader->Header.Part4.CustomWtLH3_2bits = (UCHAR8)Byte;
			BitsRead(PtrCoding, &Byte, 2);
			PtrCoding->PtrHeader->Header.Part4.CustomWtLL3_2bits = (UCHAR8)Byte;
		}
		else
		{
			BitsRead(PtrCoding, &Byte, 20);
		}
		BitsRead(PtrCoding, &Byte, 11);
		PtrCoding->PtrHeader->Header.Part4.Reserved_11Bits  = (WORD16)Byte;
	}


	PtrCoding->DecodingStopLocations.BitPlaneStopDecoding = -1;
	PtrCoding->DecodingStopLocations.BlockNoStopDecoding = -1;	
	PtrCoding->DecodingStopLocations.LocationFind = FALSE;
	PtrCoding->DecodingStopLocations.X_LocationStopDecoding = -1;
	PtrCoding->DecodingStopLocations.Y_LocationStopDecoding  = -1;
}


void HeaderUpdate(HeaderStruct * HeaderStr)
{
	

	if(HeaderStr->Header.Part1.StartImgFlag == TRUE)
		HeaderStr->Header.Part1.StartImgFlag = FALSE;
	HeaderStr->Header.Part1.BitDepthAC_5Bits = 0;	
	HeaderStr->Header.Part1.BitDepthDC_5Bits = 0;

	HeaderStr->Header.Part1.SegmentCount_8Bits ++;

	//for test 4
	HeaderStr->Header.Part1.Part2Flag = FALSE;
	HeaderStr->Header.Part1.Part3Flag = FALSE;
	HeaderStr->Header.Part1.Part4Flag = FALSE;

	if(HeaderStr->Header.Part1.Part2Flag == TRUE)  // it has part 2. 
	{
		HeaderStr->Header.Part2.SegByteLimit_27Bits = 1000000; // maxmimum number of bits, including the bytes used for the header. 
		HeaderStr->Header.Part2.BitPlaneStop_5Bits ++;
		HeaderStr->Header.Part2.StageStop_2Bits ++;
		HeaderStr->Header.Part2.UseFill ++;		
	}

	if(HeaderStr->Header.Part1.Part3Flag == TRUE)  // it has part 3. 
		// Part 3 can be changed within the application. 
	{
		HeaderStr->Header.Part3.S_20Bits = 1000;
		HeaderStr->Header.Part3.OptDCSelect ++;
		HeaderStr->Header.Part3.OptACSelect ++;
	}
	
	if(HeaderStr->Header.Part1.Part4Flag == TRUE)  // Part 4 may not be changed
		// within a particular application. 
	{
		HeaderStr->Header.Part4.DWTType = INTEGER_WAVELET;
	}

	if (HeaderStr->Header.Part3.S_20Bits < 16)
		ErrorMsg(BPE_INVALID_HEADER);
}

⌨️ 快捷键说明

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