annotate src/win32/7zip/7z/CPP/7zip/Compress/Rar2Decoder.h @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
rlm@1 1 // Rar2Decoder.h
rlm@1 2 // According to unRAR license, this code may not be used to develop
rlm@1 3 // a program that creates RAR archives
rlm@1 4
rlm@1 5 #ifndef __COMPRESS_RAR2_DECODER_H
rlm@1 6 #define __COMPRESS_RAR2_DECODER_H
rlm@1 7
rlm@1 8 #include "../../Common/MyCom.h"
rlm@1 9
rlm@1 10 #include "../ICoder.h"
rlm@1 11
rlm@1 12 #include "../Common/InBuffer.h"
rlm@1 13
rlm@1 14 #include "BitmDecoder.h"
rlm@1 15 #include "HuffmanDecoder.h"
rlm@1 16 #include "LzOutWindow.h"
rlm@1 17
rlm@1 18 namespace NCompress {
rlm@1 19 namespace NRar2 {
rlm@1 20
rlm@1 21 const UInt32 kNumRepDists = 4;
rlm@1 22 const UInt32 kDistTableSize = 48;
rlm@1 23
rlm@1 24 const int kMMTableSize = 256 + 1;
rlm@1 25
rlm@1 26 const UInt32 kMainTableSize = 298;
rlm@1 27 const UInt32 kLenTableSize = 28;
rlm@1 28
rlm@1 29 const UInt32 kDistTableStart = kMainTableSize;
rlm@1 30 const UInt32 kLenTableStart = kDistTableStart + kDistTableSize;
rlm@1 31
rlm@1 32 const UInt32 kHeapTablesSizesSum = kMainTableSize + kDistTableSize + kLenTableSize;
rlm@1 33
rlm@1 34 const UInt32 kLevelTableSize = 19;
rlm@1 35
rlm@1 36 const UInt32 kMMTablesSizesSum = kMMTableSize * 4;
rlm@1 37
rlm@1 38 const UInt32 kMaxTableSize = kMMTablesSizesSum;
rlm@1 39
rlm@1 40 const UInt32 kTableDirectLevels = 16;
rlm@1 41 const UInt32 kTableLevelRepNumber = kTableDirectLevels;
rlm@1 42 const UInt32 kTableLevel0Number = kTableLevelRepNumber + 1;
rlm@1 43 const UInt32 kTableLevel0Number2 = kTableLevel0Number + 1;
rlm@1 44
rlm@1 45 const UInt32 kLevelMask = 0xF;
rlm@1 46
rlm@1 47
rlm@1 48 const UInt32 kRepBothNumber = 256;
rlm@1 49 const UInt32 kRepNumber = kRepBothNumber + 1;
rlm@1 50 const UInt32 kLen2Number = kRepNumber + 4;
rlm@1 51
rlm@1 52 const UInt32 kLen2NumNumbers = 8;
rlm@1 53 const UInt32 kReadTableNumber = kLen2Number + kLen2NumNumbers;
rlm@1 54 const UInt32 kMatchNumber = kReadTableNumber + 1;
rlm@1 55
rlm@1 56 const Byte kLenStart[kLenTableSize] = {0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224};
rlm@1 57 const Byte kLenDirectBits[kLenTableSize] = {0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5};
rlm@1 58
rlm@1 59 const UInt32 kDistStart[kDistTableSize] = {0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576,32768U,49152U,65536,98304,131072,196608,262144,327680,393216,458752,524288,589824,655360,720896,786432,851968,917504,983040};
rlm@1 60 const Byte kDistDirectBits[kDistTableSize] = {0,0,0,0,1,1,2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16};
rlm@1 61
rlm@1 62 const Byte kLevelDirectBits[kLevelTableSize] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7};
rlm@1 63
rlm@1 64 const Byte kLen2DistStarts[kLen2NumNumbers]={0,4,8,16,32,64,128,192};
rlm@1 65 const Byte kLen2DistDirectBits[kLen2NumNumbers]={2,2,3, 4, 5, 6, 6, 6};
rlm@1 66
rlm@1 67 const UInt32 kDistLimit2 = 0x101 - 1;
rlm@1 68 const UInt32 kDistLimit3 = 0x2000 - 1;
rlm@1 69 const UInt32 kDistLimit4 = 0x40000 - 1;
rlm@1 70
rlm@1 71 const UInt32 kMatchMaxLen = 255 + 2;
rlm@1 72 const UInt32 kMatchMaxLenMax = 255 + 5;
rlm@1 73 const UInt32 kNormalMatchMinLen = 3;
rlm@1 74
rlm@1 75 namespace NMultimedia {
rlm@1 76
rlm@1 77 struct CFilter
rlm@1 78 {
rlm@1 79 int K1,K2,K3,K4,K5;
rlm@1 80 int D1,D2,D3,D4;
rlm@1 81 int LastDelta;
rlm@1 82 UInt32 Dif[11];
rlm@1 83 UInt32 ByteCount;
rlm@1 84 int LastChar;
rlm@1 85
rlm@1 86 Byte Decode(int &channelDelta, Byte delta);
rlm@1 87
rlm@1 88 void Init() { memset(this, 0, sizeof(*this)); }
rlm@1 89
rlm@1 90 };
rlm@1 91
rlm@1 92 const int kNumChanelsMax = 4;
rlm@1 93
rlm@1 94 class CFilter2
rlm@1 95 {
rlm@1 96 public:
rlm@1 97 CFilter m_Filters[kNumChanelsMax];
rlm@1 98 int m_ChannelDelta;
rlm@1 99 int CurrentChannel;
rlm@1 100
rlm@1 101 void Init() { memset(this, 0, sizeof(*this)); }
rlm@1 102 Byte Decode(Byte delta)
rlm@1 103 {
rlm@1 104 return m_Filters[CurrentChannel].Decode(m_ChannelDelta, delta);
rlm@1 105 }
rlm@1 106
rlm@1 107 };
rlm@1 108
rlm@1 109 }
rlm@1 110
rlm@1 111 typedef NBitm::CDecoder<CInBuffer> CBitDecoder;
rlm@1 112
rlm@1 113 const int kNumHuffmanBits = 15;
rlm@1 114
rlm@1 115 class CDecoder :
rlm@1 116 public ICompressCoder,
rlm@1 117 public ICompressSetDecoderProperties2,
rlm@1 118 public CMyUnknownImp
rlm@1 119 {
rlm@1 120 CLzOutWindow m_OutWindowStream;
rlm@1 121 CBitDecoder m_InBitStream;
rlm@1 122 NHuffman::CDecoder<kNumHuffmanBits, kMainTableSize> m_MainDecoder;
rlm@1 123 NHuffman::CDecoder<kNumHuffmanBits, kDistTableSize> m_DistDecoder;
rlm@1 124 NHuffman::CDecoder<kNumHuffmanBits, kLenTableSize> m_LenDecoder;
rlm@1 125 NHuffman::CDecoder<kNumHuffmanBits, kMMTableSize> m_MMDecoders[NMultimedia::kNumChanelsMax];
rlm@1 126 NHuffman::CDecoder<kNumHuffmanBits, kLevelTableSize> m_LevelDecoder;
rlm@1 127
rlm@1 128 bool m_AudioMode;
rlm@1 129
rlm@1 130 NMultimedia::CFilter2 m_MmFilter;
rlm@1 131 int m_NumChannels;
rlm@1 132
rlm@1 133 UInt32 m_RepDists[kNumRepDists];
rlm@1 134 UInt32 m_RepDistPtr;
rlm@1 135
rlm@1 136 UInt32 m_LastLength;
rlm@1 137
rlm@1 138 Byte m_LastLevels[kMaxTableSize];
rlm@1 139
rlm@1 140 UInt64 m_PackSize;
rlm@1 141 bool m_IsSolid;
rlm@1 142
rlm@1 143 void InitStructures();
rlm@1 144 UInt32 ReadBits(int numBits);
rlm@1 145 bool ReadTables();
rlm@1 146 bool ReadLastTables();
rlm@1 147
rlm@1 148 bool DecodeMm(UInt32 pos);
rlm@1 149 bool DecodeLz(Int32 pos);
rlm@1 150
rlm@1 151 HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream,
rlm@1 152 const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
rlm@1 153
rlm@1 154 public:
rlm@1 155 CDecoder();
rlm@1 156
rlm@1 157 MY_UNKNOWN_IMP1(ICompressSetDecoderProperties2)
rlm@1 158
rlm@1 159 void ReleaseStreams()
rlm@1 160 {
rlm@1 161 m_OutWindowStream.ReleaseStream();
rlm@1 162 m_InBitStream.ReleaseStream();
rlm@1 163 }
rlm@1 164
rlm@1 165 STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream,
rlm@1 166 const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress);
rlm@1 167
rlm@1 168 STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
rlm@1 169
rlm@1 170 };
rlm@1 171
rlm@1 172 }}
rlm@1 173
rlm@1 174 #endif