5 #include "../../../C/Alloc.h"
\r
7 #include "../Common/CWrappers.h"
\r
8 #include "../Common/StreamUtils.h"
\r
10 #include "Lzma2Encoder.h"
\r
12 namespace NCompress {
\r
16 HRESULT SetLzmaProp(PROPID propID, const PROPVARIANT &prop, CLzmaEncProps &ep);
\r
22 static void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); }
\r
23 static void SzBigFree(void *, void *address) { BigFree(address); }
\r
24 static ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
\r
26 static void *SzAlloc(void *, size_t size) { return MyAlloc(size); }
\r
27 static void SzFree(void *, void *address) { MyFree(address); }
\r
28 static ISzAlloc g_Alloc = { SzAlloc, SzFree };
\r
30 CEncoder::CEncoder()
\r
33 _encoder = Lzma2Enc_Create(&g_Alloc, &g_BigAlloc);
\r
38 CEncoder::~CEncoder()
\r
41 Lzma2Enc_Destroy(_encoder);
\r
44 HRESULT SetLzma2Prop(PROPID propID, const PROPVARIANT &prop, CLzma2EncProps &lzma2Props)
\r
48 case NCoderPropID::kBlockSize:
\r
49 if (prop.vt != VT_UI4) return E_INVALIDARG; lzma2Props.blockSize = prop.ulVal; break;
\r
50 case NCoderPropID::kNumThreads:
\r
51 if (prop.vt != VT_UI4) return E_INVALIDARG; lzma2Props.numTotalThreads = (int)(prop.ulVal); break;
\r
53 RINOK(NLzma::SetLzmaProp(propID, prop, lzma2Props.lzmaProps));
\r
58 STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs,
\r
59 const PROPVARIANT *coderProps, UInt32 numProps)
\r
61 CLzma2EncProps lzma2Props;
\r
62 Lzma2EncProps_Init(&lzma2Props);
\r
64 for (UInt32 i = 0; i < numProps; i++)
\r
66 RINOK(SetLzma2Prop(propIDs[i], coderProps[i], lzma2Props));
\r
68 return SResToHRESULT(Lzma2Enc_SetProps(_encoder, &lzma2Props));
\r
71 STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)
\r
73 Byte prop = Lzma2Enc_WriteProperties(_encoder);
\r
74 return WriteStream(outStream, &prop, 1);
\r
77 STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
\r
78 const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress)
\r
80 CSeqInStreamWrap inWrap(inStream);
\r
81 CSeqOutStreamWrap outWrap(outStream);
\r
82 CCompressProgressWrap progressWrap(progress);
\r
84 SRes res = Lzma2Enc_Encode(_encoder, &outWrap.p, &inWrap.p, progress ? &progressWrap.p : NULL);
\r
85 if (res == SZ_ERROR_READ && inWrap.Res != S_OK)
\r
87 if (res == SZ_ERROR_WRITE && outWrap.Res != S_OK)
\r
89 if (res == SZ_ERROR_PROGRESS && progressWrap.Res != S_OK)
\r
90 return progressWrap.Res;
\r
91 return SResToHRESULT(res);
\r