Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/RangeCoder/RangeCoderBitTree.h, revision 1.1.1.1

1.1       misho       1: // Compress/RangeCoder/RangeCoderBitTree.h
                      2: 
                      3: #ifndef __COMPRESS_RANGECODER_BIT_TREE_H
                      4: #define __COMPRESS_RANGECODER_BIT_TREE_H
                      5: 
                      6: #include "RangeCoderBit.h"
                      7: #include "RangeCoderOpt.h"
                      8: 
                      9: namespace NCompress {
                     10: namespace NRangeCoder {
                     11: 
                     12: template <int numMoveBits, int NumBitLevels>
                     13: class CBitTreeEncoder
                     14: {
                     15:   CBitEncoder<numMoveBits> Models[1 << NumBitLevels];
                     16: public:
                     17:   void Init()
                     18:   {
                     19:     for(UInt32 i = 1; i < (1 << NumBitLevels); i++)
                     20:       Models[i].Init();
                     21:   }
                     22:   void Encode(CEncoder *rangeEncoder, UInt32 symbol)
                     23:   {
                     24:     UInt32 modelIndex = 1;
                     25:     for (int bitIndex = NumBitLevels; bitIndex != 0 ;)
                     26:     {
                     27:       bitIndex--;
                     28:       UInt32 bit = (symbol >> bitIndex) & 1;
                     29:       Models[modelIndex].Encode(rangeEncoder, bit);
                     30:       modelIndex = (modelIndex << 1) | bit;
                     31:     }
                     32:   };
                     33:   void ReverseEncode(CEncoder *rangeEncoder, UInt32 symbol)
                     34:   {
                     35:     UInt32 modelIndex = 1;
                     36:     for (int i = 0; i < NumBitLevels; i++)
                     37:     {
                     38:       UInt32 bit = symbol & 1;
                     39:       Models[modelIndex].Encode(rangeEncoder, bit);
                     40:       modelIndex = (modelIndex << 1) | bit;
                     41:       symbol >>= 1;
                     42:     }
                     43:   }
                     44:   UInt32 GetPrice(UInt32 symbol) const
                     45:   {
                     46:     symbol |= (1 << NumBitLevels);
                     47:     UInt32 price = 0;
                     48:     while (symbol != 1)
                     49:     {
                     50:       price += Models[symbol >> 1].GetPrice(symbol & 1);
                     51:       symbol >>= 1;
                     52:     }
                     53:     return price;
                     54:   }
                     55:   UInt32 ReverseGetPrice(UInt32 symbol) const
                     56:   {
                     57:     UInt32 price = 0;
                     58:     UInt32 modelIndex = 1;
                     59:     for (int i = NumBitLevels; i != 0; i--)
                     60:     {
                     61:       UInt32 bit = symbol & 1;
                     62:       symbol >>= 1;
                     63:       price += Models[modelIndex].GetPrice(bit);
                     64:       modelIndex = (modelIndex << 1) | bit;
                     65:     }
                     66:     return price;
                     67:   }
                     68: };
                     69: 
                     70: template <int numMoveBits, int NumBitLevels>
                     71: class CBitTreeDecoder
                     72: {
                     73:   CBitDecoder<numMoveBits> Models[1 << NumBitLevels];
                     74: public:
                     75:   void Init()
                     76:   {
                     77:     for(UInt32 i = 1; i < (1 << NumBitLevels); i++)
                     78:       Models[i].Init();
                     79:   }
                     80:   UInt32 Decode(CDecoder *rangeDecoder)
                     81:   {
                     82:     UInt32 modelIndex = 1;
                     83:     RC_INIT_VAR
                     84:     for(int bitIndex = NumBitLevels; bitIndex != 0; bitIndex--)
                     85:     {
                     86:       // modelIndex = (modelIndex << 1) + Models[modelIndex].Decode(rangeDecoder);
                     87:       RC_GETBIT(numMoveBits, Models[modelIndex].Prob, modelIndex)
                     88:     }
                     89:     RC_FLUSH_VAR
                     90:     return modelIndex - (1 << NumBitLevels);
                     91:   };
                     92:   UInt32 ReverseDecode(CDecoder *rangeDecoder)
                     93:   {
                     94:     UInt32 modelIndex = 1;
                     95:     UInt32 symbol = 0;
                     96:     RC_INIT_VAR
                     97:     for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
                     98:     {
                     99:       // UInt32 bit = Models[modelIndex].Decode(rangeDecoder);
                    100:       // modelIndex <<= 1;
                    101:       // modelIndex += bit;
                    102:       // symbol |= (bit << bitIndex);
                    103:       RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex))
                    104:     }
                    105:     RC_FLUSH_VAR
                    106:     return symbol;
                    107:   }
                    108: };
                    109: 
                    110: template <int numMoveBits>
                    111: void ReverseBitTreeEncode(CBitEncoder<numMoveBits> *Models, 
                    112:     CEncoder *rangeEncoder, int NumBitLevels, UInt32 symbol)
                    113: {
                    114:   UInt32 modelIndex = 1;
                    115:   for (int i = 0; i < NumBitLevels; i++)
                    116:   {
                    117:     UInt32 bit = symbol & 1;
                    118:     Models[modelIndex].Encode(rangeEncoder, bit);
                    119:     modelIndex = (modelIndex << 1) | bit;
                    120:     symbol >>= 1;
                    121:   }
                    122: }
                    123: 
                    124: template <int numMoveBits>
                    125: UInt32 ReverseBitTreeGetPrice(CBitEncoder<numMoveBits> *Models, 
                    126:     UInt32 NumBitLevels, UInt32 symbol)
                    127: {
                    128:   UInt32 price = 0;
                    129:   UInt32 modelIndex = 1;
                    130:   for (int i = NumBitLevels; i != 0; i--)
                    131:   {
                    132:     UInt32 bit = symbol & 1;
                    133:     symbol >>= 1;
                    134:     price += Models[modelIndex].GetPrice(bit);
                    135:     modelIndex = (modelIndex << 1) | bit;
                    136:   }
                    137:   return price;
                    138: }
                    139: 
                    140: template <int numMoveBits>
                    141: UInt32 ReverseBitTreeDecode(CBitDecoder<numMoveBits> *Models, 
                    142:     CDecoder *rangeDecoder, int NumBitLevels)
                    143: {
                    144:   UInt32 modelIndex = 1;
                    145:   UInt32 symbol = 0;
                    146:   RC_INIT_VAR
                    147:   for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
                    148:   {
                    149:     // UInt32 bit = Models[modelIndex].Decode(rangeDecoder);
                    150:     // modelIndex <<= 1;
                    151:     // modelIndex += bit;
                    152:     // symbol |= (bit << bitIndex);
                    153:     RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex))
                    154:   }
                    155:   RC_FLUSH_VAR
                    156:   return symbol;
                    157: }
                    158: 
                    159: }}
                    160: 
                    161: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>