📄 header.c
字号:
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 + -