• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

DataCompressor.cpp

Go to the documentation of this file.
00001 #include "DataCompressor.h"
00002 #include "DS_HuffmanEncodingTree.h"
00003 #include "RakAssert.h"
00004 #include <string.h> // Use string.h rather than memory.h for a console
00005 
00006 void DataCompressor::Compress( unsigned char *userData, unsigned sizeInBytes, RakNet::BitStream * output )
00007 {
00008         // Don't use this for small files as you will just make them bigger!
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); // Dummy value
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); // Go back and write how many bits were used for the encoding
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                 // Read error
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 }

Generated on Thu Sep 30 2010 01:27:22 for RakNet by  doxygen 1.7.1