RT-AC66 3.0.0.4.374.130 core
[tomato.git] / release / src-rt-6.x / linux / linux-2.6 / scripts / squashfs / lzma / CS / 7zip / Compress / RangeCoder / RangeCoderBitTree.cs
blob3309c14a50ce2036e1db3b8928e91078804dfb25
1 using System;
3 namespace SevenZip.Compression.RangeCoder
5 struct BitTreeEncoder
7 BitEncoder[] Models;
8 int NumBitLevels;
10 public BitTreeEncoder(int numBitLevels)
12 NumBitLevels = numBitLevels;
13 Models = new BitEncoder[1 << numBitLevels];
16 public void Init()
18 for (uint i = 1; i < (1 << NumBitLevels); i++)
19 Models[i].Init();
22 public void Encode(Encoder rangeEncoder, UInt32 symbol)
24 UInt32 m = 1;
25 for (int bitIndex = NumBitLevels; bitIndex > 0; )
27 bitIndex--;
28 UInt32 bit = (symbol >> bitIndex) & 1;
29 Models[m].Encode(rangeEncoder, bit);
30 m = (m << 1) | bit;
34 public void ReverseEncode(Encoder rangeEncoder, UInt32 symbol)
36 UInt32 m = 1;
37 for (UInt32 i = 0; i < NumBitLevels; i++)
39 UInt32 bit = symbol & 1;
40 Models[m].Encode(rangeEncoder, bit);
41 m = (m << 1) | bit;
42 symbol >>= 1;
46 public UInt32 GetPrice(UInt32 symbol)
48 UInt32 price = 0;
49 UInt32 m = 1;
50 for (int bitIndex = NumBitLevels; bitIndex > 0; )
52 bitIndex--;
53 UInt32 bit = (symbol >> bitIndex) & 1;
54 price += Models[m].GetPrice(bit);
55 m = (m << 1) + bit;
57 return price;
60 public UInt32 ReverseGetPrice(UInt32 symbol)
62 UInt32 price = 0;
63 UInt32 m = 1;
64 for (int i = NumBitLevels; i > 0; i--)
66 UInt32 bit = symbol & 1;
67 symbol >>= 1;
68 price += Models[m].GetPrice(bit);
69 m = (m << 1) | bit;
71 return price;
74 public static UInt32 ReverseGetPrice(BitEncoder[] Models, UInt32 startIndex,
75 int NumBitLevels, UInt32 symbol)
77 UInt32 price = 0;
78 UInt32 m = 1;
79 for (int i = NumBitLevels; i > 0; i--)
81 UInt32 bit = symbol & 1;
82 symbol >>= 1;
83 price += Models[startIndex + m].GetPrice(bit);
84 m = (m << 1) | bit;
86 return price;
89 public static void ReverseEncode(BitEncoder[] Models, UInt32 startIndex,
90 Encoder rangeEncoder, int NumBitLevels, UInt32 symbol)
92 UInt32 m = 1;
93 for (int i = 0; i < NumBitLevels; i++)
95 UInt32 bit = symbol & 1;
96 Models[startIndex + m].Encode(rangeEncoder, bit);
97 m = (m << 1) | bit;
98 symbol >>= 1;
103 struct BitTreeDecoder
105 BitDecoder[] Models;
106 int NumBitLevels;
108 public BitTreeDecoder(int numBitLevels)
110 NumBitLevels = numBitLevels;
111 Models = new BitDecoder[1 << numBitLevels];
114 public void Init()
116 for (uint i = 1; i < (1 << NumBitLevels); i++)
117 Models[i].Init();
120 public uint Decode(RangeCoder.Decoder rangeDecoder)
122 uint m = 1;
123 for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--)
124 m = (m << 1) + Models[m].Decode(rangeDecoder);
125 return m - ((uint)1 << NumBitLevels);
128 public uint ReverseDecode(RangeCoder.Decoder rangeDecoder)
130 uint m = 1;
131 uint symbol = 0;
132 for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
134 uint bit = Models[m].Decode(rangeDecoder);
135 m <<= 1;
136 m += bit;
137 symbol |= (bit << bitIndex);
139 return symbol;
142 public static uint ReverseDecode(BitDecoder[] Models, UInt32 startIndex,
143 RangeCoder.Decoder rangeDecoder, int NumBitLevels)
145 uint m = 1;
146 uint symbol = 0;
147 for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
149 uint bit = Models[startIndex + m].Decode(rangeDecoder);
150 m <<= 1;
151 m += bit;
152 symbol |= (bit << bitIndex);
154 return symbol;