Exemplo n.º 1
0
 public uint Decode(RangeCoder.Decoder rangeDecoder)
 {
     uint m = 1;
     for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--)
         m = (m << 1) + Models[m].Decode(rangeDecoder);
     return m - ((uint)1 << NumBitLevels);
 }
Exemplo n.º 2
0
		public uint Decode(RangeCoder.Decoder rangeDecoder)
		{
			uint newBound = (uint)(rangeDecoder.Range >> kNumBitModelTotalBits) * (uint)Prob;
			if (rangeDecoder.Code < newBound)
			{
				rangeDecoder.Range = newBound;
				Prob += (kBitModelTotal - Prob) >> kNumMoveBits;
				if (rangeDecoder.Range < Decoder.kTopValue)
				{
					rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte();
					rangeDecoder.Range <<= 8;
				}
				return 0;
			}
			else
			{
				rangeDecoder.Range -= newBound;
				rangeDecoder.Code -= newBound;
				Prob -= (Prob) >> kNumMoveBits;
				if (rangeDecoder.Range < Decoder.kTopValue)
				{
					rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte();
					rangeDecoder.Range <<= 8;
				}
				return 1;
			}
		}
Exemplo n.º 3
0
 public byte DecodeNormal(RangeCoder.Decoder rangeDecoder)
 {
     uint symbol = 1;
     do
         symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); while (symbol < 0x100);
     return (byte) symbol;
 }
Exemplo n.º 4
0
 public void Encode(RangeCoder.Encoder rangeEncoder, byte symbol) {
     uint context = 1;
     for(int i = 7; i >= 0; i--) {
         uint bit = (uint)((symbol >> i) & 1);
         m_Encoders[context].Encode(rangeEncoder, bit);
         context = (context << 1) | bit;
     }
 }
Exemplo n.º 5
0
        public void Encode(RangeCoder rangeRangeCoder, uint symbol)
        {
            uint m = 1;

            for (var bitIndex = NumBitLevels; bitIndex > 0;)
            {
                bitIndex--;
                var bit = (symbol >> bitIndex) & 1;
                Models[m].Encode(rangeRangeCoder, bit);
                m = (m << 1) | bit;
            }
        }
Exemplo n.º 6
0
        public void ReverseEncode(RangeCoder rangeRangeCoder, uint symbol)
        {
            uint m = 1;

            for (uint i = 0; i < NumBitLevels; i++)
            {
                var bit = symbol & 1;
                Models[m].Encode(rangeRangeCoder, bit);
                m        = (m << 1) | bit;
                symbol >>= 1;
            }
        }
Exemplo n.º 7
0
 public uint ReverseDecode(RangeCoder.Decoder rangeDecoder)
 {
     uint m = 1;
     uint symbol = 0;
     for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) {
         uint bit = Models[m].Decode(rangeDecoder);
         m <<= 1;
         m += bit;
         symbol |= (bit << bitIndex);
     }
     return symbol;
 }
Exemplo n.º 8
0
        public static void ReverseEncode(BitEncoder[] Models, uint startIndex,
                                         RangeCoder rangeRangeCoder, int NumBitLevels, uint symbol)
        {
            uint m = 1;

            for (var i = 0; i < NumBitLevels; i++)
            {
                var bit = symbol & 1;
                Models[startIndex + m].Encode(rangeRangeCoder, bit);
                m        = (m << 1) | bit;
                symbol >>= 1;
            }
        }
Exemplo n.º 9
0
 public static uint ReverseDecode(BitDecoder[] models, uint startIndex, RangeCoder.Decoder rangeDecoder, int numBitLevels)
 {
     uint m = 1;
     uint symbol = 0;
     for (int bitIndex = 0; bitIndex < numBitLevels; bitIndex++)
     {
         uint bit = models[startIndex + m].Decode(rangeDecoder);
         m <<= 1;
         m += bit;
         symbol |= (bit << bitIndex);
     }
     return symbol;
 }
Exemplo n.º 10
0
			public uint Decode(RangeCoder.Decoder rangeDecoder, uint posState)
			{
				if (m_Choice.Decode(rangeDecoder) == 0)
					return m_LowCoder[posState].Decode(rangeDecoder);
			    uint symbol = Base.kNumLowLenSymbols;
			    if (m_Choice2.Decode(rangeDecoder) == 0)
			        symbol += m_MidCoder[posState].Decode(rangeDecoder);
			    else
			    {
			        symbol += Base.kNumMidLenSymbols;
			        symbol += m_HighCoder.Decode(rangeDecoder);
			    }
			    return symbol;
			}
