// CreateCoder.h #ifndef __CREATE_CODER_H #define __CREATE_CODER_H #include "../../Common/MyCom.h" #include "../../Common/MyString.h" #include "../ICoder.h" #include "MethodId.h" /* if EXTERNAL_CODECS is not defined, the code supports only codecs that are statically linked at compile-time and link-time. if EXTERNAL_CODECS is defined, the code supports also codecs from another executable modules, that can be linked dynamically at run-time: - EXE module can use codecs from external DLL files. - DLL module can use codecs from external EXE and DLL files. CExternalCodecs contains information about codecs and interfaces to create them. The order of codecs: 1) Internal codecs 2) External codecs */ #ifdef EXTERNAL_CODECS struct CCodecInfoEx { CMethodId Id; AString Name; UInt32 NumStreams; bool EncoderIsAssigned; bool DecoderIsAssigned; CCodecInfoEx(): EncoderIsAssigned(false), DecoderIsAssigned(false) {} }; struct CHasherInfoEx { CMethodId Id; AString Name; }; #define PUBLIC_ISetCompressCodecsInfo public ISetCompressCodecsInfo, #define QUERY_ENTRY_ISetCompressCodecsInfo MY_QUERYINTERFACE_ENTRY(ISetCompressCodecsInfo) #define DECL_ISetCompressCodecsInfo STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo); #define IMPL_ISetCompressCodecsInfo2(x) \ STDMETHODIMP x::SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo) { \ COM_TRY_BEGIN __externalCodecs.GetCodecs = compressCodecsInfo; return __externalCodecs.Load(); COM_TRY_END } #define IMPL_ISetCompressCodecsInfo IMPL_ISetCompressCodecsInfo2(CHandler) struct CExternalCodecs { CMyComPtr GetCodecs; CMyComPtr GetHashers; CObjectVector Codecs; CObjectVector Hashers; bool IsSet() const { return GetCodecs != NULL || GetHashers != NULL; } HRESULT Load(); void ClearAndRelease() { Hashers.Clear(); Codecs.Clear(); GetHashers.Release(); GetCodecs.Release(); } ~CExternalCodecs() { GetHashers.Release(); GetCodecs.Release(); } }; extern CExternalCodecs g_ExternalCodecs; #define EXTERNAL_CODECS_VARS2 (__externalCodecs.IsSet() ? &__externalCodecs : &g_ExternalCodecs) #define EXTERNAL_CODECS_VARS2_L (&__externalCodecs) #define EXTERNAL_CODECS_VARS2_G (&g_ExternalCodecs) #define DECL_EXTERNAL_CODECS_VARS CExternalCodecs __externalCodecs; #define EXTERNAL_CODECS_VARS EXTERNAL_CODECS_VARS2, #define EXTERNAL_CODECS_VARS_L EXTERNAL_CODECS_VARS2_L, #define EXTERNAL_CODECS_VARS_G EXTERNAL_CODECS_VARS2_G, #define DECL_EXTERNAL_CODECS_LOC_VARS2 const CExternalCodecs *__externalCodecs #define EXTERNAL_CODECS_LOC_VARS2 __externalCodecs #define DECL_EXTERNAL_CODECS_LOC_VARS DECL_EXTERNAL_CODECS_LOC_VARS2, #define EXTERNAL_CODECS_LOC_VARS EXTERNAL_CODECS_LOC_VARS2, #else #define PUBLIC_ISetCompressCodecsInfo #define QUERY_ENTRY_ISetCompressCodecsInfo #define DECL_ISetCompressCodecsInfo #define IMPL_ISetCompressCodecsInfo #define EXTERNAL_CODECS_VARS2 #define DECL_EXTERNAL_CODECS_VARS #define EXTERNAL_CODECS_VARS #define EXTERNAL_CODECS_VARS_L #define EXTERNAL_CODECS_VARS_G #define DECL_EXTERNAL_CODECS_LOC_VARS2 #define EXTERNAL_CODECS_LOC_VARS2 #define DECL_EXTERNAL_CODECS_LOC_VARS #define EXTERNAL_CODECS_LOC_VARS #endif int FindMethod_Index( DECL_EXTERNAL_CODECS_LOC_VARS const AString &name, bool encode, CMethodId &methodId, UInt32 &numStreams); bool FindMethod( DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId, AString &name); bool FindHashMethod( DECL_EXTERNAL_CODECS_LOC_VARS const AString &name, CMethodId &methodId); void GetHashMethods( DECL_EXTERNAL_CODECS_LOC_VARS CRecordVector &methods); struct CCreatedCoder { CMyComPtr Coder; CMyComPtr Coder2; bool IsExternal; bool IsFilter; // = true, if Coder was created from filter UInt32 NumStreams; // CCreatedCoder(): IsExternal(false), IsFilter(false), NumStreams(1) {} }; HRESULT CreateCoder_Index( DECL_EXTERNAL_CODECS_LOC_VARS unsigned codecIndex, bool encode, CMyComPtr &filter, CCreatedCoder &cod); HRESULT CreateCoder_Index( DECL_EXTERNAL_CODECS_LOC_VARS unsigned index, bool encode, CCreatedCoder &cod); HRESULT CreateCoder_Id( DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId, bool encode, CMyComPtr &filter, CCreatedCoder &cod); HRESULT CreateCoder_Id( DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId, bool encode, CCreatedCoder &cod); HRESULT CreateCoder_Id( DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId, bool encode, CMyComPtr &coder); HRESULT CreateFilter( DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId, bool encode, CMyComPtr &filter); HRESULT CreateHasher( DECL_EXTERNAL_CODECS_LOC_VARS CMethodId methodId, AString &name, CMyComPtr &hasher); #endif