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
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
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
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 ,
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 ,
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
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
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
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
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
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
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
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
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
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
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;
00688 };
00689
00691
00692
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
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
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
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