xref: /aosp_15_r20/external/lzma/CPP/7zip/Common/CreateCoder.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // CreateCoder.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 "../../Windows/Defs.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../Windows/PropVariant.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "CreateCoder.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "FilterCoder.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "RegisterCodec.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker static const unsigned kNumCodecsMax = 64;
14*f6dc9357SAndroid Build Coastguard Worker extern
15*f6dc9357SAndroid Build Coastguard Worker unsigned g_NumCodecs;
16*f6dc9357SAndroid Build Coastguard Worker unsigned g_NumCodecs = 0;
17*f6dc9357SAndroid Build Coastguard Worker extern
18*f6dc9357SAndroid Build Coastguard Worker const CCodecInfo *g_Codecs[];
19*f6dc9357SAndroid Build Coastguard Worker const CCodecInfo *g_Codecs[kNumCodecsMax];
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker // We use g_ExternalCodecs in other stages.
22*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
23*f6dc9357SAndroid Build Coastguard Worker /*
24*f6dc9357SAndroid Build Coastguard Worker extern CExternalCodecs g_ExternalCodecs;
25*f6dc9357SAndroid Build Coastguard Worker #define CHECK_GLOBAL_CODECS \
26*f6dc9357SAndroid Build Coastguard Worker     if (!_externalCodecs || !_externalCodecs->IsSet()) _externalCodecs = &g_ExternalCodecs;
27*f6dc9357SAndroid Build Coastguard Worker */
28*f6dc9357SAndroid Build Coastguard Worker #define CHECK_GLOBAL_CODECS
29*f6dc9357SAndroid Build Coastguard Worker #endif
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker 
RegisterCodec(const CCodecInfo * codecInfo)32*f6dc9357SAndroid Build Coastguard Worker void RegisterCodec(const CCodecInfo *codecInfo) throw()
33*f6dc9357SAndroid Build Coastguard Worker {
34*f6dc9357SAndroid Build Coastguard Worker   if (g_NumCodecs < kNumCodecsMax)
35*f6dc9357SAndroid Build Coastguard Worker     g_Codecs[g_NumCodecs++] = codecInfo;
36*f6dc9357SAndroid Build Coastguard Worker }
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker static const unsigned kNumHashersMax = 32;
39*f6dc9357SAndroid Build Coastguard Worker extern
40*f6dc9357SAndroid Build Coastguard Worker unsigned g_NumHashers;
41*f6dc9357SAndroid Build Coastguard Worker unsigned g_NumHashers = 0;
42*f6dc9357SAndroid Build Coastguard Worker extern
43*f6dc9357SAndroid Build Coastguard Worker const CHasherInfo *g_Hashers[];
44*f6dc9357SAndroid Build Coastguard Worker const CHasherInfo *g_Hashers[kNumHashersMax];
45*f6dc9357SAndroid Build Coastguard Worker 
RegisterHasher(const CHasherInfo * hashInfo)46*f6dc9357SAndroid Build Coastguard Worker void RegisterHasher(const CHasherInfo *hashInfo) throw()
47*f6dc9357SAndroid Build Coastguard Worker {
48*f6dc9357SAndroid Build Coastguard Worker   if (g_NumHashers < kNumHashersMax)
49*f6dc9357SAndroid Build Coastguard Worker     g_Hashers[g_NumHashers++] = hashInfo;
50*f6dc9357SAndroid Build Coastguard Worker }
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker 
53*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
54*f6dc9357SAndroid Build Coastguard Worker 
ReadNumberOfStreams(ICompressCodecsInfo * codecsInfo,UInt32 index,PROPID propID,UInt32 & res)55*f6dc9357SAndroid Build Coastguard Worker static HRESULT ReadNumberOfStreams(ICompressCodecsInfo *codecsInfo, UInt32 index, PROPID propID, UInt32 &res)
56*f6dc9357SAndroid Build Coastguard Worker {
57*f6dc9357SAndroid Build Coastguard Worker   NWindows::NCOM::CPropVariant prop;
58*f6dc9357SAndroid Build Coastguard Worker   RINOK(codecsInfo->GetProperty(index, propID, &prop))
59*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt == VT_EMPTY)
60*f6dc9357SAndroid Build Coastguard Worker     res = 1;
61*f6dc9357SAndroid Build Coastguard Worker   else if (prop.vt == VT_UI4)
62*f6dc9357SAndroid Build Coastguard Worker     res = prop.ulVal;
63*f6dc9357SAndroid Build Coastguard Worker   else
64*f6dc9357SAndroid Build Coastguard Worker     return E_INVALIDARG;
65*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
66*f6dc9357SAndroid Build Coastguard Worker }
67*f6dc9357SAndroid Build Coastguard Worker 
ReadIsAssignedProp(ICompressCodecsInfo * codecsInfo,UInt32 index,PROPID propID,bool & res)68*f6dc9357SAndroid Build Coastguard Worker static HRESULT ReadIsAssignedProp(ICompressCodecsInfo *codecsInfo, UInt32 index, PROPID propID, bool &res)
69*f6dc9357SAndroid Build Coastguard Worker {
70*f6dc9357SAndroid Build Coastguard Worker   NWindows::NCOM::CPropVariant prop;
71*f6dc9357SAndroid Build Coastguard Worker   RINOK(codecsInfo->GetProperty(index, propID, &prop))
72*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt == VT_EMPTY)
73*f6dc9357SAndroid Build Coastguard Worker     res = true;
74*f6dc9357SAndroid Build Coastguard Worker   else if (prop.vt == VT_BOOL)
75*f6dc9357SAndroid Build Coastguard Worker     res = VARIANT_BOOLToBool(prop.boolVal);
76*f6dc9357SAndroid Build Coastguard Worker   else
77*f6dc9357SAndroid Build Coastguard Worker     return E_INVALIDARG;
78*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
79*f6dc9357SAndroid Build Coastguard Worker }
80*f6dc9357SAndroid Build Coastguard Worker 
Load()81*f6dc9357SAndroid Build Coastguard Worker HRESULT CExternalCodecs::Load()
82*f6dc9357SAndroid Build Coastguard Worker {
83*f6dc9357SAndroid Build Coastguard Worker   Codecs.Clear();
84*f6dc9357SAndroid Build Coastguard Worker   Hashers.Clear();
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker   if (GetCodecs)
87*f6dc9357SAndroid Build Coastguard Worker   {
88*f6dc9357SAndroid Build Coastguard Worker     CCodecInfoEx info;
89*f6dc9357SAndroid Build Coastguard Worker 
90*f6dc9357SAndroid Build Coastguard Worker     UString s;
91*f6dc9357SAndroid Build Coastguard Worker     UInt32 num;
92*f6dc9357SAndroid Build Coastguard Worker     RINOK(GetCodecs->GetNumMethods(&num))
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker     for (UInt32 i = 0; i < num; i++)
95*f6dc9357SAndroid Build Coastguard Worker     {
96*f6dc9357SAndroid Build Coastguard Worker       NWindows::NCOM::CPropVariant prop;
97*f6dc9357SAndroid Build Coastguard Worker 
98*f6dc9357SAndroid Build Coastguard Worker       RINOK(GetCodecs->GetProperty(i, NMethodPropID::kID, &prop))
99*f6dc9357SAndroid Build Coastguard Worker       if (prop.vt != VT_UI8)
100*f6dc9357SAndroid Build Coastguard Worker         continue; // old Interface
101*f6dc9357SAndroid Build Coastguard Worker       info.Id = prop.uhVal.QuadPart;
102*f6dc9357SAndroid Build Coastguard Worker 
103*f6dc9357SAndroid Build Coastguard Worker       prop.Clear();
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker       info.Name.Empty();
106*f6dc9357SAndroid Build Coastguard Worker       RINOK(GetCodecs->GetProperty(i, NMethodPropID::kName, &prop))
107*f6dc9357SAndroid Build Coastguard Worker       if (prop.vt == VT_BSTR)
108*f6dc9357SAndroid Build Coastguard Worker         info.Name.SetFromWStr_if_Ascii(prop.bstrVal);
109*f6dc9357SAndroid Build Coastguard Worker       else if (prop.vt != VT_EMPTY)
110*f6dc9357SAndroid Build Coastguard Worker         continue;
111*f6dc9357SAndroid Build Coastguard Worker 
112*f6dc9357SAndroid Build Coastguard Worker       RINOK(ReadNumberOfStreams(GetCodecs, i, NMethodPropID::kPackStreams, info.NumStreams))
113*f6dc9357SAndroid Build Coastguard Worker       {
114*f6dc9357SAndroid Build Coastguard Worker         UInt32 numUnpackStreams = 1;
115*f6dc9357SAndroid Build Coastguard Worker         RINOK(ReadNumberOfStreams(GetCodecs, i, NMethodPropID::kUnpackStreams, numUnpackStreams))
116*f6dc9357SAndroid Build Coastguard Worker         if (numUnpackStreams != 1)
117*f6dc9357SAndroid Build Coastguard Worker           continue;
118*f6dc9357SAndroid Build Coastguard Worker       }
119*f6dc9357SAndroid Build Coastguard Worker       RINOK(ReadIsAssignedProp(GetCodecs, i, NMethodPropID::kEncoderIsAssigned, info.EncoderIsAssigned))
120*f6dc9357SAndroid Build Coastguard Worker       RINOK(ReadIsAssignedProp(GetCodecs, i, NMethodPropID::kDecoderIsAssigned, info.DecoderIsAssigned))
121*f6dc9357SAndroid Build Coastguard Worker       RINOK(ReadIsAssignedProp(GetCodecs, i, NMethodPropID::kIsFilter, info.IsFilter))
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker       Codecs.Add(info);
124*f6dc9357SAndroid Build Coastguard Worker     }
125*f6dc9357SAndroid Build Coastguard Worker   }
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker   if (GetHashers)
128*f6dc9357SAndroid Build Coastguard Worker   {
129*f6dc9357SAndroid Build Coastguard Worker     UInt32 num = GetHashers->GetNumHashers();
130*f6dc9357SAndroid Build Coastguard Worker     CHasherInfoEx info;
131*f6dc9357SAndroid Build Coastguard Worker 
132*f6dc9357SAndroid Build Coastguard Worker     for (UInt32 i = 0; i < num; i++)
133*f6dc9357SAndroid Build Coastguard Worker     {
134*f6dc9357SAndroid Build Coastguard Worker       NWindows::NCOM::CPropVariant prop;
135*f6dc9357SAndroid Build Coastguard Worker 
136*f6dc9357SAndroid Build Coastguard Worker       RINOK(GetHashers->GetHasherProp(i, NMethodPropID::kID, &prop))
137*f6dc9357SAndroid Build Coastguard Worker       if (prop.vt != VT_UI8)
138*f6dc9357SAndroid Build Coastguard Worker         continue;
139*f6dc9357SAndroid Build Coastguard Worker       info.Id = prop.uhVal.QuadPart;
140*f6dc9357SAndroid Build Coastguard Worker 
141*f6dc9357SAndroid Build Coastguard Worker       prop.Clear();
142*f6dc9357SAndroid Build Coastguard Worker 
143*f6dc9357SAndroid Build Coastguard Worker       info.Name.Empty();
144*f6dc9357SAndroid Build Coastguard Worker       RINOK(GetHashers->GetHasherProp(i, NMethodPropID::kName, &prop))
145*f6dc9357SAndroid Build Coastguard Worker       if (prop.vt == VT_BSTR)
146*f6dc9357SAndroid Build Coastguard Worker         info.Name.SetFromWStr_if_Ascii(prop.bstrVal);
147*f6dc9357SAndroid Build Coastguard Worker       else if (prop.vt != VT_EMPTY)
148*f6dc9357SAndroid Build Coastguard Worker         continue;
149*f6dc9357SAndroid Build Coastguard Worker 
150*f6dc9357SAndroid Build Coastguard Worker       Hashers.Add(info);
151*f6dc9357SAndroid Build Coastguard Worker     }
152*f6dc9357SAndroid Build Coastguard Worker   }
153*f6dc9357SAndroid Build Coastguard Worker 
154*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
155*f6dc9357SAndroid Build Coastguard Worker }
156*f6dc9357SAndroid Build Coastguard Worker 
157*f6dc9357SAndroid Build Coastguard Worker #endif
158*f6dc9357SAndroid Build Coastguard Worker 
159*f6dc9357SAndroid Build Coastguard Worker 
FindMethod_Index(DECL_EXTERNAL_CODECS_LOC_VARS const AString & name,bool encode,CMethodId & methodId,UInt32 & numStreams,bool & isFilter)160*f6dc9357SAndroid Build Coastguard Worker int FindMethod_Index(
161*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
162*f6dc9357SAndroid Build Coastguard Worker     const AString &name,
163*f6dc9357SAndroid Build Coastguard Worker     bool encode,
164*f6dc9357SAndroid Build Coastguard Worker     CMethodId &methodId,
165*f6dc9357SAndroid Build Coastguard Worker     UInt32 &numStreams,
166*f6dc9357SAndroid Build Coastguard Worker     bool &isFilter)
167*f6dc9357SAndroid Build Coastguard Worker {
168*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
169*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < g_NumCodecs; i++)
170*f6dc9357SAndroid Build Coastguard Worker   {
171*f6dc9357SAndroid Build Coastguard Worker     const CCodecInfo &codec = *g_Codecs[i];
172*f6dc9357SAndroid Build Coastguard Worker     if ((encode ? codec.CreateEncoder : codec.CreateDecoder)
173*f6dc9357SAndroid Build Coastguard Worker         && StringsAreEqualNoCase_Ascii(name, codec.Name))
174*f6dc9357SAndroid Build Coastguard Worker     {
175*f6dc9357SAndroid Build Coastguard Worker       methodId = codec.Id;
176*f6dc9357SAndroid Build Coastguard Worker       numStreams = codec.NumStreams;
177*f6dc9357SAndroid Build Coastguard Worker       isFilter = codec.IsFilter;
178*f6dc9357SAndroid Build Coastguard Worker       return (int)i;
179*f6dc9357SAndroid Build Coastguard Worker     }
180*f6dc9357SAndroid Build Coastguard Worker   }
181*f6dc9357SAndroid Build Coastguard Worker 
182*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
183*f6dc9357SAndroid Build Coastguard Worker 
184*f6dc9357SAndroid Build Coastguard Worker   CHECK_GLOBAL_CODECS
185*f6dc9357SAndroid Build Coastguard Worker 
186*f6dc9357SAndroid Build Coastguard Worker   if (_externalCodecs)
187*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < _externalCodecs->Codecs.Size(); i++)
188*f6dc9357SAndroid Build Coastguard Worker     {
189*f6dc9357SAndroid Build Coastguard Worker       const CCodecInfoEx &codec = _externalCodecs->Codecs[i];
190*f6dc9357SAndroid Build Coastguard Worker       if ((encode ? codec.EncoderIsAssigned : codec.DecoderIsAssigned)
191*f6dc9357SAndroid Build Coastguard Worker           && StringsAreEqualNoCase_Ascii(name, codec.Name))
192*f6dc9357SAndroid Build Coastguard Worker       {
193*f6dc9357SAndroid Build Coastguard Worker         methodId = codec.Id;
194*f6dc9357SAndroid Build Coastguard Worker         numStreams = codec.NumStreams;
195*f6dc9357SAndroid Build Coastguard Worker         isFilter = codec.IsFilter;
196*f6dc9357SAndroid Build Coastguard Worker         return (int)(g_NumCodecs + i);
197*f6dc9357SAndroid Build Coastguard Worker       }
198*f6dc9357SAndroid Build Coastguard Worker     }
199*f6dc9357SAndroid Build Coastguard Worker 
200*f6dc9357SAndroid Build Coastguard Worker   #endif
201*f6dc9357SAndroid Build Coastguard Worker 
202*f6dc9357SAndroid Build Coastguard Worker   return -1;
203*f6dc9357SAndroid Build Coastguard Worker }
204*f6dc9357SAndroid Build Coastguard Worker 
205*f6dc9357SAndroid Build Coastguard Worker 
FindMethod_Index(DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId,bool encode)206*f6dc9357SAndroid Build Coastguard Worker static int FindMethod_Index(
207*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
208*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId, bool encode)
209*f6dc9357SAndroid Build Coastguard Worker {
210*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
211*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < g_NumCodecs; i++)
212*f6dc9357SAndroid Build Coastguard Worker   {
213*f6dc9357SAndroid Build Coastguard Worker     const CCodecInfo &codec = *g_Codecs[i];
214*f6dc9357SAndroid Build Coastguard Worker     if (codec.Id == methodId && (encode ? codec.CreateEncoder : codec.CreateDecoder))
215*f6dc9357SAndroid Build Coastguard Worker       return (int)i;
216*f6dc9357SAndroid Build Coastguard Worker   }
217*f6dc9357SAndroid Build Coastguard Worker 
218*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
219*f6dc9357SAndroid Build Coastguard Worker 
220*f6dc9357SAndroid Build Coastguard Worker   CHECK_GLOBAL_CODECS
221*f6dc9357SAndroid Build Coastguard Worker 
222*f6dc9357SAndroid Build Coastguard Worker   if (_externalCodecs)
223*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < _externalCodecs->Codecs.Size(); i++)
224*f6dc9357SAndroid Build Coastguard Worker     {
225*f6dc9357SAndroid Build Coastguard Worker       const CCodecInfoEx &codec = _externalCodecs->Codecs[i];
226*f6dc9357SAndroid Build Coastguard Worker       if (codec.Id == methodId && (encode ? codec.EncoderIsAssigned : codec.DecoderIsAssigned))
227*f6dc9357SAndroid Build Coastguard Worker         return (int)(g_NumCodecs + i);
228*f6dc9357SAndroid Build Coastguard Worker     }
229*f6dc9357SAndroid Build Coastguard Worker 
230*f6dc9357SAndroid Build Coastguard Worker   #endif
231*f6dc9357SAndroid Build Coastguard Worker 
232*f6dc9357SAndroid Build Coastguard Worker   return -1;
233*f6dc9357SAndroid Build Coastguard Worker }
234*f6dc9357SAndroid Build Coastguard Worker 
235*f6dc9357SAndroid Build Coastguard Worker 
FindMethod(DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId,AString & name)236*f6dc9357SAndroid Build Coastguard Worker bool FindMethod(
237*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
238*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId,
239*f6dc9357SAndroid Build Coastguard Worker     AString &name)
240*f6dc9357SAndroid Build Coastguard Worker {
241*f6dc9357SAndroid Build Coastguard Worker   name.Empty();
242*f6dc9357SAndroid Build Coastguard Worker 
243*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
244*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < g_NumCodecs; i++)
245*f6dc9357SAndroid Build Coastguard Worker   {
246*f6dc9357SAndroid Build Coastguard Worker     const CCodecInfo &codec = *g_Codecs[i];
247*f6dc9357SAndroid Build Coastguard Worker     if (methodId == codec.Id)
248*f6dc9357SAndroid Build Coastguard Worker     {
249*f6dc9357SAndroid Build Coastguard Worker       name = codec.Name;
250*f6dc9357SAndroid Build Coastguard Worker       return true;
251*f6dc9357SAndroid Build Coastguard Worker     }
252*f6dc9357SAndroid Build Coastguard Worker   }
253*f6dc9357SAndroid Build Coastguard Worker 
254*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
255*f6dc9357SAndroid Build Coastguard Worker 
256*f6dc9357SAndroid Build Coastguard Worker   CHECK_GLOBAL_CODECS
257*f6dc9357SAndroid Build Coastguard Worker 
258*f6dc9357SAndroid Build Coastguard Worker   if (_externalCodecs)
259*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < _externalCodecs->Codecs.Size(); i++)
260*f6dc9357SAndroid Build Coastguard Worker     {
261*f6dc9357SAndroid Build Coastguard Worker       const CCodecInfoEx &codec = _externalCodecs->Codecs[i];
262*f6dc9357SAndroid Build Coastguard Worker       if (methodId == codec.Id)
263*f6dc9357SAndroid Build Coastguard Worker       {
264*f6dc9357SAndroid Build Coastguard Worker         name = codec.Name;
265*f6dc9357SAndroid Build Coastguard Worker         return true;
266*f6dc9357SAndroid Build Coastguard Worker       }
267*f6dc9357SAndroid Build Coastguard Worker     }
268*f6dc9357SAndroid Build Coastguard Worker 
269*f6dc9357SAndroid Build Coastguard Worker   #endif
270*f6dc9357SAndroid Build Coastguard Worker 
271*f6dc9357SAndroid Build Coastguard Worker   return false;
272*f6dc9357SAndroid Build Coastguard Worker }
273*f6dc9357SAndroid Build Coastguard Worker 
FindHashMethod(DECL_EXTERNAL_CODECS_LOC_VARS const AString & name,CMethodId & methodId)274*f6dc9357SAndroid Build Coastguard Worker bool FindHashMethod(
275*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
276*f6dc9357SAndroid Build Coastguard Worker     const AString &name,
277*f6dc9357SAndroid Build Coastguard Worker     CMethodId &methodId)
278*f6dc9357SAndroid Build Coastguard Worker {
279*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
280*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < g_NumHashers; i++)
281*f6dc9357SAndroid Build Coastguard Worker   {
282*f6dc9357SAndroid Build Coastguard Worker     const CHasherInfo &codec = *g_Hashers[i];
283*f6dc9357SAndroid Build Coastguard Worker     if (StringsAreEqualNoCase_Ascii(name, codec.Name))
284*f6dc9357SAndroid Build Coastguard Worker     {
285*f6dc9357SAndroid Build Coastguard Worker       methodId = codec.Id;
286*f6dc9357SAndroid Build Coastguard Worker       return true;
287*f6dc9357SAndroid Build Coastguard Worker     }
288*f6dc9357SAndroid Build Coastguard Worker   }
289*f6dc9357SAndroid Build Coastguard Worker 
290*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
291*f6dc9357SAndroid Build Coastguard Worker 
292*f6dc9357SAndroid Build Coastguard Worker   CHECK_GLOBAL_CODECS
293*f6dc9357SAndroid Build Coastguard Worker 
294*f6dc9357SAndroid Build Coastguard Worker   if (_externalCodecs)
295*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < _externalCodecs->Hashers.Size(); i++)
296*f6dc9357SAndroid Build Coastguard Worker     {
297*f6dc9357SAndroid Build Coastguard Worker       const CHasherInfoEx &codec = _externalCodecs->Hashers[i];
298*f6dc9357SAndroid Build Coastguard Worker       if (StringsAreEqualNoCase_Ascii(name, codec.Name))
299*f6dc9357SAndroid Build Coastguard Worker       {
300*f6dc9357SAndroid Build Coastguard Worker         methodId = codec.Id;
301*f6dc9357SAndroid Build Coastguard Worker         return true;
302*f6dc9357SAndroid Build Coastguard Worker       }
303*f6dc9357SAndroid Build Coastguard Worker     }
304*f6dc9357SAndroid Build Coastguard Worker 
305*f6dc9357SAndroid Build Coastguard Worker   #endif
306*f6dc9357SAndroid Build Coastguard Worker 
307*f6dc9357SAndroid Build Coastguard Worker   return false;
308*f6dc9357SAndroid Build Coastguard Worker }
309*f6dc9357SAndroid Build Coastguard Worker 
GetHashMethods(DECL_EXTERNAL_CODECS_LOC_VARS CRecordVector<CMethodId> & methods)310*f6dc9357SAndroid Build Coastguard Worker void GetHashMethods(
311*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
312*f6dc9357SAndroid Build Coastguard Worker     CRecordVector<CMethodId> &methods)
313*f6dc9357SAndroid Build Coastguard Worker {
314*f6dc9357SAndroid Build Coastguard Worker   methods.ClearAndSetSize(g_NumHashers);
315*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
316*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < g_NumHashers; i++)
317*f6dc9357SAndroid Build Coastguard Worker     methods[i] = (*g_Hashers[i]).Id;
318*f6dc9357SAndroid Build Coastguard Worker 
319*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
320*f6dc9357SAndroid Build Coastguard Worker 
321*f6dc9357SAndroid Build Coastguard Worker   CHECK_GLOBAL_CODECS
322*f6dc9357SAndroid Build Coastguard Worker 
323*f6dc9357SAndroid Build Coastguard Worker   if (_externalCodecs)
324*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < _externalCodecs->Hashers.Size(); i++)
325*f6dc9357SAndroid Build Coastguard Worker       methods.Add(_externalCodecs->Hashers[i].Id);
326*f6dc9357SAndroid Build Coastguard Worker 
327*f6dc9357SAndroid Build Coastguard Worker   #endif
328*f6dc9357SAndroid Build Coastguard Worker }
329*f6dc9357SAndroid Build Coastguard Worker 
330*f6dc9357SAndroid Build Coastguard Worker 
331*f6dc9357SAndroid Build Coastguard Worker 
CreateCoder_Index(DECL_EXTERNAL_CODECS_LOC_VARS unsigned i,bool encode,CMyComPtr<ICompressFilter> & filter,CCreatedCoder & cod)332*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Index(
333*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
334*f6dc9357SAndroid Build Coastguard Worker     unsigned i, bool encode,
335*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<ICompressFilter> &filter,
336*f6dc9357SAndroid Build Coastguard Worker     CCreatedCoder &cod)
337*f6dc9357SAndroid Build Coastguard Worker {
338*f6dc9357SAndroid Build Coastguard Worker   cod.IsExternal = false;
339*f6dc9357SAndroid Build Coastguard Worker   cod.IsFilter = false;
340*f6dc9357SAndroid Build Coastguard Worker   cod.NumStreams = 1;
341*f6dc9357SAndroid Build Coastguard Worker 
342*f6dc9357SAndroid Build Coastguard Worker   if (i < g_NumCodecs)
343*f6dc9357SAndroid Build Coastguard Worker   {
344*f6dc9357SAndroid Build Coastguard Worker     const CCodecInfo &codec = *g_Codecs[i];
345*f6dc9357SAndroid Build Coastguard Worker     // if (codec.Id == methodId)
346*f6dc9357SAndroid Build Coastguard Worker     {
347*f6dc9357SAndroid Build Coastguard Worker       if (encode)
348*f6dc9357SAndroid Build Coastguard Worker       {
349*f6dc9357SAndroid Build Coastguard Worker         if (codec.CreateEncoder)
350*f6dc9357SAndroid Build Coastguard Worker         {
351*f6dc9357SAndroid Build Coastguard Worker           void *p = codec.CreateEncoder();
352*f6dc9357SAndroid Build Coastguard Worker           if (codec.IsFilter) filter = (ICompressFilter *)p;
353*f6dc9357SAndroid Build Coastguard Worker           else if (codec.NumStreams == 1) cod.Coder = (ICompressCoder *)p;
354*f6dc9357SAndroid Build Coastguard Worker           else { cod.Coder2 = (ICompressCoder2 *)p; cod.NumStreams = codec.NumStreams; }
355*f6dc9357SAndroid Build Coastguard Worker           return S_OK;
356*f6dc9357SAndroid Build Coastguard Worker         }
357*f6dc9357SAndroid Build Coastguard Worker       }
358*f6dc9357SAndroid Build Coastguard Worker       else
359*f6dc9357SAndroid Build Coastguard Worker         if (codec.CreateDecoder)
360*f6dc9357SAndroid Build Coastguard Worker         {
361*f6dc9357SAndroid Build Coastguard Worker           void *p = codec.CreateDecoder();
362*f6dc9357SAndroid Build Coastguard Worker           if (codec.IsFilter) filter = (ICompressFilter *)p;
363*f6dc9357SAndroid Build Coastguard Worker           else if (codec.NumStreams == 1) cod.Coder = (ICompressCoder *)p;
364*f6dc9357SAndroid Build Coastguard Worker           else { cod.Coder2 = (ICompressCoder2 *)p; cod.NumStreams = codec.NumStreams; }
365*f6dc9357SAndroid Build Coastguard Worker           return S_OK;
366*f6dc9357SAndroid Build Coastguard Worker         }
367*f6dc9357SAndroid Build Coastguard Worker     }
368*f6dc9357SAndroid Build Coastguard Worker   }
369*f6dc9357SAndroid Build Coastguard Worker 
370*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
371*f6dc9357SAndroid Build Coastguard Worker 
372*f6dc9357SAndroid Build Coastguard Worker   CHECK_GLOBAL_CODECS
373*f6dc9357SAndroid Build Coastguard Worker 
374*f6dc9357SAndroid Build Coastguard Worker   if (_externalCodecs)
375*f6dc9357SAndroid Build Coastguard Worker   {
376*f6dc9357SAndroid Build Coastguard Worker     i -= g_NumCodecs;
377*f6dc9357SAndroid Build Coastguard Worker     cod.IsExternal = true;
378*f6dc9357SAndroid Build Coastguard Worker     if (i < _externalCodecs->Codecs.Size())
379*f6dc9357SAndroid Build Coastguard Worker     {
380*f6dc9357SAndroid Build Coastguard Worker       const CCodecInfoEx &codec = _externalCodecs->Codecs[i];
381*f6dc9357SAndroid Build Coastguard Worker       // if (codec.Id == methodId)
382*f6dc9357SAndroid Build Coastguard Worker       {
383*f6dc9357SAndroid Build Coastguard Worker         if (encode)
384*f6dc9357SAndroid Build Coastguard Worker         {
385*f6dc9357SAndroid Build Coastguard Worker           if (codec.EncoderIsAssigned)
386*f6dc9357SAndroid Build Coastguard Worker           {
387*f6dc9357SAndroid Build Coastguard Worker             if (codec.NumStreams == 1)
388*f6dc9357SAndroid Build Coastguard Worker             {
389*f6dc9357SAndroid Build Coastguard Worker               const HRESULT res = _externalCodecs->GetCodecs->CreateEncoder(i, &IID_ICompressCoder, (void **)&cod.Coder);
390*f6dc9357SAndroid Build Coastguard Worker               if (res != S_OK && res != E_NOINTERFACE && res != CLASS_E_CLASSNOTAVAILABLE)
391*f6dc9357SAndroid Build Coastguard Worker                 return res;
392*f6dc9357SAndroid Build Coastguard Worker               if (cod.Coder)
393*f6dc9357SAndroid Build Coastguard Worker                 return res;
394*f6dc9357SAndroid Build Coastguard Worker               return _externalCodecs->GetCodecs->CreateEncoder(i, &IID_ICompressFilter, (void **)&filter);
395*f6dc9357SAndroid Build Coastguard Worker             }
396*f6dc9357SAndroid Build Coastguard Worker             cod.NumStreams = codec.NumStreams;
397*f6dc9357SAndroid Build Coastguard Worker             return _externalCodecs->GetCodecs->CreateEncoder(i, &IID_ICompressCoder2, (void **)&cod.Coder2);
398*f6dc9357SAndroid Build Coastguard Worker           }
399*f6dc9357SAndroid Build Coastguard Worker         }
400*f6dc9357SAndroid Build Coastguard Worker         else
401*f6dc9357SAndroid Build Coastguard Worker           if (codec.DecoderIsAssigned)
402*f6dc9357SAndroid Build Coastguard Worker           {
403*f6dc9357SAndroid Build Coastguard Worker             if (codec.NumStreams == 1)
404*f6dc9357SAndroid Build Coastguard Worker             {
405*f6dc9357SAndroid Build Coastguard Worker               const HRESULT res = _externalCodecs->GetCodecs->CreateDecoder(i, &IID_ICompressCoder, (void **)&cod.Coder);
406*f6dc9357SAndroid Build Coastguard Worker               if (res != S_OK && res != E_NOINTERFACE && res != CLASS_E_CLASSNOTAVAILABLE)
407*f6dc9357SAndroid Build Coastguard Worker                 return res;
408*f6dc9357SAndroid Build Coastguard Worker               if (cod.Coder)
409*f6dc9357SAndroid Build Coastguard Worker                 return res;
410*f6dc9357SAndroid Build Coastguard Worker               return _externalCodecs->GetCodecs->CreateDecoder(i, &IID_ICompressFilter, (void **)&filter);
411*f6dc9357SAndroid Build Coastguard Worker             }
412*f6dc9357SAndroid Build Coastguard Worker             cod.NumStreams = codec.NumStreams;
413*f6dc9357SAndroid Build Coastguard Worker             return _externalCodecs->GetCodecs->CreateDecoder(i, &IID_ICompressCoder2, (void **)&cod.Coder2);
414*f6dc9357SAndroid Build Coastguard Worker           }
415*f6dc9357SAndroid Build Coastguard Worker       }
416*f6dc9357SAndroid Build Coastguard Worker     }
417*f6dc9357SAndroid Build Coastguard Worker   }
418*f6dc9357SAndroid Build Coastguard Worker   #endif
419*f6dc9357SAndroid Build Coastguard Worker 
420*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
421*f6dc9357SAndroid Build Coastguard Worker }
422*f6dc9357SAndroid Build Coastguard Worker 
423*f6dc9357SAndroid Build Coastguard Worker 
CreateCoder_Index(DECL_EXTERNAL_CODECS_LOC_VARS unsigned index,bool encode,CCreatedCoder & cod)424*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Index(
425*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
426*f6dc9357SAndroid Build Coastguard Worker     unsigned index, bool encode,
427*f6dc9357SAndroid Build Coastguard Worker     CCreatedCoder &cod)
428*f6dc9357SAndroid Build Coastguard Worker {
429*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ICompressFilter> filter;
430*f6dc9357SAndroid Build Coastguard Worker   const HRESULT res = CreateCoder_Index(
431*f6dc9357SAndroid Build Coastguard Worker       EXTERNAL_CODECS_LOC_VARS
432*f6dc9357SAndroid Build Coastguard Worker       index, encode,
433*f6dc9357SAndroid Build Coastguard Worker       filter, cod);
434*f6dc9357SAndroid Build Coastguard Worker 
435*f6dc9357SAndroid Build Coastguard Worker   if (filter)
436*f6dc9357SAndroid Build Coastguard Worker   {
437*f6dc9357SAndroid Build Coastguard Worker     cod.IsFilter = true;
438*f6dc9357SAndroid Build Coastguard Worker     CFilterCoder *coderSpec = new CFilterCoder(encode);
439*f6dc9357SAndroid Build Coastguard Worker     cod.Coder = coderSpec;
440*f6dc9357SAndroid Build Coastguard Worker     coderSpec->Filter = filter;
441*f6dc9357SAndroid Build Coastguard Worker   }
442*f6dc9357SAndroid Build Coastguard Worker 
443*f6dc9357SAndroid Build Coastguard Worker   return res;
444*f6dc9357SAndroid Build Coastguard Worker }
445*f6dc9357SAndroid Build Coastguard Worker 
446*f6dc9357SAndroid Build Coastguard Worker 
CreateCoder_Id(DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId,bool encode,CMyComPtr<ICompressFilter> & filter,CCreatedCoder & cod)447*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Id(
448*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
449*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId, bool encode,
450*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<ICompressFilter> &filter,
451*f6dc9357SAndroid Build Coastguard Worker     CCreatedCoder &cod)
452*f6dc9357SAndroid Build Coastguard Worker {
453*f6dc9357SAndroid Build Coastguard Worker   const int index = FindMethod_Index(EXTERNAL_CODECS_LOC_VARS methodId, encode);
454*f6dc9357SAndroid Build Coastguard Worker   if (index < 0)
455*f6dc9357SAndroid Build Coastguard Worker     return S_OK;
456*f6dc9357SAndroid Build Coastguard Worker   return CreateCoder_Index(EXTERNAL_CODECS_LOC_VARS (unsigned)index, encode, filter, cod);
457*f6dc9357SAndroid Build Coastguard Worker }
458*f6dc9357SAndroid Build Coastguard Worker 
459*f6dc9357SAndroid Build Coastguard Worker 
CreateCoder_Id(DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId,bool encode,CCreatedCoder & cod)460*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Id(
461*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
462*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId, bool encode,
463*f6dc9357SAndroid Build Coastguard Worker     CCreatedCoder &cod)
464*f6dc9357SAndroid Build Coastguard Worker {
465*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<ICompressFilter> filter;
466*f6dc9357SAndroid Build Coastguard Worker   const HRESULT res = CreateCoder_Id(
467*f6dc9357SAndroid Build Coastguard Worker       EXTERNAL_CODECS_LOC_VARS
468*f6dc9357SAndroid Build Coastguard Worker       methodId, encode,
469*f6dc9357SAndroid Build Coastguard Worker       filter, cod);
470*f6dc9357SAndroid Build Coastguard Worker 
471*f6dc9357SAndroid Build Coastguard Worker   if (filter)
472*f6dc9357SAndroid Build Coastguard Worker   {
473*f6dc9357SAndroid Build Coastguard Worker     cod.IsFilter = true;
474*f6dc9357SAndroid Build Coastguard Worker     CFilterCoder *coderSpec = new CFilterCoder(encode);
475*f6dc9357SAndroid Build Coastguard Worker     cod.Coder = coderSpec;
476*f6dc9357SAndroid Build Coastguard Worker     coderSpec->Filter = filter;
477*f6dc9357SAndroid Build Coastguard Worker   }
478*f6dc9357SAndroid Build Coastguard Worker 
479*f6dc9357SAndroid Build Coastguard Worker   return res;
480*f6dc9357SAndroid Build Coastguard Worker }
481*f6dc9357SAndroid Build Coastguard Worker 
482*f6dc9357SAndroid Build Coastguard Worker 
CreateCoder_Id(DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId,bool encode,CMyComPtr<ICompressCoder> & coder)483*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Id(
484*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
485*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId, bool encode,
486*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<ICompressCoder> &coder)
487*f6dc9357SAndroid Build Coastguard Worker {
488*f6dc9357SAndroid Build Coastguard Worker   CCreatedCoder cod;
489*f6dc9357SAndroid Build Coastguard Worker   const HRESULT res = CreateCoder_Id(
490*f6dc9357SAndroid Build Coastguard Worker       EXTERNAL_CODECS_LOC_VARS
491*f6dc9357SAndroid Build Coastguard Worker       methodId, encode,
492*f6dc9357SAndroid Build Coastguard Worker       cod);
493*f6dc9357SAndroid Build Coastguard Worker   coder = cod.Coder;
494*f6dc9357SAndroid Build Coastguard Worker   return res;
495*f6dc9357SAndroid Build Coastguard Worker }
496*f6dc9357SAndroid Build Coastguard Worker 
CreateFilter(DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId,bool encode,CMyComPtr<ICompressFilter> & filter)497*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateFilter(
498*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
499*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId, bool encode,
500*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<ICompressFilter> &filter)
501*f6dc9357SAndroid Build Coastguard Worker {
502*f6dc9357SAndroid Build Coastguard Worker   CCreatedCoder cod;
503*f6dc9357SAndroid Build Coastguard Worker   return CreateCoder_Id(
504*f6dc9357SAndroid Build Coastguard Worker       EXTERNAL_CODECS_LOC_VARS
505*f6dc9357SAndroid Build Coastguard Worker       methodId, encode,
506*f6dc9357SAndroid Build Coastguard Worker       filter, cod);
507*f6dc9357SAndroid Build Coastguard Worker }
508*f6dc9357SAndroid Build Coastguard Worker 
509*f6dc9357SAndroid Build Coastguard Worker 
CreateHasher(DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId,AString & name,CMyComPtr<IHasher> & hasher)510*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateHasher(
511*f6dc9357SAndroid Build Coastguard Worker     DECL_EXTERNAL_CODECS_LOC_VARS
512*f6dc9357SAndroid Build Coastguard Worker     CMethodId methodId,
513*f6dc9357SAndroid Build Coastguard Worker     AString &name,
514*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IHasher> &hasher)
515*f6dc9357SAndroid Build Coastguard Worker {
516*f6dc9357SAndroid Build Coastguard Worker   name.Empty();
517*f6dc9357SAndroid Build Coastguard Worker 
518*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
519*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < g_NumHashers; i++)
520*f6dc9357SAndroid Build Coastguard Worker   {
521*f6dc9357SAndroid Build Coastguard Worker     const CHasherInfo &codec = *g_Hashers[i];
522*f6dc9357SAndroid Build Coastguard Worker     if (codec.Id == methodId)
523*f6dc9357SAndroid Build Coastguard Worker     {
524*f6dc9357SAndroid Build Coastguard Worker       hasher = codec.CreateHasher();
525*f6dc9357SAndroid Build Coastguard Worker       name = codec.Name;
526*f6dc9357SAndroid Build Coastguard Worker       break;
527*f6dc9357SAndroid Build Coastguard Worker     }
528*f6dc9357SAndroid Build Coastguard Worker   }
529*f6dc9357SAndroid Build Coastguard Worker 
530*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
531*f6dc9357SAndroid Build Coastguard Worker 
532*f6dc9357SAndroid Build Coastguard Worker   CHECK_GLOBAL_CODECS
533*f6dc9357SAndroid Build Coastguard Worker 
534*f6dc9357SAndroid Build Coastguard Worker   if (!hasher && _externalCodecs)
535*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < _externalCodecs->Hashers.Size(); i++)
536*f6dc9357SAndroid Build Coastguard Worker     {
537*f6dc9357SAndroid Build Coastguard Worker       const CHasherInfoEx &codec = _externalCodecs->Hashers[i];
538*f6dc9357SAndroid Build Coastguard Worker       if (codec.Id == methodId)
539*f6dc9357SAndroid Build Coastguard Worker       {
540*f6dc9357SAndroid Build Coastguard Worker         name = codec.Name;
541*f6dc9357SAndroid Build Coastguard Worker         return _externalCodecs->GetHashers->CreateHasher((UInt32)i, &hasher);
542*f6dc9357SAndroid Build Coastguard Worker       }
543*f6dc9357SAndroid Build Coastguard Worker     }
544*f6dc9357SAndroid Build Coastguard Worker 
545*f6dc9357SAndroid Build Coastguard Worker   #endif
546*f6dc9357SAndroid Build Coastguard Worker 
547*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
548*f6dc9357SAndroid Build Coastguard Worker }
549