bzip2decoder.h
来自「由7-zip提供的压缩、解压缩程序」· C头文件 代码 · 共 163 行
H
163 行
// Compress/BZip2/Decoder.h#ifndef __COMPRESS_BZIP2_DECODER_H#define __COMPRESS_BZIP2_DECODER_H#include "../../ICoder.h"#include "../../../Common/MyCom.h"#include "../../Common/MSBFDecoder.h"#include "../../Common/InBuffer.h"#include "../../Common/OutBuffer.h"#include "../Huffman/HuffmanDecoder.h"#include "BZip2Const.h"#include "BZip2CRC.h"#ifdef COMPRESS_BZIP2_MT#include "../../../Windows/Thread.h"#include "../../../Windows/Synchronization.h"#endifnamespace NCompress {namespace NBZip2 {typedef NCompress::NHuffman::CDecoder<kMaxHuffmanLen, kMaxAlphaSize> CHuffmanDecoder;class CDecoder;struct CState{ UInt32 *tt; bool BlockRandomised; UInt32 OrigPtr; UInt32 BlockSize; UInt32 CharCounters[256]; Byte m_Selectors[kNumSelectorsMax]; #ifdef COMPRESS_BZIP2_MT CDecoder *Decoder; NWindows::CThread Thread; bool m_OptimizeNumTables; NWindows::NSynchronization::CAutoResetEvent StreamWasFinishedEvent; NWindows::NSynchronization::CAutoResetEvent WaitingWasStartedEvent; // it's not member of this thread. We just need one event per thread NWindows::NSynchronization::CAutoResetEvent CanWriteEvent; Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size. void FinishStream(bool needLeave); DWORD ThreadFunc(); #endif CState(): tt(0) {} ~CState() { Free(); } bool Alloc(); void Free(); void DecodeBlock1(); UInt32 DecodeBlock2(COutBuffer &m_OutStream);};class CDecoder : public ICompressCoder, #ifdef COMPRESS_BZIP2_MT public ICompressSetCoderMt, #endif public ICompressGetInStreamProcessedSize, public CMyUnknownImp{public: COutBuffer m_OutStream; Byte MtPad[1 << 8]; // It's pad for Multi-Threading. Must be >= Cache_Line_Size. NStream::NMSBF::CDecoder<CInBuffer> m_InStream;private: CHuffmanDecoder m_HuffmanDecoders[kNumTablesMax]; UInt32 m_NumThreadsPrev; UInt32 ReadBits(int numBits); Byte ReadByte(); bool ReadBit(); UInt32 ReadCRC(); HRESULT PrepareBlock(CState &state); HRESULT DecodeFile(bool &isBZ, ICompressProgressInfo *progress); HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); class CDecoderFlusher { CDecoder *_decoder; public: bool NeedFlush; CDecoderFlusher(CDecoder *decoder): _decoder(decoder), NeedFlush(true) {} ~CDecoderFlusher() { if (NeedFlush) _decoder->Flush(); _decoder->ReleaseStreams(); } };public: CBZip2CombinedCRC CombinedCRC; #ifdef COMPRESS_BZIP2_MT ICompressProgressInfo *Progress; CState *m_States; NWindows::NSynchronization::CCriticalSection CS; UInt32 NumThreads; bool MtMode; UInt32 NextBlockIndex; bool CloseThreads; bool StreamWasFinished; NWindows::NSynchronization::CManualResetEvent CanStartWaitingEvent; HRESULT Result; UInt32 BlockSizeMax; CDecoder(); ~CDecoder(); bool Create(); void Free(); #else CState m_States[1]; #endif HRESULT ReadBlock(UInt32 blockSizeMax, CState &state); HRESULT ReadSignatures(bool &wasFinished, UInt32 &crc); HRESULT Flush() { return m_OutStream.Flush(); } void ReleaseStreams() { m_InStream.ReleaseStream(); m_OutStream.ReleaseStream(); } #ifdef COMPRESS_BZIP2_MT MY_UNKNOWN_IMP2(ICompressSetCoderMt, ICompressGetInStreamProcessedSize) #else MY_UNKNOWN_IMP1(ICompressGetInStreamProcessedSize) #endif STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); STDMETHOD(GetInStreamProcessedSize)(UInt64 *value); #ifdef COMPRESS_BZIP2_MT STDMETHOD(SetNumberOfThreads)(UInt32 numThreads); #endif};}}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?