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