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

Generated on Wed Dec 15 07:55:08 2010 for OPAL by  doxygen 1.4.7