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