www.pudn.com > openh323-v1_15_1-src.zip > opalplugin.h


/* 
 * h323plugins.h 
 * 
 * H.323 codec plugins handler 
 * 
 * Open H323 Library 
 * 
 * Copyright (C) 2004 Post Increment 
 * 
 * The contents of this file are subject to the Mozilla Public License 
 * Version 1.0 (the "License"); you may not use this file except in 
 * compliance with the License. You may obtain a copy of the License at 
 * http://www.mozilla.org/MPL/ 
 * 
 * Software distributed under the License is distributed on an "AS IS" 
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 
 * the License for the specific language governing rights and limitations 
 * under the License. 
 * 
 * The Original Code is Open H323 Library. 
 * 
 * The Initial Developer of the Original Code is Post Increment 
 * 
 * Contributor(s): ______________________________________. 
 * 
 * $Log: opalplugin.h,v $ 
 * Revision 1.3  2004/05/18 22:26:28  csoutheren 
 * Initial support for embedded codecs 
 * Fixed problems with streamed codec support 
 * Updates for abstract factory loading methods 
 * 
 * Revision 1.2  2004/05/09 14:44:36  csoutheren 
 * Added support for streamed plugin audio codecs 
 * 
 * Revision 1.1  2004/04/09 12:25:25  csoutheren 
 * Renamed from h323plugin.h 
 * 
 * Revision 1.2  2004/04/03 10:38:24  csoutheren 
 * Added in initial cut at codec plugin code. Branches are for wimps :) 
 * 
 * Revision 1.1.2.1  2004/03/31 11:03:16  csoutheren 
 * Initial public version 
 * 
 * Revision 1.8  2004/02/23 13:17:32  craigs 
 * Fixed problems with codec interface functions 
 * 
 * Revision 1.7  2004/02/23 13:04:09  craigs 
 * Removed warnings when compliing plugins 
 * 
 * Revision 1.6  2004/01/27 14:55:46  craigs 
 * Implemented static linking of new codecs 
 * 
 * Revision 1.5  2004/01/23 05:21:15  craigs 
 * Updated for changes to the codec plugin interface 
 * 
 * Revision 1.4  2004/01/09 11:27:46  craigs 
 * Plugin codec audio now works :) 
 * 
 * Revision 1.3  2004/01/09 07:32:22  craigs 
 * More fixes for capability problems 
 * 
 * Revision 1.2  2004/01/06 07:05:03  craigs 
 * Changed to support plugin codecs 
 * 
 * Revision 1.1  2004/01/04 13:37:51  craigs 
 * Implementation of codec plugins 
 * 
 * 
 */ 
 
#ifndef __OPAL_H323PLUGIN_H 
#define __OPAL_H323PLUGIN_H 
 
