Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/RangeCoder/RangeCoderBit.h, revision 1.1.1.1
1.1 misho 1: // Compress/RangeCoder/RangeCoderBit.h
2:
3: #ifndef __COMPRESS_RANGECODER_BIT_H
4: #define __COMPRESS_RANGECODER_BIT_H
5:
6: #include "RangeCoder.h"
7:
8: namespace NCompress {
9: namespace NRangeCoder {
10:
11: const int kNumBitModelTotalBits = 11;
12: const UInt32 kBitModelTotal = (1 << kNumBitModelTotalBits);
13:
14: const int kNumMoveReducingBits = 2;
15:
16: const int kNumBitPriceShiftBits = 6;
17: const UInt32 kBitPrice = 1 << kNumBitPriceShiftBits;
18:
19: class CPriceTables
20: {
21: public:
22: static UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits];
23: static void Init();
24: CPriceTables();
25: };
26:
27: template <int numMoveBits>
28: class CBitModel
29: {
30: public:
31: UInt32 Prob;
32: void UpdateModel(UInt32 symbol)
33: {
34: /*
35: Prob -= (Prob + ((symbol - 1) & ((1 << numMoveBits) - 1))) >> numMoveBits;
36: Prob += (1 - symbol) << (kNumBitModelTotalBits - numMoveBits);
37: */
38: if (symbol == 0)
39: Prob += (kBitModelTotal - Prob) >> numMoveBits;
40: else
41: Prob -= (Prob) >> numMoveBits;
42: }
43: public:
44: void Init() { Prob = kBitModelTotal / 2; }
45: };
46:
47: template <int numMoveBits>
48: class CBitEncoder: public CBitModel<numMoveBits>
49: {
50: public:
51: void Encode(CEncoder *encoder, UInt32 symbol)
52: {
53: /*
54: encoder->EncodeBit(this->Prob, kNumBitModelTotalBits, symbol);
55: this->UpdateModel(symbol);
56: */
57: UInt32 newBound = (encoder->Range >> kNumBitModelTotalBits) * this->Prob;
58: if (symbol == 0)
59: {
60: encoder->Range = newBound;
61: this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits;
62: }
63: else
64: {
65: encoder->Low += newBound;
66: encoder->Range -= newBound;
67: this->Prob -= (this->Prob) >> numMoveBits;
68: }
69: if (encoder->Range < kTopValue)
70: {
71: encoder->Range <<= 8;
72: encoder->ShiftLow();
73: }
74: }
75: UInt32 GetPrice(UInt32 symbol) const
76: {
77: return CPriceTables::ProbPrices[
78: (((this->Prob - symbol) ^ ((-(int)symbol))) & (kBitModelTotal - 1)) >> kNumMoveReducingBits];
79: }
80: UInt32 GetPrice0() const { return CPriceTables::ProbPrices[this->Prob >> kNumMoveReducingBits]; }
81: UInt32 GetPrice1() const { return CPriceTables::ProbPrices[(kBitModelTotal - this->Prob) >> kNumMoveReducingBits]; }
82: };
83:
84:
85: template <int numMoveBits>
86: class CBitDecoder: public CBitModel<numMoveBits>
87: {
88: public:
89: UInt32 Decode(CDecoder *decoder)
90: {
91: UInt32 newBound = (decoder->Range >> kNumBitModelTotalBits) * this->Prob;
92: if (decoder->Code < newBound)
93: {
94: decoder->Range = newBound;
95: this->Prob += (kBitModelTotal - this->Prob) >> numMoveBits;
96: if (decoder->Range < kTopValue)
97: {
98: decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte();
99: decoder->Range <<= 8;
100: }
101: return 0;
102: }
103: else
104: {
105: decoder->Range -= newBound;
106: decoder->Code -= newBound;
107: this->Prob -= (this->Prob) >> numMoveBits;
108: if (decoder->Range < kTopValue)
109: {
110: decoder->Code = (decoder->Code << 8) | decoder->Stream.ReadByte();
111: decoder->Range <<= 8;
112: }
113: return 1;
114: }
115: }
116: };
117:
118: }}
119:
120: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>