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
00049 #include <rtp/rtp.h>
00050
00051 #include <limits>
00052
00053 #ifdef min
00054 #undef min
00055 #endif
00056 #ifdef max
00057 #undef max
00058 #endif
00059
00060 class OpalMediaFormat;
00061
00062
00064
00065 PLIST(OpalMediaFormatBaseList, OpalMediaFormat);
00066
00069 class OpalMediaFormatList : public OpalMediaFormatBaseList
00070 {
00071 PCLASSINFO(OpalMediaFormatList, OpalMediaFormatBaseList);
00072 public:
00077 OpalMediaFormatList();
00078
00081 OpalMediaFormatList(
00082 const OpalMediaFormat & format
00083 );
00084
00087 OpalMediaFormatList(const OpalMediaFormatList & l) : OpalMediaFormatBaseList(l) { }
00089
00095 OpalMediaFormatList & operator+=(
00096 const OpalMediaFormat & format
00097 );
00098
00102 OpalMediaFormatList & operator+=(
00103 const OpalMediaFormatList & formats
00104 );
00105
00109 OpalMediaFormatList & operator-=(
00110 const OpalMediaFormat & format
00111 );
00112
00116 OpalMediaFormatList & operator-=(
00117 const OpalMediaFormatList & formats
00118 );
00119
00124 const_iterator FindFormat(
00125 RTP_DataFrame::PayloadTypes rtpPayloadType,
00126 const unsigned clockRate,
00127 const char * rtpEncodingName = NULL,
00128 const char * protocol = NULL
00129 ) const;
00130
00147 const_iterator FindFormat(
00148 const PString & wildcard,
00149 const_iterator start = const_iterator()
00150 ) const;
00151
00154 PBoolean HasFormat(
00155 RTP_DataFrame::PayloadTypes rtpPayloadType
00156 ) const { return FindFormat(rtpPayloadType) != end(); }
00157
00163 PBoolean HasFormat(
00164 const PString & wildcard
00165 ) const { return FindFormat(wildcard) != end(); }
00166
00185 void Remove(
00186 const PStringArray & mask
00187 );
00188
00204 void Reorder(
00205 const PStringArray & order
00206 );
00207
00210 bool HasType(
00211 const OpalMediaType & type,
00212 bool mustBeTransportable = true
00213 ) const;
00215
00216 private:
00217 virtual PINDEX Append(PObject *) { return P_MAX_INDEX; }
00218 virtual PINDEX Insert(const PObject &, PObject *) { return P_MAX_INDEX; }
00219 virtual PINDEX InsertAt(PINDEX, PObject *) { return P_MAX_INDEX; }
00220 virtual PBoolean SetAt(PINDEX, PObject *) { return PFalse; }
00221 };
00222
00223
00225
00228 class OpalMediaOption : public PObject
00229 {
00230 PCLASSINFO(OpalMediaOption, PObject);
00231 public:
00232 enum MergeType {
00233 NoMerge,
00234 MinMerge,
00235 MaxMerge,
00236 EqualMerge,
00237 NotEqualMerge,
00238 AlwaysMerge,
00239
00240
00241 AndMerge = MinMerge,
00242 OrMerge = MaxMerge
00243 };
00244
00245 protected:
00246 OpalMediaOption(
00247 const PString & name
00248 );
00249 OpalMediaOption(
00250 const char * name,
00251 bool readOnly,
00252 MergeType merge
00253 );
00254
00255 public:
00256 virtual Comparison Compare(const PObject & obj) const;
00257
00258 virtual bool Merge(
00259 const OpalMediaOption & option
00260 );
00261 virtual Comparison CompareValue(
00262 const OpalMediaOption & option
00263 ) const = 0;
00264 virtual void Assign(
00265 const OpalMediaOption & option
00266 ) = 0;
00267
00268 PString AsString() const;
00269 bool FromString(const PString & value);
00270
00271 const PString & GetName() const { return m_name; }
00272
00273 bool IsReadOnly() const { return m_readOnly; }
00274 void SetReadOnly(bool readOnly) { m_readOnly = readOnly; }
00275
00276 MergeType GetMerge() const { return m_merge; }
00277 void SetMerge(MergeType merge) { m_merge = merge; }
00278
00279 #if OPAL_SIP
00280 const PString & GetFMTPName() const { return m_FMTPName; }
00281 void SetFMTPName(const char * name) { m_FMTPName = name; }
00282
00283 const PString & GetFMTPDefault() const { return m_FMTPDefault; }
00284 void SetFMTPDefault(const char * value) { m_FMTPDefault = value; }
00285 #endif // OPAL_SIP
00286
00287 #if OPAL_H323
00288 struct H245GenericInfo {
00289 H245GenericInfo() { memset(this, 0, sizeof(*this)); }
00290 unsigned ordinal:16;
00291 enum Modes {
00292 None,
00293 Collapsing,
00294 NonCollapsing
00295 } mode:3;
00296 enum IntegerTypes {
00297 UnsignedInt,
00298 Unsigned32,
00299 BooleanArray
00300 } integerType:3;
00301 bool excludeTCS:1;
00302 bool excludeOLC:1;
00303 bool excludeReqMode:1;
00304 };
00305
00306 const H245GenericInfo & GetH245Generic() const { return m_H245Generic; }
00307 void SetH245Generic(const H245GenericInfo & genericInfo) { m_H245Generic = genericInfo; }
00308 #endif // OPAL_H323
00309
00310 protected:
00311 PCaselessString m_name;
00312 bool m_readOnly;
00313 MergeType m_merge;
00314
00315 #if OPAL_SIP
00316 PCaselessString m_FMTPName;
00317 PString m_FMTPDefault;
00318 #endif // OPAL_SIP
00319
00320 #if OPAL_H323
00321 H245GenericInfo m_H245Generic;
00322 #endif // OPAL_H323
00323 };
00324
00325
00326 template <typename T>
00327 class OpalMediaOptionValue : public OpalMediaOption
00328 {
00329 PCLASSINFO(OpalMediaOptionValue, OpalMediaOption);
00330 public:
00331 OpalMediaOptionValue(
00332 const char * name,
00333 bool readOnly,
00334 MergeType merge = MinMerge,
00335 T value = 0,
00336 T minimum = std::numeric_limits<T>::min(),
00337 T maximum = std::numeric_limits<T>::max()
00338 ) : OpalMediaOption(name, readOnly, merge),
00339 m_value(value),
00340 m_minimum(minimum),
00341 m_maximum(maximum)
00342 { }
00343
00344 virtual PObject * Clone() const
00345 {
00346 return new OpalMediaOptionValue(*this);
00347 }
00348
00349 virtual void PrintOn(ostream & strm) const
00350 {
00351 strm << m_value;
00352 }
00353
00354 virtual void ReadFrom(istream & strm)
00355 {
00356 T temp;
00357 strm >> temp;
00358 if (temp >= m_minimum && temp <= m_maximum)
00359 m_value = temp;
00360 else
00361 strm.setstate(ios::badbit);
00362 }
00363
00364 virtual Comparison CompareValue(const OpalMediaOption & option) const
00365 {
00366 const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00367 if (otherOption == NULL)
00368 return GreaterThan;
00369 if (m_value < otherOption->m_value)
00370 return LessThan;
00371 if (m_value > otherOption->m_value)
00372 return GreaterThan;
00373 return EqualTo;
00374 }
00375
00376 virtual void Assign(
00377 const OpalMediaOption & option
00378 ) {
00379 const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00380 if (otherOption != NULL)
00381 m_value = otherOption->m_value;
00382 }
00383
00384 T GetValue() const
00385 {
00386 return m_value;
00387 }
00388
00389 void SetValue(T value)
00390 {
00391 if (value < m_minimum)
00392 m_value = m_minimum;
00393 else if (value > m_maximum)
00394 m_value = m_maximum;
00395 else
00396 m_value = value;
00397 }
00398
00399 void SetMinimum(T m)
00400 {
00401 m_minimum = m;
00402 }
00403
00404 void SetMaximum(T m)
00405 {
00406 m_maximum = m;
00407 }
00408
00409 protected:
00410 T m_value;
00411 T m_minimum;
00412 T m_maximum;
00413 };
00414
00415
00416 typedef OpalMediaOptionValue<bool> OpalMediaOptionBoolean;
00417 typedef OpalMediaOptionValue<int> OpalMediaOptionInteger;
00418 typedef OpalMediaOptionValue<unsigned> OpalMediaOptionUnsigned;
00419 typedef OpalMediaOptionValue<double> OpalMediaOptionReal;
00420
00421
00422 class OpalMediaOptionEnum : public OpalMediaOption
00423 {
00424 PCLASSINFO(OpalMediaOptionEnum, OpalMediaOption);
00425 public:
00426 OpalMediaOptionEnum(
00427 const char * name,
00428 bool readOnly
00429 );
00430 OpalMediaOptionEnum(
00431 const char * name,
00432 bool readOnly,
00433 const char * const * enumerations,
00434 PINDEX count,
00435 MergeType merge = EqualMerge,
00436 PINDEX value = 0
00437 );
00438
00439 virtual PObject * Clone() const;
00440 virtual void PrintOn(ostream & strm) const;
00441 virtual void ReadFrom(istream & strm);
00442
00443 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00444 virtual void Assign(const OpalMediaOption & option);
00445
00446 PINDEX GetValue() const { return m_value; }
00447 void SetValue(PINDEX value);
00448
00449 void SetEnumerations(const PStringArray & e)
00450 {
00451 m_enumerations = e;
00452 }
00453
00454 protected:
00455 PStringArray m_enumerations;
00456 PINDEX m_value;
00457 };
00458
00459
00460 class OpalMediaOptionString : public OpalMediaOption
00461 {
00462 PCLASSINFO(OpalMediaOptionString, OpalMediaOption);
00463 public:
00464 OpalMediaOptionString(
00465 const char * name,
00466 bool readOnly
00467 );
00468 OpalMediaOptionString(
00469 const char * name,
00470 bool readOnly,
00471 const PString & value
00472 );
00473
00474 virtual PObject * Clone() const;
00475 virtual void PrintOn(ostream & strm) const;
00476 virtual void ReadFrom(istream & strm);
00477
00478 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00479 virtual void Assign(const OpalMediaOption & option);
00480
00481 const PString & GetValue() const { return m_value; }
00482 void SetValue(const PString & value);
00483
00484 protected:
00485 PString m_value;
00486 };
00487
00488
00489 class OpalMediaOptionOctets : public OpalMediaOption
00490 {
00491 PCLASSINFO(OpalMediaOptionOctets, OpalMediaOption);
00492 public:
00493 OpalMediaOptionOctets(
00494 const char * name,
00495 bool readOnly,
00496 bool base64 = false
00497 );
00498 OpalMediaOptionOctets(
00499 const char * name,
00500 bool readOnly,
00501 bool base64,
00502 const PBYTEArray & value
00503 );
00504 OpalMediaOptionOctets(
00505 const char * name,
00506 bool readOnly,
00507 bool base64,
00508 const BYTE * data,
00509 PINDEX length
00510 );
00511
00512 virtual PObject * Clone() const;
00513 virtual void PrintOn(ostream & strm) const;
00514 virtual void ReadFrom(istream & strm);
00515
00516 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00517 virtual void Assign(const OpalMediaOption & option);
00518
00519 const PBYTEArray & GetValue() const { return m_value; }
00520 void SetValue(const PBYTEArray & value);
00521 void SetValue(const BYTE * data, PINDEX length);
00522
00523 void SetBase64(bool b)
00524 {
00525 m_base64 = b;
00526 }
00527
00528 protected:
00529 PBYTEArray m_value;
00530 bool m_base64;
00531 };
00532
00533
00535
00536 class OpalMediaFormatInternal : public PObject
00537 {
00538 PCLASSINFO(OpalMediaFormatInternal, PObject);
00539 public:
00540 OpalMediaFormatInternal(
00541 const char * fullName,
00542 const OpalMediaType & mediaType,
00543 RTP_DataFrame::PayloadTypes rtpPayloadType,
00544 const char * encodingName,
00545 PBoolean needsJitter,
00546 unsigned bandwidth,
00547 PINDEX frameSize,
00548 unsigned frameTime,
00549 unsigned clockRate,
00550 time_t timeStamp
00551 );
00552
00553 virtual PObject * Clone() const;
00554 virtual void PrintOn(ostream & strm) const;
00555
00556 virtual bool IsValid() const;
00557 virtual bool IsTransportable() const;
00558
00559 virtual PStringToString GetOptions() const;
00560 virtual bool GetOptionValue(const PString & name, PString & value) const;
00561 virtual bool SetOptionValue(const PString & name, const PString & value);
00562 virtual bool GetOptionBoolean(const PString & name, bool dflt) const;
00563 virtual bool SetOptionBoolean(const PString & name, bool value);
00564 virtual int GetOptionInteger(const PString & name, int dflt) const;
00565 virtual bool SetOptionInteger(const PString & name, int value);
00566 virtual double GetOptionReal(const PString & name, double dflt) const;
00567 virtual bool SetOptionReal(const PString & name, double value);
00568 virtual PINDEX GetOptionEnum(const PString & name, PINDEX dflt) const;
00569 virtual bool SetOptionEnum(const PString & name, PINDEX value);
00570 virtual PString GetOptionString(const PString & name, const PString & dflt) const;
00571 virtual bool SetOptionString(const PString & name, const PString & value);
00572 virtual bool GetOptionOctets(const PString & name, PBYTEArray & octets) const;
00573 virtual bool SetOptionOctets(const PString & name, const PBYTEArray & octets);
00574 virtual bool SetOptionOctets(const PString & name, const BYTE * data, PINDEX length);
00575 virtual bool AddOption(OpalMediaOption * option, PBoolean overwrite = PFalse);
00576 virtual OpalMediaOption * FindOption(const PString & name) const;
00577
00578 virtual bool ToNormalisedOptions();
00579 virtual bool ToCustomisedOptions();
00580 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
00581 virtual bool IsValidForProtocol(const PString & protocol) const;
00582
00583 protected:
00584 PCaselessString formatName;
00585 RTP_DataFrame::PayloadTypes rtpPayloadType;
00586 PString rtpEncodingName;
00587 OpalMediaType mediaType;
00588 PMutex media_format_mutex;
00589 PSortedList<OpalMediaOption> options;
00590 time_t codecVersionTime;
00591 bool forceIsTransportable;
00592
00593 friend bool operator==(const char * other, const OpalMediaFormat & fmt);
00594 friend bool operator!=(const char * other, const OpalMediaFormat & fmt);
00595 friend bool operator==(const PString & other, const OpalMediaFormat & fmt);
00596 friend bool operator!=(const PString & other, const OpalMediaFormat & fmt);
00597
00598 friend class OpalMediaFormat;
00599 friend class OpalMediaFormatList;
00600 friend class OpalAudioFormatInternal;
00601 };
00602
00603
00605
00611 class OpalMediaFormat : public PContainer
00612 {
00613 PCONTAINERINFO(OpalMediaFormat, PContainer);
00614
00615 public:
00618 OpalMediaFormat(
00619 OpalMediaFormatInternal * info = NULL
00620 );
00621
00635 OpalMediaFormat(
00636 const char * fullName,
00637 const OpalMediaType & mediaType,
00638 RTP_DataFrame::PayloadTypes rtpPayloadType,
00639 const char * encodingName,
00640 PBoolean needsJitter,
00641 unsigned bandwidth,
00642 PINDEX frameSize,
00643 unsigned frameTime,
00644 unsigned clockRate,
00645 time_t timeStamp = 0
00646 );
00647
00657 OpalMediaFormat(
00658 RTP_DataFrame::PayloadTypes rtpPayloadType,
00659 unsigned clockRate,
00660 const char * rtpEncodingName = NULL,
00661 const char * protocol = NULL
00662 );
00663
00677 OpalMediaFormat(
00678 const char * wildcard
00679 );
00680
00694 OpalMediaFormat(
00695 const PString & wildcard
00696 );
00697
00701 OpalMediaFormat & operator=(
00702 RTP_DataFrame::PayloadTypes rtpPayloadType
00703 );
00704
00708 OpalMediaFormat & operator=(
00709 const char * wildcard
00710 );
00711
00715 OpalMediaFormat & operator=(
00716 const PString & wildcard
00717 );
00718
00721 virtual PObject * Clone() const;
00722
00725 virtual Comparison Compare(const PObject & obj) const;
00726
00731 virtual void PrintOn(ostream & strm) const;
00732
00735 virtual void ReadFrom(istream & strm);
00736
00741 bool ToNormalisedOptions();
00742
00746 bool ToCustomisedOptions();
00747
00758 bool Merge(
00759 const OpalMediaFormat & mediaFormat
00760 );
00761
00764 PString GetName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
00765
00770 PBoolean IsValid() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValid(); }
00771
00775 PBoolean IsTransportable() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsTransportable(); }
00776
00782 RTP_DataFrame::PayloadTypes GetPayloadType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? RTP_DataFrame::IllegalPayloadType : m_info->rtpPayloadType; }
00783 void SetPayloadType(RTP_DataFrame::PayloadTypes type) { PWaitAndSignal m(_mutex); MakeUnique(); if (m_info != NULL) m_info->rtpPayloadType = type; }
00784
00787 const char * GetEncodingName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->rtpEncodingName.GetPointer(); }
00788
00791 OpalMediaType GetMediaType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? OpalMediaType() : m_info->mediaType; }
00792
00796 bool NeedsJitterBuffer() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(NeedsJitterOption(), PFalse); }
00797 static const PString & NeedsJitterOption();
00798
00801 unsigned GetBandwidth() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxBitRateOption(), 0); }
00802 static const PString & MaxBitRateOption();
00803 static const PString & TargetBitRateOption();
00804
00809 PINDEX GetFrameSize() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxFrameSizeOption(), 0); }
00810 static const PString & MaxFrameSizeOption();
00811
00815 unsigned GetFrameTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(FrameTimeOption(), 0); }
00816 static const PString & FrameTimeOption();
00817
00820 unsigned GetTimeUnits() const { return GetClockRate()/1000; }
00821
00822 enum StandardClockRate {
00823 AudioClockRate = 8000,
00824 VideoClockRate = 90000
00825 };
00826
00829 unsigned GetClockRate() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(ClockRateOption(), 1000); }
00830 static const PString & ClockRateOption();
00831
00834 static const PString & ProtocolOption();
00835
00838 static const PString & MaxTxPacketSizeOption();
00839
00843 PStringToString GetOptions() const { PWaitAndSignal m(_mutex); return m_info == NULL ? PStringToString() : m_info->GetOptions(); }
00844
00847 PINDEX GetOptionCount() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->options.GetSize(); }
00848
00852 const OpalMediaOption & GetOption(
00853 PINDEX index
00854 ) const { PWaitAndSignal m(_mutex); return m_info->options[index]; }
00855
00860 bool GetOptionValue(
00861 const PString & name,
00862 PString & value
00863 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionValue(name, value); }
00864
00871 bool SetOptionValue(
00872 const PString & name,
00873 const PString & value
00874 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionValue(name, value); }
00875
00879 bool GetOptionBoolean(
00880 const PString & name,
00881 bool dflt = PFalse
00882 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(name, dflt); }
00883
00890 bool SetOptionBoolean(
00891 const PString & name,
00892 bool value
00893 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionBoolean(name, value); }
00894
00898 int GetOptionInteger(
00899 const PString & name,
00900 int dflt = 0
00901 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionInteger(name, dflt); }
00902
00910 bool SetOptionInteger(
00911 const PString & name,
00912 int value
00913 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionInteger(name, value); }
00914
00918 double GetOptionReal(
00919 const PString & name,
00920 double dflt = 0
00921 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionReal(name, dflt); }
00922
00929 bool SetOptionReal(
00930 const PString & name,
00931 double value
00932 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionReal(name, value); }
00933
00938 PINDEX GetOptionEnum(
00939 const PString & name,
00940 PINDEX dflt = 0
00941 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionEnum(name, dflt); }
00942
00949 bool SetOptionEnum(
00950 const PString & name,
00951 PINDEX value
00952 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionEnum(name, value); }
00953
00957 PString GetOptionString(
00958 const PString & name,
00959 const PString & dflt = PString::Empty()
00960 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionString(name, dflt); }
00961
00968 bool SetOptionString(
00969 const PString & name,
00970 const PString & value
00971 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionString(name, value); }
00972
00976 bool GetOptionOctets(
00977 const PString & name,
00978 PBYTEArray & octets
00979 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionOctets(name, octets); }
00980
00987 bool SetOptionOctets(
00988 const PString & name,
00989 const PBYTEArray & octets
00990 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, octets); }
00991 bool SetOptionOctets(
00992 const PString & name,
00993 const BYTE * data,
00994 PINDEX length
00995 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, data, length); }
00996
00999 static OpalMediaFormatList GetAllRegisteredMediaFormats();
01000 static void GetAllRegisteredMediaFormats(
01001 OpalMediaFormatList & copy
01002 );
01003
01007 static bool SetRegisteredMediaFormat(
01008 const OpalMediaFormat & mediaFormat
01009 );
01010
01014 bool AddOption(
01015 OpalMediaOption * option,
01016 PBoolean overwrite = PFalse
01017 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->AddOption(option, overwrite); }
01018
01022 bool HasOption(const PString & name) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->FindOption(name) != NULL; }
01023
01028 OpalMediaOption * FindOption(
01029 const PString & name
01030 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? NULL : m_info->FindOption(name); }
01031
01037 bool IsValidForProtocol(const PString & protocol) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValidForProtocol(protocol); }
01038
01039 time_t GetCodecVersionTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->codecVersionTime; }
01040
01041 ostream & PrintOptions(ostream & strm) const
01042 {
01043 PWaitAndSignal m(_mutex);
01044 if (m_info != NULL)
01045 strm << setw(-1) << *m_info;
01046 return strm;
01047 }
01048
01049
01050 virtual PBoolean IsEmpty() const { PWaitAndSignal m(_mutex); return m_info == NULL || !m_info->IsValid(); }
01051 operator PString() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01052 operator const char *() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01053 bool operator==(const char * other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01054 bool operator!=(const char * other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName != other; }
01055 bool operator==(const PString & other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01056 bool operator!=(const PString & other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName != other; }
01057 bool operator==(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) == EqualTo; }
01058 bool operator!=(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) != EqualTo; }
01059 friend bool operator==(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01060 friend bool operator!=(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName != other; }
01061 friend bool operator==(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01062 friend bool operator!=(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName != other; }
01063
01064 #if OPAL_H323
01065 static const PString & MediaPacketizationOption();
01066 static const PString & MediaPacketizationsOption();
01067 #endif
01068
01069 private:
01070 PBoolean SetSize(PINDEX) { return PTrue; }
01071
01072 protected:
01073 PMutex _mutex;
01074 void Construct(OpalMediaFormatInternal * info);
01075 OpalMediaFormatInternal * m_info;
01076
01077 friend class OpalMediaFormatInternal;
01078 friend class OpalMediaFormatList;
01079 };
01080
01081
01082 class OpalAudioFormatInternal : public OpalMediaFormatInternal
01083 {
01084 public:
01085 OpalAudioFormatInternal(
01086 const char * fullName,
01087 RTP_DataFrame::PayloadTypes rtpPayloadType,
01088 const char * encodingName,
01089 PINDEX frameSize,
01090 unsigned frameTime,
01091 unsigned rxFrames,
01092 unsigned txFrames,
01093 unsigned maxFrames,
01094 unsigned clockRate,
01095 time_t timeStamp
01096 );
01097 virtual PObject * Clone() const;
01098 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01099 };
01100
01101 class OpalAudioFormat : public OpalMediaFormat
01102 {
01103 PCLASSINFO(OpalAudioFormat, OpalMediaFormat);
01104 public:
01105 OpalAudioFormat(
01106 const char * fullName,
01107 RTP_DataFrame::PayloadTypes rtpPayloadType,
01108 const char * encodingName,
01109 PINDEX frameSize,
01110 unsigned frameTime,
01111 unsigned rxFrames,
01112 unsigned txFrames,
01113 unsigned maxFrames = 256,
01114 unsigned clockRate = 8000,
01115 time_t timeStamp = 0
01116 );
01117
01118 static const PString & RxFramesPerPacketOption();
01119 static const PString & TxFramesPerPacketOption();
01120 static const PString & MaxFramesPerPacketOption();
01121 static const PString & ChannelsOption();
01122 };
01123
01124 #if OPAL_VIDEO
01125 class OpalVideoFormatInternal : public OpalMediaFormatInternal
01126 {
01127 public:
01128 OpalVideoFormatInternal(
01129 const char * fullName,
01130 RTP_DataFrame::PayloadTypes rtpPayloadType,
01131 const char * encodingName,
01132 unsigned maxFrameWidth,
01133 unsigned maxFrameHeight,
01134 unsigned maxFrameRate,
01135 unsigned maxBitRate,
01136 time_t timeStamp
01137 );
01138 virtual PObject * Clone() const;
01139 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01140 };
01141
01142
01143 class OpalVideoFormat : public OpalMediaFormat
01144 {
01145 PCLASSINFO(OpalVideoFormat, OpalMediaFormat);
01146 public:
01147 OpalVideoFormat(
01148 const char * fullName,
01149 RTP_DataFrame::PayloadTypes rtpPayloadType,
01150 const char * encodingName,
01151 unsigned maxFrameWidth,
01152 unsigned maxFrameHeight,
01153 unsigned maxFrameRate,
01154 unsigned maxBitRate,
01155 time_t timeStamp = 0
01156 );
01157
01158 static const PString & FrameWidthOption();
01159 static const PString & FrameHeightOption();
01160 static const PString & MinRxFrameWidthOption();
01161 static const PString & MinRxFrameHeightOption();
01162 static const PString & MaxRxFrameWidthOption();
01163 static const PString & MaxRxFrameHeightOption();
01164 static const PString & TemporalSpatialTradeOffOption();
01165 static const PString & TxKeyFramePeriodOption();
01166 static const PString & RateControlEnableOption();
01167 static const PString & RateControllerOption();
01168 static const PString & RateControllerBitRateScalerOption();
01169 };
01170 #endif
01171
01172
01173
01174 #define OPAL_PCM16 "PCM-16"
01175 #define OPAL_PCM16_16KHZ "PCM-16-16kHz"
01176 #define OPAL_PCM16_32KHZ "PCM-16-32kHz"
01177 #define OPAL_PCM16_48KHZ "PCM-16-48kHz"
01178 #define OPAL_L16_MONO_8KHZ "Linear-16-Mono-8kHz"
01179 #define OPAL_L16_MONO_16KHZ "Linear-16-Mono-16kHz"
01180 #define OPAL_L16_MONO_32KHZ "Linear-16-Mono-32kHz"
01181 #define OPAL_L16_MONO_48KHZ "Linear-16-Mono-48kHz"
01182 #define OPAL_G711_ULAW_64K "G.711-uLaw-64k"
01183 #define OPAL_G711_ALAW_64K "G.711-ALaw-64k"
01184 #define OPAL_G722 "G.722"
01185 #define OPAL_G7221 "G.722.1"
01186 #define OPAL_G7222 "G.722.2"
01187 #define OPAL_G726_40K "G.726-40K"
01188 #define OPAL_G726_32K "G.726-32K"
01189 #define OPAL_G726_24K "G.726-24K"
01190 #define OPAL_G726_16K "G.726-16K"
01191 #define OPAL_G728 "G.728"
01192 #define OPAL_G729 "G.729"
01193 #define OPAL_G729A "G.729A"
01194 #define OPAL_G729B "G.729B"
01195 #define OPAL_G729AB "G.729A/B"
01196 #define OPAL_G7231 "G.723.1"
01197 #define OPAL_G7231_6k3 OPAL_G7231
01198 #define OPAL_G7231_5k3 "G.723.1(5.3k)"
01199 #define OPAL_G7231A_6k3 "G.723.1A(6.3k)"
01200 #define OPAL_G7231A_5k3 "G.723.1A(5.3k)"
01201 #define OPAL_GSM0610 "GSM-06.10"
01202 #define OPAL_GSMAMR "GSM-AMR"
01203 #define OPAL_iLBC "iLBC"
01204 #define OPAL_H261 "H.261"
01205 #define OPAL_H263 "H.263"
01206 #define OPAL_H264 "H.264"
01207 #define OPAL_MPEG4 "MPEG4"
01208 #define OPAL_RFC2833 "UserInput/RFC2833"
01209 #define OPAL_CISCONSE "NamedSignalEvent"
01210 #define OPAL_T38 "T.38"
01211
01212 extern const OpalAudioFormat & GetOpalPCM16();
01213 extern const OpalAudioFormat & GetOpalPCM16_16KHZ();
01214 extern const OpalAudioFormat & GetOpalPCM16_32KHZ();
01215 extern const OpalAudioFormat & GetOpalPCM16_48KHZ();
01216 extern const OpalAudioFormat & GetOpalL16_MONO_8KHZ();
01217 extern const OpalAudioFormat & GetOpalL16_MONO_16KHZ();
01218 extern const OpalAudioFormat & GetOpalL16_MONO_32KHZ();
01219 extern const OpalAudioFormat & GetOpalL16_MONO_48KHZ();
01220 extern const OpalAudioFormat & GetOpalL16_STEREO_48KHZ();
01221 extern const OpalAudioFormat & GetOpalG711_ULAW_64K();
01222 extern const OpalAudioFormat & GetOpalG711_ALAW_64K();
01223 extern const OpalAudioFormat & GetOpalG722();
01224 extern const OpalAudioFormat & GetOpalG7221();
01225 extern const OpalMediaFormat & GetOpalG7222();
01226 extern const OpalAudioFormat & GetOpalG726_40K();
01227 extern const OpalAudioFormat & GetOpalG726_32K();
01228 extern const OpalAudioFormat & GetOpalG726_24K();
01229 extern const OpalAudioFormat & GetOpalG726_16K();
01230 extern const OpalAudioFormat & GetOpalG728();
01231 extern const OpalAudioFormat & GetOpalG729();
01232 extern const OpalAudioFormat & GetOpalG729A();
01233 extern const OpalAudioFormat & GetOpalG729B();
01234 extern const OpalAudioFormat & GetOpalG729AB();
01235 extern const OpalAudioFormat & GetOpalG7231_6k3();
01236 extern const OpalAudioFormat & GetOpalG7231_5k3();
01237 extern const OpalAudioFormat & GetOpalG7231A_6k3();
01238 extern const OpalAudioFormat & GetOpalG7231A_5k3();
01239 extern const OpalAudioFormat & GetOpalGSM0610();
01240 extern const OpalMediaFormat & GetOpalGSMAMR();
01241 extern const OpalMediaFormat & GetOpaliLBC();
01242
01243 extern const OpalMediaFormat & GetOpalRFC2833();
01244
01245 #if OPAL_T38_CAPABILITY
01246 extern const OpalMediaFormat & GetOpalCiscoNSE();
01247 extern const OpalMediaFormat & GetOpalT38();
01248 #endif
01249
01250
01251 #define OpalPCM16 GetOpalPCM16()
01252 #define OpalPCM16_16KHZ GetOpalPCM16_16KHZ()
01253 #define OpalPCM16_32KHZ GetOpalPCM16_32KHZ()
01254 #define OpalPCM16_48KHZ GetOpalPCM16_48KHZ()
01255 #define OpalL16_MONO_8KHZ GetOpalL16_MONO_8KHZ()
01256 #define OpalL16_MONO_16KHZ GetOpalL16_MONO_16KHZ()
01257 #define OpalL16_MONO_32KHZ GetOpalL16_MONO_32KHZ()
01258 #define OpalL16_MONO_48KHZ GetOpalL16_MONO_48KHZ()
01259 #define OpalL16_STEREO_48KHZ GetOpalL16_STEREO_48KHZ()
01260 #define OpalG711_ULAW_64K GetOpalG711_ULAW_64K()
01261 #define OpalG711_ALAW_64K GetOpalG711_ALAW_64K()
01262 #define OpalG722 GetOpalG722()
01263 #define OpalG7221 GetOpalG7221()
01264 #define OpalG7222 GetOpalG7222()
01265 #define OpalG726_40K GetOpalG726_40K()
01266 #define OpalG726_32K GetOpalG726_32K()
01267 #define OpalG726_24K GetOpalG726_24K()
01268 #define OpalG726_16K GetOpalG726_16K()
01269 #define OpalG728 GetOpalG728()
01270 #define OpalG729 GetOpalG729()
01271 #define OpalG729A GetOpalG729A()
01272 #define OpalG729B GetOpalG729B()
01273 #define OpalG729AB GetOpalG729AB()
01274 #define OpalG7231_6k3 GetOpalG7231_6k3()
01275 #define OpalG7231_5k3 GetOpalG7231_5k3()
01276 #define OpalG7231A_6k3 GetOpalG7231A_6k3()
01277 #define OpalG7231A_5k3 GetOpalG7231A_5k3()
01278 #define OpalGSM0610 GetOpalGSM0610()
01279 #define OpalGSMAMR GetOpalGSMAMR()
01280 #define OpaliLBC GetOpaliLBC()
01281 #define OpalRFC2833 GetOpalRFC2833()
01282 #define OpalCiscoNSE GetOpalCiscoNSE()
01283 #define OpalT38 GetOpalT38()
01284
01285 #define OpalL16Mono8kHz OpalL16_MONO_8KHZ
01286 #define OpalL16Mono16kHz OpalL16_MONO_16KHZ
01287 #define OpalG711uLaw OpalG711_ULAW_64K
01288 #define OpalG711ALaw OpalG711_ALAW_64K
01289
01290 #define OPAL_T140 "T.140"
01291 #define OpalT140 GetOpalT140()
01292 extern const OpalMediaFormat & GetOpalT140();
01293
01294 #if OPAL_HAS_MSRP
01295 #define OPAL_MSRP "MSRP"
01296 #define OpalMSRP GetOpalMSRP()
01297 extern const OpalMediaFormat & GetOpalMSRP();
01298 #endif
01299
01300 #if OPAL_HAS_SIPIM
01301 #define OPAL_SIPIM "SIP-IM"
01302 #define OpalSIPIM GetOpalSIPIM()
01303 extern const OpalMediaFormat & GetOpalSIPIM();
01304 #endif
01305
01306 #ifdef _MSC_VER
01307 #if _MSC_VER < 1300
01308 #pragma warning(default:4663)
01309 #endif
01310 #endif
01311
01312 #endif // OPAL_OPAL_MEDIAFMT_H
01313
01314
01315