00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef __OPAL_CODECPLUGIN_H
00033 #define __OPAL_CODECPLUGIN_H
00034
00035 #ifdef __cplusplus
00036 extern "C" {
00037 #endif
00038
00039 #include <time.h>
00040
00041 #ifdef _MSC_VER
00042 #pragma warning(disable:4201)
00043 #endif
00044
00045 #ifdef _WIN32
00046 # ifdef PLUGIN_CODEC_DLL_EXPORTS
00047 # define PLUGIN_CODEC_DLL_API __declspec(dllexport)
00048 # else
00049 # define PLUGIN_CODEC_DLL_API __declspec(dllimport)
00050 # endif
00051
00052 #else
00053
00054 #define PLUGIN_CODEC_DLL_API
00055
00056 #endif
00057
00058 #ifdef PWLIB_PLUGIN_API_VERSION
00059 #undef PWLIB_PLUGIN_API_VERSION
00060 #endif
00061 #define PWLIB_PLUGIN_API_VERSION 1
00062
00063 #define PLUGIN_CODEC_VERSION 1 // initial version
00064 #define PLUGIN_CODEC_VERSION_WIDEBAND 2 // added wideband
00065 #define PLUGIN_CODEC_VERSION_VIDEO 3 // added video
00066 #define PLUGIN_CODEC_VERSION_FAX 4 // added fax
00067 #define PLUGIN_CODEC_VERSION_OPTIONS 5 // added options handling
00068
00069 #define PLUGIN_CODEC_API_VER_FN PWLibPlugin_GetAPIVersion
00070 #define PLUGIN_CODEC_API_VER_FN_STR "PWLibPlugin_GetAPIVersion"
00071
00072 #define PLUGIN_CODEC_GET_CODEC_FN OpalCodecPlugin_GetCodecs
00073 #define PLUGIN_CODEC_GET_CODEC_FN_STR "OpalCodecPlugin_GetCodecs"
00074
00075 #define PLUGIN_CODEC_API_VER_FN_DECLARE \
00076 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
00077 { return PWLIB_PLUGIN_API_VERSION; }
00078
00079 enum {
00080 PluginCodec_License_None = 0,
00081 PluginCodec_Licence_None = PluginCodec_License_None,
00082 PluginCodec_License_GPL = 1,
00083 PluginCodec_License_MPL = 2,
00084 PluginCodec_License_Freeware = 3,
00085 PluginCodec_License_ResearchAndDevelopmentUseOnly = 4,
00086 PluginCodec_License_BSD = 5,
00087 PluginCodec_License_LGPL = 6,
00088
00089 PluginCodec_License_NoRoyalties = 0x7f,
00090
00091
00092 PluginCodec_License_RoyaltiesRequired = 0x80
00093 };
00094
00095 struct PluginCodec_information {
00096
00097 time_t timestamp;
00098
00099 const char * sourceAuthor;
00100 const char * sourceVersion;
00101 const char * sourceEmail;
00102 const char * sourceURL;
00103 const char * sourceCopyright;
00104 const char * sourceLicense;
00105 unsigned char sourceLicenseCode;
00106
00107 const char * codecDescription;
00108 const char * codecAuthor;
00109 const char * codecVersion;
00110 const char * codecEmail;
00111 const char * codecURL;
00112 const char * codecCopyright;
00113 const char * codecLicense;
00114 unsigned short codecLicenseCode;
00115
00116
00117 };
00118
00119 enum PluginCodec_Flags {
00120 PluginCodec_MediaTypeMask = 0x000f,
00121 PluginCodec_MediaTypeAudio = 0x0000,
00122 PluginCodec_MediaTypeVideo = 0x0001,
00123 PluginCodec_MediaTypeAudioStreamed = 0x0002,
00124 PluginCodec_MediaTypeFax = 0x0003,
00125
00126 PluginCodec_InputTypeMask = 0x0010,
00127 PluginCodec_InputTypeRaw = 0x0000,
00128 PluginCodec_InputTypeRTP = 0x0010,
00129
00130 PluginCodec_OutputTypeMask = 0x0020,
00131 PluginCodec_OutputTypeRaw = 0x0000,
00132 PluginCodec_OutputTypeRTP = 0x0020,
00133
00134 PluginCodec_RTPTypeMask = 0x0040,
00135 PluginCodec_RTPTypeDynamic = 0x0000,
00136 PluginCodec_RTPTypeExplicit = 0x0040,
00137
00138 PluginCodec_RTPSharedMask = 0x0080,
00139 PluginCodec_RTPTypeNotShared = 0x0000,
00140 PluginCodec_RTPTypeShared = 0x0080,
00141
00142 PluginCodec_DecodeSilenceMask = 0x0100,
00143 PluginCodec_NoDecodeSilence = 0x0000,
00144 PluginCodec_DecodeSilence = 0x0100,
00145
00146 PluginCodec_EncodeSilenceMask = 0x0200,
00147 PluginCodec_NoEncodeSilence = 0x0000,
00148 PluginCodec_EncodeSilence = 0x0200,
00149
00150 PluginCodec_MediaExtensionMask = 0x0400,
00151 PluginCodec_MediaTypeExtVideo = 0x0400,
00152
00153 PluginCodec_ComfortNoiseMask = 0x0800,
00154 PluginCodec_ComfortNoise = 0x0800,
00155
00156 PluginCodec_EmptyPayloadMask = 0x1000,
00157 PluginCodec_EmptyPayload = 0x1000,
00158
00159 PluginCodec_BitsPerSamplePos = 12,
00160 PluginCodec_BitsPerSampleMask = 0xf000,
00161 };
00162
00163 enum PluginCodec_CoderFlags {
00164 PluginCodec_CoderSilenceFrame = 1,
00165 PluginCodec_CoderForceIFrame = 2
00166 };
00167
00168 enum PluginCodec_ReturnCoderFlags {
00169 PluginCodec_ReturnCoderLastFrame = 1,
00170 PluginCodec_ReturnCoderIFrame = 2,
00171 PluginCodec_ReturnCoderRequestIFrame = 4
00172 };
00173
00174 struct PluginCodec_Definition;
00175
00176
00177
00178 #define PLUGINCODEC_CONTROL_VALID_FOR_PROTOCOL "valid_for_protocol"
00179 #define PLUGINCODEC_CONTROL_GET_CODEC_OPTIONS "get_codec_options"
00180 #define PLUGINCODEC_CONTROL_FREE_CODEC_OPTIONS "free_codec_options"
00181 #define PLUGINCODEC_CONTROL_GET_OUTPUT_DATA_SIZE "get_output_data_size"
00182 #define PLUGINCODEC_CONTROL_SET_CODEC_OPTIONS "set_codec_options"
00183 #define PLUGINCODEC_CONTROL_TO_NORMALISED_OPTIONS "to_normalised_options"
00184 #define PLUGINCODEC_CONTROL_TO_CUSTOMISED_OPTIONS "to_customised_options"
00185 #define PLUGINCODEC_CONTROL_SET_INSTANCE_ID "set_instance_id"
00186
00187
00188 struct PluginCodec_ControlDefn {
00189 const char * name;
00190 int (*control)(const struct PluginCodec_Definition * codec, void * context,
00191 const char * name, void * parm, unsigned * parmLen);
00192
00193 };
00194
00195 enum PluginCodec_OptionTypes {
00196 PluginCodec_StringOption,
00197 PluginCodec_BoolOption,
00198 PluginCodec_IntegerOption,
00199 PluginCodec_RealOption,
00200 PluginCodec_EnumOption,
00201 PluginCodec_OctetsOption,
00202 PluginCodec_NumOptionTypes,
00203 };
00204
00205 enum PluginCodec_OptionMerge {
00206 PluginCodec_NoMerge,
00207 PluginCodec_MinMerge,
00208 PluginCodec_MaxMerge,
00209 PluginCodec_EqualMerge,
00210 PluginCodec_NotEqualMerge,
00211 PluginCodec_AlwaysMerge,
00212 PluginCodec_CustomMerge,
00213 PluginCodec_NumOptionMerge,
00214
00215 PluginCodec_AndMerge = PluginCodec_MinMerge,
00216 PluginCodec_OrMerge = PluginCodec_MaxMerge
00217 };
00218
00219 #define PluginCodec_H245_Collapsing 0x40000000
00220 #define PluginCodec_H245_NonCollapsing 0x20000000
00221 #define PluginCodec_H245_Unsigned32 0x10000000
00222 #define PluginCodec_H245_BooleanArray 0x08000000
00223 #define PluginCodec_H245_TCS 0x04000000
00224 #define PluginCodec_H245_OLC 0x02000000
00225 #define PluginCodec_H245_ReqMode 0x01000000
00226 #define PluginCodec_H245_OrdinalMask 0x0000ffff
00227
00228 typedef int (*PluginCodec_MergeFunction)(char ** result, const char * dest, const char * src);
00229 typedef void (*PluginCodec_FreeFunction)(char * string);
00230
00231 struct PluginCodec_Option {
00232
00233 enum PluginCodec_OptionTypes m_type;
00234 const char * m_name;
00235 unsigned m_readOnly;
00236 enum PluginCodec_OptionMerge m_merge;
00237 const char * m_value;
00238 const char * m_FMTPName;
00239 const char * m_FMTPDefault;
00240 int m_H245Generic;
00241 const char * m_minimum;
00242 const char * m_maximum;
00243 PluginCodec_MergeFunction m_mergeFunction;
00244 PluginCodec_FreeFunction m_freeFunction;
00245 };
00246
00247
00248
00249 #define PLUGINCODEC_OPTION_NEEDS_JITTER "Needs Jitter"
00250 #define PLUGINCODEC_OPTION_CLOCK_RATE "Clock Rate"
00251 #define PLUGINCODEC_OPTION_FRAME_TIME "Frame Time"
00252 #define PLUGINCODEC_OPTION_MAX_FRAME_SIZE "Max Frame Size"
00253 #define PLUGINCODEC_OPTION_MAX_BIT_RATE "Max Bit Rate"
00254 #define PLUGINCODEC_OPTION_TARGET_BIT_RATE "Target Bit Rate"
00255 #define PLUGINCODEC_OPTION_RX_FRAMES_PER_PACKET "Rx Frames Per Packet"
00256 #define PLUGINCODEC_OPTION_TX_FRAMES_PER_PACKET "Tx Frames Per Packet"
00257 #define PLUGINCODEC_OPTION_FRAME_WIDTH "Frame Width"
00258 #define PLUGINCODEC_OPTION_FRAME_HEIGHT "Frame Height"
00259 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_WIDTH "Min Rx Frame Width"
00260 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_HEIGHT "Min Rx Frame Height"
00261 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_WIDTH "Max Rx Frame Width"
00262 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_HEIGHT "Max Rx Frame Height"
00263 #define PLUGINCODEC_OPTION_TEMPORAL_SPATIAL_TRADE_OFF "Temporal Spatial Trade Off"
00264 #define PLUGINCODEC_OPTION_TX_KEY_FRAME_PERIOD "Tx Key Frame Period"
00265
00266
00267
00268
00269 struct PluginCodec_Definition {
00270 unsigned int version;
00271
00272
00273 struct PluginCodec_information * info;
00274
00275 unsigned int flags;
00276
00277
00278
00279
00280
00281 const char * descr;
00282
00283 const char * sourceFormat;
00284 const char * destFormat;
00285
00286 const void * userData;
00287
00288 unsigned int sampleRate;
00289 unsigned int bitsPerSec;
00290 unsigned int usPerFrame;
00291
00292 union _parm {
00293 struct _audio {
00294 unsigned int samplesPerFrame;
00295 unsigned int bytesPerFrame;
00296 unsigned int recommendedFramesPerPacket;
00297 unsigned int maxFramesPerPacket;
00298 } audio;
00299 struct _video {
00300 unsigned int maxFrameWidth;
00301 unsigned int maxFrameHeight;
00302 unsigned int recommendedFrameRate;
00303 unsigned int maxFrameRate;
00304 } video;
00305 } parm;
00306
00307 unsigned char rtpPayload;
00308 const char * sdpFormat;
00309
00310 void * (*createCodec)(const struct PluginCodec_Definition * codec);
00311 void (*destroyCodec) (const struct PluginCodec_Definition * codec, void * context);
00312 int (*codecFunction) (const struct PluginCodec_Definition * codec, void * context,
00313 const void * from, unsigned * fromLen,
00314 void * to, unsigned * toLen,
00315 unsigned int * flag);
00316 struct PluginCodec_ControlDefn * codecControls;
00317
00318
00319 unsigned char h323CapabilityType;
00320 const void * h323CapabilityData;
00321
00322
00323
00324
00325
00326 };
00327
00328 typedef struct PluginCodec_Definition * (* PluginCodec_GetCodecFunction)(unsigned int *, unsigned int);
00329 typedef unsigned (* PluginCodec_GetAPIVersionFunction)();
00330
00332
00333
00334
00335
00336
00337 struct PluginCodec_H323CapabilityExtension {
00338 unsigned int index;
00339 void * data;
00340 unsigned dataLength;
00341 };
00342
00343 struct PluginCodec_H323NonStandardCodecData {
00344 const char * objectId;
00345 unsigned char t35CountryCode;
00346 unsigned char t35Extension;
00347 unsigned short manufacturerCode;
00348 const unsigned char * data;
00349 unsigned int dataLength;
00350 int (*capabilityMatchFunction)(struct PluginCodec_H323NonStandardCodecData *);
00351 };
00352
00353
00354 struct PluginCodec_H323GenericParameterDefinition
00355 {
00356
00357
00358
00359
00360
00361 struct {
00362 int collapsing:1;
00363 int excludeTCS:1;
00364 int excludeOLC:1;
00365 int excludeReqMode:1;
00366 int readOnly:1;
00367 };
00368
00369 unsigned int id;
00370
00371 enum PluginCodec_H323GenericParameterType {
00372
00373
00374
00375 PluginCodec_GenericParameter_Logical = 0,
00376 PluginCodec_GenericParameter_BooleanArray,
00377 PluginCodec_GenericParameter_UnsignedMin,
00378 PluginCodec_GenericParameter_UnsignedMax,
00379 PluginCodec_GenericParameter_Unsigned32Min,
00380 PluginCodec_GenericParameter_Unsigned32Max,
00381 PluginCodec_GenericParameter_OctetString,
00382 PluginCodec_GenericParameter_GenericParameter,
00383
00384 PluginCodec_GenericParameter_logical = 0,
00385 PluginCodec_GenericParameter_booleanArray,
00386 PluginCodec_GenericParameter_unsignedMin,
00387 PluginCodec_GenericParameter_unsignedMax,
00388 PluginCodec_GenericParameter_unsigned32Min,
00389 PluginCodec_GenericParameter_unsigned32Max,
00390 PluginCodec_GenericParameter_octetString,
00391 PluginCodec_GenericParameter_genericParameter
00392 } type;
00393
00394 union {
00395 unsigned long integer;
00396 const char * octetstring;
00397 struct PluginCodec_H323GenericParameterDefinition *genericparameter;
00398 } value;
00399 };
00400
00401 struct PluginCodec_H323GenericCodecData
00402 {
00403
00404
00405 const char * standardIdentifier;
00406 unsigned int maxBitRate;
00407
00408
00409
00410 unsigned int nParameters;
00411
00412 const struct PluginCodec_H323GenericParameterDefinition *params;
00413 };
00414
00415
00416 struct PluginCodec_H323AudioGSMData {
00417 int comfortNoise:1;
00418 int scrambled:1;
00419 };
00420
00421 struct PluginCodec_H323AudioG7231AnnexC {
00422 unsigned char maxAl_sduAudioFrames;
00423 int silenceSuppression:1;
00424 int highRateMode0:6;
00425 int highRateMode1:6;
00426 int lowRateMode0:6;
00427 int lowRateMode1:6;
00428 int sidMode0:4;
00429 int sidMode1:4;
00430 };
00431
00432
00433 enum {
00434 PluginCodec_H323Codec_undefined,
00435 PluginCodec_H323Codec_programmed,
00436 PluginCodec_H323Codec_nonStandard,
00437 PluginCodec_H323Codec_generic,
00438
00439
00440 PluginCodec_H323AudioCodec_g711Alaw_64k,
00441 PluginCodec_H323AudioCodec_g711Alaw_56k,
00442 PluginCodec_H323AudioCodec_g711Ulaw_64k,
00443 PluginCodec_H323AudioCodec_g711Ulaw_56k,
00444 PluginCodec_H323AudioCodec_g722_64k,
00445 PluginCodec_H323AudioCodec_g722_56k,
00446 PluginCodec_H323AudioCodec_g722_48k,
00447 PluginCodec_H323AudioCodec_g7231,
00448 PluginCodec_H323AudioCodec_g728,
00449 PluginCodec_H323AudioCodec_g729,
00450 PluginCodec_H323AudioCodec_g729AnnexA,
00451 PluginCodec_H323AudioCodec_is11172,
00452 PluginCodec_H323AudioCodec_is13818Audio,
00453 PluginCodec_H323AudioCodec_g729wAnnexB,
00454 PluginCodec_H323AudioCodec_g729AnnexAwAnnexB,
00455 PluginCodec_H323AudioCodec_g7231AnnexC,
00456 PluginCodec_H323AudioCodec_gsmFullRate,
00457 PluginCodec_H323AudioCodec_gsmHalfRate,
00458 PluginCodec_H323AudioCodec_gsmEnhancedFullRate,
00459 PluginCodec_H323AudioCodec_g729Extensions,
00460
00461
00462 PluginCodec_H323VideoCodec_h261,
00463 PluginCodec_H323VideoCodec_h262,
00464 PluginCodec_H323VideoCodec_h263,
00465 PluginCodec_H323VideoCodec_is11172,
00466
00467
00468 PluginCodec_H323VideoCodec_Extended,
00469 PluginCodec_H323T38Codec,
00470
00471
00472 PluginCodec_H323Codec_NoH323 = 0xff,
00473 };
00474
00476
00477
00478
00479
00480
00481
00482 #define OpalPluginCodec_Identifer_AMR "0.0.8.245.1.1.1"
00483
00484
00485 #define OpalPluginCodec_Identifer_AMR_NB "0.0.8.245.1.1.9"
00486 #define OpalPluginCodec_Identifer_AMR_WB "0.0.8.245.1.1.10"
00487
00488
00489 #define OpalPluginCodec_Identifer_G7222 "0.0.7.7222.1.0"
00490
00491
00492 #define OpalPluginCodec_Identifer_iLBC "0.0.8.245.1.1.11"
00493
00494
00495
00496
00497
00498 #define OpalPluginCodec_Identifer_H264 "0.0.8.241.0.0.0.0"
00499 #define OpalPluginCodec_Identifer_H264_RFC3984 "0.0.8.241.0.0.0.1"
00500 #define OpalPluginCodec_Identifer_H264_RFC3984Int "0.0.8.241.0.0.0.2"
00501 #define OpalPluginCodec_Identifer_H264_Generic "0.0.8.241.0.0.1"
00502
00503
00504 #define OpalPluginCodec_Identifer_MPEG4 "0.0.8.245.1.0.0"
00505
00506
00508
00509
00510
00511
00512 #define PLUGINCODEC_SQCIF_MPI "SQCIF MPI"
00513 #define PLUGINCODEC_QCIF_MPI "QCIF MPI"
00514 #define PLUGINCODEC_CIF_MPI "CIF MPI"
00515 #define PLUGINCODEC_CIF4_MPI "CIF4 MPI"
00516 #define PLUGINCODEC_CIF16_MPI "CIF16 MPI"
00517
00518 #define PLUGINCODEC_MPI_DISABLED 33
00519
00520 #define PLUGINCODEC_MEDIA_PACKETIZATION "Media Packetization"
00521
00522 #ifndef STRINGIZE
00523 #define __INTERNAL_STRINGIZE__(v) #v
00524 #define STRINGIZE(v) __INTERNAL_STRINGIZE__(v)
00525 #endif
00526
00527
00529
00530
00531
00532
00533 #define PluginCodec_RTP_MaxPacketSize (1518-14-4-8-20-16) // Max Ethernet packet (1518 bytes) minus 802.3/CRC, 802.3, IP, UDP headers
00534 #define PluginCodec_RTP_MinHeaderSize (12)
00535 #define PluginCodec_RTP_MaxPayloadSize (PluginCodec_RTP_MaxPacketSize - PluginCodec_RTP_MinHeaderSize)
00536
00537 #define PluginCodec_RTP_GetHeaderLength(ptr) ((((unsigned char*)(ptr))[0] & 0x0f)*4 + PluginCodec_RTP_MinHeaderSize)
00538 #define PluginCodec_RTP_GetPayloadPtr(ptr) ((unsigned char*)(ptr) + PluginCodec_RTP_GetHeaderLength(ptr))
00539 #define PluginCodec_RTP_GetPayloadType(ptr) (((unsigned char*)(ptr))[1] & 0x7f)
00540 #define PluginCodec_RTP_SetPayloadType(ptr, type) (((unsigned char*)(ptr))[1] = (((unsigned char*)(ptr))[1] & 0x80) | (type & 0x7f))
00541 #define PluginCodec_RTP_GetMarker(ptr) ((((unsigned char*)(ptr))[1] & 0x80) != 0)
00542 #define PluginCodec_RTP_SetMarker(ptr, mark) (((unsigned char*)(ptr))[1] = (((unsigned char*)(ptr))[1] & 0x7f) | (mark != 0 ? 0x80 : 0))
00543 #define PluginCodec_RTP_GetTimestamp(ptr) ((((unsigned char*)(ptr))[4] << 24) | (((unsigned char*)(ptr))[5] << 16) | (((unsigned char*)(ptr))[6] << 8) | ((unsigned char*)(ptr))[7])
00544 #define PluginCodec_RTP_SetTimestamp(ptr, ts) ((((unsigned char*)(ptr))[4] = ((ts) >> 24)),(((unsigned char*)(ptr))[5] = ((ts) >> 16)),(((unsigned char*)(ptr))[6] = ((ts) >> 8)),(((unsigned char*)(ptr))[7] = (ts)))
00545
00546
00548
00549
00550
00551
00552 struct PluginCodec_Video_FrameHeader {
00553 unsigned int x;
00554 unsigned int y;
00555 unsigned int width;
00556 unsigned int height;
00557 };
00558
00559 #ifdef __cplusplus
00560 };
00561
00562 inline unsigned char * OPAL_VIDEO_FRAME_DATA_PTR(struct PluginCodec_Video_FrameHeader * base)
00563 { return (((unsigned char *)base) + sizeof(PluginCodec_Video_FrameHeader)); }
00564
00565 inline unsigned char * OPAL_VIDEO_FRAME_DATA_PTR(const PluginCodec_Video_FrameHeader * base)
00566 { return (((unsigned char *)base) + sizeof(PluginCodec_Video_FrameHeader)); }
00567
00568 extern "C" {
00569 #endif
00570
00571 #define PLUGIN_CODEC_VIDEO_SET_FRAME_SIZE_FN "set_frame_size" // argument is struct PluginCodec_VideoSetFrameInfo
00572 struct PluginCodec_Video_SetFrameInfo {
00573 int width;
00574 int height;
00575 };
00576
00577
00579
00580
00581
00582
00583 #ifdef OPAL_STATIC_CODEC
00584
00585 # undef PLUGIN_CODEC_DLL_API
00586 # define PLUGIN_CODEC_DLL_API static
00587 # define PLUGIN_CODEC_IMPLEMENT(name) \
00588 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
00589 { return PWLIB_PLUGIN_API_VERSION; } \
00590 static struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned ); \
00591 struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * p1, unsigned p2) \
00592 { return PLUGIN_CODEC_GET_CODEC_FN(p1,p2); } \
00593
00594 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
00595 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
00596 { return PWLIB_PLUGIN_API_VERSION; } \
00597 PLUGIN_CODEC_DLL_API struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * count, unsigned version) \
00598 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
00599
00600
00601 #else
00602
00603 # define PLUGIN_CODEC_IMPLEMENT(name) \
00604 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
00605 { return PWLIB_PLUGIN_API_VERSION; } \
00606
00607 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
00608 PLUGIN_CODEC_IMPLEMENT(name) \
00609 PLUGIN_CODEC_DLL_API struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned version) \
00610 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
00611
00612
00613 #endif
00614
00615 #ifdef __cplusplus
00616 };
00617 #endif
00618
00619
00620 #ifdef _MSC_VER
00621 #pragma warning(default:4201)
00622 #endif
00623
00624 #endif // __OPAL_CODECPLUGIN_H