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
00171 void Remove(
00172 const PStringArray & mask
00173 );
00174
00182 void Reorder(
00183 const PStringArray & order
00184 );
00185
00188 bool HasType(
00189 const OpalMediaType & type,
00190 bool mustBeTransportable = true
00191 ) const;
00193
00194 private:
00195 virtual PINDEX Append(PObject *) { return P_MAX_INDEX; }
00196 virtual PINDEX Insert(const PObject &, PObject *) { return P_MAX_INDEX; }
00197 virtual PINDEX InsertAt(PINDEX, PObject *) { return P_MAX_INDEX; }
00198 virtual PBoolean SetAt(PINDEX, PObject *) { return PFalse; }
00199 };
00200
00201
00203
00206 class OpalMediaOption : public PObject
00207 {
00208 PCLASSINFO(OpalMediaOption, PObject);
00209 public:
00210 enum MergeType {
00211 NoMerge,
00212 MinMerge,
00213 MaxMerge,
00214 EqualMerge,
00215 NotEqualMerge,
00216 AlwaysMerge,
00217
00218
00219 AndMerge = MinMerge,
00220 OrMerge = MaxMerge
00221 };
00222
00223 protected:
00224 OpalMediaOption(
00225 const PString & name
00226 );
00227 OpalMediaOption(
00228 const char * name,
00229 bool readOnly,
00230 MergeType merge
00231 );
00232
00233 public:
00234 virtual Comparison Compare(const PObject & obj) const;
00235
00236 virtual bool Merge(
00237 const OpalMediaOption & option
00238 );
00239 virtual Comparison CompareValue(
00240 const OpalMediaOption & option
00241 ) const = 0;
00242 virtual void Assign(
00243 const OpalMediaOption & option
00244 ) = 0;
00245
00246 PString AsString() const;
00247 bool FromString(const PString & value);
00248
00249 const PString & GetName() const { return m_name; }
00250
00251 bool IsReadOnly() const { return m_readOnly; }
00252 void SetReadOnly(bool readOnly) { m_readOnly = readOnly; }
00253
00254 MergeType GetMerge() const { return m_merge; }
00255 void SetMerge(MergeType merge) { m_merge = merge; }
00256
00257 #if OPAL_SIP
00258 const PString & GetFMTPName() const { return m_FMTPName; }
00259 void SetFMTPName(const char * name) { m_FMTPName = name; }
00260
00261 const PString & GetFMTPDefault() const { return m_FMTPDefault; }
00262 void SetFMTPDefault(const char * value) { m_FMTPDefault = value; }
00263 #endif // OPAL_SIP
00264
00265 #if OPAL_H323
00266 struct H245GenericInfo {
00267 H245GenericInfo() { memset(this, 0, sizeof(*this)); }
00268 unsigned ordinal:16;
00269 enum Modes {
00270 None,
00271 Collapsing,
00272 NonCollapsing
00273 } mode:3;
00274 enum IntegerTypes {
00275 UnsignedInt,
00276 Unsigned32,
00277 BooleanArray
00278 } integerType:3;
00279 bool excludeTCS:1;
00280 bool excludeOLC:1;
00281 bool excludeReqMode:1;
00282 };
00283
00284 const H245GenericInfo & GetH245Generic() const { return m_H245Generic; }
00285 void SetH245Generic(const H245GenericInfo & generic) { m_H245Generic = generic; }
00286 #endif // OPAL_H323
00287
00288 protected:
00289 PCaselessString m_name;
00290 bool m_readOnly;
00291 MergeType m_merge;
00292
00293 #if OPAL_SIP
00294 PCaselessString m_FMTPName;
00295 PString m_FMTPDefault;
00296 #endif // OPAL_SIP
00297
00298 #if OPAL_H323
00299 H245GenericInfo m_H245Generic;
00300 #endif // OPAL_H323
00301 };
00302
00303
00304 template <typename T>
00305 class OpalMediaOptionValue : public OpalMediaOption
00306 {
00307 PCLASSINFO(OpalMediaOptionValue, OpalMediaOption);
00308 public:
00309 OpalMediaOptionValue(
00310 const char * name,
00311 bool readOnly,
00312 MergeType merge = MinMerge,
00313 T value = 0,
00314 T minimum = std::numeric_limits<T>::min(),
00315 T maximum = std::numeric_limits<T>::max()
00316 ) : OpalMediaOption(name, readOnly, merge),
00317 m_value(value),
00318 m_minimum(minimum),
00319 m_maximum(maximum)
00320 { }
00321
00322 virtual PObject * Clone() const
00323 {
00324 return new OpalMediaOptionValue(*this);
00325 }
00326
00327 virtual void PrintOn(ostream & strm) const
00328 {
00329 strm << m_value;
00330 }
00331
00332 virtual void ReadFrom(istream & strm)
00333 {
00334 T temp;
00335 strm >> temp;
00336 if (temp >= m_minimum && temp <= m_maximum)
00337 m_value = temp;
00338 else
00339 strm.setstate(ios::badbit);
00340 }
00341
00342 virtual Comparison CompareValue(const OpalMediaOption & option) const
00343 {
00344 const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00345 if (otherOption == NULL)
00346 return GreaterThan;
00347 if (m_value < otherOption->m_value)
00348 return LessThan;
00349 if (m_value > otherOption->m_value)
00350 return GreaterThan;
00351 return EqualTo;
00352 }
00353
00354 virtual void Assign(
00355 const OpalMediaOption & option
00356 ) {
00357 const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00358 if (otherOption != NULL)
00359 m_value = otherOption->m_value;
00360 }
00361
00362 T GetValue() const
00363 {
00364 return m_value;
00365 }
00366
00367 void SetValue(T value)
00368 {
00369 if (value < m_minimum)
00370 m_value = m_minimum;
00371 else if (value > m_maximum)
00372 m_value = m_maximum;
00373 else
00374 m_value = value;
00375 }
00376
00377 void SetMinimum(T m)
00378 {
00379 m_minimum = m;
00380 }
00381
00382 void SetMaximum(T m)
00383 {
00384 m_maximum = m;
00385 }
00386
00387 protected:
00388 T m_value;
00389 T m_minimum;
00390 T m_maximum;
00391 };
00392
00393
00394 typedef OpalMediaOptionValue<bool> OpalMediaOptionBoolean;
00395 typedef OpalMediaOptionValue<int> OpalMediaOptionInteger;
00396 typedef OpalMediaOptionValue<unsigned> OpalMediaOptionUnsigned;
00397 typedef OpalMediaOptionValue<double> OpalMediaOptionReal;
00398
00399
00400 class OpalMediaOptionEnum : public OpalMediaOption
00401 {
00402 PCLASSINFO(OpalMediaOptionEnum, OpalMediaOption);
00403 public:
00404 OpalMediaOptionEnum(
00405 const char * name,
00406 bool readOnly
00407 );
00408 OpalMediaOptionEnum(
00409 const char * name,
00410 bool readOnly,
00411 const char * const * enumerations,
00412 PINDEX count,
00413 MergeType merge = EqualMerge,
00414 PINDEX value = 0
00415 );
00416
00417 virtual PObject * Clone() const;
00418 virtual void PrintOn(ostream & strm) const;
00419 virtual void ReadFrom(istream & strm);
00420
00421 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00422 virtual void Assign(const OpalMediaOption & option);
00423
00424 PINDEX GetValue() const { return m_value; }
00425 void SetValue(PINDEX value);
00426
00427 void SetEnumerations(const PStringArray & e)
00428 {
00429 m_enumerations = e;
00430 }
00431
00432 protected:
00433 PStringArray m_enumerations;
00434 PINDEX m_value;
00435 };
00436
00437
00438 class OpalMediaOptionString : public OpalMediaOption
00439 {
00440 PCLASSINFO(OpalMediaOptionString, OpalMediaOption);
00441 public:
00442 OpalMediaOptionString(
00443 const char * name,
00444 bool readOnly
00445 );
00446 OpalMediaOptionString(
00447 const char * name,
00448 bool readOnly,
00449 const PString & value
00450 );
00451
00452 virtual PObject * Clone() const;
00453 virtual void PrintOn(ostream & strm) const;
00454 virtual void ReadFrom(istream & strm);
00455
00456 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00457 virtual void Assign(const OpalMediaOption & option);
00458
00459 const PString & GetValue() const { return m_value; }
00460 void SetValue(const PString & value);
00461
00462 protected:
00463 PString m_value;
00464 };
00465
00466
00467 class OpalMediaOptionOctets : public OpalMediaOption
00468 {
00469 PCLASSINFO(OpalMediaOptionOctets, OpalMediaOption);
00470 public:
00471 OpalMediaOptionOctets(
00472 const char * name,
00473 bool readOnly,
00474 bool base64 = false
00475 );
00476 OpalMediaOptionOctets(
00477 const char * name,
00478 bool readOnly,
00479 bool base64,
00480 const PBYTEArray & value
00481 );
00482 OpalMediaOptionOctets(
00483 const char * name,
00484 bool readOnly,
00485 bool base64,
00486 const BYTE * data,
00487 PINDEX length
00488 );
00489
00490 virtual PObject * Clone() const;
00491 virtual void PrintOn(ostream & strm) const;
00492 virtual void ReadFrom(istream & strm);
00493
00494 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00495 virtual void Assign(const OpalMediaOption & option);
00496
00497 const PBYTEArray & GetValue() const { return m_value; }
00498 void SetValue(const PBYTEArray & value);
00499 void SetValue(const BYTE * data, PINDEX length);
00500
00501 void SetBase64(bool b)
00502 {
00503 m_base64 = b;
00504 }
00505
00506 protected:
00507 PBYTEArray m_value;
00508 bool m_base64;
00509 };
00510
00511
00513
00514 class OpalMediaFormatInternal : public PObject
00515 {
00516 PCLASSINFO(OpalMediaFormatInternal, PObject);
00517 public:
00518 OpalMediaFormatInternal(
00519 const char * fullName,
00520 const OpalMediaType & mediaType,
00521 RTP_DataFrame::PayloadTypes rtpPayloadType,
00522 const char * encodingName,
00523 PBoolean needsJitter,
00524 unsigned bandwidth,
00525 PINDEX frameSize,
00526 unsigned frameTime,
00527 unsigned clockRate,
00528 time_t timeStamp
00529 );
00530
00531 virtual PObject * Clone() const;
00532 virtual void PrintOn(ostream & strm) const;
00533
00534 virtual bool IsValid() const;
00535 virtual bool IsTransportable() const;
00536
00537 virtual PStringToString GetOptions() const;
00538 virtual bool GetOptionValue(const PString & name, PString & value) const;
00539 virtual bool SetOptionValue(const PString & name, const PString & value);
00540 virtual bool GetOptionBoolean(const PString & name, bool dflt) const;
00541 virtual bool SetOptionBoolean(const PString & name, bool value);
00542 virtual int GetOptionInteger(const PString & name, int dflt) const;
00543 virtual bool SetOptionInteger(const PString & name, int value);
00544 virtual double GetOptionReal(const PString & name, double dflt) const;
00545 virtual bool SetOptionReal(const PString & name, double value);
00546 virtual PINDEX GetOptionEnum(const PString & name, PINDEX dflt) const;
00547 virtual bool SetOptionEnum(const PString & name, PINDEX value);
00548 virtual PString GetOptionString(const PString & name, const PString & dflt) const;
00549 virtual bool SetOptionString(const PString & name, const PString & value);
00550 virtual bool GetOptionOctets(const PString & name, PBYTEArray & octets) const;
00551 virtual bool SetOptionOctets(const PString & name, const PBYTEArray & octets);
00552 virtual bool SetOptionOctets(const PString & name, const BYTE * data, PINDEX length);
00553 virtual bool AddOption(OpalMediaOption * option, PBoolean overwrite = PFalse);
00554 virtual OpalMediaOption * FindOption(const PString & name) const;
00555
00556 virtual bool ToNormalisedOptions();
00557 virtual bool ToCustomisedOptions();
00558 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
00559 virtual bool IsValidForProtocol(const PString & protocol) const;
00560
00561 protected:
00562 PCaselessString formatName;
00563 RTP_DataFrame::PayloadTypes rtpPayloadType;
00564 PString rtpEncodingName;
00565 OpalMediaType mediaType;
00566 PMutex media_format_mutex;
00567 PSortedList<OpalMediaOption> options;
00568 time_t codecVersionTime;
00569 bool forceIsTransportable;
00570
00571 friend bool operator==(const char * other, const OpalMediaFormat & fmt);
00572 friend bool operator!=(const char * other, const OpalMediaFormat & fmt);
00573 friend bool operator==(const PString & other, const OpalMediaFormat & fmt);
00574 friend bool operator!=(const PString & other, const OpalMediaFormat & fmt);
00575
00576 friend class OpalMediaFormat;
00577 friend class OpalMediaFormatList;
00578 friend class OpalAudioFormatInternal;
00579 };
00580
00581
00583
00589 class OpalMediaFormat : public PContainer
00590 {
00591 PCONTAINERINFO(OpalMediaFormat, PContainer);
00592
00593 public:
00594 static const PString & BandwidthTIASOption();
00595 static const PString & MaxPacketRateOption();
00596
00599 OpalMediaFormat(
00600 OpalMediaFormatInternal * info = NULL
00601 );
00602
00616 OpalMediaFormat(
00617 const char * fullName,
00618 const OpalMediaType & mediaType,
00619 RTP_DataFrame::PayloadTypes rtpPayloadType,
00620 const char * encodingName,
00621 PBoolean needsJitter,
00622 unsigned bandwidth,
00623 PINDEX frameSize,
00624 unsigned frameTime,
00625 unsigned clockRate,
00626 time_t timeStamp = 0
00627 );
00628
00638 OpalMediaFormat(
00639 RTP_DataFrame::PayloadTypes rtpPayloadType,
00640 unsigned clockRate,
00641 const char * rtpEncodingName = NULL,
00642 const char * protocol = NULL
00643 );
00644
00658 OpalMediaFormat(
00659 const char * wildcard
00660 );
00661
00675 OpalMediaFormat(
00676 const PString & wildcard
00677 );
00678
00682 OpalMediaFormat & operator=(
00683 RTP_DataFrame::PayloadTypes rtpPayloadType
00684 );
00685
00689 OpalMediaFormat & operator=(
00690 const char * wildcard
00691 );
00692
00696 OpalMediaFormat & operator=(
00697 const PString & wildcard
00698 );
00699
00702 virtual PObject * Clone() const;
00703
00706 virtual Comparison Compare(const PObject & obj) const;
00707
00712 virtual void PrintOn(ostream & strm) const;
00713
00716 virtual void ReadFrom(istream & strm);
00717
00722 bool ToNormalisedOptions();
00723
00727 bool ToCustomisedOptions();
00728
00739 bool Merge(
00740 const OpalMediaFormat & mediaFormat
00741 );
00742
00745 PString GetName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
00746
00751 PBoolean IsValid() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValid(); }
00752
00756 PBoolean IsTransportable() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsTransportable(); }
00757
00763 RTP_DataFrame::PayloadTypes GetPayloadType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? RTP_DataFrame::IllegalPayloadType : m_info->rtpPayloadType; }
00764 void SetPayloadType(RTP_DataFrame::PayloadTypes type) { PWaitAndSignal m(_mutex); MakeUnique(); if (m_info != NULL) m_info->rtpPayloadType = type; }
00765
00768 const char * GetEncodingName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->rtpEncodingName.GetPointer(); }
00769
00772 OpalMediaType GetMediaType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? OpalMediaType() : m_info->mediaType; }
00773
00777 bool NeedsJitterBuffer() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(NeedsJitterOption(), PFalse); }
00778 static const PString & NeedsJitterOption();
00779
00782 unsigned GetBandwidth() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxBitRateOption(), 0); }
00783 static const PString & MaxBitRateOption();
00784 static const PString & TargetBitRateOption();
00785
00790 PINDEX GetFrameSize() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxFrameSizeOption(), 0); }
00791 static const PString & MaxFrameSizeOption();
00792
00796 unsigned GetFrameTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(FrameTimeOption(), 0); }
00797 static const PString & FrameTimeOption();
00798
00801 unsigned GetTimeUnits() const { return GetClockRate()/1000; }
00802
00803 enum StandardClockRate {
00804 AudioClockRate = 8000,
00805 VideoClockRate = 90000
00806 };
00807
00810 unsigned GetClockRate() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(ClockRateOption(), 1000); }
00811 static const PString & ClockRateOption();
00812
00816 PStringToString GetOptions() const { PWaitAndSignal m(_mutex); return m_info == NULL ? PStringToString() : m_info->GetOptions(); }
00817
00820 PINDEX GetOptionCount() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->options.GetSize(); }
00821
00825 const OpalMediaOption & GetOption(
00826 PINDEX index
00827 ) const { PWaitAndSignal m(_mutex); return m_info->options[index]; }
00828
00833 bool GetOptionValue(
00834 const PString & name,
00835 PString & value
00836 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionValue(name, value); }
00837
00844 bool SetOptionValue(
00845 const PString & name,
00846 const PString & value
00847 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionValue(name, value); }
00848
00852 bool GetOptionBoolean(
00853 const PString & name,
00854 bool dflt = PFalse
00855 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(name, dflt); }
00856
00863 bool SetOptionBoolean(
00864 const PString & name,
00865 bool value
00866 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionBoolean(name, value); }
00867
00871 int GetOptionInteger(
00872 const PString & name,
00873 int dflt = 0
00874 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionInteger(name, dflt); }
00875
00883 bool SetOptionInteger(
00884 const PString & name,
00885 int value
00886 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionInteger(name, value); }
00887
00891 double GetOptionReal(
00892 const PString & name,
00893 double dflt = 0
00894 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionReal(name, dflt); }
00895
00902 bool SetOptionReal(
00903 const PString & name,
00904 double value
00905 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionReal(name, value); }
00906
00911 PINDEX GetOptionEnum(
00912 const PString & name,
00913 PINDEX dflt = 0
00914 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionEnum(name, dflt); }
00915
00922 bool SetOptionEnum(
00923 const PString & name,
00924 PINDEX value
00925 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionEnum(name, value); }
00926
00930 PString GetOptionString(
00931 const PString & name,
00932 const PString & dflt = PString::Empty()
00933 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionString(name, dflt); }
00934
00941 bool SetOptionString(
00942 const PString & name,
00943 const PString & value
00944 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionString(name, value); }
00945
00949 bool GetOptionOctets(
00950 const PString & name,
00951 PBYTEArray & octets
00952 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionOctets(name, octets); }
00953
00960 bool SetOptionOctets(
00961 const PString & name,
00962 const PBYTEArray & octets
00963 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, octets); }
00964 bool SetOptionOctets(
00965 const PString & name,
00966 const BYTE * data,
00967 PINDEX length
00968 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, data, length); }
00969
00972 static OpalMediaFormatList GetAllRegisteredMediaFormats();
00973 static void GetAllRegisteredMediaFormats(
00974 OpalMediaFormatList & copy
00975 );
00976
00980 static bool SetRegisteredMediaFormat(
00981 const OpalMediaFormat & mediaFormat
00982 );
00983
00987 bool AddOption(
00988 OpalMediaOption * option,
00989 PBoolean overwrite = PFalse
00990 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->AddOption(option, overwrite); }
00991
00995 bool HasOption(const PString & name) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->FindOption(name) != NULL; }
00996
01001 OpalMediaOption * FindOption(
01002 const PString & name
01003 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? NULL : m_info->FindOption(name); }
01004
01010 bool IsValidForProtocol(const PString & protocol) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValidForProtocol(protocol); }
01011
01012 time_t GetCodecVersionTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->codecVersionTime; }
01013
01014 ostream & PrintOptions(ostream & strm) const
01015 {
01016 PWaitAndSignal m(_mutex);
01017 if (m_info != NULL)
01018 strm << setw(-1) << *m_info;
01019 return strm;
01020 }
01021
01022
01023 virtual PBoolean IsEmpty() const { PWaitAndSignal m(_mutex); return m_info == NULL || !m_info->IsValid(); }
01024 operator PString() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01025 operator const char *() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01026 bool operator==(const char * other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01027 bool operator!=(const char * other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName == other; }
01028 bool operator==(const PString & other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01029 bool operator!=(const PString & other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName == other; }
01030 bool operator==(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) == EqualTo; }
01031 bool operator!=(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) != EqualTo; }
01032 friend bool operator==(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01033 friend bool operator!=(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName == other; }
01034 friend bool operator==(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01035 friend bool operator!=(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName == other; }
01036
01037 #if OPAL_H323
01038 static const PString & MediaPacketizationOption();
01039 static const PString & MediaPacketizationsOption();
01040 #endif
01041
01042 private:
01043 PBoolean SetSize(PINDEX) { return PTrue; }
01044
01045 protected:
01046 PMutex _mutex;
01047 void Construct(OpalMediaFormatInternal * info);
01048 OpalMediaFormatInternal * m_info;
01049
01050 friend class OpalMediaFormatInternal;
01051 friend class OpalMediaFormatList;
01052 };
01053
01054
01055 class OpalAudioFormatInternal : public OpalMediaFormatInternal
01056 {
01057 public:
01058 OpalAudioFormatInternal(
01059 const char * fullName,
01060 RTP_DataFrame::PayloadTypes rtpPayloadType,
01061 const char * encodingName,
01062 PINDEX frameSize,
01063 unsigned frameTime,
01064 unsigned rxFrames,
01065 unsigned txFrames,
01066 unsigned maxFrames,
01067 unsigned clockRate,
01068 time_t timeStamp
01069 );
01070 virtual PObject * Clone() const;
01071 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01072 };
01073
01074 class OpalAudioFormat : public OpalMediaFormat
01075 {
01076 PCLASSINFO(OpalAudioFormat, OpalMediaFormat);
01077 public:
01078 OpalAudioFormat(
01079 const char * fullName,
01080 RTP_DataFrame::PayloadTypes rtpPayloadType,
01081 const char * encodingName,
01082 PINDEX frameSize,
01083 unsigned frameTime,
01084 unsigned rxFrames,
01085 unsigned txFrames,
01086 unsigned maxFrames = 256,
01087 unsigned clockRate = 8000,
01088 time_t timeStamp = 0
01089 );
01090
01091 static const PString & RxFramesPerPacketOption();
01092 static const PString & TxFramesPerPacketOption();
01093 static const PString & MaxFramesPerPacketOption();
01094 static const PString & ChannelsOption();
01095 };
01096
01097 #if OPAL_VIDEO
01098 class OpalVideoFormatInternal : public OpalMediaFormatInternal
01099 {
01100 public:
01101 OpalVideoFormatInternal(
01102 const char * fullName,
01103 RTP_DataFrame::PayloadTypes rtpPayloadType,
01104 const char * encodingName,
01105 unsigned maxFrameWidth,
01106 unsigned maxFrameHeight,
01107 unsigned maxFrameRate,
01108 unsigned maxBitRate,
01109 time_t timeStamp
01110 );
01111 virtual PObject * Clone() const;
01112 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01113 };
01114
01115
01116 class OpalVideoFormat : public OpalMediaFormat
01117 {
01118 PCLASSINFO(OpalVideoFormat, OpalMediaFormat);
01119 public:
01120 OpalVideoFormat(
01121 const char * fullName,
01122 RTP_DataFrame::PayloadTypes rtpPayloadType,
01123 const char * encodingName,
01124 unsigned maxFrameWidth,
01125 unsigned maxFrameHeight,
01126 unsigned maxFrameRate,
01127 unsigned maxBitRate,
01128 time_t timeStamp = 0
01129 );
01130
01131 static const PString & FrameWidthOption();
01132 static const PString & FrameHeightOption();
01133 static const PString & MinRxFrameWidthOption();
01134 static const PString & MinRxFrameHeightOption();
01135 static const PString & MaxRxFrameWidthOption();
01136 static const PString & MaxRxFrameHeightOption();
01137 static const PString & TemporalSpatialTradeOffOption();
01138 static const PString & TxKeyFramePeriodOption();
01139 static const PString & RateControlEnableOption();
01140 static const PString & RateControlWindowSizeOption();
01141 static const PString & RateControlMaxFramesSkipOption();
01142 static const PString & RateControllerBitRateScalerOption();
01143 };
01144 #endif
01145
01146
01147
01148 #define OPAL_PCM16 "PCM-16"
01149 #define OPAL_PCM16_16KHZ "PCM-16-16kHz"
01150 #define OPAL_PCM16_32KHZ "PCM-16-32kHz"
01151 #define OPAL_PCM16_48KHZ "PCM-16-48kHz"
01152 #define OPAL_L16_MONO_8KHZ "Linear-16-Mono-8kHz"
01153 #define OPAL_L16_MONO_16KHZ "Linear-16-Mono-16kHz"
01154 #define OPAL_L16_MONO_32KHZ "Linear-16-Mono-32kHz"
01155 #define OPAL_L16_MONO_48KHZ "Linear-16-Mono-48kHz"
01156 #define OPAL_G711_ULAW_64K "G.711-uLaw-64k"
01157 #define OPAL_G711_ALAW_64K "G.711-ALaw-64k"
01158 #define OPAL_G722 "G.722"
01159 #define OPAL_G7221 "G.722.1"
01160 #define OPAL_G7222 "G.722.2"
01161 #define OPAL_G726_40K "G.726-40K"
01162 #define OPAL_G726_32K "G.726-32K"
01163 #define OPAL_G726_24K "G.726-24K"
01164 #define OPAL_G726_16K "G.726-16K"
01165 #define OPAL_G728 "G.728"
01166 #define OPAL_G729 "G.729"
01167 #define OPAL_G729A "G.729A"
01168 #define OPAL_G729B "G.729B"
01169 #define OPAL_G729AB "G.729A/B"
01170 #define OPAL_G7231 "G.723.1"
01171 #define OPAL_G7231_6k3 OPAL_G7231
01172 #define OPAL_G7231_5k3 "G.723.1(5.3k)"
01173 #define OPAL_G7231A_6k3 "G.723.1A(6.3k)"
01174 #define OPAL_G7231A_5k3 "G.723.1A(5.3k)"
01175 #define OPAL_GSM0610 "GSM-06.10"
01176 #define OPAL_GSMAMR "GSM-AMR"
01177 #define OPAL_iLBC "iLBC"
01178 #define OPAL_H261 "H.261"
01179 #define OPAL_H263 "H.263"
01180 #define OPAL_H264 "H.264"
01181 #define OPAL_MPEG4 "MPEG4"
01182 #define OPAL_RFC2833 "UserInput/RFC2833"
01183 #define OPAL_CISCONSE "NamedSignalEvent"
01184 #define OPAL_T38 "T.38"
01185
01186 extern const OpalAudioFormat & GetOpalPCM16();
01187 extern const OpalAudioFormat & GetOpalPCM16_16KHZ();
01188 extern const OpalAudioFormat & GetOpalPCM16_32KHZ();
01189 extern const OpalAudioFormat & GetOpalPCM16_48KHZ();
01190 extern const OpalAudioFormat & GetOpalL16_MONO_8KHZ();
01191 extern const OpalAudioFormat & GetOpalL16_MONO_16KHZ();
01192 extern const OpalAudioFormat & GetOpalL16_MONO_32KHZ();
01193 extern const OpalAudioFormat & GetOpalL16_MONO_48KHZ();
01194 extern const OpalAudioFormat & GetOpalL16_STEREO_48KHZ();
01195 extern const OpalAudioFormat & GetOpalG711_ULAW_64K();
01196 extern const OpalAudioFormat & GetOpalG711_ALAW_64K();
01197 extern const OpalAudioFormat & GetOpalG722();
01198 extern const OpalAudioFormat & GetOpalG7221();
01199 extern const OpalMediaFormat & GetOpalG7222();
01200 extern const OpalAudioFormat & GetOpalG726_40K();
01201 extern const OpalAudioFormat & GetOpalG726_32K();
01202 extern const OpalAudioFormat & GetOpalG726_24K();
01203 extern const OpalAudioFormat & GetOpalG726_16K();
01204 extern const OpalAudioFormat & GetOpalG728();
01205 extern const OpalAudioFormat & GetOpalG729();
01206 extern const OpalAudioFormat & GetOpalG729A();
01207 extern const OpalAudioFormat & GetOpalG729B();
01208 extern const OpalAudioFormat & GetOpalG729AB();
01209 extern const OpalAudioFormat & GetOpalG7231_6k3();
01210 extern const OpalAudioFormat & GetOpalG7231_5k3();
01211 extern const OpalAudioFormat & GetOpalG7231A_6k3();
01212 extern const OpalAudioFormat & GetOpalG7231A_5k3();
01213 extern const OpalAudioFormat & GetOpalGSM0610();
01214 extern const OpalMediaFormat & GetOpalGSMAMR();
01215 extern const OpalMediaFormat & GetOpaliLBC();
01216
01217 extern const OpalMediaFormat & GetOpalRFC2833();
01218
01219 #if OPAL_T38_CAPABILITY
01220 extern const OpalMediaFormat & GetOpalCiscoNSE();
01221 extern const OpalMediaFormat & GetOpalT38();
01222 #endif
01223
01224
01225 #define OpalPCM16 GetOpalPCM16()
01226 #define OpalPCM16_16KHZ GetOpalPCM16_16KHZ()
01227 #define OpalPCM16_32KHZ GetOpalPCM16_32KHZ()
01228 #define OpalPCM16_48KHZ GetOpalPCM16_48KHZ()
01229 #define OpalL16_MONO_8KHZ GetOpalL16_MONO_8KHZ()
01230 #define OpalL16_MONO_16KHZ GetOpalL16_MONO_16KHZ()
01231 #define OpalL16_MONO_32KHZ GetOpalL16_MONO_32KHZ()
01232 #define OpalL16_MONO_48KHZ GetOpalL16_MONO_48KHZ()
01233 #define OpalL16_STEREO_48KHZ GetOpalL16_STEREO_48KHZ()
01234 #define OpalG711_ULAW_64K GetOpalG711_ULAW_64K()
01235 #define OpalG711_ALAW_64K GetOpalG711_ALAW_64K()
01236 #define OpalG722 GetOpalG722()
01237 #define OpalG7221 GetOpalG7221()
01238 #define OpalG7222 GetOpalG7222()
01239 #define OpalG726_40K GetOpalG726_40K()
01240 #define OpalG726_32K GetOpalG726_32K()
01241 #define OpalG726_24K GetOpalG726_24K()
01242 #define OpalG726_16K GetOpalG726_16K()
01243 #define OpalG728 GetOpalG728()
01244 #define OpalG729 GetOpalG729()
01245 #define OpalG729A GetOpalG729A()
01246 #define OpalG729B GetOpalG729B()
01247 #define OpalG729AB GetOpalG729AB()
01248 #define OpalG7231_6k3 GetOpalG7231_6k3()
01249 #define OpalG7231_5k3 GetOpalG7231_5k3()
01250 #define OpalG7231A_6k3 GetOpalG7231A_6k3()
01251 #define OpalG7231A_5k3 GetOpalG7231A_5k3()
01252 #define OpalGSM0610 GetOpalGSM0610()
01253 #define OpalGSMAMR GetOpalGSMAMR()
01254 #define OpaliLBC GetOpaliLBC()
01255 #define OpalRFC2833 GetOpalRFC2833()
01256 #define OpalCiscoNSE GetOpalCiscoNSE()
01257 #define OpalT38 GetOpalT38()
01258
01259 #define OpalL16Mono8kHz OpalL16_MONO_8KHZ
01260 #define OpalL16Mono16kHz OpalL16_MONO_16KHZ
01261 #define OpalG711uLaw OpalG711_ULAW_64K
01262 #define OpalG711ALaw OpalG711_ALAW_64K
01263
01264 #define OPAL_T140 "T.140"
01265 #define OpalT140 GetOpalT140()
01266 extern const OpalMediaFormat & GetOpalT140();
01267
01268 #if OPAL_HAS_MSRP
01269 #define OPAL_MSRP "MSRP"
01270 #define OpalMSRP GetOpalMSRP()
01271 extern const OpalMediaFormat & GetOpalMSRP();
01272 #endif
01273
01274 #if OPAL_HAS_SIPIM
01275 #define OPAL_SIPIM "SIP-IM"
01276 #define OpalSIPIM GetOpalSIPIM()
01277 extern const OpalMediaFormat & GetOpalSIPIM();
01278 #endif
01279
01280 #ifdef _MSC_VER
01281 #if _MSC_VER < 1300
01282 #pragma warning(default:4663)
01283 #endif
01284 #endif
01285
01286 #endif // OPAL_OPAL_MEDIAFMT_H
01287
01288
01289