BitTreeDecoder.java 1.2 KB

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