3 #ifndef __LZX_DECODER_H
\r
4 #define __LZX_DECODER_H
\r
6 #include "../ICoder.h"
\r
8 #include "../Common/InBuffer.h"
\r
10 #include "HuffmanDecoder.h"
\r
11 #include "LzOutWindow.h"
\r
13 #include "Lzx86Converter.h"
\r
15 namespace NCompress {
\r
18 namespace NBitStream {
\r
20 const unsigned kNumBigValueBits = 8 * 4;
\r
21 const unsigned kNumValueBits = 17;
\r
22 const UInt32 kBitDecoderValueMask = (1 << kNumValueBits) - 1;
\r
31 bool Create(UInt32 bufferSize) { return m_Stream.Create(bufferSize); }
\r
33 void SetStream(ISequentialInStream *s) { m_Stream.SetStream(s); }
\r
34 void ReleaseStream() { m_Stream.ReleaseStream(); }
\r
39 m_BitPos = kNumBigValueBits;
\r
42 UInt64 GetProcessedSize() const { return m_Stream.GetProcessedSize() - (kNumBigValueBits - m_BitPos) / 8; }
\r
44 unsigned GetBitPosition() const { return m_BitPos & 0xF; }
\r
48 for (; m_BitPos >= 16; m_BitPos -= 16)
\r
50 Byte b0 = m_Stream.ReadByte();
\r
51 Byte b1 = m_Stream.ReadByte();
\r
52 m_Value = (m_Value << 8) | b1;
\r
53 m_Value = (m_Value << 8) | b0;
\r
57 UInt32 GetValue(unsigned numBits) const
\r
59 return ((m_Value >> ((32 - kNumValueBits) - m_BitPos)) & kBitDecoderValueMask) >> (kNumValueBits - numBits);
\r
62 void MovePos(unsigned numBits)
\r
64 m_BitPos += numBits;
\r
68 UInt32 ReadBits(unsigned numBits)
\r
70 UInt32 res = GetValue(numBits);
\r
75 UInt32 ReadBitsBig(unsigned numBits)
\r
77 unsigned numBits0 = numBits / 2;
\r
78 unsigned numBits1 = numBits - numBits0;
\r
79 UInt32 res = ReadBits(numBits0) << numBits1;
\r
80 return res + ReadBits(numBits1);
\r
83 bool ReadUInt32(UInt32 &v)
\r
87 v = ((m_Value >> 16) & 0xFFFF) | ((m_Value << 16) & 0xFFFF0000);
\r
88 m_BitPos = kNumBigValueBits;
\r
92 Byte DirectReadByte() { return m_Stream.ReadByte(); }
\r
98 public ICompressCoder,
\r
99 public CMyUnknownImp
\r
101 NBitStream::CDecoder m_InBitStream;
\r
102 CLzOutWindow m_OutWindowStream;
\r
104 UInt32 m_RepDistances[kNumRepDistances];
\r
105 UInt32 m_NumPosLenSlots;
\r
107 bool m_IsUncompressedBlock;
\r
108 bool m_AlignIsUsed;
\r
110 NCompress::NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
\r
111 NCompress::NHuffman::CDecoder<kNumHuffmanBits, kNumLenSymbols> m_LenDecoder;
\r
112 NCompress::NHuffman::CDecoder<kNumHuffmanBits, kAlignTableSize> m_AlignDecoder;
\r
113 NCompress::NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
\r
115 Byte m_LastMainLevels[kMainTableSize];
\r
116 Byte m_LastLenLevels[kNumLenSymbols];
\r
118 Cx86ConvertOutStream *m_x86ConvertOutStreamSpec;
\r
119 CMyComPtr<ISequentialOutStream> m_x86ConvertOutStream;
\r
121 UInt32 m_UnCompressedBlockSize;
\r
129 UInt32 ReadBits(unsigned numBits);
\r
130 bool ReadTable(Byte *lastLevels, Byte *newLevels, UInt32 numSymbols);
\r
132 void ClearPrevLevels();
\r
134 HRESULT CodeSpec(UInt32 size);
\r
136 HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
\r
137 const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
\r
139 CDecoder(bool wimMode = false);
\r
143 void ReleaseStreams();
\r
144 STDMETHOD(Flush)();
\r
146 STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
\r
147 const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
\r
149 STDMETHOD(SetInStream)(ISequentialInStream *inStream);
\r
150 STDMETHOD(ReleaseInStream)();
\r
151 STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
\r
153 HRESULT SetParams(unsigned numDictBits);
\r
154 void SetKeepHistory(bool keepHistory) { _keepHistory = keepHistory; }
\r