} /* size == U32 */ public static void InitDState(FSE_DState_t DStatePtr, BIT_DStream_t bitD, FSE_DTable *dt) { void * ptr = dt; FSE_DTableHeader *DTableH = (FSE_DTableHeader *)ptr; DStatePtr.state = ReadBits(bitD, DTableH->tableLog); ReloadDStream(bitD); DStatePtr.table = dt + 1; }
/*! DecodeSymbolFast() : * unsafe, only works if no symbol has a probability > 50% */ public static BYTE DecodeSymbolFast(FSE_DState_t DStatePtr, BIT_DStream_t bitD) { FSE_decode_t DInfo = ((FSE_decode_t *)(DStatePtr.table))[DStatePtr.state]; U32 nbBits = DInfo.nbBits; BYTE symbol = DInfo.symbol; size_t lowBits = ReadBitsFast(bitD, nbBits); DStatePtr.state = DInfo.newState + lowBits; return(symbol); }
//#ifndef FSE_COMMONDEFS_ONLY ///*-******************************************************* //* Decompression (Byte symbols) //*********************************************************/ //size_t FSE_buildDTable_rle (FSE_DTable* dt, BYTE symbolValue) //{ // void* ptr = dt; // FSE_DTableHeader* DTableH = (FSE_DTableHeader*)ptr; // void* dPtr = dt + 1; // FSE_decode_t* cell = (FSE_decode_t*)dPtr; // DTableH->tableLog = 0; // DTableH->fastMode = 0; // cell->newState = 0; // cell->symbol = symbolValue; // cell->nbBits = 0; // return 0; //} //size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits) //{ // void* ptr = dt; // FSE_DTableHeader* DTableH = (FSE_DTableHeader*)ptr; // void* dPtr = dt + 1; // FSE_decode_t* dinfo = (FSE_decode_t*)dPtr; // unsigned tableSize = 1 << nbBits; // unsigned tableMask = tableSize - 1; // unsigned maxSV1 = tableMask+1; // unsigned s; // /* Sanity checks */ // if (nbBits < 1) return ERROR( Error.GENERIC); /* min size */ // /* Build Decoding Table */ // DTableH->tableLog = (U16)nbBits; // DTableH->fastMode = 1; // for (s=0; s<maxSV1; s++) { // dinfo[s].newState = 0; // dinfo[s].symbol = (BYTE)s; // dinfo[s].nbBits = (BYTE)nbBits; // } // return 0; //} public static size_t FSE_decompress_usingDTable_generic(void *dst, size_t maxDstSize, void *cSrc, size_t cSrcSize, FSE_DTable *dt, uint fast) { BYTE *ostart = (BYTE *)dst; BYTE *op = ostart; BYTE *omax = op + maxDstSize; BYTE *olimit = omax - 3; BIT_DStream_t bitD = new BIT_DStream_t(); FSE_DState_t state1 = new FSE_DState_t(); FSE_DState_t state2 = new FSE_DState_t(); /* Init */ { size_t errcod = InitDStream(bitD, cSrc, cSrcSize); if (IsError(errcod)) { return(errcod); } } Fse.InitDState(state1, bitD, dt); Fse.InitDState(state2, bitD, dt); //#define FSE_GETSYMBOL(statePtr) fast ? DecodeSymbolFast(statePtr, &bitD) : DecodeSymbol(statePtr, &bitD) /* 4 symbols per loop */ for (; (ReloadDStream(bitD) == BIT_DStream_status.BIT_DStream_unfinished) & (op < olimit); op += 4) { op[0] = fast != 0 ? DecodeSymbolFast(state1, bitD) : DecodeSymbol(state1, bitD); //if (FSE_MAX_TABLELOG * 2 + 7 > sizeOfBitContainer * 8) /* This test must be static */ // ReloadDStream(bitD); op[1] = fast != 0 ? DecodeSymbolFast(state2, bitD) : DecodeSymbol(state2, bitD); if (FSE_MAX_TABLELOG * 4 + 7 > sizeOfBitContainer * 8) /* This test must be static */ { if (ReloadDStream(bitD) > BIT_DStream_status.BIT_DStream_unfinished) { op += 2; break; } } op[2] = fast != 0 ? DecodeSymbolFast(state1, bitD) : DecodeSymbol(state1, bitD); //if (FSE_MAX_TABLELOG * 2 + 7 > sizeOfBitContainer * 8) /* This test must be static */ // ReloadDStream(bitD); op[3] = fast != 0 ? DecodeSymbolFast(state2, bitD) : DecodeSymbol(state2, bitD); } /* tail */ /* note : ReloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly BIT_DStream_completed */ while (true) { if (op > (omax - 2)) { return(ERROR(Error.dstSize_tooSmall)); } *op++ = fast != 0 ? DecodeSymbolFast(state1, bitD) : DecodeSymbol(state1, bitD); if (ReloadDStream(bitD) == BIT_DStream_status.BIT_DStream_overflow) { *op++ = fast != 0 ? DecodeSymbolFast(state2, bitD) : DecodeSymbol(state2, bitD); break; } if (op > (omax - 2)) { return(ERROR(Error.dstSize_tooSmall)); } *op++ = fast != 0 ? DecodeSymbolFast(state2, bitD) : DecodeSymbol(state2, bitD); if (ReloadDStream(bitD) == BIT_DStream_status.BIT_DStream_overflow) { *op++ = fast != 0 ? DecodeSymbolFast(state1, bitD) : DecodeSymbol(state1, bitD); break; } } return((size_t)(op - ostart)); }