1 // Compress/BZip2Decoder.h
\r
3 #ifndef __COMPRESS_BZIP2_DECODER_H
\r
4 #define __COMPRESS_BZIP2_DECODER_H
\r
6 #include "../../Common/MyCom.h"
\r
9 #include "../../Windows/Synchronization.h"
\r
10 #include "../../Windows/Thread.h"
\r
13 #include "../ICoder.h"
\r
15 #include "../Common/InBuffer.h"
\r
16 #include "../Common/OutBuffer.h"
\r
18 #include "BitmDecoder.h"
\r
19 #include "BZip2Const.h"
\r
20 #include "BZip2Crc.h"
\r
21 #include "HuffmanDecoder.h"
\r
23 namespace NCompress {
\r
26 typedef NCompress::NHuffman::CDecoder<kMaxHuffmanLen, kMaxAlphaSize> CHuffmanDecoder;
\r
37 NWindows::CThread Thread;
\r
38 bool m_OptimizeNumTables;
\r
40 NWindows::NSynchronization::CAutoResetEvent StreamWasFinishedEvent;
\r
41 NWindows::NSynchronization::CAutoResetEvent WaitingWasStartedEvent;
\r
43 // it's not member of this thread. We just need one event per thread
\r
44 NWindows::NSynchronization::CAutoResetEvent CanWriteEvent;
\r
46 Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.
\r
49 void FinishStream();
\r
54 CState(): Counters(0) {}
\r
55 ~CState() { Free(); }
\r
61 public ICompressCoder,
\r
63 public ICompressSetCoderMt,
\r
65 public CMyUnknownImp
\r
68 COutBuffer m_OutStream;
\r
69 Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size.
\r
70 NBitm::CDecoder<CInBuffer> m_InStream;
\r
71 Byte m_Selectors[kNumSelectorsMax];
\r
72 CHuffmanDecoder m_HuffmanDecoders[kNumTablesMax];
\r
77 bool _needInStreamInit;
\r
79 UInt32 ReadBits(unsigned numBits);
\r
83 HRESULT DecodeFile(bool &isBZ, ICompressProgressInfo *progress);
\r
84 HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
\r
85 bool &isBZ, ICompressProgressInfo *progress);
\r
86 class CDecoderFlusher
\r
91 bool ReleaseInStream;
\r
92 CDecoderFlusher(CDecoder *decoder, bool releaseInStream):
\r
94 ReleaseInStream(releaseInStream),
\r
100 _decoder->ReleaseStreams(ReleaseInStream);
\r
105 CBZip2CombinedCrc CombinedCrc;
\r
106 ICompressProgressInfo *Progress;
\r
110 UInt32 m_NumThreadsPrev;
\r
112 NWindows::NSynchronization::CManualResetEvent CanProcessEvent;
\r
113 NWindows::NSynchronization::CCriticalSection CS;
\r
116 UInt32 NextBlockIndex;
\r
118 bool StreamWasFinished1;
\r
119 bool StreamWasFinished2;
\r
120 NWindows::NSynchronization::CManualResetEvent CanStartWaitingEvent;
\r
125 UInt32 BlockSizeMax;
\r
131 CState m_States[1];
\r
136 HRESULT SetRatioProgress(UInt64 packSize);
\r
137 HRESULT ReadSignatures(bool &wasFinished, UInt32 &crc);
\r
139 HRESULT Flush() { return m_OutStream.Flush(); }
\r
140 void ReleaseStreams(bool releaseInStream)
\r
142 if (releaseInStream)
\r
143 m_InStream.ReleaseStream();
\r
144 m_OutStream.ReleaseStream();
\r
147 MY_QUERYINTERFACE_BEGIN2(ICompressCoder)
\r
149 MY_QUERYINTERFACE_ENTRY(ICompressSetCoderMt)
\r
152 MY_QUERYINTERFACE_END
\r
156 STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
\r
157 const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
\r
159 STDMETHOD(SetInStream)(ISequentialInStream *inStream);
\r
160 STDMETHOD(ReleaseInStream)();
\r
162 HRESULT CodeResume(ISequentialOutStream *outStream, bool &isBZ, ICompressProgressInfo *progress);
\r
163 UInt64 GetInputProcessedSize() const { return m_InStream.GetProcessedSize(); }
\r
166 STDMETHOD(SetNumberOfThreads)(UInt32 numThreads);
\r
171 class CNsisDecoder :
\r
172 public ISequentialInStream,
\r
173 public ICompressSetInStream,
\r
174 public ICompressSetOutStreamSize,
\r
175 public CMyUnknownImp
\r
177 NBitm::CDecoder<CInBuffer> m_InStream;
\r
178 Byte m_Selectors[kNumSelectorsMax];
\r
179 CHuffmanDecoder m_HuffmanDecoders[kNumTablesMax];
\r
184 unsigned _prevByte;
\r
191 MY_QUERYINTERFACE_BEGIN2(ISequentialInStream)
\r
192 MY_QUERYINTERFACE_ENTRY(ICompressSetInStream)
\r
193 MY_QUERYINTERFACE_ENTRY(ICompressSetOutStreamSize)
\r
194 MY_QUERYINTERFACE_END
\r
197 STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
\r
198 STDMETHOD(SetInStream)(ISequentialInStream *inStream);
\r
199 STDMETHOD(ReleaseInStream)();
\r
200 STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
\r