Home | History | Annotate | Download | only in RangeCoder
      1 package SevenZip.Compression.RangeCoder;
      2 
      3 public class BitTreeDecoder
      4 {
      5 	short[] Models;
      6 	int NumBitLevels;
      7 
      8 	public BitTreeDecoder(int numBitLevels)
      9 	{
     10 		NumBitLevels = numBitLevels;
     11 		Models = new short[1 << numBitLevels];
     12 	}
     13 
     14 	public void Init()
     15 	{
     16 		Decoder.InitBitModels(Models);
     17 	}
     18 
     19 	public int Decode(Decoder rangeDecoder) throws java.io.IOException
     20 	{
     21 		int m = 1;
     22 		for (int bitIndex = NumBitLevels; bitIndex != 0; bitIndex--)
     23 			m = (m << 1) + rangeDecoder.DecodeBit(Models, m);
     24 		return m - (1 << NumBitLevels);
     25 	}
     26 
     27 	public int ReverseDecode(Decoder rangeDecoder) throws java.io.IOException
     28 	{
     29 		int m = 1;
     30 		int symbol = 0;
     31 		for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
     32 		{
     33 			int bit = rangeDecoder.DecodeBit(Models, m);
     34 			m <<= 1;
     35 			m += bit;
     36 			symbol |= (bit << bitIndex);
     37 		}
     38 		return symbol;
     39 	}
     40 
     41 	public static int ReverseDecode(short[] Models, int startIndex,
     42 			Decoder rangeDecoder, int NumBitLevels) throws java.io.IOException
     43 	{
     44 		int m = 1;
     45 		int symbol = 0;
     46 		for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
     47 		{
     48 			int bit = rangeDecoder.DecodeBit(Models, startIndex + m);
     49 			m <<= 1;
     50 			m += bit;
     51 			symbol |= (bit << bitIndex);
     52 		}
     53 		return symbol;
     54 	}
     55 }
     56