1 // Compress/RangeCoder/RangeCoderBitTree.h
\r
3 #ifndef __COMPRESS_RANGECODER_BIT_TREE_H
\r
4 #define __COMPRESS_RANGECODER_BIT_TREE_H
\r
6 #include "RangeCoderBit.h"
\r
7 #include "RangeCoderOpt.h"
\r
9 namespace NCompress {
\r
10 namespace NRangeCoder {
\r
12 template <int numMoveBits, int NumBitLevels>
\r
13 class CBitTreeEncoder
\r
15 CBitEncoder<numMoveBits> Models[1 << NumBitLevels];
\r
19 for(UInt32 i = 1; i < (1 << NumBitLevels); i++)
\r
22 void Encode(CEncoder *rangeEncoder, UInt32 symbol)
\r
24 UInt32 modelIndex = 1;
\r
25 for (int bitIndex = NumBitLevels; bitIndex != 0 ;)
\r
28 UInt32 bit = (symbol >> bitIndex) & 1;
\r
29 Models[modelIndex].Encode(rangeEncoder, bit);
\r
30 modelIndex = (modelIndex << 1) | bit;
\r
33 void ReverseEncode(CEncoder *rangeEncoder, UInt32 symbol)
\r
35 UInt32 modelIndex = 1;
\r
36 for (int i = 0; i < NumBitLevels; i++)
\r
38 UInt32 bit = symbol & 1;
\r
39 Models[modelIndex].Encode(rangeEncoder, bit);
\r
40 modelIndex = (modelIndex << 1) | bit;
\r
44 UInt32 GetPrice(UInt32 symbol) const
\r
46 symbol |= (1 << NumBitLevels);
\r
50 price += Models[symbol >> 1].GetPrice(symbol & 1);
\r
55 UInt32 ReverseGetPrice(UInt32 symbol) const
\r
58 UInt32 modelIndex = 1;
\r
59 for (int i = NumBitLevels; i != 0; i--)
\r
61 UInt32 bit = symbol & 1;
\r
63 price += Models[modelIndex].GetPrice(bit);
\r
64 modelIndex = (modelIndex << 1) | bit;
\r
70 template <int numMoveBits, int NumBitLevels>
\r
71 class CBitTreeDecoder
\r
73 CBitDecoder<numMoveBits> Models[1 << NumBitLevels];
\r
77 for(UInt32 i = 1; i < (1 << NumBitLevels); i++)
\r
80 UInt32 Decode(CDecoder *rangeDecoder)
\r
82 UInt32 modelIndex = 1;
\r
84 for(int bitIndex = NumBitLevels; bitIndex != 0; bitIndex--)
\r
86 // modelIndex = (modelIndex << 1) + Models[modelIndex].Decode(rangeDecoder);
\r
87 RC_GETBIT(numMoveBits, Models[modelIndex].Prob, modelIndex)
\r
90 return modelIndex - (1 << NumBitLevels);
\r
92 UInt32 ReverseDecode(CDecoder *rangeDecoder)
\r
94 UInt32 modelIndex = 1;
\r
97 for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
\r
99 // UInt32 bit = Models[modelIndex].Decode(rangeDecoder);
\r
100 // modelIndex <<= 1;
\r
101 // modelIndex += bit;
\r
102 // symbol |= (bit << bitIndex);
\r
103 RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex))
\r
110 template <int numMoveBits>
\r
111 void ReverseBitTreeEncode(CBitEncoder<numMoveBits> *Models,
\r
112 CEncoder *rangeEncoder, int NumBitLevels, UInt32 symbol)
\r
114 UInt32 modelIndex = 1;
\r
115 for (int i = 0; i < NumBitLevels; i++)
\r
117 UInt32 bit = symbol & 1;
\r
118 Models[modelIndex].Encode(rangeEncoder, bit);
\r
119 modelIndex = (modelIndex << 1) | bit;
\r
124 template <int numMoveBits>
\r
125 UInt32 ReverseBitTreeGetPrice(CBitEncoder<numMoveBits> *Models,
\r
126 UInt32 NumBitLevels, UInt32 symbol)
\r
129 UInt32 modelIndex = 1;
\r
130 for (int i = NumBitLevels; i != 0; i--)
\r
132 UInt32 bit = symbol & 1;
\r
134 price += Models[modelIndex].GetPrice(bit);
\r
135 modelIndex = (modelIndex << 1) | bit;
\r
140 template <int numMoveBits>
\r
141 UInt32 ReverseBitTreeDecode(CBitDecoder<numMoveBits> *Models,
\r
142 CDecoder *rangeDecoder, int NumBitLevels)
\r
144 UInt32 modelIndex = 1;
\r
147 for(int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
\r
149 // UInt32 bit = Models[modelIndex].Decode(rangeDecoder);
\r
150 // modelIndex <<= 1;
\r
151 // modelIndex += bit;
\r
152 // symbol |= (bit << bitIndex);
\r
153 RC_GETBIT2(numMoveBits, Models[modelIndex].Prob, modelIndex, ; , symbol |= (1 << bitIndex))
\r