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
00032 #ifndef OPAL_OPAL_MEDIAFMT_H
00033 #define OPAL_OPAL_MEDIAFMT_H
00034
00035 #ifdef P_USE_PRAGMA
00036 #pragma interface
00037 #endif
00038
00039 #ifdef _MSC_VER
00040 #if _MSC_VER < 1300
00041 #pragma warning(disable:4663)
00042 #endif
00043 #endif
00044
00045 #include <opal/buildopts.h>
00046
00047 #include <opal/mediatype.h>
00048 #include <rtp/rtp.h>
00049
00050 #if OPAL_VIDEO
00051 #include <ptlib/videoio.h>
00052 #endif
00053
00054 #include <limits>
00055
00056 #ifdef min
00057 #undef min
00058 #endif
00059 #ifdef max
00060 #undef max
00061 #endif
00062
00063 class OpalMediaFormat;
00064
00065
00067
00068 PLIST(OpalMediaFormatBaseList, OpalMediaFormat);
00069
00072 class OpalMediaFormatList : public OpalMediaFormatBaseList
00073 {
00074 PCLASSINFO(OpalMediaFormatList, OpalMediaFormatBaseList);
00075 public:
00080 OpalMediaFormatList();
00081
00084 OpalMediaFormatList(
00085 const OpalMediaFormat & format
00086 );
00087
00090 OpalMediaFormatList(const OpalMediaFormatList & l) : OpalMediaFormatBaseList(l) { }
00092
00098 OpalMediaFormatList & operator+=(
00099 const OpalMediaFormat & format
00100 );
00101
00105 OpalMediaFormatList & operator+=(
00106 const OpalMediaFormatList & formats
00107 );
00108
00112 OpalMediaFormatList & operator-=(
00113 const OpalMediaFormat & format
00114 );
00115
00119 OpalMediaFormatList & operator-=(
00120 const OpalMediaFormatList & formats
00121 );
00122
00127 const_iterator FindFormat(
00128 RTP_DataFrame::PayloadTypes rtpPayloadType,
00129 const unsigned clockRate,
00130 const char * rtpEncodingName = NULL,
00131 const char * protocol = NULL
00132 ) const;
00133
00150 const_iterator FindFormat(
00151 const PString & wildcard,
00152 const_iterator start = const_iterator()
00153 ) const;
00154
00157 PBoolean HasFormat(
00158 RTP_DataFrame::PayloadTypes rtpPayloadType
00159 ) const { return FindFormat(rtpPayloadType) != end(); }
00160
00166 PBoolean HasFormat(
00167 const PString & wildcard
00168 ) const { return FindFormat(wildcard) != end(); }
00169
00188 void Remove(
00189 const PStringArray & mask
00190 );
00191
00207 void Reorder(
00208 const PStringArray & order
00209 );
00210
00213 bool HasType(
00214 const OpalMediaType & type,
00215 bool mustBeTransportable = true
00216 ) const;
00218
00219 private:
00220 virtual PINDEX Append(PObject *) { return P_MAX_INDEX; }
00221 virtual PINDEX Insert(const PObject &, PObject *) { return P_MAX_INDEX; }
00222 virtual PINDEX InsertAt(PINDEX, PObject *) { return P_MAX_INDEX; }
00223 virtual PBoolean SetAt(PINDEX, PObject *) { return PFalse; }
00224 };
00225
00226
00228
00231 class OpalMediaOption : public PObject
00232 {
00233 PCLASSINFO(OpalMediaOption, PObject);
00234 public:
00235 enum MergeType {
00236 NoMerge,
00237 MinMerge,
00238 MaxMerge,
00239 EqualMerge,
00240 NotEqualMerge,
00241 AlwaysMerge,
00242
00243
00244 AndMerge = MinMerge,
00245 OrMerge = MaxMerge
00246 };
00247
00248 protected:
00249 OpalMediaOption(
00250 const PString & name
00251 );
00252 OpalMediaOption(
00253 const char * name,
00254 bool readOnly,
00255 MergeType merge
00256 );
00257
00258 public:
00259 virtual Comparison Compare(const PObject & obj) const;
00260
00261 virtual bool Merge(
00262 const OpalMediaOption & option
00263 );
00264 virtual Comparison CompareValue(
00265 const OpalMediaOption & option
00266 ) const = 0;
00267 virtual void Assign(
00268 const OpalMediaOption & option
00269 ) = 0;
00270
00271 PString AsString() const;
00272 bool FromString(const PString & value);
00273
00274 const PString & GetName() const { return m_name; }
00275
00276 bool IsReadOnly() const { return m_readOnly; }
00277 void SetReadOnly(bool readOnly) { m_readOnly = readOnly; }
00278
00279 MergeType GetMerge() const { return m_merge; }
00280 void SetMerge(MergeType merge) { m_merge = merge; }
00281
00282 #if OPAL_SIP
00283 const PString & GetFMTPName() const { return m_FMTPName; }
00284 void SetFMTPName(const char * name) { m_FMTPName = name; }
00285
00286 const PString & GetFMTPDefault() const { return m_FMTPDefault; }
00287 void SetFMTPDefault(const char * value) { m_FMTPDefault = value; }
00288 #endif // OPAL_SIP
00289
00290 #if OPAL_H323
00291 struct H245GenericInfo {
00292 H245GenericInfo() { memset(this, 0, sizeof(*this)); }
00293 unsigned ordinal:16;
00294 enum Modes {
00295 None,
00296 Collapsing,
00297 NonCollapsing
00298 } mode:3;
00299 enum IntegerTypes {
00300 UnsignedInt,
00301 Unsigned32,
00302 BooleanArray
00303 } integerType:3;
00304 bool excludeTCS:1;
00305 bool excludeOLC:1;
00306 bool excludeReqMode:1;
00307 };
00308
00309 const H245GenericInfo & GetH245Generic() const { return m_H245Generic; }
00310 void SetH245Generic(const H245GenericInfo & genericInfo) { m_H245Generic = genericInfo; }
00311 #endif // OPAL_H323
00312
00313 protected:
00314 PCaselessString m_name;
00315 bool m_readOnly;
00316 MergeType m_merge;
00317
00318 #if OPAL_SIP
00319 PCaselessString m_FMTPName;
00320 PString m_FMTPDefault;
00321 #endif // OPAL_SIP
00322
00323 #if OPAL_H323
00324 H245GenericInfo m_H245Generic;
00325 #endif // OPAL_H323
00326 };
00327
00328
00329 template <typename T>
00330 class OpalMediaOptionValue : public OpalMediaOption
00331 {
00332 PCLASSINFO(OpalMediaOptionValue, OpalMediaOption);
00333 public:
00334 OpalMediaOptionValue(
00335 const char * name,
00336 bool readOnly,
00337 MergeType merge = MinMerge,
00338 T value = 0,
00339 T minimum = std::numeric_limits<T>::min(),
00340 T maximum = std::numeric_limits<T>::max()
00341 ) : OpalMediaOption(name, readOnly, merge),
00342 m_value(value),
00343 m_minimum(minimum),
00344 m_maximum(maximum)
00345 { }
00346
00347 virtual PObject * Clone() const
00348 {
00349 return new OpalMediaOptionValue(*this);
00350 }
00351
00352 virtual void PrintOn(ostream & strm) const
00353 {
00354 strm << m_value;
00355 }
00356
00357 virtual void ReadFrom(istream & strm)
00358 {
00359 T temp;
00360 strm >> temp;
00361 if (temp >= m_minimum && temp <= m_maximum)
00362 m_value = temp;
00363 else
00364 strm.setstate(ios::badbit);
00365 }
00366
00367 virtual Comparison CompareValue(const OpalMediaOption & option) const
00368 {
00369 const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00370 if (otherOption == NULL)
00371 return GreaterThan;
00372 if (m_value < otherOption->m_value)
00373 return LessThan;
00374 if (m_value > otherOption->m_value)
00375 return GreaterThan;
00376 return EqualTo;
00377 }
00378
00379 virtual void Assign(
00380 const OpalMediaOption & option
00381 ) {
00382 const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00383 if (otherOption != NULL)
00384 m_value = otherOption->m_value;
00385 }
00386
00387 T GetValue() const
00388 {
00389 return m_value;
00390 }
00391
00392 void SetValue(T value)
00393 {
00394 if (value < m_minimum)
00395 m_value = m_minimum;
00396 else if (value > m_maximum)
00397 m_value = m_maximum;
00398 else
00399 m_value = value;
00400 }
00401
00402 void SetMinimum(T m)
00403 {
00404 m_minimum = m;
00405 }
00406
00407 void SetMaximum(T m)
00408 {
00409 m_maximum = m;
00410 }
00411
00412 protected:
00413 T m_value;
00414 T m_minimum;
00415 T m_maximum;
00416 };
00417
00418
00419 typedef OpalMediaOptionValue<bool> OpalMediaOptionBoolean;
00420 typedef OpalMediaOptionValue<int> OpalMediaOptionInteger;
00421 typedef OpalMediaOptionValue<unsigned> OpalMediaOptionUnsigned;
00422 typedef OpalMediaOptionValue<double> OpalMediaOptionReal;
00423
00424
00425 class OpalMediaOptionEnum : public OpalMediaOption
00426 {
00427 PCLASSINFO(OpalMediaOptionEnum, OpalMediaOption);
00428 public:
00429 OpalMediaOptionEnum(
00430 const char * name,
00431 bool readOnly
00432 );
00433 OpalMediaOptionEnum(
00434 const char * name,
00435 bool readOnly,
00436 const char * const * enumerations,
00437 PINDEX count,
00438 MergeType merge = EqualMerge,
00439 PINDEX value = 0
00440 );
00441
00442 virtual PObject * Clone() const;
00443 virtual void PrintOn(ostream & strm) const;
00444 virtual void ReadFrom(istream & strm);
00445
00446 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00447 virtual void Assign(const OpalMediaOption & option);
00448
00449 PINDEX GetValue() const { return m_value; }
00450 void SetValue(PINDEX value);
00451
00452 const PStringArray & GetEnumerations() const { return m_enumerations; }
00453 void SetEnumerations(const PStringArray & e)
00454 {
00455 m_enumerations = e;
00456 }
00457
00458 protected:
00459 PStringArray m_enumerations;
00460 PINDEX m_value;
00461 };
00462
00463
00464 class OpalMediaOptionString : public OpalMediaOption
00465 {
00466 PCLASSINFO(OpalMediaOptionString, OpalMediaOption);
00467 public:
00468 OpalMediaOptionString(
00469 const char * name,
00470 bool readOnly
00471 );
00472 OpalMediaOptionString(
00473 const char * name,
00474 bool readOnly,
00475 const PString & value
00476 );
00477
00478 virtual PObject * Clone() const;
00479 virtual void PrintOn(ostream & strm) const;
00480 virtual void ReadFrom(istream & strm);
00481
00482 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00483 virtual void Assign(const OpalMediaOption & option);
00484
00485 const PString & GetValue() const { return m_value; }
00486 void SetValue(const PString & value);
00487
00488 protected:
00489 PString m_value;
00490 };
00491
00492
00493 class OpalMediaOptionOctets : public OpalMediaOption
00494 {
00495 PCLASSINFO(OpalMediaOptionOctets, OpalMediaOption);
00496 public:
00497 OpalMediaOptionOctets(
00498 const char * name,
00499 bool readOnly,
00500 bool base64 = false
00501 );
00502 OpalMediaOptionOctets(
00503 const char * name,
00504 bool readOnly,
00505 bool base64,
00506 const PBYTEArray & value
00507 );
00508 OpalMediaOptionOctets(
00509 const char * name,
00510 bool readOnly,
00511 bool base64,
00512 const BYTE * data,
00513 PINDEX length
00514 );
00515
00516 virtual PObject * Clone() const;
00517 virtual void PrintOn(ostream & strm) const;
00518 virtual void ReadFrom(istream & strm);
00519
00520 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00521 virtual void Assign(const OpalMediaOption & option);
00522
00523 const PBYTEArray & GetValue() const { return m_value; }
00524 void SetValue(const PBYTEArray & value);
00525 void SetValue(const BYTE * data, PINDEX length);
00526
00527 void SetBase64(bool b)
00528 {
00529 m_base64 = b;
00530 }
00531
00532 protected:
00533 PBYTEArray m_value;
00534 bool m_base64;
00535 };
00536
00537
00539
00540 class OpalMediaFormatInternal : public PObject
00541 {
00542 PCLASSINFO(OpalMediaFormatInternal, PObject);
00543 public:
00544 OpalMediaFormatInternal(
00545 const char * fullName,
00546 const OpalMediaType & mediaType,
00547 RTP_DataFrame::PayloadTypes rtpPayloadType,
00548 const char * encodingName,
00549 PBoolean needsJitter,
00550 unsigned bandwidth,
00551 PINDEX frameSize,
00552 unsigned frameTime,
00553 unsigned clockRate,
00554 time_t timeStamp
00555 );
00556
00557 const PCaselessString & GetName() const { return formatName; }
00558
00559 virtual PObject * Clone() const;
00560 virtual void PrintOn(ostream & strm) const;
00561
00562 virtual bool IsValid() const;
00563 virtual bool IsTransportable() const;
00564
00565 virtual PStringToString GetOptions() const;
00566 virtual bool GetOptionValue(const PString & name, PString & value) const;
00567 virtual bool SetOptionValue(const PString & name, const PString & value);
00568 virtual bool GetOptionBoolean(const PString & name, bool dflt) const;
00569 virtual bool SetOptionBoolean(const PString & name, bool value);
00570 virtual int GetOptionInteger(const PString & name, int dflt) const;
00571 virtual bool SetOptionInteger(const PString & name, int value);
00572 virtual double GetOptionReal(const PString & name, double dflt) const;
00573 virtual bool SetOptionReal(const PString & name, double value);
00574 virtual PINDEX GetOptionEnum(const PString & name, PINDEX dflt) const;
00575 virtual bool SetOptionEnum(const PString & name, PINDEX value);
00576 virtual PString GetOptionString(const PString & name, const PString & dflt) const;
00577 virtual bool SetOptionString(const PString & name, const PString & value);
00578 virtual bool GetOptionOctets(const PString & name, PBYTEArray & octets) const;
00579 virtual bool SetOptionOctets(const PString & name, const PBYTEArray & octets);
00580 virtual bool SetOptionOctets(const PString & name, const BYTE * data, PINDEX length);
00581 virtual bool AddOption(OpalMediaOption * option, PBoolean overwrite = PFalse);
00582 virtual OpalMediaOption * FindOption(const PString & name) const;
00583
00584 virtual bool ToNormalisedOptions();
00585 virtual bool ToCustomisedOptions();
00586 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
00587 virtual bool IsValidForProtocol(const PString & protocol) const;
00588
00589 protected:
00590 PCaselessString formatName;
00591 RTP_DataFrame::PayloadTypes rtpPayloadType;
00592 PString rtpEncodingName;
00593 OpalMediaType mediaType;
00594 PMutex media_format_mutex;
00595 PSortedList<OpalMediaOption> options;
00596 time_t codecVersionTime;
00597 bool forceIsTransportable;
00598
00599 friend bool operator==(const char * other, const OpalMediaFormat & fmt);
00600 friend bool operator!=(const char * other, const OpalMediaFormat & fmt);
00601 friend bool operator==(const PString & other, const OpalMediaFormat & fmt);
00602 friend bool operator!=(const PString & other, const OpalMediaFormat & fmt);
00603
00604 friend class OpalMediaFormat;
00605 friend class OpalMediaFormatList;
00606 friend class OpalAudioFormatInternal;
00607 };
00608
00609
00611
00617 class OpalMediaFormat : public PContainer
00618 {
00619 PCONTAINERINFO(OpalMediaFormat, PContainer);
00620
00621 public:
00624 OpalMediaFormat(
00625 OpalMediaFormatInternal * info = NULL
00626 );
00627
00641 OpalMediaFormat(
00642 const char * fullName,
00643 const OpalMediaType & mediaType,
00644 RTP_DataFrame::PayloadTypes rtpPayloadType,
00645 const char * encodingName,
00646 PBoolean needsJitter,
00647 unsigned bandwidth,
00648 PINDEX frameSize,
00649 unsigned frameTime,
00650 unsigned clockRate,
00651 time_t timeStamp = 0
00652 );
00653
00663 OpalMediaFormat(
00664 RTP_DataFrame::PayloadTypes rtpPayloadType,
00665 unsigned clockRate,
00666 const char * rtpEncodingName = NULL,
00667 const char * protocol = NULL
00668 );
00669
00683 OpalMediaFormat(
00684 const char * wildcard
00685 );
00686
00700 OpalMediaFormat(
00701 const PString & wildcard
00702 );
00703
00707 OpalMediaFormat & operator=(
00708 RTP_DataFrame::PayloadTypes rtpPayloadType
00709 );
00710
00714 OpalMediaFormat & operator=(
00715 const char * wildcard
00716 );
00717
00721 OpalMediaFormat & operator=(
00722 const PString & wildcard
00723 );
00724
00727 virtual PObject * Clone() const;
00728
00731 virtual Comparison Compare(const PObject & obj) const;
00732
00737 virtual void PrintOn(ostream & strm) const;
00738
00741 virtual void ReadFrom(istream & strm);
00742
00747 bool ToNormalisedOptions();
00748
00752 bool ToCustomisedOptions();
00753
00764 bool Merge(
00765 const OpalMediaFormat & mediaFormat
00766 );
00767
00770 PString GetName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
00771
00776 PBoolean IsValid() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValid(); }
00777
00781 PBoolean IsTransportable() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsTransportable(); }
00782
00788 RTP_DataFrame::PayloadTypes GetPayloadType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? RTP_DataFrame::IllegalPayloadType : m_info->rtpPayloadType; }
00789 void SetPayloadType(RTP_DataFrame::PayloadTypes type) { PWaitAndSignal m(_mutex); MakeUnique(); if (m_info != NULL) m_info->rtpPayloadType = type; }
00790
00793 const char * GetEncodingName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->rtpEncodingName.GetPointer(); }
00794
00797 OpalMediaType GetMediaType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? OpalMediaType() : m_info->mediaType; }
00798
00802 bool NeedsJitterBuffer() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(NeedsJitterOption(), PFalse); }
00803 static const PString & NeedsJitterOption();
00804
00807 unsigned GetBandwidth() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxBitRateOption(), 0); }
00808 static const PString & MaxBitRateOption();
00809 static const PString & TargetBitRateOption();
00810
00815 PINDEX GetFrameSize() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxFrameSizeOption(), 0); }
00816 static const PString & MaxFrameSizeOption();
00817
00821 unsigned GetFrameTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(FrameTimeOption(), 0); }
00822 static const PString & FrameTimeOption();
00823
00826 unsigned GetTimeUnits() const { return GetClockRate()/1000; }
00827
00828 enum StandardClockRate {
00829 AudioClockRate = 8000,
00830 VideoClockRate = 90000
00831 };
00832
00835 unsigned GetClockRate() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(ClockRateOption(), 1000); }
00836 static const PString & ClockRateOption();
00837
00840 static const PString & ProtocolOption();
00841
00844 static const PString & MaxTxPacketSizeOption();
00845
00849 PStringToString GetOptions() const { PWaitAndSignal m(_mutex); return m_info == NULL ? PStringToString() : m_info->GetOptions(); }
00850
00853 PINDEX GetOptionCount() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->options.GetSize(); }
00854
00858 const OpalMediaOption & GetOption(
00859 PINDEX index
00860 ) const { PWaitAndSignal m(_mutex); return m_info->options[index]; }
00861
00866 bool GetOptionValue(
00867 const PString & name,
00868 PString & value
00869 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionValue(name, value); }
00870
00877 bool SetOptionValue(
00878 const PString & name,
00879 const PString & value
00880 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionValue(name, value); }
00881
00885 bool GetOptionBoolean(
00886 const PString & name,
00887 bool dflt = PFalse
00888 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(name, dflt); }
00889
00896 bool SetOptionBoolean(
00897 const PString & name,
00898 bool value
00899 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionBoolean(name, value); }
00900
00904 int GetOptionInteger(
00905 const PString & name,
00906 int dflt = 0
00907 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionInteger(name, dflt); }
00908
00916 bool SetOptionInteger(
00917 const PString & name,
00918 int value
00919 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionInteger(name, value); }
00920
00924 double GetOptionReal(
00925 const PString & name,
00926 double dflt = 0
00927 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionReal(name, dflt); }
00928
00935 bool SetOptionReal(
00936 const PString & name,
00937 double value
00938 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionReal(name, value); }
00939
00944 PINDEX GetOptionEnum(
00945 const PString & name,
00946 PINDEX dflt = 0
00947 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionEnum(name, dflt); }
00948
00955 bool SetOptionEnum(
00956 const PString & name,
00957 PINDEX value
00958 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionEnum(name, value); }
00959
00963 PString GetOptionString(
00964 const PString & name,
00965 const PString & dflt = PString::Empty()
00966 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionString(name, dflt); }
00967
00974 bool SetOptionString(
00975 const PString & name,
00976 const PString & value
00977 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionString(name, value); }
00978
00982 bool GetOptionOctets(
00983 const PString & name,
00984 PBYTEArray & octets
00985 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionOctets(name, octets); }
00986
00993 bool SetOptionOctets(
00994 const PString & name,
00995 const PBYTEArray & octets
00996 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, octets); }
00997 bool SetOptionOctets(
00998 const PString & name,
00999 const BYTE * data,
01000 PINDEX length
01001 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, data, length); }
01002
01005 static OpalMediaFormatList GetAllRegisteredMediaFormats();
01006 static void GetAllRegisteredMediaFormats(
01007 OpalMediaFormatList & copy
01008 );
01009
01013 static bool SetRegisteredMediaFormat(
01014 const OpalMediaFormat & mediaFormat
01015 );
01016
01020 bool AddOption(
01021 OpalMediaOption * option,
01022 PBoolean overwrite = PFalse
01023 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->AddOption(option, overwrite); }
01024
01028 bool HasOption(const PString & name) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->FindOption(name) != NULL; }
01029
01034 OpalMediaOption * FindOption(
01035 const PString & name
01036 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? NULL : m_info->FindOption(name); }
01037
01043 bool IsValidForProtocol(const PString & protocol) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValidForProtocol(protocol); }
01044
01045 time_t GetCodecVersionTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->codecVersionTime; }
01046
01047 ostream & PrintOptions(ostream & strm) const
01048 {
01049 PWaitAndSignal m(_mutex);
01050 if (m_info != NULL)
01051 strm << setw(-1) << *m_info;
01052 return strm;
01053 }
01054
01055 #if OPAL_VIDEO
01056
01058 void AdjustVideoArgs(
01059 PVideoDevice::OpenArgs & args
01060 ) const;
01061 #endif
01062
01063
01064 virtual PBoolean IsEmpty() const { PWaitAndSignal m(_mutex); return m_info == NULL || !m_info->IsValid(); }
01065 operator PString() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01066 operator const char *() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01067 bool operator==(const char * other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01068 bool operator!=(const char * other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName != other; }
01069 bool operator==(const PString & other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01070 bool operator!=(const PString & other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName != other; }
01071 bool operator==(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) == EqualTo; }
01072 bool operator!=(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) != EqualTo; }
01073 friend bool operator==(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01074 friend bool operator!=(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName != other; }
01075 friend bool operator==(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01076 friend bool operator!=(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName != other; }
01077
01078 #if OPAL_H323
01079 static const PString & MediaPacketizationOption();
01080 static const PString & MediaPacketizationsOption();
01081 #endif
01082
01083 private:
01084 PBoolean SetSize(PINDEX) { return PTrue; }
01085
01086 protected:
01087 PMutex _mutex;
01088 void Construct(OpalMediaFormatInternal * info);
01089 OpalMediaFormatInternal * m_info;
01090
01091 friend class OpalMediaFormatInternal;
01092 friend class OpalMediaFormatList;
01093 };
01094
01095
01096 class OpalAudioFormatInternal : public OpalMediaFormatInternal
01097 {
01098 public:
01099 OpalAudioFormatInternal(
01100 const char * fullName,
01101 RTP_DataFrame::PayloadTypes rtpPayloadType,
01102 const char * encodingName,
01103 PINDEX frameSize,
01104 unsigned frameTime,
01105 unsigned rxFrames,
01106 unsigned txFrames,
01107 unsigned maxFrames,
01108 unsigned clockRate,
01109 time_t timeStamp
01110 );
01111 virtual PObject * Clone() const;
01112 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01113 };
01114
01115 class OpalAudioFormat : public OpalMediaFormat
01116 {
01117 PCLASSINFO(OpalAudioFormat, OpalMediaFormat);
01118 public:
01119 OpalAudioFormat(
01120 const char * fullName,
01121 RTP_DataFrame::PayloadTypes rtpPayloadType,
01122 const char * encodingName,
01123 PINDEX frameSize,
01124 unsigned frameTime,
01125 unsigned rxFrames,
01126 unsigned txFrames,
01127 unsigned maxFrames = 256,
01128 unsigned clockRate = 8000,
01129 time_t timeStamp = 0
01130 );
01131
01132 static const PString & RxFramesPerPacketOption();
01133 static const PString & TxFramesPerPacketOption();
01134 static const PString & MaxFramesPerPacketOption();
01135 static const PString & ChannelsOption();
01136 };
01137
01138 #if OPAL_VIDEO
01139 class OpalVideoFormatInternal : public OpalMediaFormatInternal
01140 {
01141 public:
01142 OpalVideoFormatInternal(
01143 const char * fullName,
01144 RTP_DataFrame::PayloadTypes rtpPayloadType,
01145 const char * encodingName,
01146 unsigned maxFrameWidth,
01147 unsigned maxFrameHeight,
01148 unsigned maxFrameRate,
01149 unsigned maxBitRate,
01150 time_t timeStamp
01151 );
01152 virtual PObject * Clone() const;
01153 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01154 };
01155
01156
01157 class OpalVideoFormat : public OpalMediaFormat
01158 {
01159 PCLASSINFO(OpalVideoFormat, OpalMediaFormat);
01160 public:
01161 OpalVideoFormat(
01162 const char * fullName,
01163 RTP_DataFrame::PayloadTypes rtpPayloadType,
01164 const char * encodingName,
01165 unsigned maxFrameWidth,
01166 unsigned maxFrameHeight,
01167 unsigned maxFrameRate,
01168 unsigned maxBitRate,
01169 time_t timeStamp = 0
01170 );
01171
01172 static const PString & FrameWidthOption();
01173 static const PString & FrameHeightOption();
01174 static const PString & MinRxFrameWidthOption();
01175 static const PString & MinRxFrameHeightOption();
01176 static const PString & MaxRxFrameWidthOption();
01177 static const PString & MaxRxFrameHeightOption();
01178 static const PString & TemporalSpatialTradeOffOption();
01179 static const PString & TxKeyFramePeriodOption();
01180 static const PString & RateControlEnableOption();
01181 static const PString & RateControllerOption();
01182 static const PString & RateControllerBitRateScalerOption();
01183
01194 enum ContentRole {
01195 eNoRole,
01196 ePresentation,
01197 eMainRole,
01198 eSpeaker,
01199 eSignLanguage,
01200 eNumRoles
01201 };
01202 enum { ContentRoleMask = 15 };
01203 __inline static unsigned ContentRoleBit(ContentRole contentRole) { return contentRole != eNoRole ? (1<<(contentRole-1)) : 0; }
01204 static const PString & ContentRoleOption();
01205 static const PString & ContentRoleMaskOption();
01206 };
01207 #endif
01208
01209
01210
01211 #define OPAL_PCM16 "PCM-16"
01212 #define OPAL_PCM16_16KHZ "PCM-16-16kHz"
01213 #define OPAL_PCM16_32KHZ "PCM-16-32kHz"
01214 #define OPAL_PCM16_48KHZ "PCM-16-48kHz"
01215 #define OPAL_L16_MONO_8KHZ "Linear-16-Mono-8kHz"
01216 #define OPAL_L16_MONO_16KHZ "Linear-16-Mono-16kHz"
01217 #define OPAL_L16_MONO_32KHZ "Linear-16-Mono-32kHz"
01218 #define OPAL_L16_MONO_48KHZ "Linear-16-Mono-48kHz"
01219 #define OPAL_G711_ULAW_64K "G.711-uLaw-64k"
01220 #define OPAL_G711_ALAW_64K "G.711-ALaw-64k"
01221 #define OPAL_G722 "G.722"
01222 #define OPAL_G7221 "G.722.1"
01223 #define OPAL_G7222 "G.722.2"
01224 #define OPAL_G726_40K "G.726-40K"
01225 #define OPAL_G726_32K "G.726-32K"
01226 #define OPAL_G726_24K "G.726-24K"
01227 #define OPAL_G726_16K "G.726-16K"
01228 #define OPAL_G728 "G.728"
01229 #define OPAL_G729 "G.729"
01230 #define OPAL_G729A "G.729A"
01231 #define OPAL_G729B "G.729B"
01232 #define OPAL_G729AB "G.729A/B"
01233 #define OPAL_G7231 "G.723.1"
01234 #define OPAL_G7231_6k3 OPAL_G7231
01235 #define OPAL_G7231_5k3 "G.723.1(5.3k)"
01236 #define OPAL_G7231A_6k3 "G.723.1A(6.3k)"
01237 #define OPAL_G7231A_5k3 "G.723.1A(5.3k)"
01238 #define OPAL_GSM0610 "GSM-06.10"
01239 #define OPAL_GSMAMR "GSM-AMR"
01240 #define OPAL_iLBC "iLBC"
01241 #define OPAL_H261 "H.261"
01242 #define OPAL_H263 "H.263"
01243 #define OPAL_H264 "H.264"
01244 #define OPAL_MPEG4 "MPEG4"
01245 #define OPAL_RFC2833 "UserInput/RFC2833"
01246 #define OPAL_CISCONSE "NamedSignalEvent"
01247 #define OPAL_T38 "T.38"
01248
01249 extern const OpalAudioFormat & GetOpalPCM16();
01250 extern const OpalAudioFormat & GetOpalPCM16_16KHZ();
01251 extern const OpalAudioFormat & GetOpalPCM16_32KHZ();
01252 extern const OpalAudioFormat & GetOpalPCM16_48KHZ();
01253 extern const OpalAudioFormat & GetOpalL16_MONO_8KHZ();
01254 extern const OpalAudioFormat & GetOpalL16_MONO_16KHZ();
01255 extern const OpalAudioFormat & GetOpalL16_MONO_32KHZ();
01256 extern const OpalAudioFormat & GetOpalL16_MONO_48KHZ();
01257 extern const OpalAudioFormat & GetOpalL16_STEREO_48KHZ();
01258 extern const OpalAudioFormat & GetOpalG711_ULAW_64K();
01259 extern const OpalAudioFormat & GetOpalG711_ALAW_64K();
01260 extern const OpalAudioFormat & GetOpalG722();
01261 extern const OpalAudioFormat & GetOpalG7221();
01262 extern const OpalMediaFormat & GetOpalG7222();
01263 extern const OpalAudioFormat & GetOpalG726_40K();
01264 extern const OpalAudioFormat & GetOpalG726_32K();
01265 extern const OpalAudioFormat & GetOpalG726_24K();
01266 extern const OpalAudioFormat & GetOpalG726_16K();
01267 extern const OpalAudioFormat & GetOpalG728();
01268 extern const OpalAudioFormat & GetOpalG729();
01269 extern const OpalAudioFormat & GetOpalG729A();
01270 extern const OpalAudioFormat & GetOpalG729B();
01271 extern const OpalAudioFormat & GetOpalG729AB();
01272 extern const OpalAudioFormat & GetOpalG7231_6k3();
01273 extern const OpalAudioFormat & GetOpalG7231_5k3();
01274 extern const OpalAudioFormat & GetOpalG7231A_6k3();
01275 extern const OpalAudioFormat & GetOpalG7231A_5k3();
01276 extern const OpalAudioFormat & GetOpalGSM0610();
01277 extern const OpalMediaFormat & GetOpalGSMAMR();
01278 extern const OpalMediaFormat & GetOpaliLBC();
01279
01280 extern const OpalMediaFormat & GetOpalRFC2833();
01281
01282 #if OPAL_T38_CAPABILITY
01283 extern const OpalMediaFormat & GetOpalCiscoNSE();
01284 extern const OpalMediaFormat & GetOpalT38();
01285 #endif
01286
01287
01288 #define OpalPCM16 GetOpalPCM16()
01289 #define OpalPCM16_16KHZ GetOpalPCM16_16KHZ()
01290 #define OpalPCM16_32KHZ GetOpalPCM16_32KHZ()
01291 #define OpalPCM16_48KHZ GetOpalPCM16_48KHZ()
01292 #define OpalL16_MONO_8KHZ GetOpalL16_MONO_8KHZ()
01293 #define OpalL16_MONO_16KHZ GetOpalL16_MONO_16KHZ()
01294 #define OpalL16_MONO_32KHZ GetOpalL16_MONO_32KHZ()
01295 #define OpalL16_MONO_48KHZ GetOpalL16_MONO_48KHZ()
01296 #define OpalL16_STEREO_48KHZ GetOpalL16_STEREO_48KHZ()
01297 #define OpalG711_ULAW_64K GetOpalG711_ULAW_64K()
01298 #define OpalG711_ALAW_64K GetOpalG711_ALAW_64K()
01299 #define OpalG722 GetOpalG722()
01300 #define OpalG7221 GetOpalG7221()
01301 #define OpalG7222 GetOpalG7222()
01302 #define OpalG726_40K GetOpalG726_40K()
01303 #define OpalG726_32K GetOpalG726_32K()
01304 #define OpalG726_24K GetOpalG726_24K()
01305 #define OpalG726_16K GetOpalG726_16K()
01306 #define OpalG728 GetOpalG728()
01307 #define OpalG729 GetOpalG729()
01308 #define OpalG729A GetOpalG729A()
01309 #define OpalG729B GetOpalG729B()
01310 #define OpalG729AB GetOpalG729AB()
01311 #define OpalG7231_6k3 GetOpalG7231_6k3()
01312 #define OpalG7231_5k3 GetOpalG7231_5k3()
01313 #define OpalG7231A_6k3 GetOpalG7231A_6k3()
01314 #define OpalG7231A_5k3 GetOpalG7231A_5k3()
01315 #define OpalGSM0610 GetOpalGSM0610()
01316 #define OpalGSMAMR GetOpalGSMAMR()
01317 #define OpaliLBC GetOpaliLBC()
01318 #define OpalRFC2833 GetOpalRFC2833()
01319 #define OpalCiscoNSE GetOpalCiscoNSE()
01320 #define OpalT38 GetOpalT38()
01321
01322 #define OpalL16Mono8kHz OpalL16_MONO_8KHZ
01323 #define OpalL16Mono16kHz OpalL16_MONO_16KHZ
01324 #define OpalG711uLaw OpalG711_ULAW_64K
01325 #define OpalG711ALaw OpalG711_ALAW_64K
01326
01327 #define OPAL_T140 "T.140"
01328 #define OpalT140 GetOpalT140()
01329 extern const OpalMediaFormat & GetOpalT140();
01330
01331 #if OPAL_HAS_MSRP
01332 #define OPAL_MSRP "MSRP"
01333 #define OpalMSRP GetOpalMSRP()
01334 extern const OpalMediaFormat & GetOpalMSRP();
01335 #endif
01336
01337 #if OPAL_HAS_SIPIM
01338 #define OPAL_SIPIM "SIP-IM"
01339 #define OpalSIPIM GetOpalSIPIM()
01340 extern const OpalMediaFormat & GetOpalSIPIM();
01341 #endif
01342
01343 #ifdef _MSC_VER
01344 #if _MSC_VER < 1300
01345 #pragma warning(default:4663)
01346 #endif
01347 #endif
01348
01349 #endif // OPAL_OPAL_MEDIAFMT_H
01350
01351
01352