OPAL Version 3.10.2
opalplugin.h
Go to the documentation of this file.
00001 /*
00002  * opalplugins.h
00003  *
00004  * OPAL codec plugins handler
00005  *
00006  * Open Phone Abstraction Library (OPAL)
00007  * Formally known as the Open H323 project.
00008  *
00009  * Copyright (C) 2004-2006 Post Increment
00010  *
00011  * The contents of this file are subject to the Mozilla Public License
00012  * Version 1.0 (the "License"); you may not use this file except in
00013  * compliance with the License. You may obtain a copy of the License at
00014  * http://www.mozilla.org/MPL/
00015  *
00016  * Software distributed under the License is distributed on an "AS IS"
00017  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00018  * the License for the specific language governing rights and limitations
00019  * under the License.
00020  *
00021  * The Original Code is Open Phone Abstraction Library.
00022  *
00023  * The Initial Developer of the Original Code is Post Increment
00024  *
00025  * Contributor(s): ______________________________________.
00026  *
00027  * $Revision: 26053 $
00028  * $Author: rjongbloed $
00029  * $Date: 2011-06-20 03:40:20 -0500 (Mon, 20 Jun 2011) $
00030  */
00031 
00032 #ifndef OPAL_CODEC_OPALPLUGIN_H
00033 #define OPAL_CODEC_OPALPLUGIN_H
00034 
00035 #ifdef __cplusplus
00036 extern "C" {
00037 #endif
00038 
00039 #ifndef _CRT_NONSTDC_NO_DEPRECATE
00040 #define _CRT_NONSTDC_NO_DEPRECATE 1
00041 #endif
00042 
00043 #ifndef _CRT_SECURE_NO_WARNINGS
00044 #define _CRT_SECURE_NO_WARNINGS 1
00045 #endif
00046 
00047 #include <time.h>
00048 
00049 #ifdef _MSC_VER
00050 #pragma warning(disable:4201)
00051 #endif
00052 
00053 #ifdef _WIN32
00054 #  ifdef PLUGIN_CODEC_DLL_EXPORTS
00055 #    define PLUGIN_CODEC_DLL_API __declspec(dllexport)
00056 #  else
00057 #    define PLUGIN_CODEC_DLL_API __declspec(dllimport)
00058 #  endif
00059 
00060 #if !defined(strcasecmp) && !defined(_WIN32_WCE)
00061 #define strcasecmp stricmp
00062 #endif
00063 
00064 #else
00065 
00066 #define PLUGIN_CODEC_DLL_API
00067 
00068 #endif
00069 
00070 #ifdef PWLIB_PLUGIN_API_VERSION
00071 #undef PWLIB_PLUGIN_API_VERSION
00072 #endif
00073 #define PWLIB_PLUGIN_API_VERSION 1
00074 
00075 #define  PLUGIN_CODEC_VERSION_FIRST     1    // initial version
00076 #define  PLUGIN_CODEC_VERSION_WIDEBAND  2    // added wideband
00077 #define  PLUGIN_CODEC_VERSION_VIDEO     3    // added video
00078 #define  PLUGIN_CODEC_VERSION_FAX       4    // added fax
00079 #define  PLUGIN_CODEC_VERSION_OPTIONS   5    // added options handling
00080 #define  PLUGIN_CODEC_VERSION_INTERSECT 6    // added media option intersection merge functionality
00081 
00082 #define  PLUGIN_CODEC_VERSION PLUGIN_CODEC_VERSION_INTERSECT // Always latest version
00083 
00084 #define PLUGIN_CODEC_API_VER_FN       PWLibPlugin_GetAPIVersion
00085 #define PLUGIN_CODEC_API_VER_FN_STR   "PWLibPlugin_GetAPIVersion"
00086 
00087 #define PLUGIN_CODEC_GET_CODEC_FN     OpalCodecPlugin_GetCodecs
00088 #define PLUGIN_CODEC_GET_CODEC_FN_STR "OpalCodecPlugin_GetCodecs"
00089 
00090 #define PLUGIN_CODEC_API_VER_FN_DECLARE \
00091 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
00092 { return PWLIB_PLUGIN_API_VERSION; }
00093 
00094 enum {
00095   PluginCodec_License_None                           = 0,
00096   PluginCodec_Licence_None = PluginCodec_License_None,        // allow for old code with misspelled constant
00097   PluginCodec_License_GPL                            = 1,
00098   PluginCodec_License_MPL                            = 2,
00099   PluginCodec_License_Freeware                       = 3,
00100   PluginCodec_License_ResearchAndDevelopmentUseOnly  = 4,
00101   PluginCodec_License_BSD                            = 5,
00102   PluginCodec_License_LGPL                           = 6,
00103 
00104   PluginCodec_License_NoRoyalties                    = 0x7f,
00105 
00106   // any license codes above here require royalty payments
00107   PluginCodec_License_RoyaltiesRequired              = 0x80
00108 };
00109 
00110 struct PluginCodec_information {
00111   // start of version 1 fields
00112   time_t timestamp;                     // codec creation time and date - obtain with command: date -u "+%c = %s"
00113 
00114   const char * sourceAuthor;            // source code author
00115   const char * sourceVersion;           // source code version
00116   const char * sourceEmail;             // source code email contact information
00117   const char * sourceURL;               // source code web site
00118   const char * sourceCopyright;         // source code copyright
00119   const char * sourceLicense;           // source code license
00120   unsigned char sourceLicenseCode;      // source code license
00121 
00122   const char * codecDescription;        // codec description
00123   const char * codecAuthor;             // codec author
00124   const char * codecVersion;            // codec version
00125   const char * codecEmail;              // codec email contact information
00126   const char * codecURL;                // codec web site
00127   const char * codecCopyright;          // codec copyright information
00128   const char * codecLicense;            // codec license
00129   unsigned short codecLicenseCode;      // codec license code
00130   // end of version 1 fields
00131 
00132 };
00133 
00134 enum PluginCodec_Flags {
00135   PluginCodec_MediaTypeMask          = 0x000f,
00136   PluginCodec_MediaTypeAudio         = 0x0000,
00137   PluginCodec_MediaTypeVideo         = 0x0001,
00138   PluginCodec_MediaTypeAudioStreamed = 0x0002,
00139   PluginCodec_MediaTypeFax           = 0x0003,
00140 
00141   PluginCodec_InputTypeMask          = 0x0010,
00142   PluginCodec_InputTypeRaw           = 0x0000, // Note video is always RTP
00143   PluginCodec_InputTypeRTP           = 0x0010,
00144 
00145   PluginCodec_OutputTypeMask         = 0x0020,
00146   PluginCodec_OutputTypeRaw          = 0x0000, // Note video is always RTP
00147   PluginCodec_OutputTypeRTP          = 0x0020,
00148 
00149   PluginCodec_RTPTypeMask            = 0x0040,
00150   PluginCodec_RTPTypeDynamic         = 0x0000,
00151   PluginCodec_RTPTypeExplicit        = 0x0040,
00152 
00153   PluginCodec_RTPSharedMask          = 0x0080,
00154   PluginCodec_RTPTypeNotShared       = 0x0000,
00155   PluginCodec_RTPTypeShared          = 0x0080,
00156 
00157   PluginCodec_DecodeSilenceMask      = 0x0100,
00158   PluginCodec_NoDecodeSilence        = 0x0000,
00159   PluginCodec_DecodeSilence          = 0x0100,
00160 
00161   PluginCodec_EncodeSilenceMask      = 0x0200,
00162   PluginCodec_NoEncodeSilence        = 0x0000,
00163   PluginCodec_EncodeSilence          = 0x0200,
00164 
00165   PluginCodec_MediaExtensionMask     = 0x0400,
00166   PluginCodec_MediaTypeExtVideo      = 0x0400,
00167 
00168   PluginCodec_ComfortNoiseMask       = 0x0800,
00169   PluginCodec_ComfortNoise           = 0x0800,
00170 
00171   PluginCodec_EmptyPayloadMask       = 0x1000,
00172   PluginCodec_EmptyPayload           = 0x1000,
00173 
00174   PluginCodec_OtherPayloadMask       = 0x2000,
00175   PluginCodec_OtherPayload           = 0x2000,
00176 
00177   PluginCodec_BitsPerSamplePos       = 12,
00178   PluginCodec_BitsPerSampleMask      = 0xf000,
00179 
00180   PluginCodec_ChannelsPos            = 16,
00181   PluginCodec_ChannelsMask           = 0x003f0000
00182 };
00183 
00184 enum PluginCodec_CoderFlags {
00185   PluginCodec_CoderSilenceFrame      = 1,    // request audio codec to create silence frame
00186   PluginCodec_CoderForceIFrame       = 2     // request video codec to force I frame
00187 };
00188 
00189 enum PluginCodec_ReturnCoderFlags {
00190   PluginCodec_ReturnCoderLastFrame      = 1,    // indicates when video codec returns last data for frame
00191   PluginCodec_ReturnCoderIFrame         = 2,    // indicates when video returns I frame
00192   PluginCodec_ReturnCoderRequestIFrame  = 4,    // indicates when video decoder request I frame for resync
00193   PluginCodec_ReturnCoderBufferTooSmall = 8     // indicates when output buffer is not large enough to receive
00194                                                 // the data, another call to get_output_data_size is required
00195 };
00196 
00197 struct PluginCodec_Definition;
00198 
00199 // Control function names
00200 
00201 #define PLUGINCODEC_CONTROL_VALID_FOR_PROTOCOL    "valid_for_protocol"
00202 #define PLUGINCODEC_CONTROL_GET_CODEC_OPTIONS     "get_codec_options"
00203 #define PLUGINCODEC_CONTROL_FREE_CODEC_OPTIONS    "free_codec_options"
00204 #define PLUGINCODEC_CONTROL_GET_OUTPUT_DATA_SIZE  "get_output_data_size"
00205 #define PLUGINCODEC_CONTROL_SET_CODEC_OPTIONS     "set_codec_options"
00206 #define PLUGINCODEC_CONTROL_TO_NORMALISED_OPTIONS "to_normalised_options"
00207 #define PLUGINCODEC_CONTROL_TO_CUSTOMISED_OPTIONS "to_customised_options"
00208 #define PLUGINCODEC_CONTROL_SET_INSTANCE_ID       "set_instance_id"
00209 #define PLUGINCODEC_CONTROL_SET_LOG_FUNCTION      "set_log_function"
00210 #define PLUGINCODEC_CONTROL_GET_STATISTICS        "get_statistics"
00211 #define PLUGINCODEC_CONTROL_TERMINATE_CODEC       "terminate_codec"
00212 
00213 
00214 /* Log function, plug in gets a pointer to this function which allows
00215    it to use the standard OPAL logging system. The function returns 0 if
00216    no logging was performed due to the log level. Note if log == NULL
00217    then this return state is all that happens, so this may be executed
00218    first to prevent lengthy logs that would not result in any output. */
00219 typedef int (*PluginCodec_LogFunction)(unsigned level,
00220                                        const char * file,
00221                                        unsigned line,
00222                                        const char * section,
00223                                        const char * log);
00224 
00225 
00226 struct PluginCodec_ControlDefn {
00227   const char * name;
00228   int (*control)(const struct PluginCodec_Definition * codec, void * context,
00229                  const char * name, void * parm, unsigned * parmLen);
00230 
00231 };
00232 
00233 enum PluginCodec_OptionTypes {
00234   PluginCodec_StringOption,
00235   PluginCodec_BoolOption,
00236   PluginCodec_IntegerOption,
00237   PluginCodec_RealOption,
00238   PluginCodec_EnumOption,
00239   PluginCodec_OctetsOption,
00240   PluginCodec_NumOptionTypes,
00241 };
00242 
00243 enum PluginCodec_OptionMerge {
00244   PluginCodec_NoMerge,
00245   PluginCodec_MinMerge,
00246   PluginCodec_MaxMerge,
00247   PluginCodec_EqualMerge,
00248   PluginCodec_NotEqualMerge,
00249   PluginCodec_AlwaysMerge,
00250   PluginCodec_CustomMerge,
00251   PluginCodec_IntersectionMerge,
00252 
00253   PluginCodec_AndMerge = PluginCodec_MinMerge,
00254   PluginCodec_OrMerge  = PluginCodec_MaxMerge
00255 };
00256 
00257 #define PluginCodec_H245_Collapsing    0x40000000
00258 #define PluginCodec_H245_NonCollapsing 0x20000000
00259 #define PluginCodec_H245_Unsigned32    0x10000000
00260 #define PluginCodec_H245_BooleanArray  0x08000000
00261 #define PluginCodec_H245_TCS           0x04000000
00262 #define PluginCodec_H245_OLC           0x02000000
00263 #define PluginCodec_H245_ReqMode       0x01000000
00264 #define PluginCodec_H245_OrdinalMask   0x0000ffff
00265 
00266 typedef int (*PluginCodec_MergeFunction)(char ** result, const char * dest, const char * src);
00267 typedef void (*PluginCodec_FreeFunction)(char * string);
00268 
00269 struct PluginCodec_Option {
00270   // start of version 4 fields
00271   enum PluginCodec_OptionTypes m_type;
00272   const char *                 m_name;
00273   unsigned                     m_readOnly;
00274   enum PluginCodec_OptionMerge m_merge;
00275   const char *                 m_value;
00276   const char *                 m_FMTPName;
00277   const char *                 m_FMTPDefault;
00278   int                          m_H245Generic;
00279   const char *                 m_minimum;
00280   const char *                 m_maximum;
00281   PluginCodec_MergeFunction    m_mergeFunction; // Used if m_merge==PluginCodec_CustomMerge
00282   PluginCodec_FreeFunction     m_freeFunction;
00283 };
00284 
00285 
00286 // Normalised option names
00287 #define PLUGINCODEC_OPTION_NEEDS_JITTER               "Needs Jitter"
00288 #define PLUGINCODEC_OPTION_CLOCK_RATE                 "Clock Rate"
00289 #define PLUGINCODEC_OPTION_CHANNELS                   "Channels"
00290 #define PLUGINCODEC_OPTION_FRAME_TIME                 "Frame Time"
00291 #define PLUGINCODEC_OPTION_MAX_FRAME_SIZE             "Max Frame Size"
00292 #define PLUGINCODEC_OPTION_MAX_TX_PACKET_SIZE         "Max Tx Packet Size"
00293 #define PLUGINCODEC_OPTION_MAX_BIT_RATE               "Max Bit Rate"
00294 #define PLUGINCODEC_OPTION_TARGET_BIT_RATE            "Target Bit Rate"
00295 #define PLUGINCODEC_OPTION_RX_FRAMES_PER_PACKET       "Rx Frames Per Packet"
00296 #define PLUGINCODEC_OPTION_TX_FRAMES_PER_PACKET       "Tx Frames Per Packet"
00297 #define PLUGINCODEC_OPTION_FRAME_WIDTH                "Frame Width"
00298 #define PLUGINCODEC_OPTION_FRAME_HEIGHT               "Frame Height"
00299 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_WIDTH         "Min Rx Frame Width"
00300 #define PLUGINCODEC_OPTION_MIN_RX_FRAME_HEIGHT        "Min Rx Frame Height"
00301 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_WIDTH         "Max Rx Frame Width"
00302 #define PLUGINCODEC_OPTION_MAX_RX_FRAME_HEIGHT        "Max Rx Frame Height"
00303 #define PLUGINCODEC_OPTION_TEMPORAL_SPATIAL_TRADE_OFF "Temporal Spatial Trade Off"
00304 #define PLUGINCODEC_OPTION_TX_KEY_FRAME_PERIOD        "Tx Key Frame Period"
00305 
00306 
00307 
00308 // Full definition of the codec
00309 
00310 struct PluginCodec_Definition {
00311   unsigned int version;                     // codec structure version
00312 
00313   // start of version 1 fields
00314   struct PluginCodec_information * info;   // license information
00315 
00316   unsigned int flags;                      // b0-3: 0 = audio,        1 = video
00317                                            // b4:   0 = raw input,    1 = RTP input
00318                                            // b5:   0 = raw output,   1 = RTP output
00319                                            // b6:   0 = dynamic RTP,  1 = explicit RTP
00320                                            // b7:   0 = no share RTP, 1 = share RTP
00321 
00322   const char * descr;                       // text decription
00323 
00324   const char * sourceFormat;               // source format
00325   const char * destFormat;                 // destination format
00326 
00327   const void * userData;                   // user data value
00328 
00329   unsigned int sampleRate;                 // samples per second
00330   unsigned int bitsPerSec;                // raw bits per second
00331   unsigned int usPerFrame;                 // microseconds per frame
00332 
00333   union _parm {
00334     struct _audio {
00335       unsigned int samplesPerFrame;            // audio: samples per frame
00336       unsigned int bytesPerFrame;              // audio: max bytes per frame
00337       unsigned int recommendedFramesPerPacket; // audio: recommended number of frames per packet
00338       unsigned int maxFramesPerPacket;         // audio: maximum number of frames per packet
00339     } audio;
00340     struct _video {
00341       unsigned int maxFrameWidth;              // video: frame width
00342       unsigned int maxFrameHeight;             // video: frame height
00343       unsigned int recommendedFrameRate;       // video: recommended frame rate
00344       unsigned int maxFrameRate;               // video: max frame rate
00345     } video;
00346   } parm;
00347 
00348   unsigned char rtpPayload;                 // IANA RTP payload code (if defined)
00349   const char * sdpFormat;                  // SDP format string (or NULL, if no SDP format)
00350 
00351   void * (*createCodec)(const struct PluginCodec_Definition * codec);                    // create codec
00352   void (*destroyCodec) (const struct PluginCodec_Definition * codec,  void * context);   // destroy codec
00353   int (*codecFunction) (const struct PluginCodec_Definition * codec,  void * context,   // do codec function
00354                                   const void * from, unsigned * fromLen,
00355                                         void * to,   unsigned * toLen,
00356                                         unsigned int * flag);
00357   struct PluginCodec_ControlDefn * codecControls;
00358 
00359   // H323 specific fields
00360   unsigned char h323CapabilityType;
00361   const void  * h323CapabilityData;
00362 
00363   // end of version 1 fields
00364 
00365   // NOTE!!!!! Due to an error in judgement, you cannot add ANY more fields
00366   // to this structure without an API version change!!!!
00367 };
00368 
00369 typedef struct PluginCodec_Definition * (* PluginCodec_GetCodecFunction)(unsigned int *, unsigned int);
00370 typedef unsigned (* PluginCodec_GetAPIVersionFunction)();
00371 
00373 //
00374 //  H.323 specific values
00375 //
00376 
00377 
00378 struct PluginCodec_H323CapabilityExtension {
00379   unsigned int index;
00380   void * data;
00381   unsigned dataLength;
00382 };
00383 
00384 struct PluginCodec_H323NonStandardCodecData {
00385   const char * objectId;
00386   unsigned char  t35CountryCode;
00387   unsigned char  t35Extension;
00388   unsigned short manufacturerCode;
00389   const unsigned char * data;
00390   unsigned int dataLength;
00391   int (*capabilityMatchFunction)(struct PluginCodec_H323NonStandardCodecData *);
00392 };
00393 
00394 
00395 struct PluginCodec_H323GenericParameterDefinition
00396 {
00397   /* The following used to be a simple integer for the collapsing flag in
00398      version 3 and earlier. We hope that all those implementations just used
00399      zero and one (a good bet) and thus the below bit fields will be backward
00400      compatible, putting the parameter in all three PDU types.
00401    */ 
00402 #ifndef SOLARIS   
00403   struct {
00404 #endif  
00405     int collapsing:1; /* boolean */
00406     int excludeTCS:1;
00407     int excludeOLC:1;
00408     int excludeReqMode:1;
00409     int readOnly:1;
00410 #ifndef SOLARIS    
00411   };
00412 #endif  
00413 
00414   unsigned int id;
00415 
00416   enum PluginCodec_H323GenericParameterType {
00417     /* these need to be in the same order as the choices in
00418       H245_ParameterValue::Choices, as the value is just cast to that type
00419     */
00420     PluginCodec_GenericParameter_Logical = 0,
00421     PluginCodec_GenericParameter_BooleanArray,
00422     PluginCodec_GenericParameter_UnsignedMin,
00423     PluginCodec_GenericParameter_UnsignedMax,
00424     PluginCodec_GenericParameter_Unsigned32Min,
00425     PluginCodec_GenericParameter_Unsigned32Max,
00426     PluginCodec_GenericParameter_OctetString,
00427     PluginCodec_GenericParameter_GenericParameter,
00428 
00429     PluginCodec_GenericParameter_logical = 0,
00430     PluginCodec_GenericParameter_booleanArray,
00431     PluginCodec_GenericParameter_unsignedMin,
00432     PluginCodec_GenericParameter_unsignedMax,
00433     PluginCodec_GenericParameter_unsigned32Min,
00434     PluginCodec_GenericParameter_unsigned32Max,
00435     PluginCodec_GenericParameter_octetString,
00436     PluginCodec_GenericParameter_genericParameter
00437   } type;
00438 
00439   union {
00440     unsigned long integer;
00441     const char * octetstring;
00442     struct PluginCodec_H323GenericParameterDefinition *genericparameter;
00443   } value;
00444 };
00445 
00446 struct PluginCodec_H323GenericCodecData
00447 {
00448   // some cunning structures & lists, and associated logic in
00449   // H323CodecPluginGenericAudioCapability::H323CodecPluginGenericAudioCapability()
00450   const char * standardIdentifier;
00451   unsigned int maxBitRate; // Zero means use value from OpalMediaFormat
00452 
00453   /* parameters; these are the parameters which are set in the
00454      'TerminalCapabilitySet' and 'OpenLogicalChannel' requests */
00455   unsigned int nParameters;
00456   /* an array of nParameters parameter definitions */
00457   const struct PluginCodec_H323GenericParameterDefinition *params;
00458 };
00459 
00460 
00461 struct PluginCodec_H323AudioGSMData {
00462   int comfortNoise:1;
00463   int scrambled:1;
00464 };
00465 
00466 struct  PluginCodec_H323AudioG7231AnnexC {
00467   unsigned char maxAl_sduAudioFrames;
00468   int silenceSuppression:1;
00469   int highRateMode0:6;          // INTEGER (27..78),  -- units octets
00470   int  highRateMode1:6;          // INTEGER (27..78),  -- units octets
00471   int  lowRateMode0:6;            // INTEGER (23..66),  -- units octets
00472   int  lowRateMode1:6;            // INTEGER (23..66),  -- units octets
00473   int  sidMode0:4;                // INTEGER (6..17),  -- units octets
00474   int  sidMode1:4;                // INTEGER (6..17),  -- units octets
00475 };
00476 
00477 
00478 enum {
00479   PluginCodec_H323Codec_undefined,      // must be zero, so empty struct is undefined
00480   PluginCodec_H323Codec_programmed,      // H323ProgrammedCapability
00481   PluginCodec_H323Codec_nonStandard,    // H323NonStandardData
00482   PluginCodec_H323Codec_generic,            // H323GenericCodecData
00483 
00484   // audio codecs
00485   PluginCodec_H323AudioCodec_g711Alaw_64k,        // int
00486   PluginCodec_H323AudioCodec_g711Alaw_56k,        // int
00487   PluginCodec_H323AudioCodec_g711Ulaw_64k,        // int
00488   PluginCodec_H323AudioCodec_g711Ulaw_56k,        // int
00489   PluginCodec_H323AudioCodec_g722_64k,            // int
00490   PluginCodec_H323AudioCodec_g722_56k,            // int
00491   PluginCodec_H323AudioCodec_g722_48k,            // int
00492   PluginCodec_H323AudioCodec_g7231,                // H323AudioG7231Data
00493   PluginCodec_H323AudioCodec_g728,                // int
00494   PluginCodec_H323AudioCodec_g729,                // int
00495   PluginCodec_H323AudioCodec_g729AnnexA,          // int
00496   PluginCodec_H323AudioCodec_is11172,             // not yet implemented
00497   PluginCodec_H323AudioCodec_is13818Audio,        // not yet implemented
00498   PluginCodec_H323AudioCodec_g729wAnnexB,          // int
00499   PluginCodec_H323AudioCodec_g729AnnexAwAnnexB,    // int
00500   PluginCodec_H323AudioCodec_g7231AnnexC,         // H323AudioG7231AnnexC
00501   PluginCodec_H323AudioCodec_gsmFullRate,          // H323AudioGSMData
00502   PluginCodec_H323AudioCodec_gsmHalfRate,          // H323AudioGSMData
00503   PluginCodec_H323AudioCodec_gsmEnhancedFullRate,  // H323AudioGSMData
00504   PluginCodec_H323AudioCodec_g729Extensions,      // not yet implemented
00505 
00506   // video codecs
00507   PluginCodec_H323VideoCodec_h261,                // implemented
00508   PluginCodec_H323VideoCodec_h262,                // not yet implemented
00509   PluginCodec_H323VideoCodec_h263,                // implemented
00510   PluginCodec_H323VideoCodec_is11172,             // not yet implemented
00511 
00512   // other capabilities
00513   PluginCodec_H323VideoCodec_Extended,            // implemented (for use with H.239)
00514   PluginCodec_H323T38Codec,                       // not yet implemented
00515 
00516   // special codes
00517   PluginCodec_H323Codec_NoH323 = 0xff,            // used for SIP-only codecs
00518 };
00519 
00521 //
00522 // Generic Codec Standard Identifiers
00523 //
00524 
00525 // Audio Capabilities
00526 // AMR (as defined in H.245v13 Annex I)
00527 #define OpalPluginCodec_Identifer_AMR             "0.0.8.245.1.1.1"
00528 
00529 // AMR-NB\WB  (as defined in H.245v13 Annex R)
00530 #define OpalPluginCodec_Identifer_AMR_NB          "0.0.8.245.1.1.9"
00531 #define OpalPluginCodec_Identifer_AMR_WB          "0.0.8.245.1.1.10"
00532 
00533 // G.722.1
00534 #define OpalPluginCodec_Identifer_G7221           "0.0.7.7221.1.0"
00535 #define OpalPluginCodec_Identifer_G7221ext        "0.0.7.7221.1.1.0"
00536 
00537 // G.722.2 (aka AMR-WB)
00538 #define OpalPluginCodec_Identifer_G7222           "0.0.7.7222.1.0"
00539 
00540 // iLBC (as defined in H.245v13 Annex S)
00541 #define OpalPluginCodec_Identifer_iLBC            "0.0.8.245.1.1.11"
00542 
00543 
00544 // Video Capabilities
00545 
00546 // H264 (as defined in H.241)
00547 #define OpalPluginCodec_Identifer_H264_Aligned        "0.0.8.241.0.0.0.0"
00548 #define OpalPluginCodec_Identifer_H264_NonInterleaved "0.0.8.241.0.0.0.1"
00549 #define OpalPluginCodec_Identifer_H264_Interleaved    "0.0.8.241.0.0.0.2"
00550 #define OpalPluginCodec_Identifer_H264_Generic        "0.0.8.241.0.0.1"
00551 
00552 // ISO/IEC 14496-2 MPEG4 part 2 (as defined in H.245v13 Annex E)
00553 #define OpalPluginCodec_Identifer_MPEG4           "0.0.8.245.1.0.0"
00554 
00555 
00557 //
00558 // Predefined options for H.323 codecs
00559 //
00560 
00561 #define PLUGINCODEC_SQCIF_MPI   "SQCIF MPI"
00562 #define PLUGINCODEC_QCIF_MPI     "QCIF MPI"
00563 #define PLUGINCODEC_CIF_MPI       "CIF MPI"
00564 #define PLUGINCODEC_CIF4_MPI     "CIF4 MPI"
00565 #define PLUGINCODEC_CIF16_MPI   "CIF16 MPI"
00566 #define PLUGINCODEC_CUSTOM_MPI "Custom MPI"
00567 
00568 #define PLUGINCODEC_MPI_DISABLED 33
00569 
00570 #define PLUGINCODEC_MEDIA_PACKETIZATION  "Media Packetization"
00571 #define PLUGINCODEC_MEDIA_PACKETIZATIONS "Media Packetizations"
00572 
00573 #define H261_ANNEX_D "Annex D - Still Image Transmit"
00574 #define H263_ANNEX_D "Annex D - Unrestricted Motion Vector"
00575 #define H263_ANNEX_F "Annex F - Advanced Prediction"
00576 #define H263_ANNEX_I "Annex I - Advanced INTRA Coding"
00577 #define H263_ANNEX_J "Annex J - Deblocking Filter"
00578 #define H263_ANNEX_K "Annex K - Slice Structure"
00579 #define H263_ANNEX_N "Annex N - Reference Picture Selection"
00580 #define H263_ANNEX_S "Annex S - Alternative INTER VLC"
00581 #define H263_ANNEX_T "Annex T - Modified Quantization"
00582 
00583 #ifndef STRINGIZE
00584 #define __INTERNAL_STRINGIZE__(v) #v
00585 #define STRINGIZE(v) __INTERNAL_STRINGIZE__(v)
00586 #endif
00587 
00588 
00590 //
00591 // RTP specific definitions
00592 //
00593 
00594 #define PluginCodec_RTP_MaxPacketSize  (1518-14-4-8-20-16)  // Max Ethernet packet (1518 bytes) minus 802.3/CRC, 802.3, IP, UDP headers
00595 #define PluginCodec_RTP_MinHeaderSize  (12)
00596 #define PluginCodec_RTP_MaxPayloadSize (PluginCodec_RTP_MaxPacketSize - PluginCodec_RTP_MinHeaderSize)
00597 
00598 #define PluginCodec_RTP_GetHeaderLength(ptr)      ((((unsigned char*)(ptr))[0] & 0x0f)*4 + PluginCodec_RTP_MinHeaderSize)
00599 #define PluginCodec_RTP_GetPayloadPtr(ptr)          ((unsigned char*)(ptr) + PluginCodec_RTP_GetHeaderLength(ptr))
00600 #define PluginCodec_RTP_GetPayloadType(ptr)        (((unsigned char*)(ptr))[1] & 0x7f)
00601 #define PluginCodec_RTP_SetPayloadType(ptr, type)  (((unsigned char*)(ptr))[1] = (((unsigned char*)(ptr))[1] & 0x80) | (type & 0x7f))
00602 #define PluginCodec_RTP_GetMarker(ptr)            ((((unsigned char*)(ptr))[1] & 0x80) != 0)
00603 #define PluginCodec_RTP_SetMarker(ptr, mark)       (((unsigned char*)(ptr))[1] = (((unsigned char*)(ptr))[1] & 0x7f) | (mark != 0 ? 0x80 : 0))
00604 #define PluginCodec_RTP_GetTimestamp(ptr)         ((((unsigned char*)(ptr))[4] << 24) | (((unsigned char*)(ptr))[5] << 16) | (((unsigned char*)(ptr))[6] << 8) | ((unsigned char*)(ptr))[7])
00605 #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)))
00606 #define PluginCodec_RTP_GetSequenceNumber(ptr)    ((((unsigned char*)(ptr))[2] << 8) | ((unsigned char*)(ptr))[3])
00607 #define PluginCodec_RTP_SetSequenceNumber(ptr, sn)((((unsigned char*)(ptr))[2] = ((sn) >> 8)),(((unsigned char*)(ptr))[3] = (sn)))
00608 
00609 
00611 //
00612 // video specific definitions
00613 //
00614 
00615 struct PluginCodec_Video_FrameHeader {
00616   unsigned int  x;
00617   unsigned int  y;
00618   unsigned int  width;
00619   unsigned int  height;
00620 };
00621 
00622 #ifdef __cplusplus
00623 };
00624 
00625 inline unsigned char * OPAL_VIDEO_FRAME_DATA_PTR(struct PluginCodec_Video_FrameHeader * base)
00626 { return (((unsigned char *)base) + sizeof(PluginCodec_Video_FrameHeader)); }
00627 
00628 inline unsigned char * OPAL_VIDEO_FRAME_DATA_PTR(const PluginCodec_Video_FrameHeader * base)
00629 { return (((unsigned char *)base) + sizeof(PluginCodec_Video_FrameHeader)); }
00630 
00631 extern "C" {
00632 #endif
00633 
00634 #define PLUGIN_CODEC_VIDEO_SET_FRAME_SIZE_FN    "set_frame_size"    // argument is struct PluginCodec_VideoSetFrameInfo
00635 struct PluginCodec_Video_SetFrameInfo {
00636   int width;
00637   int height;
00638 };
00639 
00640 
00642 //
00643 // experimental definitions for statically linking codecs
00644 //
00645 
00646 #ifdef OPAL_STATIC_CODEC
00647 
00648 #  undef PLUGIN_CODEC_DLL_API
00649 #  define PLUGIN_CODEC_DLL_API static
00650 #  define PLUGIN_CODEC_IMPLEMENT(name) \
00651 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
00652 { return PWLIB_PLUGIN_API_VERSION; } \
00653 static struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned /*version*/); \
00654 struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * p1, unsigned p2) \
00655 { return PLUGIN_CODEC_GET_CODEC_FN(p1,p2); } \
00656 
00657 #  define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
00658 unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \
00659 { return PWLIB_PLUGIN_API_VERSION; } \
00660 PLUGIN_CODEC_DLL_API struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * count, unsigned version) \
00661 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
00662 
00663 
00664 #else
00665 
00666 #  define PLUGIN_CODEC_IMPLEMENT(name) \
00667 PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \
00668 { return PWLIB_PLUGIN_API_VERSION; } \
00669 
00670 #  define PLUGIN_CODEC_IMPLEMENT_ALL(name, table, ver) \
00671 PLUGIN_CODEC_IMPLEMENT(name) \
00672 PLUGIN_CODEC_DLL_API struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned version) \
00673 { *count = sizeof(table)/sizeof(struct PluginCodec_Definition); return version < ver ? NULL : table; }
00674 
00675 
00676 #endif
00677 
00678 #ifdef __cplusplus
00679 };
00680 #endif
00681 
00682 
00683 #ifdef _MSC_VER
00684 #pragma warning(default:4201)
00685 #endif
00686 
00687 #endif // OPAL_CODEC_OPALPLUGIN_H