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