public void Encode(Encoder rangeEncoder, UInt32 symbol) {
			UInt32 m = 1;
			for (int bitIndex = NumBitLevels; bitIndex > 0;) {
				bitIndex--;
				UInt32 bit = (symbol >> bitIndex) & 1;
				Models[m].Encode(rangeEncoder, bit);
				m = (m << 1) | bit;
			}
		}
		public void ReverseEncode(Encoder rangeEncoder, UInt32 symbol) {
			UInt32 m = 1;
			for (UInt32 i = 0; i < NumBitLevels; i++) {
				UInt32 bit = symbol & 1;
				Models[m].Encode(rangeEncoder, bit);
				m = (m << 1) | bit;
				symbol >>= 1;
			}
		}
		public static void ReverseEncode(BitEncoder[] Models, UInt32 startIndex,
		                                 Encoder rangeEncoder, int NumBitLevels, UInt32 symbol) {
			UInt32 m = 1;
			for (int i = 0; i < NumBitLevels; i++) {
				UInt32 bit = symbol & 1;
				Models[startIndex + m].Encode(rangeEncoder, bit);
				m = (m << 1) | bit;
				symbol >>= 1;
			}
		}
Beispiel #4
0
		public void Encode(Encoder encoder, uint symbol) {
			// encoder.EncodeBit(Prob, kNumBitModelTotalBits, symbol);
			// UpdateModel(symbol);
			uint newBound = (encoder.Range >> kNumBitModelTotalBits) * Prob;
			if (symbol == 0) {
				encoder.Range = newBound;
				Prob += (kBitModelTotal - Prob) >> kNumMoveBits;
			}
			else {
				encoder.Low += newBound;
				encoder.Range -= newBound;
				Prob -= (Prob) >> kNumMoveBits;
			}
			if (encoder.Range < Encoder.kTopValue) {
				encoder.Range <<= 8;
				encoder.ShiftLow();
			}
		}