xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/LzxDecoder.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // LzxDecoder.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_LZX_DECODER_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_LZX_DECODER_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "HuffmanDecoder.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "Lzx.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker namespace NCompress {
10*f6dc9357SAndroid Build Coastguard Worker namespace NLzx {
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker const unsigned kAdditionalOutputBufSize = 32 * 2;
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumTableBits_Main = 11;
15*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumTableBits_Len = 8;
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker // if (kNumLenSymols_Big <= 256) we can  use NHuffman::CDecoder256
18*f6dc9357SAndroid Build Coastguard Worker // if (kNumLenSymols_Big >  256) we must use NHuffman::CDecoder
19*f6dc9357SAndroid Build Coastguard Worker // const unsigned kNumLenSymols_Big_Start = kNumLenSlots - 1 + kMatchMinLen;  // 8 - 1 + 2
20*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLenSymols_Big_Start = 0;
21*f6dc9357SAndroid Build Coastguard Worker // const unsigned kNumLenSymols_Big_Start = 0;
22*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLenSymols_Big = kNumLenSymols_Big_Start + kNumLenSymbols;
23*f6dc9357SAndroid Build Coastguard Worker 
24*f6dc9357SAndroid Build Coastguard Worker #if 1
25*f6dc9357SAndroid Build Coastguard Worker   // for smallest structure size:
26*f6dc9357SAndroid Build Coastguard Worker   const unsigned kPosSlotOffset = 0;
27*f6dc9357SAndroid Build Coastguard Worker #else
28*f6dc9357SAndroid Build Coastguard Worker   // use virtual entries for mispredicted branches:
29*f6dc9357SAndroid Build Coastguard Worker   const unsigned kPosSlotOffset = 256 / kNumLenSlots;
30*f6dc9357SAndroid Build Coastguard Worker #endif
31*f6dc9357SAndroid Build Coastguard Worker 
32*f6dc9357SAndroid Build Coastguard Worker class CBitByteDecoder;
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker class CDecoder
35*f6dc9357SAndroid Build Coastguard Worker {
36*f6dc9357SAndroid Build Coastguard Worker public:
37*f6dc9357SAndroid Build Coastguard Worker   UInt32 _pos;
38*f6dc9357SAndroid Build Coastguard Worker   UInt32 _winSize;
39*f6dc9357SAndroid Build Coastguard Worker   Byte *_win;
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker   bool _overDict;
42*f6dc9357SAndroid Build Coastguard Worker   bool _isUncompressedBlock;
43*f6dc9357SAndroid Build Coastguard Worker   bool _skipByte;
44*f6dc9357SAndroid Build Coastguard Worker   bool _keepHistory;
45*f6dc9357SAndroid Build Coastguard Worker   bool _keepHistoryForNext;
46*f6dc9357SAndroid Build Coastguard Worker   bool _needAlloc;
47*f6dc9357SAndroid Build Coastguard Worker   bool _wimMode;
48*f6dc9357SAndroid Build Coastguard Worker   Byte _numDictBits;
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker   // unsigned _numAlignBits_PosSlots;
51*f6dc9357SAndroid Build Coastguard Worker   // unsigned _numAlignBits;
52*f6dc9357SAndroid Build Coastguard Worker   UInt32 _numAlignBits_Dist;
53*f6dc9357SAndroid Build Coastguard Worker private:
54*f6dc9357SAndroid Build Coastguard Worker   unsigned _numPosLenSlots;
55*f6dc9357SAndroid Build Coastguard Worker   UInt32 _unpackBlockSize;
56*f6dc9357SAndroid Build Coastguard Worker 
57*f6dc9357SAndroid Build Coastguard Worker   UInt32 _writePos;
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker   UInt32 _x86_translationSize;
60*f6dc9357SAndroid Build Coastguard Worker   UInt32 _x86_processedSize;
61*f6dc9357SAndroid Build Coastguard Worker   Byte *_x86_buf;
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker   Byte *_unpackedData;
64*f6dc9357SAndroid Build Coastguard Worker public:
65*f6dc9357SAndroid Build Coastguard Worker   Byte  _extra[kPosSlotOffset + kNumPosSlots];
66*f6dc9357SAndroid Build Coastguard Worker   UInt32 _reps[kPosSlotOffset + kNumPosSlots];
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize, kNumTableBits_Main> _mainDecoder;
69*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder256<kNumHuffmanBits, kNumLenSymols_Big, kNumTableBits_Len> _lenDecoder;
70*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder7b<kAlignTableSize> _alignDecoder;
71*f6dc9357SAndroid Build Coastguard Worker private:
72*f6dc9357SAndroid Build Coastguard Worker   Byte _mainLevels[kMainTableSize];
73*f6dc9357SAndroid Build Coastguard Worker   Byte _lenLevels[kNumLenSymols_Big];
74*f6dc9357SAndroid Build Coastguard Worker 
75*f6dc9357SAndroid Build Coastguard Worker   HRESULT Flush() throw();
76*f6dc9357SAndroid Build Coastguard Worker   bool ReadTables(CBitByteDecoder &_bitStream) throw();
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker   HRESULT CodeSpec(const Byte *inData, size_t inSize, UInt32 outSize) throw();
79*f6dc9357SAndroid Build Coastguard Worker   HRESULT SetParams2(unsigned numDictBits) throw();
80*f6dc9357SAndroid Build Coastguard Worker public:
81*f6dc9357SAndroid Build Coastguard Worker   CDecoder() throw();
82*f6dc9357SAndroid Build Coastguard Worker   ~CDecoder() throw();
83*f6dc9357SAndroid Build Coastguard Worker 
Set_WimMode(bool wimMode)84*f6dc9357SAndroid Build Coastguard Worker   void Set_WimMode(bool wimMode) { _wimMode = wimMode; }
Set_KeepHistory(bool keepHistory)85*f6dc9357SAndroid Build Coastguard Worker   void Set_KeepHistory(bool keepHistory) { _keepHistory = keepHistory; }
Set_KeepHistoryForNext(bool keepHistoryForNext)86*f6dc9357SAndroid Build Coastguard Worker   void Set_KeepHistoryForNext(bool keepHistoryForNext) { _keepHistoryForNext = keepHistoryForNext; }
87*f6dc9357SAndroid Build Coastguard Worker 
Set_ExternalWindow_DictBits(Byte * win,unsigned numDictBits)88*f6dc9357SAndroid Build Coastguard Worker   HRESULT Set_ExternalWindow_DictBits(Byte *win, unsigned numDictBits)
89*f6dc9357SAndroid Build Coastguard Worker   {
90*f6dc9357SAndroid Build Coastguard Worker     _needAlloc = false;
91*f6dc9357SAndroid Build Coastguard Worker     _win = win;
92*f6dc9357SAndroid Build Coastguard Worker     _winSize = (UInt32)1 << numDictBits;
93*f6dc9357SAndroid Build Coastguard Worker     return SetParams2(numDictBits);
94*f6dc9357SAndroid Build Coastguard Worker   }
95*f6dc9357SAndroid Build Coastguard Worker   HRESULT Set_DictBits_and_Alloc(unsigned numDictBits) throw();
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker   HRESULT Code_WithExceedReadWrite(const Byte *inData, size_t inSize, UInt32 outSize) throw();
98*f6dc9357SAndroid Build Coastguard Worker 
WasBlockFinished()99*f6dc9357SAndroid Build Coastguard Worker   bool WasBlockFinished()     const { return _unpackBlockSize == 0; }
GetUnpackData()100*f6dc9357SAndroid Build Coastguard Worker   const Byte *GetUnpackData() const { return _unpackedData; }
GetUnpackSize()101*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetUnpackSize()      const { return _pos - _writePos; }
102*f6dc9357SAndroid Build Coastguard Worker };
103*f6dc9357SAndroid Build Coastguard Worker 
104*f6dc9357SAndroid Build Coastguard Worker }}
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker #endif
107