com.wallstop-studios.unity-helpers 2.0.0-rc79 → 2.0.0-rc79.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Runtime/Protobuf-Net/System.Collections.Immutable.dll +0 -0
- package/Runtime/Protobuf-Net/System.Runtime.CompilerServices.Unsafe.dll +0 -0
- package/Runtime/Protobuf-Net/protobuf-net.Core.dll +0 -0
- package/Runtime/Protobuf-Net/protobuf-net.dll +0 -0
- package/Runtime/Utils/LZMA.cs +53 -0
- package/Runtime/Utils/LZMA.cs.meta +3 -0
- package/Runtime/Utils/SevenZip/Common/CRC.cs +61 -0
- package/Runtime/Utils/SevenZip/Common/CRC.cs.meta +11 -0
- package/Runtime/Utils/SevenZip/Common/InBuffer.cs +71 -0
- package/Runtime/Utils/SevenZip/Common/InBuffer.cs.meta +11 -0
- package/Runtime/Utils/SevenZip/Common/OutBuffer.cs +65 -0
- package/Runtime/Utils/SevenZip/Common/OutBuffer.cs.meta +11 -0
- package/Runtime/Utils/SevenZip/Common.meta +3 -0
- package/Runtime/Utils/SevenZip/Compress/LZ/IMatchFinder.cs +28 -0
- package/Runtime/Utils/SevenZip/Compress/LZ/IMatchFinder.cs.meta +11 -0
- package/Runtime/Utils/SevenZip/Compress/LZ/LzBinTree.cs +404 -0
- package/Runtime/Utils/SevenZip/Compress/LZ/LzBinTree.cs.meta +11 -0
- package/Runtime/Utils/SevenZip/Compress/LZ/LzInWindow.cs +153 -0
- package/Runtime/Utils/SevenZip/Compress/LZ/LzInWindow.cs.meta +11 -0
- package/Runtime/Utils/SevenZip/Compress/LZ/LzOutWindow.cs +110 -0
- package/Runtime/Utils/SevenZip/Compress/LZ/LzOutWindow.cs.meta +11 -0
- package/Runtime/{Protobuf-Net/System.Collections.Immutable.xml.meta → Utils/SevenZip/Compress/LZ.meta} +3 -2
- package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaBase.cs +101 -0
- package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaBase.cs.meta +11 -0
- package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaDecoder.cs +464 -0
- package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaDecoder.cs.meta +11 -0
- package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaEncoder.cs +1669 -0
- package/Runtime/Utils/SevenZip/Compress/LZMA/LzmaEncoder.cs.meta +11 -0
- package/Runtime/Utils/SevenZip/Compress/LZMA.meta +8 -0
- package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoder.cs +233 -0
- package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoder.cs.meta +11 -0
- package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBit.cs +137 -0
- package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBit.cs.meta +11 -0
- package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs +170 -0
- package/Runtime/Utils/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs.meta +11 -0
- package/Runtime/Utils/SevenZip/Compress/RangeCoder.meta +8 -0
- package/Runtime/{Protobuf-Net/System.Runtime.CompilerServices.Unsafe.xml.meta → Utils/SevenZip/Compress.meta} +3 -2
- package/Runtime/Utils/SevenZip/ICoder.cs +177 -0
- package/Runtime/Utils/SevenZip/ICoder.cs.meta +11 -0
- package/Runtime/Utils/SevenZip.meta +3 -0
- package/package.json +2 -1
- package/Runtime/Protobuf-Net/System.Buffers.dll +0 -0
- package/Runtime/Protobuf-Net/System.Buffers.dll.meta +0 -33
- package/Runtime/Protobuf-Net/System.Collections.Immutable.xml +0 -6812
- package/Runtime/Protobuf-Net/System.Numerics.Vectors.dll +0 -0
- package/Runtime/Protobuf-Net/System.Numerics.Vectors.dll.meta +0 -33
- package/Runtime/Protobuf-Net/System.Runtime.CompilerServices.Unsafe.xml +0 -342
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
|
|
3
|
+
namespace SevenZip.Compression.RangeCoder
|
|
4
|
+
{
|
|
5
|
+
class Encoder
|
|
6
|
+
{
|
|
7
|
+
public const uint kTopValue = (1 << 24);
|
|
8
|
+
|
|
9
|
+
System.IO.Stream Stream;
|
|
10
|
+
|
|
11
|
+
public UInt64 Low;
|
|
12
|
+
public uint Range;
|
|
13
|
+
uint _cacheSize;
|
|
14
|
+
byte _cache;
|
|
15
|
+
|
|
16
|
+
long StartPosition;
|
|
17
|
+
|
|
18
|
+
public void SetStream(System.IO.Stream stream)
|
|
19
|
+
{
|
|
20
|
+
Stream = stream;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public void ReleaseStream()
|
|
24
|
+
{
|
|
25
|
+
Stream = null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public void Init()
|
|
29
|
+
{
|
|
30
|
+
StartPosition = Stream.Position;
|
|
31
|
+
|
|
32
|
+
Low = 0;
|
|
33
|
+
Range = 0xFFFFFFFF;
|
|
34
|
+
_cacheSize = 1;
|
|
35
|
+
_cache = 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public void FlushData()
|
|
39
|
+
{
|
|
40
|
+
for (int i = 0; i < 5; i++)
|
|
41
|
+
ShiftLow();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public void FlushStream()
|
|
45
|
+
{
|
|
46
|
+
Stream.Flush();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public void CloseStream()
|
|
50
|
+
{
|
|
51
|
+
Stream.Close();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public void Encode(uint start, uint size, uint total)
|
|
55
|
+
{
|
|
56
|
+
Low += start * (Range /= total);
|
|
57
|
+
Range *= size;
|
|
58
|
+
while (Range < kTopValue)
|
|
59
|
+
{
|
|
60
|
+
Range <<= 8;
|
|
61
|
+
ShiftLow();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public void ShiftLow()
|
|
66
|
+
{
|
|
67
|
+
if ((uint)Low < (uint)0xFF000000 || (uint)(Low >> 32) == 1)
|
|
68
|
+
{
|
|
69
|
+
byte temp = _cache;
|
|
70
|
+
do
|
|
71
|
+
{
|
|
72
|
+
Stream.WriteByte((byte)(temp + (Low >> 32)));
|
|
73
|
+
temp = 0xFF;
|
|
74
|
+
} while (--_cacheSize != 0);
|
|
75
|
+
_cache = (byte)(((uint)Low) >> 24);
|
|
76
|
+
}
|
|
77
|
+
_cacheSize++;
|
|
78
|
+
Low = ((uint)Low) << 8;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public void EncodeDirectBits(uint v, int numTotalBits)
|
|
82
|
+
{
|
|
83
|
+
for (int i = numTotalBits - 1; i >= 0; i--)
|
|
84
|
+
{
|
|
85
|
+
Range >>= 1;
|
|
86
|
+
if (((v >> i) & 1) == 1)
|
|
87
|
+
Low += Range;
|
|
88
|
+
if (Range < kTopValue)
|
|
89
|
+
{
|
|
90
|
+
Range <<= 8;
|
|
91
|
+
ShiftLow();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public void EncodeBit(uint size0, int numTotalBits, uint symbol)
|
|
97
|
+
{
|
|
98
|
+
uint newBound = (Range >> numTotalBits) * size0;
|
|
99
|
+
if (symbol == 0)
|
|
100
|
+
Range = newBound;
|
|
101
|
+
else
|
|
102
|
+
{
|
|
103
|
+
Low += newBound;
|
|
104
|
+
Range -= newBound;
|
|
105
|
+
}
|
|
106
|
+
while (Range < kTopValue)
|
|
107
|
+
{
|
|
108
|
+
Range <<= 8;
|
|
109
|
+
ShiftLow();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public long GetProcessedSizeAdd()
|
|
114
|
+
{
|
|
115
|
+
return _cacheSize + Stream.Position - StartPosition + 4;
|
|
116
|
+
// (long)Stream.GetProcessedSize();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
class Decoder
|
|
121
|
+
{
|
|
122
|
+
public const uint kTopValue = (1 << 24);
|
|
123
|
+
public uint Range;
|
|
124
|
+
public uint Code;
|
|
125
|
+
|
|
126
|
+
// public Buffer.InBuffer Stream = new Buffer.InBuffer(1 << 16);
|
|
127
|
+
public System.IO.Stream Stream;
|
|
128
|
+
|
|
129
|
+
public void Init(System.IO.Stream stream)
|
|
130
|
+
{
|
|
131
|
+
// Stream.Init(stream);
|
|
132
|
+
Stream = stream;
|
|
133
|
+
|
|
134
|
+
Code = 0;
|
|
135
|
+
Range = 0xFFFFFFFF;
|
|
136
|
+
for (int i = 0; i < 5; i++)
|
|
137
|
+
Code = (Code << 8) | (byte)Stream.ReadByte();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public void ReleaseStream()
|
|
141
|
+
{
|
|
142
|
+
// Stream.ReleaseStream();
|
|
143
|
+
Stream = null;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
public void CloseStream()
|
|
147
|
+
{
|
|
148
|
+
Stream.Close();
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public void Normalize()
|
|
152
|
+
{
|
|
153
|
+
while (Range < kTopValue)
|
|
154
|
+
{
|
|
155
|
+
Code = (Code << 8) | (byte)Stream.ReadByte();
|
|
156
|
+
Range <<= 8;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
public void Normalize2()
|
|
161
|
+
{
|
|
162
|
+
if (Range < kTopValue)
|
|
163
|
+
{
|
|
164
|
+
Code = (Code << 8) | (byte)Stream.ReadByte();
|
|
165
|
+
Range <<= 8;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
public uint GetThreshold(uint total)
|
|
170
|
+
{
|
|
171
|
+
return Code / (Range /= total);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
public void Decode(uint start, uint size, uint total)
|
|
175
|
+
{
|
|
176
|
+
Code -= start * Range;
|
|
177
|
+
Range *= size;
|
|
178
|
+
Normalize();
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
public uint DecodeDirectBits(int numTotalBits)
|
|
182
|
+
{
|
|
183
|
+
uint range = Range;
|
|
184
|
+
uint code = Code;
|
|
185
|
+
uint result = 0;
|
|
186
|
+
for (int i = numTotalBits; i > 0; i--)
|
|
187
|
+
{
|
|
188
|
+
range >>= 1;
|
|
189
|
+
/*
|
|
190
|
+
result <<= 1;
|
|
191
|
+
if (code >= range)
|
|
192
|
+
{
|
|
193
|
+
code -= range;
|
|
194
|
+
result |= 1;
|
|
195
|
+
}
|
|
196
|
+
*/
|
|
197
|
+
uint t = (code - range) >> 31;
|
|
198
|
+
code -= range & (t - 1);
|
|
199
|
+
result = (result << 1) | (1 - t);
|
|
200
|
+
|
|
201
|
+
if (range < kTopValue)
|
|
202
|
+
{
|
|
203
|
+
code = (code << 8) | (byte)Stream.ReadByte();
|
|
204
|
+
range <<= 8;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
Range = range;
|
|
208
|
+
Code = code;
|
|
209
|
+
return result;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
public uint DecodeBit(uint size0, int numTotalBits)
|
|
213
|
+
{
|
|
214
|
+
uint newBound = (Range >> numTotalBits) * size0;
|
|
215
|
+
uint symbol;
|
|
216
|
+
if (Code < newBound)
|
|
217
|
+
{
|
|
218
|
+
symbol = 0;
|
|
219
|
+
Range = newBound;
|
|
220
|
+
}
|
|
221
|
+
else
|
|
222
|
+
{
|
|
223
|
+
symbol = 1;
|
|
224
|
+
Code -= newBound;
|
|
225
|
+
Range -= newBound;
|
|
226
|
+
}
|
|
227
|
+
Normalize();
|
|
228
|
+
return symbol;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// ulong GetProcessedSize() {return Stream.GetProcessedSize(); }
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
|
|
3
|
+
namespace SevenZip.Compression.RangeCoder
|
|
4
|
+
{
|
|
5
|
+
struct BitEncoder
|
|
6
|
+
{
|
|
7
|
+
public const int kNumBitModelTotalBits = 11;
|
|
8
|
+
public const uint kBitModelTotal = (1 << kNumBitModelTotalBits);
|
|
9
|
+
const int kNumMoveBits = 5;
|
|
10
|
+
const int kNumMoveReducingBits = 2;
|
|
11
|
+
public const int kNumBitPriceShiftBits = 6;
|
|
12
|
+
|
|
13
|
+
uint Prob;
|
|
14
|
+
|
|
15
|
+
public void Init()
|
|
16
|
+
{
|
|
17
|
+
Prob = kBitModelTotal >> 1;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public void UpdateModel(uint symbol)
|
|
21
|
+
{
|
|
22
|
+
if (symbol == 0)
|
|
23
|
+
Prob += (kBitModelTotal - Prob) >> kNumMoveBits;
|
|
24
|
+
else
|
|
25
|
+
Prob -= (Prob) >> kNumMoveBits;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public void Encode(Encoder encoder, uint symbol)
|
|
29
|
+
{
|
|
30
|
+
// encoder.EncodeBit(Prob, kNumBitModelTotalBits, symbol);
|
|
31
|
+
// UpdateModel(symbol);
|
|
32
|
+
uint newBound = (encoder.Range >> kNumBitModelTotalBits) * Prob;
|
|
33
|
+
if (symbol == 0)
|
|
34
|
+
{
|
|
35
|
+
encoder.Range = newBound;
|
|
36
|
+
Prob += (kBitModelTotal - Prob) >> kNumMoveBits;
|
|
37
|
+
}
|
|
38
|
+
else
|
|
39
|
+
{
|
|
40
|
+
encoder.Low += newBound;
|
|
41
|
+
encoder.Range -= newBound;
|
|
42
|
+
Prob -= (Prob) >> kNumMoveBits;
|
|
43
|
+
}
|
|
44
|
+
if (encoder.Range < Encoder.kTopValue)
|
|
45
|
+
{
|
|
46
|
+
encoder.Range <<= 8;
|
|
47
|
+
encoder.ShiftLow();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private static UInt32[] ProbPrices = new UInt32[kBitModelTotal >> kNumMoveReducingBits];
|
|
52
|
+
|
|
53
|
+
static BitEncoder()
|
|
54
|
+
{
|
|
55
|
+
const int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits);
|
|
56
|
+
for (int i = kNumBits - 1; i >= 0; i--)
|
|
57
|
+
{
|
|
58
|
+
UInt32 start = (UInt32)1 << (kNumBits - i - 1);
|
|
59
|
+
UInt32 end = (UInt32)1 << (kNumBits - i);
|
|
60
|
+
for (UInt32 j = start; j < end; j++)
|
|
61
|
+
ProbPrices[j] =
|
|
62
|
+
((UInt32)i << kNumBitPriceShiftBits)
|
|
63
|
+
+ (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public uint GetPrice(uint symbol)
|
|
68
|
+
{
|
|
69
|
+
return ProbPrices[
|
|
70
|
+
(((Prob - symbol) ^ ((-(int)symbol))) & (kBitModelTotal - 1))
|
|
71
|
+
>> kNumMoveReducingBits
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public uint GetPrice0()
|
|
76
|
+
{
|
|
77
|
+
return ProbPrices[Prob >> kNumMoveReducingBits];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public uint GetPrice1()
|
|
81
|
+
{
|
|
82
|
+
return ProbPrices[(kBitModelTotal - Prob) >> kNumMoveReducingBits];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
struct BitDecoder
|
|
87
|
+
{
|
|
88
|
+
public const int kNumBitModelTotalBits = 11;
|
|
89
|
+
public const uint kBitModelTotal = (1 << kNumBitModelTotalBits);
|
|
90
|
+
const int kNumMoveBits = 5;
|
|
91
|
+
|
|
92
|
+
uint Prob;
|
|
93
|
+
|
|
94
|
+
public void UpdateModel(int numMoveBits, uint symbol)
|
|
95
|
+
{
|
|
96
|
+
if (symbol == 0)
|
|
97
|
+
Prob += (kBitModelTotal - Prob) >> numMoveBits;
|
|
98
|
+
else
|
|
99
|
+
Prob -= (Prob) >> numMoveBits;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public void Init()
|
|
103
|
+
{
|
|
104
|
+
Prob = kBitModelTotal >> 1;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
public uint Decode(RangeCoder.Decoder rangeDecoder)
|
|
108
|
+
{
|
|
109
|
+
uint newBound = (uint)(rangeDecoder.Range >> kNumBitModelTotalBits) * (uint)Prob;
|
|
110
|
+
if (rangeDecoder.Code < newBound)
|
|
111
|
+
{
|
|
112
|
+
rangeDecoder.Range = newBound;
|
|
113
|
+
Prob += (kBitModelTotal - Prob) >> kNumMoveBits;
|
|
114
|
+
if (rangeDecoder.Range < Decoder.kTopValue)
|
|
115
|
+
{
|
|
116
|
+
rangeDecoder.Code =
|
|
117
|
+
(rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte();
|
|
118
|
+
rangeDecoder.Range <<= 8;
|
|
119
|
+
}
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
else
|
|
123
|
+
{
|
|
124
|
+
rangeDecoder.Range -= newBound;
|
|
125
|
+
rangeDecoder.Code -= newBound;
|
|
126
|
+
Prob -= (Prob) >> kNumMoveBits;
|
|
127
|
+
if (rangeDecoder.Range < Decoder.kTopValue)
|
|
128
|
+
{
|
|
129
|
+
rangeDecoder.Code =
|
|
130
|
+
(rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte();
|
|
131
|
+
rangeDecoder.Range <<= 8;
|
|
132
|
+
}
|
|
133
|
+
return 1;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
using System;
|
|
2
|
+
|
|
3
|
+
namespace SevenZip.Compression.RangeCoder
|
|
4
|
+
{
|
|
5
|
+
struct BitTreeEncoder
|
|
6
|
+
{
|
|
7
|
+
BitEncoder[] Models;
|
|
8
|
+
int NumBitLevels;
|
|
9
|
+
|
|
10
|
+
public BitTreeEncoder(int numBitLevels)
|
|
11
|
+
{
|
|
12
|
+
NumBitLevels = numBitLevels;
|
|
13
|
+
Models = new BitEncoder[1 << numBitLevels];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public void Init()
|
|
17
|
+
{
|
|
18
|
+
for (uint i = 1; i < (1 << NumBitLevels); i++)
|
|
19
|
+
Models[i].Init();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public void Encode(Encoder rangeEncoder, UInt32 symbol)
|
|
23
|
+
{
|
|
24
|
+
UInt32 m = 1;
|
|
25
|
+
for (int bitIndex = NumBitLevels; bitIndex > 0; )
|
|
26
|
+
{
|
|
27
|
+
bitIndex--;
|
|
28
|
+
UInt32 bit = (symbol >> bitIndex) & 1;
|
|
29
|
+
Models[m].Encode(rangeEncoder, bit);
|
|
30
|
+
m = (m << 1) | bit;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public void ReverseEncode(Encoder rangeEncoder, UInt32 symbol)
|
|
35
|
+
{
|
|
36
|
+
UInt32 m = 1;
|
|
37
|
+
for (UInt32 i = 0; i < NumBitLevels; i++)
|
|
38
|
+
{
|
|
39
|
+
UInt32 bit = symbol & 1;
|
|
40
|
+
Models[m].Encode(rangeEncoder, bit);
|
|
41
|
+
m = (m << 1) | bit;
|
|
42
|
+
symbol >>= 1;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public UInt32 GetPrice(UInt32 symbol)
|
|
47
|
+
{
|
|
48
|
+
UInt32 price = 0;
|
|
49
|
+
UInt32 m = 1;
|
|
50
|
+
for (int bitIndex = NumBitLevels; bitIndex > 0; )
|
|
51
|
+
{
|
|
52
|
+
bitIndex--;
|
|
53
|
+
UInt32 bit = (symbol >> bitIndex) & 1;
|
|
54
|
+
price += Models[m].GetPrice(bit);
|
|
55
|
+
m = (m << 1) + bit;
|
|
56
|
+
}
|
|
57
|
+
return price;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public UInt32 ReverseGetPrice(UInt32 symbol)
|
|
61
|
+
{
|
|
62
|
+
UInt32 price = 0;
|
|
63
|
+
UInt32 m = 1;
|
|
64
|
+
for (int i = NumBitLevels; i > 0; i--)
|
|
65
|
+
{
|
|
66
|
+
UInt32 bit = symbol & 1;
|
|
67
|
+
symbol >>= 1;
|
|
68
|
+
price += Models[m].GetPrice(bit);
|
|
69
|
+
m = (m << 1) | bit;
|
|
70
|
+
}
|
|
71
|
+
return price;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public static UInt32 ReverseGetPrice(
|
|
75
|
+
BitEncoder[] Models,
|
|
76
|
+
UInt32 startIndex,
|
|
77
|
+
int NumBitLevels,
|
|
78
|
+
UInt32 symbol
|
|
79
|
+
)
|
|
80
|
+
{
|
|
81
|
+
UInt32 price = 0;
|
|
82
|
+
UInt32 m = 1;
|
|
83
|
+
for (int i = NumBitLevels; i > 0; i--)
|
|
84
|
+
{
|
|
85
|
+
UInt32 bit = symbol & 1;
|
|
86
|
+
symbol >>= 1;
|
|
87
|
+
price += Models[startIndex + m].GetPrice(bit);
|
|
88
|
+
m = (m << 1) | bit;
|
|
89
|
+
}
|
|
90
|
+
return price;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public static void ReverseEncode(
|
|
94
|
+
BitEncoder[] Models,
|
|
95
|
+
UInt32 startIndex,
|
|
96
|
+
Encoder rangeEncoder,
|
|
97
|
+
int NumBitLevels,
|
|
98
|
+
UInt32 symbol
|
|
99
|
+
)
|
|
100
|
+
{
|
|
101
|
+
UInt32 m = 1;
|
|
102
|
+
for (int i = 0; i < NumBitLevels; i++)
|
|
103
|
+
{
|
|
104
|
+
UInt32 bit = symbol & 1;
|
|
105
|
+
Models[startIndex + m].Encode(rangeEncoder, bit);
|
|
106
|
+
m = (m << 1) | bit;
|
|
107
|
+
symbol >>= 1;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
struct BitTreeDecoder
|
|
113
|
+
{
|
|
114
|
+
BitDecoder[] Models;
|
|
115
|
+
int NumBitLevels;
|
|
116
|
+
|
|
117
|
+
public BitTreeDecoder(int numBitLevels)
|
|
118
|
+
{
|
|
119
|
+
NumBitLevels = numBitLevels;
|
|
120
|
+
Models = new BitDecoder[1 << numBitLevels];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
public void Init()
|
|
124
|
+
{
|
|
125
|
+
for (uint i = 1; i < (1 << NumBitLevels); i++)
|
|
126
|
+
Models[i].Init();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public uint Decode(RangeCoder.Decoder rangeDecoder)
|
|
130
|
+
{
|
|
131
|
+
uint m = 1;
|
|
132
|
+
for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--)
|
|
133
|
+
m = (m << 1) + Models[m].Decode(rangeDecoder);
|
|
134
|
+
return m - ((uint)1 << NumBitLevels);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
public uint ReverseDecode(RangeCoder.Decoder rangeDecoder)
|
|
138
|
+
{
|
|
139
|
+
uint m = 1;
|
|
140
|
+
uint symbol = 0;
|
|
141
|
+
for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
|
|
142
|
+
{
|
|
143
|
+
uint bit = Models[m].Decode(rangeDecoder);
|
|
144
|
+
m <<= 1;
|
|
145
|
+
m += bit;
|
|
146
|
+
symbol |= (bit << bitIndex);
|
|
147
|
+
}
|
|
148
|
+
return symbol;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
public static uint ReverseDecode(
|
|
152
|
+
BitDecoder[] Models,
|
|
153
|
+
UInt32 startIndex,
|
|
154
|
+
RangeCoder.Decoder rangeDecoder,
|
|
155
|
+
int NumBitLevels
|
|
156
|
+
)
|
|
157
|
+
{
|
|
158
|
+
uint m = 1;
|
|
159
|
+
uint symbol = 0;
|
|
160
|
+
for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
|
|
161
|
+
{
|
|
162
|
+
uint bit = Models[startIndex + m].Decode(rangeDecoder);
|
|
163
|
+
m <<= 1;
|
|
164
|
+
m += bit;
|
|
165
|
+
symbol |= (bit << bitIndex);
|
|
166
|
+
}
|
|
167
|
+
return symbol;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|