1*f6dc9357SAndroid Build Coastguard Worker // LzxDecoder.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_LZX_DECODER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_LZX_DECODER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "HuffmanDecoder.h" 7*f6dc9357SAndroid Build Coastguard Worker #include "Lzx.h" 8*f6dc9357SAndroid Build Coastguard Worker 9*f6dc9357SAndroid Build Coastguard Worker namespace NCompress { 10*f6dc9357SAndroid Build Coastguard Worker namespace NLzx { 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker const unsigned kAdditionalOutputBufSize = 32 * 2; 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumTableBits_Main = 11; 15*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumTableBits_Len = 8; 16*f6dc9357SAndroid Build Coastguard Worker 17*f6dc9357SAndroid Build Coastguard Worker // if (kNumLenSymols_Big <= 256) we can use NHuffman::CDecoder256 18*f6dc9357SAndroid Build Coastguard Worker // if (kNumLenSymols_Big > 256) we must use NHuffman::CDecoder 19*f6dc9357SAndroid Build Coastguard Worker // const unsigned kNumLenSymols_Big_Start = kNumLenSlots - 1 + kMatchMinLen; // 8 - 1 + 2 20*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLenSymols_Big_Start = 0; 21*f6dc9357SAndroid Build Coastguard Worker // const unsigned kNumLenSymols_Big_Start = 0; 22*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLenSymols_Big = kNumLenSymols_Big_Start + kNumLenSymbols; 23*f6dc9357SAndroid Build Coastguard Worker 24*f6dc9357SAndroid Build Coastguard Worker #if 1 25*f6dc9357SAndroid Build Coastguard Worker // for smallest structure size: 26*f6dc9357SAndroid Build Coastguard Worker const unsigned kPosSlotOffset = 0; 27*f6dc9357SAndroid Build Coastguard Worker #else 28*f6dc9357SAndroid Build Coastguard Worker // use virtual entries for mispredicted branches: 29*f6dc9357SAndroid Build Coastguard Worker const unsigned kPosSlotOffset = 256 / kNumLenSlots; 30*f6dc9357SAndroid Build Coastguard Worker #endif 31*f6dc9357SAndroid Build Coastguard Worker 32*f6dc9357SAndroid Build Coastguard Worker class CBitByteDecoder; 33*f6dc9357SAndroid Build Coastguard Worker 34*f6dc9357SAndroid Build Coastguard Worker class CDecoder 35*f6dc9357SAndroid Build Coastguard Worker { 36*f6dc9357SAndroid Build Coastguard Worker public: 37*f6dc9357SAndroid Build Coastguard Worker UInt32 _pos; 38*f6dc9357SAndroid Build Coastguard Worker UInt32 _winSize; 39*f6dc9357SAndroid Build Coastguard Worker Byte *_win; 40*f6dc9357SAndroid Build Coastguard Worker 41*f6dc9357SAndroid Build Coastguard Worker bool _overDict; 42*f6dc9357SAndroid Build Coastguard Worker bool _isUncompressedBlock; 43*f6dc9357SAndroid Build Coastguard Worker bool _skipByte; 44*f6dc9357SAndroid Build Coastguard Worker bool _keepHistory; 45*f6dc9357SAndroid Build Coastguard Worker bool _keepHistoryForNext; 46*f6dc9357SAndroid Build Coastguard Worker bool _needAlloc; 47*f6dc9357SAndroid Build Coastguard Worker bool _wimMode; 48*f6dc9357SAndroid Build Coastguard Worker Byte _numDictBits; 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Worker // unsigned _numAlignBits_PosSlots; 51*f6dc9357SAndroid Build Coastguard Worker // unsigned _numAlignBits; 52*f6dc9357SAndroid Build Coastguard Worker UInt32 _numAlignBits_Dist; 53*f6dc9357SAndroid Build Coastguard Worker private: 54*f6dc9357SAndroid Build Coastguard Worker unsigned _numPosLenSlots; 55*f6dc9357SAndroid Build Coastguard Worker UInt32 _unpackBlockSize; 56*f6dc9357SAndroid Build Coastguard Worker 57*f6dc9357SAndroid Build Coastguard Worker UInt32 _writePos; 58*f6dc9357SAndroid Build Coastguard Worker 59*f6dc9357SAndroid Build Coastguard Worker UInt32 _x86_translationSize; 60*f6dc9357SAndroid Build Coastguard Worker UInt32 _x86_processedSize; 61*f6dc9357SAndroid Build Coastguard Worker Byte *_x86_buf; 62*f6dc9357SAndroid Build Coastguard Worker 63*f6dc9357SAndroid Build Coastguard Worker Byte *_unpackedData; 64*f6dc9357SAndroid Build Coastguard Worker public: 65*f6dc9357SAndroid Build Coastguard Worker Byte _extra[kPosSlotOffset + kNumPosSlots]; 66*f6dc9357SAndroid Build Coastguard Worker UInt32 _reps[kPosSlotOffset + kNumPosSlots]; 67*f6dc9357SAndroid Build Coastguard Worker 68*f6dc9357SAndroid Build Coastguard Worker NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize, kNumTableBits_Main> _mainDecoder; 69*f6dc9357SAndroid Build Coastguard Worker NHuffman::CDecoder256<kNumHuffmanBits, kNumLenSymols_Big, kNumTableBits_Len> _lenDecoder; 70*f6dc9357SAndroid Build Coastguard Worker NHuffman::CDecoder7b<kAlignTableSize> _alignDecoder; 71*f6dc9357SAndroid Build Coastguard Worker private: 72*f6dc9357SAndroid Build Coastguard Worker Byte _mainLevels[kMainTableSize]; 73*f6dc9357SAndroid Build Coastguard Worker Byte _lenLevels[kNumLenSymols_Big]; 74*f6dc9357SAndroid Build Coastguard Worker 75*f6dc9357SAndroid Build Coastguard Worker HRESULT Flush() throw(); 76*f6dc9357SAndroid Build Coastguard Worker bool ReadTables(CBitByteDecoder &_bitStream) throw(); 77*f6dc9357SAndroid Build Coastguard Worker 78*f6dc9357SAndroid Build Coastguard Worker HRESULT CodeSpec(const Byte *inData, size_t inSize, UInt32 outSize) throw(); 79*f6dc9357SAndroid Build Coastguard Worker HRESULT SetParams2(unsigned numDictBits) throw(); 80*f6dc9357SAndroid Build Coastguard Worker public: 81*f6dc9357SAndroid Build Coastguard Worker CDecoder() throw(); 82*f6dc9357SAndroid Build Coastguard Worker ~CDecoder() throw(); 83*f6dc9357SAndroid Build Coastguard Worker Set_WimMode(bool wimMode)84*f6dc9357SAndroid Build Coastguard Worker void Set_WimMode(bool wimMode) { _wimMode = wimMode; } Set_KeepHistory(bool keepHistory)85*f6dc9357SAndroid Build Coastguard Worker void Set_KeepHistory(bool keepHistory) { _keepHistory = keepHistory; } Set_KeepHistoryForNext(bool keepHistoryForNext)86*f6dc9357SAndroid Build Coastguard Worker void Set_KeepHistoryForNext(bool keepHistoryForNext) { _keepHistoryForNext = keepHistoryForNext; } 87*f6dc9357SAndroid Build Coastguard Worker Set_ExternalWindow_DictBits(Byte * win,unsigned numDictBits)88*f6dc9357SAndroid Build Coastguard Worker HRESULT Set_ExternalWindow_DictBits(Byte *win, unsigned numDictBits) 89*f6dc9357SAndroid Build Coastguard Worker { 90*f6dc9357SAndroid Build Coastguard Worker _needAlloc = false; 91*f6dc9357SAndroid Build Coastguard Worker _win = win; 92*f6dc9357SAndroid Build Coastguard Worker _winSize = (UInt32)1 << numDictBits; 93*f6dc9357SAndroid Build Coastguard Worker return SetParams2(numDictBits); 94*f6dc9357SAndroid Build Coastguard Worker } 95*f6dc9357SAndroid Build Coastguard Worker HRESULT Set_DictBits_and_Alloc(unsigned numDictBits) throw(); 96*f6dc9357SAndroid Build Coastguard Worker 97*f6dc9357SAndroid Build Coastguard Worker HRESULT Code_WithExceedReadWrite(const Byte *inData, size_t inSize, UInt32 outSize) throw(); 98*f6dc9357SAndroid Build Coastguard Worker WasBlockFinished()99*f6dc9357SAndroid Build Coastguard Worker bool WasBlockFinished() const { return _unpackBlockSize == 0; } GetUnpackData()100*f6dc9357SAndroid Build Coastguard Worker const Byte *GetUnpackData() const { return _unpackedData; } GetUnpackSize()101*f6dc9357SAndroid Build Coastguard Worker UInt32 GetUnpackSize() const { return _pos - _writePos; } 102*f6dc9357SAndroid Build Coastguard Worker }; 103*f6dc9357SAndroid Build Coastguard Worker 104*f6dc9357SAndroid Build Coastguard Worker }} 105*f6dc9357SAndroid Build Coastguard Worker 106*f6dc9357SAndroid Build Coastguard Worker #endif 107