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