Exemplo n.º 11
0
        public static uint ReverseDecode(BitDecoder[] Models, UInt32 startIndex,
			RangeCoder.Decoder rangeDecoder, int NumBitLevels)
        {
            uint m = 1;
            uint symbol = 0;
            for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++)
            {
                uint bit = Models[startIndex + m].Decode(rangeDecoder);
                m <<= 1;
                m += bit;
                symbol |= bit << bitIndex;
            }
            return symbol;
        }
Exemplo n.º 12
0
 public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, byte matchByte) {
     uint symbol = 1;
     do {
         uint matchBit = (uint)(matchByte >> 7) & 1;
         matchByte <<= 1;
         uint bit = m_Decoders[((1 + matchBit) << 8) + symbol].Decode(rangeDecoder);
         symbol = (symbol << 1) | bit;
         if(matchBit != bit) {
             while(symbol < 0x100)
                 symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder);
             break;
         }
     } while(symbol < 0x100);
     return (byte)symbol;
 }
Exemplo n.º 13
0
 public void EncodeMatched(RangeCoder.Encoder rangeEncoder, byte matchByte, byte symbol) {
     uint context = 1;
     bool same = true;
     for(int i = 7; i >= 0; i--) {
         uint bit = (uint)((symbol >> i) & 1);
         uint state = context;
         if(same) {
             uint matchBit = (uint)((matchByte >> i) & 1);
             state += ((1 + matchBit) << 8);
             same = (matchBit == bit);
         }
         m_Encoders[state].Encode(rangeEncoder, bit);
         context = (context << 1) | bit;
     }
 }
Exemplo n.º 14
0
 /// <summary>
 /// Decodes the specified range decoder.
 /// </summary>
 /// <param name="rangeDecoder">The range decoder.</param>
 /// <param name="posState">State of the pos.</param>
 /// <returns></returns>
 public uint Decode(RangeCoder.Decoder rangeDecoder, uint posState)
 {
     if (_choice.Decode(rangeDecoder) == 0)
         return _lowCoder[posState].Decode(rangeDecoder);
     else
     {
         uint symbol = Base.kNumLowLenSymbols;
         if (_choice2.Decode(rangeDecoder) == 0)
             symbol += _midCoder[posState].Decode(rangeDecoder);
         else
         {
             symbol += Base.kNumMidLenSymbols;
             symbol += _highCoder.Decode(rangeDecoder);
         }
         return symbol;
     }
 }
Exemplo n.º 15
0
        public void Encode(RangeCoder rangeCoder, uint symbol)
        {
            // encoder.EncodeBit(Prob, kNumBitModelTotalBits, symbol);
            // UpdateModel(symbol);
            var newBound = (rangeCoder.Range >> kNumBitModelTotalBits) * Prob;

            if (symbol == 0)
            {
                rangeCoder.Range = newBound;
                Prob            += (kBitModelTotal - Prob) >> kNumMoveBits;
            }
            else
            {
                rangeCoder.Low   += newBound;
                rangeCoder.Range -= newBound;
                Prob             -= Prob >> kNumMoveBits;
            }
            if (rangeCoder.Range < RangeCoder.kTopValue)
            {
                rangeCoder.Range <<= 8;
                rangeCoder.ShiftLow();
            }
        }
Exemplo n.º 16
0
 public byte DecodeWithMatchByte(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte, byte matchByte)
 {
     return m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte);
 }
Exemplo n.º 17
0
 public byte DecodeNormal(RangeCoder.Decoder rangeDecoder, uint pos, byte prevByte)
 {
     return m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder);
 }
Exemplo n.º 18
0
			public void Encode(RangeCoder.Encoder rangeEncoder, UInt32 symbol, UInt32 posState)
			{
				if (symbol < Base.kNumLowLenSymbols)
				{
					_choice.Encode(rangeEncoder, 0);
					_lowCoder[posState].Encode(rangeEncoder, symbol);
				}
				else
				{
					symbol -= Base.kNumLowLenSymbols;
					_choice.Encode(rangeEncoder, 1);
					if (symbol < Base.kNumMidLenSymbols)
					{
						_choice2.Encode(rangeEncoder, 0);
						_midCoder[posState].Encode(rangeEncoder, symbol);
					}
					else
					{
						_choice2.Encode(rangeEncoder, 1);
						_highCoder.Encode(rangeEncoder, symbol - Base.kNumMidLenSymbols);
					}
				}
			}
