Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/LZMA/LZMADecoder.h, revision 1.1.1.1
1.1 misho 1: // LZMA/Decoder.h
2:
3: #ifndef __LZMA_DECODER_H
4: #define __LZMA_DECODER_H
5:
6: #include "../../../Common/MyCom.h"
7: #include "../../../Common/Alloc.h"
8: #include "../../ICoder.h"
9: #include "../LZ/LZOutWindow.h"
10: #include "../RangeCoder/RangeCoderBitTree.h"
11:
12: #include "LZMA.h"
13:
14: namespace NCompress {
15: namespace NLZMA {
16:
17: typedef NRangeCoder::CBitDecoder<kNumMoveBits> CMyBitDecoder;
18:
19: class CLiteralDecoder2
20: {
21: CMyBitDecoder _decoders[0x300];
22: public:
23: void Init()
24: {
25: for (int i = 0; i < 0x300; i++)
26: _decoders[i].Init();
27: }
28: Byte DecodeNormal(NRangeCoder::CDecoder *rangeDecoder)
29: {
30: UInt32 symbol = 1;
31: RC_INIT_VAR
32: do
33: {
34: // symbol = (symbol << 1) | _decoders[0][symbol].Decode(rangeDecoder);
35: RC_GETBIT(kNumMoveBits, _decoders[symbol].Prob, symbol)
36: }
37: while (symbol < 0x100);
38: RC_FLUSH_VAR
39: return (Byte)symbol;
40: }
41: Byte DecodeWithMatchByte(NRangeCoder::CDecoder *rangeDecoder, Byte matchByte)
42: {
43: UInt32 symbol = 1;
44: RC_INIT_VAR
45: do
46: {
47: UInt32 matchBit = (matchByte >> 7) & 1;
48: matchByte <<= 1;
49: // UInt32 bit = _decoders[1 + matchBit][symbol].Decode(rangeDecoder);
50: // symbol = (symbol << 1) | bit;
51: UInt32 bit;
52: RC_GETBIT2(kNumMoveBits, _decoders[0x100 + (matchBit << 8) + symbol].Prob, symbol,
53: bit = 0, bit = 1)
54: if (matchBit != bit)
55: {
56: while (symbol < 0x100)
57: {
58: // symbol = (symbol << 1) | _decoders[0][symbol].Decode(rangeDecoder);
59: RC_GETBIT(kNumMoveBits, _decoders[symbol].Prob, symbol)
60: }
61: break;
62: }
63: }
64: while (symbol < 0x100);
65: RC_FLUSH_VAR
66: return (Byte)symbol;
67: }
68: };
69:
70: class CLiteralDecoder
71: {
72: CLiteralDecoder2 *_coders;
73: int _numPrevBits;
74: int _numPosBits;
75: UInt32 _posMask;
76: public:
77: CLiteralDecoder(): _coders(0) {}
78: ~CLiteralDecoder() { Free(); }
79: void Free()
80: {
81: MyFree(_coders);
82: _coders = 0;
83: }
84: bool Create(int numPosBits, int numPrevBits)
85: {
86: if (_coders == 0 || (numPosBits + numPrevBits) !=
87: (_numPrevBits + _numPosBits) )
88: {
89: Free();
90: UInt32 numStates = 1 << (numPosBits + numPrevBits);
91: _coders = (CLiteralDecoder2 *)MyAlloc(numStates * sizeof(CLiteralDecoder2));
92: }
93: _numPosBits = numPosBits;
94: _posMask = (1 << numPosBits) - 1;
95: _numPrevBits = numPrevBits;
96: return (_coders != 0);
97: }
98: void Init()
99: {
100: UInt32 numStates = 1 << (_numPrevBits + _numPosBits);
101: for (UInt32 i = 0; i < numStates; i++)
102: _coders[i].Init();
103: }
104: UInt32 GetState(UInt32 pos, Byte prevByte) const
105: { return ((pos & _posMask) << _numPrevBits) + (prevByte >> (8 - _numPrevBits)); }
106: Byte DecodeNormal(NRangeCoder::CDecoder *rangeDecoder, UInt32 pos, Byte prevByte)
107: { return _coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); }
108: Byte DecodeWithMatchByte(NRangeCoder::CDecoder *rangeDecoder, UInt32 pos, Byte prevByte, Byte matchByte)
109: { return _coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); }
110: };
111:
112: namespace NLength {
113:
114: class CDecoder
115: {
116: CMyBitDecoder _choice;
117: CMyBitDecoder _choice2;
118: NRangeCoder::CBitTreeDecoder<kNumMoveBits, kNumLowBits> _lowCoder[kNumPosStatesMax];
119: NRangeCoder::CBitTreeDecoder<kNumMoveBits, kNumMidBits> _midCoder[kNumPosStatesMax];
120: NRangeCoder::CBitTreeDecoder<kNumMoveBits, kNumHighBits> _highCoder;
121: public:
122: void Init(UInt32 numPosStates)
123: {
124: _choice.Init();
125: _choice2.Init();
126: for (UInt32 posState = 0; posState < numPosStates; posState++)
127: {
128: _lowCoder[posState].Init();
129: _midCoder[posState].Init();
130: }
131: _highCoder.Init();
132: }
133: UInt32 Decode(NRangeCoder::CDecoder *rangeDecoder, UInt32 posState)
134: {
135: if(_choice.Decode(rangeDecoder) == 0)
136: return _lowCoder[posState].Decode(rangeDecoder);
137: if(_choice2.Decode(rangeDecoder) == 0)
138: return kNumLowSymbols + _midCoder[posState].Decode(rangeDecoder);
139: return kNumLowSymbols + kNumMidSymbols + _highCoder.Decode(rangeDecoder);
140: }
141: };
142:
143: }
144:
145: class CDecoder:
146: public ICompressCoder,
147: public ICompressSetDecoderProperties2,
148: public ICompressSetInStream,
149: public ICompressSetOutStreamSize,
150: public ISequentialInStream,
151: public CMyUnknownImp
152: {
153: CLZOutWindow _outWindowStream;
154: NRangeCoder::CDecoder _rangeDecoder;
155:
156: CMyBitDecoder _isMatch[kNumStates][NLength::kNumPosStatesMax];
157: CMyBitDecoder _isRep[kNumStates];
158: CMyBitDecoder _isRepG0[kNumStates];
159: CMyBitDecoder _isRepG1[kNumStates];
160: CMyBitDecoder _isRepG2[kNumStates];
161: CMyBitDecoder _isRep0Long[kNumStates][NLength::kNumPosStatesMax];
162:
163: NRangeCoder::CBitTreeDecoder<kNumMoveBits, kNumPosSlotBits> _posSlotDecoder[kNumLenToPosStates];
164:
165: CMyBitDecoder _posDecoders[kNumFullDistances - kEndPosModelIndex];
166: NRangeCoder::CBitTreeDecoder<kNumMoveBits, kNumAlignBits> _posAlignDecoder;
167:
168: NLength::CDecoder _lenDecoder;
169: NLength::CDecoder _repMatchLenDecoder;
170:
171: CLiteralDecoder _literalDecoder;
172:
173: UInt32 _dictionarySizeCheck;
174:
175: UInt32 _posStateMask;
176:
177: ///////////////////
178: // State
179: UInt64 _outSize;
180: UInt64 _nowPos64;
181: UInt32 _reps[4];
182: CState _state;
183: Int32 _remainLen; // -1 means end of stream. // -2 means need Init
184:
185: void Init();
186: HRESULT CodeSpec(Byte *buffer, UInt32 size);
187: public:
188: MY_UNKNOWN_IMP4(
189: ICompressSetDecoderProperties2,
190: ICompressSetInStream,
191: ICompressSetOutStreamSize,
192: ISequentialInStream)
193:
194: void ReleaseStreams()
195: {
196: _outWindowStream.ReleaseStream();
197: ReleaseInStream();
198: }
199:
200: class CDecoderFlusher
201: {
202: CDecoder *_decoder;
203: public:
204: bool NeedFlush;
205: CDecoderFlusher(CDecoder *decoder): _decoder(decoder), NeedFlush(true) {}
206: ~CDecoderFlusher()
207: {
208: if (NeedFlush)
209: _decoder->Flush();
210: _decoder->ReleaseStreams();
211: }
212: };
213:
214: HRESULT Flush() { return _outWindowStream.Flush(); }
215:
216: STDMETHOD(CodeReal)(ISequentialInStream *inStream,
217: ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
218: ICompressProgressInfo *progress);
219:
220: STDMETHOD(Code)(ISequentialInStream *inStream,
221: ISequentialOutStream *outStream, const UInt64 *inSize, const UInt64 *outSize,
222: ICompressProgressInfo *progress);
223:
224: STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
225:
226: STDMETHOD(GetInStreamProcessedSize)(UInt64 *value);
227:
228: STDMETHOD(SetInStream)(ISequentialInStream *inStream);
229: STDMETHOD(ReleaseInStream)();
230: STDMETHOD(SetOutStreamSize)(const UInt64 *outSize);
231: STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize);
232: STDMETHOD(ReadPart)(void *data, UInt32 size, UInt32 *processedSize);
233:
234: virtual ~CDecoder() {}
235: };
236:
237: }}
238:
239: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>