OLD | NEW |
| (Empty) |
1 package SevenZip.Compression.RangeCoder; | |
2 import java.io.IOException; | |
3 | |
4 public class Encoder | |
5 { | |
6 static final int kTopMask = ~((1 << 24) - 1); | |
7 | |
8 static final int kNumBitModelTotalBits = 11; | |
9 static final int kBitModelTotal = (1 << kNumBitModelTotalBits); | |
10 static final int kNumMoveBits = 5; | |
11 | |
12 java.io.OutputStream Stream; | |
13 | |
14 long Low; | |
15 int Range; | |
16 int _cacheSize; | |
17 int _cache; | |
18 | |
19 long _position; | |
20 | |
21 public void SetStream(java.io.OutputStream stream) | |
22 { | |
23 Stream = stream; | |
24 } | |
25 | |
26 public void ReleaseStream() | |
27 { | |
28 Stream = null; | |
29 } | |
30 | |
31 public void Init() | |
32 { | |
33 _position = 0; | |
34 Low = 0; | |
35 Range = -1; | |
36 _cacheSize = 1; | |
37 _cache = 0; | |
38 } | |
39 | |
40 public void FlushData() throws IOException | |
41 { | |
42 for (int i = 0; i < 5; i++) | |
43 ShiftLow(); | |
44 } | |
45 | |
46 public void FlushStream() throws IOException | |
47 { | |
48 Stream.flush(); | |
49 } | |
50 | |
51 public void ShiftLow() throws IOException | |
52 { | |
53 int LowHi = (int)(Low >>> 32); | |
54 if (LowHi != 0 || Low < 0xFF000000L) | |
55 { | |
56 _position += _cacheSize; | |
57 int temp = _cache; | |
58 do | |
59 { | |
60 Stream.write(temp + LowHi); | |
61 temp = 0xFF; | |
62 } | |
63 while(--_cacheSize != 0); | |
64 _cache = (((int)Low) >>> 24); | |
65 } | |
66 _cacheSize++; | |
67 Low = (Low & 0xFFFFFF) << 8; | |
68 } | |
69 | |
70 public void EncodeDirectBits(int v, int numTotalBits) throws IOException | |
71 { | |
72 for (int i = numTotalBits - 1; i >= 0; i--) | |
73 { | |
74 Range >>>= 1; | |
75 if (((v >>> i) & 1) == 1) | |
76 Low += Range; | |
77 if ((Range & Encoder.kTopMask) == 0) | |
78 { | |
79 Range <<= 8; | |
80 ShiftLow(); | |
81 } | |
82 } | |
83 } | |
84 | |
85 | |
86 public long GetProcessedSizeAdd() | |
87 { | |
88 return _cacheSize + _position + 4; | |
89 } | |
90 | |
91 | |
92 | |
93 static final int kNumMoveReducingBits = 2; | |
94 public static final int kNumBitPriceShiftBits = 6; | |
95 | |
96 public static void InitBitModels(short []probs) | |
97 { | |
98 for (int i = 0; i < probs.length; i++) | |
99 probs[i] = (kBitModelTotal >>> 1); | |
100 } | |
101 | |
102 public void Encode(short []probs, int index, int symbol) throws IOExcept
ion | |
103 { | |
104 int prob = probs[index]; | |
105 int newBound = (Range >>> kNumBitModelTotalBits) * prob; | |
106 if (symbol == 0) | |
107 { | |
108 Range = newBound; | |
109 probs[index] = (short)(prob + ((kBitModelTotal - prob) >
>> kNumMoveBits)); | |
110 } | |
111 else | |
112 { | |
113 Low += (newBound & 0xFFFFFFFFL); | |
114 Range -= newBound; | |
115 probs[index] = (short)(prob - ((prob) >>> kNumMoveBits))
; | |
116 } | |
117 if ((Range & kTopMask) == 0) | |
118 { | |
119 Range <<= 8; | |
120 ShiftLow(); | |
121 } | |
122 } | |
123 | |
124 private static int[] ProbPrices = new int[kBitModelTotal >>> kNumMoveRed
ucingBits]; | |
125 | |
126 static | |
127 { | |
128 int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits); | |
129 for (int i = kNumBits - 1; i >= 0; i--) | |
130 { | |
131 int start = 1 << (kNumBits - i - 1); | |
132 int end = 1 << (kNumBits - i); | |
133 for (int j = start; j < end; j++) | |
134 ProbPrices[j] = (i << kNumBitPriceShiftBits) + | |
135 (((end - j) << kNumBitPriceShift
Bits) >>> (kNumBits - i - 1)); | |
136 } | |
137 } | |
138 | |
139 static public int GetPrice(int Prob, int symbol) | |
140 { | |
141 return ProbPrices[(((Prob - symbol) ^ ((-symbol))) & (kBitModelT
otal - 1)) >>> kNumMoveReducingBits]; | |
142 } | |
143 static public int GetPrice0(int Prob) | |
144 { | |
145 return ProbPrices[Prob >>> kNumMoveReducingBits]; | |
146 } | |
147 static public int GetPrice1(int Prob) | |
148 { | |
149 return ProbPrices[(kBitModelTotal - Prob) >>> kNumMoveReducingBi
ts]; | |
150 } | |
151 } | |
OLD | NEW |