1 package SevenZip.Compression.RangeCoder;
2 import java.io.IOException;
6 static final int kTopMask = ~((1 << 24) - 1);
8 static final int kNumBitModelTotalBits = 11;
9 static final int kBitModelTotal = (1 << kNumBitModelTotalBits);
10 static final int kNumMoveBits = 5;
12 java.io.OutputStream Stream;
21 public void SetStream(java.io.OutputStream stream)
26 public void ReleaseStream()
40 public void FlushData() throws IOException
42 for (int i = 0; i < 5; i++)
46 public void FlushStream() throws IOException
51 public void ShiftLow() throws IOException
53 int LowHi = (int)(Low >>> 32);
54 if (LowHi != 0 || Low < 0xFF000000L)
56 _position += _cacheSize;
60 Stream.write(temp + LowHi);
63 while(--_cacheSize != 0);
64 _cache = (((int)Low) >>> 24);
67 Low = (Low & 0xFFFFFF) << 8;
70 public void EncodeDirectBits(int v, int numTotalBits) throws IOException
72 for (int i = numTotalBits - 1; i >= 0; i--)
75 if (((v >>> i) & 1) == 1)
77 if ((Range & Encoder.kTopMask) == 0)
86 public long GetProcessedSizeAdd()
88 return _cacheSize + _position + 4;
93 static final int kNumMoveReducingBits = 2;
94 public static final int kNumBitPriceShiftBits = 6;
96 public static void InitBitModels(short []probs)
98 for (int i = 0; i < probs.length; i++)
99 probs[i] = (kBitModelTotal >>> 1);
102 public void Encode(short []probs, int index, int symbol) throws IOException
104 int prob = probs[index];
105 int newBound = (Range >>> kNumBitModelTotalBits) * prob;
109 probs[index] = (short)(prob + ((kBitModelTotal - prob) >>> kNumMoveBits));
113 Low += (newBound & 0xFFFFFFFFL);
115 probs[index] = (short)(prob - ((prob) >>> kNumMoveBits));
117 if ((Range & kTopMask) == 0)
124 private static int[] ProbPrices = new int[kBitModelTotal >>> kNumMoveReducingBits];
128 int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits);
129 for (int i = kNumBits - 1; i >= 0; i--)
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) << kNumBitPriceShiftBits) >>> (kNumBits - i - 1));
139 static public int GetPrice(int Prob, int symbol)
141 return ProbPrices[(((Prob - symbol) ^ ((-symbol))) & (kBitModelTotal - 1)) >>> kNumMoveReducingBits];
143 static public int GetPrice0(int Prob)
145 return ProbPrices[Prob >>> kNumMoveReducingBits];
147 static public int GetPrice1(int Prob)
149 return ProbPrices[(kBitModelTotal - Prob) >>> kNumMoveReducingBits];