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