xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/Rar5Decoder.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Rar5Decoder.h
2*f6dc9357SAndroid Build Coastguard Worker // According to unRAR license, this code may not be used to develop
3*f6dc9357SAndroid Build Coastguard Worker // a program that creates RAR archives
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_COMPRESS_RAR5_DECODER_H
6*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMPRESS_RAR5_DECODER_H
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyBuffer2.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #include "HuffmanDecoder.h"
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker namespace NCompress {
16*f6dc9357SAndroid Build Coastguard Worker namespace NRar5 {
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker class CBitDecoder;
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker struct CFilter
21*f6dc9357SAndroid Build Coastguard Worker {
22*f6dc9357SAndroid Build Coastguard Worker   Byte Type;
23*f6dc9357SAndroid Build Coastguard Worker   Byte Channels;
24*f6dc9357SAndroid Build Coastguard Worker   UInt32 Size;
25*f6dc9357SAndroid Build Coastguard Worker   UInt64 Start;
26*f6dc9357SAndroid Build Coastguard Worker };
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumReps = 4;
30*f6dc9357SAndroid Build Coastguard Worker const unsigned kLenTableSize = 11 * 4;
31*f6dc9357SAndroid Build Coastguard Worker const unsigned kMainTableSize = 256 + 1 + 1 + kNumReps + kLenTableSize;
32*f6dc9357SAndroid Build Coastguard Worker const unsigned kExtraDistSymbols_v7 = 16;
33*f6dc9357SAndroid Build Coastguard Worker const unsigned kDistTableSize_v6 = 64;
34*f6dc9357SAndroid Build Coastguard Worker const unsigned kDistTableSize_MAX = 64 + kExtraDistSymbols_v7;
35*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumAlignBits = 4;
36*f6dc9357SAndroid Build Coastguard Worker const unsigned kAlignTableSize = 1 << kNumAlignBits;
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumHufBits = 15;
39*f6dc9357SAndroid Build Coastguard Worker 
40*f6dc9357SAndroid Build Coastguard Worker const unsigned k_NumHufTableBits_Main = 10;
41*f6dc9357SAndroid Build Coastguard Worker const unsigned k_NumHufTableBits_Dist = 7;
42*f6dc9357SAndroid Build Coastguard Worker const unsigned k_NumHufTableBits_Len = 7;
43*f6dc9357SAndroid Build Coastguard Worker const unsigned k_NumHufTableBits_Align = 6;
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker const unsigned DICT_SIZE_BITS_MAX = 40;
46*f6dc9357SAndroid Build Coastguard Worker 
47*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_NOQIB_2(
48*f6dc9357SAndroid Build Coastguard Worker   CDecoder
49*f6dc9357SAndroid Build Coastguard Worker   , ICompressCoder
50*f6dc9357SAndroid Build Coastguard Worker   , ICompressSetDecoderProperties2
51*f6dc9357SAndroid Build Coastguard Worker )
52*f6dc9357SAndroid Build Coastguard Worker   bool _useAlignBits;
53*f6dc9357SAndroid Build Coastguard Worker   bool _isLastBlock;
54*f6dc9357SAndroid Build Coastguard Worker   bool _unpackSize_Defined;
55*f6dc9357SAndroid Build Coastguard Worker   // bool _packSize_Defined;
56*f6dc9357SAndroid Build Coastguard Worker 
57*f6dc9357SAndroid Build Coastguard Worker   bool _unsupportedFilter;
58*f6dc9357SAndroid Build Coastguard Worker   Byte _lzError;
59*f6dc9357SAndroid Build Coastguard Worker   bool _writeError;
60*f6dc9357SAndroid Build Coastguard Worker 
61*f6dc9357SAndroid Build Coastguard Worker   bool _isSolid;
62*f6dc9357SAndroid Build Coastguard Worker   // bool _solidAllowed;
63*f6dc9357SAndroid Build Coastguard Worker   bool _is_v7;
64*f6dc9357SAndroid Build Coastguard Worker   bool _tableWasFilled;
65*f6dc9357SAndroid Build Coastguard Worker   bool _wasInit;
66*f6dc9357SAndroid Build Coastguard Worker 
67*f6dc9357SAndroid Build Coastguard Worker   Byte _exitType;
68*f6dc9357SAndroid Build Coastguard Worker 
69*f6dc9357SAndroid Build Coastguard Worker   // Byte _dictSizeLog;
70*f6dc9357SAndroid Build Coastguard Worker   size_t _dictSize;
71*f6dc9357SAndroid Build Coastguard Worker   Byte *_window;
72*f6dc9357SAndroid Build Coastguard Worker   size_t _winPos;
73*f6dc9357SAndroid Build Coastguard Worker   size_t _winSize;
74*f6dc9357SAndroid Build Coastguard Worker   size_t _dictSize_forCheck;
75*f6dc9357SAndroid Build Coastguard Worker   size_t _limit;
76*f6dc9357SAndroid Build Coastguard Worker   const Byte *_buf_Res;
77*f6dc9357SAndroid Build Coastguard Worker   UInt64 _lzSize;
78*f6dc9357SAndroid Build Coastguard Worker   size_t _reps[kNumReps];
79*f6dc9357SAndroid Build Coastguard Worker   unsigned _bitPos_Res;
80*f6dc9357SAndroid Build Coastguard Worker   UInt32 _lastLen;
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker   // unsigned _numCorrectDistSymbols;
83*f6dc9357SAndroid Build Coastguard Worker   unsigned _numUnusedFilters;
84*f6dc9357SAndroid Build Coastguard Worker   unsigned _numFilters;
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker   UInt64 _lzWritten;
87*f6dc9357SAndroid Build Coastguard Worker   UInt64 _lzFileStart;
88*f6dc9357SAndroid Build Coastguard Worker   UInt64 _unpackSize;
89*f6dc9357SAndroid Build Coastguard Worker   // UInt64 _packSize;
90*f6dc9357SAndroid Build Coastguard Worker   UInt64 _lzEnd;
91*f6dc9357SAndroid Build Coastguard Worker   UInt64 _writtenFileSize;
92*f6dc9357SAndroid Build Coastguard Worker   UInt64 _filterEnd;
93*f6dc9357SAndroid Build Coastguard Worker   UInt64 _progress_Pack;
94*f6dc9357SAndroid Build Coastguard Worker   UInt64 _progress_Unpack;
95*f6dc9357SAndroid Build Coastguard Worker   CAlignedBuffer _filterSrc;
96*f6dc9357SAndroid Build Coastguard Worker   CAlignedBuffer _filterDst;
97*f6dc9357SAndroid Build Coastguard Worker 
98*f6dc9357SAndroid Build Coastguard Worker   CFilter *_filters;
99*f6dc9357SAndroid Build Coastguard Worker   size_t _winSize_Allocated;
100*f6dc9357SAndroid Build Coastguard Worker   ISequentialInStream *_inStream;
101*f6dc9357SAndroid Build Coastguard Worker   ISequentialOutStream *_outStream;
102*f6dc9357SAndroid Build Coastguard Worker   ICompressProgressInfo *_progress;
103*f6dc9357SAndroid Build Coastguard Worker   Byte *_inputBuf;
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder<kNumHufBits, kMainTableSize,  k_NumHufTableBits_Main>  m_MainDecoder;
106*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder256<kNumHufBits, kDistTableSize_MAX,  k_NumHufTableBits_Dist>  m_DistDecoder;
107*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder256<kNumHufBits, kAlignTableSize,     k_NumHufTableBits_Align> m_AlignDecoder;
108*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder256<kNumHufBits, kLenTableSize,       k_NumHufTableBits_Len>   m_LenDecoder;
109*f6dc9357SAndroid Build Coastguard Worker   Byte m_LenPlusTable[DICT_SIZE_BITS_MAX];
110*f6dc9357SAndroid Build Coastguard Worker 
InitFilters()111*f6dc9357SAndroid Build Coastguard Worker   void InitFilters()
112*f6dc9357SAndroid Build Coastguard Worker   {
113*f6dc9357SAndroid Build Coastguard Worker     _numUnusedFilters = 0;
114*f6dc9357SAndroid Build Coastguard Worker     _numFilters = 0;
115*f6dc9357SAndroid Build Coastguard Worker   }
116*f6dc9357SAndroid Build Coastguard Worker   void DeleteUnusedFilters();
117*f6dc9357SAndroid Build Coastguard Worker   HRESULT WriteData(const Byte *data, size_t size);
118*f6dc9357SAndroid Build Coastguard Worker   HRESULT ExecuteFilter(const CFilter &f);
119*f6dc9357SAndroid Build Coastguard Worker   HRESULT WriteBuf();
120*f6dc9357SAndroid Build Coastguard Worker   HRESULT AddFilter(CBitDecoder &_bitStream);
121*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReadTables(CBitDecoder &_bitStream);
122*f6dc9357SAndroid Build Coastguard Worker   HRESULT DecodeLZ2(const CBitDecoder &_bitStream) throw();
123*f6dc9357SAndroid Build Coastguard Worker   HRESULT DecodeLZ();
124*f6dc9357SAndroid Build Coastguard Worker   HRESULT CodeReal();
125*f6dc9357SAndroid Build Coastguard Worker public:
126*f6dc9357SAndroid Build Coastguard Worker   CDecoder();
127*f6dc9357SAndroid Build Coastguard Worker   ~CDecoder();
128*f6dc9357SAndroid Build Coastguard Worker };
129*f6dc9357SAndroid Build Coastguard Worker 
130*f6dc9357SAndroid Build Coastguard Worker }}
131*f6dc9357SAndroid Build Coastguard Worker 
132*f6dc9357SAndroid Build Coastguard Worker #endif
133