Exemplo n.º 19
0
        internal bool Code(int dictionarySize, LZ.OutWindow outWindow, RangeCoder.Decoder rangeDecoder)
        {
            int dictionarySizeCheck = Math.Max(dictionarySize, 1);

            outWindow.CopyPending();

            while (outWindow.HasSpace)
            {
                uint posState = (uint)outWindow.Total & m_PosStateMask;
                if (m_IsMatchDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(rangeDecoder) == 0)
                {
                    byte b;
                    byte prevByte = outWindow.GetByte(0);
                    if (!state.IsCharState())
                        b = m_LiteralDecoder.DecodeWithMatchByte(rangeDecoder,
                            (uint)outWindow.Total, prevByte, outWindow.GetByte((int)rep0));
                    else
                        b = m_LiteralDecoder.DecodeNormal(rangeDecoder, (uint)outWindow.Total, prevByte);
                    outWindow.PutByte(b);
                    state.UpdateChar();
                }
                else
                {
                    uint len;
                    if (m_IsRepDecoders[state.Index].Decode(rangeDecoder) == 1)
                    {
                        if (m_IsRepG0Decoders[state.Index].Decode(rangeDecoder) == 0)
                        {
                            if (m_IsRep0LongDecoders[(state.Index << Base.kNumPosStatesBitsMax) + posState].Decode(rangeDecoder) == 0)
                            {
                                state.UpdateShortRep();
                                outWindow.PutByte(outWindow.GetByte((int)rep0));
                                continue;
                            }
                        }
                        else
                        {
                            UInt32 distance;
                            if (m_IsRepG1Decoders[state.Index].Decode(rangeDecoder) == 0)
                            {
                                distance = rep1;
                            }
                            else
                            {
                                if (m_IsRepG2Decoders[state.Index].Decode(rangeDecoder) == 0)
                                    distance = rep2;
                                else
                                {
                                    distance = rep3;
                                    rep3 = rep2;
                                }
                                rep2 = rep1;
                            }
                            rep1 = rep0;
                            rep0 = distance;
                        }
                        len = m_RepLenDecoder.Decode(rangeDecoder, posState) + Base.kMatchMinLen;
                        state.UpdateRep();
                    }
                    else
                    {
                        rep3 = rep2;
                        rep2 = rep1;
                        rep1 = rep0;
                        len = Base.kMatchMinLen + m_LenDecoder.Decode(rangeDecoder, posState);
                        state.UpdateMatch();
                        uint posSlot = m_PosSlotDecoder[Base.GetLenToPosState(len)].Decode(rangeDecoder);
                        if (posSlot >= Base.kStartPosModelIndex)
                        {
                            int numDirectBits = (int)((posSlot >> 1) - 1);
                            rep0 = ((2 | (posSlot & 1)) << numDirectBits);
                            if (posSlot < Base.kEndPosModelIndex)
                                rep0 += BitTreeDecoder.ReverseDecode(m_PosDecoders,
                                        rep0 - posSlot - 1, rangeDecoder, numDirectBits);
                            else
                            {
                                rep0 += (rangeDecoder.DecodeDirectBits(
                                    numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits);
                                rep0 += m_PosAlignDecoder.ReverseDecode(rangeDecoder);
                            }
                        }
                        else
                            rep0 = posSlot;
                    }
                    if (rep0 >= outWindow.Total || rep0 >= dictionarySizeCheck)
                    {
                        if (rep0 == 0xFFFFFFFF)
                            return true;
                        throw new DataErrorException();
                    }
                    outWindow.CopyBlock((int)rep0, (int)len);
                }
            }
            return false;
        }
Exemplo n.º 20
0
			public new void Encode(RangeCoder.Encoder rangeEncoder, UInt32 symbol, UInt32 posState)
			{
				base.Encode(rangeEncoder, symbol, posState);
				if (--_counters[posState] == 0)
					UpdateTable(posState);
			}
Exemplo n.º 21
0
 public uint Decode(RangeCoder.Decoder rangeDecoder, uint posState)
 {
     if (_mChoice.Decode(rangeDecoder) == 0)
         return _mLowCoder[posState].Decode(rangeDecoder);
     var symbol = Base.KNumLowLenSymbols;
     if (_mChoice2.Decode(rangeDecoder) == 0)
         symbol += _mMidCoder[posState].Decode(rangeDecoder);
     else
     {
         symbol += Base.KNumMidLenSymbols;
         symbol += _mHighCoder.Decode(rangeDecoder);
     }
     return symbol;
 }