Go to the documentation of this file.00001 #include "DataCompressor.h"
00002 #include "DS_HuffmanEncodingTree.h"
00003 #include "RakAssert.h"
00004 #include <string.h>
00005
00006 void DataCompressor::Compress( unsigned char *userData, unsigned sizeInBytes, RakNet::BitStream * output )
00007 {
00008
00009 RakAssert(sizeInBytes > 2048);
00010
00011 unsigned int frequencyTable[ 256 ];
00012 unsigned int i;
00013 memset(frequencyTable,0,256*sizeof(unsigned int));
00014 for (i=0; i < sizeInBytes; i++)
00015 ++frequencyTable[userData[i]];
00016 HuffmanEncodingTree tree;
00017 BitSize_t writeOffset1, writeOffset2, bitsUsed1, bitsUsed2;
00018 tree.GenerateFromFrequencyTable(frequencyTable);
00019 output->WriteCompressed(sizeInBytes);
00020 for (i=0; i < 256; i++)
00021 output->WriteCompressed(frequencyTable[i]);
00022 output->AlignWriteToByteBoundary();
00023 writeOffset1=output->GetWriteOffset();
00024 output->Write((unsigned int)0);
00025 bitsUsed1=output->GetNumberOfBitsUsed();
00026 tree.EncodeArray(userData, sizeInBytes, output);
00027 bitsUsed2=output->GetNumberOfBitsUsed();
00028 writeOffset2=output->GetWriteOffset();
00029 output->SetWriteOffset(writeOffset1);
00030 output->Write(bitsUsed2-bitsUsed1);
00031 output->SetWriteOffset(writeOffset2);
00032 }
00033
00034 unsigned DataCompressor::DecompressAndAllocate( RakNet::BitStream * input, unsigned char **output )
00035 {
00036 HuffmanEncodingTree tree;
00037 unsigned int bitsUsed, destinationSizeInBytes;
00038 unsigned int decompressedBytes;
00039 unsigned int frequencyTable[ 256 ];
00040 unsigned i;
00041
00042 input->ReadCompressed(destinationSizeInBytes);
00043 for (i=0; i < 256; i++)
00044 input->ReadCompressed(frequencyTable[i]);
00045 input->AlignReadToByteBoundary();
00046 if (input->Read(bitsUsed)==false)
00047 {
00048
00049 #ifdef _DEBUG
00050 RakAssert(0);
00051 #endif
00052 return 0;
00053 }
00054 *output = (unsigned char*) rakMalloc_Ex(destinationSizeInBytes, __FILE__, __LINE__);
00055 tree.GenerateFromFrequencyTable(frequencyTable);
00056 decompressedBytes=tree.DecodeArray(input, bitsUsed, destinationSizeInBytes, *output );
00057 RakAssert(decompressedBytes==destinationSizeInBytes);
00058 return destinationSizeInBytes;
00059 }