xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/Rar2Decoder.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Rar2Decoder.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_RAR2_DECODER_H
6*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMPRESS_RAR2_DECODER_H
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "../Common/InBuffer.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #include "BitmDecoder.h"
15*f6dc9357SAndroid Build Coastguard Worker #include "HuffmanDecoder.h"
16*f6dc9357SAndroid Build Coastguard Worker #include "LzOutWindow.h"
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker namespace NCompress {
19*f6dc9357SAndroid Build Coastguard Worker namespace NRar2 {
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumReps = 4;
22*f6dc9357SAndroid Build Coastguard Worker const unsigned kDistTableSize = 48;
23*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumLen2Symbols = 8;
24*f6dc9357SAndroid Build Coastguard Worker const unsigned kLenTableSize = 28;
25*f6dc9357SAndroid Build Coastguard Worker const unsigned kMainTableSize = 256 + 2 + kNumReps + kNumLen2Symbols + kLenTableSize;
26*f6dc9357SAndroid Build Coastguard Worker const unsigned kHeapTablesSizesSum = kMainTableSize + kDistTableSize + kLenTableSize;
27*f6dc9357SAndroid Build Coastguard Worker const unsigned k_MM_TableSize = 256 + 1;
28*f6dc9357SAndroid Build Coastguard Worker const unsigned k_MM_NumChanelsMax = 4;
29*f6dc9357SAndroid Build Coastguard Worker const unsigned k_MM_TablesSizesSum = k_MM_TableSize * k_MM_NumChanelsMax;
30*f6dc9357SAndroid Build Coastguard Worker const unsigned kMaxTableSize = k_MM_TablesSizesSum;
31*f6dc9357SAndroid Build Coastguard Worker 
32*f6dc9357SAndroid Build Coastguard Worker namespace NMultimedia {
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker struct CFilter
35*f6dc9357SAndroid Build Coastguard Worker {
36*f6dc9357SAndroid Build Coastguard Worker   int K1,K2,K3,K4,K5;
37*f6dc9357SAndroid Build Coastguard Worker   int D1,D2,D3,D4;
38*f6dc9357SAndroid Build Coastguard Worker   int LastDelta;
39*f6dc9357SAndroid Build Coastguard Worker   UInt32 Dif[11];
40*f6dc9357SAndroid Build Coastguard Worker   UInt32 ByteCount;
41*f6dc9357SAndroid Build Coastguard Worker   int LastChar;
42*f6dc9357SAndroid Build Coastguard Worker 
InitCFilter43*f6dc9357SAndroid Build Coastguard Worker   void Init() { memset(this, 0, sizeof(*this)); }
44*f6dc9357SAndroid Build Coastguard Worker   Byte Decode(int &channelDelta, Byte delta);
45*f6dc9357SAndroid Build Coastguard Worker };
46*f6dc9357SAndroid Build Coastguard Worker 
47*f6dc9357SAndroid Build Coastguard Worker struct CFilter2
48*f6dc9357SAndroid Build Coastguard Worker {
49*f6dc9357SAndroid Build Coastguard Worker   CFilter  m_Filters[k_MM_NumChanelsMax];
50*f6dc9357SAndroid Build Coastguard Worker   int m_ChannelDelta;
51*f6dc9357SAndroid Build Coastguard Worker   unsigned CurrentChannel;
52*f6dc9357SAndroid Build Coastguard Worker 
InitCFilter253*f6dc9357SAndroid Build Coastguard Worker   void Init() { memset(this, 0, sizeof(*this)); }
DecodeCFilter254*f6dc9357SAndroid Build Coastguard Worker   Byte Decode(Byte delta)
55*f6dc9357SAndroid Build Coastguard Worker   {
56*f6dc9357SAndroid Build Coastguard Worker     return m_Filters[CurrentChannel].Decode(m_ChannelDelta, delta);
57*f6dc9357SAndroid Build Coastguard Worker   }
58*f6dc9357SAndroid Build Coastguard Worker };
59*f6dc9357SAndroid Build Coastguard Worker 
60*f6dc9357SAndroid Build Coastguard Worker }
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker typedef NBitm::CDecoder<CInBuffer> CBitDecoder;
63*f6dc9357SAndroid Build Coastguard Worker 
64*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumHufBits = 15;
65*f6dc9357SAndroid Build Coastguard Worker 
66*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_NOQIB_2(
67*f6dc9357SAndroid Build Coastguard Worker   CDecoder
68*f6dc9357SAndroid Build Coastguard Worker   , ICompressCoder
69*f6dc9357SAndroid Build Coastguard Worker   , ICompressSetDecoderProperties2
70*f6dc9357SAndroid Build Coastguard Worker )
71*f6dc9357SAndroid Build Coastguard Worker   bool _isSolid;
72*f6dc9357SAndroid Build Coastguard Worker   bool _solidAllowed;
73*f6dc9357SAndroid Build Coastguard Worker   bool m_TablesOK;
74*f6dc9357SAndroid Build Coastguard Worker   bool m_AudioMode;
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker   CLzOutWindow m_OutWindowStream;
77*f6dc9357SAndroid Build Coastguard Worker   CBitDecoder m_InBitStream;
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker   UInt32 m_RepDistPtr;
80*f6dc9357SAndroid Build Coastguard Worker   UInt32 m_RepDists[kNumReps];
81*f6dc9357SAndroid Build Coastguard Worker   UInt32 m_LastLength;
82*f6dc9357SAndroid Build Coastguard Worker   unsigned m_NumChannels;
83*f6dc9357SAndroid Build Coastguard Worker 
84*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder<kNumHufBits, kMainTableSize, 9> m_MainDecoder;
85*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder256<kNumHufBits, kDistTableSize, 7> m_DistDecoder;
86*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder256<kNumHufBits, kLenTableSize, 7> m_LenDecoder;
87*f6dc9357SAndroid Build Coastguard Worker   NHuffman::CDecoder<kNumHufBits, k_MM_TableSize, 9> m_MMDecoders[k_MM_NumChanelsMax];
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker   UInt64 m_PackSize;
90*f6dc9357SAndroid Build Coastguard Worker 
91*f6dc9357SAndroid Build Coastguard Worker   NMultimedia::CFilter2 m_MmFilter;
92*f6dc9357SAndroid Build Coastguard Worker   Byte m_LastLevels[kMaxTableSize];
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker   void InitStructures();
95*f6dc9357SAndroid Build Coastguard Worker   UInt32 ReadBits(unsigned numBits);
96*f6dc9357SAndroid Build Coastguard Worker   bool ReadTables();
97*f6dc9357SAndroid Build Coastguard Worker   bool ReadLastTables();
98*f6dc9357SAndroid Build Coastguard Worker 
99*f6dc9357SAndroid Build Coastguard Worker   bool DecodeMm(UInt32 pos);
100*f6dc9357SAndroid Build Coastguard Worker   bool DecodeLz(Int32 pos);
101*f6dc9357SAndroid Build Coastguard Worker 
102*f6dc9357SAndroid Build Coastguard Worker   HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
103*f6dc9357SAndroid Build Coastguard Worker       const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker public:
106*f6dc9357SAndroid Build Coastguard Worker   CDecoder();
107*f6dc9357SAndroid Build Coastguard Worker };
108*f6dc9357SAndroid Build Coastguard Worker 
109*f6dc9357SAndroid Build Coastguard Worker }}
110*f6dc9357SAndroid Build Coastguard Worker 
111*f6dc9357SAndroid Build Coastguard Worker #endif
112