xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/DeflateEncoder.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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