00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef __OPALPLUGINMGR_H
00032 #define __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 class OpalPluginCodecHandler : public PObject
00077 {
00078 PCLASSINFO(OpalPluginCodecHandler, PObject);
00079 public:
00080 OpalPluginCodecHandler();
00081
00082 #if OPAL_AUDIO
00083 virtual OpalMediaFormatInternal * OnCreateAudioFormat(OpalPluginCodecManager & mgr,
00084 const PluginCodec_Definition * encoderCodec,
00085 const char * rtpEncodingName,
00086 unsigned frameTime,
00087 unsigned timeUnits,
00088 time_t timeStamp);
00089 #endif
00090
00091 #if OPAL_VIDEO
00092 virtual OpalMediaFormatInternal * OnCreateVideoFormat(OpalPluginCodecManager & mgr,
00093 const PluginCodec_Definition * encoderCodec,
00094 const char * rtpEncodingName,
00095 time_t timeStamp);
00096 virtual void RegisterVideoTranscoder(const PString & src, const PString & dst, PluginCodec_Definition * codec, PBoolean v);
00097 #endif
00098
00099 #if OPAL_T38FAX
00100 virtual OpalMediaFormatInternal * OnCreateFaxFormat(OpalPluginCodecManager & mgr,
00101 const PluginCodec_Definition * encoderCodec,
00102 const char * rtpEncodingName,
00103 unsigned frameTime,
00104 unsigned timeUnits,
00105 time_t timeStamp);
00106 #endif
00107 };
00108
00109
00110 class OpalPluginCodecManager : public PPluginModuleManager
00111 {
00112 PCLASSINFO(OpalPluginCodecManager, PPluginModuleManager);
00113 public:
00114 OpalPluginCodecManager(PPluginManager * pluginMgr = NULL);
00115 ~OpalPluginCodecManager();
00116
00117 void RegisterStaticCodec(const H323StaticPluginCodecFactory::Key_T & name,
00118 PluginCodec_GetAPIVersionFunction getApiVerFn,
00119 PluginCodec_GetCodecFunction getCodecFn);
00120
00121 void OnLoadPlugin(PDynaLink & dll, INT code);
00122
00123 virtual void OnShutdown();
00124
00125 static void Bootstrap();
00126
00127 #if OPAL_H323
00128 H323Capability * CreateCapability(
00129 const PString & _mediaFormat,
00130 const PString & _baseName,
00131 unsigned maxFramesPerPacket,
00132 unsigned recommendedFramesPerPacket,
00133 unsigned _pluginSubType);
00134 #endif
00135
00136 protected:
00137 void RegisterPluginPair(
00138 PluginCodec_Definition * _encoderCodec,
00139 PluginCodec_Definition * _decoderCodec,
00140 OpalPluginCodecHandler * handler
00141 );
00142
00143
00144 PList<OpalMediaFormat> mediaFormatsOnHeap;
00145
00146 void RegisterCodecPlugins (unsigned int count, PluginCodec_Definition * codecList, OpalPluginCodecHandler * handler);
00147 void UnregisterCodecPlugins(unsigned int count, PluginCodec_Definition * codecList, OpalPluginCodecHandler * handler);
00148
00149 #if OPAL_H323
00150 void RegisterCapability(PluginCodec_Definition * encoderCodec, PluginCodec_Definition * decoderCodec);
00151 struct CapabilityListCreateEntry {
00152 CapabilityListCreateEntry(PluginCodec_Definition * e, PluginCodec_Definition * d)
00153 : encoderCodec(e), decoderCodec(d) { }
00154 PluginCodec_Definition * encoderCodec;
00155 PluginCodec_Definition * decoderCodec;
00156 };
00157 typedef vector<CapabilityListCreateEntry> CapabilityCreateListType;
00158 CapabilityCreateListType capabilityCreateList;
00159 #endif
00160 };
00161
00162
00164
00165 class OpalPluginControl
00166 {
00167 public:
00168 OpalPluginControl(const PluginCodec_Definition * def, const char * name);
00169
00170 PBoolean Exists() const
00171 {
00172 return controlDef != NULL;
00173 }
00174
00175 int Call(void * parm, unsigned * parmLen, void * context = NULL) const
00176 {
00177 return controlDef != NULL ? (*controlDef->control)(codecDef, context, fnName, parm, parmLen) : -1;
00178 }
00179
00180 int Call(void * parm, unsigned parmLen, void * context = NULL) const
00181 {
00182 return Call(parm, &parmLen, context);
00183 }
00184
00185 const char * GetName() const { return fnName; }
00186
00187 protected:
00188 const PluginCodec_Definition * codecDef;
00189 const char * fnName;
00190 const PluginCodec_ControlDefn * controlDef;
00191 };
00192
00193
00195
00196 class OpalPluginMediaFormatInternal
00197 {
00198 public:
00199 OpalPluginMediaFormatInternal(const PluginCodec_Definition * defn);
00200
00201 bool AdjustOptions(OpalMediaFormatInternal & fmt, OpalPluginControl & control) const;
00202 void PopulateOptions(OpalMediaFormatInternal & format);
00203 void SetOldStyleOption(OpalMediaFormatInternal & format, const PString & _key, const PString & _val, const PString & type);
00204 bool IsValidForProtocol(const PString & _protocol) const;
00205
00206 const PluginCodec_Definition * codecDef;
00207 OpalPluginControl getOptionsControl;
00208 OpalPluginControl freeOptionsControl;
00209 OpalPluginControl validForProtocolControl;
00210 OpalPluginControl toNormalisedControl;
00211 OpalPluginControl toCustomisedControl;
00212 };
00213
00214
00215 class OpalPluginMediaFormat : public OpalMediaFormat
00216 {
00217 public:
00218 OpalPluginMediaFormat(OpalMediaFormatInternal * info)
00219 : OpalMediaFormat(info)
00220 {
00221 }
00222
00223 OpalPluginMediaFormatInternal * GetInfo() const { return dynamic_cast<OpalPluginMediaFormatInternal *>(m_info); }
00224 };
00225
00226
00227 class OpalPluginTranscoder
00228 {
00229 public:
00230 OpalPluginTranscoder(const PluginCodec_Definition * defn, PBoolean isEnc);
00231 ~OpalPluginTranscoder();
00232
00233 bool UpdateOptions(const OpalMediaFormat & fmt);
00234 PBoolean Transcode(const void * from, unsigned * fromLen, void * to, unsigned * toLen, unsigned * flags) const
00235 {
00236 return codecDef != NULL && codecDef->codecFunction != NULL &&
00237 (codecDef->codecFunction)(codecDef, context, from, fromLen, to, toLen, flags) != 0;
00238 }
00239
00240 protected:
00241 const PluginCodec_Definition * codecDef;
00242 PBoolean isEncoder;
00243 void * context;
00244
00245 OpalPluginControl setCodecOptions;
00246 OpalPluginControl getOutputDataSizeControl;
00247 };
00248
00249
00251
00252 #if OPAL_AUDIO
00253
00254 class OpalPluginAudioFormatInternal : public OpalAudioFormatInternal, public OpalPluginMediaFormatInternal
00255 {
00256 public:
00257 friend class OpalPluginCodecManager;
00258
00259 OpalPluginAudioFormatInternal(
00260 const PluginCodec_Definition * _encoderCodec,
00261 const char * rtpEncodingName,
00262 unsigned frameTime,
00263 unsigned ,
00264 time_t timeStamp
00265 );
00266 virtual PObject * Clone() const;
00267 virtual bool IsValidForProtocol(const PString & protocol) const;
00268 virtual bool ToNormalisedOptions();
00269 virtual bool ToCustomisedOptions();
00270 };
00271
00272
00273 class OpalPluginFramedAudioTranscoder : public OpalFramedTranscoder, public OpalPluginTranscoder
00274 {
00275 PCLASSINFO(OpalPluginFramedAudioTranscoder, OpalFramedTranscoder);
00276 public:
00277 OpalPluginFramedAudioTranscoder(PluginCodec_Definition * _codec, PBoolean _isEncoder, const char * rawFormat = NULL);
00278 bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00279 PBoolean ConvertFrame(const BYTE * input, PINDEX & consumed, BYTE * output, PINDEX & created);
00280 virtual PBoolean ConvertSilentFrame(BYTE * buffer);
00281 virtual bool AcceptComfortNoise() const { return comfortNoise; }
00282 protected:
00283 bool comfortNoise;
00284 };
00285
00286
00287 class OpalPluginStreamedAudioTranscoder : public OpalStreamedTranscoder, public OpalPluginTranscoder
00288 {
00289 PCLASSINFO(OpalPluginStreamedAudioTranscoder, OpalStreamedTranscoder);
00290 public:
00291 OpalPluginStreamedAudioTranscoder(PluginCodec_Definition * _codec, PBoolean _isEncoder, unsigned inputBits, unsigned outputBits);
00292 bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00293 virtual bool AcceptComfortNoise() const { return comfortNoise; }
00294 protected:
00295 bool comfortNoise;
00296 };
00297
00298
00299 class OpalPluginStreamedAudioEncoder : public OpalPluginStreamedAudioTranscoder
00300 {
00301 PCLASSINFO(OpalPluginStreamedAudioEncoder, OpalPluginStreamedAudioTranscoder);
00302 public:
00303 OpalPluginStreamedAudioEncoder(PluginCodec_Definition * _codec, PBoolean);
00304 int ConvertOne(int _sample) const;
00305 };
00306
00307 class OpalPluginStreamedAudioDecoder : public OpalPluginStreamedAudioTranscoder
00308 {
00309 PCLASSINFO(OpalPluginStreamedAudioDecoder, OpalPluginStreamedAudioTranscoder);
00310 public:
00311 OpalPluginStreamedAudioDecoder(PluginCodec_Definition * _codec, PBoolean);
00312 int ConvertOne(int codedSample) const;
00313 };
00314
00315 #endif
00316
00318
00319 #if OPAL_VIDEO
00320
00321 class OpalPluginVideoFormatInternal : public OpalVideoFormatInternal, public OpalPluginMediaFormatInternal
00322 {
00323 public:
00324 OpalPluginVideoFormatInternal(
00325 const PluginCodec_Definition * _encoderCodec,
00326 const char * rtpEncodingName,
00327 time_t timeStamp
00328 );
00329 virtual PObject * Clone() const;
00330 virtual bool IsValidForProtocol(const PString & protocol) const;
00331 virtual bool ToNormalisedOptions();
00332 virtual bool ToCustomisedOptions();
00333 };
00334
00335
00336 class OpalPluginVideoTranscoder : public OpalVideoTranscoder, public OpalPluginTranscoder
00337 {
00338 PCLASSINFO(OpalPluginVideoTranscoder, OpalVideoTranscoder);
00339 public:
00340 OpalPluginVideoTranscoder(const PluginCodec_Definition * _codec, PBoolean _isEncoder);
00341 ~OpalPluginVideoTranscoder();
00342
00343 PBoolean ConvertFrames(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00344 bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00345
00346 protected:
00347 RTP_DataFrame * bufferRTP;
00348
00349 #if PTRACING
00350 unsigned consecutiveIntraFrames;
00351 #endif
00352 };
00353
00354 #endif
00355
00357
00358 #if OPAL_T38FAX
00359
00360 class OpalPluginFaxFormatInternal : public OpalMediaFormatInternal, public OpalPluginMediaFormatInternal
00361 {
00362 public:
00363 OpalPluginFaxFormatInternal(
00364 const PluginCodec_Definition * _encoderCodec,
00365 const char * rtpEncodingName,
00366 unsigned frameTime,
00367 unsigned ,
00368 time_t timeStamp
00369 );
00370 virtual PObject * Clone() const;
00371 virtual bool IsValidForProtocol(const PString & protocol) const;
00372 };
00373
00374 #endif // OPAL_T38FAX
00375
00376
00378
00379
00380
00381
00389 class OpalFactoryCodec : public PObject {
00390 PCLASSINFO(OpalFactoryCodec, PObject)
00391 public:
00393 virtual const struct PluginCodec_Definition * GetDefinition()
00394 { return NULL; }
00395
00397 virtual PString GetInputFormat() const = 0;
00398
00400 virtual PString GetOutputFormat() const = 0;
00401
00403 virtual int Encode(const void * from,
00404 unsigned * fromLen,
00405 void * to,
00406 unsigned * toLen,
00407 unsigned int * flag
00408 ) = 0;
00409
00411 virtual unsigned int GetSampleRate() const = 0;
00412
00414 virtual unsigned int GetBitsPerSec() const = 0;
00415
00417 virtual unsigned int GetFrameTime() const = 0;
00418
00420 virtual unsigned int GetSamplesPerFrame() const = 0;
00421
00423 virtual unsigned int GetBytesPerFrame() const = 0;
00424
00426 virtual unsigned int GetRecommendedFramesPerPacket() const = 0;
00427
00429 virtual unsigned int GetMaxFramesPerPacket() const = 0;
00430
00432 virtual BYTE GetRTPPayload() const = 0;
00433
00435 virtual PString GetSDPFormat() const = 0;
00436 };
00437
00439
00440 template<class TranscoderClass>
00441 class OpalPluginTranscoderFactory : public OpalTranscoderFactory
00442 {
00443 public:
00444 class Worker : public OpalTranscoderFactory::WorkerBase
00445 {
00446 public:
00447 Worker(const OpalTranscoderKey & key, PluginCodec_Definition * _codecDefn, PBoolean _isEncoder)
00448 : OpalTranscoderFactory::WorkerBase(), codecDefn(_codecDefn), isEncoder(_isEncoder)
00449 { OpalTranscoderFactory::Register(key, this); }
00450
00451 protected:
00452 virtual OpalTranscoder * Create(const OpalTranscoderKey &) const
00453 { return new TranscoderClass(codecDefn, isEncoder); }
00454
00455 PluginCodec_Definition * codecDefn;
00456 PBoolean isEncoder;
00457 };
00458 };
00459
00461
00462
00463
00464
00465 class H323PluginCapabilityInfo
00466 {
00467 public:
00468 H323PluginCapabilityInfo(const PluginCodec_Definition * _encoderCodec,
00469 const PluginCodec_Definition * _decoderCodec);
00470
00471 H323PluginCapabilityInfo(const PString & _baseName);
00472
00473 const PString & GetFormatName() const
00474 { return capabilityFormatName; }
00475
00476 protected:
00477 const PluginCodec_Definition * encoderCodec;
00478 const PluginCodec_Definition * decoderCodec;
00479 PString capabilityFormatName;
00480 };
00481
00482 #if OPAL_H323
00483 #if OPAL_AUDIO
00484
00486
00487
00488
00489
00490 class H323AudioPluginCapability : public H323AudioCapability,
00491 public H323PluginCapabilityInfo
00492 {
00493 PCLASSINFO(H323AudioPluginCapability, H323AudioCapability);
00494 public:
00495 H323AudioPluginCapability(const PluginCodec_Definition * _encoderCodec,
00496 const PluginCodec_Definition * _decoderCodec,
00497 unsigned _pluginSubType);
00498
00499
00500 H323AudioPluginCapability(const PString & _mediaFormat,
00501 const PString & _baseName,
00502 unsigned _pluginSubType);
00503
00504 virtual PObject * Clone() const;
00505
00506 virtual PString GetFormatName() const;
00507
00508 virtual unsigned GetSubType() const;
00509
00510 protected:
00511 unsigned pluginSubType;
00512
00513 };
00514
00515 #define OPAL_DECLARE_EMPTY_AUDIO_CAPABILITY(fmt, type) \
00516 class fmt##_CapabilityRegisterer { \
00517 public: \
00518 fmt##_CapabilityRegisterer() \
00519 { H323CapabilityFactory::Register(fmt, new H323AudioPluginCapability(fmt, fmt, type)); } \
00520 }; \
00521
00522 #define OPAL_DEFINE_EMPTY_AUDIO_CAPABILITY(fmt) \
00523 static fmt##_CapabilityRegisterer fmt##_CapabilityRegisterer_instance; \
00524
00526 //
00527
00528
00529
00530 class H323PluginG7231Capability : public H323AudioPluginCapability
00531 {
00532 PCLASSINFO(H323PluginG7231Capability, H323AudioPluginCapability);
00533 public:
00534 H323PluginG7231Capability(const PluginCodec_Definition * _encoderCodec,
00535 const PluginCodec_Definition * _decoderCodec,
00536 PBoolean _annexA = PTrue);
00537
00538
00539 H323PluginG7231Capability(const OpalMediaFormat & fmt, PBoolean _annexA = PTrue);
00540
00541 virtual PObject * Clone() const;
00542 virtual PBoolean OnSendingPDU(H245_AudioCapability & cap, unsigned packetSize) const;
00543 virtual PBoolean OnReceivedPDU(const H245_AudioCapability & cap, unsigned & packetSize);
00544
00545 protected:
00546 PBoolean annexA;
00547 };
00548
00549 #define OPAL_DECLARE_EMPTY_G7231_CAPABILITY(fmt, annex) \
00550 class fmt##_CapabilityRegisterer { \
00551 public: \
00552 fmt##_CapabilityRegisterer() \
00553 { H323CapabilityFactory::Register(fmt, new H323PluginG7231Capability(fmt, annex)); } \
00554 }; \
00555
00556 #define OPAL_DEFINE_EMPTY_G7231_CAPABILITY(fmt) \
00557 static fmt##_CapabilityRegisterer fmt##_CapabilityRegisterer_instance; \
00558
00560 //
00561
00562
00563
00564 class H323CodecPluginNonStandardAudioCapability : public H323NonStandardAudioCapability,
00565 public H323PluginCapabilityInfo
00566 {
00567 PCLASSINFO(H323CodecPluginNonStandardAudioCapability, H323NonStandardAudioCapability);
00568 public:
00569 H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * _encoderCodec,
00570 const PluginCodec_Definition * _decoderCodec,
00571 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00572 const unsigned char * data, unsigned dataLen);
00573
00574 H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * _encoderCodec,
00575 const PluginCodec_Definition * _decoderCodec,
00576 const unsigned char * data, unsigned dataLen);
00577
00578 virtual PObject * Clone() const;
00579
00580 virtual PString GetFormatName() const;
00581 };
00582
00584
00585
00586
00587
00588 class H323CodecPluginGenericAudioCapability : public H323GenericAudioCapability,
00589 public H323PluginCapabilityInfo
00590 {
00591 PCLASSINFO(H323CodecPluginGenericAudioCapability, H323GenericAudioCapability);
00592 public:
00593 H323CodecPluginGenericAudioCapability(const PluginCodec_Definition * _encoderCodec,
00594 const PluginCodec_Definition * _decoderCodec,
00595 const PluginCodec_H323GenericCodecData * data);
00596
00597 virtual PObject * Clone() const;
00598 virtual PString GetFormatName() const;
00599 };
00600
00601 #endif
00602
00603 #if OPAL_VIDEO
00604
00606
00607
00608
00609
00610 class H323VideoPluginCapability : public H323VideoCapability,
00611 public H323PluginCapabilityInfo
00612 {
00613 PCLASSINFO(H323VideoPluginCapability, H323VideoCapability);
00614 public:
00615 H323VideoPluginCapability(const PluginCodec_Definition * _encoderCodec,
00616 const PluginCodec_Definition * _decoderCodec,
00617 unsigned _pluginSubType);
00618
00619 virtual PString GetFormatName() const;
00620
00621 virtual unsigned GetSubType() const;
00622
00623 static PBoolean SetOptionsFromMPI(OpalMediaFormat & mediaFormat, int frameWidth, int frameHeight, int frameRate);
00624
00625 virtual void PrintOn(std::ostream & strm) const;
00626
00627 protected:
00628 unsigned pluginSubType;
00629 unsigned h323subType;
00630 };
00631
00633
00634
00635
00636
00637 class H323CodecPluginNonStandardVideoCapability : public H323NonStandardVideoCapability,
00638 public H323PluginCapabilityInfo
00639 {
00640 PCLASSINFO(H323CodecPluginNonStandardVideoCapability, H323NonStandardVideoCapability);
00641 public:
00642 H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * _encoderCodec,
00643 const PluginCodec_Definition * _decoderCodec,
00644 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00645 const unsigned char * data, unsigned dataLen);
00646
00647 H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * _encoderCodec,
00648 const PluginCodec_Definition * _decoderCodec,
00649 const unsigned char * data, unsigned dataLen);
00650
00651 virtual PObject * Clone() const;
00652
00653 virtual PString GetFormatName() const;
00654 };
00655
00657
00658
00659
00660
00661 class H323CodecPluginGenericVideoCapability : public H323GenericVideoCapability,
00662 public H323PluginCapabilityInfo
00663 {
00664 PCLASSINFO(H323CodecPluginGenericVideoCapability, H323GenericVideoCapability);
00665 public:
00666 H323CodecPluginGenericVideoCapability(const PluginCodec_Definition * _encoderCodec,
00667 const PluginCodec_Definition * _decoderCodec,
00668 const PluginCodec_H323GenericCodecData * data);
00669
00670 virtual PObject * Clone() const;
00671
00672 virtual PString GetFormatName() const;
00673 };
00674
00676
00677
00678
00679
00680 class H323H261PluginCapability : public H323VideoPluginCapability
00681 {
00682 PCLASSINFO(H323H261PluginCapability, H323VideoPluginCapability);
00683 public:
00684 H323H261PluginCapability(const PluginCodec_Definition * _encoderCodec,
00685 const PluginCodec_Definition * _decoderCodec);
00686
00687 Comparison Compare(const PObject & obj) const;
00688
00689 virtual PObject * Clone() const;
00690
00691 virtual PBoolean OnSendingPDU(
00692 H245_VideoCapability & pdu
00693 ) const;
00694
00695 virtual PBoolean OnSendingPDU(
00696 H245_VideoMode & pdu
00697 ) const;
00698
00699 virtual PBoolean OnReceivedPDU(
00700 const H245_VideoCapability & pdu
00701 );
00702 };
00703
00705
00706
00707
00708
00709 class H323H263PluginCapability : public H323VideoPluginCapability
00710 {
00711 PCLASSINFO(H323H263PluginCapability, H323VideoPluginCapability);
00712 public:
00713 H323H263PluginCapability(const PluginCodec_Definition * _encoderCodec,
00714 const PluginCodec_Definition * _decoderCodec);
00715
00716 Comparison Compare(const PObject & obj) const;
00717
00718 virtual PObject * Clone() const;
00719
00720 virtual PBoolean OnSendingPDU(
00721 H245_VideoCapability & pdu
00722 ) const;
00723
00724 virtual PBoolean OnSendingPDU(
00725 H245_VideoMode & pdu
00726 ) const;
00727
00728 virtual PBoolean OnReceivedPDU(
00729 const H245_VideoCapability & pdu
00730 );
00731 virtual PBoolean IsMatch(const PASN_Choice & subTypePDU) const;
00732 };
00733
00734 #endif // OPAL_VIDEO
00735 #endif // OPAL_H323
00736
00737 #endif // __OPALPLUGINMGR_H