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

Generated on Mon Feb 1 00:25:53 2010 for OPAL by  doxygen 1.5.1