From 1b2f9596bcc1a95480886b76b85b87e662e53c05 Mon Sep 17 00:00:00 2001 From: Kyle Klein Date: Sun, 24 Sep 2023 20:28:50 -0700 Subject: [PATCH] it works --- .gitignore | 3 + olaf/bpe/Makefile | 16 +- olaf/bpe/README.md | 0 olaf/bpe/cfc.py | 0 olaf/bpe/pixel_check.py | 0 olaf/bpe/source/AC_BitPlaneCoding.c | 9 +- olaf/bpe/source/AdjustOutput.c | 5 +- olaf/bpe/source/BPEBlockCoding.c | 4 +- olaf/bpe/source/CoeffGroup.c | 0 olaf/bpe/source/DC_EnDeCoding.c | 6 +- olaf/bpe/source/PatternCoding.c | 23 +- olaf/bpe/source/README.rtf | 7 - olaf/bpe/source/StagesCodingGaggles.c | 16 +- olaf/bpe/source/UNL_readme.pdf | Bin 83258 -> 0 bytes olaf/bpe/source/bitsIO.c | 4 +- olaf/bpe/source/bpe_decoder.c | 26 +- olaf/bpe/source/bpe_encoder.c | 13 +- olaf/bpe/source/bpe_main.c | 4 - olaf/bpe/source/bu_wmain_pybind.c | 601 -------------------------- olaf/bpe/source/cfc.py | 28 -- olaf/bpe/source/errorhandle.c | 4 +- olaf/bpe/source/global.h | 55 ++- olaf/bpe/source/header.c | 3 +- olaf/bpe/source/lifting_97M.c | 22 +- olaf/bpe/source/lifting_97f.c | 12 +- olaf/bpe/source/main_pybind.h | 0 olaf/bpe/source/makefile | 8 +- olaf/bpe/source/pixel_check.py | 30 -- olaf/bpe/source/ricecoding.c | 4 +- olaf/bpe/source/tailor.h | 0 olaf/bpe/source/waveletbpe.c | 35 +- olaf/bpe/test.py | 2 +- 32 files changed, 110 insertions(+), 830 deletions(-) mode change 100644 => 100755 olaf/bpe/README.md mode change 100644 => 100755 olaf/bpe/cfc.py mode change 100644 => 100755 olaf/bpe/pixel_check.py mode change 100644 => 100755 olaf/bpe/source/AC_BitPlaneCoding.c mode change 100644 => 100755 olaf/bpe/source/AdjustOutput.c mode change 100644 => 100755 olaf/bpe/source/BPEBlockCoding.c mode change 100644 => 100755 olaf/bpe/source/CoeffGroup.c mode change 100644 => 100755 olaf/bpe/source/DC_EnDeCoding.c mode change 100644 => 100755 olaf/bpe/source/PatternCoding.c delete mode 100644 olaf/bpe/source/README.rtf mode change 100644 => 100755 olaf/bpe/source/StagesCodingGaggles.c delete mode 100644 olaf/bpe/source/UNL_readme.pdf mode change 100644 => 100755 olaf/bpe/source/bitsIO.c mode change 100644 => 100755 olaf/bpe/source/bpe_decoder.c mode change 100644 => 100755 olaf/bpe/source/bpe_encoder.c mode change 100644 => 100755 olaf/bpe/source/bpe_main.c delete mode 100644 olaf/bpe/source/bu_wmain_pybind.c delete mode 100644 olaf/bpe/source/cfc.py mode change 100644 => 100755 olaf/bpe/source/errorhandle.c mode change 100644 => 100755 olaf/bpe/source/header.c mode change 100644 => 100755 olaf/bpe/source/lifting_97M.c mode change 100644 => 100755 olaf/bpe/source/lifting_97f.c mode change 100644 => 100755 olaf/bpe/source/main_pybind.h mode change 100644 => 100755 olaf/bpe/source/makefile delete mode 100644 olaf/bpe/source/pixel_check.py mode change 100644 => 100755 olaf/bpe/source/ricecoding.c mode change 100644 => 100755 olaf/bpe/source/tailor.h mode change 100644 => 100755 olaf/bpe/source/waveletbpe.c diff --git a/.gitignore b/.gitignore index 3f7bb4c7..32a26f51 100644 --- a/.gitignore +++ b/.gitignore @@ -133,3 +133,6 @@ dmypy.json # Vagrant .vagrant/ + +.DS_Store + diff --git a/olaf/bpe/Makefile b/olaf/bpe/Makefile index 297696af..664a2089 100644 --- a/olaf/bpe/Makefile +++ b/olaf/bpe/Makefile @@ -3,7 +3,6 @@ # are for pybind11 usage with Mac M1+ OS. Please comment out as needed. # select compiler for C and C++ -CC = gcc CXX = g++ @@ -39,21 +38,16 @@ BPE_SOURCES = \ $(BPE_SRC)/PatternCoding.c \ $(BPE_SRC)/waveletbpe.c \ $(BPE_SRC)/main_pybind.c - -CFLAGS = \ - -g -Wall $(INC_DIRS) -fPIC \ - $(shell python3-config --includes --cflags) \ - $(shell python3 -m pybind11 --includes) -#-Wno-sign-compare Wno-unused-but-set-variable Wno-absolute-value Wno-self-assign - -# above line is to ignore certain warning during testing CXXFLAGS = \ -std=c++11 -g -Wall $(INC_DIRS) -fPIC \ $(shell python3-config --includes --cflags) \ $(shell python3 -m pybind11 --includes) +#-Wno-sign-compare Wno-unused-but-set-variable Wno-absolute-value Wno-self-assign +# above line is to ignore certain warning during testing + LDFLAGS = -lm $(shell python3-config --ldflags) #-Wl,-ld_classic -undefined dynamic_lookup @@ -65,10 +59,10 @@ OBJS = $(PYLIB_SOURCES:%.cpp=$(BUILD_DIR)/%.o) $(BPE_SOURCES:%.c=$(BUILD_DIR)/%. $(BUILD_DIR)/%.o: %.c @mkdir -p $(BUILD_DIR)/$(BPE_SRC) - $(CC) -c $< -o $@ $(CFLAGS) + $(CXX) -c $< -o $@ $(CXXFLAGS) $(BUILD_DIR)/%.o: %.cpp - @mkdir -p $(BUILD_DIR) + @mkdir -p $(BUILD_DIR)/$(BPE_SRC) $(CXX) -c $< -o $@ $(CXXFLAGS) $(LINK_TARGET): $(OBJS) diff --git a/olaf/bpe/README.md b/olaf/bpe/README.md old mode 100644 new mode 100755 diff --git a/olaf/bpe/cfc.py b/olaf/bpe/cfc.py old mode 100644 new mode 100755 diff --git a/olaf/bpe/pixel_check.py b/olaf/bpe/pixel_check.py old mode 100644 new mode 100755 diff --git a/olaf/bpe/source/AC_BitPlaneCoding.c b/olaf/bpe/source/AC_BitPlaneCoding.c old mode 100644 new mode 100755 index 1107c41f..cb6f6258 --- a/olaf/bpe/source/AC_BitPlaneCoding.c +++ b/olaf/bpe/source/AC_BitPlaneCoding.c @@ -18,14 +18,9 @@ Nov. 3, 2006 #include #include -//#include "global.h" -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" -extern void BlockScanEncode(StructCodingPara *PtrCoding, BitPlaneBits *BlockInfo); - -extern void StagesEnCoding(StructCodingPara *PtrCoding, BitPlaneBits *BlockInfo); - -extern void StagesDeCoding(StructCodingPara *PtrCoding, BitPlaneBits *BlockInfo); void ACDepthEncoder(StructCodingPara *PtrCoding, BitPlaneBits *BlockInfo); diff --git a/olaf/bpe/source/AdjustOutput.c b/olaf/bpe/source/AdjustOutput.c old mode 100644 new mode 100755 index 4a5e3af1..16170f03 --- a/olaf/bpe/source/AdjustOutput.c +++ b/olaf/bpe/source/AdjustOutput.c @@ -17,10 +17,9 @@ Nov. 3, 2006 #include #include -//#include "global.h" -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" -extern long DeConvTwosComp(DWORD32 complement, short leftmost); void AdjustOutPut(StructCodingPara * PtrCoding, BitPlaneBits * BlockCodingInfo)// need to adjust the output { diff --git a/olaf/bpe/source/BPEBlockCoding.c b/olaf/bpe/source/BPEBlockCoding.c old mode 100644 new mode 100755 index e8eca5e7..2433f3ed --- a/olaf/bpe/source/BPEBlockCoding.c +++ b/olaf/bpe/source/BPEBlockCoding.c @@ -16,8 +16,8 @@ Nov. 3, 2006 */ #include #include -//#include "global.h" -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" void BlockScanEncode(StructCodingPara *PtrCoding, BitPlaneBits *BlockInfo) diff --git a/olaf/bpe/source/CoeffGroup.c b/olaf/bpe/source/CoeffGroup.c old mode 100644 new mode 100755 diff --git a/olaf/bpe/source/DC_EnDeCoding.c b/olaf/bpe/source/DC_EnDeCoding.c old mode 100644 new mode 100755 index f20a1e63..04b20e79 --- a/olaf/bpe/source/DC_EnDeCoding.c +++ b/olaf/bpe/source/DC_EnDeCoding.c @@ -16,15 +16,13 @@ Nov. 3, 2006 */ #include #include -//#include "global.h" -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" long DeConvTwosComp(DWORD32 complement, short leftmost); -extern void HeaderOutput(StructCodingPara *PtrCoding); - long DeConvTwosComp(DWORD32 complement, short leftmost) { diff --git a/olaf/bpe/source/PatternCoding.c b/olaf/bpe/source/PatternCoding.c old mode 100644 new mode 100755 index f7df8661..30e509b2 --- a/olaf/bpe/source/PatternCoding.c +++ b/olaf/bpe/source/PatternCoding.c @@ -17,8 +17,8 @@ Nov. 3, 2006 #include #include -//#include "global.h" -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" const int bit2_pattern[] = {0, 2, 1, 3}; const int bit3_pattern[] = {1, 4, 0, 5, 2, 6, 3, 7}; @@ -26,25 +26,6 @@ const int bit3_pattern_TranD[] = {0, 3, 0, 4, 1, 5, 2, 6}; const int bit4_pattern_TypeCi[] = {10, 1, 3, 6, 2, 5, 9, 12, 0, 8, 7, 13, 4, 14, 11, 15}; const int bit4_pattern_TypeHij_TranHi[] = {0, 1, 3, 6, 2, 5, 9, 11, 0, 8, 7, 12, 4, 13, 10, 14}; -extern void StagesEnCodingGaggles1(StructCodingPara *PtrCoding, - BitPlaneBits *BlockInfo, - UCHAR8 BlocksInGaggles, - UCHAR8 Option[], - BOOL FlagCodeOptionOutput[]); - -extern void StagesEnCodingGaggles2(StructCodingPara *PtrCoding, - BitPlaneBits *BlockInfo, - UCHAR8 BlocksInGaggles, - UCHAR8 Option[], - BOOL FlagCodeOptionOutput[]); - -extern void StagesEnCodingGaggles3(StructCodingPara *PtrCoding, - BitPlaneBits *BlockInfo, - UCHAR8 BlocksInGaggles, - UCHAR8 Option[], - BOOL FlagCodeOptionOutput[]); - - void PatternMapping(StrSymbolDetails *StrSymbol) { diff --git a/olaf/bpe/source/README.rtf b/olaf/bpe/source/README.rtf deleted file mode 100644 index dcf0814d..00000000 --- a/olaf/bpe/source/README.rtf +++ /dev/null @@ -1,7 +0,0 @@ -Kyle Klein, Ryan Medick for OreSat - August 2023 -kleinky@pdx.edu - oresat@pdx.edu - -This program has been adapted from the University of Nebraska-Lincoln's -implementation of the CCSDS 122.0-B-2 Recommended Standard image compression algorithm. - - diff --git a/olaf/bpe/source/StagesCodingGaggles.c b/olaf/bpe/source/StagesCodingGaggles.c old mode 100644 new mode 100755 index 22787309..eaccaf87 --- a/olaf/bpe/source/StagesCodingGaggles.c +++ b/olaf/bpe/source/StagesCodingGaggles.c @@ -15,17 +15,11 @@ Your comment and suggestions are welcome. Please report bugs to me via email and Nov. 3, 2006 */ -//#include "global.h" -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" #include #include -extern void RiceCoding(short InputVal, - short BitLength, - UCHAR8 *Option, - StructCodingPara *PtrCoding ); - -extern void BitPlaneSymbolReset(StrSymbolDetails *SymbolStr); void StagesEnCodingGaggles1(StructCodingPara *PtrCoding, BitPlaneBits *BlockInfo, UCHAR8 BlocksInGaggles, UCHAR8 Option[], BOOL FlagCodeOptionOutput[]) @@ -235,12 +229,6 @@ void StagesEnCodingGaggles3(StructCodingPara *PtrCoding, } } -extern void RiceDecoding(DWORD32 *decoded, - short BitLength, - UCHAR8 *splitOption, - StructCodingPara *Ptr); - -extern void DeMappingPattern(StrSymbolDetails *StrSymbol); void StagesDeCodingGaggles1(StructCodingPara *PtrCoding, BitPlaneBits *BlockCodingInfo, diff --git a/olaf/bpe/source/UNL_readme.pdf b/olaf/bpe/source/UNL_readme.pdf deleted file mode 100644 index fe1edbfd78a5dfa9859992c03f60baa9dcca01f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83258 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 _2!;(BjNZiJBO|1(<*Mm~o1G&hOc!=_ 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

