xref: /aosp_15_r20/external/lzma/CPP/7zip/Common/MethodProps.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // MethodProps.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_7Z_METHOD_PROPS_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_7Z_METHOD_PROPS_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyString.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/Defs.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../Windows/Defs.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "../../Windows/PropVariant.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h"
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker // UInt64 GetMemoryUsage_LZMA(UInt32 dict, bool isBt, UInt32 numThreads);
16*f6dc9357SAndroid Build Coastguard Worker 
Calc_From_Val_Percents_Less100(UInt64 val,UInt64 percents)17*f6dc9357SAndroid Build Coastguard Worker inline UInt64 Calc_From_Val_Percents_Less100(UInt64 val, UInt64 percents)
18*f6dc9357SAndroid Build Coastguard Worker {
19*f6dc9357SAndroid Build Coastguard Worker   if (percents == 0)
20*f6dc9357SAndroid Build Coastguard Worker     return 0;
21*f6dc9357SAndroid Build Coastguard Worker   if (val <= (UInt64)(Int64)-1 / percents)
22*f6dc9357SAndroid Build Coastguard Worker     return val * percents / 100;
23*f6dc9357SAndroid Build Coastguard Worker   return val / 100 * percents;
24*f6dc9357SAndroid Build Coastguard Worker }
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker UInt64 Calc_From_Val_Percents(UInt64 val, UInt64 percents);
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker bool StringToBool(const wchar_t *s, bool &res);
29*f6dc9357SAndroid Build Coastguard Worker HRESULT PROPVARIANT_to_bool(const PROPVARIANT &prop, bool &dest);
30*f6dc9357SAndroid Build Coastguard Worker unsigned ParseStringToUInt32(const UString &srcString, UInt32 &number);
31*f6dc9357SAndroid Build Coastguard Worker 
32*f6dc9357SAndroid Build Coastguard Worker /*
33*f6dc9357SAndroid Build Coastguard Worker if (name.IsEmpty() && prop.vt == VT_EMPTY), it doesn't change (resValue) and returns S_OK.
34*f6dc9357SAndroid Build Coastguard Worker   So you must set (resValue) for default value before calling */
35*f6dc9357SAndroid Build Coastguard Worker HRESULT ParsePropToUInt32(const UString &name, const PROPVARIANT &prop, UInt32 &resValue);
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker /* input: (numThreads = the_number_of_processors) */
38*f6dc9357SAndroid Build Coastguard Worker HRESULT ParseMtProp2(const UString &name, const PROPVARIANT &prop, UInt32 &numThreads, bool &force);
39*f6dc9357SAndroid Build Coastguard Worker 
ParseMtProp(const UString & name,const PROPVARIANT & prop,UInt32 numCPUs,UInt32 & numThreads)40*f6dc9357SAndroid Build Coastguard Worker inline HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 numCPUs, UInt32 &numThreads)
41*f6dc9357SAndroid Build Coastguard Worker {
42*f6dc9357SAndroid Build Coastguard Worker   bool forced = false;
43*f6dc9357SAndroid Build Coastguard Worker   numThreads = numCPUs;
44*f6dc9357SAndroid Build Coastguard Worker   return ParseMtProp2(name, prop, numThreads, forced);
45*f6dc9357SAndroid Build Coastguard Worker }
46*f6dc9357SAndroid Build Coastguard Worker 
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker struct CProp
49*f6dc9357SAndroid Build Coastguard Worker {
50*f6dc9357SAndroid Build Coastguard Worker   PROPID Id;
51*f6dc9357SAndroid Build Coastguard Worker   bool IsOptional;
52*f6dc9357SAndroid Build Coastguard Worker   NWindows::NCOM::CPropVariant Value;
CPropCProp53*f6dc9357SAndroid Build Coastguard Worker   CProp(): IsOptional(false) {}
54*f6dc9357SAndroid Build Coastguard Worker };
55*f6dc9357SAndroid Build Coastguard Worker 
56*f6dc9357SAndroid Build Coastguard Worker struct CProps
57*f6dc9357SAndroid Build Coastguard Worker {
58*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CProp> Props;
59*f6dc9357SAndroid Build Coastguard Worker 
ClearCProps60*f6dc9357SAndroid Build Coastguard Worker   void Clear() { Props.Clear(); }
61*f6dc9357SAndroid Build Coastguard Worker 
AreThereNonOptionalPropsCProps62*f6dc9357SAndroid Build Coastguard Worker   bool AreThereNonOptionalProps() const
63*f6dc9357SAndroid Build Coastguard Worker   {
64*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, Props)
65*f6dc9357SAndroid Build Coastguard Worker       if (!Props[i].IsOptional)
66*f6dc9357SAndroid Build Coastguard Worker         return true;
67*f6dc9357SAndroid Build Coastguard Worker     return false;
68*f6dc9357SAndroid Build Coastguard Worker   }
69*f6dc9357SAndroid Build Coastguard Worker 
70*f6dc9357SAndroid Build Coastguard Worker   void AddProp32(PROPID propid, UInt32 val);
71*f6dc9357SAndroid Build Coastguard Worker 
72*f6dc9357SAndroid Build Coastguard Worker   void AddPropBool(PROPID propid, bool val);
73*f6dc9357SAndroid Build Coastguard Worker 
AddProp_AsciiCProps74*f6dc9357SAndroid Build Coastguard Worker   void AddProp_Ascii(PROPID propid, const char *s)
75*f6dc9357SAndroid Build Coastguard Worker   {
76*f6dc9357SAndroid Build Coastguard Worker     CProp &prop = Props.AddNew();
77*f6dc9357SAndroid Build Coastguard Worker     prop.IsOptional = true;
78*f6dc9357SAndroid Build Coastguard Worker     prop.Id = propid;
79*f6dc9357SAndroid Build Coastguard Worker     prop.Value = s;
80*f6dc9357SAndroid Build Coastguard Worker   }
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker   HRESULT SetCoderProps(ICompressSetCoderProperties *scp, const UInt64 *dataSizeReduce = NULL) const;
83*f6dc9357SAndroid Build Coastguard Worker   HRESULT SetCoderProps_DSReduce_Aff(ICompressSetCoderProperties *scp, const UInt64 *dataSizeReduce, const UInt64 *affinity) const;
84*f6dc9357SAndroid Build Coastguard Worker };
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker class CMethodProps: public CProps
87*f6dc9357SAndroid Build Coastguard Worker {
88*f6dc9357SAndroid Build Coastguard Worker   HRESULT SetParam(const UString &name, const UString &value);
89*f6dc9357SAndroid Build Coastguard Worker public:
90*f6dc9357SAndroid Build Coastguard Worker   unsigned GetLevel() const;
Get_NumThreads()91*f6dc9357SAndroid Build Coastguard Worker   int Get_NumThreads() const
92*f6dc9357SAndroid Build Coastguard Worker   {
93*f6dc9357SAndroid Build Coastguard Worker     const int i = FindProp(NCoderPropID::kNumThreads);
94*f6dc9357SAndroid Build Coastguard Worker     if (i >= 0)
95*f6dc9357SAndroid Build Coastguard Worker     {
96*f6dc9357SAndroid Build Coastguard Worker       const NWindows::NCOM::CPropVariant &val = Props[(unsigned)i].Value;
97*f6dc9357SAndroid Build Coastguard Worker       if (val.vt == VT_UI4)
98*f6dc9357SAndroid Build Coastguard Worker         return (int)val.ulVal;
99*f6dc9357SAndroid Build Coastguard Worker     }
100*f6dc9357SAndroid Build Coastguard Worker     return -1;
101*f6dc9357SAndroid Build Coastguard Worker   }
102*f6dc9357SAndroid Build Coastguard Worker 
Get_DicSize(UInt64 & res)103*f6dc9357SAndroid Build Coastguard Worker   bool Get_DicSize(UInt64 &res) const
104*f6dc9357SAndroid Build Coastguard Worker   {
105*f6dc9357SAndroid Build Coastguard Worker     res = 0;
106*f6dc9357SAndroid Build Coastguard Worker     const int i = FindProp(NCoderPropID::kDictionarySize);
107*f6dc9357SAndroid Build Coastguard Worker     if (i >= 0)
108*f6dc9357SAndroid Build Coastguard Worker     {
109*f6dc9357SAndroid Build Coastguard Worker       const NWindows::NCOM::CPropVariant &val = Props[(unsigned)i].Value;
110*f6dc9357SAndroid Build Coastguard Worker       if (val.vt == VT_UI4)
111*f6dc9357SAndroid Build Coastguard Worker       {
112*f6dc9357SAndroid Build Coastguard Worker         res = val.ulVal;
113*f6dc9357SAndroid Build Coastguard Worker         return true;
114*f6dc9357SAndroid Build Coastguard Worker       }
115*f6dc9357SAndroid Build Coastguard Worker       if (val.vt == VT_UI8)
116*f6dc9357SAndroid Build Coastguard Worker       {
117*f6dc9357SAndroid Build Coastguard Worker         res = val.uhVal.QuadPart;
118*f6dc9357SAndroid Build Coastguard Worker         return true;
119*f6dc9357SAndroid Build Coastguard Worker       }
120*f6dc9357SAndroid Build Coastguard Worker     }
121*f6dc9357SAndroid Build Coastguard Worker     return false;
122*f6dc9357SAndroid Build Coastguard Worker   }
123*f6dc9357SAndroid Build Coastguard Worker 
124*f6dc9357SAndroid Build Coastguard Worker   int FindProp(PROPID id) const;
125*f6dc9357SAndroid Build Coastguard Worker 
Get_Lzma_Algo()126*f6dc9357SAndroid Build Coastguard Worker   UInt32 Get_Lzma_Algo() const
127*f6dc9357SAndroid Build Coastguard Worker   {
128*f6dc9357SAndroid Build Coastguard Worker     const int i = FindProp(NCoderPropID::kAlgorithm);
129*f6dc9357SAndroid Build Coastguard Worker     if (i >= 0)
130*f6dc9357SAndroid Build Coastguard Worker     {
131*f6dc9357SAndroid Build Coastguard Worker       const NWindows::NCOM::CPropVariant &val = Props[(unsigned)i].Value;
132*f6dc9357SAndroid Build Coastguard Worker       if (val.vt == VT_UI4)
133*f6dc9357SAndroid Build Coastguard Worker         return val.ulVal;
134*f6dc9357SAndroid Build Coastguard Worker     }
135*f6dc9357SAndroid Build Coastguard Worker     return GetLevel() >= 5 ? 1 : 0;
136*f6dc9357SAndroid Build Coastguard Worker   }
137*f6dc9357SAndroid Build Coastguard Worker 
Get_Lzma_DicSize()138*f6dc9357SAndroid Build Coastguard Worker   UInt64 Get_Lzma_DicSize() const
139*f6dc9357SAndroid Build Coastguard Worker   {
140*f6dc9357SAndroid Build Coastguard Worker     UInt64 v;
141*f6dc9357SAndroid Build Coastguard Worker     if (Get_DicSize(v))
142*f6dc9357SAndroid Build Coastguard Worker       return v;
143*f6dc9357SAndroid Build Coastguard Worker     const unsigned level = GetLevel();
144*f6dc9357SAndroid Build Coastguard Worker     const UInt32 dictSize = level <= 4 ?
145*f6dc9357SAndroid Build Coastguard Worker         (UInt32)1 << (level * 2 + 16) :
146*f6dc9357SAndroid Build Coastguard Worker         level <= sizeof(size_t) / 2 + 4 ?
147*f6dc9357SAndroid Build Coastguard Worker           (UInt32)1 << (level + 20) :
148*f6dc9357SAndroid Build Coastguard Worker           (UInt32)1 << (sizeof(size_t) / 2 + 24);
149*f6dc9357SAndroid Build Coastguard Worker     return dictSize;
150*f6dc9357SAndroid Build Coastguard Worker   }
151*f6dc9357SAndroid Build Coastguard Worker 
Get_Lzma_MatchFinder_IsBt()152*f6dc9357SAndroid Build Coastguard Worker   bool Get_Lzma_MatchFinder_IsBt() const
153*f6dc9357SAndroid Build Coastguard Worker   {
154*f6dc9357SAndroid Build Coastguard Worker     const int i = FindProp(NCoderPropID::kMatchFinder);
155*f6dc9357SAndroid Build Coastguard Worker     if (i >= 0)
156*f6dc9357SAndroid Build Coastguard Worker     {
157*f6dc9357SAndroid Build Coastguard Worker       const NWindows::NCOM::CPropVariant &val = Props[(unsigned)i].Value;
158*f6dc9357SAndroid Build Coastguard Worker       if (val.vt == VT_BSTR)
159*f6dc9357SAndroid Build Coastguard Worker         return ((val.bstrVal[0] | 0x20) != 'h'); // check for "hc"
160*f6dc9357SAndroid Build Coastguard Worker     }
161*f6dc9357SAndroid Build Coastguard Worker     return GetLevel() >= 5;
162*f6dc9357SAndroid Build Coastguard Worker   }
163*f6dc9357SAndroid Build Coastguard Worker 
Get_Lzma_Eos()164*f6dc9357SAndroid Build Coastguard Worker   bool Get_Lzma_Eos() const
165*f6dc9357SAndroid Build Coastguard Worker   {
166*f6dc9357SAndroid Build Coastguard Worker     const int i = FindProp(NCoderPropID::kEndMarker);
167*f6dc9357SAndroid Build Coastguard Worker     if (i >= 0)
168*f6dc9357SAndroid Build Coastguard Worker     {
169*f6dc9357SAndroid Build Coastguard Worker       const NWindows::NCOM::CPropVariant &val = Props[(unsigned)i].Value;
170*f6dc9357SAndroid Build Coastguard Worker       if (val.vt == VT_BOOL)
171*f6dc9357SAndroid Build Coastguard Worker         return VARIANT_BOOLToBool(val.boolVal);
172*f6dc9357SAndroid Build Coastguard Worker     }
173*f6dc9357SAndroid Build Coastguard Worker     return false;
174*f6dc9357SAndroid Build Coastguard Worker   }
175*f6dc9357SAndroid Build Coastguard Worker 
Are_Lzma_Model_Props_Defined()176*f6dc9357SAndroid Build Coastguard Worker   bool Are_Lzma_Model_Props_Defined() const
177*f6dc9357SAndroid Build Coastguard Worker   {
178*f6dc9357SAndroid Build Coastguard Worker     if (FindProp(NCoderPropID::kPosStateBits) >= 0) return true;
179*f6dc9357SAndroid Build Coastguard Worker     if (FindProp(NCoderPropID::kLitContextBits) >= 0) return true;
180*f6dc9357SAndroid Build Coastguard Worker     if (FindProp(NCoderPropID::kLitPosBits) >= 0) return true;
181*f6dc9357SAndroid Build Coastguard Worker     return false;
182*f6dc9357SAndroid Build Coastguard Worker   }
183*f6dc9357SAndroid Build Coastguard Worker 
Get_Lzma_NumThreads()184*f6dc9357SAndroid Build Coastguard Worker   UInt32 Get_Lzma_NumThreads() const
185*f6dc9357SAndroid Build Coastguard Worker   {
186*f6dc9357SAndroid Build Coastguard Worker     if (Get_Lzma_Algo() == 0)
187*f6dc9357SAndroid Build Coastguard Worker       return 1;
188*f6dc9357SAndroid Build Coastguard Worker     int numThreads = Get_NumThreads();
189*f6dc9357SAndroid Build Coastguard Worker     if (numThreads >= 0)
190*f6dc9357SAndroid Build Coastguard Worker       return numThreads < 2 ? 1 : 2;
191*f6dc9357SAndroid Build Coastguard Worker     return 2;
192*f6dc9357SAndroid Build Coastguard Worker   }
193*f6dc9357SAndroid Build Coastguard Worker 
194*f6dc9357SAndroid Build Coastguard Worker   UInt64 Get_Lzma_MemUsage(bool addSlidingWindowSize) const;
195*f6dc9357SAndroid Build Coastguard Worker 
196*f6dc9357SAndroid Build Coastguard Worker   /* returns -1, if numThreads is unknown */
Get_Xz_NumThreads(UInt32 & lzmaThreads)197*f6dc9357SAndroid Build Coastguard Worker   int Get_Xz_NumThreads(UInt32 &lzmaThreads) const
198*f6dc9357SAndroid Build Coastguard Worker   {
199*f6dc9357SAndroid Build Coastguard Worker     lzmaThreads = 1;
200*f6dc9357SAndroid Build Coastguard Worker     int numThreads = Get_NumThreads();
201*f6dc9357SAndroid Build Coastguard Worker     if (numThreads >= 0 && numThreads <= 1)
202*f6dc9357SAndroid Build Coastguard Worker       return 1;
203*f6dc9357SAndroid Build Coastguard Worker     if (Get_Lzma_Algo() != 0)
204*f6dc9357SAndroid Build Coastguard Worker       lzmaThreads = 2;
205*f6dc9357SAndroid Build Coastguard Worker     return numThreads;
206*f6dc9357SAndroid Build Coastguard Worker   }
207*f6dc9357SAndroid Build Coastguard Worker 
GetProp_BlockSize(PROPID id)208*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetProp_BlockSize(PROPID id) const
209*f6dc9357SAndroid Build Coastguard Worker   {
210*f6dc9357SAndroid Build Coastguard Worker     const int i = FindProp(id);
211*f6dc9357SAndroid Build Coastguard Worker     if (i >= 0)
212*f6dc9357SAndroid Build Coastguard Worker     {
213*f6dc9357SAndroid Build Coastguard Worker       const NWindows::NCOM::CPropVariant &val = Props[(unsigned)i].Value;
214*f6dc9357SAndroid Build Coastguard Worker       if (val.vt == VT_UI4) { return val.ulVal; }
215*f6dc9357SAndroid Build Coastguard Worker       if (val.vt == VT_UI8) { return val.uhVal.QuadPart; }
216*f6dc9357SAndroid Build Coastguard Worker     }
217*f6dc9357SAndroid Build Coastguard Worker     return 0;
218*f6dc9357SAndroid Build Coastguard Worker   }
219*f6dc9357SAndroid Build Coastguard Worker 
Get_Xz_BlockSize()220*f6dc9357SAndroid Build Coastguard Worker   UInt64 Get_Xz_BlockSize() const
221*f6dc9357SAndroid Build Coastguard Worker   {
222*f6dc9357SAndroid Build Coastguard Worker     {
223*f6dc9357SAndroid Build Coastguard Worker       UInt64 blockSize1 = GetProp_BlockSize(NCoderPropID::kBlockSize);
224*f6dc9357SAndroid Build Coastguard Worker       UInt64 blockSize2 = GetProp_BlockSize(NCoderPropID::kBlockSize2);
225*f6dc9357SAndroid Build Coastguard Worker       UInt64 minSize = MyMin(blockSize1, blockSize2);
226*f6dc9357SAndroid Build Coastguard Worker       if (minSize != 0)
227*f6dc9357SAndroid Build Coastguard Worker         return minSize;
228*f6dc9357SAndroid Build Coastguard Worker       UInt64 maxSize = MyMax(blockSize1, blockSize2);
229*f6dc9357SAndroid Build Coastguard Worker       if (maxSize != 0)
230*f6dc9357SAndroid Build Coastguard Worker         return maxSize;
231*f6dc9357SAndroid Build Coastguard Worker     }
232*f6dc9357SAndroid Build Coastguard Worker     const UInt32 kMinSize = (UInt32)1 << 20;
233*f6dc9357SAndroid Build Coastguard Worker     const UInt32 kMaxSize = (UInt32)1 << 28;
234*f6dc9357SAndroid Build Coastguard Worker     const UInt64 dictSize = Get_Lzma_DicSize();
235*f6dc9357SAndroid Build Coastguard Worker     /* lzma2 code uses fake 4 GiB to calculate ChunkSize. So we do same */
236*f6dc9357SAndroid Build Coastguard Worker     UInt64 blockSize = (UInt64)dictSize << 2;
237*f6dc9357SAndroid Build Coastguard Worker     if (blockSize < kMinSize) blockSize = kMinSize;
238*f6dc9357SAndroid Build Coastguard Worker     if (blockSize > kMaxSize) blockSize = kMaxSize;
239*f6dc9357SAndroid Build Coastguard Worker     if (blockSize < dictSize) blockSize = dictSize;
240*f6dc9357SAndroid Build Coastguard Worker     blockSize += (kMinSize - 1);
241*f6dc9357SAndroid Build Coastguard Worker     blockSize &= ~(UInt64)(kMinSize - 1);
242*f6dc9357SAndroid Build Coastguard Worker     return blockSize;
243*f6dc9357SAndroid Build Coastguard Worker   }
244*f6dc9357SAndroid Build Coastguard Worker 
245*f6dc9357SAndroid Build Coastguard Worker 
Get_BZip2_NumThreads(bool & fixedNumber)246*f6dc9357SAndroid Build Coastguard Worker   UInt32 Get_BZip2_NumThreads(bool &fixedNumber) const
247*f6dc9357SAndroid Build Coastguard Worker   {
248*f6dc9357SAndroid Build Coastguard Worker     fixedNumber = false;
249*f6dc9357SAndroid Build Coastguard Worker     int numThreads = Get_NumThreads();
250*f6dc9357SAndroid Build Coastguard Worker     if (numThreads >= 0)
251*f6dc9357SAndroid Build Coastguard Worker     {
252*f6dc9357SAndroid Build Coastguard Worker       fixedNumber = true;
253*f6dc9357SAndroid Build Coastguard Worker       if (numThreads < 1) return 1;
254*f6dc9357SAndroid Build Coastguard Worker       const unsigned kNumBZip2ThreadsMax = 64;
255*f6dc9357SAndroid Build Coastguard Worker       if ((unsigned)numThreads > kNumBZip2ThreadsMax) return kNumBZip2ThreadsMax;
256*f6dc9357SAndroid Build Coastguard Worker       return (unsigned)numThreads;
257*f6dc9357SAndroid Build Coastguard Worker     }
258*f6dc9357SAndroid Build Coastguard Worker     return 1;
259*f6dc9357SAndroid Build Coastguard Worker   }
260*f6dc9357SAndroid Build Coastguard Worker 
Get_BZip2_BlockSize()261*f6dc9357SAndroid Build Coastguard Worker   UInt32 Get_BZip2_BlockSize() const
262*f6dc9357SAndroid Build Coastguard Worker   {
263*f6dc9357SAndroid Build Coastguard Worker     const int i = FindProp(NCoderPropID::kDictionarySize);
264*f6dc9357SAndroid Build Coastguard Worker     if (i >= 0)
265*f6dc9357SAndroid Build Coastguard Worker     {
266*f6dc9357SAndroid Build Coastguard Worker       const NWindows::NCOM::CPropVariant &val = Props[(unsigned)i].Value;
267*f6dc9357SAndroid Build Coastguard Worker       if (val.vt == VT_UI4)
268*f6dc9357SAndroid Build Coastguard Worker       {
269*f6dc9357SAndroid Build Coastguard Worker         UInt32 blockSize = val.ulVal;
270*f6dc9357SAndroid Build Coastguard Worker         const UInt32 kDicSizeMin = 100000;
271*f6dc9357SAndroid Build Coastguard Worker         const UInt32 kDicSizeMax = 900000;
272*f6dc9357SAndroid Build Coastguard Worker         if (blockSize < kDicSizeMin) blockSize = kDicSizeMin;
273*f6dc9357SAndroid Build Coastguard Worker         if (blockSize > kDicSizeMax) blockSize = kDicSizeMax;
274*f6dc9357SAndroid Build Coastguard Worker         return blockSize;
275*f6dc9357SAndroid Build Coastguard Worker       }
276*f6dc9357SAndroid Build Coastguard Worker     }
277*f6dc9357SAndroid Build Coastguard Worker     const unsigned level = GetLevel();
278*f6dc9357SAndroid Build Coastguard Worker     return 100000 * (level >= 5 ? 9 : (level >= 1 ? level * 2 - 1: 1));
279*f6dc9357SAndroid Build Coastguard Worker   }
280*f6dc9357SAndroid Build Coastguard Worker 
Get_Ppmd_MemSize()281*f6dc9357SAndroid Build Coastguard Worker   UInt64 Get_Ppmd_MemSize() const
282*f6dc9357SAndroid Build Coastguard Worker   {
283*f6dc9357SAndroid Build Coastguard Worker     const int i = FindProp(NCoderPropID::kUsedMemorySize);
284*f6dc9357SAndroid Build Coastguard Worker     if (i >= 0)
285*f6dc9357SAndroid Build Coastguard Worker     {
286*f6dc9357SAndroid Build Coastguard Worker       const NWindows::NCOM::CPropVariant &val = Props[(unsigned)i].Value;
287*f6dc9357SAndroid Build Coastguard Worker       if (val.vt == VT_UI4)
288*f6dc9357SAndroid Build Coastguard Worker         return val.ulVal;
289*f6dc9357SAndroid Build Coastguard Worker       if (val.vt == VT_UI8)
290*f6dc9357SAndroid Build Coastguard Worker         return val.uhVal.QuadPart;
291*f6dc9357SAndroid Build Coastguard Worker     }
292*f6dc9357SAndroid Build Coastguard Worker     const unsigned level = GetLevel();
293*f6dc9357SAndroid Build Coastguard Worker     const UInt32 mem = (UInt32)1 << (level + 19);
294*f6dc9357SAndroid Build Coastguard Worker     return mem;
295*f6dc9357SAndroid Build Coastguard Worker   }
296*f6dc9357SAndroid Build Coastguard Worker 
AddProp_Level(UInt32 level)297*f6dc9357SAndroid Build Coastguard Worker   void AddProp_Level(UInt32 level)
298*f6dc9357SAndroid Build Coastguard Worker   {
299*f6dc9357SAndroid Build Coastguard Worker     AddProp32(NCoderPropID::kLevel, level);
300*f6dc9357SAndroid Build Coastguard Worker   }
301*f6dc9357SAndroid Build Coastguard Worker 
AddProp_NumThreads(UInt32 numThreads)302*f6dc9357SAndroid Build Coastguard Worker   void AddProp_NumThreads(UInt32 numThreads)
303*f6dc9357SAndroid Build Coastguard Worker   {
304*f6dc9357SAndroid Build Coastguard Worker     AddProp32(NCoderPropID::kNumThreads, numThreads);
305*f6dc9357SAndroid Build Coastguard Worker   }
306*f6dc9357SAndroid Build Coastguard Worker 
AddProp_EndMarker_if_NotFound(bool eos)307*f6dc9357SAndroid Build Coastguard Worker   void AddProp_EndMarker_if_NotFound(bool eos)
308*f6dc9357SAndroid Build Coastguard Worker   {
309*f6dc9357SAndroid Build Coastguard Worker     if (FindProp(NCoderPropID::kEndMarker) < 0)
310*f6dc9357SAndroid Build Coastguard Worker       AddPropBool(NCoderPropID::kEndMarker, eos);
311*f6dc9357SAndroid Build Coastguard Worker   }
312*f6dc9357SAndroid Build Coastguard Worker 
AddProp_BlockSize2(UInt64 blockSize2)313*f6dc9357SAndroid Build Coastguard Worker   void AddProp_BlockSize2(UInt64 blockSize2)
314*f6dc9357SAndroid Build Coastguard Worker   {
315*f6dc9357SAndroid Build Coastguard Worker     if (FindProp(NCoderPropID::kBlockSize2) < 0)
316*f6dc9357SAndroid Build Coastguard Worker     {
317*f6dc9357SAndroid Build Coastguard Worker       CProp &prop = Props.AddNew();
318*f6dc9357SAndroid Build Coastguard Worker       prop.IsOptional = true;
319*f6dc9357SAndroid Build Coastguard Worker       prop.Id = NCoderPropID::kBlockSize2;
320*f6dc9357SAndroid Build Coastguard Worker       prop.Value = blockSize2;
321*f6dc9357SAndroid Build Coastguard Worker     }
322*f6dc9357SAndroid Build Coastguard Worker   }
323*f6dc9357SAndroid Build Coastguard Worker 
324*f6dc9357SAndroid Build Coastguard Worker   HRESULT ParseParamsFromString(const UString &srcString);
325*f6dc9357SAndroid Build Coastguard Worker   HRESULT ParseParamsFromPROPVARIANT(const UString &realName, const PROPVARIANT &value);
326*f6dc9357SAndroid Build Coastguard Worker };
327*f6dc9357SAndroid Build Coastguard Worker 
328*f6dc9357SAndroid Build Coastguard Worker class COneMethodInfo: public CMethodProps
329*f6dc9357SAndroid Build Coastguard Worker {
330*f6dc9357SAndroid Build Coastguard Worker public:
331*f6dc9357SAndroid Build Coastguard Worker   AString MethodName;
332*f6dc9357SAndroid Build Coastguard Worker   UString PropsString;
333*f6dc9357SAndroid Build Coastguard Worker 
Clear()334*f6dc9357SAndroid Build Coastguard Worker   void Clear()
335*f6dc9357SAndroid Build Coastguard Worker   {
336*f6dc9357SAndroid Build Coastguard Worker     CMethodProps::Clear();
337*f6dc9357SAndroid Build Coastguard Worker     MethodName.Empty();
338*f6dc9357SAndroid Build Coastguard Worker     PropsString.Empty();
339*f6dc9357SAndroid Build Coastguard Worker   }
IsEmpty()340*f6dc9357SAndroid Build Coastguard Worker   bool IsEmpty() const { return MethodName.IsEmpty() && Props.IsEmpty(); }
341*f6dc9357SAndroid Build Coastguard Worker   HRESULT ParseMethodFromPROPVARIANT(const UString &realName, const PROPVARIANT &value);
342*f6dc9357SAndroid Build Coastguard Worker   HRESULT ParseMethodFromString(const UString &s);
343*f6dc9357SAndroid Build Coastguard Worker };
344*f6dc9357SAndroid Build Coastguard Worker 
345*f6dc9357SAndroid Build Coastguard Worker #endif
346