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 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_FAX
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
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(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 setCodecOptionsControl;
00239 OpalPluginControl getActiveOptionsControl;
00240 OpalPluginControl freeOptionsControl;
00241 OpalPluginControl getOutputDataSizeControl;
00242 OpalPluginControl getCodecStatistics;
00243 };
00244
00245
00247
00248 class OpalPluginAudioFormatInternal : public OpalAudioFormatInternal, public OpalPluginMediaFormatInternal
00249 {
00250 public:
00251 friend class OpalPluginCodecManager;
00252
00253 OpalPluginAudioFormatInternal(
00254 const PluginCodec_Definition * codecDefn,
00255 const char * fmtName,
00256 const char * rtpEncodingName,
00257 unsigned frameTime,
00258 unsigned timeUnits,
00259 time_t timeStamp
00260 );
00261 virtual PObject * Clone() const;
00262 virtual bool IsValidForProtocol(const PString & protocol) const;
00263 virtual bool ToNormalisedOptions();
00264 virtual bool ToCustomisedOptions();
00265 };
00266
00267
00268 class OpalPluginFramedAudioTranscoder : public OpalFramedTranscoder, public OpalPluginTranscoder
00269 {
00270 PCLASSINFO(OpalPluginFramedAudioTranscoder, OpalFramedTranscoder);
00271 public:
00272 OpalPluginFramedAudioTranscoder(const PluginCodec_Definition * codecDefn, bool isEncoder);
00273 bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00274 PBoolean ExecuteCommand(const OpalMediaCommand & command);
00275 PBoolean ConvertFrame(const BYTE * input, PINDEX & consumed, BYTE * output, PINDEX & created);
00276 virtual PBoolean ConvertSilentFrame(BYTE * buffer);
00277 virtual bool AcceptComfortNoise() const { return comfortNoise; }
00278 protected:
00279 bool comfortNoise;
00280 };
00281
00282
00283 class OpalPluginStreamedAudioTranscoder : public OpalStreamedTranscoder, public OpalPluginTranscoder
00284 {
00285 PCLASSINFO(OpalPluginStreamedAudioTranscoder, OpalStreamedTranscoder);
00286 public:
00287 OpalPluginStreamedAudioTranscoder(const PluginCodec_Definition * codec, bool isEncoder);
00288 bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00289 PBoolean ExecuteCommand(const OpalMediaCommand & command);
00290 virtual bool AcceptComfortNoise() const { return comfortNoise; }
00291 virtual int ConvertOne(int from) const;
00292 protected:
00293 bool comfortNoise;
00294 };
00295
00296
00298
00299 #if OPAL_VIDEO
00300
00301 class OpalPluginVideoFormatInternal : public OpalVideoFormatInternal, public OpalPluginMediaFormatInternal
00302 {
00303 public:
00304 OpalPluginVideoFormatInternal(
00305 const PluginCodec_Definition * codec,
00306 const char * fmtName,
00307 const char * rtpEncodingName,
00308 time_t timeStamp
00309 );
00310 virtual PObject * Clone() const;
00311 virtual bool IsValidForProtocol(const PString & protocol) const;
00312 virtual bool ToNormalisedOptions();
00313 virtual bool ToCustomisedOptions();
00314 };
00315
00316
00317 class OpalPluginVideoTranscoder : public OpalVideoTranscoder, public OpalPluginTranscoder
00318 {
00319 PCLASSINFO(OpalPluginVideoTranscoder, OpalVideoTranscoder);
00320 public:
00321 OpalPluginVideoTranscoder(const PluginCodec_Definition * codec, bool isEncoder);
00322 ~OpalPluginVideoTranscoder();
00323
00324 #if OPAL_STATISTICS
00325 virtual void GetStatistics(OpalMediaStatistics & statistics) const;
00326 #endif
00327
00328 PBoolean ConvertFrames(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00329 bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00330 PBoolean ExecuteCommand(const OpalMediaCommand & command);
00331
00332 protected:
00333 bool EncodeFrames(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00334 bool DecodeFrames(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00335 bool DecodeFrame(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00336
00337 RTP_DataFrame * m_bufferRTP;
00338 DWORD m_lastSequenceNumber;
00339 DWORD m_lastDecodedTimestamp;
00340 DWORD m_lastMarkerTimestamp;
00341 bool m_badMarkers;
00342
00343 #if PTRACING
00344 unsigned m_consecutiveIntraFrames;
00345 #endif
00346 };
00347
00348 #endif
00349
00351
00352 #if OPAL_FAX
00353
00354 class OpalPluginFaxFormatInternal : public OpalMediaFormatInternal, public OpalPluginMediaFormatInternal
00355 {
00356 public:
00357 OpalPluginFaxFormatInternal(
00358 const PluginCodec_Definition * codec,
00359 const char * fmtName,
00360 const char * rtpEncodingName,
00361 unsigned frameTime,
00362 unsigned ,
00363 time_t timeStamp
00364 );
00365 virtual PObject * Clone() const;
00366 virtual bool IsValidForProtocol(const PString & protocol) const;
00367 };
00368
00369 #endif // OPAL_FAX
00370
00371
00373
00374
00375
00376
00384 class OpalFactoryCodec : public PObject {
00385 PCLASSINFO(OpalFactoryCodec, PObject)
00386 public:
00388 virtual const struct PluginCodec_Definition * GetDefinition()
00389 { return NULL; }
00390
00392 virtual PString GetInputFormat() const = 0;
00393
00395 virtual PString GetOutputFormat() const = 0;
00396
00398 virtual int Encode(const void * from,
00399 unsigned * fromLen,
00400 void * to,
00401 unsigned * toLen,
00402 unsigned int * flag
00403 ) = 0;
00404
00406 virtual unsigned int GetSampleRate() const = 0;
00407
00409 virtual unsigned int GetBitsPerSec() const = 0;
00410
00412 virtual unsigned int GetFrameTime() const = 0;
00413
00415 virtual unsigned int GetSamplesPerFrame() const = 0;
00416
00418 virtual unsigned int GetBytesPerFrame() const = 0;
00419
00421 virtual unsigned int GetRecommendedFramesPerPacket() const = 0;
00422
00424 virtual unsigned int GetMaxFramesPerPacket() const = 0;
00425
00427 virtual BYTE GetRTPPayload() const = 0;
00428
00430 virtual PString GetSDPFormat() const = 0;
00431 };
00432
00434
00435 template<class TranscoderClass>
00436 class OpalPluginTranscoderFactory : public OpalTranscoderFactory
00437 {
00438 public:
00439 class Worker : public OpalTranscoderFactory::WorkerBase
00440 {
00441 public:
00442 Worker(const OpalTranscoderKey & key, const PluginCodec_Definition * codec, bool enc)
00443 : OpalTranscoderFactory::WorkerBase(), codecDefn(codec), isEncoder(enc)
00444 { OpalTranscoderFactory::Register(key, this); }
00445
00446 protected:
00447 virtual OpalTranscoder * Create(const OpalTranscoderKey &) const
00448 { return new TranscoderClass(codecDefn, isEncoder); }
00449
00450 const PluginCodec_Definition * codecDefn;
00451 bool isEncoder;
00452 };
00453 };
00454
00456
00457
00458
00459
00460 class H323PluginCapabilityInfo
00461 {
00462 public:
00463 H323PluginCapabilityInfo(const PluginCodec_Definition * codecDefn, const OpalMediaFormat & mediaFormat);
00464
00465
00466
00467 const PString & GetFormatName() const
00468 { return m_capabilityFormatName; }
00469
00470 protected:
00471 const PluginCodec_Definition * m_codecDefn;
00472 PString m_capabilityFormatName;
00473 };
00474
00475 #if OPAL_H323
00476
00478
00479
00480
00481
00482 class H323AudioPluginCapability : public H323AudioCapability,
00483 public H323PluginCapabilityInfo
00484 {
00485 PCLASSINFO(H323AudioPluginCapability, H323AudioCapability);
00486 public:
00487 H323AudioPluginCapability(const PluginCodec_Definition * codecDefn,
00488 const OpalMediaFormat & mediaFormat,
00489 unsigned pluginSubType);
00490
00491 virtual PObject * Clone() const;
00492
00493 virtual PString GetFormatName() const;
00494
00495 virtual unsigned GetSubType() const;
00496
00497 protected:
00498 unsigned pluginSubType;
00499 };
00500
00501
00503
00504
00505
00506
00507 class H323PluginG7231Capability : public H323AudioPluginCapability
00508 {
00509 PCLASSINFO(H323PluginG7231Capability, H323AudioPluginCapability);
00510 public:
00511 H323PluginG7231Capability(const PluginCodec_Definition * codecDefn,
00512 const OpalMediaFormat & mediaFormat);
00513
00514 virtual PObject * Clone() const;
00515 virtual PBoolean OnSendingPDU(H245_AudioCapability & cap, unsigned packetSize) const;
00516 virtual PBoolean OnReceivedPDU(const H245_AudioCapability & cap, unsigned & packetSize);
00517 };
00518
00519
00521
00522
00523
00524
00525 class H323CodecPluginNonStandardAudioCapability : public H323NonStandardAudioCapability,
00526 public H323PluginCapabilityInfo
00527 {
00528 PCLASSINFO(H323CodecPluginNonStandardAudioCapability, H323NonStandardAudioCapability);
00529 public:
00530 H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * codecDefn,
00531 const OpalMediaFormat & mediaFormat,
00532 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00533 const unsigned char * data, unsigned dataLen);
00534
00535 H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * codecDefn,
00536 const OpalMediaFormat & mediaFormat,
00537 const unsigned char * data, unsigned dataLen);
00538
00539 virtual PObject * Clone() const;
00540
00541 virtual PString GetFormatName() const;
00542 };
00543
00545
00546
00547
00548
00549 class H323CodecPluginGenericAudioCapability : public H323GenericAudioCapability,
00550 public H323PluginCapabilityInfo
00551 {
00552 PCLASSINFO(H323CodecPluginGenericAudioCapability, H323GenericAudioCapability);
00553 public:
00554 H323CodecPluginGenericAudioCapability(const PluginCodec_Definition * codecDefn,
00555 const OpalMediaFormat & mediaFormat,
00556 const PluginCodec_H323GenericCodecData * data);
00557
00558 virtual PObject * Clone() const;
00559 virtual PString GetFormatName() const;
00560 };
00561
00562
00563 #if OPAL_VIDEO
00564
00566
00567
00568
00569
00570 class H323CodecPluginNonStandardVideoCapability : public H323NonStandardVideoCapability,
00571 public H323PluginCapabilityInfo
00572 {
00573 PCLASSINFO(H323CodecPluginNonStandardVideoCapability, H323NonStandardVideoCapability);
00574 public:
00575 H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * codecDefn,
00576 const OpalMediaFormat & mediaFormat,
00577 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00578 const unsigned char * data, unsigned dataLen);
00579
00580 H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * codecDefn,
00581 const OpalMediaFormat & mediaFormat,
00582 const unsigned char * data, unsigned dataLen);
00583
00584 virtual PObject * Clone() const;
00585
00586 virtual PString GetFormatName() const;
00587 };
00588
00590
00591
00592
00593
00594 class H323CodecPluginGenericVideoCapability : public H323GenericVideoCapability,
00595 public H323PluginCapabilityInfo
00596 {
00597 PCLASSINFO(H323CodecPluginGenericVideoCapability, H323GenericVideoCapability);
00598 public:
00599 H323CodecPluginGenericVideoCapability(const PluginCodec_Definition * codecDefn,
00600 const OpalMediaFormat & mediaFormat,
00601 const PluginCodec_H323GenericCodecData * data);
00602
00603 virtual PObject * Clone() const;
00604
00605 virtual PString GetFormatName() const;
00606 };
00607
00609
00610
00611
00612
00613 class H323H261Capability : public H323VideoCapability
00614 {
00615 PCLASSINFO(H323H261Capability, H323VideoCapability);
00616 public:
00617 H323H261Capability();
00618
00619 Comparison Compare(const PObject & obj) const;
00620
00621 virtual PObject * Clone() const;
00622
00623 virtual PString GetFormatName() const;
00624 virtual unsigned GetSubType() const;
00625
00626 virtual PBoolean OnSendingPDU(
00627 H245_VideoCapability & pdu
00628 ) const;
00629
00630 virtual PBoolean OnSendingPDU(
00631 H245_VideoMode & pdu
00632 ) const;
00633
00634 virtual PBoolean OnReceivedPDU(
00635 const H245_VideoCapability & pdu
00636 );
00637 };
00638
00639
00640 class H323H261PluginCapability : public H323H261Capability,
00641 public H323PluginCapabilityInfo
00642 {
00643 PCLASSINFO(H323H261PluginCapability, H323VideoCapability);
00644 public:
00645 H323H261PluginCapability(const PluginCodec_Definition * codecDefn, const OpalMediaFormat & mediaFormat);
00646
00647 virtual PObject * Clone() const;
00648 };
00649
00650
00652
00653
00654
00655
00656 class H323H263Capability : public H323VideoCapability
00657 {
00658 public:
00659 H323H263Capability(const PString & variant);
00660
00661 Comparison Compare(const PObject & obj) const;
00662
00663 virtual PObject * Clone() const;
00664
00665 virtual PString GetFormatName() const;
00666 virtual unsigned GetSubType() const;
00667
00668 virtual PBoolean OnSendingPDU(
00669 H245_VideoCapability & pdu
00670 ) const;
00671
00672 virtual PBoolean OnSendingPDU(
00673 H245_VideoMode & pdu
00674 ) const;
00675
00676 virtual PBoolean OnReceivedPDU(
00677 const H245_VideoCapability & pdu
00678 );
00679 virtual PBoolean IsMatch(
00680 const PASN_Choice & subTypePDU,
00681 const PString & mediaPacketization
00682 ) const;
00683
00684 protected:
00685 PString m_variant;
00686 };
00687
00688 class H323H263PluginCapability : public H323H263Capability,
00689 public H323PluginCapabilityInfo
00690 {
00691 PCLASSINFO(H323H263PluginCapability, H323VideoCapability);
00692 public:
00693 H323H263PluginCapability(const PluginCodec_Definition * codecDefn, const OpalMediaFormat & mediaFormat)
00694 : H323H263Capability(mediaFormat)
00695 , H323PluginCapabilityInfo(codecDefn, mediaFormat)
00696 {
00697 }
00698 };
00699
00700 #endif // OPAL_VIDEO
00701 #endif // OPAL_H323
00702
00703 #endif // OPAL_CODEC_OPALPLUGINMGR_H