public long DecodeIAID(long codeLen, ArithmeticDecoderStats stats) { previous = 1; for (long i = 0; i < codeLen; i++) { int bit = DecodeBit(previous, stats); previous = BinaryOperation.Bit32ShiftL(previous, 1) | bit; } return(previous - (1 << (int)codeLen)); }
public long Get24Bits() { while (bufferLength < 24) { buffer = ((BinaryOperation.Bit32ShiftL(buffer, 8)) | (reader.Readbyte() & 0xff)); bufferLength += 8; noOfbytesRead++; } return((BinaryOperation.Bit32ShiftR(buffer, (int)(bufferLength - 24))) & 0xffffff); }
public void Start() { buffer0 = reader.Readbyte(); buffer1 = reader.Readbyte(); c = BinaryOperation.Bit32ShiftL((buffer0 ^ 0xff), 16); Readbyte(); c = BinaryOperation.Bit32ShiftL(c, 7); counter -= 7; a = 0x80000000l; }
public int Get2DCode() { int tuple0, tuple1; if (bufferLength == 0) { buffer = (reader.Readbyte() & 0xff); bufferLength = 8; noOfbytesRead++; int lookup = (int)((BinaryOperation.Bit32ShiftR(buffer, 1)) & 0x7f); tuple0 = twoDimensionalTable1[lookup, 0]; tuple1 = twoDimensionalTable1[lookup, 1]; } else if (bufferLength == 8) { int lookup = (int)((BinaryOperation.Bit32ShiftR(buffer, 1)) & 0x7f); tuple0 = twoDimensionalTable1[lookup, 0]; tuple1 = twoDimensionalTable1[lookup, 1]; } else { int lookup = (int)((BinaryOperation.Bit32ShiftL(buffer, (int)(7 - bufferLength))) & 0x7f); tuple0 = twoDimensionalTable1[lookup, 0]; tuple1 = twoDimensionalTable1[lookup, 1]; if (tuple0 < 0 || tuple0 > (int)bufferLength) { int right = (reader.Readbyte() & 0xff); long left = (BinaryOperation.Bit32ShiftL(buffer, 8)); buffer = left | right; bufferLength += 8; noOfbytesRead++; int look = (int)(BinaryOperation.Bit32ShiftR(buffer, (int)(bufferLength - 7)) & 0x7f); tuple0 = twoDimensionalTable1[look, 0]; tuple1 = twoDimensionalTable1[look, 1]; } } if (tuple0 < 0) { return(0); } bufferLength -= tuple0; return(tuple1); }
private int DecodeIntBit(ArithmeticDecoderStats stats) { int bit = DecodeBit(previous, stats); if (previous < 0x100) { previous = BinaryOperation.Bit32ShiftL(previous, 1) | bit; } else { previous = (((BinaryOperation.Bit32ShiftL(previous, 1)) | bit) & 0x1ff) | 0x100; } return(bit); }
private void Readbyte() { if (buffer0 == 0xff) { if (buffer1 > 0x8f) { counter = 8; } else { buffer0 = buffer1; buffer1 = reader.Readbyte(); c = c + 0xfe00 - (BinaryOperation.Bit32ShiftL(buffer0, 9)); counter = 7; } } else { buffer0 = buffer1; buffer1 = reader.Readbyte(); c = c + 0xff00 - (BinaryOperation.Bit32ShiftL(buffer0, 8)); counter = 8; } }
public int GetBlackCode() { int tuple0, tuple1; long code; if (bufferLength == 0) { buffer = (reader.Readbyte() & 0xff); bufferLength = 8; noOfbytesRead++; } while (true) { if (bufferLength >= 6 && ((BinaryOperation.Bit32ShiftR(buffer, (int)(bufferLength - 6))) & 0x3f) == 0) { if (bufferLength <= 13) { code = BinaryOperation.Bit32ShiftL(buffer, (int)(13 - bufferLength)); } else { code = BinaryOperation.Bit32ShiftR(buffer, (int)(bufferLength - 13)); } tuple0 = blackTable1[(int)(code & 0x7f), 0]; tuple1 = blackTable1[(int)(code & 0x7f), 1]; } else if (bufferLength >= 4 && ((buffer >> ((int)bufferLength - 4)) & 0x0f) == 0) { if (bufferLength <= 12) { code = BinaryOperation.Bit32ShiftL(buffer, (int)(12 - bufferLength)); } else { code = BinaryOperation.Bit32ShiftR(buffer, (int)(bufferLength - 12)); } int lookup = (int)((code & 0xff) - 64); if (lookup >= 0) { tuple0 = blackTable2[lookup, 0]; tuple1 = blackTable2[lookup, 1]; } else { tuple0 = blackTable1[blackTable1.Length + lookup, 0]; tuple1 = blackTable1[blackTable1.Length + lookup, 1]; } } else { if (bufferLength <= 6) { code = BinaryOperation.Bit32ShiftL(buffer, (int)(6 - bufferLength)); } else { code = BinaryOperation.Bit32ShiftR(buffer, (int)(bufferLength - 6)); } int lookup = (int)(code & 0x3f); if (lookup >= 0) { tuple0 = blackTable3[lookup, 0]; tuple1 = blackTable3[lookup, 1]; } else { tuple0 = blackTable2[blackTable2.Length + lookup, 0]; tuple1 = blackTable2[blackTable2.Length + lookup, 1]; } } if (tuple0 > 0 && tuple0 <= (int)bufferLength) { bufferLength -= tuple0; return(tuple1); } if (bufferLength >= 13) { break; } buffer = ((BinaryOperation.Bit32ShiftL(buffer, 8)) | (reader.Readbyte() & 0xff)); bufferLength += 8; noOfbytesRead++; } bufferLength--; return(1); }
public int GetWhiteCode() { int tuple0, tuple1; long code; if (bufferLength == 0) { buffer = (reader.Readbyte() & 0xff); bufferLength = 8; noOfbytesRead++; } while (true) { if (bufferLength >= 7 && ((BinaryOperation.Bit32ShiftR(buffer, (int)(bufferLength - 7))) & 0x7f) == 0) { if (bufferLength <= 12) { code = BinaryOperation.Bit32ShiftL(buffer, (int)(12 - bufferLength)); } else { code = BinaryOperation.Bit32ShiftR(buffer, (int)(bufferLength - 12)); } tuple0 = whiteTable1[(int)(code & 0x1f), 0]; tuple1 = whiteTable1[(int)(code & 0x1f), 1]; } else { if (bufferLength <= 9) { code = BinaryOperation.Bit32ShiftL(buffer, (int)(9 - bufferLength)); } else { code = BinaryOperation.Bit32ShiftR(buffer, (int)(bufferLength - 9)); } int lookup = (int)(code & 0x1ff); if (lookup >= 0) { tuple0 = whiteTable2[lookup, 0]; tuple1 = whiteTable2[lookup, 1]; } else { tuple0 = whiteTable2[whiteTable2.Length + lookup, 0]; tuple1 = whiteTable2[whiteTable2.Length + lookup, 1]; } } if (tuple0 > 0 && tuple0 <= (int)bufferLength) { bufferLength -= tuple0; return(tuple1); } if (bufferLength >= 12) { break; } buffer = ((BinaryOperation.Bit32ShiftL(buffer, 8)) | reader.Readbyte() & 0xff); bufferLength += 8; noOfbytesRead++; } bufferLength--; return(1); }
public int DecodeBit(long context, ArithmeticDecoderStats stats) { int iCX = BinaryOperation.Bit8Shift(stats.GetContextCodingTableValue((int)context), 1, BinaryOperation.RIGHT_SHIFT); int mpsCX = stats.GetContextCodingTableValue((int)context) & 1; int qe = qeTable[iCX]; a -= qe; int bit; if (c < a) { if ((a & 0x80000000) != 0) { bit = mpsCX; } else { if (a < qe) { bit = 1 - mpsCX; if (switchTable[iCX] != 0) { stats.SetContextCodingTableValue((int)context, (nlpsTable[iCX] << 1) | (1 - mpsCX)); } else { stats.SetContextCodingTableValue((int)context, (nlpsTable[iCX] << 1) | mpsCX); } } else { bit = mpsCX; stats.SetContextCodingTableValue((int)context, (nmpsTable[iCX] << 1) | mpsCX); } do { if (counter == 0) { Readbyte(); } a = BinaryOperation.Bit32ShiftL(a, 1); c = BinaryOperation.Bit32ShiftL(c, 1); counter--; } while ((a & 0x80000000) == 0); } } else { c -= a; if (a < qe) { bit = mpsCX; stats.SetContextCodingTableValue((int)context, (nmpsTable[iCX] << 1) | mpsCX); } else { bit = 1 - mpsCX; if (switchTable[iCX] != 0) { stats.SetContextCodingTableValue((int)context, (nlpsTable[iCX] << 1) | (1 - mpsCX)); } else { stats.SetContextCodingTableValue((int)context, (nlpsTable[iCX] << 1) | mpsCX); } } a = qe; do { if (counter == 0) { Readbyte(); } a = BinaryOperation.Bit32ShiftL(a, 1); c = BinaryOperation.Bit32ShiftL(c, 1); counter--; } while ((a & 0x80000000) == 0); } return(bit); }
public DecodeIntResult DecodeInt(ArithmeticDecoderStats stats) { long value; previous = 1; int s = DecodeIntBit(stats); if (DecodeIntBit(stats) != 0) { if (DecodeIntBit(stats) != 0) { if (DecodeIntBit(stats) != 0) { if (DecodeIntBit(stats) != 0) { if (DecodeIntBit(stats) != 0) { value = 0; for (int i = 0; i < 32; i++) { value = BinaryOperation.Bit32ShiftL(value, 1) | DecodeIntBit(stats); } value += 4436; } else { value = 0; for (int i = 0; i < 12; i++) { value = BinaryOperation.Bit32ShiftL(value, 1) | DecodeIntBit(stats); } value += 340; } } else { value = 0; for (int i = 0; i < 8; i++) { value = BinaryOperation.Bit32ShiftL(value, 1) | DecodeIntBit(stats); } value += 84; } } else { value = 0; for (int i = 0; i < 6; i++) { value = BinaryOperation.Bit32ShiftL(value, 1) | DecodeIntBit(stats); } value += 20; } } else { value = DecodeIntBit(stats); value = BinaryOperation.Bit32ShiftL(value, 1) | DecodeIntBit(stats); value = BinaryOperation.Bit32ShiftL(value, 1) | DecodeIntBit(stats); value = BinaryOperation.Bit32ShiftL(value, 1) | DecodeIntBit(stats); value += 4; } } else { value = DecodeIntBit(stats); value = BinaryOperation.Bit32ShiftL(value, 1) | DecodeIntBit(stats); } int decodedInt; if (s != 0) { if (value == 0) { return(new DecodeIntResult((int)value, false)); } decodedInt = (int)-value; } else { decodedInt = (int)value; } return(new DecodeIntResult(decodedInt, true)); }