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>