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 class OpalPluginCodecHandler : public PObject
00077 {
00078 PCLASSINFO(OpalPluginCodecHandler, PObject);
00079 public:
00080 OpalPluginCodecHandler();
00081
00082 virtual OpalMediaFormatInternal * OnCreateAudioFormat(OpalPluginCodecManager & mgr,
00083 const PluginCodec_Definition * codecDefn,
00084 const char * rtpEncodingName,
00085 unsigned frameTime,
00086 unsigned timeUnits,
00087 time_t timeStamp);
00088
00089 #if OPAL_VIDEO
00090 virtual OpalMediaFormatInternal * OnCreateVideoFormat(OpalPluginCodecManager & mgr,
00091 const PluginCodec_Definition * codecDefn,
00092 const char * rtpEncodingName,
00093 time_t timeStamp);
00094 virtual void RegisterVideoTranscoder(const PString & src, const PString & dst, const PluginCodec_Definition * codec, bool v);
00095 #endif
00096
00097 #if OPAL_T38_CAPABILITY
00098 virtual OpalMediaFormatInternal * OnCreateFaxFormat(OpalPluginCodecManager & mgr,
00099 const PluginCodec_Definition * codecDefn,
00100 const char * rtpEncodingName,
00101 unsigned frameTime,
00102 unsigned timeUnits,
00103 time_t timeStamp);
00104 #endif
00105 };
00106
00107
00108 class OpalPluginCodecManager : public PPluginModuleManager
00109 {
00110 PCLASSINFO(OpalPluginCodecManager, PPluginModuleManager);
00111 public:
00112 OpalPluginCodecManager(PPluginManager * pluginMgr = NULL);
00113 ~OpalPluginCodecManager();
00114
00115 void RegisterStaticCodec(const H323StaticPluginCodecFactory::Key_T & name,
00116 PluginCodec_GetAPIVersionFunction getApiVerFn,
00117 PluginCodec_GetCodecFunction getCodecFn);
00118
00119 void OnLoadPlugin(PDynaLink & dll, INT code);
00120
00121 virtual void OnShutdown();
00122
00123 static void Bootstrap();
00124
00125 #if OPAL_H323
00126 H323Capability * CreateCapability(
00127 const PString & _mediaFormat,
00128 const PString & _baseName,
00129 unsigned maxFramesPerPacket,
00130 unsigned recommendedFramesPerPacket,
00131 unsigned _pluginSubType);
00132 #endif
00133
00134 protected:
00135
00136 PList<OpalMediaFormat> mediaFormatsOnHeap;
00137
00138 void RegisterCodecPlugins (unsigned int count, const PluginCodec_Definition * codecList, OpalPluginCodecHandler * handler);
00139 void UnregisterCodecPlugins(unsigned int count, const PluginCodec_Definition * codecList, OpalPluginCodecHandler * handler);
00140
00141 #if OPAL_H323
00142 void RegisterCapability(const PluginCodec_Definition * codecDefn);
00143 #endif
00144 };
00145
00146
00148
00149 class OpalPluginControl
00150 {
00151 public:
00152 OpalPluginControl(const PluginCodec_Definition * def, const char * name);
00153
00154 bool Exists() const
00155 {
00156 return controlDef != NULL;
00157 }
00158
00159 int Call(void * parm, unsigned * parmLen, void * context = NULL) const
00160 {
00161 return controlDef != NULL ? (*controlDef->control)(codecDef, context, fnName, parm, parmLen) : -1;
00162 }
00163
00164 int Call(void * parm, unsigned parmLen, void * context = NULL) const
00165 {
00166 return Call(parm, &parmLen, context);
00167 }
00168
00169 const char * GetName() const { return fnName; }
00170
00171 protected:
00172 const PluginCodec_Definition * codecDef;
00173 const char * fnName;
00174 const PluginCodec_ControlDefn * controlDef;
00175 };
00176
00177
00179
00180 class OpalPluginMediaFormatInternal
00181 {
00182 public:
00183 OpalPluginMediaFormatInternal(const PluginCodec_Definition * defn);
00184
00185 bool AdjustOptions(OpalMediaFormatInternal & fmt, OpalPluginControl & control) const;
00186 void PopulateOptions(OpalMediaFormatInternal & format);
00187 void SetOldStyleOption(OpalMediaFormatInternal & format, const PString & _key, const PString & _val, const PString & type);
00188 bool IsValidForProtocol(const PString & _protocol) const;
00189
00190 const PluginCodec_Definition * codecDef;
00191 OpalPluginControl getOptionsControl;
00192 OpalPluginControl freeOptionsControl;
00193 OpalPluginControl validForProtocolControl;
00194 OpalPluginControl toNormalisedControl;
00195 OpalPluginControl toCustomisedControl;
00196 };
00197
00198
00199 class OpalPluginMediaFormat : public OpalMediaFormat
00200 {
00201 public:
00202 OpalPluginMediaFormat(OpalMediaFormatInternal * info)
00203 : OpalMediaFormat(info)
00204 {
00205 }
00206
00207 OpalPluginMediaFormatInternal * GetInfo() const { return dynamic_cast<OpalPluginMediaFormatInternal *>(m_info); }
00208 };
00209
00210
00211 class OpalPluginTranscoder
00212 {
00213 public:
00214 OpalPluginTranscoder(const PluginCodec_Definition * defn, bool isEnc);
00215 ~OpalPluginTranscoder();
00216
00217 bool UpdateOptions(const OpalMediaFormat & fmt);
00218 bool Transcode(const void * from, unsigned * fromLen, void * to, unsigned * toLen, unsigned * flags) const
00219 {
00220 return codecDef != NULL && codecDef->codecFunction != NULL &&
00221 (codecDef->codecFunction)(codecDef, context, from, fromLen, to, toLen, flags) != 0;
00222 }
00223
00224 protected:
00225 const PluginCodec_Definition * codecDef;
00226 bool isEncoder;
00227 void * context;
00228
00229 OpalPluginControl setCodecOptions;
00230 OpalPluginControl getOutputDataSizeControl;
00231 };
00232
00233
00235
00236 class OpalPluginAudioFormatInternal : public OpalAudioFormatInternal, public OpalPluginMediaFormatInternal
00237 {
00238 public:
00239 friend class OpalPluginCodecManager;
00240
00241 OpalPluginAudioFormatInternal(
00242 const PluginCodec_Definition * codecDefn,
00243 const char * rtpEncodingName,
00244 unsigned frameTime,
00245 unsigned ,
00246 time_t timeStamp
00247 );
00248 virtual PObject * Clone() const;
00249 virtual bool IsValidForProtocol(const PString & protocol) const;
00250 virtual bool ToNormalisedOptions();
00251 virtual bool ToCustomisedOptions();
00252 };
00253
00254
00255 class OpalPluginFramedAudioTranscoder : public OpalFramedTranscoder, public OpalPluginTranscoder
00256 {
00257 PCLASSINFO(OpalPluginFramedAudioTranscoder, OpalFramedTranscoder);
00258 public:
00259 OpalPluginFramedAudioTranscoder(const PluginCodec_Definition * codecDefn, bool isEncoder);
00260 bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00261 PBoolean ConvertFrame(const BYTE * input, PINDEX & consumed, BYTE * output, PINDEX & created);
00262 virtual PBoolean ConvertSilentFrame(BYTE * buffer);
00263 virtual bool AcceptComfortNoise() const { return comfortNoise; }
00264 protected:
00265 bool comfortNoise;
00266 };
00267
00268
00269 class OpalPluginStreamedAudioTranscoder : public OpalStreamedTranscoder, public OpalPluginTranscoder
00270 {
00271 PCLASSINFO(OpalPluginStreamedAudioTranscoder, OpalStreamedTranscoder);
00272 public:
00273 OpalPluginStreamedAudioTranscoder(const PluginCodec_Definition * codec, bool isEncoder, unsigned inputBits, unsigned outputBits);
00274 bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00275 virtual bool AcceptComfortNoise() const { return comfortNoise; }
00276 protected:
00277 bool comfortNoise;
00278 };
00279
00280
00281 class OpalPluginStreamedAudioEncoder : public OpalPluginStreamedAudioTranscoder
00282 {
00283 PCLASSINFO(OpalPluginStreamedAudioEncoder, OpalPluginStreamedAudioTranscoder);
00284 public:
00285 OpalPluginStreamedAudioEncoder(const PluginCodec_Definition * codec, bool);
00286 int ConvertOne(int _sample) const;
00287 };
00288
00289 class OpalPluginStreamedAudioDecoder : public OpalPluginStreamedAudioTranscoder
00290 {
00291 PCLASSINFO(OpalPluginStreamedAudioDecoder, OpalPluginStreamedAudioTranscoder);
00292 public:
00293 OpalPluginStreamedAudioDecoder(const PluginCodec_Definition * codec, bool);
00294 int ConvertOne(int codedSample) const;
00295 };
00296
00297
00299
00300 #if OPAL_VIDEO
00301
00302 class OpalPluginVideoFormatInternal : public OpalVideoFormatInternal, public OpalPluginMediaFormatInternal
00303 {
00304 public:
00305 OpalPluginVideoFormatInternal(
00306 const PluginCodec_Definition * codec,
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 PBoolean ConvertFrames(const RTP_DataFrame & src, RTP_DataFrameList & dstList);
00325 bool UpdateMediaFormats(const OpalMediaFormat & input, const OpalMediaFormat & output);
00326
00327 protected:
00328 RTP_DataFrame * m_bufferRTP;
00329 PTimeInterval m_lastVideoFastUpdate;
00330
00331 #if PTRACING
00332 unsigned m_consecutiveIntraFrames;
00333 #endif
00334 };
00335
00336 #endif
00337
00339
00340 #if OPAL_T38_CAPABILITY
00341
00342 class OpalPluginFaxFormatInternal : public OpalMediaFormatInternal, public OpalPluginMediaFormatInternal
00343 {
00344 public:
00345 OpalPluginFaxFormatInternal(
00346 const PluginCodec_Definition * codec,
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);
00451
00452 H323PluginCapabilityInfo(const PString & _baseName);
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 unsigned pluginSubType);
00476
00477
00478 H323AudioPluginCapability(const PString & _mediaFormat,
00479 const PString & _baseName,
00480 unsigned _pluginSubType);
00481
00482 virtual PObject * Clone() const;
00483
00484 virtual PString GetFormatName() const;
00485
00486 virtual unsigned GetSubType() const;
00487
00488 protected:
00489 unsigned pluginSubType;
00490 };
00491
00492 #define OPAL_DECLARE_EMPTY_AUDIO_CAPABILITY(fmt, type) \
00493 class fmt##_CapabilityRegisterer { \
00494 public: \
00495 fmt##_CapabilityRegisterer() \
00496 { H323CapabilityFactory::Register(fmt, new H323AudioPluginCapability(fmt, fmt, type)); } \
00497 }; \
00498
00499 #define OPAL_DEFINE_EMPTY_AUDIO_CAPABILITY(fmt) \
00500 static fmt##_CapabilityRegisterer fmt##_CapabilityRegisterer_instance; \
00501
00503 //
00504
00505
00506
00507 class H323PluginG7231Capability : public H323AudioPluginCapability
00508 {
00509 PCLASSINFO(H323PluginG7231Capability, H323AudioPluginCapability);
00510 public:
00511 H323PluginG7231Capability(const PluginCodec_Definition * codecDefn, bool annexA = true);
00512
00513
00514 H323PluginG7231Capability(const OpalMediaFormat & fmt, bool annexA = true);
00515
00516 virtual PObject * Clone() const;
00517 virtual PBoolean OnSendingPDU(H245_AudioCapability & cap, unsigned packetSize) const;
00518 virtual PBoolean OnReceivedPDU(const H245_AudioCapability & cap, unsigned & packetSize);
00519
00520 protected:
00521 bool m_annexA;
00522 };
00523
00524 #define OPAL_DECLARE_EMPTY_G7231_CAPABILITY(fmt, annex) \
00525 class fmt##_CapabilityRegisterer { \
00526 public: \
00527 fmt##_CapabilityRegisterer() \
00528 { H323CapabilityFactory::Register(fmt, new H323PluginG7231Capability(fmt, annex)); } \
00529 }; \
00530
00531 #define OPAL_DEFINE_EMPTY_G7231_CAPABILITY(fmt) \
00532 static fmt##_CapabilityRegisterer fmt##_CapabilityRegisterer_instance; \
00533
00535 //
00536
00537
00538
00539 class H323CodecPluginNonStandardAudioCapability : public H323NonStandardAudioCapability,
00540 public H323PluginCapabilityInfo
00541 {
00542 PCLASSINFO(H323CodecPluginNonStandardAudioCapability, H323NonStandardAudioCapability);
00543 public:
00544 H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * codecDefn,
00545 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00546 const unsigned char * data, unsigned dataLen);
00547
00548 H323CodecPluginNonStandardAudioCapability(const PluginCodec_Definition * codecDefn,
00549 const unsigned char * data, unsigned dataLen);
00550
00551 virtual PObject * Clone() const;
00552
00553 virtual PString GetFormatName() const;
00554 };
00555
00557
00558
00559
00560
00561 class H323CodecPluginGenericAudioCapability : public H323GenericAudioCapability,
00562 public H323PluginCapabilityInfo
00563 {
00564 PCLASSINFO(H323CodecPluginGenericAudioCapability, H323GenericAudioCapability);
00565 public:
00566 H323CodecPluginGenericAudioCapability(const PluginCodec_Definition * codecDefn,
00567 const PluginCodec_H323GenericCodecData * data);
00568
00569 virtual PObject * Clone() const;
00570 virtual PString GetFormatName() const;
00571 };
00572
00573
00574 #if OPAL_VIDEO
00575
00577
00578
00579
00580
00581 class H323VideoPluginCapability : public H323VideoCapability,
00582 public H323PluginCapabilityInfo
00583 {
00584 PCLASSINFO(H323VideoPluginCapability, H323VideoCapability);
00585 public:
00586 H323VideoPluginCapability(const PluginCodec_Definition * codecDefn,
00587 unsigned _pluginSubType);
00588
00589 virtual PString GetFormatName() const;
00590
00591 virtual unsigned GetSubType() const;
00592
00593 static bool SetOptionsFromMPI(OpalMediaFormat & mediaFormat, int frameWidth, int frameHeight, int frameRate);
00594
00595 virtual void PrintOn(std::ostream & strm) const;
00596
00597 protected:
00598 unsigned pluginSubType;
00599 unsigned h323subType;
00600 };
00601
00603
00604
00605
00606
00607 class H323CodecPluginNonStandardVideoCapability : public H323NonStandardVideoCapability,
00608 public H323PluginCapabilityInfo
00609 {
00610 PCLASSINFO(H323CodecPluginNonStandardVideoCapability, H323NonStandardVideoCapability);
00611 public:
00612 H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * codecDefn,
00613 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00614 const unsigned char * data, unsigned dataLen);
00615
00616 H323CodecPluginNonStandardVideoCapability(const PluginCodec_Definition * codecDefn,
00617 const unsigned char * data, unsigned dataLen);
00618
00619 virtual PObject * Clone() const;
00620
00621 virtual PString GetFormatName() const;
00622 };
00623
00625
00626
00627
00628
00629 class H323CodecPluginGenericVideoCapability : public H323GenericVideoCapability,
00630 public H323PluginCapabilityInfo
00631 {
00632 PCLASSINFO(H323CodecPluginGenericVideoCapability, H323GenericVideoCapability);
00633 public:
00634 H323CodecPluginGenericVideoCapability(const PluginCodec_Definition * codecDefn,
00635 const PluginCodec_H323GenericCodecData * data);
00636
00637 virtual PObject * Clone() const;
00638
00639 virtual PString GetFormatName() const;
00640 };
00641
00643
00644
00645
00646
00647 class H323H261PluginCapability : public H323VideoPluginCapability
00648 {
00649 PCLASSINFO(H323H261PluginCapability, H323VideoPluginCapability);
00650 public:
00651 H323H261PluginCapability(const PluginCodec_Definition * codecDefn);
00652
00653 Comparison Compare(const PObject & obj) const;
00654
00655 virtual PObject * Clone() const;
00656
00657 virtual PBoolean OnSendingPDU(
00658 H245_VideoCapability & pdu
00659 ) const;
00660
00661 virtual PBoolean OnSendingPDU(
00662 H245_VideoMode & pdu
00663 ) const;
00664
00665 virtual PBoolean OnReceivedPDU(
00666 const H245_VideoCapability & pdu
00667 );
00668 };
00669
00671
00672
00673
00674
00675 class H323H263PluginCapability : public H323VideoPluginCapability
00676 {
00677 PCLASSINFO(H323H263PluginCapability, H323VideoPluginCapability);
00678 public:
00679 H323H263PluginCapability(const PluginCodec_Definition * codecDefn);
00680
00681 Comparison Compare(const PObject & obj) const;
00682
00683 virtual PObject * Clone() const;
00684
00685 virtual PBoolean OnSendingPDU(
00686 H245_VideoCapability & pdu
00687 ) const;
00688
00689 virtual PBoolean OnSendingPDU(
00690 H245_VideoMode & pdu
00691 ) const;
00692
00693 virtual PBoolean OnReceivedPDU(
00694 const H245_VideoCapability & pdu
00695 );
00696 virtual PBoolean IsMatch(const PASN_Choice & subTypePDU) const;
00697 };
00698
00699 #endif // OPAL_VIDEO
00700 #endif // OPAL_H323
00701
00702 #endif // OPAL_CODEC_OPALPLUGINMGR_H