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  * $Log: opalpluginmgr.h,v $
00027  * Revision 2.22  2007/10/08 01:45:16  rjongbloed
00028  * Fixed bad virtual function causing uninitialised variable whcih prevented video from working.
00029  * Some more clean ups.
00030  *
00031  * Revision 2.21  2007/10/05 04:14:47  rjongbloed
00032  * Quite a large code clean up.
00033  *
00034  * Revision 2.20  2007/09/25 09:49:54  rjongbloed
00035  * Fixed videoFastUpdate, is not a count but a simple boolean.
00036  *
00037  * Revision 2.19  2007/09/19 10:43:00  csoutheren
00038  * Exposed G.7231 capability class
00039  * Added macros to create empty transcoders and capabilities
00040  *
00041  * Revision 2.18  2007/09/12 04:19:53  rjongbloed
00042  * CHanges to avoid creation of long duration OpalMediaFormat instances, eg in
00043  *   the plug in capabilities, that then do not get updated values from the master
00044  *   list, or worse from the user modified master list, causing much confusion.
00045  *
00046  * Revision 2.17  2007/09/10 03:15:04  rjongbloed
00047  * Fixed issues in creating and subsequently using correctly unique
00048  *   payload types in OpalMediaFormat instances and transcoders.
00049  *
00050  * Revision 2.16  2007/09/07 17:49:47  ykiryanov
00051  * File was missing transcoders.h include. This had an effect while building code with no video.
00052  *
00053  * Revision 2.15  2007/08/13 06:07:51  csoutheren
00054  * Expose more functions
00055  *
00056  * Revision 2.14  2007/08/08 17:35:15  csoutheren
00057  * Final plugin manager changes
00058  *
00059  * Revision 2.13  2007/08/08 11:18:47  csoutheren
00060  * Fixed Linux compile errors
00061  *
00062  * Revision 2.12  2007/08/08 08:59:06  csoutheren
00063  * More plugin manager changes, as the last approach dead-ended :(
00064  *
00065  * Revision 2.11  2007/08/08 07:12:38  csoutheren
00066  * #ifdef out unused code - to be removed later if nobody complains :)
00067  *
00068  * Revision 2.10  2007/08/07 09:04:02  csoutheren
00069  * Export more functions
00070  *
00071  * Revision 2.9  2007/08/07 08:25:16  csoutheren
00072  * Expose plugin media format classes
00073  *
00074  * Revision 2.8  2007/08/06 07:14:22  csoutheren
00075  * Fix logging
00076  * Correct matching of H.263 capabilities
00077  *
00078  * Revision 2.7  2007/08/03 08:04:56  csoutheren
00079  * Add PrintOn for plugin video caps
00080  *
00081  * Revision 2.6  2007/07/02 18:53:36  csoutheren
00082  * Exposed classes
00083  *
00084  * Revision 2.5  2007/06/22 05:41:47  rjongbloed
00085  * Major codec API update:
00086  *   Automatically map OpalMediaOptions to SIP/SDP FMTP parameters.
00087  *   Automatically map OpalMediaOptions to H.245 Generic Capability parameters.
00088  *   Largely removed need to distinguish between SIP and H.323 codecs.
00089  *   New mechanism for setting OpalMediaOptions from within a plug in.
00090  *
00091  * Revision 2.4  2006/10/02 13:30:50  rjongbloed
00092  * Added LID plug ins
00093  *
00094  * Revision 2.3  2006/09/28 07:42:14  csoutheren
00095  * Merge of useful SRTP implementation
00096  *
00097  * Revision 2.2  2006/08/11 07:52:01  csoutheren
00098  * Fix problem with media format factory in VC 2005
00099  * Fixing problems with Speex codec
00100  * Remove non-portable usages of PFactory code
00101  *
00102  * Revision 2.1  2006/07/24 14:03:38  csoutheren
00103  * Merged in audio and video plugins from CVS branch PluginBranch
00104  *
00105  * Revision 1.1.2.3  2006/04/06 01:21:16  csoutheren
00106  * More implementation of video codec plugins
00107  *
00108  * Revision 1.1.2.2  2006/03/23 07:55:18  csoutheren
00109  * Audio plugin H.323 capability merging completed.
00110  * GSM, LBC, G.711 working. Speex and LPC-10 are not
00111  *
00112  * Revision 1.1.2.1  2006/03/16 07:06:00  csoutheren
00113  * Initial support for audio plugins
00114  *
00115  * Created from OpenH323 h323pluginmgr.h
00116  * Revision 1.24  2005/11/30 13:05:01  csoutheren
00117  */
00118 
00119 #ifndef __OPALPLUGINMGR_H
00120 #define __OPALPLUGINMGR_H
00121 
00122 #ifdef P_USE_PRAGMA
00123 #pragma interface
00124 #endif
00125 
00126 #include <ptlib/object.h>
00127 
00128 #include <opal/buildopts.h>
00129 
00130 #include <ptlib/pluginmgr.h>
00131 #include <ptlib/pfactory.h>
00132 #include <codec/opalplugin.h>
00133 #include <opal/mediafmt.h>
00134 #include <opal/transcoders.h>
00135 
00136 #if OPAL_H323
00137 #include <h323/h323caps.h>
00138 #endif
00139 
00140 #if OPAL_VIDEO
00141 #include <codec/vidcodec.h>
00142 #endif
00143 
00144 
00146 
00147 class H323Capability;
00148 
00149 class H323StaticPluginCodec
00150 {
00151   public:
00152     virtual ~H323StaticPluginCodec() { }
00153     virtual PluginCodec_GetAPIVersionFunction Get_GetAPIFn() = 0;
00154     virtual PluginCodec_GetCodecFunction Get_GetCodecFn() = 0;
00155 };
00156 
00157 
00158 typedef PFactory<H323StaticPluginCodec> H323StaticPluginCodecFactory;
00159 
00160 
00162 
00163 class OpalPluginCodecManager;
00164 
00165 class OpalPluginCodecHandler : public PObject
00166 {
00167   PCLASSINFO(OpalPluginCodecHandler, PObject);
00168   public:
00169     OpalPluginCodecHandler();
00170 
00171 #if OPAL_AUDIO
00172     virtual OpalMediaFormat * OnCreateAudioFormat(OpalPluginCodecManager & mgr,
00173                                             const PluginCodec_Definition * encoderCodec,
00174                                                               const char * rtpEncodingName,
00175                                                                   unsigned frameTime,
00176                                                                   unsigned timeUnits,
00177                                                                     time_t timeStamp);
00178 #endif
00179 
00180 #if OPAL_VIDEO
00181     virtual OpalMediaFormat * OnCreateVideoFormat(OpalPluginCodecManager & mgr,
00182                                             const PluginCodec_Definition * encoderCodec,
00183                                                               const char * rtpEncodingName,
00184                                                                     time_t timeStamp);
00185     virtual void RegisterVideoTranscoder(const PString & src, const PString & dst, PluginCodec_Definition * codec, BOOL v);
00186 #endif
00187 
00188 #if OPAL_T38FAX
00189     virtual OpalMediaFormat * OnCreateFaxFormat(OpalPluginCodecManager & mgr,
00190                                           const PluginCodec_Definition * encoderCodec,
00191                                                             const char * rtpEncodingName,
00192                                                                 unsigned frameTime,
00193                                                                 unsigned timeUnits,
00194                                                                   time_t timeStamp);
00195 #endif
00196 };
00197 
00198 
00199 class OpalPluginCodecManager : public PPluginModuleManager
00200 {
00201   PCLASSINFO(OpalPluginCodecManager, PPluginModuleManager);
00202   public:
00203     OpalPluginCodecManager(PPluginManager * pluginMgr = NULL);
00204     ~OpalPluginCodecManager();
00205 
00206     void RegisterStaticCodec(const H323StaticPluginCodecFactory::Key_T & name,
00207                              PluginCodec_GetAPIVersionFunction getApiVerFn,
00208                              PluginCodec_GetCodecFunction getCodecFn);
00209 
00210     void OnLoadPlugin(PDynaLink & dll, INT code);
00211 
00212     virtual void OnShutdown();
00213 
00214     static void Bootstrap();
00215 
00216 #if OPAL_H323
00217     H323Capability * CreateCapability(
00218           const PString & _mediaFormat, 
00219           const PString & _baseName,
00220                  unsigned maxFramesPerPacket, 
00221                  unsigned recommendedFramesPerPacket,
00222                  unsigned _pluginSubType);
00223 #endif
00224 
00225   protected:
00226     void RegisterPluginPair(
00227       PluginCodec_Definition * _encoderCodec,
00228       PluginCodec_Definition * _decoderCodec,
00229       OpalPluginCodecHandler * handler
00230     );
00231 
00232     // Note the below MUST NOT be an OpalMediaFormatList
00233     PList<OpalMediaFormat> mediaFormatsOnHeap;
00234 
00235     void RegisterCodecPlugins  (unsigned int count, PluginCodec_Definition * codecList, OpalPluginCodecHandler * handler);
00236     void UnregisterCodecPlugins(unsigned int count, PluginCodec_Definition * codecList, OpalPluginCodecHandler * handler);
00237 
00238 #if OPAL_H323
00239     void RegisterCapability(PluginCodec_Definition * encoderCodec, PluginCodec_Definition * decoderCodec);
00240     struct CapabilityListCreateEntry {
00241       CapabilityListCreateEntry(PluginCodec_Definition * e, PluginCodec_Definition * d)
00242         : encoderCodec(e), decoderCodec(d) { }
00243       PluginCodec_Definition * encoderCodec;
00244       PluginCodec_Definition * decoderCodec;
00245     };
00246     typedef vector<CapabilityListCreateEntry> CapabilityCreateListType;
00247     CapabilityCreateListType capabilityCreateList;
00248 #endif
00249 };
00250 
00251 
00253 
00254 class OpalPluginControl
00255 {
00256   public:
00257     OpalPluginControl(const PluginCodec_Definition * def, const char * name);
00258 
00259     BOOL Exists() const
00260     {
00261       return controlDef != NULL;
00262     }
00263 
00264     int Call(void * parm, unsigned * parmLen, void * context = NULL) const
00265     {
00266       return controlDef != NULL ? (*controlDef->control)(codecDef, context, fnName, parm, parmLen) : 0;
00267     }
00268 
00269     int Call(void * parm, unsigned   parmLen, void * context = NULL) const
00270     {
00271       return Call(parm, &parmLen, context);
00272     }
00273 
00274   protected:
00275     const PluginCodec_Definition  * codecDef;
00276     const char                    * fnName;
00277     const PluginCodec_ControlDefn * controlDef;
00278 };
00279 
00280 
00282 
00283 class OpalPluginMediaFormat
00284 {
00285   public:
00286     OpalPluginMediaFormat(const PluginCodec_Definition * defn);
00287 
00288     void PopulateOptions(OpalMediaFormat & format);
00289     bool IsValidForProtocol(const PString & _protocol) const;
00290 
00291     const PluginCodec_Definition * codecDef;
00292     OpalPluginControl getOptionsControl;
00293     OpalPluginControl freeOptionsControl;
00294     OpalPluginControl validForProtocolControl;
00295 };
00296 
00297 
00298 class OpalPluginTranscoder
00299 {
00300   public:
00301     OpalPluginTranscoder(const PluginCodec_Definition * defn, BOOL isEnc);
00302     ~OpalPluginTranscoder();
00303 
00304     BOOL Transcode(const void * from, unsigned * fromLen, void * to, unsigned * toLen, unsigned * flags) const
00305     {
00306       return codecDef != NULL && codecDef->codecFunction != NULL &&
00307             (codecDef->codecFunction)(codecDef, context, from, fromLen, to, toLen, flags) != 0;
00308     }
00309 
00310   protected:
00311     const PluginCodec_Definition * codecDef;
00312     BOOL   isEncoder;
00313     void * context;
00314 
00315     OpalPluginControl setCodecOptions;
00316     OpalPluginControl getOutputDataSizeControl;
00317 };
00318 
00319 
00321 
00322 #if OPAL_AUDIO
00323 
00324 class OpalPluginAudioMediaFormat : public OpalAudioFormat, public OpalPluginMediaFormat
00325 {
00326   public:
00327     friend class OpalPluginCodecManager;
00328 
00329     OpalPluginAudioMediaFormat(
00330       const PluginCodec_Definition * _encoderCodec,
00331       const char * rtpEncodingName, 
00332       unsigned frameTime,           
00333       unsigned /*timeUnits*/,       
00334                          time_t timeStamp              
00335     );
00336     bool IsValidForProtocol(const PString & protocol) const;
00337     PObject * Clone() const;
00338 };
00339 
00340 
00341 class OpalPluginFramedAudioTranscoder : public OpalFramedTranscoder, public OpalPluginTranscoder
00342 {
00343   PCLASSINFO(OpalPluginFramedAudioTranscoder, OpalFramedTranscoder);
00344   public:
00345     OpalPluginFramedAudioTranscoder(PluginCodec_Definition * _codec, BOOL _isEncoder, const char * rawFormat = OpalPCM16);
00346     BOOL ConvertFrame(const BYTE * input, PINDEX & consumed, BYTE * output, PINDEX & created);
00347     virtual BOOL ConvertSilentFrame(BYTE * buffer);
00348 };
00349 
00350 
00351 class OpalPluginStreamedAudioTranscoder : public OpalStreamedTranscoder, public OpalPluginTranscoder
00352 {
00353   PCLASSINFO(OpalPluginStreamedAudioTranscoder, OpalStreamedTranscoder);
00354   public:
00355     OpalPluginStreamedAudioTranscoder(PluginCodec_Definition * _codec, BOOL _isEncoder, unsigned inputBits, unsigned outputBits, PINDEX optimalBits);
00356 };
00357 
00358 
00359 class OpalPluginStreamedAudioEncoder : public OpalPluginStreamedAudioTranscoder
00360 {
00361   PCLASSINFO(OpalPluginStreamedAudioEncoder, OpalPluginStreamedAudioTranscoder);
00362   public:
00363     OpalPluginStreamedAudioEncoder(PluginCodec_Definition * _codec, BOOL);
00364     int ConvertOne(int _sample) const;
00365 };
00366 
00367 class OpalPluginStreamedAudioDecoder : public OpalPluginStreamedAudioTranscoder
00368 {
00369   PCLASSINFO(OpalPluginStreamedAudioDecoder, OpalPluginStreamedAudioTranscoder);
00370   public:
00371     OpalPluginStreamedAudioDecoder(PluginCodec_Definition * _codec, BOOL);
00372     int ConvertOne(int codedSample) const;
00373 };
00374 
00375 #endif
00376 
00378 
00379 #if OPAL_VIDEO
00380 
00381 class OpalPluginVideoMediaFormat : public OpalVideoFormat, public OpalPluginMediaFormat
00382 {
00383   public:
00384     friend class OpalPluginCodecManager;
00385     OpalPluginVideoMediaFormat(
00386       const PluginCodec_Definition * _encoderCodec,
00387       const char * rtpEncodingName, 
00388       time_t timeStamp              
00389     );
00390     PObject * Clone() const;
00391     bool IsValidForProtocol(const PString & protocol) const;
00392 };
00393 
00394 
00395 class OpalPluginVideoTranscoder : public OpalVideoTranscoder, public OpalPluginTranscoder
00396 {
00397   PCLASSINFO(OpalPluginVideoTranscoder, OpalVideoTranscoder);
00398   public:
00399     OpalPluginVideoTranscoder(const PluginCodec_Definition * _codec, BOOL _isEncoder);
00400     ~OpalPluginVideoTranscoder();
00401 
00402     PINDEX GetOptimalDataFrameSize(BOOL input) const;
00403     BOOL ConvertFrames(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00404     BOOL UpdateOutputMediaFormat(const OpalMediaFormat & fmt);
00405 
00406   protected:
00407     RTP_DataFrame * bufferRTP;
00408 };
00409 
00410 #endif
00411 
00413 
00414 #if OPAL_T38FAX
00415 
00416 class OpalPluginFaxMediaFormat : public OpalMediaFormat, public OpalPluginMediaFormat
00417 {
00418   public:
00419     friend class OpalPluginCodecManager;
00420 
00421     OpalPluginFaxMediaFormat(
00422       const PluginCodec_Definition * _encoderCodec,
00423       const char * rtpEncodingName, 
00424       unsigned frameTime,
00425       unsigned /*timeUnits*/,           
00426       time_t timeStamp              
00427     );
00428     PObject * Clone() const;
00429     bool IsValidForProtocol(const PString & protocol) const;
00430 };
00431 
00432 #endif // OPAL_T38FAX
00433 
00434 
00436 //
00437 //  this is the base class for codecs accesible via the abstract factory functions
00438 //
00439 
00447 class OpalFactoryCodec : public PObject {
00448   PCLASSINFO(OpalFactoryCodec, PObject)
00449   public:
00451     virtual const struct PluginCodec_Definition * GetDefinition()
00452     { return NULL; }
00453 
00455     virtual PString GetInputFormat() const = 0;
00456 
00458     virtual PString GetOutputFormat() const = 0;
00459 
00461     virtual int Encode(const void * from,      
00462                          unsigned * fromLen,   
00463                              void * to,        
00464                                  unsigned * toLen,     
00465                      unsigned int * flag       
00466                        ) = 0;  
00467 
00469     virtual unsigned int GetSampleRate() const = 0;
00470 
00472     virtual unsigned int GetBitsPerSec() const = 0;
00473 
00475     virtual unsigned int GetFrameTime() const = 0;
00476 
00478     virtual unsigned int GetSamplesPerFrame() const = 0;
00479 
00481     virtual unsigned int GetBytesPerFrame() const = 0;
00482 
00484     virtual unsigned int GetRecommendedFramesPerPacket() const = 0;
00485 
00487     virtual unsigned int GetMaxFramesPerPacket() const = 0;
00488 
00490     virtual BYTE         GetRTPPayload() const = 0;
00491 
00493     virtual PString      GetSDPFormat() const = 0;
00494 };
00495 
00497 
00498 template<class TranscoderClass>
00499 class OpalPluginTranscoderFactory : public OpalTranscoderFactory
00500 {
00501   public:
00502     class Worker : public OpalTranscoderFactory::WorkerBase 
00503     {
00504       public:
00505         Worker(const OpalTranscoderKey & key, PluginCodec_Definition * _codecDefn, BOOL _isEncoder)
00506           : OpalTranscoderFactory::WorkerBase(), codecDefn(_codecDefn), isEncoder(_isEncoder)
00507         { OpalTranscoderFactory::Register(key, this); }
00508 
00509       protected:
00510         virtual OpalTranscoder * Create(const OpalTranscoderKey &) const
00511         { return new TranscoderClass(codecDefn, isEncoder); }
00512 
00513         PluginCodec_Definition * codecDefn;
00514         BOOL isEncoder;
00515     };
00516 };
00517 
00519 //
00520 // Helper class for handling plugin capabilities
00521 //
00522 
00523 class H323PluginCapabilityInfo
00524 {
00525   public:
00526     H323PluginCapabilityInfo(const PluginCodec_Definition * _encoderCodec,
00527                              const PluginCodec_Definition * _decoderCodec);
00528 
00529     H323PluginCapabilityInfo(const PString & _baseName);
00530 
00531     const PString & GetFormatName() const
00532     { return capabilityFormatName; }
00533 
00534   protected:
00535     const PluginCodec_Definition * encoderCodec;
00536     const PluginCodec_Definition * decoderCodec;
00537     PString                        capabilityFormatName;
00538 };
00539 
00540 
00541 #if OPAL_AUDIO
00542 
00544 //
00545 // Class for handling most audio plugin capabilities
00546 //
00547 
00548 class H323AudioPluginCapability : public H323AudioCapability,
00549                                   public H323PluginCapabilityInfo
00550 {
00551   PCLASSINFO(H323AudioPluginCapability, H323AudioCapability);
00552   public:
00553     H323AudioPluginCapability(const PluginCodec_Definition * _encoderCodec,
00554                               const PluginCodec_Definition * _decoderCodec,
00555                               unsigned _pluginSubType);
00556 
00557     // this constructor is only used when creating a capability without a codec
00558     H323AudioPluginCapability(const PString & _mediaFormat,
00559                               const PString & _baseName,
00560                               unsigned _pluginSubType);
00561 
00562     virtual PObject * Clone() const;
00563 
00564     virtual PString GetFormatName() const;
00565 
00566     virtual unsigned GetSubType() const;
00567 
00568   protected:
00569     unsigned pluginSubType;
00570     //unsigned h323subType;   // only set if using capability without codec
00571 };
00572 
00573 #define OPAL_DECLARE_EMPTY_AUDIO_CAPABILITY(fmt, type) \
00574 class fmt##_CapabilityRegisterer { \
00575   public: \
00576     fmt##_CapabilityRegisterer() \
00577     { H323CapabilityFactory::Register(fmt, new H323AudioPluginCapability(fmt, fmt, type)); } \
00578 }; \
00579 
00580 #define OPAL_DEFINE_EMPTY_AUDIO_CAPABILITY(fmt) \
00581 static fmt##_CapabilityRegisterer fmt##_CapabilityRegisterer_instance; \
00582 
00584 //
00585 // Class for handling G.723.1 codecs
00586 //
00587 
00588 class H323PluginG7231Capability : public H323AudioPluginCapability
00589 {
00590   PCLASSINFO(H323PluginG7231Capability, H323AudioPluginCapability);
00591   public:
00592     H323PluginG7231Capability(const PluginCodec_Definition * _encoderCodec,
00593                               const PluginCodec_Definition * _decoderCodec,
00594                               BOOL _annexA = TRUE);
00595 
00596     // this constructor is used for creating empty codecs
00597     H323PluginG7231Capability(const OpalMediaFormat & fmt, BOOL _annexA = TRUE);
00598 
00599     virtual PObject * Clone() const;
00600     virtual BOOL OnSendingPDU(H245_AudioCapability & cap, unsigned packetSize) const;
00601     virtual BOOL OnReceivedPDU(const H245_AudioCapability & cap,  unsigned & packetSize);
00602 
00603   protected:
00604     BOOL annexA;
00605 };
00606 
00607 #define OPAL_DECLARE_EMPTY_G7231_CAPABILITY(fmt, annex) \
00608 class fmt##_CapabilityRegisterer { \
00609   public: \
00610     fmt##_CapabilityRegisterer() \
00611     { H323CapabilityFactory::Register(fmt, new H323PluginG7231Capability(fmt, annex)); } \
00612 }; \
00613 
00614 #define OPAL_DEFINE_EMPTY_G7231_CAPABILITY(fmt) \
00615 static fmt##_CapabilityRegisterer fmt##_CapabilityRegisterer_instance; \
00616 
00618 //
00619 // Class for handling non standard audio capabilities
00620 //
00621 
00622 class H323CodecPluginNonStandardAudioCapability : public H323NonStandardAudioCapability,
00623                                                   public H323PluginCapabilityInfo
00624 {
00625   PCLASSINFO(H323CodecPluginNonStandardAudioCapability, H323NonStandardAudioCapability);
00626   public:
00627     H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * _encoderCodec,
00628                                               const PluginCodec_Definition * _decoderCodec,
00629                                               H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00630                                               const unsigned char * data, unsigned dataLen);
00631 
00632     H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * _encoderCodec,
00633                                               const PluginCodec_Definition * _decoderCodec,
00634                                               const unsigned char * data, unsigned dataLen);
00635 
00636     virtual PObject * Clone() const;
00637 
00638     virtual PString GetFormatName() const;
00639 };
00640 
00642 //
00643 // Class for handling generic audio capabilities
00644 //
00645 
00646 class H323CodecPluginGenericAudioCapability : public H323GenericAudioCapability,
00647                                               public H323PluginCapabilityInfo
00648 {
00649   PCLASSINFO(H323CodecPluginGenericAudioCapability, H323GenericAudioCapability);
00650   public:
00651     H323CodecPluginGenericAudioCapability(const PluginCodec_Definition * _encoderCodec,
00652                                           const PluginCodec_Definition * _decoderCodec,
00653                                           const PluginCodec_H323GenericCodecData * data);
00654 
00655     virtual PObject * Clone() const;
00656     virtual PString GetFormatName() const;
00657 };
00658 
00659 #endif
00660 
00661 #if OPAL_VIDEO
00662 
00664 //
00665 // Class for handling most audio plugin capabilities
00666 //
00667 
00668 class H323VideoPluginCapability : public H323VideoCapability,
00669                              public H323PluginCapabilityInfo
00670 {
00671   PCLASSINFO(H323VideoPluginCapability, H323VideoCapability);
00672   public:
00673     H323VideoPluginCapability(const PluginCodec_Definition * _encoderCodec,
00674                               const PluginCodec_Definition * _decoderCodec,
00675                               unsigned _pluginSubType);
00676 
00677     virtual PString GetFormatName() const;
00678 
00679     virtual unsigned GetSubType() const;
00680 
00681     static BOOL SetCommonOptions(OpalMediaFormat & mediaFormat, int frameWidth, int frameHeight, int frameRate);
00682 
00683     virtual void PrintOn(std::ostream & strm) const;
00684 
00685   protected:
00686     unsigned pluginSubType;
00687     unsigned h323subType;   // only set if using capability without codec
00688 };
00689 
00691 //
00692 // Class for handling non standard video capabilities
00693 //
00694 
00695 class H323CodecPluginNonStandardVideoCapability : public H323NonStandardVideoCapability,
00696                                                   public H323PluginCapabilityInfo
00697 {
00698   PCLASSINFO(H323CodecPluginNonStandardVideoCapability, H323NonStandardVideoCapability);
00699   public:
00700     H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * _encoderCodec,
00701                                               const PluginCodec_Definition * _decoderCodec,
00702                                               H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00703                                               const unsigned char * data, unsigned dataLen);
00704 
00705     H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * _encoderCodec,
00706                                               const PluginCodec_Definition * _decoderCodec,
00707                                               const unsigned char * data, unsigned dataLen);
00708 
00709     virtual PObject * Clone() const;
00710 
00711     virtual PString GetFormatName() const;
00712 };
00713 
00715 //
00716 // Class for handling generic video capabilities
00717 //
00718 
00719 class H323CodecPluginGenericVideoCapability : public H323GenericVideoCapability,
00720                                               public H323PluginCapabilityInfo
00721 {
00722   PCLASSINFO(H323CodecPluginGenericVideoCapability, H323GenericVideoCapability);
00723   public:
00724     H323CodecPluginGenericVideoCapability(const PluginCodec_Definition * _encoderCodec,
00725                                           const PluginCodec_Definition * _decoderCodec,
00726                                           const PluginCodec_H323GenericCodecData * data);
00727 
00728     virtual PObject * Clone() const;
00729 
00730     virtual PString GetFormatName() const;
00731 };
00732 
00734 //
00735 // Class for handling H.261 plugin capabilities
00736 //
00737 
00738 class H323H261PluginCapability : public H323VideoPluginCapability
00739 {
00740   PCLASSINFO(H323H261PluginCapability, H323VideoPluginCapability);
00741   public:
00742     H323H261PluginCapability(const PluginCodec_Definition * _encoderCodec,
00743                              const PluginCodec_Definition * _decoderCodec);
00744 
00745     Comparison Compare(const PObject & obj) const;
00746 
00747     virtual PObject * Clone() const;
00748 
00749     virtual BOOL OnSendingPDU(
00750       H245_VideoCapability & pdu  
00751     ) const;
00752 
00753     virtual BOOL OnSendingPDU(
00754       H245_VideoMode & pdu
00755     ) const;
00756 
00757     virtual BOOL OnReceivedPDU(
00758       const H245_VideoCapability & pdu  
00759     );
00760 };
00761 
00763 //
00764 // Class for handling H.263 plugin capabilities
00765 //
00766 
00767 class H323H263PluginCapability : public H323VideoPluginCapability
00768 {
00769   PCLASSINFO(H323H263PluginCapability, H323VideoPluginCapability);
00770   public:
00771     H323H263PluginCapability(const PluginCodec_Definition * _encoderCodec,
00772                              const PluginCodec_Definition * _decoderCodec);
00773 
00774     Comparison Compare(const PObject & obj) const;
00775 
00776     virtual PObject * Clone() const;
00777 
00778     virtual BOOL OnSendingPDU(
00779       H245_VideoCapability & pdu  
00780     ) const;
00781 
00782     virtual BOOL OnSendingPDU(
00783       H245_VideoMode & pdu
00784     ) const;
00785 
00786     virtual BOOL OnReceivedPDU(
00787       const H245_VideoCapability & pdu  
00788     );
00789     virtual BOOL IsMatch(const PASN_Choice & subTypePDU) const;
00790 };
00791 
00792 #endif // OPAL_VIDEO
00793 
00794 #endif // __OPALPLUGINMGR_H

Generated on Fri Mar 7 06:33:40 2008 for OPAL by  doxygen 1.5.1