OPAL Version 3.10.2
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: 26036 $
00027  * $Author: rjongbloed $
00028  * $Date: 2011-06-16 20:40:56 -0500 (Thu, 16 Jun 2011) $
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     static int GetChannelCount(const PluginCodec_Definition * codeDefn);
00085 
00086     virtual OpalMediaFormatInternal * OnCreateAudioFormat(OpalPluginCodecManager & mgr,
00087                                             const PluginCodec_Definition * codecDefn,
00088                                                               const char * fmtName,
00089                                                               const char * rtpEncodingName,
00090                                                                   unsigned frameTime,
00091                                                                   unsigned timeUnits,
00092                                                                     time_t timeStamp);
00093 
00094 #if OPAL_VIDEO
00095     virtual OpalMediaFormatInternal * OnCreateVideoFormat(OpalPluginCodecManager & mgr,
00096                                             const PluginCodec_Definition * codecDefn,
00097                                                               const char * fmtName,
00098                                                               const char * rtpEncodingName,
00099                                                                     time_t timeStamp);
00100     virtual void RegisterVideoTranscoder(const PString & src, const PString & dst, const PluginCodec_Definition * codec, bool v);
00101 #endif
00102 
00103 #if OPAL_T38_CAPABILITY
00104     virtual OpalMediaFormatInternal * OnCreateFaxFormat(OpalPluginCodecManager & mgr,
00105                                           const PluginCodec_Definition * codecDefn,
00106                                                             const char * fmtName,
00107                                                             const char * rtpEncodingName,
00108                                                                 unsigned frameTime,
00109                                                                 unsigned timeUnits,
00110                                                                   time_t timeStamp);
00111 #endif
00112 };
00113 
00114 
00115 class OpalPluginCodecManager : public PPluginModuleManager
00116 {
00117   PCLASSINFO(OpalPluginCodecManager, PPluginModuleManager);
00118   public:
00119     OpalPluginCodecManager(PPluginManager * pluginMgr = NULL);
00120     ~OpalPluginCodecManager();
00121 
00122     void RegisterStaticCodec(const H323StaticPluginCodecFactory::Key_T & name,
00123                              PluginCodec_GetAPIVersionFunction getApiVerFn,
00124                              PluginCodec_GetCodecFunction getCodecFn);
00125 
00126     void OnLoadPlugin(PDynaLink & dll, INT code);
00127 
00128     virtual void OnShutdown();
00129 
00130 #if OPAL_H323
00131     H323Capability * CreateCapability(
00132           const PString & _mediaFormat, 
00133           const PString & _baseName,
00134                  unsigned maxFramesPerPacket, 
00135                  unsigned recommendedFramesPerPacket,
00136                  unsigned _pluginSubType);
00137 #endif
00138 
00139   protected:
00140     // Note the below MUST NOT be an OpalMediaFormatList
00141     PList<OpalMediaFormat> mediaFormatsOnHeap;
00142 
00143     void RegisterCodecPlugins  (unsigned int count, const PluginCodec_Definition * codecList, OpalPluginCodecHandler * handler);
00144     void UnregisterCodecPlugins(unsigned int count, const PluginCodec_Definition * codecList, OpalPluginCodecHandler * handler);
00145 
00146     bool AddMediaFormat(OpalPluginCodecHandler * handler, const PTime & timeNow, const PluginCodec_Definition * codecDefn, const char * fmtName);
00147 #if OPAL_H323
00148     void RegisterCapability(const PluginCodec_Definition * codecDefn);
00149 #endif
00150 };
00151 
00152 
00154 
00155 class OpalPluginControl
00156 {
00157   public:
00158     OpalPluginControl(const PluginCodec_Definition * def, const char * name);
00159 
00160     bool Exists() const
00161     {
00162       return controlDef != NULL;
00163     }
00164 
00165     int Call(void * parm, unsigned * parmLen, void * context = NULL) const
00166     {
00167       return controlDef != NULL ? (*controlDef->control)(codecDef, context, fnName, parm, parmLen) : -1;
00168     }
00169 
00170     int Call(void * parm, unsigned   parmLen, void * context = NULL) const
00171     {
00172       return Call(parm, &parmLen, context);
00173     }
00174 
00175     const char * GetName() const { return fnName; }
00176 
00177   protected:
00178     const PluginCodec_Definition  * codecDef;
00179     const char                    * fnName;
00180     const PluginCodec_ControlDefn * controlDef;
00181 };
00182 
00183 
00185 
00186 class OpalPluginMediaFormatInternal
00187 {
00188   public:
00189     OpalPluginMediaFormatInternal(const PluginCodec_Definition * defn);
00190 
00191     bool AdjustOptions(OpalMediaFormatInternal & fmt, OpalPluginControl & control) const;
00192     void PopulateOptions(OpalMediaFormatInternal & format);
00193     void SetOldStyleOption(OpalMediaFormatInternal & format, const PString & _key, const PString & _val, const PString & type);
00194     bool IsValidForProtocol(const PString & _protocol) const;
00195 
00196     const PluginCodec_Definition * codecDef;
00197     OpalPluginControl getOptionsControl;
00198     OpalPluginControl freeOptionsControl;
00199     OpalPluginControl validForProtocolControl;
00200     OpalPluginControl toNormalisedControl;
00201     OpalPluginControl toCustomisedControl;
00202 };
00203 
00204 
00205 class OpalPluginMediaFormat : public OpalMediaFormat
00206 {
00207   public:
00208     OpalPluginMediaFormat(OpalMediaFormatInternal * info)
00209       : OpalMediaFormat(info)
00210     {
00211     }
00212 
00213     OpalPluginMediaFormatInternal * GetInfo() const { return dynamic_cast<OpalPluginMediaFormatInternal *>(m_info); }
00214 };
00215 
00216 
00217 class OpalPluginTranscoder
00218 {
00219   public:
00220     OpalPluginTranscoder(const PluginCodec_Definition * defn, bool isEnc);
00221     ~OpalPluginTranscoder();
00222 
00223     bool UpdateOptions(const OpalMediaFormat & fmt);
00224     bool ExecuteCommand(const OpalMediaCommand & command);
00225     bool Transcode(const void * from, unsigned * fromLen, void * to, unsigned * toLen, unsigned * flags) const
00226     {
00227       return codecDef != NULL && codecDef->codecFunction != NULL &&
00228             (codecDef->codecFunction)(codecDef, context, from, fromLen, to, toLen, flags) != 0;
00229     }
00230 
00231   protected:
00232     const PluginCodec_Definition * codecDef;
00233     bool   isEncoder;
00234     void * context;
00235 
00236     OpalPluginControl setCodecOptions;
00237     OpalPluginControl getOutputDataSizeControl;
00238 };
00239 
00240 
00242 
00243 class OpalPluginAudioFormatInternal : public OpalAudioFormatInternal, public OpalPluginMediaFormatInternal
00244 {
00245   public:
00246     friend class OpalPluginCodecManager;
00247 
00248     OpalPluginAudioFormatInternal(
00249       const PluginCodec_Definition * codecDefn,
00250       const char * fmtName,
00251       const char * rtpEncodingName,
00252       unsigned frameTime,
00253       unsigned timeUnits,
00254       time_t timeStamp
00255     );
00256     virtual PObject * Clone() const;
00257     virtual bool IsValidForProtocol(const PString & protocol) const;
00258     virtual bool ToNormalisedOptions();
00259     virtual bool ToCustomisedOptions();
00260 };
00261 
00262 
00263 class OpalPluginFramedAudioTranscoder : public OpalFramedTranscoder, public OpalPluginTranscoder
00264 {
00265   PCLASSINFO(OpalPluginFramedAudioTranscoder, OpalFramedTranscoder);
00266   public:
00267     OpalPluginFramedAudioTranscoder(const PluginCodec_Definition * codecDefn, bool isEncoder);
00268     bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00269     PBoolean ExecuteCommand(const OpalMediaCommand & command);
00270     PBoolean ConvertFrame(const BYTE * input, PINDEX & consumed, BYTE * output, PINDEX & created);
00271     virtual PBoolean ConvertSilentFrame(BYTE * buffer);
00272     virtual bool AcceptComfortNoise() const { return comfortNoise; }
00273   protected:
00274     bool comfortNoise;
00275 };
00276 
00277 
00278 class OpalPluginStreamedAudioTranscoder : public OpalStreamedTranscoder, public OpalPluginTranscoder
00279 {
00280   PCLASSINFO(OpalPluginStreamedAudioTranscoder, OpalStreamedTranscoder);
00281   public:
00282     OpalPluginStreamedAudioTranscoder(const PluginCodec_Definition * codec, bool isEncoder);
00283     bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00284     PBoolean ExecuteCommand(const OpalMediaCommand & command);
00285     virtual bool AcceptComfortNoise() const { return comfortNoise; }
00286     virtual int ConvertOne(int from) const;
00287   protected:
00288     bool comfortNoise;
00289 };
00290 
00291 
00293 
00294 #if OPAL_VIDEO
00295 
00296 class OpalPluginVideoFormatInternal : public OpalVideoFormatInternal, public OpalPluginMediaFormatInternal
00297 {
00298   public:
00299     OpalPluginVideoFormatInternal(
00300       const PluginCodec_Definition * codec,
00301       const char * fmtName,
00302       const char * rtpEncodingName, 
00303       time_t timeStamp              
00304     );
00305     virtual PObject * Clone() const;
00306     virtual bool IsValidForProtocol(const PString & protocol) const;
00307     virtual bool ToNormalisedOptions();
00308     virtual bool ToCustomisedOptions();
00309 };
00310 
00311 
00312 class OpalPluginVideoTranscoder : public OpalVideoTranscoder, public OpalPluginTranscoder
00313 {
00314   PCLASSINFO(OpalPluginVideoTranscoder, OpalVideoTranscoder);
00315   public:
00316     OpalPluginVideoTranscoder(const PluginCodec_Definition * codec, bool isEncoder);
00317     ~OpalPluginVideoTranscoder();
00318 
00319     PBoolean ConvertFrames(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00320     bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00321     PBoolean ExecuteCommand(const OpalMediaCommand & command);
00322 
00323   protected:
00324     bool EncodeFrames(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00325     bool DecodeFrames(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00326     bool DecodeFrame(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00327 
00328     RTP_DataFrame * m_bufferRTP;
00329     DWORD           m_lastDecodedTimestamp; // For missing marker bit detection
00330     DWORD           m_lastMarkerTimestamp;  // For continuous marker bit detection
00331     bool            m_badMarkers;
00332     PSimpleTimer    m_videoPictureLossTimer;
00333 
00334 #if PTRACING
00335     unsigned m_consecutiveIntraFrames;
00336 #endif
00337 };
00338 
00339 #endif
00340 
00342 
00343 #if OPAL_T38_CAPABILITY
00344 
00345 class OpalPluginFaxFormatInternal : public OpalMediaFormatInternal, public OpalPluginMediaFormatInternal
00346 {
00347   public:
00348     OpalPluginFaxFormatInternal(
00349       const PluginCodec_Definition * codec,
00350       const char * fmtName,
00351       const char * rtpEncodingName, 
00352       unsigned frameTime,
00353       unsigned /*timeUnits*/,           
00354       time_t timeStamp              
00355     );
00356     virtual PObject * Clone() const;
00357     virtual bool IsValidForProtocol(const PString & protocol) const;
00358 };
00359 
00360 #endif // OPAL_T38_CAPABILITY
00361 
00362 
00364 //
00365 //  this is the base class for codecs accessible via the abstract factory functions
00366 //
00367 
00375 class OpalFactoryCodec : public PObject {
00376   PCLASSINFO(OpalFactoryCodec, PObject)
00377   public:
00379     virtual const struct PluginCodec_Definition * GetDefinition()
00380     { return NULL; }
00381 
00383     virtual PString GetInputFormat() const = 0;
00384 
00386     virtual PString GetOutputFormat() const = 0;
00387 
00389     virtual int Encode(const void * from,      
00390                          unsigned * fromLen,   
00391                              void * to,        
00392                                  unsigned * toLen,     
00393                      unsigned int * flag       
00394                        ) = 0;  
00395 
00397     virtual unsigned int GetSampleRate() const = 0;
00398 
00400     virtual unsigned int GetBitsPerSec() const = 0;
00401 
00403     virtual unsigned int GetFrameTime() const = 0;
00404 
00406     virtual unsigned int GetSamplesPerFrame() const = 0;
00407 
00409     virtual unsigned int GetBytesPerFrame() const = 0;
00410 
00412     virtual unsigned int GetRecommendedFramesPerPacket() const = 0;
00413 
00415     virtual unsigned int GetMaxFramesPerPacket() const = 0;
00416 
00418     virtual BYTE         GetRTPPayload() const = 0;
00419 
00421     virtual PString      GetSDPFormat() const = 0;
00422 };
00423 
00425 
00426 template<class TranscoderClass>
00427 class OpalPluginTranscoderFactory : public OpalTranscoderFactory
00428 {
00429   public:
00430     class Worker : public OpalTranscoderFactory::WorkerBase 
00431     {
00432       public:
00433         Worker(const OpalTranscoderKey & key, const PluginCodec_Definition * codec, bool enc)
00434           : OpalTranscoderFactory::WorkerBase(), codecDefn(codec), isEncoder(enc)
00435         { OpalTranscoderFactory::Register(key, this); }
00436 
00437       protected:
00438         virtual OpalTranscoder * Create(const OpalTranscoderKey &) const
00439         { return new TranscoderClass(codecDefn, isEncoder); }
00440 
00441         const PluginCodec_Definition * codecDefn;
00442         bool isEncoder;
00443     };
00444 };
00445 
00447 //
00448 // Helper class for handling plugin capabilities
00449 //
00450 
00451 class H323PluginCapabilityInfo
00452 {
00453   public:
00454     H323PluginCapabilityInfo(const PluginCodec_Definition * codecDefn, const OpalMediaFormat & mediaFormat);
00455 
00456     //H323PluginCapabilityInfo(const PString & _baseName);
00457 
00458     const PString & GetFormatName() const
00459     { return m_capabilityFormatName; }
00460 
00461   protected:
00462     const PluginCodec_Definition * m_codecDefn;
00463     PString                        m_capabilityFormatName;
00464 };
00465 
00466 #if OPAL_H323
00467 
00469 //
00470 // Class for handling most audio plugin capabilities
00471 //
00472 
00473 class H323AudioPluginCapability : public H323AudioCapability,
00474                                   public H323PluginCapabilityInfo
00475 {
00476   PCLASSINFO(H323AudioPluginCapability, H323AudioCapability);
00477   public:
00478     H323AudioPluginCapability(const PluginCodec_Definition * codecDefn,
00479                               const OpalMediaFormat & mediaFormat,
00480                               unsigned pluginSubType);
00481 
00482     virtual PObject * Clone() const;
00483 
00484     virtual PString GetFormatName() const;
00485 
00486     virtual unsigned GetSubType() const;
00487 
00488   protected:
00489     unsigned pluginSubType;
00490 };
00491 
00492 #define OPAL_DECLARE_EMPTY_AUDIO_CAPABILITY(fmt, type) \
00493 class fmt##_CapabilityRegisterer { \
00494   public: \
00495     fmt##_CapabilityRegisterer() \
00496     { H323CapabilityFactory::Register(fmt, new H323AudioPluginCapability(fmt, fmt, type)); } \
00497 }; \
00498 
00499 #define OPAL_DEFINE_EMPTY_AUDIO_CAPABILITY(fmt) \
00500 static fmt##_CapabilityRegisterer fmt##_CapabilityRegisterer_instance; \
00501 
00502 
00503 //
00504 // Class for handling G.723.1 codecs
00505 //
00506 
00507 class H323PluginG7231Capability : public H323AudioPluginCapability
00508 {
00509   PCLASSINFO(H323PluginG7231Capability, H323AudioPluginCapability);
00510   public:
00511     H323PluginG7231Capability(const PluginCodec_Definition * codecDefn,
00512                               const OpalMediaFormat & mediaFormat);
00513 
00514     virtual PObject * Clone() const;
00515     virtual PBoolean OnSendingPDU(H245_AudioCapability & cap, unsigned packetSize) const;
00516     virtual PBoolean OnReceivedPDU(const H245_AudioCapability & cap,  unsigned & packetSize);
00517 };
00518 
00519 #define OPAL_DECLARE_EMPTY_G7231_CAPABILITY(fmt, annex) \
00520 class fmt##_CapabilityRegisterer { \
00521   public: \
00522     fmt##_CapabilityRegisterer() \
00523     { H323CapabilityFactory::Register(fmt, new H323PluginG7231Capability(fmt, annex)); } \
00524 }; \
00525 
00526 #define OPAL_DEFINE_EMPTY_G7231_CAPABILITY(fmt) \
00527 static fmt##_CapabilityRegisterer fmt##_CapabilityRegisterer_instance; \
00528 
00529 
00530 //
00531 // Class for handling non standard audio capabilities
00532 //
00533 
00534 class H323CodecPluginNonStandardAudioCapability : public H323NonStandardAudioCapability,
00535                                                   public H323PluginCapabilityInfo
00536 {
00537   PCLASSINFO(H323CodecPluginNonStandardAudioCapability, H323NonStandardAudioCapability);
00538   public:
00539     H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * codecDefn,
00540                                               const OpalMediaFormat & mediaFormat,
00541                                               H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00542                                               const unsigned char * data, unsigned dataLen);
00543 
00544     H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * codecDefn,
00545                                               const OpalMediaFormat & mediaFormat,
00546                                               const unsigned char * data, unsigned dataLen);
00547 
00548     virtual PObject * Clone() const;
00549 
00550     virtual PString GetFormatName() const;
00551 };
00552 
00554 //
00555 // Class for handling generic audio capabilities
00556 //
00557 
00558 class H323CodecPluginGenericAudioCapability : public H323GenericAudioCapability,
00559                                               public H323PluginCapabilityInfo
00560 {
00561   PCLASSINFO(H323CodecPluginGenericAudioCapability, H323GenericAudioCapability);
00562   public:
00563     H323CodecPluginGenericAudioCapability(const PluginCodec_Definition * codecDefn,
00564                                           const OpalMediaFormat & mediaFormat,
00565                                           const PluginCodec_H323GenericCodecData * data);
00566 
00567     virtual PObject * Clone() const;
00568     virtual PString GetFormatName() const;
00569 };
00570 
00571 
00572 #if OPAL_VIDEO
00573 
00575 //
00576 // Class for handling most audio plugin capabilities
00577 //
00578 
00579 class H323VideoPluginCapability : public H323VideoCapability,
00580                              public H323PluginCapabilityInfo
00581 {
00582   PCLASSINFO(H323VideoPluginCapability, H323VideoCapability);
00583   public:
00584     H323VideoPluginCapability(const PluginCodec_Definition * codecDefn,
00585                               const OpalMediaFormat & mediaFormat,
00586                               unsigned _pluginSubType);
00587 
00588     virtual PString GetFormatName() const;
00589 
00590     virtual unsigned GetSubType() const;
00591 
00592     static bool SetOptionsFromMPI(OpalMediaFormat & mediaFormat, int frameWidth, int frameHeight, int frameRate);
00593 
00594     virtual void PrintOn(std::ostream & strm) const;
00595 
00596   protected:
00597     unsigned pluginSubType;
00598     unsigned h323subType;   // only set if using capability without codec
00599 };
00600 
00602 //
00603 // Class for handling non standard video capabilities
00604 //
00605 
00606 class H323CodecPluginNonStandardVideoCapability : public H323NonStandardVideoCapability,
00607                                                   public H323PluginCapabilityInfo
00608 {
00609   PCLASSINFO(H323CodecPluginNonStandardVideoCapability, H323NonStandardVideoCapability);
00610   public:
00611     H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * codecDefn,
00612                                               const OpalMediaFormat & mediaFormat,
00613                                               H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00614                                               const unsigned char * data, unsigned dataLen);
00615 
00616     H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * codecDefn,
00617                                               const OpalMediaFormat & mediaFormat,
00618                                               const unsigned char * data, unsigned dataLen);
00619 
00620     virtual PObject * Clone() const;
00621 
00622     virtual PString GetFormatName() const;
00623 };
00624 
00626 //
00627 // Class for handling generic video capabilities
00628 //
00629 
00630 class H323CodecPluginGenericVideoCapability : public H323GenericVideoCapability,
00631                                               public H323PluginCapabilityInfo
00632 {
00633   PCLASSINFO(H323CodecPluginGenericVideoCapability, H323GenericVideoCapability);
00634   public:
00635     H323CodecPluginGenericVideoCapability(const PluginCodec_Definition * codecDefn,
00636                                           const OpalMediaFormat & mediaFormat,
00637                                           const PluginCodec_H323GenericCodecData * data);
00638 
00639     virtual PObject * Clone() const;
00640 
00641     virtual PString GetFormatName() const;
00642 };
00643 
00645 //
00646 // Class for handling H.261 plugin capabilities
00647 //
00648 
00649 class H323H261PluginCapability : public H323VideoPluginCapability
00650 {
00651   PCLASSINFO(H323H261PluginCapability, H323VideoPluginCapability);
00652   public:
00653     H323H261PluginCapability(const PluginCodec_Definition * codecDefn, const OpalMediaFormat & mediaFormat);
00654 
00655     Comparison Compare(const PObject & obj) const;
00656 
00657     virtual PObject * Clone() const;
00658 
00659     virtual PBoolean OnSendingPDU(
00660       H245_VideoCapability & pdu  
00661     ) const;
00662 
00663     virtual PBoolean OnSendingPDU(
00664       H245_VideoMode & pdu
00665     ) const;
00666 
00667     virtual PBoolean OnReceivedPDU(
00668       const H245_VideoCapability & pdu  
00669     );
00670 };
00671 
00673 //
00674 // Class for handling H.263 plugin capabilities
00675 //
00676 
00677 class H323H263PluginCapability : public H323VideoPluginCapability
00678 {
00679   PCLASSINFO(H323H263PluginCapability, H323VideoPluginCapability);
00680   public:
00681     H323H263PluginCapability(const PluginCodec_Definition * codecDefn, const OpalMediaFormat & mediaFormat);
00682 
00683     Comparison Compare(const PObject & obj) const;
00684 
00685     virtual PObject * Clone() const;
00686 
00687     virtual PBoolean OnSendingPDU(
00688       H245_VideoCapability & pdu  
00689     ) const;
00690 
00691     virtual PBoolean OnSendingPDU(
00692       H245_VideoMode & pdu
00693     ) const;
00694 
00695     virtual PBoolean OnReceivedPDU(
00696       const H245_VideoCapability & pdu  
00697     );
00698     virtual PBoolean IsMatch(const PASN_Choice & subTypePDU) const;
00699 };
00700 
00701 #endif // OPAL_VIDEO
00702 #endif // OPAL_H323
00703 
00704 #endif // OPAL_CODEC_OPALPLUGINMGR_H