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