public uint Decode(CRangeDecoder rangeDecoder)
        {
            uint newBound = (uint)(rangeDecoder.Range >> kNumBitModelTotalBits) * (uint)Prob;

            if (rangeDecoder.Code < newBound)
            {
                rangeDecoder.Range = newBound;
                Prob += (kBitModelTotal - Prob) >> kNumMoveBits;
                if (rangeDecoder.Range < CRangeDecoder.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 < CRangeDecoder.kTopValue)
                {
                    rangeDecoder.Code    = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte();
                    rangeDecoder.Range <<= 8;
                }
                return(1);
            }
        }
예제 #2
0
        public uint Decode(CRangeDecoder rangeDecoder)
        {
            uint m = 1;

            for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--)
            {
                m = (m << 1) + Models[m].Decode(rangeDecoder);
            }
            return(m - ((uint)1 << NumBitLevels));
        }
예제 #3
0
                public byte DecodeNormal(CRangeDecoder rangeDecoder)
                {
                    uint symbol = 1;

                    do
                    {
                        symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder);
                    }while (symbol < 0x100);
                    return((byte)symbol);
                }
예제 #4
0
        public uint ReverseDecode(CRangeDecoder 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);
        }
예제 #5
0
        public static uint ReverseDecode(CBitDecoder[] Models, UInt32 startIndex,
                                         CRangeDecoder 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);
        }
예제 #6
0
 public uint Decode(CRangeDecoder rangeDecoder, uint posState)
 {
     if (m_Choice.Decode(rangeDecoder) == 0)
     {
         return(m_LowCoder[posState].Decode(rangeDecoder));
     }
     else
     {
         uint symbol = CBase.kNumLowLenSymbols;
         if (m_Choice2.Decode(rangeDecoder) == 0)
         {
             symbol += m_MidCoder[posState].Decode(rangeDecoder);
         }
         else
         {
             symbol += CBase.kNumMidLenSymbols;
             symbol += m_HighCoder.Decode(rangeDecoder);
         }
         return(symbol);
     }
 }
예제 #7
0
                public byte DecodeWithMatchByte(CRangeDecoder 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);
                }
예제 #8
0
 public byte DecodeWithMatchByte(CRangeDecoder rangeDecoder, uint pos, byte prevByte, byte matchByte)
 {
     return(m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte));
 }
예제 #9
0
 public byte DecodeNormal(CRangeDecoder rangeDecoder, uint pos, byte prevByte)
 {
     return(m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder));
 }