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 const PStringArray & GetEnumerations() const { return m_enumerations; }
00450 void SetEnumerations(const PStringArray & e)
00451 {
00452 m_enumerations = e;
00453 }
00454
00455 protected:
00456 PStringArray m_enumerations;
00457 PINDEX m_value;
00458 };
00459
00460
00461 class OpalMediaOptionString : public OpalMediaOption
00462 {
00463 PCLASSINFO(OpalMediaOptionString, OpalMediaOption);
00464 public:
00465 OpalMediaOptionString(
00466 const char * name,
00467 bool readOnly
00468 );
00469 OpalMediaOptionString(
00470 const char * name,
00471 bool readOnly,
00472 const PString & value
00473 );
00474
00475 virtual PObject * Clone() const;
00476 virtual void PrintOn(ostream & strm) const;
00477 virtual void ReadFrom(istream & strm);
00478
00479 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00480 virtual void Assign(const OpalMediaOption & option);
00481
00482 const PString & GetValue() const { return m_value; }
00483 void SetValue(const PString & value);
00484
00485 protected:
00486 PString m_value;
00487 };
00488
00489
00490 class OpalMediaOptionOctets : public OpalMediaOption
00491 {
00492 PCLASSINFO(OpalMediaOptionOctets, OpalMediaOption);
00493 public:
00494 OpalMediaOptionOctets(
00495 const char * name,
00496 bool readOnly,
00497 bool base64 = false
00498 );
00499 OpalMediaOptionOctets(
00500 const char * name,
00501 bool readOnly,
00502 bool base64,
00503 const PBYTEArray & value
00504 );
00505 OpalMediaOptionOctets(
00506 const char * name,
00507 bool readOnly,
00508 bool base64,
00509 const BYTE * data,
00510 PINDEX length
00511 );
00512
00513 virtual PObject * Clone() const;
00514 virtual void PrintOn(ostream & strm) const;
00515 virtual void ReadFrom(istream & strm);
00516
00517 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00518 virtual void Assign(const OpalMediaOption & option);
00519
00520 const PBYTEArray & GetValue() const { return m_value; }
00521 void SetValue(const PBYTEArray & value);
00522 void SetValue(const BYTE * data, PINDEX length);
00523
00524 void SetBase64(bool b)
00525 {
00526 m_base64 = b;
00527 }
00528
00529 protected:
00530 PBYTEArray m_value;
00531 bool m_base64;
00532 };
00533
00534
00536
00537 class OpalMediaFormatInternal : public PObject
00538 {
00539 PCLASSINFO(OpalMediaFormatInternal, PObject);
00540 public:
00541 OpalMediaFormatInternal(
00542 const char * fullName,
00543 const OpalMediaType & mediaType,
00544 RTP_DataFrame::PayloadTypes rtpPayloadType,
00545 const char * encodingName,
00546 PBoolean needsJitter,
00547 unsigned bandwidth,
00548 PINDEX frameSize,
00549 unsigned frameTime,
00550 unsigned clockRate,
00551 time_t timeStamp
00552 );
00553
00554 virtual PObject * Clone() const;
00555 virtual void PrintOn(ostream & strm) const;
00556
00557 virtual bool IsValid() const;
00558 virtual bool IsTransportable() const;
00559
00560 virtual PStringToString GetOptions() const;
00561 virtual bool GetOptionValue(const PString & name, PString & value) const;
00562 virtual bool SetOptionValue(const PString & name, const PString & value);
00563 virtual bool GetOptionBoolean(const PString & name, bool dflt) const;
00564 virtual bool SetOptionBoolean(const PString & name, bool value);
00565 virtual int GetOptionInteger(const PString & name, int dflt) const;
00566 virtual bool SetOptionInteger(const PString & name, int value);
00567 virtual double GetOptionReal(const PString & name, double dflt) const;
00568 virtual bool SetOptionReal(const PString & name, double value);
00569 virtual PINDEX GetOptionEnum(const PString & name, PINDEX dflt) const;
00570 virtual bool SetOptionEnum(const PString & name, PINDEX value);
00571 virtual PString GetOptionString(const PString & name, const PString & dflt) const;
00572 virtual bool SetOptionString(const PString & name, const PString & value);
00573 virtual bool GetOptionOctets(const PString & name, PBYTEArray & octets) const;
00574 virtual bool SetOptionOctets(const PString & name, const PBYTEArray & octets);
00575 virtual bool SetOptionOctets(const PString & name, const BYTE * data, PINDEX length);
00576 virtual bool AddOption(OpalMediaOption * option, PBoolean overwrite = PFalse);
00577 virtual OpalMediaOption * FindOption(const PString & name) const;
00578
00579 virtual bool ToNormalisedOptions();
00580 virtual bool ToCustomisedOptions();
00581 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
00582 virtual bool IsValidForProtocol(const PString & protocol) const;
00583
00584 protected:
00585 PCaselessString formatName;
00586 RTP_DataFrame::PayloadTypes rtpPayloadType;
00587 PString rtpEncodingName;
00588 OpalMediaType mediaType;
00589 PMutex media_format_mutex;
00590 PSortedList<OpalMediaOption> options;
00591 time_t codecVersionTime;
00592 bool forceIsTransportable;
00593
00594 friend bool operator==(const char * other, const OpalMediaFormat & fmt);
00595 friend bool operator!=(const char * other, const OpalMediaFormat & fmt);
00596 friend bool operator==(const PString & other, const OpalMediaFormat & fmt);
00597 friend bool operator!=(const PString & other, const OpalMediaFormat & fmt);
00598
00599 friend class OpalMediaFormat;
00600 friend class OpalMediaFormatList;
00601 friend class OpalAudioFormatInternal;
00602 };
00603
00604
00606
00612 class OpalMediaFormat : public PContainer
00613 {
00614 PCONTAINERINFO(OpalMediaFormat, PContainer);
00615
00616 public:
00619 OpalMediaFormat(
00620 OpalMediaFormatInternal * info = NULL
00621 );
00622
00636 OpalMediaFormat(
00637 const char * fullName,
00638 const OpalMediaType & mediaType,
00639 RTP_DataFrame::PayloadTypes rtpPayloadType,
00640 const char * encodingName,
00641 PBoolean needsJitter,
00642 unsigned bandwidth,
00643 PINDEX frameSize,
00644 unsigned frameTime,
00645 unsigned clockRate,
00646 time_t timeStamp = 0
00647 );
00648
00658 OpalMediaFormat(
00659 RTP_DataFrame::PayloadTypes rtpPayloadType,
00660 unsigned clockRate,
00661 const char * rtpEncodingName = NULL,
00662 const char * protocol = NULL
00663 );
00664
00678 OpalMediaFormat(
00679 const char * wildcard
00680 );
00681
00695 OpalMediaFormat(
00696 const PString & wildcard
00697 );
00698
00702 OpalMediaFormat & operator=(
00703 RTP_DataFrame::PayloadTypes rtpPayloadType
00704 );
00705
00709 OpalMediaFormat & operator=(
00710 const char * wildcard
00711 );
00712
00716 OpalMediaFormat & operator=(
00717 const PString & wildcard
00718 );
00719
00722 virtual PObject * Clone() const;
00723
00726 virtual Comparison Compare(const PObject & obj) const;
00727
00732 virtual void PrintOn(ostream & strm) const;
00733
00736 virtual void ReadFrom(istream & strm);
00737
00742 bool ToNormalisedOptions();
00743
00747 bool ToCustomisedOptions();
00748
00759 bool Merge(
00760 const OpalMediaFormat & mediaFormat
00761 );
00762
00765 PString GetName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
00766
00771 PBoolean IsValid() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValid(); }
00772
00776 PBoolean IsTransportable() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsTransportable(); }
00777
00783 RTP_DataFrame::PayloadTypes GetPayloadType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? RTP_DataFrame::IllegalPayloadType : m_info->rtpPayloadType; }
00784 void SetPayloadType(RTP_DataFrame::PayloadTypes type) { PWaitAndSignal m(_mutex); MakeUnique(); if (m_info != NULL) m_info->rtpPayloadType = type; }
00785
00788 const char * GetEncodingName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->rtpEncodingName.GetPointer(); }
00789
00792 OpalMediaType GetMediaType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? OpalMediaType() : m_info->mediaType; }
00793
00797 bool NeedsJitterBuffer() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(NeedsJitterOption(), PFalse); }
00798 static const PString & NeedsJitterOption();
00799
00802 unsigned GetBandwidth() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxBitRateOption(), 0); }
00803 static const PString & MaxBitRateOption();
00804 static const PString & TargetBitRateOption();
00805
00810 PINDEX GetFrameSize() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxFrameSizeOption(), 0); }
00811 static const PString & MaxFrameSizeOption();
00812
00816 unsigned GetFrameTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(FrameTimeOption(), 0); }
00817 static const PString & FrameTimeOption();
00818
00821 unsigned GetTimeUnits() const { return GetClockRate()/1000; }
00822
00823 enum StandardClockRate {
00824 AudioClockRate = 8000,
00825 VideoClockRate = 90000
00826 };
00827
00830 unsigned GetClockRate() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(ClockRateOption(), 1000); }
00831 static const PString & ClockRateOption();
00832
00835 static const PString & ProtocolOption();
00836
00839 static const PString & MaxTxPacketSizeOption();
00840
00844 PStringToString GetOptions() const { PWaitAndSignal m(_mutex); return m_info == NULL ? PStringToString() : m_info->GetOptions(); }
00845
00848 PINDEX GetOptionCount() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->options.GetSize(); }
00849
00853 const OpalMediaOption & GetOption(
00854 PINDEX index
00855 ) const { PWaitAndSignal m(_mutex); return m_info->options[index]; }
00856
00861 bool GetOptionValue(
00862 const PString & name,
00863 PString & value
00864 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionValue(name, value); }
00865
00872 bool SetOptionValue(
00873 const PString & name,
00874 const PString & value
00875 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionValue(name, value); }
00876
00880 bool GetOptionBoolean(
00881 const PString & name,
00882 bool dflt = PFalse
00883 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(name, dflt); }
00884
00891 bool SetOptionBoolean(
00892 const PString & name,
00893 bool value
00894 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionBoolean(name, value); }
00895
00899 int GetOptionInteger(
00900 const PString & name,
00901 int dflt = 0
00902 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionInteger(name, dflt); }
00903
00911 bool SetOptionInteger(
00912 const PString & name,
00913 int value
00914 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionInteger(name, value); }
00915
00919 double GetOptionReal(
00920 const PString & name,
00921 double dflt = 0
00922 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionReal(name, dflt); }
00923
00930 bool SetOptionReal(
00931 const PString & name,
00932 double value
00933 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionReal(name, value); }
00934
00939 PINDEX GetOptionEnum(
00940 const PString & name,
00941 PINDEX dflt = 0
00942 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionEnum(name, dflt); }
00943
00950 bool SetOptionEnum(
00951 const PString & name,
00952 PINDEX value
00953 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionEnum(name, value); }
00954
00958 PString GetOptionString(
00959 const PString & name,
00960 const PString & dflt = PString::Empty()
00961 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionString(name, dflt); }
00962
00969 bool SetOptionString(
00970 const PString & name,
00971 const PString & value
00972 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionString(name, value); }
00973
00977 bool GetOptionOctets(
00978 const PString & name,
00979 PBYTEArray & octets
00980 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionOctets(name, octets); }
00981
00988 bool SetOptionOctets(
00989 const PString & name,
00990 const PBYTEArray & octets
00991 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, octets); }
00992 bool SetOptionOctets(
00993 const PString & name,
00994 const BYTE * data,
00995 PINDEX length
00996 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, data, length); }
00997
01000 static OpalMediaFormatList GetAllRegisteredMediaFormats();
01001 static void GetAllRegisteredMediaFormats(
01002 OpalMediaFormatList & copy
01003 );
01004
01008 static bool SetRegisteredMediaFormat(
01009 const OpalMediaFormat & mediaFormat
01010 );
01011
01015 bool AddOption(
01016 OpalMediaOption * option,
01017 PBoolean overwrite = PFalse
01018 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->AddOption(option, overwrite); }
01019
01023 bool HasOption(const PString & name) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->FindOption(name) != NULL; }
01024
01029 OpalMediaOption * FindOption(
01030 const PString & name
01031 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? NULL : m_info->FindOption(name); }
01032
01038 bool IsValidForProtocol(const PString & protocol) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValidForProtocol(protocol); }
01039
01040 time_t GetCodecVersionTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->codecVersionTime; }
01041
01042 ostream & PrintOptions(ostream & strm) const
01043 {
01044 PWaitAndSignal m(_mutex);
01045 if (m_info != NULL)
01046 strm << setw(-1) << *m_info;
01047 return strm;
01048 }
01049
01050
01051 virtual PBoolean IsEmpty() const { PWaitAndSignal m(_mutex); return m_info == NULL || !m_info->IsValid(); }
01052 operator PString() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01053 operator const char *() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01054 bool operator==(const char * other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01055 bool operator!=(const char * 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 PString & other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName != other; }
01058 bool operator==(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) == EqualTo; }
01059 bool operator!=(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) != EqualTo; }
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 char * 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 friend bool operator!=(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName != other; }
01064
01065 #if OPAL_H323
01066 static const PString & MediaPacketizationOption();
01067 static const PString & MediaPacketizationsOption();
01068 #endif
01069
01070 private:
01071 PBoolean SetSize(PINDEX) { return PTrue; }
01072
01073 protected:
01074 PMutex _mutex;
01075 void Construct(OpalMediaFormatInternal * info);
01076 OpalMediaFormatInternal * m_info;
01077
01078 friend class OpalMediaFormatInternal;
01079 friend class OpalMediaFormatList;
01080 };
01081
01082
01083 class OpalAudioFormatInternal : public OpalMediaFormatInternal
01084 {
01085 public:
01086 OpalAudioFormatInternal(
01087 const char * fullName,
01088 RTP_DataFrame::PayloadTypes rtpPayloadType,
01089 const char * encodingName,
01090 PINDEX frameSize,
01091 unsigned frameTime,
01092 unsigned rxFrames,
01093 unsigned txFrames,
01094 unsigned maxFrames,
01095 unsigned clockRate,
01096 time_t timeStamp
01097 );
01098 virtual PObject * Clone() const;
01099 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01100 };
01101
01102 class OpalAudioFormat : public OpalMediaFormat
01103 {
01104 PCLASSINFO(OpalAudioFormat, OpalMediaFormat);
01105 public:
01106 OpalAudioFormat(
01107 const char * fullName,
01108 RTP_DataFrame::PayloadTypes rtpPayloadType,
01109 const char * encodingName,
01110 PINDEX frameSize,
01111 unsigned frameTime,
01112 unsigned rxFrames,
01113 unsigned txFrames,
01114 unsigned maxFrames = 256,
01115 unsigned clockRate = 8000,
01116 time_t timeStamp = 0
01117 );
01118
01119 static const PString & RxFramesPerPacketOption();
01120 static const PString & TxFramesPerPacketOption();
01121 static const PString & MaxFramesPerPacketOption();
01122 static const PString & ChannelsOption();
01123 };
01124
01125 #if OPAL_VIDEO
01126 class OpalVideoFormatInternal : public OpalMediaFormatInternal
01127 {
01128 public:
01129 OpalVideoFormatInternal(
01130 const char * fullName,
01131 RTP_DataFrame::PayloadTypes rtpPayloadType,
01132 const char * encodingName,
01133 unsigned maxFrameWidth,
01134 unsigned maxFrameHeight,
01135 unsigned maxFrameRate,
01136 unsigned maxBitRate,
01137 time_t timeStamp
01138 );
01139 virtual PObject * Clone() const;
01140 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01141 };
01142
01143
01144 class OpalVideoFormat : public OpalMediaFormat
01145 {
01146 PCLASSINFO(OpalVideoFormat, OpalMediaFormat);
01147 public:
01148 OpalVideoFormat(
01149 const char * fullName,
01150 RTP_DataFrame::PayloadTypes rtpPayloadType,
01151 const char * encodingName,
01152 unsigned maxFrameWidth,
01153 unsigned maxFrameHeight,
01154 unsigned maxFrameRate,
01155 unsigned maxBitRate,
01156 time_t timeStamp = 0
01157 );
01158
01159 static const PString & FrameWidthOption();
01160 static const PString & FrameHeightOption();
01161 static const PString & MinRxFrameWidthOption();
01162 static const PString & MinRxFrameHeightOption();
01163 static const PString & MaxRxFrameWidthOption();
01164 static const PString & MaxRxFrameHeightOption();
01165 static const PString & TemporalSpatialTradeOffOption();
01166 static const PString & TxKeyFramePeriodOption();
01167 static const PString & RateControlEnableOption();
01168 static const PString & RateControllerOption();
01169 static const PString & RateControllerBitRateScalerOption();
01170 };
01171 #endif
01172
01173
01174
01175 #define OPAL_PCM16 "PCM-16"
01176 #define OPAL_PCM16_16KHZ "PCM-16-16kHz"
01177 #define OPAL_PCM16_32KHZ "PCM-16-32kHz"
01178 #define OPAL_PCM16_48KHZ "PCM-16-48kHz"
01179 #define OPAL_L16_MONO_8KHZ "Linear-16-Mono-8kHz"
01180 #define OPAL_L16_MONO_16KHZ "Linear-16-Mono-16kHz"
01181 #define OPAL_L16_MONO_32KHZ "Linear-16-Mono-32kHz"
01182 #define OPAL_L16_MONO_48KHZ "Linear-16-Mono-48kHz"
01183 #define OPAL_G711_ULAW_64K "G.711-uLaw-64k"
01184 #define OPAL_G711_ALAW_64K "G.711-ALaw-64k"
01185 #define OPAL_G722 "G.722"
01186 #define OPAL_G7221 "G.722.1"
01187 #define OPAL_G7222 "G.722.2"
01188 #define OPAL_G726_40K "G.726-40K"
01189 #define OPAL_G726_32K "G.726-32K"
01190 #define OPAL_G726_24K "G.726-24K"
01191 #define OPAL_G726_16K "G.726-16K"
01192 #define OPAL_G728 "G.728"
01193 #define OPAL_G729 "G.729"
01194 #define OPAL_G729A "G.729A"
01195 #define OPAL_G729B "G.729B"
01196 #define OPAL_G729AB "G.729A/B"
01197 #define OPAL_G7231 "G.723.1"
01198 #define OPAL_G7231_6k3 OPAL_G7231
01199 #define OPAL_G7231_5k3 "G.723.1(5.3k)"
01200 #define OPAL_G7231A_6k3 "G.723.1A(6.3k)"
01201 #define OPAL_G7231A_5k3 "G.723.1A(5.3k)"
01202 #define OPAL_GSM0610 "GSM-06.10"
01203 #define OPAL_GSMAMR "GSM-AMR"
01204 #define OPAL_iLBC "iLBC"
01205 #define OPAL_H261 "H.261"
01206 #define OPAL_H263 "H.263"
01207 #define OPAL_H264 "H.264"
01208 #define OPAL_MPEG4 "MPEG4"
01209 #define OPAL_RFC2833 "UserInput/RFC2833"
01210 #define OPAL_CISCONSE "NamedSignalEvent"
01211 #define OPAL_T38 "T.38"
01212
01213 extern const OpalAudioFormat & GetOpalPCM16();
01214 extern const OpalAudioFormat & GetOpalPCM16_16KHZ();
01215 extern const OpalAudioFormat & GetOpalPCM16_32KHZ();
01216 extern const OpalAudioFormat & GetOpalPCM16_48KHZ();
01217 extern const OpalAudioFormat & GetOpalL16_MONO_8KHZ();
01218 extern const OpalAudioFormat & GetOpalL16_MONO_16KHZ();
01219 extern const OpalAudioFormat & GetOpalL16_MONO_32KHZ();
01220 extern const OpalAudioFormat & GetOpalL16_MONO_48KHZ();
01221 extern const OpalAudioFormat & GetOpalL16_STEREO_48KHZ();
01222 extern const OpalAudioFormat & GetOpalG711_ULAW_64K();
01223 extern const OpalAudioFormat & GetOpalG711_ALAW_64K();
01224 extern const OpalAudioFormat & GetOpalG722();
01225 extern const OpalAudioFormat & GetOpalG7221();
01226 extern const OpalMediaFormat & GetOpalG7222();
01227 extern const OpalAudioFormat & GetOpalG726_40K();
01228 extern const OpalAudioFormat & GetOpalG726_32K();
01229 extern const OpalAudioFormat & GetOpalG726_24K();
01230 extern const OpalAudioFormat & GetOpalG726_16K();
01231 extern const OpalAudioFormat & GetOpalG728();
01232 extern const OpalAudioFormat & GetOpalG729();
01233 extern const OpalAudioFormat & GetOpalG729A();
01234 extern const OpalAudioFormat & GetOpalG729B();
01235 extern const OpalAudioFormat & GetOpalG729AB();
01236 extern const OpalAudioFormat & GetOpalG7231_6k3();
01237 extern const OpalAudioFormat & GetOpalG7231_5k3();
01238 extern const OpalAudioFormat & GetOpalG7231A_6k3();
01239 extern const OpalAudioFormat & GetOpalG7231A_5k3();
01240 extern const OpalAudioFormat & GetOpalGSM0610();
01241 extern const OpalMediaFormat & GetOpalGSMAMR();
01242 extern const OpalMediaFormat & GetOpaliLBC();
01243
01244 extern const OpalMediaFormat & GetOpalRFC2833();
01245
01246 #if OPAL_T38_CAPABILITY
01247 extern const OpalMediaFormat & GetOpalCiscoNSE();
01248 extern const OpalMediaFormat & GetOpalT38();
01249 #endif
01250
01251
01252 #define OpalPCM16 GetOpalPCM16()
01253 #define OpalPCM16_16KHZ GetOpalPCM16_16KHZ()
01254 #define OpalPCM16_32KHZ GetOpalPCM16_32KHZ()
01255 #define OpalPCM16_48KHZ GetOpalPCM16_48KHZ()
01256 #define OpalL16_MONO_8KHZ GetOpalL16_MONO_8KHZ()
01257 #define OpalL16_MONO_16KHZ GetOpalL16_MONO_16KHZ()
01258 #define OpalL16_MONO_32KHZ GetOpalL16_MONO_32KHZ()
01259 #define OpalL16_MONO_48KHZ GetOpalL16_MONO_48KHZ()
01260 #define OpalL16_STEREO_48KHZ GetOpalL16_STEREO_48KHZ()
01261 #define OpalG711_ULAW_64K GetOpalG711_ULAW_64K()
01262 #define OpalG711_ALAW_64K GetOpalG711_ALAW_64K()
01263 #define OpalG722 GetOpalG722()
01264 #define OpalG7221 GetOpalG7221()
01265 #define OpalG7222 GetOpalG7222()
01266 #define OpalG726_40K GetOpalG726_40K()
01267 #define OpalG726_32K GetOpalG726_32K()
01268 #define OpalG726_24K GetOpalG726_24K()
01269 #define OpalG726_16K GetOpalG726_16K()
01270 #define OpalG728 GetOpalG728()
01271 #define OpalG729 GetOpalG729()
01272 #define OpalG729A GetOpalG729A()
01273 #define OpalG729B GetOpalG729B()
01274 #define OpalG729AB GetOpalG729AB()
01275 #define OpalG7231_6k3 GetOpalG7231_6k3()
01276 #define OpalG7231_5k3 GetOpalG7231_5k3()
01277 #define OpalG7231A_6k3 GetOpalG7231A_6k3()
01278 #define OpalG7231A_5k3 GetOpalG7231A_5k3()
01279 #define OpalGSM0610 GetOpalGSM0610()
01280 #define OpalGSMAMR GetOpalGSMAMR()
01281 #define OpaliLBC GetOpaliLBC()
01282 #define OpalRFC2833 GetOpalRFC2833()
01283 #define OpalCiscoNSE GetOpalCiscoNSE()
01284 #define OpalT38 GetOpalT38()
01285
01286 #define OpalL16Mono8kHz OpalL16_MONO_8KHZ
01287 #define OpalL16Mono16kHz OpalL16_MONO_16KHZ
01288 #define OpalG711uLaw OpalG711_ULAW_64K
01289 #define OpalG711ALaw OpalG711_ALAW_64K
01290
01291 #define OPAL_T140 "T.140"
01292 #define OpalT140 GetOpalT140()
01293 extern const OpalMediaFormat & GetOpalT140();
01294
01295 #if OPAL_HAS_MSRP
01296 #define OPAL_MSRP "MSRP"
01297 #define OpalMSRP GetOpalMSRP()
01298 extern const OpalMediaFormat & GetOpalMSRP();
01299 #endif
01300
01301 #if OPAL_HAS_SIPIM
01302 #define OPAL_SIPIM "SIP-IM"
01303 #define OpalSIPIM GetOpalSIPIM()
01304 extern const OpalMediaFormat & GetOpalSIPIM();
01305 #endif
01306
01307 #ifdef _MSC_VER
01308 #if _MSC_VER < 1300
01309 #pragma warning(default:4663)
01310 #endif
01311 #endif
01312
01313 #endif // OPAL_OPAL_MEDIAFMT_H
01314
01315
01316