1*f6dc9357SAndroid Build Coastguard Worker // Compress/BZip2Decoder.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_COMPRESS_BZIP2_DECODER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMPRESS_BZIP2_DECODER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker // #define Z7_NO_READ_FROM_CODER 9*f6dc9357SAndroid Build Coastguard Worker // #define Z7_ST 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST 12*f6dc9357SAndroid Build Coastguard Worker #include "../../Windows/Synchronization.h" 13*f6dc9357SAndroid Build Coastguard Worker #include "../../Windows/Thread.h" 14*f6dc9357SAndroid Build Coastguard Worker #endif 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h" 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker #include "BZip2Const.h" 19*f6dc9357SAndroid Build Coastguard Worker #include "BZip2Crc.h" 20*f6dc9357SAndroid Build Coastguard Worker #include "HuffmanDecoder.h" 21*f6dc9357SAndroid Build Coastguard Worker #include "Mtf8.h" 22*f6dc9357SAndroid Build Coastguard Worker 23*f6dc9357SAndroid Build Coastguard Worker namespace NCompress { 24*f6dc9357SAndroid Build Coastguard Worker namespace NBZip2 { 25*f6dc9357SAndroid Build Coastguard Worker 26*f6dc9357SAndroid Build Coastguard Worker bool IsEndSig(const Byte *p) throw(); 27*f6dc9357SAndroid Build Coastguard Worker bool IsBlockSig(const Byte *p) throw(); 28*f6dc9357SAndroid Build Coastguard Worker 29*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumTableBits = 9; 30*f6dc9357SAndroid Build Coastguard Worker 31*f6dc9357SAndroid Build Coastguard Worker typedef NHuffman::CDecoder<kMaxHuffmanLen, kMaxAlphaSize, kNumTableBits> CHuffmanDecoder; 32*f6dc9357SAndroid Build Coastguard Worker 33*f6dc9357SAndroid Build Coastguard Worker 34*f6dc9357SAndroid Build Coastguard Worker struct CBlockProps 35*f6dc9357SAndroid Build Coastguard Worker { 36*f6dc9357SAndroid Build Coastguard Worker UInt32 blockSize; 37*f6dc9357SAndroid Build Coastguard Worker UInt32 origPtr; 38*f6dc9357SAndroid Build Coastguard Worker unsigned randMode; 39*f6dc9357SAndroid Build Coastguard Worker CBlockPropsCBlockProps40*f6dc9357SAndroid Build Coastguard Worker CBlockProps(): blockSize(0), origPtr(0), randMode(0) {} 41*f6dc9357SAndroid Build Coastguard Worker }; 42*f6dc9357SAndroid Build Coastguard Worker 43*f6dc9357SAndroid Build Coastguard Worker 44*f6dc9357SAndroid Build Coastguard Worker struct CBitDecoder 45*f6dc9357SAndroid Build Coastguard Worker { 46*f6dc9357SAndroid Build Coastguard Worker unsigned _numBits; 47*f6dc9357SAndroid Build Coastguard Worker UInt32 _value; 48*f6dc9357SAndroid Build Coastguard Worker const Byte *_buf; 49*f6dc9357SAndroid Build Coastguard Worker const Byte *_lim; 50*f6dc9357SAndroid Build Coastguard Worker InitBitDecoderCBitDecoder51*f6dc9357SAndroid Build Coastguard Worker void InitBitDecoder() 52*f6dc9357SAndroid Build Coastguard Worker { 53*f6dc9357SAndroid Build Coastguard Worker _numBits = 0; 54*f6dc9357SAndroid Build Coastguard Worker _value = 0; 55*f6dc9357SAndroid Build Coastguard Worker } 56*f6dc9357SAndroid Build Coastguard Worker AlignToByteCBitDecoder57*f6dc9357SAndroid Build Coastguard Worker void AlignToByte() 58*f6dc9357SAndroid Build Coastguard Worker { 59*f6dc9357SAndroid Build Coastguard Worker unsigned bits = _numBits & 7; 60*f6dc9357SAndroid Build Coastguard Worker _numBits -= bits; 61*f6dc9357SAndroid Build Coastguard Worker _value <<= bits; 62*f6dc9357SAndroid Build Coastguard Worker } 63*f6dc9357SAndroid Build Coastguard Worker 64*f6dc9357SAndroid Build Coastguard Worker /* 65*f6dc9357SAndroid Build Coastguard Worker bool AreRemainByteBitsEmpty() const 66*f6dc9357SAndroid Build Coastguard Worker { 67*f6dc9357SAndroid Build Coastguard Worker unsigned bits = _numBits & 7; 68*f6dc9357SAndroid Build Coastguard Worker if (bits != 0) 69*f6dc9357SAndroid Build Coastguard Worker return (_value >> (32 - bits)) == 0; 70*f6dc9357SAndroid Build Coastguard Worker return true; 71*f6dc9357SAndroid Build Coastguard Worker } 72*f6dc9357SAndroid Build Coastguard Worker */ 73*f6dc9357SAndroid Build Coastguard Worker 74*f6dc9357SAndroid Build Coastguard Worker SRes ReadByte(int &b); 75*f6dc9357SAndroid Build Coastguard Worker CBitDecoderCBitDecoder76*f6dc9357SAndroid Build Coastguard Worker CBitDecoder(): 77*f6dc9357SAndroid Build Coastguard Worker _buf(NULL), 78*f6dc9357SAndroid Build Coastguard Worker _lim(NULL) 79*f6dc9357SAndroid Build Coastguard Worker { 80*f6dc9357SAndroid Build Coastguard Worker InitBitDecoder(); 81*f6dc9357SAndroid Build Coastguard Worker } 82*f6dc9357SAndroid Build Coastguard Worker }; 83*f6dc9357SAndroid Build Coastguard Worker 84*f6dc9357SAndroid Build Coastguard Worker 85*f6dc9357SAndroid Build Coastguard Worker // 19.03: we allow additional 8 selectors to support files created by lbzip2. 86*f6dc9357SAndroid Build Coastguard Worker const UInt32 kNumSelectorsMax_Decoder = kNumSelectorsMax + 8; 87*f6dc9357SAndroid Build Coastguard Worker 88*f6dc9357SAndroid Build Coastguard Worker struct CBase: public CBitDecoder 89*f6dc9357SAndroid Build Coastguard Worker { 90*f6dc9357SAndroid Build Coastguard Worker unsigned numInUse; 91*f6dc9357SAndroid Build Coastguard Worker UInt32 groupIndex; 92*f6dc9357SAndroid Build Coastguard Worker UInt32 groupSize; 93*f6dc9357SAndroid Build Coastguard Worker unsigned runPower; 94*f6dc9357SAndroid Build Coastguard Worker UInt32 runCounter; 95*f6dc9357SAndroid Build Coastguard Worker UInt32 blockSize; 96*f6dc9357SAndroid Build Coastguard Worker 97*f6dc9357SAndroid Build Coastguard Worker UInt32 *Counters; 98*f6dc9357SAndroid Build Coastguard Worker UInt32 blockSizeMax; 99*f6dc9357SAndroid Build Coastguard Worker 100*f6dc9357SAndroid Build Coastguard Worker unsigned state; 101*f6dc9357SAndroid Build Coastguard Worker UInt32 state2; 102*f6dc9357SAndroid Build Coastguard Worker unsigned state3; 103*f6dc9357SAndroid Build Coastguard Worker unsigned state4; 104*f6dc9357SAndroid Build Coastguard Worker unsigned state5; 105*f6dc9357SAndroid Build Coastguard Worker unsigned numTables; 106*f6dc9357SAndroid Build Coastguard Worker UInt32 numSelectors; 107*f6dc9357SAndroid Build Coastguard Worker 108*f6dc9357SAndroid Build Coastguard Worker CBlockProps Props; 109*f6dc9357SAndroid Build Coastguard Worker 110*f6dc9357SAndroid Build Coastguard Worker private: 111*f6dc9357SAndroid Build Coastguard Worker CMtf8Decoder mtf; 112*f6dc9357SAndroid Build Coastguard Worker Byte selectors[kNumSelectorsMax_Decoder]; 113*f6dc9357SAndroid Build Coastguard Worker CHuffmanDecoder huffs[kNumTablesMax]; 114*f6dc9357SAndroid Build Coastguard Worker 115*f6dc9357SAndroid Build Coastguard Worker Byte lens[kMaxAlphaSize]; 116*f6dc9357SAndroid Build Coastguard Worker 117*f6dc9357SAndroid Build Coastguard Worker Byte temp[10]; 118*f6dc9357SAndroid Build Coastguard Worker 119*f6dc9357SAndroid Build Coastguard Worker public: 120*f6dc9357SAndroid Build Coastguard Worker UInt32 crc; 121*f6dc9357SAndroid Build Coastguard Worker CBZip2CombinedCrc CombinedCrc; 122*f6dc9357SAndroid Build Coastguard Worker 123*f6dc9357SAndroid Build Coastguard Worker bool IsBz; 124*f6dc9357SAndroid Build Coastguard Worker bool StreamCrcError; 125*f6dc9357SAndroid Build Coastguard Worker bool MinorError; 126*f6dc9357SAndroid Build Coastguard Worker bool NeedMoreInput; 127*f6dc9357SAndroid Build Coastguard Worker 128*f6dc9357SAndroid Build Coastguard Worker bool DecodeAllStreams; 129*f6dc9357SAndroid Build Coastguard Worker 130*f6dc9357SAndroid Build Coastguard Worker UInt64 NumStreams; 131*f6dc9357SAndroid Build Coastguard Worker UInt64 NumBlocks; 132*f6dc9357SAndroid Build Coastguard Worker UInt64 FinishedPackSize; 133*f6dc9357SAndroid Build Coastguard Worker 134*f6dc9357SAndroid Build Coastguard Worker ISequentialInStream *InStream; 135*f6dc9357SAndroid Build Coastguard Worker 136*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_READ_FROM_CODER 137*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ISequentialInStream> InStreamRef; 138*f6dc9357SAndroid Build Coastguard Worker #endif 139*f6dc9357SAndroid Build Coastguard Worker CBaseCBase140*f6dc9357SAndroid Build Coastguard Worker CBase(): 141*f6dc9357SAndroid Build Coastguard Worker StreamCrcError(false), 142*f6dc9357SAndroid Build Coastguard Worker MinorError(false), 143*f6dc9357SAndroid Build Coastguard Worker NeedMoreInput(false), 144*f6dc9357SAndroid Build Coastguard Worker 145*f6dc9357SAndroid Build Coastguard Worker DecodeAllStreams(false), 146*f6dc9357SAndroid Build Coastguard Worker 147*f6dc9357SAndroid Build Coastguard Worker NumStreams(0), 148*f6dc9357SAndroid Build Coastguard Worker NumBlocks(0), 149*f6dc9357SAndroid Build Coastguard Worker FinishedPackSize(0) 150*f6dc9357SAndroid Build Coastguard Worker {} 151*f6dc9357SAndroid Build Coastguard Worker InitNumStreams2CBase152*f6dc9357SAndroid Build Coastguard Worker void InitNumStreams2() 153*f6dc9357SAndroid Build Coastguard Worker { 154*f6dc9357SAndroid Build Coastguard Worker StreamCrcError = false; 155*f6dc9357SAndroid Build Coastguard Worker MinorError = false; 156*f6dc9357SAndroid Build Coastguard Worker NeedMoreInput = 0; 157*f6dc9357SAndroid Build Coastguard Worker NumStreams = 0; 158*f6dc9357SAndroid Build Coastguard Worker NumBlocks = 0; 159*f6dc9357SAndroid Build Coastguard Worker FinishedPackSize = 0; 160*f6dc9357SAndroid Build Coastguard Worker } 161*f6dc9357SAndroid Build Coastguard Worker 162*f6dc9357SAndroid Build Coastguard Worker SRes ReadStreamSignature2(); 163*f6dc9357SAndroid Build Coastguard Worker SRes ReadBlockSignature2(); 164*f6dc9357SAndroid Build Coastguard Worker 165*f6dc9357SAndroid Build Coastguard Worker /* ReadBlock2() : Props->randMode: 166*f6dc9357SAndroid Build Coastguard Worker in: need read randMode bit 167*f6dc9357SAndroid Build Coastguard Worker out: randMode status */ 168*f6dc9357SAndroid Build Coastguard Worker SRes ReadBlock2(); 169*f6dc9357SAndroid Build Coastguard Worker }; 170*f6dc9357SAndroid Build Coastguard Worker 171*f6dc9357SAndroid Build Coastguard Worker 172*f6dc9357SAndroid Build Coastguard Worker class CSpecState 173*f6dc9357SAndroid Build Coastguard Worker { 174*f6dc9357SAndroid Build Coastguard Worker UInt32 _tPos; 175*f6dc9357SAndroid Build Coastguard Worker unsigned _prevByte; 176*f6dc9357SAndroid Build Coastguard Worker int _reps; 177*f6dc9357SAndroid Build Coastguard Worker 178*f6dc9357SAndroid Build Coastguard Worker public: 179*f6dc9357SAndroid Build Coastguard Worker CBZip2Crc _crc; 180*f6dc9357SAndroid Build Coastguard Worker UInt32 _blockSize; 181*f6dc9357SAndroid Build Coastguard Worker UInt32 *_tt; 182*f6dc9357SAndroid Build Coastguard Worker 183*f6dc9357SAndroid Build Coastguard Worker int _randToGo; 184*f6dc9357SAndroid Build Coastguard Worker unsigned _randIndex; 185*f6dc9357SAndroid Build Coastguard Worker 186*f6dc9357SAndroid Build Coastguard Worker void Init(UInt32 origPtr, unsigned randMode) throw(); 187*f6dc9357SAndroid Build Coastguard Worker Finished()188*f6dc9357SAndroid Build Coastguard Worker bool Finished() const { return _reps <= 0 && _blockSize == 0; } 189*f6dc9357SAndroid Build Coastguard Worker 190*f6dc9357SAndroid Build Coastguard Worker Byte *Decode(Byte *data, size_t size) throw(); 191*f6dc9357SAndroid Build Coastguard Worker }; 192*f6dc9357SAndroid Build Coastguard Worker 193*f6dc9357SAndroid Build Coastguard Worker 194*f6dc9357SAndroid Build Coastguard Worker 195*f6dc9357SAndroid Build Coastguard Worker 196*f6dc9357SAndroid Build Coastguard Worker class CDecoder: 197*f6dc9357SAndroid Build Coastguard Worker public ICompressCoder, 198*f6dc9357SAndroid Build Coastguard Worker public ICompressSetFinishMode, 199*f6dc9357SAndroid Build Coastguard Worker public ICompressGetInStreamProcessedSize, 200*f6dc9357SAndroid Build Coastguard Worker public ICompressReadUnusedFromInBuf, 201*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_READ_FROM_CODER 202*f6dc9357SAndroid Build Coastguard Worker public ICompressSetInStream, 203*f6dc9357SAndroid Build Coastguard Worker public ICompressSetOutStreamSize, 204*f6dc9357SAndroid Build Coastguard Worker public ISequentialInStream, 205*f6dc9357SAndroid Build Coastguard Worker #endif 206*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST 207*f6dc9357SAndroid Build Coastguard Worker public ICompressSetCoderMt, 208*f6dc9357SAndroid Build Coastguard Worker #endif 209*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp 210*f6dc9357SAndroid Build Coastguard Worker { 211*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_BEGIN2(ICompressCoder) 212*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(ICompressSetFinishMode) 213*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(ICompressGetInStreamProcessedSize) 214*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(ICompressReadUnusedFromInBuf) 215*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_READ_FROM_CODER 216*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(ICompressSetInStream) 217*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(ICompressSetOutStreamSize) 218*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(ISequentialInStream) 219*f6dc9357SAndroid Build Coastguard Worker #endif 220*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST 221*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(ICompressSetCoderMt) 222*f6dc9357SAndroid Build Coastguard Worker #endif 223*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_END 224*f6dc9357SAndroid Build Coastguard Worker Z7_COM_ADDREF_RELEASE 225*f6dc9357SAndroid Build Coastguard Worker 226*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICompressCoder) 227*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICompressSetFinishMode) 228*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICompressGetInStreamProcessedSize) 229*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICompressReadUnusedFromInBuf) 230*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_READ_FROM_CODER 231*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICompressSetInStream) 232*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICompressSetOutStreamSize) 233*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP_NONFINAL(ISequentialInStream) 234*f6dc9357SAndroid Build Coastguard Worker #endif 235*f6dc9357SAndroid Build Coastguard Worker public: 236*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST 237*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICompressSetCoderMt) 238*f6dc9357SAndroid Build Coastguard Worker #endif 239*f6dc9357SAndroid Build Coastguard Worker 240*f6dc9357SAndroid Build Coastguard Worker private: 241*f6dc9357SAndroid Build Coastguard Worker Byte *_outBuf; 242*f6dc9357SAndroid Build Coastguard Worker size_t _outPos; 243*f6dc9357SAndroid Build Coastguard Worker UInt64 _outWritten; 244*f6dc9357SAndroid Build Coastguard Worker ISequentialOutStream *_outStream; 245*f6dc9357SAndroid Build Coastguard Worker HRESULT _writeRes; 246*f6dc9357SAndroid Build Coastguard Worker 247*f6dc9357SAndroid Build Coastguard Worker protected: 248*f6dc9357SAndroid Build Coastguard Worker HRESULT ErrorResult; // for ISequentialInStream::Read mode only 249*f6dc9357SAndroid Build Coastguard Worker 250*f6dc9357SAndroid Build Coastguard Worker public: 251*f6dc9357SAndroid Build Coastguard Worker 252*f6dc9357SAndroid Build Coastguard Worker UInt32 _calcedBlockCrc; 253*f6dc9357SAndroid Build Coastguard Worker bool _blockFinished; 254*f6dc9357SAndroid Build Coastguard Worker bool BlockCrcError; 255*f6dc9357SAndroid Build Coastguard Worker 256*f6dc9357SAndroid Build Coastguard Worker bool FinishMode; 257*f6dc9357SAndroid Build Coastguard Worker bool _outSizeDefined; 258*f6dc9357SAndroid Build Coastguard Worker UInt64 _outSize; 259*f6dc9357SAndroid Build Coastguard Worker UInt64 _outPosTotal; 260*f6dc9357SAndroid Build Coastguard Worker 261*f6dc9357SAndroid Build Coastguard Worker CSpecState _spec; 262*f6dc9357SAndroid Build Coastguard Worker UInt32 *_counters; 263*f6dc9357SAndroid Build Coastguard Worker 264*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST 265*f6dc9357SAndroid Build Coastguard Worker 266*f6dc9357SAndroid Build Coastguard Worker struct CBlock 267*f6dc9357SAndroid Build Coastguard Worker { 268*f6dc9357SAndroid Build Coastguard Worker bool StopScout; 269*f6dc9357SAndroid Build Coastguard Worker 270*f6dc9357SAndroid Build Coastguard Worker bool WasFinished; 271*f6dc9357SAndroid Build Coastguard Worker bool Crc_Defined; 272*f6dc9357SAndroid Build Coastguard Worker // bool NextCrc_Defined; 273*f6dc9357SAndroid Build Coastguard Worker 274*f6dc9357SAndroid Build Coastguard Worker UInt32 Crc; 275*f6dc9357SAndroid Build Coastguard Worker UInt32 NextCrc; 276*f6dc9357SAndroid Build Coastguard Worker HRESULT Res; 277*f6dc9357SAndroid Build Coastguard Worker UInt64 PackPos; 278*f6dc9357SAndroid Build Coastguard Worker 279*f6dc9357SAndroid Build Coastguard Worker CBlockProps Props; 280*f6dc9357SAndroid Build Coastguard Worker }; 281*f6dc9357SAndroid Build Coastguard Worker 282*f6dc9357SAndroid Build Coastguard Worker CBlock _block; 283*f6dc9357SAndroid Build Coastguard Worker 284*f6dc9357SAndroid Build Coastguard Worker bool NeedWaitScout; 285*f6dc9357SAndroid Build Coastguard Worker bool MtMode; 286*f6dc9357SAndroid Build Coastguard Worker 287*f6dc9357SAndroid Build Coastguard Worker NWindows::CThread Thread; 288*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CAutoResetEvent DecoderEvent; 289*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CAutoResetEvent ScoutEvent; 290*f6dc9357SAndroid Build Coastguard Worker // HRESULT ScoutRes; 291*f6dc9357SAndroid Build Coastguard Worker 292*f6dc9357SAndroid Build Coastguard Worker Byte MtPad[1 << 7]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size. 293*f6dc9357SAndroid Build Coastguard Worker 294*f6dc9357SAndroid Build Coastguard Worker 295*f6dc9357SAndroid Build Coastguard Worker void RunScout(); 296*f6dc9357SAndroid Build Coastguard Worker WaitScout()297*f6dc9357SAndroid Build Coastguard Worker void WaitScout() 298*f6dc9357SAndroid Build Coastguard Worker { 299*f6dc9357SAndroid Build Coastguard Worker if (NeedWaitScout) 300*f6dc9357SAndroid Build Coastguard Worker { 301*f6dc9357SAndroid Build Coastguard Worker DecoderEvent.Lock(); 302*f6dc9357SAndroid Build Coastguard Worker NeedWaitScout = false; 303*f6dc9357SAndroid Build Coastguard Worker } 304*f6dc9357SAndroid Build Coastguard Worker } 305*f6dc9357SAndroid Build Coastguard Worker 306*f6dc9357SAndroid Build Coastguard Worker class CWaitScout_Releaser 307*f6dc9357SAndroid Build Coastguard Worker { 308*f6dc9357SAndroid Build Coastguard Worker CDecoder *_decoder; 309*f6dc9357SAndroid Build Coastguard Worker public: CWaitScout_Releaser(CDecoder * decoder)310*f6dc9357SAndroid Build Coastguard Worker CWaitScout_Releaser(CDecoder *decoder): _decoder(decoder) {} ~CWaitScout_Releaser()311*f6dc9357SAndroid Build Coastguard Worker ~CWaitScout_Releaser() { _decoder->WaitScout(); } 312*f6dc9357SAndroid Build Coastguard Worker }; 313*f6dc9357SAndroid Build Coastguard Worker 314*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateThread(); 315*f6dc9357SAndroid Build Coastguard Worker 316*f6dc9357SAndroid Build Coastguard Worker #endif 317*f6dc9357SAndroid Build Coastguard Worker 318*f6dc9357SAndroid Build Coastguard Worker Byte *_inBuf; 319*f6dc9357SAndroid Build Coastguard Worker UInt64 _inProcessed; 320*f6dc9357SAndroid Build Coastguard Worker bool _inputFinished; 321*f6dc9357SAndroid Build Coastguard Worker HRESULT _inputRes; 322*f6dc9357SAndroid Build Coastguard Worker 323*f6dc9357SAndroid Build Coastguard Worker CBase Base; 324*f6dc9357SAndroid Build Coastguard Worker GetCrcError()325*f6dc9357SAndroid Build Coastguard Worker bool GetCrcError() const { return BlockCrcError || Base.StreamCrcError; } 326*f6dc9357SAndroid Build Coastguard Worker 327*f6dc9357SAndroid Build Coastguard Worker void InitOutSize(const UInt64 *outSize); 328*f6dc9357SAndroid Build Coastguard Worker 329*f6dc9357SAndroid Build Coastguard Worker bool CreateInputBufer(); 330*f6dc9357SAndroid Build Coastguard Worker InitInputBuffer()331*f6dc9357SAndroid Build Coastguard Worker void InitInputBuffer() 332*f6dc9357SAndroid Build Coastguard Worker { 333*f6dc9357SAndroid Build Coastguard Worker // We use InitInputBuffer() before stream init. 334*f6dc9357SAndroid Build Coastguard Worker // So don't read from stream here 335*f6dc9357SAndroid Build Coastguard Worker _inProcessed = 0; 336*f6dc9357SAndroid Build Coastguard Worker Base._buf = _inBuf; 337*f6dc9357SAndroid Build Coastguard Worker Base._lim = _inBuf; 338*f6dc9357SAndroid Build Coastguard Worker Base.InitBitDecoder(); 339*f6dc9357SAndroid Build Coastguard Worker } 340*f6dc9357SAndroid Build Coastguard Worker GetInputProcessedSize()341*f6dc9357SAndroid Build Coastguard Worker UInt64 GetInputProcessedSize() const 342*f6dc9357SAndroid Build Coastguard Worker { 343*f6dc9357SAndroid Build Coastguard Worker // for NSIS case : we need also look the number of bits in bitDecoder 344*f6dc9357SAndroid Build Coastguard Worker return _inProcessed + (size_t)(Base._buf - _inBuf); 345*f6dc9357SAndroid Build Coastguard Worker } 346*f6dc9357SAndroid Build Coastguard Worker GetInStreamSize()347*f6dc9357SAndroid Build Coastguard Worker UInt64 GetInStreamSize() const 348*f6dc9357SAndroid Build Coastguard Worker { 349*f6dc9357SAndroid Build Coastguard Worker return _inProcessed + (size_t)(Base._buf - _inBuf) - (Base._numBits >> 3); 350*f6dc9357SAndroid Build Coastguard Worker } 351*f6dc9357SAndroid Build Coastguard Worker GetOutProcessedSize()352*f6dc9357SAndroid Build Coastguard Worker UInt64 GetOutProcessedSize() const { return _outWritten + _outPos; } 353*f6dc9357SAndroid Build Coastguard Worker 354*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadInput(); 355*f6dc9357SAndroid Build Coastguard Worker 356*f6dc9357SAndroid Build Coastguard Worker void StartNewStream(); 357*f6dc9357SAndroid Build Coastguard Worker 358*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadStreamSignature(); 359*f6dc9357SAndroid Build Coastguard Worker HRESULT StartRead(); 360*f6dc9357SAndroid Build Coastguard Worker 361*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadBlockSignature(); 362*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadBlock(); 363*f6dc9357SAndroid Build Coastguard Worker 364*f6dc9357SAndroid Build Coastguard Worker HRESULT Flush(); 365*f6dc9357SAndroid Build Coastguard Worker HRESULT DecodeBlock(const CBlockProps &props); 366*f6dc9357SAndroid Build Coastguard Worker HRESULT DecodeStreams(ICompressProgressInfo *progress); 367*f6dc9357SAndroid Build Coastguard Worker GetNumStreams()368*f6dc9357SAndroid Build Coastguard Worker UInt64 GetNumStreams() const { return Base.NumStreams; } GetNumBlocks()369*f6dc9357SAndroid Build Coastguard Worker UInt64 GetNumBlocks() const { return Base.NumBlocks; } 370*f6dc9357SAndroid Build Coastguard Worker 371*f6dc9357SAndroid Build Coastguard Worker CDecoder(); 372*f6dc9357SAndroid Build Coastguard Worker virtual ~CDecoder(); 373*f6dc9357SAndroid Build Coastguard Worker }; 374*f6dc9357SAndroid Build Coastguard Worker 375*f6dc9357SAndroid Build Coastguard Worker 376*f6dc9357SAndroid Build Coastguard Worker 377*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_READ_FROM_CODER 378*f6dc9357SAndroid Build Coastguard Worker 379*f6dc9357SAndroid Build Coastguard Worker class CNsisDecoder Z7_final: public CDecoder 380*f6dc9357SAndroid Build Coastguard Worker { 381*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ISequentialInStream) 382*f6dc9357SAndroid Build Coastguard Worker }; 383*f6dc9357SAndroid Build Coastguard Worker 384*f6dc9357SAndroid Build Coastguard Worker #endif 385*f6dc9357SAndroid Build Coastguard Worker 386*f6dc9357SAndroid Build Coastguard Worker }} 387*f6dc9357SAndroid Build Coastguard Worker 388*f6dc9357SAndroid Build Coastguard Worker #endif 389