cV-J_=Yj-o8e2v)ZW=sq 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 -//#include "global.h" -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" void OutputCodeWord(StructCodingPara * Ptr) { diff --git a/olaf/bpe/source/bpe_decoder.c b/olaf/bpe/source/bpe_decoder.c old mode 100644 new mode 100755 index d2b5704d..322b0fac --- a/olaf/bpe/source/bpe_decoder.c +++ b/olaf/bpe/source/bpe_decoder.c @@ -17,30 +17,8 @@ Nov. 3, 2006 #include #include #include -//#include "global.h" -#include "main_pybind.h" - - -extern void AdjustOutPut(StructCodingPara * PtrCoding, BitPlaneBits * BlockCodingInfo); - -extern void CoeffDegroup(int **img_wav, int rows, int cols); - -extern void CoeffDegroupFloating(float **img_wav, int rows, int cols); - -extern void HeaderReadin(StructCodingPara *PtrCoding); - -extern void DWT_Reverse(int **block, StructCodingPara *PtrCoding); - -extern void DWT_ReverseFloating(float **block, - StructCodingPara *PtrCoding); - -extern short DCDeCoding(StructCodingPara *PtrCoding, - StructFreBlockString * , - BitPlaneBits *BlockInfo); - - -extern void ACBpeDecoding(StructCodingPara *PtrCoding, - BitPlaneBits *BlockCodingInfo); +#include "global.h" +//#include "main_pybind.h" short ImageWrite(StructCodingPara *StrPtr, int **image); diff --git a/olaf/bpe/source/bpe_encoder.c b/olaf/bpe/source/bpe_encoder.c old mode 100644 new mode 100755 index 41b208fd..a672ad48 --- a/olaf/bpe/source/bpe_encoder.c +++ b/olaf/bpe/source/bpe_encoder.c @@ -17,23 +17,14 @@ Nov. 3, 2006 #include #include #include -//#include "global.h" -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" -extern void DWT_(StructCodingPara *, int **, int **); - -extern void HeaderUpdate(HeaderStruct * ); - -extern void DCEncoding(StructCodingPara *, long **, BitPlaneBits *); - -extern void ACBpeEncoding(StructCodingPara *, BitPlaneBits *); int ImageSize(StructCodingPara * ); short ImageRead(StructCodingPara *, int **); -extern void DebugInfo(char *m); - int ImageSize(StructCodingPara * PtrStructCodingPara) { /* diff --git a/olaf/bpe/source/bpe_main.c b/olaf/bpe/source/bpe_main.c old mode 100644 new mode 100755 index 85eddcf1..44a377e8 --- a/olaf/bpe/source/bpe_main.c +++ b/olaf/bpe/source/bpe_main.c @@ -27,9 +27,6 @@ Modified August 2023 for PSAS //#define DEMO -extern void EncoderEngine(StructCodingPara * PtrCoding); -extern void DecoderEngine(StructCodingPara * PtrCoding); -extern void HeaderInilization(StructCodingPara *Ptr); void DebugInfo(char *m); #define VERSION "Last modified on March 9, 2008\n" @@ -92,7 +89,6 @@ BOOL ParameterValidCheck(StructCodingPara *PtrCoding) int main(int argc, char **argv) { - extern char *optarg; char i = 0; long TotalPixels = 0; char StringBuffer[100] = {""}; diff --git a/olaf/bpe/source/bu_wmain_pybind.c b/olaf/bpe/source/bu_wmain_pybind.c deleted file mode 100644 index 34cd3fb0..00000000 --- a/olaf/bpe/source/bu_wmain_pybind.c +++ /dev/null @@ -1,601 +0,0 @@ -// work in progress -// implementation file for main_pybind.h -// - - -#include "main_pybind.h" - -/* -void EncoderEngine(StructCodingPara * PtrCoding) -{ - int **OriginalImage = NULL; - int **TransformedImage = NULL; - long **BlockString = NULL; - UINT32 TotalBlocks = 0; - UINT32 i = 0; - UINT32 j = 0; - UCHAR8 TempPaddedRows = 0; - - BitPlaneBits *BlockCodingInfo; - // check to see if the file size are correct or not. - if (ImageSize(PtrCoding) == BPE_FILE_ERROR) - ErrorMsg(BPE_FILE_ERROR); - - // determine the last rows we need to replicate. - if(PtrCoding->ImageRows % BLOCK_SIZE != 0) - PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits = BLOCK_SIZE - (PtrCoding->ImageRows % BLOCK_SIZE); - - PtrCoding->PtrHeader->Header.Part4.ImageWidth_20Bits = PtrCoding->ImageWidth; - - if(PtrCoding->ImageWidth % BLOCK_SIZE != 0) - PtrCoding->PadCols_3Bits = BLOCK_SIZE - (PtrCoding->ImageWidth % BLOCK_SIZE ); - - // assign space for the original image - - OriginalImage = (int **)calloc(PtrCoding->ImageRows + PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits, sizeof(int *)); - - for(i = 0; i < PtrCoding->ImageRows + PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits; i++) - OriginalImage[i] = (int *)calloc(PtrCoding->ImageWidth + PtrCoding->PadCols_3Bits,sizeof(int)); - // assign memeory for the transformed image - // The OriginalImage matrix is to store the original image and - //TransformedImage stores the transformed values. - - // read into the original image. - if ((i = ImageRead(PtrCoding, OriginalImage)) != BPE_OK) - ErrorMsg(BPE_FILE_ERROR); - - // replicate the last rows and cols if the number of rows - // and columns are not integal of 8. - - for(i = 0; i < PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits ; i++) - { - for(j = 0; j < PtrCoding->ImageWidth + PtrCoding->PadCols_3Bits; j++) - OriginalImage[i + PtrCoding->ImageRows][j] = OriginalImage[PtrCoding->ImageRows - 1][j]; - } - - for(i = 0; i < PtrCoding->PadCols_3Bits ; i++) - { - for(j = 0; j < PtrCoding->ImageRows + PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits ; j++) - OriginalImage[j][i + PtrCoding->ImageWidth] = OriginalImage[j][PtrCoding->ImageWidth - 1]; - } - - TransformedImage = (int **)calloc(PtrCoding->ImageRows + PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits,sizeof(int *)); - for(i = 0; i < PtrCoding->ImageRows+ PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits; i++) - TransformedImage[i] = (int *)calloc(PtrCoding->ImageWidth + PtrCoding->PadCols_3Bits, sizeof(int)); - - // Read the input image - -/////////////////////////////////////////////////////////////////////////////////////// -// Allocate memory for coding of the input image - TotalBlocks = (PtrCoding->ImageRows + PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits) / BLOCK_SIZE * - (PtrCoding->ImageWidth + PtrCoding->PadCols_3Bits )/ BLOCK_SIZE; - - BlockString = (long **)calloc(TotalBlocks * BLOCK_SIZE,sizeof(long *)); - for(i = 0; i < TotalBlocks * BLOCK_SIZE; i++) - BlockString[i] = (long *)calloc(BLOCK_SIZE,sizeof(long)); - -//////////////////////////////////////////////////////////////////////////////// - // Output the coding information into the the output. - if((PtrCoding->Bits->F_Bits = fopen(PtrCoding->CodingOutputFile, "wb")) == NULL) // default name - ErrorMsg(BPE_FILE_ERROR); - - //1.Transform - DWT_(PtrCoding, OriginalImage, TransformedImage); - - BuildBlockString(TransformedImage, PtrCoding->ImageRows + PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits, - PtrCoding->ImageWidth + PtrCoding->PadCols_3Bits, BlockString); - for(i = 0; i < PtrCoding->ImageRows; i++) - free(TransformedImage[i]); - free(TransformedImage); - - TempPaddedRows = PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits; - PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits = 0; - for(;PtrCoding->BlockCounter < TotalBlocks; ) - { - ////////////////////////////////////////////////////////////////////// - // update the information of header. - - if (PtrCoding->BlockCounter + PtrCoding->PtrHeader->Header.Part3.S_20Bits == TotalBlocks) - { - PtrCoding->PtrHeader->Header.Part1.EngImgFlg = TRUE; - PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits = TempPaddedRows; - } - else if (PtrCoding->BlockCounter + PtrCoding->PtrHeader->Header.Part3.S_20Bits > TotalBlocks) - { - // This part may handle the situation where the number of blocks in the last packet is not exactly the one specified. - // For example: if totalblocks = 128, PtrCoding->PtrHeader->Header.Part3.S_20Bits = 10, so in the last packet, - // only 8 blocks left, so we need to specify exactly 8 blocks are left in the last packet and part3 may need to be enabled - PtrCoding->PtrHeader->Header.Part1.EngImgFlg = TRUE; - PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits = TempPaddedRows; - PtrCoding->PtrHeader->Header.Part1.Part3Flag = TRUE; - PtrCoding->PtrHeader->Header.Part3.S_20Bits = TotalBlocks - PtrCoding->BlockCounter; - - PtrCoding->PtrHeader->Header.Part1.Part2Flag = TRUE; - PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits = PtrCoding->BitsPerPixel * PtrCoding->PtrHeader->Header.Part3.S_20Bits * 64/8; - - - } - -/////////////////////////////////////////////////////////////////////////// - BlockCodingInfo = (BitPlaneBits *)calloc(PtrCoding->PtrHeader->Header.Part3.S_20Bits, sizeof(BitPlaneBits)); -*/ - /********************************* 2. DC and AC encoding *************************/ -/* - DCEncoding(PtrCoding, BlockString, BlockCodingInfo); - - if((PtrCoding->SegmentFull == FALSE) && // if (1) the segment is not full and (2) the DCstop is not true, continue AC coding. - // Otherwise jump to the codeline that update the header information, block counters, etc. - ( !((PtrCoding->PtrHeader->Header.Part2.DCstop == TRUE) && (PtrCoding->PtrHeader->Header.Part1.Part2Flag == TRUE)))) - { - ACBpeEncoding(PtrCoding, BlockCodingInfo); - free(BlockCodingInfo) ; - // Update the bitstream struct. - } - - if(PtrCoding->PtrHeader->Header.Part1.EngImgFlg == TRUE) - break; - - PtrCoding->BlockCounter += PtrCoding->PtrHeader->Header.Part3.S_20Bits; - HeaderUpdate(PtrCoding->PtrHeader); - - SegmentBufferFlushEncoder(PtrCoding); - PtrCoding->SegmentFull = FALSE; - - } -*/ -// *************************** 5. header information *****************************// -/* SegmentBufferFlushEncoder(PtrCoding); - for(i = 0; i < TotalBlocks * BLOCK_SIZE; i++) - free(BlockString[i]); - free(BlockString); - return ; -} - -void DecoderEngine(StructCodingPara * PtrCoding) -{ - UINT32 i = 0; - UINT32 j = 0; - UINT32 X = 0; - UINT32 Y = 0; - UINT32 TotalBlocks = 0; - - int **imgout_integercase = NULL; - float **imgout_floatingcase = NULL; - StructFreBlockString * StrFreBlockString = NULL; - StructFreBlockString *tempStr = NULL; - - - PtrCoding->Bits = (BitStream *)calloc(sizeof(BitStream), 1); - - if((PtrCoding->Bits->F_Bits = fopen(PtrCoding->InputFile, "rb")) == NULL) // default name - ErrorMsg(BPE_FILE_ERROR); - - HeaderReadin(PtrCoding); // read first header. - PtrCoding->ImageWidth = PtrCoding->PtrHeader->Header.Part4.ImageWidth_20Bits; - - if(PtrCoding->ImageWidth % BLOCK_SIZE != 0) - PtrCoding->PadCols_3Bits = BLOCK_SIZE - (PtrCoding->ImageWidth % 8 ); - else - PtrCoding->PadCols_3Bits = 0; - - StrFreBlockString = (StructFreBlockString *)calloc(sizeof(StructFreBlockString), 1); - StrFreBlockString->next = NULL; - StrFreBlockString->previous = NULL; - - TotalBlocks = 0; - for(;;) - { - BitPlaneBits * BlockCodingInfo; - BlockCodingInfo = (BitPlaneBits *)calloc(PtrCoding->PtrHeader->Header.Part3.S_20Bits, sizeof(BitPlaneBits)); - TotalBlocks += PtrCoding->PtrHeader->Header.Part3.S_20Bits; - - StrFreBlockString->FreqBlkString = (long **)calloc(PtrCoding->PtrHeader->Header.Part3.S_20Bits * BLOCK_SIZE,sizeof(long *)); - for(i = 0; i < PtrCoding->PtrHeader->Header.Part3.S_20Bits * BLOCK_SIZE; i++) - StrFreBlockString->FreqBlkString[i] = (long *)calloc(BLOCK_SIZE,sizeof(long)); - - - StrFreBlockString->FloatingFreqBlk = (float **)calloc(PtrCoding->PtrHeader->Header.Part3.S_20Bits * BLOCK_SIZE,sizeof(float *)); - for(i = 0; i < PtrCoding->PtrHeader->Header.Part3.S_20Bits * BLOCK_SIZE; i++) - StrFreBlockString->FloatingFreqBlk[i] = (float *)calloc(BLOCK_SIZE,sizeof(float)); - - StrFreBlockString->Blocks = PtrCoding->PtrHeader->Header.Part3.S_20Bits; - DCDeCoding(PtrCoding, StrFreBlockString, BlockCodingInfo); - ACBpeDecoding(PtrCoding, BlockCodingInfo) ; // This means the decoding process stops before segment limit. - AdjustOutPut(PtrCoding, BlockCodingInfo); - - // TempCoeffOutput(fdc, fac, BlockCodingInfo, PtrCoding); - - free(BlockCodingInfo); - SegmentBufferFlushDecoder(PtrCoding); - PtrCoding->SegmentFull = FALSE; - PtrCoding->RateReached = FALSE; - PtrCoding->DecodingStopLocations.BitPlaneStopDecoding = 0; - PtrCoding->BlockCounter += PtrCoding->PtrHeader->Header.Part3.S_20Bits; - if(PtrCoding->PtrHeader->Header.Part1.EngImgFlg == TRUE) - break; - if (PtrCoding->PtrHeader->Header.Part1.EngImgFlg != TRUE) - HeaderReadin(PtrCoding); // read second header. - tempStr = (StructFreBlockString *)calloc(sizeof(StructFreBlockString), 1); - (StrFreBlockString->next) = tempStr; - tempStr->previous = StrFreBlockString; - tempStr->next = NULL; - StrFreBlockString = StrFreBlockString->next; - } -*/ -// *************************** 5. header information *****************************// -/* - PtrCoding->ImageRows = TotalBlocks * 64 / (PtrCoding->ImageWidth + PtrCoding->PadCols_3Bits ); - - imgout_integercase = (int **)calloc(PtrCoding->ImageRows,sizeof(int *)); - for(i = 0; i < PtrCoding->ImageRows; i++) - imgout_integercase[i] = (int *)calloc((PtrCoding->ImageWidth + PtrCoding->PadCols_3Bits),sizeof(int)); - - imgout_floatingcase = (float **)calloc(PtrCoding->ImageRows,sizeof(float *)); - for(i = 0; i < PtrCoding->ImageRows; i++) - imgout_floatingcase[i] = (float *)calloc((PtrCoding->ImageWidth + PtrCoding->PadCols_3Bits),sizeof(float)); - - while(StrFreBlockString->previous != NULL) - StrFreBlockString = StrFreBlockString->previous; - do{ - UINT32 F_x = 0; - do - { - for( i = 0; i < BLOCK_SIZE; i++) - for( j = 0; j < BLOCK_SIZE; j++) - { - imgout_integercase[X + i][Y + j] = StrFreBlockString->FreqBlkString[F_x + i][j]; - imgout_floatingcase[X + i][Y + j] =StrFreBlockString->FloatingFreqBlk[F_x + i][j]; - } - - Y += BLOCK_SIZE; - - if( Y >= PtrCoding->ImageWidth) - { - Y = 0; - X += BLOCK_SIZE; - } - F_x += BLOCK_SIZE; - }while (F_x < StrFreBlockString->Blocks * BLOCK_SIZE); - - StrFreBlockString = StrFreBlockString->next; - }while(StrFreBlockString != NULL); - - if(PtrCoding->PtrHeader->Header.Part4.DWTType == INTEGER_WAVELET) - DecodingOutputInteger(PtrCoding, imgout_integercase); - else - DecodingOutputFloating(PtrCoding, imgout_floatingcase); - - fclose(PtrCoding->Bits->F_Bits); - free(imgout_integercase); - return; -} -*/ - -void Usage() -{ - fprintf(stderr, "/****************** Bit Plane Encoder Using Wavelet Transform ************/\n"); - fprintf(stderr, "bpe [-e]/[-d] [Input_file_name] [-o Output_file_name] [-r BitsPerPixel]\n"); - fprintf(stderr, "\nParameters: \n"); - fprintf(stderr, "[-e]: encoding filename; \n"); - fprintf(stderr, "[-d]: decoding filename; \n"); - fprintf(stderr, "[-o]: provide ouput file name. \n"); - fprintf(stderr, "[-r]: bits per pixel for encoding. (by default it is 0 and encoded to the last bitplane\n"); - fprintf(stderr, "[-w]: the number of pixels of each row. \n"); - fprintf(stderr, "[-h]: the number of pixels of each column. \n"); - fprintf(stderr, "[-b]: the number of bits of each pixel. By default it is 8.\n"); - fprintf(stderr, "[-f]: byte order of a pixel, if it consists of more than one bytes.\n 0 means litttle endian, 1 means big endian. Default value is 0.\n"); - fprintf(stderr, "[-t]: wavelet transform. 1 is integer 9-7 DWT and 0 is floating 9-7 DWT. By default it is integer DWT\n"); - fprintf(stderr, "[-s]: the number of blocks in each segment. By default it is 256.\n"); - fprintf(stderr, "eg 1: bpe -e sensin.img -o codes -r 1.0 -w 256 -h 256 -s 256 \n"); - fprintf(stderr, "eg 2: bpe -d codes -o ss.img \n"); - fprintf(stderr, "************* Author: Hongqiang Wang *******************************\n"); - fprintf(stderr, "************* Department of Electrical Engineering ********************\n"); - fprintf(stderr, "************* University of Nebraska -Lincoln **************************\n"); - fprintf(stderr, "************* March 9, 2008 ******************************************\n"); - fprintf(stderr, "/*******************************************************************\n"); - return; -} - -//Parameter Error Check -BOOL ParameterValidCheck(StructCodingPara *PtrCoding) -{ - if((PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits != 0) &&( PtrCoding->BitsPerPixel <= 0 )) - return FALSE; - - if ((PtrCoding->ImageWidth < IMAGE_WIDTH_MIN) || (PtrCoding->ImageWidth > IMAGE_WIDTH_MAX)) - return FALSE; - - if (PtrCoding->ImageRows < IMAGE_ROWS_MIN) - return FALSE; - - if (PtrCoding->PtrHeader->Header.Part3.S_20Bits < SEGMENT_S_MIN) - return FALSE; - - if((PtrCoding->BitsPerPixel < 0) || (PtrCoding->BitsPerPixel >16)) - return FALSE; - - return TRUE; -} - -void command_flag_menu() -{ - char i = 0; - long TotalPixels = 0; - char StringBuffer[100] = {""}; - - StructCodingPara *PtrCoding = NULL; - - BOOL BoolEnCoder = FALSE; - BOOL BoolDeCoder = FALSE ; - - time_t t0, t1; /* time_t defined in and as long */ - clock_t c0, c1; /* clock_t defined in and as int */ - - PtrCoding = (StructCodingPara *) calloc(sizeof(StructCodingPara), 1); - HeaderInilization(PtrCoding); - - - - do - { - char choice = 0; - fgets(&choice, 1, stdin); - scanf(&choice, "%d", &i); - switch (i) - { - case 'e': - BoolEnCoder = TRUE; // encoder. - strcpy(PtrCoding->InputFile, optarg); - break; - case 'd': - BoolDeCoder = TRUE; // decoder - strcpy(PtrCoding->InputFile, optarg); - break; - case 'o': - strcpy(PtrCoding->CodingOutputFile,optarg); - break; - case 'r': // coding BitsPerPixel, bits per pixels - strcpy(StringBuffer,optarg); - PtrCoding->BitsPerPixel = (float)atof(StringBuffer); - break; - case 'h': // row size - strcpy(StringBuffer, optarg); - PtrCoding->ImageRows = atoi(StringBuffer); - break; - case 'w': // col size - strcpy(StringBuffer, optarg); - PtrCoding->ImageWidth = atoi(StringBuffer); - break; - case 'f': // flip order. 0: little endian (LSB first) - // usually for intel processor, it is 0, the default value. - //, 1: big endian - // If it is 1, byte order will be changed later. - strcpy(StringBuffer, optarg); - PtrCoding->PixelByteOrder = atoi(StringBuffer); - break; - case 'b': // bit per pixel - strcpy(StringBuffer, optarg); - // PtrCoding->PtrHeader->Header.Part4.PixelBitDepth_4Bits = atoi(StringBuffer) * 8; - PtrCoding->PtrHeader->Header.Part4.PixelBitDepth_4Bits = atoi(StringBuffer) % 16; - break; - case 't': // type of wavelet transform - strcpy(StringBuffer, optarg); - PtrCoding->PtrHeader->Header.Part4.DWTType = atoi(StringBuffer); - break; - case 'g': // signed pixels or not - strcpy(StringBuffer, optarg); - PtrCoding->PtrHeader->Header.Part4.SignedPixels = atoi(StringBuffer); - if(PtrCoding->PtrHeader->Header.Part4.SignedPixels > 0) - PtrCoding->PtrHeader->Header.Part4.SignedPixels = TRUE; - else - PtrCoding->PtrHeader->Header.Part4.SignedPixels= FALSE; - break; - case 's': - strcpy(StringBuffer, optarg); - PtrCoding->PtrHeader->Header.Part3.S_20Bits = atoi(StringBuffer); - break; - - default: - Usage(); - strcpy(StringBuffer, "CodingInfo.txt"); - /* - if ((F_CodingInfo = fopen(StringBuffer,"w")) == NULL) - { - fprintf(stderr, "Cannot creat coding information file. \n"); - exit(0); - } - */ - ErrorMsg(BPE_INVALID_CODING_PARAMETERS); - } - }while(!EOF); - - if((BoolEnCoder && BoolDeCoder) || - ((!BoolEnCoder) && (!BoolDeCoder)) || - (strcmp(PtrCoding->CodingOutputFile, "") == 0) || // strcmp returns 0 if both stri ngs are identical. - (strcmp(PtrCoding->InputFile, "") == 0)) - { - strcat(StringBuffer, "En.txt"); - /* - if ((F_CodingInfo = fopen(StringBuffer,"w")) == NULL) - { - fprintf(stderr, "Cannot creat coding information file. \n"); - exit(0); - } - */ - Usage(); - ErrorMsg(BPE_INVALID_CODING_PARAMETERS); - } - if (BoolEnCoder == TRUE) - { - //store information to a text file. - strcpy(StringBuffer, PtrCoding->CodingOutputFile); - strcat(StringBuffer, "En.txt"); - /* - if ((F_CodingInfo = fopen(StringBuffer,"w")) == NULL) - { - fprintf(stderr, "Cannot creat coding information file. \n"); - exit(0); - } - */ - - if((PtrCoding->BitsPerPixel != 0) && PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits == 0) - { - PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits = - (PtrCoding->BitsPerPixel * PtrCoding->PtrHeader->Header.Part3.S_20Bits * 64/8); - } - - //check validility of the input parameters. - if (ParameterValidCheck(PtrCoding) == FALSE) - { - ErrorMsg(BPE_INVALID_CODING_PARAMETERS); - // DebugInfo( "\tBegin to encode...\n"); - } - - // record the encoding time. - t0 = time(NULL); - c0 = clock(); - EncoderEngine(PtrCoding); - c1 = clock(); - t1 = time(NULL); - - // DebugInfo( "\tEncoding Success!\n"); - // fprintf (stderr, "\telapsed CPU time: %f\n", (float) (c1 - c0)/CLOCKS_PER_SEC); - - TotalPixels = PtrCoding->ImageRows * PtrCoding->ImageWidth; - // fprintf(F_CodingInfo, "Success! %f ", (float) PtrCoding->Bits->TotalBitCounter/ TotalPixels); - } - - else if (BoolDeCoder == TRUE) - { - short TotalBitsPerpixel = 0; - //store information to a text file. - strcpy(StringBuffer, PtrCoding->CodingOutputFile); - strcat(StringBuffer, ".txt"); - - /* - if ((F_CodingInfo = fopen(StringBuffer,"w")) == NULL) - { - fprintf(stderr, "Cannot creat coding information file. \n"); - exit(0); - } - */ - - if(PtrCoding->BitsPerPixel < 0) - { - ErrorMsg(BPE_INVALID_CODING_PARAMETERS); - } - - // DebugInfo( "\tBegin to decode...\n"); - // record the decoding time. - t0 = time(NULL); - c0 = clock(); - DecoderEngine(PtrCoding); - c1 = clock(); - t1 = time(NULL); - - // DebugInfo( "\tDecoding Success!\n"); - // fprintf (stderr, "\telapsed CPU time: %f\n", (float) (c1 - c0)/CLOCKS_PER_SEC); - - TotalBitsPerpixel = PtrCoding->PtrHeader->Header.Part4.PixelBitDepth_4Bits; - if(TotalBitsPerpixel == 0) - { - TotalBitsPerpixel = 16; - } - - TotalPixels = PtrCoding->ImageRows * PtrCoding->ImageWidth; - - /* - fprintf(F_CodingInfo, "%s %f %d %d %d", "Success!", (float) PtrCoding->Bits->TotalBitCounter/ TotalPixels, - PtrCoding->ImageRows, PtrCoding->ImageWidth, TotalBitsPerpixel); - */ - } - free(PtrCoding); -} - -//attempted separate functions -/* -void main_encode() -{ - //store information to a text file. - strcpy(StringBuffer, PtrCoding->CodingOutputFile); - strcat(StringBuffer, "En.txt"); - *//* - if ((F_CodingInfo = fopen(StringBuffer,"w")) == NULL) - { - fprintf(stderr, "Cannot creat coding information file. \n"); - exit(0); - } - *//* - - if((PtrCoding->BitsPerPixel != 0) && PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits == 0) - { - PtrCoding->PtrHeader->Header.Part2.SegByteLimit_27Bits = - (PtrCoding->BitsPerPixel * PtrCoding->PtrHeader->Header.Part3.S_20Bits * 64/8); - } - - //check validility of the input parameters. - if (ParameterValidCheck(PtrCoding) == FALSE) - { - ErrorMsg(BPE_INVALID_CODING_PARAMETERS); - // DebugInfo( "\tBegin to encode...\n"); - } - - // record the encoding time. - t0 = time(NULL); - c0 = clock(); - EncoderEngine(PtrCoding); - c1 = clock(); - t1 = time(NULL); - - // DebugInfo( "\tEncoding Success!\n"); - // fprintf (stderr, "\telapsed CPU time: %f\n", (float) (c1 - c0)/CLOCKS_PER_SEC); - - TotalPixels = PtrCoding->ImageRows * PtrCoding->ImageWidth; - // fprintf(F_CodingInfo, "Success! %f ", (float) PtrCoding->Bits->TotalBitCounter/ TotalPixels); -} - - -void main_decode() -{ - short TotalBitsPerpixel = 0; - //store information to a text file. - strcpy(StringBuffer, PtrCoding->CodingOutputFile); - strcat(StringBuffer, ".txt"); - - *//* - if ((F_CodingInfo = fopen(StringBuffer,"w")) == NULL) - { - fprintf(stderr, "Cannot creat coding information file. \n"); - exit(0); - } - *//* - - if(PtrCoding->BitsPerPixel < 0) - { - ErrorMsg(BPE_INVALID_CODING_PARAMETERS); - } - - // DebugInfo( "\tBegin to decode...\n"); - // record the decoding time. - t0 = time(NULL); - c0 = clock(); - DecoderEngine(PtrCoding); - c1 = clock(); - t1 = time(NULL); - - // DebugInfo( "\tDecoding Success!\n"); - // fprintf (stderr, "\telapsed CPU time: %f\n", (float) (c1 - c0)/CLOCKS_PER_SEC); - - TotalBitsPerpixel = PtrCoding->PtrHeader->Header.Part4.PixelBitDepth_4Bits; - if(TotalBitsPerpixel == 0) - { - TotalBitsPerpixel = 16; - } - - TotalPixels = PtrCoding->ImageRows * PtrCoding->ImageWidth; - - //fprintf(F_CodingInfo, "%s %f %d %d %d", "Success!", (float) PtrCoding->Bits->TotalBitCounter/ TotalPixels, - // PtrCoding->ImageRows, PtrCoding->ImageWidth, TotalBitsPerpixel); - -} -*/ diff --git a/olaf/bpe/source/cfc.py b/olaf/bpe/source/cfc.py deleted file mode 100644 index 159e708e..00000000 --- a/olaf/bpe/source/cfc.py +++ /dev/null @@ -1,28 +0,0 @@ -# A simple program to convert raw cfc images to viewable file types -# Kyle Klein, Ryan Medick for OreSat - August 2023 - kleinky@pdx.edu - - -import numpy as np -import cv2 - -in_file = 'desena.img' -out_file = 'desena.png' - -# specify image file to convert in first open() parameter -with open(in_file, 'rb') as f: - raw = f.read() - -# reshape() parameters are for end image dimensions - -# data = np.frombuffer(raw, dtype=np.uint16).reshape(1024, 1280) -data = np.frombuffer(raw, dtype=np.uint16).reshape(128, 256) - -data = np.copy(data) # make the data editable - -# manipulate image for disaplaying -data //= 64 # scale 14-bits to 8-bits -data = data.astype(np.uint8) -data = np.invert(data) # invert black/white values - -# first parameter is end image file name -cv2.imwrite(out_file, data) diff --git a/olaf/bpe/source/errorhandle.c b/olaf/bpe/source/errorhandle.c old mode 100644 new mode 100755 index d41c1458..cb8deb54 --- a/olaf/bpe/source/errorhandle.c +++ b/olaf/bpe/source/errorhandle.c @@ -17,8 +17,8 @@ Nov. 3, 2006 #include #include #include -//#include "global.h" -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" //#define DEBUG const char *BpeErrorMsg[] = { diff --git a/olaf/bpe/source/global.h b/olaf/bpe/source/global.h index 0323c4ba..b4299cc3 100644 --- a/olaf/bpe/source/global.h +++ b/olaf/bpe/source/global.h @@ -289,7 +289,7 @@ typedef struct CODINGPARAMETERS UCHAR8 PixelByteOrder; // default byte order. 1 means LSB first. char InputFile[100]; char CodingOutputFile[100]; -} StructCodingPara; +}StructCodingPara; typedef struct BLOCKSTRING { @@ -300,7 +300,6 @@ typedef struct BLOCKSTRING struct BLOCKSTRING *previous; }StructFreBlockString; - void ErrorMsg(int err); void BitsOutput(StructCodingPara *, DWORD32 , int ); @@ -308,3 +307,55 @@ short BitsRead(StructCodingPara *, DWORD32 *, short ); //FILE *F_CodingInfo; +// extern functions +void BlockScanEncode(StructCodingPara *PtrCoding, BitPlaneBits *BlockInfo); +void StagesEnCoding(StructCodingPara *PtrCoding, BitPlaneBits *BlockInfo); +void StagesDeCoding(StructCodingPara *PtrCoding, BitPlaneBits *BlockInfo); +long DeConvTwosComp(DWORD32 complement, short leftmost); +void AdjustOutPut(StructCodingPara * PtrCoding, BitPlaneBits * BlockCodingInfo); +void CoeffDegroup(int **img_wav, int rows, int cols); +void CoeffDegroupFloating(float **img_wav, int rows, int cols); +void HeaderReadin(StructCodingPara *PtrCoding); +void DWT_Reverse(int **block, StructCodingPara *PtrCoding); +void DWT_ReverseFloating(float **block, StructCodingPara *PtrCoding); +short DCDeCoding(StructCodingPara *PtrCoding, StructFreBlockString *StrBlocks, + BitPlaneBits *BlockInfo); +void ACBpeDecoding(StructCodingPara *PtrCoding, BitPlaneBits *BlockCodingInfo); +void DWT_(StructCodingPara *, int **, int **); +void HeaderUpdate(HeaderStruct * ); +void DCEncoding(StructCodingPara *, long **, BitPlaneBits *); +void ACBpeEncoding(StructCodingPara *, BitPlaneBits *); +void DebugInfo(char *m); +// char InputFile[BUFFER_LENGTH], CodingOutputFile[BUFFER_LENGTH]; +void EncoderEngine(StructCodingPara * PtrCoding); +void DecoderEngine(StructCodingPara * PtrCoding); +void HeaderInilization(StructCodingPara *Ptr); +void HeaderOutput(StructCodingPara *PtrCoding); +void StagesEnCodingGaggles1(StructCodingPara *PtrCoding, BitPlaneBits *BlockInfo, + UCHAR8 BlocksInGaggles, UCHAR8 Option[], BOOL FlagCodeOptionOutput[]); + +void StagesEnCodingGaggles2(StructCodingPara *PtrCoding, BitPlaneBits *BlockInfo, + UCHAR8 BlocksInGaggles, UCHAR8 Option[], BOOL FlagCodeOptionOutput[]); + +void StagesEnCodingGaggles3(StructCodingPara *PtrCoding, BitPlaneBits *BlockInfo, + UCHAR8 BlocksInGaggles, UCHAR8 Option[], BOOL FlagCodeOptionOutput[]); + +void StagesDeCodingGaggles1(StructCodingPara *PtrCoding, BitPlaneBits *BlockCodingInfo, + UCHAR8 BlocksInGaggles, UCHAR8 *CodeOptionsAllGaggles, BOOL *FlagCodeOptionOutput); + +void StagesDeCodingGaggles2(StructCodingPara *PtrCoding, BitPlaneBits *BlockCodingInfo, + UCHAR8 BlocksInGaggles, UCHAR8 *CodeOptionsAllGaggles, BOOL *FlagCodeOptionOutput); + +void StagesDeCodingGaggles3(StructCodingPara *PtrCoding, BitPlaneBits *BlockCodingInfo, + UCHAR8 BlocksInGaggles, UCHAR8 *CodeOptionsAllGaggles, BOOL *FlagCodeOptionOutput); + +void RiceCoding(short InputVal,short BitLength, UCHAR8 *Option, StructCodingPara *PtrCoding); +void BitPlaneSymbolReset(StrSymbolDetails *SymbolStr); +void RiceDecoding(DWORD32 *decoded, short BitLength, UCHAR8 *splitOption, StructCodingPara *Ptr); +void DeMappingPattern(StrSymbolDetails *StrSymbol); +void DebugInfo(char *m); +void CoeffRegroupF97(float **TransformedImage, int rows, int cols); +void CoeffRegroup(int **TransformedImage, int rows, int cols); +void DWT_f97_2D(float **rows, int ImgCols, int ImgRows, int levels, BOOL inverse); +void lifting_M97_2D(int **rows, UINT32 ImgCols, UINT32 ImgRows, UINT32 levels, BOOL inverse); +void lifting_f97_2D(float **rows, int ImgCols, int ImgRows, int levels, BOOL inverse); diff --git a/olaf/bpe/source/header.c b/olaf/bpe/source/header.c old mode 100644 new mode 100755 index 3bb4f8c9..365195d9 --- a/olaf/bpe/source/header.c +++ b/olaf/bpe/source/header.c @@ -17,7 +17,8 @@ Nov. 3, 2006 #include #include -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" void HeaderInilization(StructCodingPara *Ptr) diff --git a/olaf/bpe/source/lifting_97M.c b/olaf/bpe/source/lifting_97M.c old mode 100644 new mode 100755 index 598af4c9..c4ee8477 --- a/olaf/bpe/source/lifting_97M.c +++ b/olaf/bpe/source/lifting_97M.c @@ -16,8 +16,8 @@ Nov. 3, 2006 */ #include #include -//#include "global.h" -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" #define F_EXTPAD 4 #define D_EXTPAD 2 @@ -46,7 +46,7 @@ void forwardf97M(int *x_in, } half = (N>>1); - d = malloc(sizeof(int)*(half + 1)); + d = (int *)malloc(sizeof(int)*(half + 1)); temp_0 = d; for (n=half + 1;n > 0; n--) @@ -64,7 +64,7 @@ void forwardf97M(int *x_in, x += 2; } d = temp_0; - r = malloc(sizeof(int)*(half)); + r = (int *)malloc(sizeof(int)*(half)); temp_1 = r; x = x_alloc + F_EXTPAD; for (n=half;n> 0; n--) @@ -115,10 +115,10 @@ void inversef97M(int *x, int N) memcpy(r,x,half*sizeof(int)); memcpy(d,x+half,half*sizeof(int)); - x_0 = malloc(sizeof(int)*(half + 3)); + x_0 = (int *)malloc(sizeof(int)*(half + 3)); temp_0 = x_0; - x_1 = malloc(sizeof(int)*(half + 2)); + x_1 = (int *)malloc(sizeof(int)*(half + 2)); temp_1 = x_1; d0 = d; @@ -192,11 +192,7 @@ void inversef97M(int *x, int N) free(temp_0); } -void lifting_M97_2D(int **rows, - int ImgRows, - int ImgCols, - int levels, - BOOL inverse) +void lifting_M97_2D(int **rows, UINT32 ImgRows, UINT32 ImgCols, UINT32 levels, BOOL inverse) { int x; int y; @@ -213,7 +209,7 @@ void lifting_M97_2D(int **rows, ErrorMsg(BPE_FILE_ERROR); } - if ( (x_alloc = malloc(sizeof(int)*(ImgCols+ImgRows+F_EXTPAD+F_EXTPAD))) == NULL ) { + if ( (x_alloc = (int *)malloc(sizeof(int)*(ImgCols+ImgRows+F_EXTPAD+F_EXTPAD))) == NULL ) { ErrorMsg(BPE_MEM_ERROR); } else @@ -224,7 +220,7 @@ void lifting_M97_2D(int **rows, /* Allocate a work array (for transposing columns) */ - if ( (buffer = calloc(ImgRows, sizeof(int))) == NULL ) { + if ( (buffer = (int *)calloc(ImgRows, sizeof(int))) == NULL ) { ErrorMsg(BPE_MEM_ERROR); } else diff --git a/olaf/bpe/source/lifting_97f.c b/olaf/bpe/source/lifting_97f.c old mode 100644 new mode 100755 index 6c8a4de3..6cd4436e --- a/olaf/bpe/source/lifting_97f.c +++ b/olaf/bpe/source/lifting_97f.c @@ -16,8 +16,8 @@ Nov. 3, 2006 */ #include #include -//#include "global.h" -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" #define F_EXTPAD 4 #define D_EXTPAD 2 @@ -97,8 +97,8 @@ void forwardf97f(float *x_in, half = (N >> 1); - d = malloc(sizeof(float)*(half + 3)); - r = malloc(sizeof(float)*(half + 2)); + d = (float *)malloc(sizeof(float)*(half + 3)); + r = (float *)malloc(sizeof(float)*(half + 2)); for(i = 1; i <= F_EXTPAD; i++) { @@ -222,7 +222,7 @@ void lifting_f97_2D(float **rows, ErrorMsg(BPE_FILE_ERROR); } - if ( (x_alloc = malloc(sizeof(float)*(ImgCols+ImgRows+F_EXTPAD+F_EXTPAD))) == NULL ) { + if ( (x_alloc = (float *)malloc(sizeof(float)*(ImgCols+ImgRows+F_EXTPAD+F_EXTPAD))) == NULL ) { ErrorMsg(BPE_MEM_ERROR); } else @@ -233,7 +233,7 @@ void lifting_f97_2D(float **rows, /* Allocate a work array (for transposing columns) */ - if ( (buffer = calloc(ImgRows, sizeof(float))) == NULL ) { + if ( (buffer = (float *)calloc(ImgRows, sizeof(float))) == NULL ) { ErrorMsg(BPE_MEM_ERROR); } else diff --git a/olaf/bpe/source/main_pybind.h b/olaf/bpe/source/main_pybind.h old mode 100644 new mode 100755 diff --git a/olaf/bpe/source/makefile b/olaf/bpe/source/makefile old mode 100644 new mode 100755 index db9d6c80..85e4f82c --- a/olaf/bpe/source/makefile +++ b/olaf/bpe/source/makefile @@ -1,19 +1,19 @@ -# CCSDS image compression standard makefile for usage compiling as C code +# CCSDS image compression standard makefile for compiling C source code # adapted from Dr Aaron Kiley's work for UNL -# Kyle Klein for OreSat - August 2023 - kleinky@pdx.edu # Currently raises warnings # Compiler: #CC = gcc +CXX = g++ BPEFLAGS = -O2 -c -Wall BPEFILES = AC_BitPlaneCoding.c StagesCodingGaggles.c header.c AdjustOutput.c bitsIO.c lifting_97M.c BPEBlockCoding.c bpe_decoder.c lifting_97f.c CoeffGroup.c bpe_encoder.c bpe_main.c DC_EnDeCoding.c errorhandle.c ricecoding.c PatternCoding.c waveletbpe.c bpe: ${BPEFILES} - ${CC} ${BPEFLAGS} ${BPEFILES} - ${CC} *.o -o bpe -lm + ${CXX} ${BPEFLAGS} ${BPEFILES} + ${CXX} *.o -o bpe -lm rm AC_BitPlaneCoding.o DC_EnDeCoding.o bpe_decoder.o header.o ricecoding.o AdjustOutput.o PatternCoding.o bpe_encoder.o lifting_97M.o waveletbpe.o BPEBlockCoding.o StagesCodingGaggles.o errorhandle.o lifting_97f.o CoeffGroup.o bitsIO.o bpe_main.o # Linker: diff --git a/olaf/bpe/source/pixel_check.py b/olaf/bpe/source/pixel_check.py deleted file mode 100644 index efb8545e..00000000 --- a/olaf/bpe/source/pixel_check.py +++ /dev/null @@ -1,30 +0,0 @@ -# pixel_check.py: a simple program for comparing/checking each pixel in identical images -# **currently has only been tested on PNG image types -# Kyle Klein for OreSat - August 2023 - kleinky@pdx.edu -# adapted from: -# https://stackoverflow.com/questions/62285511/use-numpy-to-quickly-iterate-over-pixels - -import numpy as np -from PIL import Image - -# user input file names -image1 = Image.open('filename1.png') -image2 = Image.open('filename2.png') - -im1 = (image1).load() -im2 = (image2).load() - -height, width = np.shape(image1) - -# as alternative, next line can help with: 'ValueError: too many values to unpack' -# height, width, _ = np.shape(image1) - -# comparison loop -for i in range(width): - for j in range(height): - pixel_val1 = im1[i, j] - pixel_val2 = im2[i, j] - if pixel_val1 != pixel_val2: - print(f"Found pixel {pixel_val2} at {i, j} does not match") - -print('scan complete') diff --git a/olaf/bpe/source/ricecoding.c b/olaf/bpe/source/ricecoding.c old mode 100644 new mode 100755 index ec51e30e..c0f3bc4f --- a/olaf/bpe/source/ricecoding.c +++ b/olaf/bpe/source/ricecoding.c @@ -17,8 +17,8 @@ Nov. 3, 2006 #include #include -//#include "global.h" -#include "main_pybind.h" +#include "global.h" +//#include "main_pybind.h" void RiceCoding(short InputVal, diff --git a/olaf/bpe/source/tailor.h b/olaf/bpe/source/tailor.h old mode 100644 new mode 100755 diff --git a/olaf/bpe/source/waveletbpe.c b/olaf/bpe/source/waveletbpe.c old mode 100644 new mode 100755 index ecdba4e0..10d6cdee --- a/olaf/bpe/source/waveletbpe.c +++ b/olaf/bpe/source/waveletbpe.c @@ -16,34 +16,9 @@ Nov. 3, 2006 */ #include -//#include "global.h" -#include "main_pybind.h" - -extern void CoeffRegroupF97(float **TransformedImage, - int rows, - int cols); - -extern void CoeffRegroup(int **TransformedImage, - int rows, - int cols); - -extern void DWT_f97_2D(float **rows, - int ImgCols, - int ImgRows, - int levels, - BOOL inverse); - -extern void lifting_M97_2D(int **rows, - UINT32 ImgCols, - UINT32 ImgRows, - UINT32 levels, - BOOL inverse); - -extern void lifting_f97_2D(float **rows, - int ImgCols, - int ImgRows, - int levels, - BOOL inverse); +#include "global.h" +//#include "main_pybind.h" + void CoefficientsRescaling(int **transformed, UINT32 Rows, @@ -217,8 +192,8 @@ void DWT_(StructCodingPara *PtrCoding, { int i = 0; int j = 0; - int PadRows = 0; - int PadCols = 0; + UINT32 PadRows = 0; + UINT32 PadCols = 0; PadRows = PtrCoding->ImageRows + PtrCoding->PtrHeader->Header.Part1.PadRows_3Bits; PadCols = PtrCoding->ImageWidth+ PtrCoding->PadCols_3Bits; diff --git a/olaf/bpe/test.py b/olaf/bpe/test.py index ae6feeb3..fee2ffc3 100644 --- a/olaf/bpe/test.py +++ b/olaf/bpe/test.py @@ -1,4 +1,4 @@ import bpe -bpe.usage() +bpe.Usage() bpe.command_flag_menu()