• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
CCodecInfoExCCodecInfoEx39   CCodecInfoEx(): EncoderIsAssigned(false), DecoderIsAssigned(false) {}
40 };
41 
42 struct CHasherInfoEx
43 {
44   CMethodId Id;
45   AString Name;
46 };
47 
48 #define PUBLIC_ISetCompressCodecsInfo public ISetCompressCodecsInfo,
49 #define QUERY_ENTRY_ISetCompressCodecsInfo MY_QUERYINTERFACE_ENTRY(ISetCompressCodecsInfo)
50 #define DECL_ISetCompressCodecsInfo STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo);
51 #define IMPL_ISetCompressCodecsInfo2(x) \
52 STDMETHODIMP x::SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo) { \
53   COM_TRY_BEGIN __externalCodecs.GetCodecs = compressCodecsInfo;  return __externalCodecs.Load(); COM_TRY_END }
54 #define IMPL_ISetCompressCodecsInfo IMPL_ISetCompressCodecsInfo2(CHandler)
55 
56 struct CExternalCodecs
57 {
58   CMyComPtr<ICompressCodecsInfo> GetCodecs;
59   CMyComPtr<IHashers> GetHashers;
60 
61   CObjectVector<CCodecInfoEx> Codecs;
62   CObjectVector<CHasherInfoEx> Hashers;
63 
IsSetCExternalCodecs64   bool IsSet() const { return GetCodecs != NULL || GetHashers != NULL; }
65 
66   HRESULT Load();
67 
ClearAndReleaseCExternalCodecs68   void ClearAndRelease()
69   {
70     Hashers.Clear();
71     Codecs.Clear();
72     GetHashers.Release();
73     GetCodecs.Release();
74   }
75 
~CExternalCodecsCExternalCodecs76   ~CExternalCodecs()
77   {
78     GetHashers.Release();
79     GetCodecs.Release();
80   }
81 };
82 
83 extern CExternalCodecs g_ExternalCodecs;
84 
85 #define EXTERNAL_CODECS_VARS2   (__externalCodecs.IsSet() ? &__externalCodecs : &g_ExternalCodecs)
86 #define EXTERNAL_CODECS_VARS2_L (&__externalCodecs)
87 #define EXTERNAL_CODECS_VARS2_G (&g_ExternalCodecs)
88 
89 #define DECL_EXTERNAL_CODECS_VARS CExternalCodecs __externalCodecs;
90 
91 #define EXTERNAL_CODECS_VARS   EXTERNAL_CODECS_VARS2,
92 #define EXTERNAL_CODECS_VARS_L EXTERNAL_CODECS_VARS2_L,
93 #define EXTERNAL_CODECS_VARS_G EXTERNAL_CODECS_VARS2_G,
94 
95 #define DECL_EXTERNAL_CODECS_LOC_VARS2 const CExternalCodecs *__externalCodecs
96 #define EXTERNAL_CODECS_LOC_VARS2 __externalCodecs
97 
98 #define DECL_EXTERNAL_CODECS_LOC_VARS DECL_EXTERNAL_CODECS_LOC_VARS2,
99 #define EXTERNAL_CODECS_LOC_VARS EXTERNAL_CODECS_LOC_VARS2,
100 
101 #else
102 
103 #define PUBLIC_ISetCompressCodecsInfo
104 #define QUERY_ENTRY_ISetCompressCodecsInfo
105 #define DECL_ISetCompressCodecsInfo
106 #define IMPL_ISetCompressCodecsInfo
107 #define EXTERNAL_CODECS_VARS2
108 #define DECL_EXTERNAL_CODECS_VARS
109 #define EXTERNAL_CODECS_VARS
110 #define EXTERNAL_CODECS_VARS_L
111 #define EXTERNAL_CODECS_VARS_G
112 #define DECL_EXTERNAL_CODECS_LOC_VARS2
113 #define EXTERNAL_CODECS_LOC_VARS2
114 #define DECL_EXTERNAL_CODECS_LOC_VARS
115 #define EXTERNAL_CODECS_LOC_VARS
116 
117 #endif
118 
119 int FindMethod_Index(
120     DECL_EXTERNAL_CODECS_LOC_VARS
121     const AString &name,
122     bool encode,
123     CMethodId &methodId,
124     UInt32 &numStreams);
125 
126 bool FindMethod(
127     DECL_EXTERNAL_CODECS_LOC_VARS
128     CMethodId methodId,
129     AString &name);
130 
131 bool FindHashMethod(
132     DECL_EXTERNAL_CODECS_LOC_VARS
133     const AString &name,
134     CMethodId &methodId);
135 
136 void GetHashMethods(
137     DECL_EXTERNAL_CODECS_LOC_VARS
138     CRecordVector<CMethodId> &methods);
139 
140 
141 struct CCreatedCoder
142 {
143   CMyComPtr<ICompressCoder> Coder;
144   CMyComPtr<ICompressCoder2> Coder2;
145 
146   bool IsExternal;
147   bool IsFilter; // = true, if Coder was created from filter
148   UInt32 NumStreams;
149 
150   // CCreatedCoder(): IsExternal(false), IsFilter(false), NumStreams(1) {}
151 };
152 
153 
154 HRESULT CreateCoder_Index(
155     DECL_EXTERNAL_CODECS_LOC_VARS
156     unsigned codecIndex, bool encode,
157     CMyComPtr<ICompressFilter> &filter,
158     CCreatedCoder &cod);
159 
160 HRESULT CreateCoder_Index(
161     DECL_EXTERNAL_CODECS_LOC_VARS
162     unsigned index, bool encode,
163     CCreatedCoder &cod);
164 
165 HRESULT CreateCoder_Id(
166     DECL_EXTERNAL_CODECS_LOC_VARS
167     CMethodId methodId, bool encode,
168     CMyComPtr<ICompressFilter> &filter,
169     CCreatedCoder &cod);
170 
171 HRESULT CreateCoder_Id(
172     DECL_EXTERNAL_CODECS_LOC_VARS
173     CMethodId methodId, bool encode,
174     CCreatedCoder &cod);
175 
176 HRESULT CreateCoder_Id(
177     DECL_EXTERNAL_CODECS_LOC_VARS
178     CMethodId methodId, bool encode,
179     CMyComPtr<ICompressCoder> &coder);
180 
181 HRESULT CreateFilter(
182     DECL_EXTERNAL_CODECS_LOC_VARS
183     CMethodId methodId, bool encode,
184     CMyComPtr<ICompressFilter> &filter);
185 
186 HRESULT CreateHasher(
187     DECL_EXTERNAL_CODECS_LOC_VARS
188     CMethodId methodId,
189     AString &name,
190     CMyComPtr<IHasher> &hasher);
191 
192 #endif
193