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 #ifndef OPAL_CODEC_OPALPLUGIN_H
00044 #define OPAL_CODEC_OPALPLUGIN_H
00045
00046 #ifdef __cplusplus
00047 extern "C" {
00048 #endif
00049
00050 #ifndef _CRT_NONSTDC_NO_DEPRECATE
00051 #define _CRT_NONSTDC_NO_DEPRECATE 1
00052 #endif
00053
00054 #ifndef _CRT_SECURE_NO_WARNINGS
00055 #define _CRT_SECURE_NO_WARNINGS 1
00056 #endif
00057
00058 #include <time.h>
00059
00060 #ifdef _MSC_VER
00061 #pragma warning(disable:4201)
00062 #endif
00063
00064 #ifdef _MSC_VER
00065 # ifdef PLUGIN_CODEC_DLL_EXPORTS
00066 # define PLUGIN_CODEC_DLL_API __declspec(dllexport)
00067 # else
00068 # define PLUGIN_CODEC_DLL_API __declspec(dllimport)
00069 # endif
00070
00071 #if !defined(strcasecmp) && !defined(_WIN32_WCE)
00072 #define strcasecmp stricmp
00073 #endif
00074
00075 #else
00076
00077 #define PLUGIN_CODEC_DLL_API
00078
00079 #endif
00080
00081 #ifdef PWLIB_PLUGIN_API_VERSION
00082 #undef PWLIB_PLUGIN_API_VERSION
00083 #endif
00084 #define PWLIB_PLUGIN_API_VERSION 1
00085
00086 #define PLUGIN_CODEC_VERSION_FIRST 1 // initial version
00087 #define PLUGIN_CODEC_VERSION_WIDEBAND 2 // added wideband
00088 #define PLUGIN_CODEC_VERSION_VIDEO 3 // added video
00089 #define PLUGIN_CODEC_VERSION_FAX 4 // added fax
00090 #define PLUGIN_CODEC_VERSION_OPTIONS 5 // added options handling
00091 #define PLUGIN_CODEC_VERSION_INTERSECT 6 // added media option intersection merge functionality
00092 #define PLUGIN_CODEC_VERSION_H245_DEF_GEN_PARAM 7 // added suppression of H.245 generic parameters via default
00093
00094 #define PLUGIN_CODEC_VERSION PLUGIN_CODEC_VERSION_H245_DEF_GEN_PARAM // Always latest version
00095
00096 #define PLUGIN_CODEC_API_VER_FN PWLibPlugin_GetAPIVersion
00097 #define PLUGIN_CODEC_API_VER_FN_STR "PWLibPlugin_GetAPIVersion"
00098
00099 #define PLUGIN_CODEC_GET_CODEC_FN OpalCodecPlugin_GetCodecs
00100 #define PLUGIN_CODEC_GET_CODEC_FN_STR "OpalCodecPlugin_GetCodecs"
00101
00102 #define PLUGIN_CODEC_API_VER_FN_DECLARE \
00103 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
00104 { return PWLIB_PLUGIN_API_VERSION; }
00105
00106 enum {
00107 PluginCodec_License_None = 0,
00108 PluginCodec_Licence_None = PluginCodec_License_None,
00109 PluginCodec_License_GPL = 1,
00110 PluginCodec_License_MPL = 2,
00111 PluginCodec_License_Freeware = 3,
00112 PluginCodec_License_ResearchAndDevelopmentUseOnly = 4,
00113 PluginCodec_License_BSD = 5,
00114 PluginCodec_License_LGPL = 6,
00115
00116 PluginCodec_License_NoRoyalties = 0x7f,
00117
00118
00119 PluginCodec_License_RoyaltiesRequired = 0x80
00120 };
00121
00122 struct PluginCodec_information {
00123
00124 time_t timestamp_deprecated;
00125
00126 const char * sourceAuthor;
00127 const char * sourceVersion;
00128 const char * sourceEmail;
00129 const char * sourceURL;
00130 const char * sourceCopyright;
00131 const char * sourceLicense;
00132 unsigned char sourceLicenseCode;
00133
00134 const char * codecDescription;
00135 const char * codecAuthor;
00136 const char * codecVersion;
00137 const char * codecEmail;
00138 const char * codecURL;
00139 const char * codecCopyright;
00140 const char * codecLicense;
00141 unsigned short codecLicenseCode;
00142
00143
00144 const char * timestamp;
00145 };
00146
00147 enum PluginCodec_Flags {
00148 PluginCodec_MediaTypeMask = 0x000f,
00149 PluginCodec_MediaTypeAudio = 0x0000,
00150 PluginCodec_MediaTypeVideo = 0x0001,
00151 PluginCodec_MediaTypeAudioStreamed = 0x0002,
00152 PluginCodec_MediaTypeFax = 0x0003,
00153
00154 PluginCodec_InputTypeMask = 0x0010,
00155 PluginCodec_InputTypeRaw = 0x0000,
00156 PluginCodec_InputTypeRTP = 0x0010,
00157
00158 PluginCodec_OutputTypeMask = 0x0020,
00159 PluginCodec_OutputTypeRaw = 0x0000,
00160 PluginCodec_OutputTypeRTP = 0x0020,
00161
00162 PluginCodec_RTPTypeMask = 0x0040,
00163 PluginCodec_RTPTypeDynamic = 0x0000,
00164 PluginCodec_RTPTypeExplicit = 0x0040,
00165
00166 PluginCodec_RTPSharedMask = 0x0080,
00167 PluginCodec_RTPTypeNotShared = 0x0000,
00168 PluginCodec_RTPTypeShared = 0x0080,
00169
00170 PluginCodec_DecodeSilenceMask = 0x0100,
00171 PluginCodec_NoDecodeSilence = 0x0000,
00172 PluginCodec_DecodeSilence = 0x0100,
00173
00174 PluginCodec_EncodeSilenceMask = 0x0200,
00175 PluginCodec_NoEncodeSilence = 0x0000,
00176 PluginCodec_EncodeSilence = 0x0200,
00177
00178 PluginCodec_MediaExtensionMask = 0x0400,
00179 PluginCodec_MediaTypeExtVideo = 0x0400,
00180
00181 PluginCodec_ComfortNoiseMask = 0x0800,
00182 PluginCodec_ComfortNoise = 0x0800,
00183
00184 PluginCodec_ErrorConcealmentMask = 0x0800,
00185 PluginCodec_ErrorConcealment = 0x0800,
00186
00187 PluginCodec_EmptyPayloadMask = 0x1000,
00188 PluginCodec_EmptyPayload = 0x1000,
00189
00190 PluginCodec_OtherPayloadMask = 0x2000,
00191 PluginCodec_OtherPayload = 0x2000,
00192
00193 PluginCodec_BitsPerSamplePos = 12,
00194 PluginCodec_BitsPerSampleMask = 0xf000,
00195
00196 PluginCodec_ChannelsPos = 16,
00197 PluginCodec_ChannelsMask = 0x003f0000
00198 };
00199
00200 #define PluginCodec_SetChannels(n) (((n-1)<<PluginCodec_ChannelsPos)&PluginCodec_ChannelsMask)
00201
00202
00203 enum PluginCodec_CoderFlags {
00204 PluginCodec_CoderSilenceFrame = 1,
00205 PluginCodec_CoderForceIFrame = 2,
00206 PluginCodec_CoderPacketLoss = 4
00207 };
00208
00209 enum PluginCodec_ReturnCoderFlags {
00210 PluginCodec_ReturnCoderLastFrame = 1,
00211 PluginCodec_ReturnCoderIFrame = 2,
00212 PluginCodec_ReturnCoderRequestIFrame = 4,
00213 PluginCodec_ReturnCoderBufferTooSmall = 8
00214
00215 };
00216
00217 struct PluginCodec_Definition;
00218
00219
00220
00221 #define PLUGINCODEC_CONTROL_VALID_FOR_PROTOCOL "valid_for_protocol"
00222 #define PLUGINCODEC_CONTROL_GET_CODEC_OPTIONS "get_codec_options"
00223 #define PLUGINCODEC_CONTROL_FREE_CODEC_OPTIONS "free_codec_options"
00224 #define PLUGINCODEC_CONTROL_GET_OUTPUT_DATA_SIZE "get_output_data_size"
00225 #define PLUGINCODEC_CONTROL_SET_CODEC_OPTIONS "set_codec_options"
00226 #define PLUGINCODEC_CONTROL_GET_ACTIVE_OPTIONS "get_active_options"
00227 #define PLUGINCODEC_CONTROL_TO_NORMALISED_OPTIONS "to_normalised_options"
00228 #define PLUGINCODEC_CONTROL_TO_CUSTOMISED_OPTIONS "to_customised_options"
00229 #define PLUGINCODEC_CONTROL_SET_INSTANCE_ID "set_instance_id"
00230 #define PLUGINCODEC_CONTROL_SET_LOG_FUNCTION "set_log_function"
00231 #define PLUGINCODEC_CONTROL_GET_STATISTICS "get_statistics"
00232 #define PLUGINCODEC_CONTROL_TERMINATE_CODEC "terminate_codec"
00233
00234
00235
00236
00237
00238
00239
00240 typedef int (*PluginCodec_LogFunction)(unsigned level,
00241 const char * file,
00242 unsigned line,
00243 const char * section,
00244 const char * log);
00245
00246
00247 struct PluginCodec_ControlDefn {
00248 const char * name;
00249 int (*control)(const struct PluginCodec_Definition * codec, void * context,
00250 const char * name, void * parm, unsigned * parmLen);
00251
00252 };
00253
00254 enum PluginCodec_OptionTypes {
00255 PluginCodec_StringOption,
00256 PluginCodec_BoolOption,
00257 PluginCodec_IntegerOption,
00258 PluginCodec_RealOption,
00259 PluginCodec_EnumOption,
00260 PluginCodec_OctetsOption,
00261 PluginCodec_NumOptionTypes,
00262 };
00263
00264 enum PluginCodec_OptionMerge {
00265 PluginCodec_NoMerge,
00266 PluginCodec_MinMerge,
00267 PluginCodec_MaxMerge,
00268 PluginCodec_EqualMerge,
00269 PluginCodec_NotEqualMerge,
00270 PluginCodec_AlwaysMerge,
00271 PluginCodec_CustomMerge,
00272 PluginCodec_IntersectionMerge,
00273
00274 PluginCodec_AndMerge = PluginCodec_MinMerge,
00275 PluginCodec_OrMerge = PluginCodec_MaxMerge
00276 };
00277
00278 #define PluginCodec_H245_Collapsing 0x40000000
00279 #define PluginCodec_H245_NonCollapsing 0x20000000
00280 #define PluginCodec_H245_Unsigned32 0x10000000
00281 #define PluginCodec_H245_BooleanArray 0x08000000
00282 #define PluginCodec_H245_TCS 0x04000000
00283 #define PluginCodec_H245_OLC 0x02000000
00284 #define PluginCodec_H245_ReqMode 0x01000000
00285 #define PluginCodec_H245_OrdinalMask 0x0000ffff
00286 #define PluginCodec_H245_PositionMask 0x00ff0000
00287 #define PluginCodec_H245_PositionShift 16
00288
00289 typedef int (*PluginCodec_MergeFunction)(char ** result, const char * dest, const char * src);
00290 typedef void (*PluginCodec_FreeFunction)(char * string);
00291
00292 struct PluginCodec_Option {
00293
00294 enum PluginCodec_OptionTypes m_type;
00295 const char * m_name;
00296 unsigned m_readOnly;
00297 enum PluginCodec_OptionMerge m_merge;
00298 const char * m_value;
00299 const char * m_FMTPName;
00300 const char * m_FMTPDefault;
00301 int m_H245Generic;
00302 const char * m_minimum;
00303 const char * m_maximum;
00304 PluginCodec_MergeFunction m_mergeFunction;
00305 PluginCodec_FreeFunction m_freeFunction;
00306 const char * m_H245Default;
00307 };
00308
00309
00310
00311 #define PLUGINCODEC_OPTION_NEEDS_JITTER "Needs Jitter"
00312 #define PLUGINCODEC_OPTION_CLOCK_RATE "Clock Rate"
00313 #define PLUGINCODEC_OPTION_CHANNELS "Channels"
00314 #define PLUGINCODEC_OPTION_FRAME_TIME "Frame Time"
00315 #define PLUGINCODEC_OPTION_MAX_FRAME_SIZE "Max Frame Size"
00316 #define PLUGINCODEC_OPTION_MAX_TX_PACKET_SIZE "Max Tx Packet Size"
00317 #define PLUGINCODEC_OPTION_MAX_BIT_RATE "Max Bit Rate"
00318 #define PLUGINCODEC_OPTION_TARGET_BIT_RATE "Target Bit Rate"
00319 #define PLUGINCODEC_OPTION_RATE_CONTROL_PERIOD "Rate Control Period"
00320 #define PLUGINCODEC_OPTION_RX_FRAMES_PER_PACKET "Rx Frames Per Packet"
00321 #define PLUGINCODEC_OPTION_TX_FRAMES_PER_PACKET "Tx Frames Per Packet"
00322 #define PLUGINCODEC_OPTION_FRAME_WIDTH "Frame Width"
00323 #define PLUGINCODEC_OPTION_FRAME_HEIGHT "Frame Height"
00324 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_WIDTH "Min Rx Frame Width"
00325 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_HEIGHT "Min Rx Frame Height"
00326 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_WIDTH "Max Rx Frame Width"
00327 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_HEIGHT "Max Rx Frame Height"
00328 #define PLUGINCODEC_OPTION_TEMPORAL_SPATIAL_TRADE_OFF "Temporal Spatial Trade Off"
00329 #define PLUGINCODEC_OPTION_TX_KEY_FRAME_PERIOD "Tx Key Frame Period"
00330
00331 #define PLUGINCODEC_OPTION_PROTOCOL "Protocol"
00332 #define PLUGINCODEC_OPTION_PROTOCOL_H323 "H.323"
00333 #define PLUGINCODEC_OPTION_PROTOCOL_SIP "SIP"
00334
00335
00336
00337
00338 struct PluginCodec_Definition {
00339 unsigned int version;
00340
00341
00342 const struct PluginCodec_information * info;
00343
00344 unsigned int flags;
00345
00346
00347
00348
00349
00350 const char * descr;
00351
00352 const char * sourceFormat;
00353 const char * destFormat;
00354
00355 const void * userData;
00356
00357 unsigned int sampleRate;
00358 unsigned int bitsPerSec;
00359 unsigned int usPerFrame;
00360
00361 union _parm {
00362 struct _audio {
00363 unsigned int samplesPerFrame;
00364 unsigned int bytesPerFrame;
00365 unsigned int recommendedFramesPerPacket;
00366 unsigned int maxFramesPerPacket;
00367 } audio;
00368 struct _video {
00369 unsigned int maxFrameWidth;
00370 unsigned int maxFrameHeight;
00371 unsigned int recommendedFrameRate;
00372 unsigned int maxFrameRate;
00373 } video;
00374 } parm;
00375
00376 unsigned char rtpPayload;
00377 const char * sdpFormat;
00378
00379 void * (*createCodec)(const struct PluginCodec_Definition * codec);
00380 void (*destroyCodec) (const struct PluginCodec_Definition * codec, void * context);
00381 int (*codecFunction) (const struct PluginCodec_Definition * codec, void * context,
00382 const void * from, unsigned * fromLen,
00383 void * to, unsigned * toLen,
00384 unsigned int * flag);
00385 struct PluginCodec_ControlDefn * codecControls;
00386
00387
00388 unsigned char h323CapabilityType;
00389 const void * h323CapabilityData;
00390
00391
00392
00393
00394
00395 };
00396
00397 typedef const struct PluginCodec_Definition * (* PluginCodec_GetCodecFunction)(unsigned int *, unsigned int);
00398 typedef unsigned (* PluginCodec_GetAPIVersionFunction)();
00399
00400
00402
00403 #define PLUGINCODEC_RAW_AUDIO "L16"
00404 #define PLUGINCODEC_RAW_VIDEO "YUV420P"
00405 #define PLUGINCODEC_VIDEO_CLOCK 90000
00406 #define PLUGINCODEC_MAX_FRAME_RATE 30
00407
00408 #define PLUGINCODEC_CIF_WIDTH 352
00409 #define PLUGINCODEC_CIF_HEIGHT 288
00410
00411 #define PLUGINCODEC_CIF4_WIDTH (PLUGINCODEC_CIF_WIDTH*2)
00412 #define PLUGINCODEC_CIF4_HEIGHT (PLUGINCODEC_CIF_HEIGHT*2)
00413
00414 #define PLUGINCODEC_CIF16_WIDTH (PLUGINCODEC_CIF_WIDTH*4)
00415 #define PLUGINCODEC_CIF16_HEIGHT (PLUGINCODEC_CIF_HEIGHT*4)
00416
00417 #define PLUGINCODEC_QCIF_WIDTH (PLUGINCODEC_CIF_WIDTH/2)
00418 #define PLUGINCODEC_QCIF_HEIGHT (PLUGINCODEC_CIF_HEIGHT/2)
00419
00420 #define PLUGINCODEC_QCIF4_WIDTH (PLUGINCODEC_CIF4_WIDTH/2)
00421 #define PLUGINCODEC_QCIF4_HEIGHT (PLUGINCODEC_CIF4_HEIGHT/2)
00422
00423 #define PLUGINCODEC_SQCIF_WIDTH 128
00424 #define PLUGINCODEC_SQCIF_HEIGHT 96
00425
00426
00427 #ifndef __TIMESTAMP__
00428 #define __TIMESTAMP__ "0"
00429 #endif
00430
00431 #define PLUGINCODEC_LICENSE(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15) \
00432 static struct PluginCodec_information MyLicenseInfo = { 0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,__TIMESTAMP__ }
00433
00434
00436 #define PLUGINCODEC_CODEC_PAIR(MediaFormat, \
00437 PayloadName, \
00438 Description, \
00439 SampleRate, \
00440 BitsPerSecond, \
00441 FrameTime, \
00442 p1,p2,p3,p4, \
00443 PayloadType, \
00444 H323type, \
00445 H323data, \
00446 CreateEncoder, \
00447 DestroyEncoder, \
00448 EncodeMedia, \
00449 CreateDecoder, \
00450 DestroyDecoder, \
00451 DecodeMedia, \
00452 ControlsTable, \
00453 Flags, \
00454 RawFormat, \
00455 UserData \
00456 ) \
00457 { \
00458 PLUGIN_CODEC_VERSION, &MyLicenseInfo, Flags, Description, RawFormat, MediaFormat, UserData, \
00459 SampleRate, BitsPerSecond, FrameTime, {{ p1,p2,p3,p4 }}, PayloadType, PayloadName, \
00460 CreateEncoder, DestroyEncoder, EncodeMedia, ControlsTable, H323type, H323data \
00461 }, \
00462 { \
00463 PLUGIN_CODEC_VERSION, &MyLicenseInfo, Flags, Description, MediaFormat, RawFormat, UserData, \
00464 SampleRate, BitsPerSecond, FrameTime, {{ p1,p2,p3,p4 }}, PayloadType, PayloadName, \
00465 CreateDecoder, DestroyDecoder, DecodeMedia, ControlsTable, H323type, H323data \
00466 }
00467
00468 #define PLUGINCODEC_AUDIO_CODEC(MediaFormat, \
00469 PayloadName, \
00470 Description, \
00471 SampleRate, \
00472 BitsPerSecond, \
00473 SamplesPerFrame, \
00474 RecFramesPerPacket, \
00475 MaxFramesPerPacket, \
00476 RtpFlags, \
00477 PayloadType, \
00478 H323type, \
00479 H323data, \
00480 CreateEncoder, \
00481 DestroyEncoder, \
00482 EncodeAudio, \
00483 CreateDecoder, \
00484 DestroyDecoder, \
00485 DecodeAudio, \
00486 ControlsTable \
00487 ) \
00488 PLUGINCODEC_CODEC_PAIR(MediaFormat, \
00489 PayloadName, \
00490 Description, \
00491 SampleRate, \
00492 BitsPerSecond, \
00493 (SamplesPerFrame)*1000000/(SampleRate), \
00494 SamplesPerFrame, \
00495 (BitsPerSecond)*(SampleRate)/(SamplesPerFrame)/8, \
00496 RecFramesPerPacket, \
00497 MaxFramesPerPacket, \
00498 PayloadType, \
00499 H323type, \
00500 H323data, \
00501 CreateEncoder, \
00502 DestroyEncoder, \
00503 EncodeAudio, \
00504 CreateDecoder, \
00505 DestroyDecoder, \
00506 DecodeAudio, \
00507 ControlsTable, \
00508 PluginCodec_MediaTypeAudio | \
00509 PluginCodec_InputTypeRaw | \
00510 PluginCodec_OutputTypeRaw | \
00511 (RtpFlags), \
00512 PLUGINCODEC_RAW_AUDIO, \
00513 NULL)
00514
00515 #define PLUGINCODEC_ONE_AUDIO_CODEC(MediaFormat, \
00516 PayloadName, \
00517 Description, \
00518 SampleRate, \
00519 BitsPerSecond, \
00520 SamplesPerFrame, \
00521 RecFramesPerPacket, \
00522 MaxFramesPerPacket, \
00523 RtpFlags, \
00524 PayloadType, \
00525 H323type, \
00526 H323data \
00527 ) \
00528 static struct PluginCodec_Definition CodecDefinitionTable[] = { \
00529 PLUGINCODEC_AUDIO_CODEC(MediaFormat, \
00530 PayloadName, \
00531 Description, \
00532 SampleRate, \
00533 BitsPerSecond, \
00534 SamplesPerFrame, \
00535 RecFramesPerPacket, \
00536 MaxFramesPerPacket, \
00537 RtpFlags, \
00538 PayloadType, \
00539 H323type, \
00540 H323data, \
00541 MyCreateEncoder, \
00542 MyDestroyEncoder, \
00543 MyEncodeAudio, \
00544 MyCreateDecoder, \
00545 MyDestroyDecoder, \
00546 MyDecodeAudio, \
00547 MyControlsTable \
00548 ) \
00549 }
00550
00551 #define PLUGINCODEC_VIDEO_CODEC(MediaFormat, \
00552 PayloadName, \
00553 Description, \
00554 BitsPerSecond, \
00555 MaxWidth, \
00556 MaxHeight, \
00557 RtpFlags, \
00558 PayloadType, \
00559 H323type, \
00560 H323data, \
00561 CreateEncoder, \
00562 DestroyEncoder, \
00563 EncodeVideo, \
00564 CreateDecoder, \
00565 DestroyDecoder, \
00566 DecodeVideo, \
00567 ControlsTable \
00568 ) \
00569 PLUGINCODEC_CODEC_PAIR(MediaFormat, \
00570 PayloadName, \
00571 Description, \
00572 SampleRate, \
00573 BitsPerSecond, \
00574 PLUGINCODEC_VIDEO_CLOCK, \
00575 BitsPerSecond, \
00576 1000000/PLUGINCODEC_MAX_FRAME_RATE, \
00577 MaxWidth, \
00578 MaxHeight, \
00579 0,PLUGINCODEC_MAX_FRAME_RATE, \
00580 PayloadType, \
00581 H323type, \
00582 H323data, \
00583 CreateEncoder, \
00584 DestroyEncoder, \
00585 EncodeVideo, \
00586 CreateDecoder, \
00587 DestroyDecoder, \
00588 DecodeVideo, \
00589 ControlsTable, \
00590 PluginCodec_MediaTypeVideo | \
00591 PluginCodec_InputTypeRTP | \
00592 PluginCodec_OutputTypeRTP | \
00593 (RtpFlags), \
00594 PLUGINCODEC_RAW_VIDEO, \
00595 NULL)
00596
00597 #define PLUGINCODEC_ONE_VIDEO_CODEC(MediaFormat, \
00598 PayloadName, \
00599 Description, \
00600 BitsPerSecond, \
00601 MaxWidth, \
00602 MaxHeight, \
00603 RtpFlags, \
00604 PayloadType, \
00605 H323type, \
00606 H323data \
00607 ) \
00608 static struct PluginCodec_Definition CodecDefinitionTable[] = { \
00609 PLUGINCODEC_VIDEO_CODEC(MediaFormat, \
00610 PayloadName, \
00611 Description, \
00612 BitsPerSecond, \
00613 MaxWidth, \
00614 MaxHeight, \
00615 RtpFlags, \
00616 PayloadType, \
00617 H323type, \
00618 H323data, \
00619 CreateEncoder, \
00620 DestroyEncoder, \
00621 EncodeAudio, \
00622 CreateDecoder, \
00623 DestroyDecoder, \
00624 DecodeAudio, \
00625 ControlsTable \
00626 ) \
00627 }
00628
00629
00631
00632
00633
00634
00635
00636 struct PluginCodec_H323CapabilityExtension {
00637 unsigned int index;
00638 void * data;
00639 unsigned dataLength;
00640 };
00641
00642 struct PluginCodec_H323NonStandardCodecData {
00643 const char * objectId;
00644 unsigned char t35CountryCode;
00645 unsigned char t35Extension;
00646 unsigned short manufacturerCode;
00647 const unsigned char * data;
00648 unsigned int dataLength;
00649 int (*capabilityMatchFunction)(struct PluginCodec_H323NonStandardCodecData *);
00650 };
00651
00652
00653 struct PluginCodec_H323GenericParameterDefinition
00654 {
00655
00656
00657
00658
00659
00660 #ifndef SOLARIS
00661 struct {
00662 #endif
00663 int collapsing:1;
00664 int excludeTCS:1;
00665 int excludeOLC:1;
00666 int excludeReqMode:1;
00667 int readOnly:1;
00668 #ifndef SOLARIS
00669 };
00670 #endif
00671
00672 unsigned int id;
00673
00674 enum PluginCodec_H323GenericParameterType {
00675
00676
00677
00678 PluginCodec_GenericParameter_Logical = 0,
00679 PluginCodec_GenericParameter_BooleanArray,
00680 PluginCodec_GenericParameter_UnsignedMin,
00681 PluginCodec_GenericParameter_UnsignedMax,
00682 PluginCodec_GenericParameter_Unsigned32Min,
00683 PluginCodec_GenericParameter_Unsigned32Max,
00684 PluginCodec_GenericParameter_OctetString,
00685 PluginCodec_GenericParameter_GenericParameter,
00686
00687 PluginCodec_GenericParameter_logical = 0,
00688 PluginCodec_GenericParameter_booleanArray,
00689 PluginCodec_GenericParameter_unsignedMin,
00690 PluginCodec_GenericParameter_unsignedMax,
00691 PluginCodec_GenericParameter_unsigned32Min,
00692 PluginCodec_GenericParameter_unsigned32Max,
00693 PluginCodec_GenericParameter_octetString,
00694 PluginCodec_GenericParameter_genericParameter
00695 } type;
00696
00697 union {
00698 unsigned long integer;
00699 const char * octetstring;
00700 struct PluginCodec_H323GenericParameterDefinition *genericparameter;
00701 } value;
00702 };
00703
00704 struct PluginCodec_H323GenericCodecData
00705 {
00706
00707
00708 const char * standardIdentifier;
00709 unsigned int maxBitRate;
00710
00711
00712
00713 unsigned int nParameters;
00714
00715 const struct PluginCodec_H323GenericParameterDefinition *params;
00716 };
00717
00718
00719 struct PluginCodec_H323AudioGSMData {
00720 int comfortNoise:1;
00721 int scrambled:1;
00722 };
00723
00724 struct PluginCodec_H323AudioG7231AnnexC {
00725 unsigned char maxAl_sduAudioFrames;
00726 int silenceSuppression:1;
00727 int highRateMode0:6;
00728 int highRateMode1:6;
00729 int lowRateMode0:6;
00730 int lowRateMode1:6;
00731 int sidMode0:4;
00732 int sidMode1:4;
00733 };
00734
00735
00736 enum {
00737 PluginCodec_H323Codec_undefined,
00738 PluginCodec_H323Codec_programmed,
00739 PluginCodec_H323Codec_nonStandard,
00740 PluginCodec_H323Codec_generic,
00741
00742
00743 PluginCodec_H323AudioCodec_g711Alaw_64k,
00744 PluginCodec_H323AudioCodec_g711Alaw_56k,
00745 PluginCodec_H323AudioCodec_g711Ulaw_64k,
00746 PluginCodec_H323AudioCodec_g711Ulaw_56k,
00747 PluginCodec_H323AudioCodec_g722_64k,
00748 PluginCodec_H323AudioCodec_g722_56k,
00749 PluginCodec_H323AudioCodec_g722_48k,
00750 PluginCodec_H323AudioCodec_g7231,
00751 PluginCodec_H323AudioCodec_g728,
00752 PluginCodec_H323AudioCodec_g729,
00753 PluginCodec_H323AudioCodec_g729AnnexA,
00754 PluginCodec_H323AudioCodec_is11172,
00755 PluginCodec_H323AudioCodec_is13818Audio,
00756 PluginCodec_H323AudioCodec_g729wAnnexB,
00757 PluginCodec_H323AudioCodec_g729AnnexAwAnnexB,
00758 PluginCodec_H323AudioCodec_g7231AnnexC,
00759 PluginCodec_H323AudioCodec_gsmFullRate,
00760 PluginCodec_H323AudioCodec_gsmHalfRate,
00761 PluginCodec_H323AudioCodec_gsmEnhancedFullRate,
00762 PluginCodec_H323AudioCodec_g729Extensions,
00763
00764
00765 PluginCodec_H323VideoCodec_h261,
00766 PluginCodec_H323VideoCodec_h262,
00767 PluginCodec_H323VideoCodec_h263,
00768 PluginCodec_H323VideoCodec_is11172,
00769
00770
00771 PluginCodec_H323VideoCodec_Extended,
00772 PluginCodec_H323T38Codec,
00773
00774
00775 PluginCodec_H323Codec_NoH323 = 0xff,
00776 };
00777
00779
00780
00781
00782
00783
00784
00785 #define OpalPluginCodec_Identifer_AMR "0.0.8.245.1.1.1"
00786
00787
00788 #define OpalPluginCodec_Identifer_AMR_NB "0.0.8.245.1.1.9"
00789 #define OpalPluginCodec_Identifer_AMR_WB "0.0.8.245.1.1.10"
00790
00791
00792 #define OpalPluginCodec_Identifer_G7221 "0.0.7.7221.1.0"
00793 #define OpalPluginCodec_Identifer_G7221ext "0.0.7.7221.1.1.0"
00794
00795
00796 #define OpalPluginCodec_Identifer_G7222 "0.0.7.7222.1.0"
00797
00798
00799 #define OpalPluginCodec_Identifer_iLBC "0.0.8.245.1.1.11"
00800
00801
00802
00803
00804
00805 #define OpalPluginCodec_Identifer_H264_Aligned "0.0.8.241.0.0.0.0"
00806 #define OpalPluginCodec_Identifer_H264_NonInterleaved "0.0.8.241.0.0.0.1"
00807 #define OpalPluginCodec_Identifer_H264_Interleaved "0.0.8.241.0.0.0.2"
00808 #define OpalPluginCodec_Identifer_H264_Generic "0.0.8.241.0.0.1"
00809
00810
00811 #define OpalPluginCodec_Identifer_MPEG4 "0.0.8.245.1.0.0"
00812
00813
00815
00816
00817
00818
00819 #define PLUGINCODEC_SQCIF_MPI "SQCIF MPI"
00820 #define PLUGINCODEC_QCIF_MPI "QCIF MPI"
00821 #define PLUGINCODEC_CIF_MPI "CIF MPI"
00822 #define PLUGINCODEC_CIF4_MPI "CIF4 MPI"
00823 #define PLUGINCODEC_CIF16_MPI "CIF16 MPI"
00824 #define PLUGINCODEC_CUSTOM_MPI "Custom MPI"
00825
00826 #define PLUGINCODEC_MPI_DISABLED 33
00827
00828 #define PLUGINCODEC_MEDIA_PACKETIZATION "Media Packetization"
00829 #define PLUGINCODEC_MEDIA_PACKETIZATIONS "Media Packetizations"
00830
00831 #define H261_ANNEX_D "Annex D - Still Image Transmit"
00832 #define H263_ANNEX_D "Annex D - Unrestricted Motion Vector"
00833 #define H263_ANNEX_F "Annex F - Advanced Prediction"
00834 #define H263_ANNEX_I "Annex I - Advanced INTRA Coding"
00835 #define H263_ANNEX_J "Annex J - Deblocking Filter"
00836 #define H263_ANNEX_K "Annex K - Slice Structure"
00837 #define H263_ANNEX_N "Annex N - Reference Picture Selection"
00838 #define H263_ANNEX_S "Annex S - Alternative INTER VLC"
00839 #define H263_ANNEX_T "Annex T - Modified Quantization"
00840
00841 #ifndef STRINGIZE
00842 #define __INTERNAL_STRINGIZE__(v) #v
00843 #define STRINGIZE(v) __INTERNAL_STRINGIZE__(v)
00844 #endif
00845
00846
00848
00849
00850
00851
00852 #define PluginCodec_RTP_MaxPacketSize (1518-14-4-8-20-16) // Max Ethernet packet (1518 bytes) minus 802.3/CRC, 802.3, IP, UDP headers
00853 #define PluginCodec_RTP_MinHeaderSize (12)
00854 #define PluginCodec_RTP_MaxPayloadSize (PluginCodec_RTP_MaxPacketSize - PluginCodec_RTP_MinHeaderSize)
00855
00856 #define PluginCodec_RTP_GetWORD(ptr, off) ((((unsigned char*)(ptr))[off] << 8) | ((unsigned char*)(ptr))[off+1])
00857
00858 #define PluginCodec_RTP_GetDWORD(ptr, off) ((((unsigned char*)(ptr))[off ] << 24)|\
00859 (((unsigned char*)(ptr))[off+1] << 16)|\
00860 (((unsigned char*)(ptr))[off+2] << 8 )|\
00861 ((unsigned char*)(ptr))[off+3])
00862
00863 #define PluginCodec_RTP_SetWORD(ptr, off, val) ((((unsigned char*)(ptr))[off ] = (unsigned char)((val) >> 8 )),\
00864 (((unsigned char*)(ptr))[off+1] = (unsigned char) (val) ))
00865
00866 #define PluginCodec_RTP_SetDWORD(ptr, off, val) ((((unsigned char*)(ptr))[off ] = (unsigned char)((val) >> 24)),\
00867 (((unsigned char*)(ptr))[off+1] = (unsigned char)((val) >> 16)),\
00868 (((unsigned char*)(ptr))[off+2] = (unsigned char)((val) >> 8 )),\
00869 (((unsigned char*)(ptr))[off+3] = (unsigned char) (val) ))
00870
00871 #define PluginCodec_RTP_GetCSRCHdrLength(ptr) ((((unsigned char*)(ptr))[0] & 0x0f)*4 + PluginCodec_RTP_MinHeaderSize)
00872 #define PluginCodec_RTP_GetExtHdrLength(ptr) ((((unsigned char*)(ptr))[0] & 0x10) ? (PluginCodec_RTP_GetWORD(ptr, PluginCodec_RTP_GetCSRCHdrLength(ptr)+2)*4+4) : 0)
00873
00874 #define PluginCodec_RTP_GetHeaderLength(ptr) (PluginCodec_RTP_GetCSRCHdrLength(ptr) + PluginCodec_RTP_GetExtHdrLength(ptr))
00875 #define PluginCodec_RTP_GetPayloadPtr(ptr) ((unsigned char*)(ptr) + PluginCodec_RTP_GetHeaderLength(ptr))
00876 #define PluginCodec_RTP_GetPayloadType(ptr) (((unsigned char*)(ptr))[1] & 0x7f)
00877 #define PluginCodec_RTP_SetPayloadType(ptr, type) (((unsigned char*)(ptr))[1] = (unsigned char)((((unsigned char*)(ptr))[1] & 0x80) | (type & 0x7f)))
00878 #define PluginCodec_RTP_GetMarker(ptr) ((((unsigned char*)(ptr))[1] & 0x80) != 0)
00879 #define PluginCodec_RTP_SetMarker(ptr, mark) (((unsigned char*)(ptr))[1] = (unsigned char)((((unsigned char*)(ptr))[1] & 0x7f) | (mark != 0 ? 0x80 : 0)))
00880 #define PluginCodec_RTP_GetTimestamp(ptr) PluginCodec_RTP_GetDWORD(ptr, 4)
00881 #define PluginCodec_RTP_SetTimestamp(ptr, ts) PluginCodec_RTP_SetDWORD(ptr, 4, ts)
00882 #define PluginCodec_RTP_GetSequenceNumber(ptr) PluginCodec_RTP_GetWORD(ptr, 2)
00883 #define PluginCodec_RTP_SetSequenceNumber(ptr, sn) PluginCodec_RTP_SetWORD(ptr, 2, sn)
00884 #define PluginCodec_RTP_GetSSRC(ptr) PluginCodec_RTP_GetDWORD(ptr, 8)
00885 #define PluginCodec_RTP_SetSSRC(ptr, ssrc) PluginCodec_RTP_SetDWORD(ptr, 8, ssrc)
00886
00887
00888
00890
00891
00892
00893
00894 struct PluginCodec_Video_FrameHeader {
00895 unsigned int x;
00896 unsigned int y;
00897 unsigned int width;
00898 unsigned int height;
00899 };
00900
00901 #ifdef __cplusplus
00902 };
00903
00904 inline unsigned char * OPAL_VIDEO_FRAME_DATA_PTR(struct PluginCodec_Video_FrameHeader * base)
00905 { return (((unsigned char *)base) + sizeof(PluginCodec_Video_FrameHeader)); }
00906
00907 inline unsigned char * OPAL_VIDEO_FRAME_DATA_PTR(const PluginCodec_Video_FrameHeader * base)
00908 { return (((unsigned char *)base) + sizeof(PluginCodec_Video_FrameHeader)); }
00909
00910 extern "C" {
00911 #endif
00912
00913
00915
00916
00917
00918
00919 #ifdef OPAL_STATIC_CODEC
00920
00921 # undef PLUGIN_CODEC_DLL_API
00922 # define PLUGIN_CODEC_DLL_API static
00923 # define PLUGIN_CODEC_IMPLEMENT(name) \
00924 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
00925 { return PWLIB_PLUGIN_API_VERSION; } \
00926 static const struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned ); \
00927 struct const PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * p1, unsigned p2) \
00928 { return PLUGIN_CODEC_GET_CODEC_FN(p1,p2); } \
00929
00930 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
00931 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
00932 { return PWLIB_PLUGIN_API_VERSION; } \
00933 PLUGIN_CODEC_DLL_API const struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * count, unsigned version) \
00934 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
00935
00936
00937 #else
00938
00939 # define PLUGIN_CODEC_IMPLEMENT(name) \
00940 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
00941 { return PWLIB_PLUGIN_API_VERSION; } \
00942
00943 # define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
00944 PLUGIN_CODEC_IMPLEMENT(name) \
00945 PLUGIN_CODEC_DLL_API const struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned version) \
00946 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
00947
00948
00949 #endif
00950
00951 #ifdef __cplusplus
00952 };
00953 #endif
00954
00955
00956 #ifdef _MSC_VER
00957 #pragma warning(default:4201)
00958 #endif
00959
00960 #endif // OPAL_CODEC_OPALPLUGIN_H