| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- package SevenZip.Compression.RangeCoder;
- import java.io.IOException;
- public class Decoder
- {
- static final int kTopMask = ~((1 << 24) - 1);
-
- static final int kNumBitModelTotalBits = 11;
- static final int kBitModelTotal = (1 << kNumBitModelTotalBits);
- static final int kNumMoveBits = 5;
-
- int Range;
- int Code;
- java.io.InputStream Stream;
-
- public final void SetStream(java.io.InputStream stream)
- {
- Stream = stream;
- }
-
- public final void ReleaseStream()
- {
- Stream = null;
- }
-
- public final void Init() throws IOException
- {
- Code = 0;
- Range = -1;
- for (int i = 0; i < 5; i++)
- Code = (Code << 8) | Stream.read();
- }
-
- public final int DecodeDirectBits(int numTotalBits) throws IOException
- {
- int result = 0;
- for (int i = numTotalBits; i != 0; i--)
- {
- Range >>>= 1;
- int t = ((Code - Range) >>> 31);
- Code -= Range & (t - 1);
- result = (result << 1) | (1 - t);
-
- if ((Range & kTopMask) == 0)
- {
- Code = (Code << 8) | Stream.read();
- Range <<= 8;
- }
- }
- return result;
- }
-
- public int DecodeBit(short []probs, int index) throws IOException
- {
- int prob = probs[index];
- int newBound = (Range >>> kNumBitModelTotalBits) * prob;
- if ((Code ^ 0x80000000) < (newBound ^ 0x80000000))
- {
- Range = newBound;
- probs[index] = (short)(prob + ((kBitModelTotal - prob) >>> kNumMoveBits));
- if ((Range & kTopMask) == 0)
- {
- Code = (Code << 8) | Stream.read();
- Range <<= 8;
- }
- return 0;
- }
- else
- {
- Range -= newBound;
- Code -= newBound;
- probs[index] = (short)(prob - ((prob) >>> kNumMoveBits));
- if ((Range & kTopMask) == 0)
- {
- Code = (Code << 8) | Stream.read();
- Range <<= 8;
- }
- return 1;
- }
- }
-
- public static void InitBitModels(short []probs)
- {
- for (int i = 0; i < probs.length; i++)
- probs[i] = (kBitModelTotal >>> 1);
- }
- }
|