www.pudn.com > openh323-v1_15_1-src.zip > h323pluginmgr.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: h323pluginmgr.h,v $ 
 * Revision 1.17  2004/08/26 08:05:02  csoutheren 
 * Codecs now appear in abstract factory system 
 * Fixed Windows factory bootstrap system (again) 
 * 
 * Revision 1.16  2004/06/30 12:31:09  rjongbloed 
 * Rewrite of plug in system to use single global variable for all factories to avoid all sorts 
 *   of issues with startup orders and Windows DLL multiple instances. 
 * 
 * Revision 1.15  2004/06/03 23:20:46  csoutheren 
 * Fixed compile problem on some gcc variants 
 * 
 * Revision 1.14  2004/06/01 07:30:27  csoutheren 
 * Removed accidental cut & paste in new code that removed capabilities 
 * 
 * Revision 1.13  2004/06/01 05:49:27  csoutheren 
 * Added code to cleanup some allocated memory upon shutdown 
 * 
 * Revision 1.12  2004/05/23 12:40:34  rjongbloed 
 * Simplified call for getting H323 plug manager instance 
 * 
 * Revision 1.11  2004/05/18 23:03:10  csoutheren 
 * Added empty destructor to prevent gcc 3.3.3 from getting link errors. 
 * 
 * Revision 1.10  2004/05/18 22:32:54  csoutheren 
 * Added pragma inteface 
 * 
 * Revision 1.9  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.8  2004/05/18 06:02:25  csoutheren 
 * Deferred plugin codec loading until after main has executed by using abstract factory classes 
 * 
 * Revision 1.7  2004/05/12 13:41:26  csoutheren 
 * Added support for getting lists of media formats from plugin manager 
 * 
 * Revision 1.6  2004/04/22 22:35:00  csoutheren 
 * Fixed mispelling of Guilhem Tardy - my apologies to him 
 * 
 * Revision 1.5  2004/04/22 14:22:20  csoutheren 
 * Added RFC 2190 H.263 code as created by Guilhem Tardy and AliceStreet 
 * Many thanks to them for their contributions. 
 * 
 * Revision 1.4  2004/04/14 08:14:40  csoutheren 
 * Changed to use generic plugin manager 
 * 
 * Revision 1.3  2004/04/09 12:24:18  csoutheren 
 * Renamed h323plugin.h to opalplugin.h, and modified everything else 
 * as required 
 * 
 * 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.2  2004/01/27 14:55:46  craigs 
 * Implemented static linking of new codecs 
 * 
 * Revision 1.1  2004/01/04 13:37:51  craigs 
 * Implementation of codec plugins 
 * 
 * 
 */ 
 
#ifndef __OPAL_H323PLUGINMGR_H 
#define __OPAL_H323PLUGINMGR_H 
 
#ifdef P_USE_PRAGMA 
#pragma interface 
#endif 
 
#include  
#include  
#include  
#include  
 
namespace PWLibStupidLinkerHacks { 
 
#ifndef NO_H323_VIDEO 
extern int h261Loader; 
extern int rfc2190h263Loader; 
#endif 
 
extern int opalwavfileLoader; 
 
extern void H323BootStrapPlugins(); 
extern void H323BootStrapNonPlugins(); 
 
} // namespace PWLibStupidLinkerHacks 
 
 
class H323PluginCodecManager : public PPluginModuleManager 
{ 
  PCLASSINFO(H323PluginCodecManager, PPluginModuleManager); 
  public: 
    H323PluginCodecManager(PPluginManager * pluginMgr = NULL); 
    ~H323PluginCodecManager(); 
 
    void RegisterStaticCodec(const char * name, 
                             PluginCodec_GetAPIVersionFunction getApiVerFn, 
                             PluginCodec_GetCodecFunction getCodecFn); 
 
    void OnLoadPlugin(PDynaLink & dll, INT code); 
 
    static OpalMediaFormat::List GetMediaFormats(); 
    static void AddFormat(const OpalMediaFormat & fmt); 
 
    virtual void OnShutdown(); 
 
  protected: 
    void CreateCapabilityAndMediaFormat( 
      PluginCodec_Definition * _encoderCodec, 
      PluginCodec_Definition * _decoderCodec 
    ); 
 
    static OpalMediaFormat::List & GetMediaFormatList(); 
    static PMutex & GetMediaFormatMutex(); 
 
    void RegisterCodecs  (unsigned int count, void * codecList); 
    void UnregisterCodecs(unsigned int count, void * codecList); 
 
    friend void PWLibStupidLinkerHacks::H323BootStrapPlugins(); 
}; 
 
class H323DynaLink : public PDynaLink 
{ 
  PCLASSINFO(H323DynaLink, PDynaLink) 
     
 public: 
  H323DynaLink(const char * basename, const char * reason); 
 
  virtual void Load(); 
  virtual BOOL IsLoaded() 
  { PWaitAndSignal m(processLock); return isLoadedOK; } 
  virtual BOOL LoadPlugin (const PString & fileName); 
 
protected: 
  PMutex processLock; 
  BOOL isLoadedOK; 
  const char * baseName; 
  const char * reason; 
}; 
 
////////////////////////////////////////////////////// 
// 
//  this is the base class for codecs accesible via the abstract factory functions 
// 
 
class OpalFactoryCodec : public PObject { 
  PCLASSINFO(OpalFactoryCodec, PObject) 
  public: 
    virtual const struct PluginCodec_Definition * GetDefinition() 
    { return NULL; } 
 
    virtual PString GetInputFormat() const = 0; 
    virtual PString GetOutputFormat() const = 0; 
 
    virtual int Encode(const void * from, unsigned * fromLen, 
                             void * to,   unsigned * toLen, 
                     unsigned int * flag) = 0; 
 
    virtual unsigned int GetSampleRate() const = 0; 
    virtual unsigned int GetBitsPerSec() const = 0; 
    virtual unsigned int GetFrameTime() const = 0; 
    virtual unsigned int GetSamplesPerFrame() const = 0; 
    virtual unsigned int GetBytesPerFrame() const = 0; 
    virtual unsigned int GetRecommendedFramesPerPacket() const = 0; 
    virtual unsigned int GetMaxFramesPerPacket() const = 0; 
    virtual BYTE         GetRTPPayload() const = 0; 
    virtual PString      GetSDPFormat() const = 0; 
}; 
 
#endif