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

Generated on Fri Mar 7 07:36:38 2008 for OPAL by  doxygen 1.5.1