xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/BZip2Decoder.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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