1*f6dc9357SAndroid Build Coastguard Worker // RegisterCodec.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_REGISTER_CODEC_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_REGISTER_CODEC_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MethodId.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "../ICoder.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker typedef void * (*CreateCodecP)(); 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard Worker struct CCodecInfo 13*f6dc9357SAndroid Build Coastguard Worker { 14*f6dc9357SAndroid Build Coastguard Worker CreateCodecP CreateDecoder; 15*f6dc9357SAndroid Build Coastguard Worker CreateCodecP CreateEncoder; 16*f6dc9357SAndroid Build Coastguard Worker CMethodId Id; 17*f6dc9357SAndroid Build Coastguard Worker const char *Name; 18*f6dc9357SAndroid Build Coastguard Worker UInt32 NumStreams; 19*f6dc9357SAndroid Build Coastguard Worker bool IsFilter; 20*f6dc9357SAndroid Build Coastguard Worker }; 21*f6dc9357SAndroid Build Coastguard Worker 22*f6dc9357SAndroid Build Coastguard Worker void RegisterCodec(const CCodecInfo *codecInfo) throw(); 23*f6dc9357SAndroid Build Coastguard Worker 24*f6dc9357SAndroid Build Coastguard Worker 25*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_CODEC_CREATE_2(name, cls, i) static void *name() { return (void *)(i *)(new cls); } 26*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_CODEC_CREATE(name, cls) REGISTER_CODEC_CREATE_2(name, cls, ICompressCoder) 27*f6dc9357SAndroid Build Coastguard Worker 28*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_CODEC_NAME(x) CRegisterCodec ## x 29*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_CODEC_VAR(x) static const CCodecInfo g_CodecInfo_ ## x = 30*f6dc9357SAndroid Build Coastguard Worker 31*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_CODEC(x) struct REGISTER_CODEC_NAME(x) { \ 32*f6dc9357SAndroid Build Coastguard Worker REGISTER_CODEC_NAME(x)() { RegisterCodec(&g_CodecInfo_ ## x); }}; \ 33*f6dc9357SAndroid Build Coastguard Worker static REGISTER_CODEC_NAME(x) g_RegisterCodec_ ## x; 34*f6dc9357SAndroid Build Coastguard Worker 35*f6dc9357SAndroid Build Coastguard Worker 36*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_CODECS_NAME(x) CRegisterCodecs ## x 37*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_CODECS_VAR static const CCodecInfo g_CodecsInfo[] = 38*f6dc9357SAndroid Build Coastguard Worker 39*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_CODECS(x) struct REGISTER_CODECS_NAME(x) { \ 40*f6dc9357SAndroid Build Coastguard Worker REGISTER_CODECS_NAME(x)() { for (unsigned i = 0; i < Z7_ARRAY_SIZE(g_CodecsInfo); i++) \ 41*f6dc9357SAndroid Build Coastguard Worker RegisterCodec(&g_CodecsInfo[i]); }}; \ 42*f6dc9357SAndroid Build Coastguard Worker static REGISTER_CODECS_NAME(x) g_RegisterCodecs; 43*f6dc9357SAndroid Build Coastguard Worker 44*f6dc9357SAndroid Build Coastguard Worker 45*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_CODEC_2(x, crDec, crEnc, id, name) \ 46*f6dc9357SAndroid Build Coastguard Worker REGISTER_CODEC_VAR(x) \ 47*f6dc9357SAndroid Build Coastguard Worker { crDec, crEnc, id, name, 1, false }; \ 48*f6dc9357SAndroid Build Coastguard Worker REGISTER_CODEC(x) 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Worker 51*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTRACT_ONLY 52*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_CODEC_E(x, clsDec, clsEnc, id, name) \ 53*f6dc9357SAndroid Build Coastguard Worker REGISTER_CODEC_CREATE(CreateDec, clsDec) \ 54*f6dc9357SAndroid Build Coastguard Worker REGISTER_CODEC_2(x, CreateDec, NULL, id, name) 55*f6dc9357SAndroid Build Coastguard Worker #else 56*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_CODEC_E(x, clsDec, clsEnc, id, name) \ 57*f6dc9357SAndroid Build Coastguard Worker REGISTER_CODEC_CREATE(CreateDec, clsDec) \ 58*f6dc9357SAndroid Build Coastguard Worker REGISTER_CODEC_CREATE(CreateEnc, clsEnc) \ 59*f6dc9357SAndroid Build Coastguard Worker REGISTER_CODEC_2(x, CreateDec, CreateEnc, id, name) 60*f6dc9357SAndroid Build Coastguard Worker #endif 61*f6dc9357SAndroid Build Coastguard Worker 62*f6dc9357SAndroid Build Coastguard Worker 63*f6dc9357SAndroid Build Coastguard Worker 64*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_FILTER_CREATE(name, cls) REGISTER_CODEC_CREATE_2(name, cls, ICompressFilter) 65*f6dc9357SAndroid Build Coastguard Worker 66*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_FILTER_ITEM(crDec, crEnc, id, name) \ 67*f6dc9357SAndroid Build Coastguard Worker { crDec, crEnc, id, name, 1, true } 68*f6dc9357SAndroid Build Coastguard Worker 69*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_FILTER(x, crDec, crEnc, id, name) \ 70*f6dc9357SAndroid Build Coastguard Worker REGISTER_CODEC_VAR(x) \ 71*f6dc9357SAndroid Build Coastguard Worker REGISTER_FILTER_ITEM(crDec, crEnc, id, name); \ 72*f6dc9357SAndroid Build Coastguard Worker REGISTER_CODEC(x) 73*f6dc9357SAndroid Build Coastguard Worker 74*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTRACT_ONLY 75*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_FILTER_E(x, clsDec, clsEnc, id, name) \ 76*f6dc9357SAndroid Build Coastguard Worker REGISTER_FILTER_CREATE(x ## _CreateDec, clsDec) \ 77*f6dc9357SAndroid Build Coastguard Worker REGISTER_FILTER(x, x ## _CreateDec, NULL, id, name) 78*f6dc9357SAndroid Build Coastguard Worker #else 79*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_FILTER_E(x, clsDec, clsEnc, id, name) \ 80*f6dc9357SAndroid Build Coastguard Worker REGISTER_FILTER_CREATE(x ## _CreateDec, clsDec) \ 81*f6dc9357SAndroid Build Coastguard Worker REGISTER_FILTER_CREATE(x ## _CreateEnc, clsEnc) \ 82*f6dc9357SAndroid Build Coastguard Worker REGISTER_FILTER(x, x ## _CreateDec, x ## _CreateEnc, id, name) 83*f6dc9357SAndroid Build Coastguard Worker #endif 84*f6dc9357SAndroid Build Coastguard Worker 85*f6dc9357SAndroid Build Coastguard Worker 86*f6dc9357SAndroid Build Coastguard Worker 87*f6dc9357SAndroid Build Coastguard Worker struct CHasherInfo 88*f6dc9357SAndroid Build Coastguard Worker { 89*f6dc9357SAndroid Build Coastguard Worker IHasher * (*CreateHasher)(); 90*f6dc9357SAndroid Build Coastguard Worker CMethodId Id; 91*f6dc9357SAndroid Build Coastguard Worker const char *Name; 92*f6dc9357SAndroid Build Coastguard Worker UInt32 DigestSize; 93*f6dc9357SAndroid Build Coastguard Worker }; 94*f6dc9357SAndroid Build Coastguard Worker 95*f6dc9357SAndroid Build Coastguard Worker void RegisterHasher(const CHasherInfo *hasher) throw(); 96*f6dc9357SAndroid Build Coastguard Worker 97*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_HASHER_NAME(x) CRegHasher_ ## x 98*f6dc9357SAndroid Build Coastguard Worker 99*f6dc9357SAndroid Build Coastguard Worker #define REGISTER_HASHER(cls, id, name, size) \ 100*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(UInt32, cls::GetDigestSize()) { return size; } \ 101*f6dc9357SAndroid Build Coastguard Worker static IHasher *CreateHasherSpec() { return new cls(); } \ 102*f6dc9357SAndroid Build Coastguard Worker static const CHasherInfo g_HasherInfo = { CreateHasherSpec, id, name, size }; \ 103*f6dc9357SAndroid Build Coastguard Worker struct REGISTER_HASHER_NAME(cls) { REGISTER_HASHER_NAME(cls)() { RegisterHasher(&g_HasherInfo); }}; \ 104*f6dc9357SAndroid Build Coastguard Worker static REGISTER_HASHER_NAME(cls) g_RegisterHasher; 105*f6dc9357SAndroid Build Coastguard Worker 106*f6dc9357SAndroid Build Coastguard Worker #endif 107