opalpluginmgr.h

Go to the documentation of this file.
00001 /*
00002  * opalpluginmgr.h
00003  *
00004  * OPAL codec plugins handler
00005  *
00006  * OPAL Library
00007  *
00008  * Copyright (C) 2005-2006 Post Increment
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  * The Original Code is Open Phone Abstraction Library.
00021  *
00022  * The Initial Developer of the Original Code is Post Increment
00023  *
00024  * Contributor(s): ______________________________________.
00025  *
00026  * $Revision: 22815 $
00027  * $Author: rjongbloed $
00028  * $Date: 2009-06-05 02:09:21 +0000 (Fri, 05 Jun 2009) $
00029  */
00030 
00031 #ifndef OPAL_CODEC_OPALPLUGINMGR_H
00032 #define OPAL_CODEC_OPALPLUGINMGR_H
00033 
00034 #ifdef P_USE_PRAGMA
00035 #pragma interface
00036 #endif
00037 
00038 #include <ptlib/object.h>
00039 
00040 #include <opal/buildopts.h>
00041 
00042 #include <ptlib/pluginmgr.h>
00043 #include <ptlib/pfactory.h>
00044 #include <codec/opalplugin.h>
00045 #include <opal/mediafmt.h>
00046 #include <opal/transcoders.h>
00047 
00048 #if OPAL_H323
00049 #include <h323/h323caps.h>
00050 #endif
00051 
00052 #if OPAL_VIDEO
00053 #include <codec/vidcodec.h>
00054 #endif
00055 
00056 
00058 
00059 class H323Capability;
00060 
00061 class H323StaticPluginCodec
00062 {
00063   public:
00064     virtual ~H323StaticPluginCodec() { }
00065     virtual PluginCodec_GetAPIVersionFunction Get_GetAPIFn() = 0;
00066     virtual PluginCodec_GetCodecFunction Get_GetCodecFn() = 0;
00067 };
00068 
00069 typedef PFactory<H323StaticPluginCodec> H323StaticPluginCodecFactory;
00070 
00071 
00073 
00074 class OpalPluginCodecManager;
00075 
00076 PFACTORY_LOAD(OpalPluginCodecManager);
00077 
00078 class OpalPluginCodecHandler : public PObject
00079 {
00080   PCLASSINFO(OpalPluginCodecHandler, PObject);
00081   public:
00082     OpalPluginCodecHandler();
00083 
00084     virtual OpalMediaFormatInternal * OnCreateAudioFormat(OpalPluginCodecManager & mgr,
00085                                             const PluginCodec_Definition * codecDefn,
00086                                                               const char * fmtName,
00087                                                               const char * rtpEncodingName,
00088                                                                   unsigned frameTime,
00089                                                                   unsigned timeUnits,
00090                                                                     time_t timeStamp);
00091 
00092 #if OPAL_VIDEO
00093     virtual OpalMediaFormatInternal * OnCreateVideoFormat(OpalPluginCodecManager & mgr,
00094                                             const PluginCodec_Definition * codecDefn,
00095                                                               const char * fmtName,
00096                                                               const char * rtpEncodingName,
00097                                                                     time_t timeStamp);
00098     virtual void RegisterVideoTranscoder(const PString & src, const PString & dst, const PluginCodec_Definition * codec, bool v);
00099 #endif
00100 
00101 #if OPAL_T38_CAPABILITY
00102     virtual OpalMediaFormatInternal * OnCreateFaxFormat(OpalPluginCodecManager & mgr,
00103                                           const PluginCodec_Definition * codecDefn,
00104                                                             const char * fmtName,
00105                                                             const char * rtpEncodingName,
00106                                                                 unsigned frameTime,
00107                                                                 unsigned timeUnits,
00108                                                                   time_t timeStamp);
00109 #endif
00110 };
00111 
00112 
00113 class OpalPluginCodecManager : public PPluginModuleManager
00114 {
00115   PCLASSINFO(OpalPluginCodecManager, PPluginModuleManager);
00116   public:
00117     OpalPluginCodecManager(PPluginManager * pluginMgr = NULL);
00118     ~OpalPluginCodecManager();
00119 
00120     void RegisterStaticCodec(const H323StaticPluginCodecFactory::Key_T & name,
00121                              PluginCodec_GetAPIVersionFunction getApiVerFn,
00122                              PluginCodec_GetCodecFunction getCodecFn);
00123 
00124     void OnLoadPlugin(PDynaLink & dll, INT code);
00125 
00126     virtual void OnShutdown();
00127 
00128 #if OPAL_H323
00129     H323Capability * CreateCapability(
00130           const PString & _mediaFormat, 
00131           const PString & _baseName,
00132                  unsigned maxFramesPerPacket, 
00133                  unsigned recommendedFramesPerPacket,
00134                  unsigned _pluginSubType);
00135 #endif
00136 
00137   protected:
00138     // Note the below MUST NOT be an OpalMediaFormatList
00139     PList<OpalMediaFormat> mediaFormatsOnHeap;
00140 
00141     void RegisterCodecPlugins  (unsigned int count, const PluginCodec_Definition * codecList, OpalPluginCodecHandler * handler);
00142     void UnregisterCodecPlugins(unsigned int count, const PluginCodec_Definition * codecList, OpalPluginCodecHandler * handler);
00143 
00144     bool AddMediaFormat(OpalPluginCodecHandler * handler, time_t timeNow, const PluginCodec_Definition * codecDefn, const char * fmtName);
00145 #if OPAL_H323
00146     void RegisterCapability(const PluginCodec_Definition * codecDefn);
00147 #endif
00148 };
00149 
00150 
00152 
00153 class OpalPluginControl
00154 {
00155   public:
00156     OpalPluginControl(const PluginCodec_Definition * def, const char * name);
00157 
00158     bool Exists() const
00159     {
00160       return controlDef != NULL;
00161     }
00162 
00163     int Call(void * parm, unsigned * parmLen, void * context = NULL) const
00164     {
00165       return controlDef != NULL ? (*controlDef->control)(codecDef, context, fnName, parm, parmLen) : -1;
00166     }
00167 
00168     int Call(void * parm, unsigned   parmLen, void * context = NULL) const
00169     {
00170       return Call(parm, &parmLen, context);
00171     }
00172 
00173     const char * GetName() const { return fnName; }
00174 
00175   protected:
00176     const PluginCodec_Definition  * codecDef;
00177     const char                    * fnName;
00178     const PluginCodec_ControlDefn * controlDef;
00179 };
00180 
00181 
00183 
00184 class OpalPluginMediaFormatInternal
00185 {
00186   public:
00187     OpalPluginMediaFormatInternal(const PluginCodec_Definition * defn);
00188 
00189     bool AdjustOptions(OpalMediaFormatInternal & fmt, OpalPluginControl & control) const;
00190     void PopulateOptions(OpalMediaFormatInternal & format);
00191     void SetOldStyleOption(OpalMediaFormatInternal & format, const PString & _key, const PString & _val, const PString & type);
00192     bool IsValidForProtocol(const PString & _protocol) const;
00193 
00194     const PluginCodec_Definition * codecDef;
00195     OpalPluginControl getOptionsControl;
00196     OpalPluginControl freeOptionsControl;
00197     OpalPluginControl validForProtocolControl;
00198     OpalPluginControl toNormalisedControl;
00199     OpalPluginControl toCustomisedControl;
00200 };
00201 
00202 
00203 class OpalPluginMediaFormat : public OpalMediaFormat
00204 {
00205   public:
00206     OpalPluginMediaFormat(OpalMediaFormatInternal * info)
00207       : OpalMediaFormat(info)
00208     {
00209     }
00210 
00211     OpalPluginMediaFormatInternal * GetInfo() const { return dynamic_cast<OpalPluginMediaFormatInternal *>(m_info); }
00212 };
00213 
00214 
00215 class OpalPluginTranscoder
00216 {
00217   public:
00218     OpalPluginTranscoder(const PluginCodec_Definition * defn, bool isEnc);
00219     ~OpalPluginTranscoder();
00220 
00221     bool UpdateOptions(const OpalMediaFormat & fmt);
00222     bool Transcode(const void * from, unsigned * fromLen, void * to, unsigned * toLen, unsigned * flags) const
00223     {
00224       return codecDef != NULL && codecDef->codecFunction != NULL &&
00225             (codecDef->codecFunction)(codecDef, context, from, fromLen, to, toLen, flags) != 0;
00226     }
00227 
00228   protected:
00229     const PluginCodec_Definition * codecDef;
00230     bool   isEncoder;
00231     void * context;
00232 
00233     OpalPluginControl setCodecOptions;
00234     OpalPluginControl getOutputDataSizeControl;
00235 };
00236 
00237 
00239 
00240 class OpalPluginAudioFormatInternal : public OpalAudioFormatInternal, public OpalPluginMediaFormatInternal
00241 {
00242   public:
00243     friend class OpalPluginCodecManager;
00244 
00245     OpalPluginAudioFormatInternal(
00246       const PluginCodec_Definition * codecDefn,
00247       const char * fmtName,
00248       const char * rtpEncodingName, 
00249       unsigned frameTime,           
00250       unsigned /*timeUnits*/,       
00251       time_t timeStamp              
00252     );
00253     virtual PObject * Clone() const;
00254     virtual bool IsValidForProtocol(const PString & protocol) const;
00255     virtual bool ToNormalisedOptions();
00256     virtual bool ToCustomisedOptions();
00257 };
00258 
00259 
00260 class OpalPluginFramedAudioTranscoder : public OpalFramedTranscoder, public OpalPluginTranscoder
00261 {
00262   PCLASSINFO(OpalPluginFramedAudioTranscoder, OpalFramedTranscoder);
00263   public:
00264     OpalPluginFramedAudioTranscoder(const PluginCodec_Definition * codecDefn, bool isEncoder);
00265     bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00266     PBoolean ConvertFrame(const BYTE * input, PINDEX & consumed, BYTE * output, PINDEX & created);
00267     virtual PBoolean ConvertSilentFrame(BYTE * buffer);
00268     virtual bool AcceptComfortNoise() const { return comfortNoise; }
00269   protected:
00270     bool comfortNoise;
00271 };
00272 
00273 
00274 class OpalPluginStreamedAudioTranscoder : public OpalStreamedTranscoder, public OpalPluginTranscoder
00275 {
00276   PCLASSINFO(OpalPluginStreamedAudioTranscoder, OpalStreamedTranscoder);
00277   public:
00278     OpalPluginStreamedAudioTranscoder(const PluginCodec_Definition * codec, bool isEncoder);
00279     bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00280     virtual bool AcceptComfortNoise() const { return comfortNoise; }
00281     virtual int ConvertOne(int from) const;
00282   protected:
00283     bool comfortNoise;
00284 };
00285 
00286 
00288 
00289 #if OPAL_VIDEO
00290 
00291 class OpalPluginVideoFormatInternal : public OpalVideoFormatInternal, public OpalPluginMediaFormatInternal
00292 {
00293   public:
00294     OpalPluginVideoFormatInternal(
00295       const PluginCodec_Definition * codec,
00296       const char * fmtName,
00297       const char * rtpEncodingName, 
00298       time_t timeStamp              
00299     );
00300     virtual PObject * Clone() const;
00301     virtual bool IsValidForProtocol(const PString & protocol) const;
00302     virtual bool ToNormalisedOptions();
00303     virtual bool ToCustomisedOptions();
00304 };
00305 
00306 
00307 class OpalPluginVideoTranscoder : public OpalVideoTranscoder, public OpalPluginTranscoder
00308 {
00309   PCLASSINFO(OpalPluginVideoTranscoder, OpalVideoTranscoder);
00310   public:
00311     OpalPluginVideoTranscoder(const PluginCodec_Definition * codec, bool isEncoder);
00312     ~OpalPluginVideoTranscoder();
00313 
00314     PBoolean ConvertFrames(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00315     bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00316 
00317   protected:
00318     RTP_DataFrame * m_bufferRTP;
00319     PTimeInterval   m_lastVideoFastUpdate;
00320 
00321 #if PTRACING
00322     unsigned m_consecutiveIntraFrames;
00323 #endif
00324 };
00325 
00326 #endif
00327 
00329 
00330 #if OPAL_T38_CAPABILITY
00331 
00332 class OpalPluginFaxFormatInternal : public OpalMediaFormatInternal, public OpalPluginMediaFormatInternal
00333 {
00334   public:
00335     OpalPluginFaxFormatInternal(
00336       const PluginCodec_Definition * codec,
00337       const char * fmtName,
00338       const char * rtpEncodingName, 
00339       unsigned frameTime,
00340       unsigned /*timeUnits*/,           
00341       time_t timeStamp              
00342     );
00343     virtual PObject * Clone() const;
00344     virtual bool IsValidForProtocol(const PString & protocol) const;
00345 };
00346 
00347 #endif // OPAL_T38_CAPABILITY
00348 
00349 
00351 //
00352 //  this is the base class for codecs accesible via the abstract factory functions
00353 //
00354 
00362 class OpalFactoryCodec : public PObject {
00363   PCLASSINFO(OpalFactoryCodec, PObject)
00364   public:
00366     virtual const struct PluginCodec_Definition * GetDefinition()
00367     { return NULL; }
00368 
00370     virtual PString GetInputFormat() const = 0;
00371 
00373     virtual PString GetOutputFormat() const = 0;
00374 
00376     virtual int Encode(const void * from,      
00377                          unsigned * fromLen,   
00378                              void * to,        
00379                                  unsigned * toLen,     
00380                      unsigned int * flag       
00381                        ) = 0;  
00382 
00384     virtual unsigned int GetSampleRate() const = 0;
00385 
00387     virtual unsigned int GetBitsPerSec() const = 0;
00388 
00390     virtual unsigned int GetFrameTime() const = 0;
00391 
00393     virtual unsigned int GetSamplesPerFrame() const = 0;
00394 
00396     virtual unsigned int GetBytesPerFrame() const = 0;
00397 
00399     virtual unsigned int GetRecommendedFramesPerPacket() const = 0;
00400 
00402     virtual unsigned int GetMaxFramesPerPacket() const = 0;
00403 
00405     virtual BYTE         GetRTPPayload() const = 0;
00406 
00408     virtual PString      GetSDPFormat() const = 0;
00409 };
00410 
00412 
00413 template<class TranscoderClass>
00414 class OpalPluginTranscoderFactory : public OpalTranscoderFactory
00415 {
00416   public:
00417     class Worker : public OpalTranscoderFactory::WorkerBase 
00418     {
00419       public:
00420         Worker(const OpalTranscoderKey & key, const PluginCodec_Definition * codec, bool enc)
00421           : OpalTranscoderFactory::WorkerBase(), codecDefn(codec), isEncoder(enc)
00422         { OpalTranscoderFactory::Register(key, this); }
00423 
00424       protected:
00425         virtual OpalTranscoder * Create(const OpalTranscoderKey &) const
00426         { return new TranscoderClass(codecDefn, isEncoder); }
00427 
00428         const PluginCodec_Definition * codecDefn;
00429         bool isEncoder;
00430     };
00431 };
00432 
00434 //
00435 // Helper class for handling plugin capabilities
00436 //
00437 
00438 class H323PluginCapabilityInfo
00439 {
00440   public:
00441     H323PluginCapabilityInfo(const PluginCodec_Definition * codecDefn, const OpalMediaFormat & mediaFormat);
00442 
00443     //H323PluginCapabilityInfo(const PString & _baseName);
00444 
00445     const PString & GetFormatName() const
00446     { return m_capabilityFormatName; }
00447 
00448   protected:
00449     const PluginCodec_Definition * m_codecDefn;
00450     PString                        m_capabilityFormatName;
00451 };
00452 
00453 #if OPAL_H323
00454 
00456 //
00457 // Class for handling most audio plugin capabilities
00458 //
00459 
00460 class H323AudioPluginCapability : public H323AudioCapability,
00461                                   public H323PluginCapabilityInfo
00462 {
00463   PCLASSINFO(H323AudioPluginCapability, H323AudioCapability);
00464   public:
00465     H323AudioPluginCapability(const PluginCodec_Definition * codecDefn,
00466                               const OpalMediaFormat & mediaFormat,
00467                               unsigned pluginSubType);
00468 
00469     virtual PObject * Clone() const;
00470 
00471     virtual PString GetFormatName() const;
00472 
00473     virtual unsigned GetSubType() const;
00474 
00475   protected:
00476     unsigned pluginSubType;
00477 };
00478 
00479 #define OPAL_DECLARE_EMPTY_AUDIO_CAPABILITY(fmt, type) \
00480 class fmt##_CapabilityRegisterer { \
00481   public: \
00482     fmt##_CapabilityRegisterer() \
00483     { H323CapabilityFactory::Register(fmt, new H323AudioPluginCapability(fmt, fmt, type)); } \
00484 }; \
00485 
00486 #define OPAL_DEFINE_EMPTY_AUDIO_CAPABILITY(fmt) \
00487 static fmt##_CapabilityRegisterer fmt##_CapabilityRegisterer_instance; \
00488 
00490 //
00491 // Class for handling G.723.1 codecs
00492 //
00493 
00494 class H323PluginG7231Capability : public H323AudioPluginCapability
00495 {
00496   PCLASSINFO(H323PluginG7231Capability, H323AudioPluginCapability);
00497   public:
00498     H323PluginG7231Capability(const PluginCodec_Definition * codecDefn,
00499                               const OpalMediaFormat & mediaFormat);
00500 
00501     virtual PObject * Clone() const;
00502     virtual PBoolean OnSendingPDU(H245_AudioCapability & cap, unsigned packetSize) const;
00503     virtual PBoolean OnReceivedPDU(const H245_AudioCapability & cap,  unsigned & packetSize);
00504 };
00505 
00506 #define OPAL_DECLARE_EMPTY_G7231_CAPABILITY(fmt, annex) \
00507 class fmt##_CapabilityRegisterer { \
00508   public: \
00509     fmt##_CapabilityRegisterer() \
00510     { H323CapabilityFactory::Register(fmt, new H323PluginG7231Capability(fmt, annex)); } \
00511 }; \
00512 
00513 #define OPAL_DEFINE_EMPTY_G7231_CAPABILITY(fmt) \
00514 static fmt##_CapabilityRegisterer fmt##_CapabilityRegisterer_instance; \
00515 
00517 //
00518 // Class for handling non standard audio capabilities
00519 //
00520 
00521 class H323CodecPluginNonStandardAudioCapability : public H323NonStandardAudioCapability,
00522                                                   public H323PluginCapabilityInfo
00523 {
00524   PCLASSINFO(H323CodecPluginNonStandardAudioCapability, H323NonStandardAudioCapability);
00525   public:
00526     H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * codecDefn,
00527                                               const OpalMediaFormat & mediaFormat,
00528                                               H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00529                                               const unsigned char * data, unsigned dataLen);
00530 
00531     H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * codecDefn,
00532                                               const OpalMediaFormat & mediaFormat,
00533                                               const unsigned char * data, unsigned dataLen);
00534 
00535     virtual PObject * Clone() const;
00536 
00537     virtual PString GetFormatName() const;
00538 };
00539 
00541 //
00542 // Class for handling generic audio capabilities
00543 //
00544 
00545 class H323CodecPluginGenericAudioCapability : public H323GenericAudioCapability,
00546                                               public H323PluginCapabilityInfo
00547 {
00548   PCLASSINFO(H323CodecPluginGenericAudioCapability, H323GenericAudioCapability);
00549   public:
00550     H323CodecPluginGenericAudioCapability(const PluginCodec_Definition * codecDefn,
00551                                           const OpalMediaFormat & mediaFormat,
00552                                           const PluginCodec_H323GenericCodecData * data);
00553 
00554     virtual PObject * Clone() const;
00555     virtual PString GetFormatName() const;
00556 };
00557 
00558 
00559 #if OPAL_VIDEO
00560 
00562 //
00563 // Class for handling most audio plugin capabilities
00564 //
00565 
00566 class H323VideoPluginCapability : public H323VideoCapability,
00567                              public H323PluginCapabilityInfo
00568 {
00569   PCLASSINFO(H323VideoPluginCapability, H323VideoCapability);
00570   public:
00571     H323VideoPluginCapability(const PluginCodec_Definition * codecDefn,
00572                               const OpalMediaFormat & mediaFormat,
00573                               unsigned _pluginSubType);
00574 
00575     virtual PString GetFormatName() const;
00576 
00577     virtual unsigned GetSubType() const;
00578 
00579     static bool SetOptionsFromMPI(OpalMediaFormat & mediaFormat, int frameWidth, int frameHeight, int frameRate);
00580 
00581     virtual void PrintOn(std::ostream & strm) const;
00582 
00583   protected:
00584     unsigned pluginSubType;
00585     unsigned h323subType;   // only set if using capability without codec
00586 };
00587 
00589 //
00590 // Class for handling non standard video capabilities
00591 //
00592 
00593 class H323CodecPluginNonStandardVideoCapability : public H323NonStandardVideoCapability,
00594                                                   public H323PluginCapabilityInfo
00595 {
00596   PCLASSINFO(H323CodecPluginNonStandardVideoCapability, H323NonStandardVideoCapability);
00597   public:
00598     H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * codecDefn,
00599                                               const OpalMediaFormat & mediaFormat,
00600                                               H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00601                                               const unsigned char * data, unsigned dataLen);
00602 
00603     H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * codecDefn,
00604                                               const OpalMediaFormat & mediaFormat,
00605                                               const unsigned char * data, unsigned dataLen);
00606 
00607     virtual PObject * Clone() const;
00608 
00609     virtual PString GetFormatName() const;
00610 };
00611 
00613 //
00614 // Class for handling generic video capabilities
00615 //
00616 
00617 class H323CodecPluginGenericVideoCapability : public H323GenericVideoCapability,
00618                                               public H323PluginCapabilityInfo
00619 {
00620   PCLASSINFO(H323CodecPluginGenericVideoCapability, H323GenericVideoCapability);
00621   public:
00622     H323CodecPluginGenericVideoCapability(const PluginCodec_Definition * codecDefn,
00623                                           const OpalMediaFormat & mediaFormat,
00624                                           const PluginCodec_H323GenericCodecData * data);
00625 
00626     virtual PObject * Clone() const;
00627 
00628     virtual PString GetFormatName() const;
00629 };
00630 
00632 //
00633 // Class for handling H.261 plugin capabilities
00634 //
00635 
00636 class H323H261PluginCapability : public H323VideoPluginCapability
00637 {
00638   PCLASSINFO(H323H261PluginCapability, H323VideoPluginCapability);
00639   public:
00640     H323H261PluginCapability(const PluginCodec_Definition * codecDefn, const OpalMediaFormat & mediaFormat);
00641 
00642     Comparison Compare(const PObject & obj) const;
00643 
00644     virtual PObject * Clone() const;
00645 
00646     virtual PBoolean OnSendingPDU(
00647       H245_VideoCapability & pdu  
00648     ) const;
00649 
00650     virtual PBoolean OnSendingPDU(
00651       H245_VideoMode & pdu
00652     ) const;
00653 
00654     virtual PBoolean OnReceivedPDU(
00655       const H245_VideoCapability & pdu  
00656     );
00657 };
00658 
00660 //
00661 // Class for handling H.263 plugin capabilities
00662 //
00663 
00664 class H323H263PluginCapability : public H323VideoPluginCapability
00665 {
00666   PCLASSINFO(H323H263PluginCapability, H323VideoPluginCapability);
00667   public:
00668     H323H263PluginCapability(const PluginCodec_Definition * codecDefn, const OpalMediaFormat & mediaFormat);
00669 
00670     Comparison Compare(const PObject & obj) const;
00671 
00672     virtual PObject * Clone() const;
00673 
00674     virtual PBoolean OnSendingPDU(
00675       H245_VideoCapability & pdu  
00676     ) const;
00677 
00678     virtual PBoolean OnSendingPDU(
00679       H245_VideoMode & pdu
00680     ) const;
00681 
00682     virtual PBoolean OnReceivedPDU(
00683       const H245_VideoCapability & pdu  
00684     );
00685     virtual PBoolean IsMatch(const PASN_Choice & subTypePDU) const;
00686 };
00687 
00688 #endif // OPAL_VIDEO
00689 #endif // OPAL_H323
00690 
00691 #endif // OPAL_CODEC_OPALPLUGINMGR_H

Generated on Mon Aug 3 20:50:24 2009 for OPAL by  doxygen 1.5.1