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