Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/RangeCoder/RangeCoderBitTree.h, revision 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>