1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// Lzma2Encoder.cpp 2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h" 4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../../../C/Alloc.h" 6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 7baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../Common/CWrappers.h" 8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../Common/StreamUtils.h" 9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "Lzma2Encoder.h" 11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 12baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NCompress { 13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 14baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NLzma { 15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 16baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT SetLzmaProp(PROPID propID, const PROPVARIANT &prop, CLzmaEncProps &ep); 17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 20baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NLzma2 { 21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 22baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic void *SzBigAlloc(void *, size_t size) { return BigAlloc(size); } 23baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic void SzBigFree(void *, void *address) { BigFree(address); } 24baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree }; 25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 26baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic void *SzAlloc(void *, size_t size) { return MyAlloc(size); } 27baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic void SzFree(void *, void *address) { MyFree(address); } 28baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic ISzAlloc g_Alloc = { SzAlloc, SzFree }; 29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 30baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCEncoder::CEncoder() 31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _encoder = 0; 33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync _encoder = Lzma2Enc_Create(&g_Alloc, &g_BigAlloc); 34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_encoder == 0) 35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync throw 1; 36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 38baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCEncoder::~CEncoder() 39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (_encoder != 0) 41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync Lzma2Enc_Destroy(_encoder); 42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 44baa3858d3f5d128a5c8466b700098109edcad5f2repo syncHRESULT SetLzma2Prop(PROPID propID, const PROPVARIANT &prop, CLzma2EncProps &lzma2Props) 45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync switch (propID) 47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 48baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case NCoderPropID::kBlockSize: 49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (prop.vt != VT_UI4) return E_INVALIDARG; lzma2Props.blockSize = prop.ulVal; break; 50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case NCoderPropID::kNumThreads: 51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (prop.vt != VT_UI4) return E_INVALIDARG; lzma2Props.numTotalThreads = (int)(prop.ulVal); break; 52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync default: 53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync RINOK(NLzma::SetLzmaProp(propID, prop, lzma2Props.lzmaProps)); 54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 58baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, 59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync const PROPVARIANT *coderProps, UInt32 numProps) 60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CLzma2EncProps lzma2Props; 62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync Lzma2EncProps_Init(&lzma2Props); 63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (UInt32 i = 0; i < numProps; i++) 65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 66baa3858d3f5d128a5c8466b700098109edcad5f2repo sync RINOK(SetLzma2Prop(propIDs[i], coderProps[i], lzma2Props)); 67baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return SResToHRESULT(Lzma2Enc_SetProps(_encoder, &lzma2Props)); 69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 71baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) 72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync Byte prop = Lzma2Enc_WriteProperties(_encoder); 74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return WriteStream(outStream, &prop, 1); 75baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 77baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, 78baa3858d3f5d128a5c8466b700098109edcad5f2repo sync const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress) 79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CSeqInStreamWrap inWrap(inStream); 81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CSeqOutStreamWrap outWrap(outStream); 82baa3858d3f5d128a5c8466b700098109edcad5f2repo sync CCompressProgressWrap progressWrap(progress); 83baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 84baa3858d3f5d128a5c8466b700098109edcad5f2repo sync SRes res = Lzma2Enc_Encode(_encoder, &outWrap.p, &inWrap.p, progress ? &progressWrap.p : NULL); 85baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (res == SZ_ERROR_READ && inWrap.Res != S_OK) 86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return inWrap.Res; 87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (res == SZ_ERROR_WRITE && outWrap.Res != S_OK) 88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return outWrap.Res; 89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (res == SZ_ERROR_PROGRESS && progressWrap.Res != S_OK) 90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return progressWrap.Res; 91baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return SResToHRESULT(res); 92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 94baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}} 95