1*f6dc9357SAndroid Build Coastguard Worker // CreateCoder.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_CREATE_CODER_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_CREATE_CODER_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h" 7*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyString.h" 8*f6dc9357SAndroid Build Coastguard Worker 9*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h" 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker #include "MethodId.h" 12*f6dc9357SAndroid Build Coastguard Worker 13*f6dc9357SAndroid Build Coastguard Worker /* 14*f6dc9357SAndroid Build Coastguard Worker if Z7_EXTERNAL_CODECS is not defined, the code supports only codecs that 15*f6dc9357SAndroid Build Coastguard Worker are statically linked at compile-time and link-time. 16*f6dc9357SAndroid Build Coastguard Worker 17*f6dc9357SAndroid Build Coastguard Worker if Z7_EXTERNAL_CODECS is defined, the code supports also codecs from another 18*f6dc9357SAndroid Build Coastguard Worker executable modules, that can be linked dynamically at run-time: 19*f6dc9357SAndroid Build Coastguard Worker - EXE module can use codecs from external DLL files. 20*f6dc9357SAndroid Build Coastguard Worker - DLL module can use codecs from external EXE and DLL files. 21*f6dc9357SAndroid Build Coastguard Worker 22*f6dc9357SAndroid Build Coastguard Worker CExternalCodecs contains information about codecs and interfaces to create them. 23*f6dc9357SAndroid Build Coastguard Worker 24*f6dc9357SAndroid Build Coastguard Worker The order of codecs: 25*f6dc9357SAndroid Build Coastguard Worker 1) Internal codecs 26*f6dc9357SAndroid Build Coastguard Worker 2) External codecs 27*f6dc9357SAndroid Build Coastguard Worker */ 28*f6dc9357SAndroid Build Coastguard Worker 29*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS 30*f6dc9357SAndroid Build Coastguard Worker 31*f6dc9357SAndroid Build Coastguard Worker struct CCodecInfoEx 32*f6dc9357SAndroid Build Coastguard Worker { 33*f6dc9357SAndroid Build Coastguard Worker CMethodId Id; 34*f6dc9357SAndroid Build Coastguard Worker AString Name; 35*f6dc9357SAndroid Build Coastguard Worker UInt32 NumStreams; 36*f6dc9357SAndroid Build Coastguard Worker bool EncoderIsAssigned; 37*f6dc9357SAndroid Build Coastguard Worker bool DecoderIsAssigned; 38*f6dc9357SAndroid Build Coastguard Worker bool IsFilter; // it's unused 39*f6dc9357SAndroid Build Coastguard Worker CCodecInfoExCCodecInfoEx40*f6dc9357SAndroid Build Coastguard Worker CCodecInfoEx(): EncoderIsAssigned(false), DecoderIsAssigned(false), IsFilter(false) {} 41*f6dc9357SAndroid Build Coastguard Worker }; 42*f6dc9357SAndroid Build Coastguard Worker 43*f6dc9357SAndroid Build Coastguard Worker struct CHasherInfoEx 44*f6dc9357SAndroid Build Coastguard Worker { 45*f6dc9357SAndroid Build Coastguard Worker CMethodId Id; 46*f6dc9357SAndroid Build Coastguard Worker AString Name; 47*f6dc9357SAndroid Build Coastguard Worker }; 48*f6dc9357SAndroid Build Coastguard Worker 49*f6dc9357SAndroid Build Coastguard Worker #define Z7_PUBLIC_ISetCompressCodecsInfo_IFEC \ 50*f6dc9357SAndroid Build Coastguard Worker public ISetCompressCodecsInfo, 51*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_ENTRY_ISetCompressCodecsInfo_IFEC \ 52*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(ISetCompressCodecsInfo) 53*f6dc9357SAndroid Build Coastguard Worker #define DECL_ISetCompressCodecsInfo \ 54*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMP(SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo)) 55*f6dc9357SAndroid Build Coastguard Worker #define IMPL_ISetCompressCodecsInfo2(cls) \ 56*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(cls::SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo)) \ 57*f6dc9357SAndroid Build Coastguard Worker { COM_TRY_BEGIN _externalCodecs.GetCodecs = compressCodecsInfo; \ 58*f6dc9357SAndroid Build Coastguard Worker return _externalCodecs.Load(); COM_TRY_END } 59*f6dc9357SAndroid Build Coastguard Worker #define IMPL_ISetCompressCodecsInfo IMPL_ISetCompressCodecsInfo2(CHandler) 60*f6dc9357SAndroid Build Coastguard Worker 61*f6dc9357SAndroid Build Coastguard Worker struct CExternalCodecs 62*f6dc9357SAndroid Build Coastguard Worker { 63*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressCodecsInfo> GetCodecs; 64*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IHashers> GetHashers; 65*f6dc9357SAndroid Build Coastguard Worker 66*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CCodecInfoEx> Codecs; 67*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CHasherInfoEx> Hashers; 68*f6dc9357SAndroid Build Coastguard Worker IsSetCExternalCodecs69*f6dc9357SAndroid Build Coastguard Worker bool IsSet() const { return GetCodecs != NULL || GetHashers != NULL; } 70*f6dc9357SAndroid Build Coastguard Worker 71*f6dc9357SAndroid Build Coastguard Worker HRESULT Load(); 72*f6dc9357SAndroid Build Coastguard Worker ClearAndReleaseCExternalCodecs73*f6dc9357SAndroid Build Coastguard Worker void ClearAndRelease() 74*f6dc9357SAndroid Build Coastguard Worker { 75*f6dc9357SAndroid Build Coastguard Worker Hashers.Clear(); 76*f6dc9357SAndroid Build Coastguard Worker Codecs.Clear(); 77*f6dc9357SAndroid Build Coastguard Worker GetHashers.Release(); 78*f6dc9357SAndroid Build Coastguard Worker GetCodecs.Release(); 79*f6dc9357SAndroid Build Coastguard Worker } 80*f6dc9357SAndroid Build Coastguard Worker ~CExternalCodecsCExternalCodecs81*f6dc9357SAndroid Build Coastguard Worker ~CExternalCodecs() 82*f6dc9357SAndroid Build Coastguard Worker { 83*f6dc9357SAndroid Build Coastguard Worker GetHashers.Release(); 84*f6dc9357SAndroid Build Coastguard Worker GetCodecs.Release(); 85*f6dc9357SAndroid Build Coastguard Worker } 86*f6dc9357SAndroid Build Coastguard Worker }; 87*f6dc9357SAndroid Build Coastguard Worker 88*f6dc9357SAndroid Build Coastguard Worker extern CExternalCodecs g_ExternalCodecs; 89*f6dc9357SAndroid Build Coastguard Worker 90*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS2 (_externalCodecs.IsSet() ? &_externalCodecs : &g_ExternalCodecs) 91*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS2_L (&_externalCodecs) 92*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS2_G (&g_ExternalCodecs) 93*f6dc9357SAndroid Build Coastguard Worker 94*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_VARS CExternalCodecs _externalCodecs; 95*f6dc9357SAndroid Build Coastguard Worker 96*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS EXTERNAL_CODECS_VARS2, 97*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS_L EXTERNAL_CODECS_VARS2_L, 98*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS_G EXTERNAL_CODECS_VARS2_G, 99*f6dc9357SAndroid Build Coastguard Worker 100*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_LOC_VARS2 const CExternalCodecs *_externalCodecs 101*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_LOC_VARS DECL_EXTERNAL_CODECS_LOC_VARS2, 102*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_LOC_VARS_DECL DECL_EXTERNAL_CODECS_LOC_VARS2; 103*f6dc9357SAndroid Build Coastguard Worker 104*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_LOC_VARS2 _externalCodecs 105*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_LOC_VARS EXTERNAL_CODECS_LOC_VARS2, 106*f6dc9357SAndroid Build Coastguard Worker 107*f6dc9357SAndroid Build Coastguard Worker #else 108*f6dc9357SAndroid Build Coastguard Worker 109*f6dc9357SAndroid Build Coastguard Worker #define Z7_PUBLIC_ISetCompressCodecsInfo_IFEC 110*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_ENTRY_ISetCompressCodecsInfo_IFEC 111*f6dc9357SAndroid Build Coastguard Worker #define DECL_ISetCompressCodecsInfo 112*f6dc9357SAndroid Build Coastguard Worker #define IMPL_ISetCompressCodecsInfo 113*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS2 114*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_VARS 115*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS 116*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS_L 117*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_VARS_G 118*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_LOC_VARS2 119*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_LOC_VARS 120*f6dc9357SAndroid Build Coastguard Worker #define DECL_EXTERNAL_CODECS_LOC_VARS_DECL 121*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_LOC_VARS2 122*f6dc9357SAndroid Build Coastguard Worker #define EXTERNAL_CODECS_LOC_VARS 123*f6dc9357SAndroid Build Coastguard Worker 124*f6dc9357SAndroid Build Coastguard Worker #endif 125*f6dc9357SAndroid Build Coastguard Worker 126*f6dc9357SAndroid Build Coastguard Worker int FindMethod_Index( 127*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 128*f6dc9357SAndroid Build Coastguard Worker const AString &name, 129*f6dc9357SAndroid Build Coastguard Worker bool encode, 130*f6dc9357SAndroid Build Coastguard Worker CMethodId &methodId, 131*f6dc9357SAndroid Build Coastguard Worker UInt32 &numStreams, 132*f6dc9357SAndroid Build Coastguard Worker bool &isFilter); 133*f6dc9357SAndroid Build Coastguard Worker 134*f6dc9357SAndroid Build Coastguard Worker bool FindMethod( 135*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 136*f6dc9357SAndroid Build Coastguard Worker CMethodId methodId, 137*f6dc9357SAndroid Build Coastguard Worker AString &name); 138*f6dc9357SAndroid Build Coastguard Worker 139*f6dc9357SAndroid Build Coastguard Worker bool FindHashMethod( 140*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 141*f6dc9357SAndroid Build Coastguard Worker const AString &name, 142*f6dc9357SAndroid Build Coastguard Worker CMethodId &methodId); 143*f6dc9357SAndroid Build Coastguard Worker 144*f6dc9357SAndroid Build Coastguard Worker void GetHashMethods( 145*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 146*f6dc9357SAndroid Build Coastguard Worker CRecordVector<CMethodId> &methods); 147*f6dc9357SAndroid Build Coastguard Worker 148*f6dc9357SAndroid Build Coastguard Worker 149*f6dc9357SAndroid Build Coastguard Worker struct CCreatedCoder 150*f6dc9357SAndroid Build Coastguard Worker { 151*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressCoder> Coder; 152*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressCoder2> Coder2; 153*f6dc9357SAndroid Build Coastguard Worker 154*f6dc9357SAndroid Build Coastguard Worker bool IsExternal; 155*f6dc9357SAndroid Build Coastguard Worker bool IsFilter; // = true, if Coder was created from filter 156*f6dc9357SAndroid Build Coastguard Worker UInt32 NumStreams; 157*f6dc9357SAndroid Build Coastguard Worker 158*f6dc9357SAndroid Build Coastguard Worker // CCreatedCoder(): IsExternal(false), IsFilter(false), NumStreams(1) {} 159*f6dc9357SAndroid Build Coastguard Worker }; 160*f6dc9357SAndroid Build Coastguard Worker 161*f6dc9357SAndroid Build Coastguard Worker 162*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Index( 163*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 164*f6dc9357SAndroid Build Coastguard Worker unsigned codecIndex, bool encode, 165*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressFilter> &filter, 166*f6dc9357SAndroid Build Coastguard Worker CCreatedCoder &cod); 167*f6dc9357SAndroid Build Coastguard Worker 168*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Index( 169*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 170*f6dc9357SAndroid Build Coastguard Worker unsigned index, bool encode, 171*f6dc9357SAndroid Build Coastguard Worker CCreatedCoder &cod); 172*f6dc9357SAndroid Build Coastguard Worker 173*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Id( 174*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 175*f6dc9357SAndroid Build Coastguard Worker CMethodId methodId, bool encode, 176*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressFilter> &filter, 177*f6dc9357SAndroid Build Coastguard Worker CCreatedCoder &cod); 178*f6dc9357SAndroid Build Coastguard Worker 179*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Id( 180*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 181*f6dc9357SAndroid Build Coastguard Worker CMethodId methodId, bool encode, 182*f6dc9357SAndroid Build Coastguard Worker CCreatedCoder &cod); 183*f6dc9357SAndroid Build Coastguard Worker 184*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateCoder_Id( 185*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 186*f6dc9357SAndroid Build Coastguard Worker CMethodId methodId, bool encode, 187*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressCoder> &coder); 188*f6dc9357SAndroid Build Coastguard Worker 189*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateFilter( 190*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 191*f6dc9357SAndroid Build Coastguard Worker CMethodId methodId, bool encode, 192*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<ICompressFilter> &filter); 193*f6dc9357SAndroid Build Coastguard Worker 194*f6dc9357SAndroid Build Coastguard Worker HRESULT CreateHasher( 195*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS 196*f6dc9357SAndroid Build Coastguard Worker CMethodId methodId, 197*f6dc9357SAndroid Build Coastguard Worker AString &name, 198*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IHasher> &hasher); 199*f6dc9357SAndroid Build Coastguard Worker 200*f6dc9357SAndroid Build Coastguard Worker #endif 201