1*f6dc9357SAndroid Build Coastguard Worker // DeflateEncoder.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_DEFLATE_ENCODER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_DEFLATE_ENCODER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/LzFind.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 "BitlEncoder.h" 13*f6dc9357SAndroid Build Coastguard Worker #include "DeflateConst.h" 14*f6dc9357SAndroid Build Coastguard Worker 15*f6dc9357SAndroid Build Coastguard Worker namespace NCompress { 16*f6dc9357SAndroid Build Coastguard Worker namespace NDeflate { 17*f6dc9357SAndroid Build Coastguard Worker namespace NEncoder { 18*f6dc9357SAndroid Build Coastguard Worker 19*f6dc9357SAndroid Build Coastguard Worker struct CCodeValue 20*f6dc9357SAndroid Build Coastguard Worker { 21*f6dc9357SAndroid Build Coastguard Worker UInt16 Len; 22*f6dc9357SAndroid Build Coastguard Worker UInt16 Pos; SetAsLiteralCCodeValue23*f6dc9357SAndroid Build Coastguard Worker void SetAsLiteral() { Len = (1 << 15); } IsLiteralCCodeValue24*f6dc9357SAndroid Build Coastguard Worker bool IsLiteral() const { return (Len >= (1 << 15)); } 25*f6dc9357SAndroid Build Coastguard Worker }; 26*f6dc9357SAndroid Build Coastguard Worker 27*f6dc9357SAndroid Build Coastguard Worker struct COptimal 28*f6dc9357SAndroid Build Coastguard Worker { 29*f6dc9357SAndroid Build Coastguard Worker UInt32 Price; 30*f6dc9357SAndroid Build Coastguard Worker UInt16 PosPrev; 31*f6dc9357SAndroid Build Coastguard Worker UInt16 BackPrev; 32*f6dc9357SAndroid Build Coastguard Worker }; 33*f6dc9357SAndroid Build Coastguard Worker 34*f6dc9357SAndroid Build Coastguard Worker const UInt32 kNumOptsBase = 1 << 12; 35*f6dc9357SAndroid Build Coastguard Worker const UInt32 kNumOpts = kNumOptsBase + kMatchMaxLen; 36*f6dc9357SAndroid Build Coastguard Worker 37*f6dc9357SAndroid Build Coastguard Worker class CCoder; 38*f6dc9357SAndroid Build Coastguard Worker 39*f6dc9357SAndroid Build Coastguard Worker struct CTables: public CLevels 40*f6dc9357SAndroid Build Coastguard Worker { 41*f6dc9357SAndroid Build Coastguard Worker bool UseSubBlocks; 42*f6dc9357SAndroid Build Coastguard Worker bool StoreMode; 43*f6dc9357SAndroid Build Coastguard Worker bool StaticMode; 44*f6dc9357SAndroid Build Coastguard Worker UInt32 BlockSizeRes; 45*f6dc9357SAndroid Build Coastguard Worker UInt32 m_Pos; 46*f6dc9357SAndroid Build Coastguard Worker void InitStructures(); 47*f6dc9357SAndroid Build Coastguard Worker }; 48*f6dc9357SAndroid Build Coastguard Worker 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Worker struct CEncProps 51*f6dc9357SAndroid Build Coastguard Worker { 52*f6dc9357SAndroid Build Coastguard Worker int Level; 53*f6dc9357SAndroid Build Coastguard Worker int algo; 54*f6dc9357SAndroid Build Coastguard Worker int fb; 55*f6dc9357SAndroid Build Coastguard Worker int btMode; 56*f6dc9357SAndroid Build Coastguard Worker UInt32 mc; 57*f6dc9357SAndroid Build Coastguard Worker UInt32 numPasses; 58*f6dc9357SAndroid Build Coastguard Worker CEncPropsCEncProps59*f6dc9357SAndroid Build Coastguard Worker CEncProps() 60*f6dc9357SAndroid Build Coastguard Worker { 61*f6dc9357SAndroid Build Coastguard Worker Level = -1; 62*f6dc9357SAndroid Build Coastguard Worker mc = 0; 63*f6dc9357SAndroid Build Coastguard Worker algo = fb = btMode = -1; 64*f6dc9357SAndroid Build Coastguard Worker numPasses = (UInt32)(Int32)-1; 65*f6dc9357SAndroid Build Coastguard Worker } 66*f6dc9357SAndroid Build Coastguard Worker void Normalize(); 67*f6dc9357SAndroid Build Coastguard Worker }; 68*f6dc9357SAndroid Build Coastguard Worker 69*f6dc9357SAndroid Build Coastguard Worker class CCoder 70*f6dc9357SAndroid Build Coastguard Worker { 71*f6dc9357SAndroid Build Coastguard Worker CMatchFinder _lzInWindow; 72*f6dc9357SAndroid Build Coastguard Worker CBitlEncoder m_OutStream; 73*f6dc9357SAndroid Build Coastguard Worker 74*f6dc9357SAndroid Build Coastguard Worker public: 75*f6dc9357SAndroid Build Coastguard Worker CCodeValue *m_Values; 76*f6dc9357SAndroid Build Coastguard Worker 77*f6dc9357SAndroid Build Coastguard Worker UInt16 *m_MatchDistances; 78*f6dc9357SAndroid Build Coastguard Worker UInt32 m_NumFastBytes; 79*f6dc9357SAndroid Build Coastguard Worker bool _fastMode; 80*f6dc9357SAndroid Build Coastguard Worker bool _btMode; 81*f6dc9357SAndroid Build Coastguard Worker 82*f6dc9357SAndroid Build Coastguard Worker UInt16 *m_OnePosMatchesMemory; 83*f6dc9357SAndroid Build Coastguard Worker UInt16 *m_DistanceMemory; 84*f6dc9357SAndroid Build Coastguard Worker 85*f6dc9357SAndroid Build Coastguard Worker UInt32 m_Pos; 86*f6dc9357SAndroid Build Coastguard Worker 87*f6dc9357SAndroid Build Coastguard Worker unsigned m_NumPasses; 88*f6dc9357SAndroid Build Coastguard Worker unsigned m_NumDivPasses; 89*f6dc9357SAndroid Build Coastguard Worker bool m_CheckStatic; 90*f6dc9357SAndroid Build Coastguard Worker bool m_IsMultiPass; 91*f6dc9357SAndroid Build Coastguard Worker UInt32 m_ValueBlockSize; 92*f6dc9357SAndroid Build Coastguard Worker 93*f6dc9357SAndroid Build Coastguard Worker UInt32 m_NumLenCombinations; 94*f6dc9357SAndroid Build Coastguard Worker UInt32 m_MatchMaxLen; 95*f6dc9357SAndroid Build Coastguard Worker const Byte *m_LenStart; 96*f6dc9357SAndroid Build Coastguard Worker const Byte *m_LenDirectBits; 97*f6dc9357SAndroid Build Coastguard Worker 98*f6dc9357SAndroid Build Coastguard Worker bool m_Created; 99*f6dc9357SAndroid Build Coastguard Worker bool m_Deflate64Mode; 100*f6dc9357SAndroid Build Coastguard Worker 101*f6dc9357SAndroid Build Coastguard Worker Byte m_LevelLevels[kLevelTableSize]; 102*f6dc9357SAndroid Build Coastguard Worker unsigned m_NumLitLenLevels; 103*f6dc9357SAndroid Build Coastguard Worker unsigned m_NumDistLevels; 104*f6dc9357SAndroid Build Coastguard Worker UInt32 m_NumLevelCodes; 105*f6dc9357SAndroid Build Coastguard Worker UInt32 m_ValueIndex; 106*f6dc9357SAndroid Build Coastguard Worker 107*f6dc9357SAndroid Build Coastguard Worker bool m_SecondPass; 108*f6dc9357SAndroid Build Coastguard Worker UInt32 m_AdditionalOffset; 109*f6dc9357SAndroid Build Coastguard Worker 110*f6dc9357SAndroid Build Coastguard Worker UInt32 m_OptimumEndIndex; 111*f6dc9357SAndroid Build Coastguard Worker UInt32 m_OptimumCurrentIndex; 112*f6dc9357SAndroid Build Coastguard Worker 113*f6dc9357SAndroid Build Coastguard Worker Byte m_LiteralPrices[256]; 114*f6dc9357SAndroid Build Coastguard Worker Byte m_LenPrices[kNumLenSymbolsMax]; 115*f6dc9357SAndroid Build Coastguard Worker Byte m_PosPrices[kDistTableSize64]; 116*f6dc9357SAndroid Build Coastguard Worker 117*f6dc9357SAndroid Build Coastguard Worker CLevels m_NewLevels; 118*f6dc9357SAndroid Build Coastguard Worker UInt32 mainFreqs[kFixedMainTableSize]; 119*f6dc9357SAndroid Build Coastguard Worker UInt32 distFreqs[kDistTableSize64]; 120*f6dc9357SAndroid Build Coastguard Worker UInt32 mainCodes[kFixedMainTableSize]; 121*f6dc9357SAndroid Build Coastguard Worker UInt32 distCodes[kDistTableSize64]; 122*f6dc9357SAndroid Build Coastguard Worker UInt32 levelCodes[kLevelTableSize]; 123*f6dc9357SAndroid Build Coastguard Worker Byte levelLens[kLevelTableSize]; 124*f6dc9357SAndroid Build Coastguard Worker 125*f6dc9357SAndroid Build Coastguard Worker UInt32 BlockSizeRes; 126*f6dc9357SAndroid Build Coastguard Worker 127*f6dc9357SAndroid Build Coastguard Worker CTables *m_Tables; 128*f6dc9357SAndroid Build Coastguard Worker COptimal m_Optimum[kNumOpts]; 129*f6dc9357SAndroid Build Coastguard Worker 130*f6dc9357SAndroid Build Coastguard Worker UInt32 m_MatchFinderCycles; 131*f6dc9357SAndroid Build Coastguard Worker 132*f6dc9357SAndroid Build Coastguard Worker void GetMatches(); 133*f6dc9357SAndroid Build Coastguard Worker void MovePos(UInt32 num); 134*f6dc9357SAndroid Build Coastguard Worker UInt32 Backward(UInt32 &backRes, UInt32 cur); 135*f6dc9357SAndroid Build Coastguard Worker UInt32 GetOptimal(UInt32 &backRes); 136*f6dc9357SAndroid Build Coastguard Worker UInt32 GetOptimalFast(UInt32 &backRes); 137*f6dc9357SAndroid Build Coastguard Worker 138*f6dc9357SAndroid Build Coastguard Worker void LevelTableDummy(const Byte *levels, unsigned numLevels, UInt32 *freqs); 139*f6dc9357SAndroid Build Coastguard Worker 140*f6dc9357SAndroid Build Coastguard Worker void WriteBits(UInt32 value, unsigned numBits); 141*f6dc9357SAndroid Build Coastguard Worker void LevelTableCode(const Byte *levels, unsigned numLevels, const Byte *lens, const UInt32 *codes); 142*f6dc9357SAndroid Build Coastguard Worker 143*f6dc9357SAndroid Build Coastguard Worker void MakeTables(unsigned maxHuffLen); 144*f6dc9357SAndroid Build Coastguard Worker UInt32 GetLzBlockPrice() const; 145*f6dc9357SAndroid Build Coastguard Worker void TryBlock(); 146*f6dc9357SAndroid Build Coastguard Worker UInt32 TryDynBlock(unsigned tableIndex, UInt32 numPasses); 147*f6dc9357SAndroid Build Coastguard Worker 148*f6dc9357SAndroid Build Coastguard Worker UInt32 TryFixedBlock(unsigned tableIndex); 149*f6dc9357SAndroid Build Coastguard Worker 150*f6dc9357SAndroid Build Coastguard Worker void SetPrices(const CLevels &levels); 151*f6dc9357SAndroid Build Coastguard Worker void WriteBlock(); 152*f6dc9357SAndroid Build Coastguard Worker 153*f6dc9357SAndroid Build Coastguard Worker HRESULT Create(); 154*f6dc9357SAndroid Build Coastguard Worker void Free(); 155*f6dc9357SAndroid Build Coastguard Worker 156*f6dc9357SAndroid Build Coastguard Worker void WriteStoreBlock(UInt32 blockSize, UInt32 additionalOffset, bool finalBlock); 157*f6dc9357SAndroid Build Coastguard Worker void WriteTables(bool writeMode, bool finalBlock); 158*f6dc9357SAndroid Build Coastguard Worker 159*f6dc9357SAndroid Build Coastguard Worker void WriteBlockData(bool writeMode, bool finalBlock); 160*f6dc9357SAndroid Build Coastguard Worker 161*f6dc9357SAndroid Build Coastguard Worker UInt32 GetBlockPrice(unsigned tableIndex, unsigned numDivPasses); 162*f6dc9357SAndroid Build Coastguard Worker void CodeBlock(unsigned tableIndex, bool finalBlock); 163*f6dc9357SAndroid Build Coastguard Worker 164*f6dc9357SAndroid Build Coastguard Worker void SetProps(const CEncProps *props2); 165*f6dc9357SAndroid Build Coastguard Worker public: 166*f6dc9357SAndroid Build Coastguard Worker CCoder(bool deflate64Mode = false); 167*f6dc9357SAndroid Build Coastguard Worker ~CCoder(); 168*f6dc9357SAndroid Build Coastguard Worker 169*f6dc9357SAndroid Build Coastguard Worker HRESULT CodeReal(ISequentialInStream *inStream, ISequentialOutStream *outStream, 170*f6dc9357SAndroid Build Coastguard Worker const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); 171*f6dc9357SAndroid Build Coastguard Worker 172*f6dc9357SAndroid Build Coastguard Worker HRESULT BaseCode(ISequentialInStream *inStream, ISequentialOutStream *outStream, 173*f6dc9357SAndroid Build Coastguard Worker const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); 174*f6dc9357SAndroid Build Coastguard Worker 175*f6dc9357SAndroid Build Coastguard Worker HRESULT BaseSetEncoderProperties2(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps); 176*f6dc9357SAndroid Build Coastguard Worker }; 177*f6dc9357SAndroid Build Coastguard Worker 178*f6dc9357SAndroid Build Coastguard Worker 179*f6dc9357SAndroid Build Coastguard Worker class CCOMCoder Z7_final: 180*f6dc9357SAndroid Build Coastguard Worker public ICompressCoder, 181*f6dc9357SAndroid Build Coastguard Worker public ICompressSetCoderProperties, 182*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp, 183*f6dc9357SAndroid Build Coastguard Worker public CCoder 184*f6dc9357SAndroid Build Coastguard Worker { Z7_IFACES_IMP_UNK_2(ICompressCoder,ICompressSetCoderProperties)185*f6dc9357SAndroid Build Coastguard Worker Z7_IFACES_IMP_UNK_2(ICompressCoder, ICompressSetCoderProperties) 186*f6dc9357SAndroid Build Coastguard Worker public: 187*f6dc9357SAndroid Build Coastguard Worker CCOMCoder(): CCoder(false) {} 188*f6dc9357SAndroid Build Coastguard Worker }; 189*f6dc9357SAndroid Build Coastguard Worker 190*f6dc9357SAndroid Build Coastguard Worker class CCOMCoder64 Z7_final: 191*f6dc9357SAndroid Build Coastguard Worker public ICompressCoder, 192*f6dc9357SAndroid Build Coastguard Worker public ICompressSetCoderProperties, 193*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp, 194*f6dc9357SAndroid Build Coastguard Worker public CCoder 195*f6dc9357SAndroid Build Coastguard Worker { Z7_IFACES_IMP_UNK_2(ICompressCoder,ICompressSetCoderProperties)196*f6dc9357SAndroid Build Coastguard Worker Z7_IFACES_IMP_UNK_2(ICompressCoder, ICompressSetCoderProperties) 197*f6dc9357SAndroid Build Coastguard Worker public: 198*f6dc9357SAndroid Build Coastguard Worker CCOMCoder64(): CCoder(true) {} 199*f6dc9357SAndroid Build Coastguard Worker }; 200*f6dc9357SAndroid Build Coastguard Worker 201*f6dc9357SAndroid Build Coastguard Worker }}} 202*f6dc9357SAndroid Build Coastguard Worker 203*f6dc9357SAndroid Build Coastguard Worker #endif 204