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