xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/Lzma2Encoder.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Lzma2Encoder.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 "Lzma2Encoder.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker namespace NCompress {
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker namespace NLzma {
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker HRESULT SetLzmaProp(PROPID propID, const PROPVARIANT &prop, CLzmaEncProps &ep);
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker }
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker namespace NLzma2 {
21*f6dc9357SAndroid Build Coastguard Worker 
CEncoder()22*f6dc9357SAndroid Build Coastguard Worker CEncoder::CEncoder()
23*f6dc9357SAndroid Build Coastguard Worker {
24*f6dc9357SAndroid Build Coastguard Worker   _encoder = NULL;
25*f6dc9357SAndroid Build Coastguard Worker   _encoder = Lzma2Enc_Create(&g_AlignedAlloc, &g_BigAlloc);
26*f6dc9357SAndroid Build Coastguard Worker   if (!_encoder)
27*f6dc9357SAndroid Build Coastguard Worker     throw 1;
28*f6dc9357SAndroid Build Coastguard Worker }
29*f6dc9357SAndroid Build Coastguard Worker 
~CEncoder()30*f6dc9357SAndroid Build Coastguard Worker CEncoder::~CEncoder()
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker   if (_encoder)
33*f6dc9357SAndroid Build Coastguard Worker     Lzma2Enc_Destroy(_encoder);
34*f6dc9357SAndroid Build Coastguard Worker }
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker HRESULT SetLzma2Prop(PROPID propID, const PROPVARIANT &prop, CLzma2EncProps &lzma2Props);
SetLzma2Prop(PROPID propID,const PROPVARIANT & prop,CLzma2EncProps & lzma2Props)38*f6dc9357SAndroid Build Coastguard Worker HRESULT SetLzma2Prop(PROPID propID, const PROPVARIANT &prop, CLzma2EncProps &lzma2Props)
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker   switch (propID)
41*f6dc9357SAndroid Build Coastguard Worker   {
42*f6dc9357SAndroid Build Coastguard Worker     case NCoderPropID::kBlockSize:
43*f6dc9357SAndroid Build Coastguard Worker     {
44*f6dc9357SAndroid Build Coastguard Worker       if (prop.vt == VT_UI4)
45*f6dc9357SAndroid Build Coastguard Worker         lzma2Props.blockSize = prop.ulVal;
46*f6dc9357SAndroid Build Coastguard Worker       else if (prop.vt == VT_UI8)
47*f6dc9357SAndroid Build Coastguard Worker         lzma2Props.blockSize = prop.uhVal.QuadPart;
48*f6dc9357SAndroid Build Coastguard Worker       else
49*f6dc9357SAndroid Build Coastguard Worker         return E_INVALIDARG;
50*f6dc9357SAndroid Build Coastguard Worker       break;
51*f6dc9357SAndroid Build Coastguard Worker     }
52*f6dc9357SAndroid Build Coastguard Worker     case NCoderPropID::kNumThreads:
53*f6dc9357SAndroid Build Coastguard Worker       if (prop.vt != VT_UI4)
54*f6dc9357SAndroid Build Coastguard Worker         return E_INVALIDARG;
55*f6dc9357SAndroid Build Coastguard Worker       lzma2Props.numTotalThreads = (int)(prop.ulVal);
56*f6dc9357SAndroid Build Coastguard Worker       break;
57*f6dc9357SAndroid Build Coastguard Worker     default:
58*f6dc9357SAndroid Build Coastguard Worker       RINOK(NLzma::SetLzmaProp(propID, prop, lzma2Props.lzmaProps))
59*f6dc9357SAndroid Build Coastguard Worker   }
60*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
61*f6dc9357SAndroid Build Coastguard Worker }
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CEncoder::SetCoderProperties (const PROPID * propIDs,const PROPVARIANT * coderProps,UInt32 numProps))64*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CEncoder::SetCoderProperties(const PROPID *propIDs,
65*f6dc9357SAndroid Build Coastguard Worker     const PROPVARIANT *coderProps, UInt32 numProps))
66*f6dc9357SAndroid Build Coastguard Worker {
67*f6dc9357SAndroid Build Coastguard Worker   CLzma2EncProps lzma2Props;
68*f6dc9357SAndroid Build Coastguard Worker   Lzma2EncProps_Init(&lzma2Props);
69*f6dc9357SAndroid Build Coastguard Worker 
70*f6dc9357SAndroid Build Coastguard Worker   for (UInt32 i = 0; i < numProps; i++)
71*f6dc9357SAndroid Build Coastguard Worker   {
72*f6dc9357SAndroid Build Coastguard Worker     RINOK(SetLzma2Prop(propIDs[i], coderProps[i], lzma2Props))
73*f6dc9357SAndroid Build Coastguard Worker   }
74*f6dc9357SAndroid Build Coastguard Worker   return SResToHRESULT(Lzma2Enc_SetProps(_encoder, &lzma2Props));
75*f6dc9357SAndroid Build Coastguard Worker }
76*f6dc9357SAndroid Build Coastguard Worker 
77*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CEncoder::SetCoderPropertiesOpt (const PROPID * propIDs,const PROPVARIANT * coderProps,UInt32 numProps))78*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CEncoder::SetCoderPropertiesOpt(const PROPID *propIDs,
79*f6dc9357SAndroid Build Coastguard Worker     const PROPVARIANT *coderProps, UInt32 numProps))
80*f6dc9357SAndroid Build Coastguard Worker {
81*f6dc9357SAndroid Build Coastguard Worker   for (UInt32 i = 0; i < numProps; i++)
82*f6dc9357SAndroid Build Coastguard Worker   {
83*f6dc9357SAndroid Build Coastguard Worker     const PROPVARIANT &prop = coderProps[i];
84*f6dc9357SAndroid Build Coastguard Worker     const PROPID propID = propIDs[i];
85*f6dc9357SAndroid Build Coastguard Worker     if (propID == NCoderPropID::kExpectedDataSize)
86*f6dc9357SAndroid Build Coastguard Worker       if (prop.vt == VT_UI8)
87*f6dc9357SAndroid Build Coastguard Worker         Lzma2Enc_SetDataSize(_encoder, prop.uhVal.QuadPart);
88*f6dc9357SAndroid Build Coastguard Worker   }
89*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
90*f6dc9357SAndroid Build Coastguard Worker }
91*f6dc9357SAndroid Build Coastguard Worker 
92*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CEncoder::WriteCoderProperties (ISequentialOutStream * outStream))93*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CEncoder::WriteCoderProperties(ISequentialOutStream *outStream))
94*f6dc9357SAndroid Build Coastguard Worker {
95*f6dc9357SAndroid Build Coastguard Worker   const Byte prop = Lzma2Enc_WriteProperties(_encoder);
96*f6dc9357SAndroid Build Coastguard Worker   return WriteStream(outStream, &prop, 1);
97*f6dc9357SAndroid Build Coastguard Worker }
98*f6dc9357SAndroid Build Coastguard Worker 
99*f6dc9357SAndroid Build Coastguard Worker 
100*f6dc9357SAndroid Build Coastguard Worker #define RET_IF_WRAP_ERROR(wrapRes, sRes, sResErrorCode) \
101*f6dc9357SAndroid Build Coastguard Worker   if (wrapRes != S_OK /* && (sRes == SZ_OK || sRes == sResErrorCode) */) return wrapRes;
102*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CEncoder::Code (ISequentialInStream * inStream,ISequentialOutStream * outStream,const UInt64 *,const UInt64 *,ICompressProgressInfo * progress))103*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
104*f6dc9357SAndroid Build Coastguard Worker     const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress))
105*f6dc9357SAndroid Build Coastguard Worker {
106*f6dc9357SAndroid Build Coastguard Worker   CSeqInStreamWrap inWrap;
107*f6dc9357SAndroid Build Coastguard Worker   CSeqOutStreamWrap outWrap;
108*f6dc9357SAndroid Build Coastguard Worker   CCompressProgressWrap progressWrap;
109*f6dc9357SAndroid Build Coastguard Worker 
110*f6dc9357SAndroid Build Coastguard Worker   inWrap.Init(inStream);
111*f6dc9357SAndroid Build Coastguard Worker   outWrap.Init(outStream);
112*f6dc9357SAndroid Build Coastguard Worker   progressWrap.Init(progress);
113*f6dc9357SAndroid Build Coastguard Worker 
114*f6dc9357SAndroid Build Coastguard Worker   SRes res = Lzma2Enc_Encode2(_encoder,
115*f6dc9357SAndroid Build Coastguard Worker       &outWrap.vt, NULL, NULL,
116*f6dc9357SAndroid Build Coastguard Worker       &inWrap.vt, NULL, 0,
117*f6dc9357SAndroid Build Coastguard Worker       progress ? &progressWrap.vt : NULL);
118*f6dc9357SAndroid Build Coastguard Worker 
119*f6dc9357SAndroid Build Coastguard Worker   RET_IF_WRAP_ERROR(inWrap.Res, res, SZ_ERROR_READ)
120*f6dc9357SAndroid Build Coastguard Worker   RET_IF_WRAP_ERROR(outWrap.Res, res, SZ_ERROR_WRITE)
121*f6dc9357SAndroid Build Coastguard Worker   RET_IF_WRAP_ERROR(progressWrap.Res, res, SZ_ERROR_PROGRESS)
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker   return SResToHRESULT(res);
124*f6dc9357SAndroid Build Coastguard Worker }
125*f6dc9357SAndroid Build Coastguard Worker 
126*f6dc9357SAndroid Build Coastguard Worker }}
127