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, time_t 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 Transcode(const void * from, unsigned * fromLen, void * to, unsigned * toLen, unsigned * flags) const
00223 {
00224 return codecDef != NULL && codecDef->codecFunction != NULL &&
00225 (codecDef->codecFunction)(codecDef, context, from, fromLen, to, toLen, flags) != 0;
00226 }
00227
00228 protected:
00229 const PluginCodec_Definition * codecDef;
00230 bool isEncoder;
00231 void * context;
00232
00233 OpalPluginControl setCodecOptions;
00234 OpalPluginControl getOutputDataSizeControl;
00235 };
00236
00237
00239
00240 class OpalPluginAudioFormatInternal : public OpalAudioFormatInternal, public OpalPluginMediaFormatInternal
00241 {
00242 public:
00243 friend class OpalPluginCodecManager;
00244
00245 OpalPluginAudioFormatInternal(
00246 const PluginCodec_Definition * codecDefn,
00247 const char * fmtName,
00248 const char * rtpEncodingName,
00249 unsigned frameTime,
00250 unsigned ,
00251 time_t timeStamp
00252 );
00253 virtual PObject * Clone() const;
00254 virtual bool IsValidForProtocol(const PString & protocol) const;
00255 virtual bool ToNormalisedOptions();
00256 virtual bool ToCustomisedOptions();
00257 };
00258
00259
00260 class OpalPluginFramedAudioTranscoder : public OpalFramedTranscoder, public OpalPluginTranscoder
00261 {
00262 PCLASSINFO(OpalPluginFramedAudioTranscoder, OpalFramedTranscoder);
00263 public:
00264 OpalPluginFramedAudioTranscoder(const PluginCodec_Definition * codecDefn, bool isEncoder);
00265 bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00266 PBoolean ConvertFrame(const BYTE * input, PINDEX & consumed, BYTE * output, PINDEX & created);
00267 virtual PBoolean ConvertSilentFrame(BYTE * buffer);
00268 virtual bool AcceptComfortNoise() const { return comfortNoise; }
00269 protected:
00270 bool comfortNoise;
00271 };
00272
00273
00274 class OpalPluginStreamedAudioTranscoder : public OpalStreamedTranscoder, public OpalPluginTranscoder
00275 {
00276 PCLASSINFO(OpalPluginStreamedAudioTranscoder, OpalStreamedTranscoder);
00277 public:
00278 OpalPluginStreamedAudioTranscoder(const PluginCodec_Definition * codec, bool isEncoder);
00279 bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00280 virtual bool AcceptComfortNoise() const { return comfortNoise; }
00281 virtual int ConvertOne(int from) const;
00282 protected:
00283 bool comfortNoise;
00284 };
00285
00286
00288
00289 #if OPAL_VIDEO
00290
00291 class OpalPluginVideoFormatInternal : public OpalVideoFormatInternal, public OpalPluginMediaFormatInternal
00292 {
00293 public:
00294 OpalPluginVideoFormatInternal(
00295 const PluginCodec_Definition * codec,
00296 const char * fmtName,
00297 const char * rtpEncodingName,
00298 time_t timeStamp
00299 );
00300 virtual PObject * Clone() const;
00301 virtual bool IsValidForProtocol(const PString & protocol) const;
00302 virtual bool ToNormalisedOptions();
00303 virtual bool ToCustomisedOptions();
00304 };
00305
00306
00307 class OpalPluginVideoTranscoder : public OpalVideoTranscoder, public OpalPluginTranscoder
00308 {
00309 PCLASSINFO(OpalPluginVideoTranscoder, OpalVideoTranscoder);
00310 public:
00311 OpalPluginVideoTranscoder(const PluginCodec_Definition * codec, bool isEncoder);
00312 ~OpalPluginVideoTranscoder();
00313
00314 PBoolean ConvertFrames(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00315 bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00316
00317 protected:
00318 RTP_DataFrame * m_bufferRTP;
00319 PTimeInterval m_lastVideoFastUpdate;
00320
00321 #if PTRACING
00322 unsigned m_consecutiveIntraFrames;
00323 #endif
00324 };
00325
00326 #endif
00327
00329
00330 #if OPAL_T38_CAPABILITY
00331
00332 class OpalPluginFaxFormatInternal : public OpalMediaFormatInternal, public OpalPluginMediaFormatInternal
00333 {
00334 public:
00335 OpalPluginFaxFormatInternal(
00336 const PluginCodec_Definition * codec,
00337 const char * fmtName,
00338 const char * rtpEncodingName,
00339 unsigned frameTime,
00340 unsigned ,
00341 time_t timeStamp
00342 );
00343 virtual PObject * Clone() const;
00344 virtual bool IsValidForProtocol(const PString & protocol) const;
00345 };
00346
00347 #endif // OPAL_T38_CAPABILITY
00348
00349
00351
00352
00353
00354
00362 class OpalFactoryCodec : public PObject {
00363 PCLASSINFO(OpalFactoryCodec, PObject)
00364 public:
00366 virtual const struct PluginCodec_Definition * GetDefinition()
00367 { return NULL; }
00368
00370 virtual PString GetInputFormat() const = 0;
00371
00373 virtual PString GetOutputFormat() const = 0;
00374
00376 virtual int Encode(const void * from,
00377 unsigned * fromLen,
00378 void * to,
00379 unsigned * toLen,
00380 unsigned int * flag
00381 ) = 0;
00382
00384 virtual unsigned int GetSampleRate() const = 0;
00385
00387 virtual unsigned int GetBitsPerSec() const = 0;
00388
00390 virtual unsigned int GetFrameTime() const = 0;
00391
00393 virtual unsigned int GetSamplesPerFrame() const = 0;
00394
00396 virtual unsigned int GetBytesPerFrame() const = 0;
00397
00399 virtual unsigned int GetRecommendedFramesPerPacket() const = 0;
00400
00402 virtual unsigned int GetMaxFramesPerPacket() const = 0;
00403
00405 virtual BYTE GetRTPPayload() const = 0;
00406
00408 virtual PString GetSDPFormat() const = 0;
00409 };
00410
00412
00413 template<class TranscoderClass>
00414 class OpalPluginTranscoderFactory : public OpalTranscoderFactory
00415 {
00416 public:
00417 class Worker : public OpalTranscoderFactory::WorkerBase
00418 {
00419 public:
00420 Worker(const OpalTranscoderKey & key, const PluginCodec_Definition * codec, bool enc)
00421 : OpalTranscoderFactory::WorkerBase(), codecDefn(codec), isEncoder(enc)
00422 { OpalTranscoderFactory::Register(key, this); }
00423
00424 protected:
00425 virtual OpalTranscoder * Create(const OpalTranscoderKey &) const
00426 { return new TranscoderClass(codecDefn, isEncoder); }
00427
00428 const PluginCodec_Definition * codecDefn;
00429 bool isEncoder;
00430 };
00431 };
00432
00434
00435
00436
00437
00438 class H323PluginCapabilityInfo
00439 {
00440 public:
00441 H323PluginCapabilityInfo(const PluginCodec_Definition * codecDefn, const OpalMediaFormat & mediaFormat);
00442
00443
00444
00445 const PString & GetFormatName() const
00446 { return m_capabilityFormatName; }
00447
00448 protected:
00449 const PluginCodec_Definition * m_codecDefn;
00450 PString m_capabilityFormatName;
00451 };
00452
00453 #if OPAL_H323
00454
00456
00457
00458
00459
00460 class H323AudioPluginCapability : public H323AudioCapability,
00461 public H323PluginCapabilityInfo
00462 {
00463 PCLASSINFO(H323AudioPluginCapability, H323AudioCapability);
00464 public:
00465 H323AudioPluginCapability(const PluginCodec_Definition * codecDefn,
00466 const OpalMediaFormat & mediaFormat,
00467 unsigned pluginSubType);
00468
00469 virtual PObject * Clone() const;
00470
00471 virtual PString GetFormatName() const;
00472
00473 virtual unsigned GetSubType() const;
00474
00475 protected:
00476 unsigned pluginSubType;
00477 };
00478
00479 #define OPAL_DECLARE_EMPTY_AUDIO_CAPABILITY(fmt, type) \
00480 class fmt##_CapabilityRegisterer { \
00481 public: \
00482 fmt##_CapabilityRegisterer() \
00483 { H323CapabilityFactory::Register(fmt, new H323AudioPluginCapability(fmt, fmt, type)); } \
00484 }; \
00485
00486 #define OPAL_DEFINE_EMPTY_AUDIO_CAPABILITY(fmt) \
00487 static fmt##_CapabilityRegisterer fmt##_CapabilityRegisterer_instance; \
00488
00490 //
00491
00492
00493
00494 class H323PluginG7231Capability : public H323AudioPluginCapability
00495 {
00496 PCLASSINFO(H323PluginG7231Capability, H323AudioPluginCapability);
00497 public:
00498 H323PluginG7231Capability(const PluginCodec_Definition * codecDefn,
00499 const OpalMediaFormat & mediaFormat);
00500
00501 virtual PObject * Clone() const;
00502 virtual PBoolean OnSendingPDU(H245_AudioCapability & cap, unsigned packetSize) const;
00503 virtual PBoolean OnReceivedPDU(const H245_AudioCapability & cap, unsigned & packetSize);
00504 };
00505
00506 #define OPAL_DECLARE_EMPTY_G7231_CAPABILITY(fmt, annex) \
00507 class fmt##_CapabilityRegisterer { \
00508 public: \
00509 fmt##_CapabilityRegisterer() \
00510 { H323CapabilityFactory::Register(fmt, new H323PluginG7231Capability(fmt, annex)); } \
00511 }; \
00512
00513 #define OPAL_DEFINE_EMPTY_G7231_CAPABILITY(fmt) \
00514 static fmt##_CapabilityRegisterer fmt##_CapabilityRegisterer_instance; \
00515
00517 //
00518
00519
00520
00521 class H323CodecPluginNonStandardAudioCapability : public H323NonStandardAudioCapability,
00522 public H323PluginCapabilityInfo
00523 {
00524 PCLASSINFO(H323CodecPluginNonStandardAudioCapability, H323NonStandardAudioCapability);
00525 public:
00526 H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * codecDefn,
00527 const OpalMediaFormat & mediaFormat,
00528 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00529 const unsigned char * data, unsigned dataLen);
00530
00531 H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * codecDefn,
00532 const OpalMediaFormat & mediaFormat,
00533 const unsigned char * data, unsigned dataLen);
00534
00535 virtual PObject * Clone() const;
00536
00537 virtual PString GetFormatName() const;
00538 };
00539
00541
00542
00543
00544
00545 class H323CodecPluginGenericAudioCapability : public H323GenericAudioCapability,
00546 public H323PluginCapabilityInfo
00547 {
00548 PCLASSINFO(H323CodecPluginGenericAudioCapability, H323GenericAudioCapability);
00549 public:
00550 H323CodecPluginGenericAudioCapability(const PluginCodec_Definition * codecDefn,
00551 const OpalMediaFormat & mediaFormat,
00552 const PluginCodec_H323GenericCodecData * data);
00553
00554 virtual PObject * Clone() const;
00555 virtual PString GetFormatName() const;
00556 };
00557
00558
00559 #if OPAL_VIDEO
00560
00562
00563
00564
00565
00566 class H323VideoPluginCapability : public H323VideoCapability,
00567 public H323PluginCapabilityInfo
00568 {
00569 PCLASSINFO(H323VideoPluginCapability, H323VideoCapability);
00570 public:
00571 H323VideoPluginCapability(const PluginCodec_Definition * codecDefn,
00572 const OpalMediaFormat & mediaFormat,
00573 unsigned _pluginSubType);
00574
00575 virtual PString GetFormatName() const;
00576
00577 virtual unsigned GetSubType() const;
00578
00579 static bool SetOptionsFromMPI(OpalMediaFormat & mediaFormat, int frameWidth, int frameHeight, int frameRate);
00580
00581 virtual void PrintOn(std::ostream & strm) const;
00582
00583 protected:
00584 unsigned pluginSubType;
00585 unsigned h323subType;
00586 };
00587
00589
00590
00591
00592
00593 class H323CodecPluginNonStandardVideoCapability : public H323NonStandardVideoCapability,
00594 public H323PluginCapabilityInfo
00595 {
00596 PCLASSINFO(H323CodecPluginNonStandardVideoCapability, H323NonStandardVideoCapability);
00597 public:
00598 H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * codecDefn,
00599 const OpalMediaFormat & mediaFormat,
00600 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00601 const unsigned char * data, unsigned dataLen);
00602
00603 H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * codecDefn,
00604 const OpalMediaFormat & mediaFormat,
00605 const unsigned char * data, unsigned dataLen);
00606
00607 virtual PObject * Clone() const;
00608
00609 virtual PString GetFormatName() const;
00610 };
00611
00613
00614
00615
00616
00617 class H323CodecPluginGenericVideoCapability : public H323GenericVideoCapability,
00618 public H323PluginCapabilityInfo
00619 {
00620 PCLASSINFO(H323CodecPluginGenericVideoCapability, H323GenericVideoCapability);
00621 public:
00622 H323CodecPluginGenericVideoCapability(const PluginCodec_Definition * codecDefn,
00623 const OpalMediaFormat & mediaFormat,
00624 const PluginCodec_H323GenericCodecData * data);
00625
00626 virtual PObject * Clone() const;
00627
00628 virtual PString GetFormatName() const;
00629 };
00630
00632
00633
00634
00635
00636 class H323H261PluginCapability : public H323VideoPluginCapability
00637 {
00638 PCLASSINFO(H323H261PluginCapability, H323VideoPluginCapability);
00639 public:
00640 H323H261PluginCapability(const PluginCodec_Definition * codecDefn, const OpalMediaFormat & mediaFormat);
00641
00642 Comparison Compare(const PObject & obj) const;
00643
00644 virtual PObject * Clone() const;
00645
00646 virtual PBoolean OnSendingPDU(
00647 H245_VideoCapability & pdu
00648 ) const;
00649
00650 virtual PBoolean OnSendingPDU(
00651 H245_VideoMode & pdu
00652 ) const;
00653
00654 virtual PBoolean OnReceivedPDU(
00655 const H245_VideoCapability & pdu
00656 );
00657 };
00658
00660
00661
00662
00663
00664 class H323H263PluginCapability : public H323VideoPluginCapability
00665 {
00666 PCLASSINFO(H323H263PluginCapability, H323VideoPluginCapability);
00667 public:
00668 H323H263PluginCapability(const PluginCodec_Definition * codecDefn, const OpalMediaFormat & mediaFormat);
00669
00670 Comparison Compare(const PObject & obj) const;
00671
00672 virtual PObject * Clone() const;
00673
00674 virtual PBoolean OnSendingPDU(
00675 H245_VideoCapability & pdu
00676 ) const;
00677
00678 virtual PBoolean OnSendingPDU(
00679 H245_VideoMode & pdu
00680 ) const;
00681
00682 virtual PBoolean OnReceivedPDU(
00683 const H245_VideoCapability & pdu
00684 );
00685 virtual PBoolean IsMatch(const PASN_Choice & subTypePDU) const;
00686 };
00687
00688 #endif // OPAL_VIDEO
00689 #endif // OPAL_H323
00690
00691 #endif // OPAL_CODEC_OPALPLUGINMGR_H