xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/LzmaEncoder.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // LzmaEncoder.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/Alloc.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../Common/CWrappers.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../Common/StreamUtils.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "LzmaEncoder.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker // #define LOG_LZMA_THREADS
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #ifdef LOG_LZMA_THREADS
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #include <stdio.h>
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/IntToString.h"
19*f6dc9357SAndroid Build Coastguard Worker #include "../../Windows/TimeUtils.h"
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
22*f6dc9357SAndroid Build Coastguard Worker void LzmaEnc_GetLzThreads(CLzmaEncHandle pp, HANDLE lz_threads[2]);
23*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker #endif
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker namespace NCompress {
28*f6dc9357SAndroid Build Coastguard Worker namespace NLzma {
29*f6dc9357SAndroid Build Coastguard Worker 
CEncoder()30*f6dc9357SAndroid Build Coastguard Worker CEncoder::CEncoder()
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker   _encoder = NULL;
33*f6dc9357SAndroid Build Coastguard Worker   _encoder = LzmaEnc_Create(&g_AlignedAlloc);
34*f6dc9357SAndroid Build Coastguard Worker   if (!_encoder)
35*f6dc9357SAndroid Build Coastguard Worker     throw 1;
36*f6dc9357SAndroid Build Coastguard Worker }
37*f6dc9357SAndroid Build Coastguard Worker 
~CEncoder()38*f6dc9357SAndroid Build Coastguard Worker CEncoder::~CEncoder()
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker   if (_encoder)
41*f6dc9357SAndroid Build Coastguard Worker     LzmaEnc_Destroy(_encoder, &g_AlignedAlloc, &g_BigAlloc);
42*f6dc9357SAndroid Build Coastguard Worker }
43*f6dc9357SAndroid Build Coastguard Worker 
GetLowCharFast(wchar_t c)44*f6dc9357SAndroid Build Coastguard Worker static inline wchar_t GetLowCharFast(wchar_t c)
45*f6dc9357SAndroid Build Coastguard Worker {
46*f6dc9357SAndroid Build Coastguard Worker   return c |= 0x20;
47*f6dc9357SAndroid Build Coastguard Worker }
48*f6dc9357SAndroid Build Coastguard Worker 
ParseMatchFinder(const wchar_t * s,int * btMode,int * numHashBytes)49*f6dc9357SAndroid Build Coastguard Worker static int ParseMatchFinder(const wchar_t *s, int *btMode, int *numHashBytes)
50*f6dc9357SAndroid Build Coastguard Worker {
51*f6dc9357SAndroid Build Coastguard Worker   const wchar_t c = GetLowCharFast(*s++);
52*f6dc9357SAndroid Build Coastguard Worker   if (c == 'h')
53*f6dc9357SAndroid Build Coastguard Worker   {
54*f6dc9357SAndroid Build Coastguard Worker     if (GetLowCharFast(*s++) != 'c')
55*f6dc9357SAndroid Build Coastguard Worker       return 0;
56*f6dc9357SAndroid Build Coastguard Worker     const int num = (int)(*s++ - L'0');
57*f6dc9357SAndroid Build Coastguard Worker     if (num < 4 || num > 5)
58*f6dc9357SAndroid Build Coastguard Worker       return 0;
59*f6dc9357SAndroid Build Coastguard Worker     if (*s != 0)
60*f6dc9357SAndroid Build Coastguard Worker       return 0;
61*f6dc9357SAndroid Build Coastguard Worker     *btMode = 0;
62*f6dc9357SAndroid Build Coastguard Worker     *numHashBytes = num;
63*f6dc9357SAndroid Build Coastguard Worker     return 1;
64*f6dc9357SAndroid Build Coastguard Worker   }
65*f6dc9357SAndroid Build Coastguard Worker 
66*f6dc9357SAndroid Build Coastguard Worker   if (c != 'b')
67*f6dc9357SAndroid Build Coastguard Worker     return 0;
68*f6dc9357SAndroid Build Coastguard Worker   {
69*f6dc9357SAndroid Build Coastguard Worker     if (GetLowCharFast(*s++) != 't')
70*f6dc9357SAndroid Build Coastguard Worker       return 0;
71*f6dc9357SAndroid Build Coastguard Worker     const int num = (int)(*s++ - L'0');
72*f6dc9357SAndroid Build Coastguard Worker     if (num < 2 || num > 5)
73*f6dc9357SAndroid Build Coastguard Worker       return 0;
74*f6dc9357SAndroid Build Coastguard Worker     if (*s != 0)
75*f6dc9357SAndroid Build Coastguard Worker       return 0;
76*f6dc9357SAndroid Build Coastguard Worker     *btMode = 1;
77*f6dc9357SAndroid Build Coastguard Worker     *numHashBytes = num;
78*f6dc9357SAndroid Build Coastguard Worker     return 1;
79*f6dc9357SAndroid Build Coastguard Worker   }
80*f6dc9357SAndroid Build Coastguard Worker }
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker #define SET_PROP_32(_id_, _dest_) case NCoderPropID::_id_: ep._dest_ = (int)v; break;
83*f6dc9357SAndroid Build Coastguard Worker #define SET_PROP_32U(_id_, _dest_) case NCoderPropID::_id_: ep._dest_ = v; break;
84*f6dc9357SAndroid Build Coastguard Worker 
85*f6dc9357SAndroid Build Coastguard Worker HRESULT SetLzmaProp(PROPID propID, const PROPVARIANT &prop, CLzmaEncProps &ep);
SetLzmaProp(PROPID propID,const PROPVARIANT & prop,CLzmaEncProps & ep)86*f6dc9357SAndroid Build Coastguard Worker HRESULT SetLzmaProp(PROPID propID, const PROPVARIANT &prop, CLzmaEncProps &ep)
87*f6dc9357SAndroid Build Coastguard Worker {
88*f6dc9357SAndroid Build Coastguard Worker   if (propID == NCoderPropID::kMatchFinder)
89*f6dc9357SAndroid Build Coastguard Worker   {
90*f6dc9357SAndroid Build Coastguard Worker     if (prop.vt != VT_BSTR)
91*f6dc9357SAndroid Build Coastguard Worker       return E_INVALIDARG;
92*f6dc9357SAndroid Build Coastguard Worker     return ParseMatchFinder(prop.bstrVal, &ep.btMode, &ep.numHashBytes) ? S_OK : E_INVALIDARG;
93*f6dc9357SAndroid Build Coastguard Worker   }
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker   if (propID == NCoderPropID::kAffinity)
96*f6dc9357SAndroid Build Coastguard Worker   {
97*f6dc9357SAndroid Build Coastguard Worker     if (prop.vt == VT_UI8)
98*f6dc9357SAndroid Build Coastguard Worker       ep.affinity = prop.uhVal.QuadPart;
99*f6dc9357SAndroid Build Coastguard Worker     else
100*f6dc9357SAndroid Build Coastguard Worker       return E_INVALIDARG;
101*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
102*f6dc9357SAndroid Build Coastguard Worker   }
103*f6dc9357SAndroid Build Coastguard Worker 
104*f6dc9357SAndroid Build Coastguard Worker   if (propID == NCoderPropID::kHashBits)
105*f6dc9357SAndroid Build Coastguard Worker   {
106*f6dc9357SAndroid Build Coastguard Worker     if (prop.vt == VT_UI4)
107*f6dc9357SAndroid Build Coastguard Worker       ep.numHashOutBits = prop.ulVal;
108*f6dc9357SAndroid Build Coastguard Worker     else
109*f6dc9357SAndroid Build Coastguard Worker       return E_INVALIDARG;
110*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
111*f6dc9357SAndroid Build Coastguard Worker   }
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker   if (propID > NCoderPropID::kReduceSize)
114*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
115*f6dc9357SAndroid Build Coastguard Worker 
116*f6dc9357SAndroid Build Coastguard Worker   if (propID == NCoderPropID::kReduceSize)
117*f6dc9357SAndroid Build Coastguard Worker   {
118*f6dc9357SAndroid Build Coastguard Worker     if (prop.vt == VT_UI8)
119*f6dc9357SAndroid Build Coastguard Worker       ep.reduceSize = prop.uhVal.QuadPart;
120*f6dc9357SAndroid Build Coastguard Worker     else
121*f6dc9357SAndroid Build Coastguard Worker       return E_INVALIDARG;
122*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
123*f6dc9357SAndroid Build Coastguard Worker   }
124*f6dc9357SAndroid Build Coastguard Worker 
125*f6dc9357SAndroid Build Coastguard Worker   if (propID == NCoderPropID::kDictionarySize)
126*f6dc9357SAndroid Build Coastguard Worker   {
127*f6dc9357SAndroid Build Coastguard Worker     if (prop.vt == VT_UI8)
128*f6dc9357SAndroid Build Coastguard Worker     {
129*f6dc9357SAndroid Build Coastguard Worker       // 21.03 : we support 64-bit VT_UI8 for dictionary and (dict == 4 GiB)
130*f6dc9357SAndroid Build Coastguard Worker       const UInt64 v = prop.uhVal.QuadPart;
131*f6dc9357SAndroid Build Coastguard Worker       if (v > ((UInt64)1 << 32))
132*f6dc9357SAndroid Build Coastguard Worker         return E_INVALIDARG;
133*f6dc9357SAndroid Build Coastguard Worker       UInt32 dict;
134*f6dc9357SAndroid Build Coastguard Worker       if (v == ((UInt64)1 << 32))
135*f6dc9357SAndroid Build Coastguard Worker         dict = (UInt32)(Int32)-1;
136*f6dc9357SAndroid Build Coastguard Worker       else
137*f6dc9357SAndroid Build Coastguard Worker         dict = (UInt32)v;
138*f6dc9357SAndroid Build Coastguard Worker       ep.dictSize = dict;
139*f6dc9357SAndroid Build Coastguard Worker       return S_OK;
140*f6dc9357SAndroid Build Coastguard Worker     }
141*f6dc9357SAndroid Build Coastguard Worker   }
142*f6dc9357SAndroid Build Coastguard Worker 
143*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt != VT_UI4)
144*f6dc9357SAndroid Build Coastguard Worker     return E_INVALIDARG;
145*f6dc9357SAndroid Build Coastguard Worker   const UInt32 v = prop.ulVal;
146*f6dc9357SAndroid Build Coastguard Worker   switch (propID)
147*f6dc9357SAndroid Build Coastguard Worker   {
148*f6dc9357SAndroid Build Coastguard Worker     case NCoderPropID::kDefaultProp:
149*f6dc9357SAndroid Build Coastguard Worker       if (v > 32)
150*f6dc9357SAndroid Build Coastguard Worker         return E_INVALIDARG;
151*f6dc9357SAndroid Build Coastguard Worker       ep.dictSize = (v == 32) ? (UInt32)(Int32)-1 : (UInt32)1 << (unsigned)v;
152*f6dc9357SAndroid Build Coastguard Worker       break;
153*f6dc9357SAndroid Build Coastguard Worker     SET_PROP_32(kLevel, level)
154*f6dc9357SAndroid Build Coastguard Worker     SET_PROP_32(kNumFastBytes, fb)
155*f6dc9357SAndroid Build Coastguard Worker     SET_PROP_32U(kMatchFinderCycles, mc)
156*f6dc9357SAndroid Build Coastguard Worker     SET_PROP_32(kAlgorithm, algo)
157*f6dc9357SAndroid Build Coastguard Worker     SET_PROP_32U(kDictionarySize, dictSize)
158*f6dc9357SAndroid Build Coastguard Worker     SET_PROP_32(kPosStateBits, pb)
159*f6dc9357SAndroid Build Coastguard Worker     SET_PROP_32(kLitPosBits, lp)
160*f6dc9357SAndroid Build Coastguard Worker     SET_PROP_32(kLitContextBits, lc)
161*f6dc9357SAndroid Build Coastguard Worker     SET_PROP_32(kNumThreads, numThreads)
162*f6dc9357SAndroid Build Coastguard Worker     default: return E_INVALIDARG;
163*f6dc9357SAndroid Build Coastguard Worker   }
164*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
165*f6dc9357SAndroid Build Coastguard Worker }
166*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CEncoder::SetCoderProperties (const PROPID * propIDs,const PROPVARIANT * coderProps,UInt32 numProps))167*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CEncoder::SetCoderProperties(const PROPID *propIDs,
168*f6dc9357SAndroid Build Coastguard Worker     const PROPVARIANT *coderProps, UInt32 numProps))
169*f6dc9357SAndroid Build Coastguard Worker {
170*f6dc9357SAndroid Build Coastguard Worker   CLzmaEncProps props;
171*f6dc9357SAndroid Build Coastguard Worker   LzmaEncProps_Init(&props);
172*f6dc9357SAndroid Build Coastguard Worker 
173*f6dc9357SAndroid Build Coastguard Worker   for (UInt32 i = 0; i < numProps; i++)
174*f6dc9357SAndroid Build Coastguard Worker   {
175*f6dc9357SAndroid Build Coastguard Worker     const PROPVARIANT &prop = coderProps[i];
176*f6dc9357SAndroid Build Coastguard Worker     const PROPID propID = propIDs[i];
177*f6dc9357SAndroid Build Coastguard Worker     switch (propID)
178*f6dc9357SAndroid Build Coastguard Worker     {
179*f6dc9357SAndroid Build Coastguard Worker       case NCoderPropID::kEndMarker:
180*f6dc9357SAndroid Build Coastguard Worker         if (prop.vt != VT_BOOL)
181*f6dc9357SAndroid Build Coastguard Worker           return E_INVALIDARG;
182*f6dc9357SAndroid Build Coastguard Worker         props.writeEndMark = (prop.boolVal != VARIANT_FALSE);
183*f6dc9357SAndroid Build Coastguard Worker         break;
184*f6dc9357SAndroid Build Coastguard Worker       default:
185*f6dc9357SAndroid Build Coastguard Worker         RINOK(SetLzmaProp(propID, prop, props))
186*f6dc9357SAndroid Build Coastguard Worker     }
187*f6dc9357SAndroid Build Coastguard Worker   }
188*f6dc9357SAndroid Build Coastguard Worker   return SResToHRESULT(LzmaEnc_SetProps(_encoder, &props));
189*f6dc9357SAndroid Build Coastguard Worker }
190*f6dc9357SAndroid Build Coastguard Worker 
191*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CEncoder::SetCoderPropertiesOpt (const PROPID * propIDs,const PROPVARIANT * coderProps,UInt32 numProps))192*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CEncoder::SetCoderPropertiesOpt(const PROPID *propIDs,
193*f6dc9357SAndroid Build Coastguard Worker     const PROPVARIANT *coderProps, UInt32 numProps))
194*f6dc9357SAndroid Build Coastguard Worker {
195*f6dc9357SAndroid Build Coastguard Worker   for (UInt32 i = 0; i < numProps; i++)
196*f6dc9357SAndroid Build Coastguard Worker   {
197*f6dc9357SAndroid Build Coastguard Worker     const PROPVARIANT &prop = coderProps[i];
198*f6dc9357SAndroid Build Coastguard Worker     const PROPID propID = propIDs[i];
199*f6dc9357SAndroid Build Coastguard Worker     if (propID == NCoderPropID::kExpectedDataSize)
200*f6dc9357SAndroid Build Coastguard Worker       if (prop.vt == VT_UI8)
201*f6dc9357SAndroid Build Coastguard Worker         LzmaEnc_SetDataSize(_encoder, prop.uhVal.QuadPart);
202*f6dc9357SAndroid Build Coastguard Worker   }
203*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
204*f6dc9357SAndroid Build Coastguard Worker }
205*f6dc9357SAndroid Build Coastguard Worker 
206*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CEncoder::WriteCoderProperties (ISequentialOutStream * outStream))207*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CEncoder::WriteCoderProperties(ISequentialOutStream *outStream))
208*f6dc9357SAndroid Build Coastguard Worker {
209*f6dc9357SAndroid Build Coastguard Worker   Byte props[LZMA_PROPS_SIZE];
210*f6dc9357SAndroid Build Coastguard Worker   SizeT size = LZMA_PROPS_SIZE;
211*f6dc9357SAndroid Build Coastguard Worker   RINOK(LzmaEnc_WriteProperties(_encoder, props, &size))
212*f6dc9357SAndroid Build Coastguard Worker   return WriteStream(outStream, props, size);
213*f6dc9357SAndroid Build Coastguard Worker }
214*f6dc9357SAndroid Build Coastguard Worker 
215*f6dc9357SAndroid Build Coastguard Worker 
216*f6dc9357SAndroid Build Coastguard Worker #define RET_IF_WRAP_ERROR(wrapRes, sRes, sResErrorCode) \
217*f6dc9357SAndroid Build Coastguard Worker   if (wrapRes != S_OK /* && (sRes == SZ_OK || sRes == sResErrorCode) */) return wrapRes;
218*f6dc9357SAndroid Build Coastguard Worker 
219*f6dc9357SAndroid Build Coastguard Worker 
220*f6dc9357SAndroid Build Coastguard Worker 
221*f6dc9357SAndroid Build Coastguard Worker #ifdef LOG_LZMA_THREADS
222*f6dc9357SAndroid Build Coastguard Worker 
GetTime64(const FILETIME & t)223*f6dc9357SAndroid Build Coastguard Worker static inline UInt64 GetTime64(const FILETIME &t) { return ((UInt64)t.dwHighDateTime << 32) | t.dwLowDateTime; }
224*f6dc9357SAndroid Build Coastguard Worker 
PrintNum(UInt64 val,unsigned numDigits,char c=' ')225*f6dc9357SAndroid Build Coastguard Worker static void PrintNum(UInt64 val, unsigned numDigits, char c = ' ')
226*f6dc9357SAndroid Build Coastguard Worker {
227*f6dc9357SAndroid Build Coastguard Worker   char temp[64];
228*f6dc9357SAndroid Build Coastguard Worker   char *p = temp + 32;
229*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt64ToString(val, p);
230*f6dc9357SAndroid Build Coastguard Worker   unsigned len = (unsigned)strlen(p);
231*f6dc9357SAndroid Build Coastguard Worker   for (; len < numDigits; len++)
232*f6dc9357SAndroid Build Coastguard Worker     *--p = c;
233*f6dc9357SAndroid Build Coastguard Worker   printf("%s", p);
234*f6dc9357SAndroid Build Coastguard Worker }
235*f6dc9357SAndroid Build Coastguard Worker 
PrintTime(const char * s,UInt64 val,UInt64 total)236*f6dc9357SAndroid Build Coastguard Worker static void PrintTime(const char *s, UInt64 val, UInt64 total)
237*f6dc9357SAndroid Build Coastguard Worker {
238*f6dc9357SAndroid Build Coastguard Worker   printf("  %s :", s);
239*f6dc9357SAndroid Build Coastguard Worker   const UInt32 kFreq = 10000000;
240*f6dc9357SAndroid Build Coastguard Worker   UInt64 sec = val / kFreq;
241*f6dc9357SAndroid Build Coastguard Worker   PrintNum(sec, 6);
242*f6dc9357SAndroid Build Coastguard Worker   printf(" .");
243*f6dc9357SAndroid Build Coastguard Worker   UInt32 ms = (UInt32)(val - (sec * kFreq)) / (kFreq / 1000);
244*f6dc9357SAndroid Build Coastguard Worker   PrintNum(ms, 3, '0');
245*f6dc9357SAndroid Build Coastguard Worker 
246*f6dc9357SAndroid Build Coastguard Worker   while (val > ((UInt64)1 << 56))
247*f6dc9357SAndroid Build Coastguard Worker   {
248*f6dc9357SAndroid Build Coastguard Worker     val >>= 1;
249*f6dc9357SAndroid Build Coastguard Worker     total >>= 1;
250*f6dc9357SAndroid Build Coastguard Worker   }
251*f6dc9357SAndroid Build Coastguard Worker 
252*f6dc9357SAndroid Build Coastguard Worker   UInt64 percent = 0;
253*f6dc9357SAndroid Build Coastguard Worker   if (total != 0)
254*f6dc9357SAndroid Build Coastguard Worker     percent = val * 100 / total;
255*f6dc9357SAndroid Build Coastguard Worker   printf("  =");
256*f6dc9357SAndroid Build Coastguard Worker   PrintNum(percent, 4);
257*f6dc9357SAndroid Build Coastguard Worker   printf("%%");
258*f6dc9357SAndroid Build Coastguard Worker }
259*f6dc9357SAndroid Build Coastguard Worker 
260*f6dc9357SAndroid Build Coastguard Worker 
261*f6dc9357SAndroid Build Coastguard Worker struct CBaseStat
262*f6dc9357SAndroid Build Coastguard Worker {
263*f6dc9357SAndroid Build Coastguard Worker   UInt64 kernelTime, userTime;
264*f6dc9357SAndroid Build Coastguard Worker 
GetNCompress::NLzma::CBaseStat265*f6dc9357SAndroid Build Coastguard Worker   BOOL Get(HANDLE thread, const CBaseStat *prevStat)
266*f6dc9357SAndroid Build Coastguard Worker   {
267*f6dc9357SAndroid Build Coastguard Worker     FILETIME creationTimeFT, exitTimeFT, kernelTimeFT, userTimeFT;
268*f6dc9357SAndroid Build Coastguard Worker     BOOL res = GetThreadTimes(thread
269*f6dc9357SAndroid Build Coastguard Worker       , &creationTimeFT, &exitTimeFT, &kernelTimeFT, &userTimeFT);
270*f6dc9357SAndroid Build Coastguard Worker     if (res)
271*f6dc9357SAndroid Build Coastguard Worker     {
272*f6dc9357SAndroid Build Coastguard Worker       kernelTime = GetTime64(kernelTimeFT);
273*f6dc9357SAndroid Build Coastguard Worker       userTime = GetTime64(userTimeFT);
274*f6dc9357SAndroid Build Coastguard Worker       if (prevStat)
275*f6dc9357SAndroid Build Coastguard Worker       {
276*f6dc9357SAndroid Build Coastguard Worker         kernelTime -= prevStat->kernelTime;
277*f6dc9357SAndroid Build Coastguard Worker         userTime -= prevStat->userTime;
278*f6dc9357SAndroid Build Coastguard Worker       }
279*f6dc9357SAndroid Build Coastguard Worker     }
280*f6dc9357SAndroid Build Coastguard Worker     return res;
281*f6dc9357SAndroid Build Coastguard Worker   }
282*f6dc9357SAndroid Build Coastguard Worker };
283*f6dc9357SAndroid Build Coastguard Worker 
284*f6dc9357SAndroid Build Coastguard Worker 
PrintStat(HANDLE thread,UInt64 totalTime,const CBaseStat * prevStat)285*f6dc9357SAndroid Build Coastguard Worker static void PrintStat(HANDLE thread, UInt64 totalTime, const CBaseStat *prevStat)
286*f6dc9357SAndroid Build Coastguard Worker {
287*f6dc9357SAndroid Build Coastguard Worker   CBaseStat newStat;
288*f6dc9357SAndroid Build Coastguard Worker   if (!newStat.Get(thread, prevStat))
289*f6dc9357SAndroid Build Coastguard Worker     return;
290*f6dc9357SAndroid Build Coastguard Worker 
291*f6dc9357SAndroid Build Coastguard Worker   PrintTime("K", newStat.kernelTime, totalTime);
292*f6dc9357SAndroid Build Coastguard Worker 
293*f6dc9357SAndroid Build Coastguard Worker   const UInt64 processTime = newStat.kernelTime + newStat.userTime;
294*f6dc9357SAndroid Build Coastguard Worker 
295*f6dc9357SAndroid Build Coastguard Worker   PrintTime("U", newStat.userTime, totalTime);
296*f6dc9357SAndroid Build Coastguard Worker   PrintTime("S", processTime, totalTime);
297*f6dc9357SAndroid Build Coastguard Worker   printf("\n");
298*f6dc9357SAndroid Build Coastguard Worker   // PrintTime("G ", totalTime, totalTime);
299*f6dc9357SAndroid Build Coastguard Worker }
300*f6dc9357SAndroid Build Coastguard Worker 
301*f6dc9357SAndroid Build Coastguard Worker #endif
302*f6dc9357SAndroid Build Coastguard Worker 
303*f6dc9357SAndroid Build Coastguard Worker 
304*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CEncoder::Code (ISequentialInStream * inStream,ISequentialOutStream * outStream,const UInt64 *,const UInt64 *,ICompressProgressInfo * progress))305*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
306*f6dc9357SAndroid Build Coastguard Worker     const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress))
307*f6dc9357SAndroid Build Coastguard Worker {
308*f6dc9357SAndroid Build Coastguard Worker   CSeqInStreamWrap inWrap;
309*f6dc9357SAndroid Build Coastguard Worker   CSeqOutStreamWrap outWrap;
310*f6dc9357SAndroid Build Coastguard Worker   CCompressProgressWrap progressWrap;
311*f6dc9357SAndroid Build Coastguard Worker 
312*f6dc9357SAndroid Build Coastguard Worker   inWrap.Init(inStream);
313*f6dc9357SAndroid Build Coastguard Worker   outWrap.Init(outStream);
314*f6dc9357SAndroid Build Coastguard Worker   progressWrap.Init(progress);
315*f6dc9357SAndroid Build Coastguard Worker 
316*f6dc9357SAndroid Build Coastguard Worker   #ifdef LOG_LZMA_THREADS
317*f6dc9357SAndroid Build Coastguard Worker 
318*f6dc9357SAndroid Build Coastguard Worker   FILETIME startTimeFT;
319*f6dc9357SAndroid Build Coastguard Worker   NWindows::NTime::GetCurUtcFileTime(startTimeFT);
320*f6dc9357SAndroid Build Coastguard Worker   UInt64 totalTime = GetTime64(startTimeFT);
321*f6dc9357SAndroid Build Coastguard Worker   CBaseStat oldStat;
322*f6dc9357SAndroid Build Coastguard Worker   if (!oldStat.Get(GetCurrentThread(), NULL))
323*f6dc9357SAndroid Build Coastguard Worker     return E_FAIL;
324*f6dc9357SAndroid Build Coastguard Worker 
325*f6dc9357SAndroid Build Coastguard Worker   #endif
326*f6dc9357SAndroid Build Coastguard Worker 
327*f6dc9357SAndroid Build Coastguard Worker 
328*f6dc9357SAndroid Build Coastguard Worker   SRes res = LzmaEnc_Encode(_encoder, &outWrap.vt, &inWrap.vt,
329*f6dc9357SAndroid Build Coastguard Worker       progress ? &progressWrap.vt : NULL, &g_AlignedAlloc, &g_BigAlloc);
330*f6dc9357SAndroid Build Coastguard Worker 
331*f6dc9357SAndroid Build Coastguard Worker   _inputProcessed = inWrap.Processed;
332*f6dc9357SAndroid Build Coastguard Worker 
333*f6dc9357SAndroid Build Coastguard Worker   RET_IF_WRAP_ERROR(inWrap.Res, res, SZ_ERROR_READ)
334*f6dc9357SAndroid Build Coastguard Worker   RET_IF_WRAP_ERROR(outWrap.Res, res, SZ_ERROR_WRITE)
335*f6dc9357SAndroid Build Coastguard Worker   RET_IF_WRAP_ERROR(progressWrap.Res, res, SZ_ERROR_PROGRESS)
336*f6dc9357SAndroid Build Coastguard Worker 
337*f6dc9357SAndroid Build Coastguard Worker 
338*f6dc9357SAndroid Build Coastguard Worker   #ifdef LOG_LZMA_THREADS
339*f6dc9357SAndroid Build Coastguard Worker 
340*f6dc9357SAndroid Build Coastguard Worker   NWindows::NTime::GetCurUtcFileTime(startTimeFT);
341*f6dc9357SAndroid Build Coastguard Worker   totalTime = GetTime64(startTimeFT) - totalTime;
342*f6dc9357SAndroid Build Coastguard Worker   HANDLE lz_threads[2];
343*f6dc9357SAndroid Build Coastguard Worker   LzmaEnc_GetLzThreads(_encoder, lz_threads);
344*f6dc9357SAndroid Build Coastguard Worker   printf("\n");
345*f6dc9357SAndroid Build Coastguard Worker   printf("Main: ");  PrintStat(GetCurrentThread(), totalTime, &oldStat);
346*f6dc9357SAndroid Build Coastguard Worker   printf("Hash: ");  PrintStat(lz_threads[0], totalTime, NULL);
347*f6dc9357SAndroid Build Coastguard Worker   printf("BinT: ");  PrintStat(lz_threads[1], totalTime, NULL);
348*f6dc9357SAndroid Build Coastguard Worker   // PrintTime("Total: ", totalTime, totalTime);
349*f6dc9357SAndroid Build Coastguard Worker   printf("\n");
350*f6dc9357SAndroid Build Coastguard Worker 
351*f6dc9357SAndroid Build Coastguard Worker   #endif
352*f6dc9357SAndroid Build Coastguard Worker 
353*f6dc9357SAndroid Build Coastguard Worker   return SResToHRESULT(res);
354*f6dc9357SAndroid Build Coastguard Worker }
355*f6dc9357SAndroid Build Coastguard Worker 
356*f6dc9357SAndroid Build Coastguard Worker }}
357