📄 header.c
字号:
/*
Implementation of CCSDS 122.0-B-1 Recommended Standard
Please note:
(1) Before you download and use the program, you must read and agree the license agreement carefully.
(2) We supply the source code and program WITHOUT ANY WARRANTIES. The users will be responsible
for any loses or damages caused by the use of the source code and the program.
Author:
Hongqiang Wang
Department of Electrical Engineering
University of Nebraska-Lincoln
Email: hqwang@bigred.unl.edu, hqwang@eecomm.unl.edu
Your comment and suggestions are welcome. Please report bugs to me via email and I would greatly appreciate it.
Jan. 21, 2007
*/
#include <string.h>
#include <stdlib.h>
#include "global.h"
void HeaderInilization(StructCodingPara *Ptr)
{
// first part of the header.
Ptr->PtrHeader = (HeaderStruct *) calloc(sizeof(HeaderStruct), 1);
Ptr->PtrHeader->Header.Part1.StartImgFlag = TRUE;
Ptr->PtrHeader->Header.Part1.EngImgFlg = FALSE; //FALSE
Ptr->PtrHeader->Header.Part1.SegmentCount_8Bits = 0;
Ptr->PtrHeader->Header.Part1.BitDepthAC_5Bits = 0;
Ptr->PtrHeader->Header.Part1.BitDepthDC_5Bits = 0;
Ptr->PtrHeader->Header.Part1.Part2Flag =TRUE; // FALSE; //
Ptr->PtrHeader->Header.Part1.Part3Flag = TRUE; //FALSE; //
Ptr->PtrHeader->Header.Part1.Part4Flag =TRUE; // FALSE; //
Ptr->PtrHeader->Header.Part1.PadRows_3Bits = 0;
Ptr->PtrHeader->Header.Part1.Reserved_5Bits = 0;
Ptr->PtrHeader->Header.Part2.SegByteLimit_27Bits = 0;// 40963072 ; //* 2; // in terms of byte
Ptr->PtrHeader->Header.Part2.DCstop = FALSE; //indicate whether the compressed output stops.
Ptr->PtrHeader->Header.Part2.BitPlaneStop_5Bits = 0; // 5 bits
Ptr->PtrHeader->Header.Part2.StageStop_2Bits = 3; // 2 bits, transform input data quantization.
if (Ptr->PtrHeader->Header.Part2.SegByteLimit_27Bits == 0)
Ptr->PtrHeader->Header.Part2.UseFill = FALSE;
else
Ptr->PtrHeader->Header.Part2.UseFill = TRUE;
Ptr->PtrHeader->Header.Part2.Reserved_4Bits = 0; // 4 bits
Ptr->PtrHeader->Header.Part3.S_20Bits = 256; // Segment size in blocks
Ptr->PtrHeader->Header.Part3.OptDCSelect = TRUE; // 1: optimum selection of k
Ptr->PtrHeader->Header.Part3.OptACSelect = TRUE; // 1: optimum selection of k
Ptr->PtrHeader->Header.Part3.Reserved_2Bits = 0;
Ptr->PtrHeader->Header.Part4.DWTType = INTEGER_WAVELET; // true is integer FLOAT_WAVELET; //
Ptr->PtrHeader->Header.Part4.Reserved_2Bits = 0; //
Ptr->PtrHeader->Header.Part4.SignedPixels = FALSE;// 0: unsigned
Ptr->PtrHeader->Header.Part4.PixelBitDepth_4Bits = 8; // if it is 0, pixel is of 16-bit.
Ptr->PtrHeader->Header.Part4.ImageWidth_20Bits = 2048; // image width
Ptr->PtrHeader->Header.Part4.TransposeImg = NOTRANSPOSE; // 1 do not transpose.
Ptr->PtrHeader->Header.Part4.CodewordLength_2Bits = 00; // codedword lenggth
Ptr->PtrHeader->Header.Part4.Reserved = 0;
Ptr->PtrHeader->Header.Part4.CustomWtFlag = FALSE; // 1, user defined weights used. TRUE; //
Ptr->PtrHeader->Header.Part4.CustomWtHH1_2bits = 0;
Ptr->PtrHeader->Header.Part4.CustomWtHL1_2bits = 1;
Ptr->PtrHeader->Header.Part4.CustomWtLH1_2bits = 1;
Ptr->PtrHeader->Header.Part4.CustomWtHH2_2bits = 1;
Ptr->PtrHeader->Header.Part4.CustomWtHL2_2bits = 2;
Ptr->PtrHeader->Header.Part4.CustomWtLH2_2bits = 2;
Ptr->PtrHeader->Header.Part4.CustomWtHH3_2bits = 2;
Ptr->PtrHeader->Header.Part4.CustomWtHL3_2bits = 3;
Ptr->PtrHeader->Header.Part4.CustomWtLH3_2bits = 3;
Ptr->PtrHeader->Header.Part4.CustomWtLL3_2bits = 3;
/* customsed test
Ptr->PtrHeader->Header.Part4.CustomWtHH1_2bits = 0;
Ptr->PtrHeader->Header.Part4.CustomWtHL1_2bits = 0;
Ptr->PtrHeader->Header.Part4.CustomWtLH1_2bits = 0;
Ptr->PtrHeader->Header.Part4.CustomWtHH2_2bits =0;
Ptr->PtrHeader->Header.Part4.CustomWtHL2_2bits = 1;
Ptr->PtrHeader->Header.Part4.CustomWtLH2_2bits = 1;
Ptr->PtrHeader->Header.Part4.CustomWtHH3_2bits =1;
Ptr->PtrHeader->Header.Part4.CustomWtHL3_2bits = 2;
Ptr->PtrHeader->Header.Part4.CustomWtLH3_2bits = 2;
Ptr->PtrHeader->Header.Part4.CustomWtLL3_2bits = 2;
*/
Ptr->PtrHeader->Header.Part4.Reserved_11Bits = 0;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// initialize coding parameters to default values.
Ptr->ImageRows = 0;
Ptr->ImageWidth = 0;
Ptr->BitsPerPixel = 0; // default coding BitsPerPixel, bits per pixels
Ptr->PixelByteOrder = 0; // default byte order. 0 means little endian, 1 means big endian first.
Ptr->Bits = (BitStream *)calloc(sizeof(BitStream), 1);
Ptr->Bits->ByteBuffer_4Bytes = 0;
Ptr->Bits->CodeWordAlighmentBits = 0;
Ptr->Bits->SegBitCounter = 0;
Ptr->Bits->TotalBitCounter = 0;
Ptr->Bits->F_Bits = NULL;
Ptr->SegmentFull = FALSE;
Ptr->RateReached = FALSE;
strcpy(Ptr->CodingOutputFile, "");
strcpy(Ptr->InputFile, "");
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// these are to record the partial decoding positon.
Ptr->DecodingStopLocations.BitPlaneStopDecoding = -1; // for find adjustment.
Ptr->DecodingStopLocations.BlockNoStopDecoding = -1;
Ptr->DecodingStopLocations.LocationFind = FALSE;
Ptr->DecodingStopLocations.X_LocationStopDecoding = -1;
Ptr->DecodingStopLocations.Y_LocationStopDecoding = -1;
Ptr->DecodingStopLocations.stoppedstage = 10;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (Ptr->PtrHeader->Header.Part4.CodewordLength_2Bits == 0)
Ptr->Bits->CodeWord_Length = 8;
else if(Ptr->PtrHeader->Header.Part4.CodewordLength_2Bits == 1)
Ptr->Bits->CodeWord_Length = 16;
else if(Ptr->PtrHeader->Header.Part4.CodewordLength_2Bits == 2)
Ptr->Bits->CodeWord_Length = 24;
else if(Ptr->PtrHeader->Header.Part4.CodewordLength_2Bits == 3)
Ptr->Bits->CodeWord_Length = 32;
return;
}
#define HEADER_INCLUDED
void HeaderOutput(StructCodingPara *PtrCoding)
{
#ifndef HEADER_INCLUDED
return;
#endif
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part1.StartImgFlag, 1);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part1.EngImgFlg, 1);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part1.SegmentCount_8Bits, 8);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part1.BitDepthDC_5Bits, 5);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part1.BitDepthAC_5Bits, 5);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part1.Reserved , 1);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part1.Part2Flag , 1);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part1.Part3Flag , 1);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part1.Part4Flag , 1);
// 24 bits already, 3 bytes
if(PtrCoding->PtrHeader->Header.Part1.EngImgFlg == TRUE)
{
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits, 3);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part1.Reserved_5Bits, 5);
}
if(PtrCoding->PtrHeader->Header.Part1.Part2Flag == TRUE)
{
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits, 27);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part2.DCstop, 1); //indicate whether the compressed output stops.
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part2.BitPlaneStop_5Bits, 5);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part2.StageStop_2Bits, 2);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part2.UseFill , 1);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part2.Reserved_4Bits , 4); // 4 bits
}
if(PtrCoding->PtrHeader->Header.Part1.Part3Flag == TRUE)
{
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part3.S_20Bits, 20);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part3.OptDCSelect, 1);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part3.OptACSelect, 1);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part3.Reserved_2Bits, 2);
}
if(PtrCoding->PtrHeader->Header.Part1.Part4Flag == TRUE)
{
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.DWTType, 1); // true is integer
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.Reserved_2Bits, 2);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.SignedPixels, 1);// 0: unsigned
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.PixelBitDepth_4Bits, 4); //
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.ImageWidth_20Bits, 20);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.TransposeImg , 1);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.CodewordLength_2Bits, 2);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.Reserved, 1);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.CustomWtFlag, 1);
if(PtrCoding->PtrHeader->Header.Part4.CustomWtFlag == FALSE)
{
BitsOutput(PtrCoding, 0, 8);
BitsOutput(PtrCoding, 0, 8);
BitsOutput(PtrCoding, 0, 4);
}
else
{
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.CustomWtHH1_2bits, 2);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.CustomWtHL1_2bits, 2);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.CustomWtLH1_2bits, 2);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.CustomWtHH2_2bits, 2);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.CustomWtHL2_2bits, 2);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.CustomWtLH2_2bits, 2);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.CustomWtHH3_2bits, 2);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.CustomWtHL3_2bits, 2);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.CustomWtLH3_2bits, 2);
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.CustomWtLL3_2bits, 2);
}
BitsOutput(PtrCoding, PtrCoding->PtrHeader->Header.Part4.Reserved_11Bits, 11);
}
}
void HeaderReadin(StructCodingPara *PtrCoding)
{
DWORD32 Byte;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -