Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/RangeCoder/RangeCoderBit.cpp, revision 1.1
1.1 ! misho 1: // Compress/RangeCoder/RangeCoderBit.cpp
! 2:
! 3: #include "StdAfx.h"
! 4:
! 5: #include "RangeCoderBit.h"
! 6:
! 7: namespace NCompress {
! 8: namespace NRangeCoder {
! 9:
! 10: UInt32 CPriceTables::ProbPrices[kBitModelTotal >> kNumMoveReducingBits];
! 11: static CPriceTables g_PriceTables;
! 12:
! 13: CPriceTables::CPriceTables() { Init(); }
! 14:
! 15: void CPriceTables::Init()
! 16: {
! 17: const int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits);
! 18: for(int i = kNumBits - 1; i >= 0; i--)
! 19: {
! 20: UInt32 start = 1 << (kNumBits - i - 1);
! 21: UInt32 end = 1 << (kNumBits - i);
! 22: for (UInt32 j = start; j < end; j++)
! 23: ProbPrices[j] = (i << kNumBitPriceShiftBits) +
! 24: (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1));
! 25: }
! 26:
! 27: /*
! 28: // simplest: bad solution
! 29: for(UInt32 i = 1; i < (kBitModelTotal >> kNumMoveReducingBits) - 1; i++)
! 30: ProbPrices[i] = kBitPrice;
! 31: */
! 32:
! 33: /*
! 34: const double kDummyMultMid = (1.0 / kBitPrice) / 2;
! 35: const double kDummyMultMid = 0;
! 36: // float solution
! 37: double ln2 = log(double(2));
! 38: double lnAll = log(double(kBitModelTotal >> kNumMoveReducingBits));
! 39: for(UInt32 i = 1; i < (kBitModelTotal >> kNumMoveReducingBits) - 1; i++)
! 40: ProbPrices[i] = UInt32((fabs(lnAll - log(double(i))) / ln2 + kDummyMultMid) * kBitPrice);
! 41: */
! 42:
! 43: /*
! 44: // experimental, slow, solution:
! 45: for(UInt32 i = 1; i < (kBitModelTotal >> kNumMoveReducingBits) - 1; i++)
! 46: {
! 47: const int kCyclesBits = 5;
! 48: const UInt32 kCycles = (1 << kCyclesBits);
! 49:
! 50: UInt32 range = UInt32(-1);
! 51: UInt32 bitCount = 0;
! 52: for (UInt32 j = 0; j < kCycles; j++)
! 53: {
! 54: range >>= (kNumBitModelTotalBits - kNumMoveReducingBits);
! 55: range *= i;
! 56: while(range < (1 << 31))
! 57: {
! 58: range <<= 1;
! 59: bitCount++;
! 60: }
! 61: }
! 62: bitCount <<= kNumBitPriceShiftBits;
! 63: range -= (1 << 31);
! 64: for (int k = kNumBitPriceShiftBits - 1; k >= 0; k--)
! 65: {
! 66: range <<= 1;
! 67: if (range > (1 << 31))
! 68: {
! 69: bitCount += (1 << k);
! 70: range -= (1 << 31);
! 71: }
! 72: }
! 73: ProbPrices[i] = (bitCount
! 74: // + (1 << (kCyclesBits - 1))
! 75: ) >> kCyclesBits;
! 76: }
! 77: */
! 78: }
! 79:
! 80: }}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>