Home | History | Annotate | Download | only in Common
      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 
     39   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 
     64   bool IsSet() const { return GetCodecs != NULL || GetHashers != NULL; }
     65 
     66   HRESULT Load();
     67 
     68   void ClearAndRelease()
     69   {
     70     Hashers.Clear();
     71     Codecs.Clear();
     72     GetHashers.Release();
     73     GetCodecs.Release();
     74   }
     75 
     76   ~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 
    120 
    121 
    122 bool FindMethod(
    123     DECL_EXTERNAL_CODECS_LOC_VARS
    124     const AString &name,
    125     CMethodId &methodId, 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(
    156     DECL_EXTERNAL_CODECS_LOC_VARS
    157     CMethodId methodId, bool encode,
    158     CMyComPtr<ICompressFilter> &filter,
    159     CCreatedCoder &cod);
    160 
    161 HRESULT CreateCoder(
    162     DECL_EXTERNAL_CODECS_LOC_VARS
    163     CMethodId methodId, bool encode,
    164     CCreatedCoder &cod);
    165 
    166 HRESULT CreateCoder(
    167     DECL_EXTERNAL_CODECS_LOC_VARS
    168     CMethodId methodId, bool encode,
    169     CMyComPtr<ICompressCoder> &coder);
    170 
    171 HRESULT CreateFilter(
    172     DECL_EXTERNAL_CODECS_LOC_VARS
    173     CMethodId methodId, bool encode,
    174     CMyComPtr<ICompressFilter> &filter);
    175 
    176 HRESULT CreateHasher(
    177     DECL_EXTERNAL_CODECS_LOC_VARS
    178     CMethodId methodId,
    179     AString &name,
    180     CMyComPtr<IHasher> &hasher);
    181 
    182 #endif
    183