OPAL Version 3.10.2
|
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