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