#ifdef __cplusplus 
extern "C" { 
#endif 
 
#include  
 
#ifdef _WIN32 
#  ifdef PLUGIN_CODEC_DLL_EXPORTS 
#    define PLUGIN_CODEC_DLL_API __declspec(dllexport) 
#  else 
#    define PLUGIN_CODEC_DLL_API __declspec(dllimport) 
#  endif 
 
#else 
 
#define PLUGIN_CODEC_DLL_API 
 
#endif 
 
#define PWLIB_PLUGIN_API_VERSION 0 
#define	PLUGIN_CODEC_VERSION		 1 
 
#define PLUGIN_CODEC_API_VER_FN       PWLibPlugin_GetAPIVersion 
#define PLUGIN_CODEC_API_VER_FN_STR   "PWLibPlugin_GetAPIVersion" 
 
#define PLUGIN_CODEC_GET_CODEC_FN     OpalCodecPlugin_GetCodecs 
#define PLUGIN_CODEC_GET_CODEC_FN_STR "OpalCodecPlugin_GetCodecs" 
 
#define PLUGIN_CODEC_API_VER_FN_DECLARE \ 
PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \ 
{ return PWLIB_PLUGIN_API_VERSION; } 
 
enum { 
  PluginCodec_Licence_None                           = 0, 
  PluginCodec_License_GPL                            = 1, 
  PluginCodec_License_MPL                            = 2, 
  PluginCodec_License_Freeware                       = 3, 
  PluginCodec_License_ResearchAndDevelopmentUseOnly  = 4, 
  PluginCodec_License_BSD                            = 5, 
 
  PluginCodec_License_NoRoyalties                    = 0x7f, 
 
  // any license codes above here require royalty payments 
  PluginCodec_License_RoyaltiesRequired              = 0x80 
}; 
 
struct PluginCodec_information { 
  // start of version 1 fields 
  time_t timestamp;                     // codec creation time and date - obtain with command: date -u "+%c = %s" 
 
  const char * sourceAuthor;            // source code author 
  const char * sourceVersion;           // source code version 
  const char * sourceEmail;             // source code email contact information 
  const char * sourceURL;               // source code web site 
  const char * sourceCopyright;         // source code copyright 
  const char * sourceLicense;           // source code license 
  unsigned char sourceLicenseCode;      // source code license 
 
  const char * codecDescription;        // codec description 
  const char * codecAuthor;             // codec author 
  const char * codecVersion;            // codec version 
  const char * codecEmail;              // codec email contact information 
  const char * codecURL;                // codec web site 
  const char * codecCopyright;          // codec copyright information 
  const char * codecLicense;            // codec license 
  unsigned short codecLicenseCode;      // codec license code 
  // end of version 1 fields 
 
}; 
 
enum PluginCodec_Flags { 
  PluginCodec_MediaTypeMask          = 0x000f, 
  PluginCodec_MediaTypeAudio         = 0x0000, 
  PluginCodec_MediaTypeVideo         = 0x0001, 
  PluginCodec_MediaTypeAudioStreamed = 0x0002, 
 
  PluginCodec_InputTypeMask          = 0x0010, 
  PluginCodec_InputTypeRaw           = 0x0000, 
  PluginCodec_InputTypeRTP           = 0x0010, 
 
  PluginCodec_OutputTypeMask         = 0x0020, 
  PluginCodec_OutputTypeRaw          = 0x0000, 
  PluginCodec_OutputTypeRTP          = 0x0020, 
 
  PluginCodec_RTPTypeMask            = 0x0040, 
  PluginCodec_RTPTypeDynamic         = 0x0000, 
  PluginCodec_RTPTypeExplicit        = 0x0040, 
 
  PluginCodec_BitsPerSamplePos       = 12, 
  PluginCodec_BitsPerSampleMask      = 0xf000, 
}; 
 
struct PluginCodec_Definition; 
 
struct PluginCodec_ControlDefn { 
  const char * name; 
  int (*control)(const struct PluginCodec_Definition * codec, void * context,  
                 const char * name, void * parm, unsigned * parmLen); 
  
}; 
 
struct PluginCodec_Definition { 
  unsigned int version;			               // codec structure version 
 
  // start of version 1 fields 
  struct PluginCodec_information * info;   // license information 
 
  unsigned int flags;                      // b0-3: 0 = audio,       1 = video 
                                           // b4:   0 = raw input,   1 = RTP input 
                                           // b5:   0 = raw output,  1 = RTP output 
                                           // b6:   0 = dynamic RTP, 1 = explicit RTP 
 
  const char * descr;    		               // text decription 
 
  const char * sourceFormat;               // source format 
  const char * destFormat;                 // destination format 
 
  const void * userData;                   // user data value 
 
  unsigned int sampleRate;                 // samples per second 
  unsigned int bitsPerSec;     		         // raw bits per second 
  unsigned int nsPerFrame;                 // nanoseconds per frame 
  unsigned int samplesPerFrame;		         // samples per frame 
  unsigned int bytesPerFrame;              // max bytes per frame 
  unsigned int recommendedFramesPerPacket; // recommended number of frames per packet 
  unsigned int maxFramesPerPacket;         // maximum number of frames per packet 
 
  unsigned char rtpPayload;    		         // IANA RTP payload code (if defined) 
  const char * sdpFormat;                  // SDP format string (or NULL, if no SDP format) 
 
  void * (*createCodec)(const struct PluginCodec_Definition * codec);	                  // create codec  
  void (*destroyCodec) (const struct PluginCodec_Definition * codec,  void * context); 	// destroy codec 
  int (*codecFunction) (const struct PluginCodec_Definition * codec,  void * context,   // do codec function 
                                  const void * from, unsigned * fromLen, 
                                        void * to,   unsigned * toLen, 
                                        unsigned int * flag); 
  struct PluginCodec_ControlDefn * codecControls; 
  
  // H323 specific fields 
  unsigned char h323CapabilityType; 
  void          * h323CapabilityData; 
 
  // end of version 1 fields 
}; 
 
typedef struct PluginCodec_Definition * (* PluginCodec_GetCodecFunction)(unsigned int *, unsigned int); 
typedef unsigned (* PluginCodec_GetAPIVersionFunction)(); 
 
/////////////////////////////////////////////////////////////////// 
// 
//  H.323 specific values 
// 
 
 
struct PluginCodec_H323CapabilityExtension { 
  unsigned int index; 
  void * data; 
  unsigned dataLength; 
}; 
 
struct PluginCodec_H323NonStandardCodecData { 
  const char * objectId; 
  unsigned char  t35CountryCode; 
  unsigned char  t35Extension; 
  unsigned short manufacturerCode; 
  const unsigned char * data; 
  unsigned int dataLength; 
  int (*capabilityMatchFunction)(struct PluginCodec_H323NonStandardCodecData *); 
}; 
     
struct PluginCodec_H323AudioGSMData { 
  int comfortNoise:1; 
  int scrambled:1; 
}; 
 
struct  PluginCodec_H323AudioG7231AnnexC { 
  unsigned char maxAl_sduAudioFrames; 
  int silenceSuppression:1; 
  int highRateMode0:6;  	      // INTEGER (27..78),	-- units octets 
  int	highRateMode1:6;	        // INTEGER (27..78),	-- units octets 
  int	lowRateMode0:6;		        // INTEGER (23..66),	-- units octets 
  int	lowRateMode1:6;		        // INTEGER (23..66),	-- units octets 
  int	sidMode0:4;		            // INTEGER (6..17),	-- units octets 
  int	sidMode1:4;		            // INTEGER (6..17),	-- units octets 
}; 
 
struct PluginCodec_H323VideoH261 
{ 
  int qcifMPI:2;                         //	INTEGER (1..4) OPTIONAL,	-- units 1/29.97 Hz 
  int cifMPI:2;		                       // INTEGER (1..4) OPTIONAL,	-- units 1/29.97 Hz 
	int temporalSpatialTradeOffCapability; //	BOOLEAN, 
	int maxBitRate;                        //	INTEGER (1..19200),	-- units of 100 bit/s 
  int stillImageTransmission:1;          //	BOOLEAN,	-- Annex D of H.261 
  int videoBadMBsCap:1;                  //	BOOLEAN 
  const struct PluginCodec_H323CapabilityExtension * extensions; 
}; 
 
enum { 
  PluginCodec_H323Codec_undefined,			// must be zero, so empty struct is undefined 
  PluginCodec_H323Codec_programmed,			// H323ProgrammedCapability 
  PluginCodec_H323Codec_nonStandard,		// H323NonStandardData 
  PluginCodec_H323Codec_generic,        // not yet implemented 
 
  // audio codecs 
  PluginCodec_H323AudioCodec_g711Alaw_64k,		    // int 
  PluginCodec_H323AudioCodec_g711Alaw_56k,		    // int 
  PluginCodec_H323AudioCodec_g711Ulaw_64k,		    // int 
  PluginCodec_H323AudioCodec_g711Ulaw_56k,		    // int 
  PluginCodec_H323AudioCodec_g722_64k,			      // int 
  PluginCodec_H323AudioCodec_g722_56k,			      // int 
  PluginCodec_H323AudioCodec_g722_48k,			      // int 
  PluginCodec_H323AudioCodec_g7231,			          // H323AudioG7231Data 
  PluginCodec_H323AudioCodec_g728,			          // int 
  PluginCodec_H323AudioCodec_g729,			          // int 
  PluginCodec_H323AudioCodec_g729AnnexA,		      // int 
  PluginCodec_H323AudioCodec_is11172,             // not yet implemented 
  PluginCodec_H323AudioCodec_is13818Audio,        // not yet implemented 
  PluginCodec_H323AudioCodec_g729wAnnexB,		      // int 
  PluginCodec_H323AudioCodec_g729AnnexAwAnnexB,	  // int 
  PluginCodec_H323AudioCodec_g7231AnnexC,         // H323AudioG7231AnnexC 
  PluginCodec_H323AudioCodec_gsmFullRate,		      // H323AudioGSMData 
  PluginCodec_H323AudioCodec_gsmHalfRate,		      // H323AudioGSMData 
  PluginCodec_H323AudioCodec_gsmEnhancedFullRate,	// H323AudioGSMData 
  PluginCodec_H323AudioCodec_g729Extensions,      // not yet implemented 
 
  // video codecs 
  PluginCodec_H323VideoCodec_h261,                // not yet implemented  
  PluginCodec_H323VideoCodec_h262,                // not yet implemented 
  PluginCodec_H323VideoCodec_h263,                // not yet implemented 
  PluginCodec_H323VideoCodec_is11172,             // not yet implemented 
}; 
 
 
 
#ifdef OPAL_STATIC_CODEC 
 
#  undef PLUGIN_CODEC_DLL_API 
#  define PLUGIN_CODEC_DLL_API static 
#  define PLUGIN_CODEC_IMPLEMENT(name) \ 
unsigned int Opal_StaticCodec_##name##_GetAPIVersion() \ 
{ return PWLIB_PLUGIN_API_VERSION; } \ 
static struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned /*version*/); \ 
struct PluginCodec_Definition * Opal_StaticCodec_##name##_GetCodecs(unsigned * p1, unsigned p2) \ 
{ return PLUGIN_CODEC_GET_CODEC_FN(p1,p2); } \ 
 
#else 
 
#  define PLUGIN_CODEC_IMPLEMENT(name) \ 
PLUGIN_CODEC_DLL_API unsigned int PLUGIN_CODEC_API_VER_FN() \ 
{ return PWLIB_PLUGIN_API_VERSION; } \ 
 
#endif 
 
#ifdef __cplusplus 
}; 
#endif 
 
#endif