misc/libphysfs/lzma/Java/SevenZip/Compression/RangeCoder/BitTreeDecoder.java
changeset 13904 99b265e0d1d0
parent 13903 5f819b90d479
child 13905 b172a5d40eee
equal deleted inserted replaced
13903:5f819b90d479 13904:99b265e0d1d0
     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 }