00001 00032 #ifndef LL_BITPACK_H 00033 #define LL_BITPACK_H 00034 00035 #include "llerror.h" 00036 00037 const U32 MAX_DATA_BITS = 8; 00038 00039 00040 class LLBitPack 00041 { 00042 public: 00043 LLBitPack(U8 *buffer, U32 max_size) : mBuffer(buffer), mBufferSize(0), mLoad(0), mLoadSize(0), mTotalBits(0), mMaxSize(max_size) 00044 { 00045 } 00046 00047 ~LLBitPack() 00048 { 00049 } 00050 00051 void resetBitPacking() 00052 { 00053 mLoad = 0; 00054 mLoadSize = 0; 00055 mTotalBits = 0; 00056 mBufferSize = 0; 00057 } 00058 00059 U32 bitPack(U8 *total_data, U32 total_dsize) 00060 { 00061 U32 dsize; 00062 U8 data; 00063 00064 while (total_dsize > 0) 00065 { 00066 if (total_dsize > MAX_DATA_BITS) 00067 { 00068 dsize = MAX_DATA_BITS; 00069 total_dsize -= MAX_DATA_BITS; 00070 } 00071 else 00072 { 00073 dsize = total_dsize; 00074 total_dsize = 0; 00075 } 00076 00077 data = *total_data++; 00078 00079 data <<= (MAX_DATA_BITS - dsize); 00080 while (dsize > 0) 00081 { 00082 if (mLoadSize == MAX_DATA_BITS) 00083 { 00084 *(mBuffer + mBufferSize++) = mLoad; 00085 if (mBufferSize > mMaxSize) 00086 { 00087 llerror("mBufferSize exceeding mMaxSize!", 0); 00088 } 00089 mLoadSize = 0; 00090 mLoad = 0x00; 00091 } 00092 mLoad <<= 1; 00093 mLoad |= (data >> (MAX_DATA_BITS - 1)); 00094 data <<= 1; 00095 mLoadSize++; 00096 mTotalBits++; 00097 dsize--; 00098 } 00099 } 00100 return mBufferSize; 00101 } 00102 00103 U32 bitCopy(U8 *total_data, U32 total_dsize) 00104 { 00105 U32 dsize; 00106 U8 data; 00107 00108 while (total_dsize > 0) 00109 { 00110 if (total_dsize > MAX_DATA_BITS) 00111 { 00112 dsize = MAX_DATA_BITS; 00113 total_dsize -= MAX_DATA_BITS; 00114 } 00115 else 00116 { 00117 dsize = total_dsize; 00118 total_dsize = 0; 00119 } 00120 00121 data = *total_data++; 00122 00123 while (dsize > 0) 00124 { 00125 if (mLoadSize == MAX_DATA_BITS) 00126 { 00127 *(mBuffer + mBufferSize++) = mLoad; 00128 if (mBufferSize > mMaxSize) 00129 { 00130 llerror("mBufferSize exceeding mMaxSize!", 0); 00131 } 00132 mLoadSize = 0; 00133 mLoad = 0x00; 00134 } 00135 mLoad <<= 1; 00136 mLoad |= (data >> (MAX_DATA_BITS - 1)); 00137 data <<= 1; 00138 mLoadSize++; 00139 mTotalBits++; 00140 dsize--; 00141 } 00142 } 00143 return mBufferSize; 00144 } 00145 00146 U32 bitUnpack(U8 *total_retval, U32 total_dsize) 00147 { 00148 U32 dsize; 00149 U8 *retval; 00150 00151 while (total_dsize > 0) 00152 { 00153 if (total_dsize > MAX_DATA_BITS) 00154 { 00155 dsize = MAX_DATA_BITS; 00156 total_dsize -= MAX_DATA_BITS; 00157 } 00158 else 00159 { 00160 dsize = total_dsize; 00161 total_dsize = 0; 00162 } 00163 00164 retval = total_retval++; 00165 *retval = 0x00; 00166 while (dsize > 0) 00167 { 00168 if (mLoadSize == 0) 00169 { 00170 #ifdef _DEBUG 00171 if (mBufferSize > mMaxSize) 00172 { 00173 llerrs << "mBufferSize exceeding mMaxSize" << llendl; 00174 llerrs << mBufferSize << " > " << mMaxSize << llendl; 00175 } 00176 #endif 00177 mLoad = *(mBuffer + mBufferSize++); 00178 mLoadSize = MAX_DATA_BITS; 00179 } 00180 *retval <<= 1; 00181 *retval |= (mLoad >> (MAX_DATA_BITS - 1)); 00182 mLoadSize--; 00183 mLoad <<= 1; 00184 dsize--; 00185 } 00186 } 00187 return mBufferSize; 00188 } 00189 00190 U32 flushBitPack() 00191 { 00192 if (mLoadSize) 00193 { 00194 mLoad <<= (MAX_DATA_BITS - mLoadSize); 00195 *(mBuffer + mBufferSize++) = mLoad; 00196 if (mBufferSize > mMaxSize) 00197 { 00198 llerror("mBufferSize exceeding mMaxSize!", 0); 00199 } 00200 mLoadSize = 0; 00201 } 00202 return mBufferSize; 00203 } 00204 00205 U8 *mBuffer; 00206 U32 mBufferSize; 00207 U8 mLoad; 00208 U32 mLoadSize; 00209 U32 mTotalBits; 00210 U32 mMaxSize; 00211 }; 00212 00213 #endif