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