/* * 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.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_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 }; 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 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