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_MEDIAFMT_H
00033 #define __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 <rtp/rtp.h>
00048
00049 #include <limits>
00050
00051 #ifdef min
00052 #undef min
00053 #endif
00054 #ifdef max
00055 #undef max
00056 #endif
00057
00058 class OpalMediaFormat;
00059
00060
00062
00063 PLIST(OpalMediaFormatBaseList, OpalMediaFormat);
00064
00067 class OpalMediaFormatList : public OpalMediaFormatBaseList
00068 {
00069 PCLASSINFO(OpalMediaFormatList, OpalMediaFormatBaseList);
00070 public:
00075 OpalMediaFormatList();
00076
00079 OpalMediaFormatList(
00080 const OpalMediaFormat & format
00081 );
00082
00085 OpalMediaFormatList(const OpalMediaFormatList & l) : OpalMediaFormatBaseList(l) { }
00087
00093 OpalMediaFormatList & operator+=(
00094 const OpalMediaFormat & format
00095 );
00096
00100 OpalMediaFormatList & operator+=(
00101 const OpalMediaFormatList & formats
00102 );
00103
00107 OpalMediaFormatList & operator-=(
00108 const OpalMediaFormat & format
00109 );
00110
00114 OpalMediaFormatList & operator-=(
00115 const OpalMediaFormatList & formats
00116 );
00117
00122 const_iterator FindFormat(
00123 RTP_DataFrame::PayloadTypes rtpPayloadType,
00124 const unsigned clockRate,
00125 const char * rtpEncodingName = NULL,
00126 const char * protocol = NULL
00127 ) const;
00128
00136 const_iterator FindFormat(
00137 const PString & wildcard,
00138 const_iterator start = const_iterator()
00139 ) const;
00140
00143 PBoolean HasFormat(
00144 RTP_DataFrame::PayloadTypes rtpPayloadType
00145 ) const { return FindFormat(rtpPayloadType) != end(); }
00146
00152 PBoolean HasFormat(
00153 const PString & wildcard
00154 ) const { return FindFormat(wildcard) != end(); }
00155
00158 void Remove(
00159 const PStringArray & mask
00160 );
00161
00166 void Reorder(
00167 const PStringArray & order
00168 );
00170
00171 private:
00172 virtual PINDEX Append(PObject *) { return P_MAX_INDEX; }
00173 virtual PINDEX Insert(const PObject &, PObject *) { return P_MAX_INDEX; }
00174 virtual PINDEX InsertAt(PINDEX, PObject *) { return P_MAX_INDEX; }
00175 virtual PBoolean SetAt(PINDEX, PObject *) { return PFalse; }
00176 };
00177
00178
00180
00183 class OpalMediaOption : public PObject
00184 {
00185 PCLASSINFO(OpalMediaOption, PObject);
00186 public:
00187 enum MergeType {
00188 NoMerge,
00189 MinMerge,
00190 MaxMerge,
00191 EqualMerge,
00192 NotEqualMerge,
00193 AlwaysMerge,
00194
00195
00196 AndMerge = MinMerge,
00197 OrMerge = MaxMerge
00198 };
00199
00200 protected:
00201 OpalMediaOption(
00202 const PString & name
00203 );
00204 OpalMediaOption(
00205 const char * name,
00206 bool readOnly,
00207 MergeType merge
00208 );
00209
00210 public:
00211 virtual Comparison Compare(const PObject & obj) const;
00212
00213 virtual bool Merge(
00214 const OpalMediaOption & option
00215 );
00216 virtual Comparison CompareValue(
00217 const OpalMediaOption & option
00218 ) const = 0;
00219 virtual void Assign(
00220 const OpalMediaOption & option
00221 ) = 0;
00222
00223 PString AsString() const;
00224 bool FromString(const PString & value);
00225
00226 const PString & GetName() const { return m_name; }
00227
00228 bool IsReadOnly() const { return m_readOnly; }
00229 void SetReadOnly(bool readOnly) { m_readOnly = readOnly; }
00230
00231 MergeType GetMerge() const { return m_merge; }
00232 void SetMerge(MergeType merge) { m_merge = merge; }
00233
00234 #if OPAL_SIP
00235 const PString & GetFMTPName() const { return m_FMTPName; }
00236 void SetFMTPName(const char * name) { m_FMTPName = name; }
00237
00238 const PString & GetFMTPDefault() const { return m_FMTPDefault; }
00239 void SetFMTPDefault(const char * value) { m_FMTPDefault = value; }
00240 #endif // OPAL_SIP
00241
00242 #if OPAL_H323
00243 struct H245GenericInfo {
00244 H245GenericInfo() { memset(this, 0, sizeof(*this)); }
00245 unsigned ordinal:16;
00246 enum Modes {
00247 None,
00248 Collapsing,
00249 NonCollapsing
00250 } mode:3;
00251 enum IntegerTypes {
00252 UnsignedInt,
00253 Unsigned32,
00254 BooleanArray
00255 } integerType:3;
00256 bool excludeTCS:1;
00257 bool excludeOLC:1;
00258 bool excludeReqMode:1;
00259 };
00260
00261 const H245GenericInfo & GetH245Generic() const { return m_H245Generic; }
00262 void SetH245Generic(const H245GenericInfo & generic) { m_H245Generic = generic; }
00263 #endif // OPAL_H323
00264
00265 protected:
00266 PCaselessString m_name;
00267 bool m_readOnly;
00268 MergeType m_merge;
00269
00270 #if OPAL_SIP
00271 PCaselessString m_FMTPName;
00272 PString m_FMTPDefault;
00273 #endif // OPAL_SIP
00274
00275 #if OPAL_H323
00276 H245GenericInfo m_H245Generic;
00277 #endif // OPAL_H323
00278 };
00279
00280 #ifndef __USE_STL__
00281 __inline istream & operator>>(istream & strm, bool& b)
00282 {
00283 int i;strm >> i;b = i; return strm;
00284 }
00285 #endif
00286
00287 template <typename T>
00288 class OpalMediaOptionValue : public OpalMediaOption
00289 {
00290 PCLASSINFO(OpalMediaOptionValue, OpalMediaOption);
00291 public:
00292 OpalMediaOptionValue(
00293 const char * name,
00294 bool readOnly,
00295 MergeType merge = MinMerge,
00296 T value = 0,
00297 T minimum = std::numeric_limits<T>::min(),
00298 T maximum = std::numeric_limits<T>::max()
00299 ) : OpalMediaOption(name, readOnly, merge),
00300 m_value(value),
00301 m_minimum(minimum),
00302 m_maximum(maximum)
00303 { }
00304
00305 virtual PObject * Clone() const
00306 {
00307 return new OpalMediaOptionValue(*this);
00308 }
00309
00310 virtual void PrintOn(ostream & strm) const
00311 {
00312 strm << m_value;
00313 }
00314
00315 virtual void ReadFrom(istream & strm)
00316 {
00317 T temp;
00318 strm >> temp;
00319 if (temp >= m_minimum && temp <= m_maximum)
00320 m_value = temp;
00321 else {
00322 #ifdef __USE_STL__
00323 strm.setstate(ios::badbit);
00324 #else
00325 strm.setf(ios::badbit , ios::badbit);
00326 #endif
00327 }
00328 }
00329
00330 virtual Comparison CompareValue(const OpalMediaOption & option) const
00331 {
00332 const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00333 if (otherOption == NULL)
00334 return GreaterThan;
00335 if (m_value < otherOption->m_value)
00336 return LessThan;
00337 if (m_value > otherOption->m_value)
00338 return GreaterThan;
00339 return EqualTo;
00340 }
00341
00342 virtual void Assign(
00343 const OpalMediaOption & option
00344 ) {
00345 const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00346 if (otherOption != NULL)
00347 m_value = otherOption->m_value;
00348 }
00349
00350 T GetValue() const
00351 {
00352 return m_value;
00353 }
00354
00355 void SetValue(T value)
00356 {
00357 if (value < m_minimum)
00358 m_value = m_minimum;
00359 else if (value > m_maximum)
00360 m_value = m_maximum;
00361 else
00362 m_value = value;
00363 }
00364
00365 void SetMinimum(T m)
00366 {
00367 m_minimum = m;
00368 }
00369
00370 void SetMaximum(T m)
00371 {
00372 m_maximum = m;
00373 }
00374
00375 protected:
00376 T m_value;
00377 T m_minimum;
00378 T m_maximum;
00379 };
00380
00381
00382 typedef OpalMediaOptionValue<bool> OpalMediaOptionBoolean;
00383 typedef OpalMediaOptionValue<int> OpalMediaOptionInteger;
00384 typedef OpalMediaOptionValue<unsigned> OpalMediaOptionUnsigned;
00385 typedef OpalMediaOptionValue<double> OpalMediaOptionReal;
00386
00387
00388 class OpalMediaOptionEnum : public OpalMediaOption
00389 {
00390 PCLASSINFO(OpalMediaOptionEnum, OpalMediaOption);
00391 public:
00392 OpalMediaOptionEnum(
00393 const char * name,
00394 bool readOnly
00395 );
00396 OpalMediaOptionEnum(
00397 const char * name,
00398 bool readOnly,
00399 const char * const * enumerations,
00400 PINDEX count,
00401 MergeType merge = EqualMerge,
00402 PINDEX value = 0
00403 );
00404
00405 virtual PObject * Clone() const;
00406 virtual void PrintOn(ostream & strm) const;
00407 virtual void ReadFrom(istream & strm);
00408
00409 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00410 virtual void Assign(const OpalMediaOption & option);
00411
00412 PINDEX GetValue() const { return m_value; }
00413 void SetValue(PINDEX value);
00414
00415 void SetEnumerations(const PStringArray & e)
00416 {
00417 m_enumerations = e;
00418 }
00419
00420 protected:
00421 PStringArray m_enumerations;
00422 PINDEX m_value;
00423 };
00424
00425
00426 class OpalMediaOptionString : public OpalMediaOption
00427 {
00428 PCLASSINFO(OpalMediaOptionString, OpalMediaOption);
00429 public:
00430 OpalMediaOptionString(
00431 const char * name,
00432 bool readOnly
00433 );
00434 OpalMediaOptionString(
00435 const char * name,
00436 bool readOnly,
00437 const PString & value
00438 );
00439
00440 virtual PObject * Clone() const;
00441 virtual void PrintOn(ostream & strm) const;
00442 virtual void ReadFrom(istream & strm);
00443
00444 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00445 virtual void Assign(const OpalMediaOption & option);
00446
00447 const PString & GetValue() const { return m_value; }
00448 void SetValue(const PString & value);
00449
00450 protected:
00451 PString m_value;
00452 };
00453
00454
00455 class OpalMediaOptionOctets : public OpalMediaOption
00456 {
00457 PCLASSINFO(OpalMediaOptionOctets, OpalMediaOption);
00458 public:
00459 OpalMediaOptionOctets(
00460 const char * name,
00461 bool readOnly,
00462 bool base64 = false
00463 );
00464 OpalMediaOptionOctets(
00465 const char * name,
00466 bool readOnly,
00467 bool base64,
00468 const PBYTEArray & value
00469 );
00470 OpalMediaOptionOctets(
00471 const char * name,
00472 bool readOnly,
00473 bool base64,
00474 const BYTE * data,
00475 PINDEX length
00476 );
00477
00478 virtual PObject * Clone() const;
00479 virtual void PrintOn(ostream & strm) const;
00480 virtual void ReadFrom(istream & strm);
00481
00482 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00483 virtual void Assign(const OpalMediaOption & option);
00484
00485 const PBYTEArray & GetValue() const { return m_value; }
00486 void SetValue(const PBYTEArray & value);
00487 void SetValue(const BYTE * data, PINDEX length);
00488
00489 void SetBase64(bool b)
00490 {
00491 m_base64 = b;
00492 }
00493
00494 protected:
00495 PBYTEArray m_value;
00496 bool m_base64;
00497 };
00498
00499
00501
00502 class OpalMediaFormatInternal : public PObject
00503 {
00504 PCLASSINFO(OpalMediaFormatInternal, PObject);
00505 public:
00506 OpalMediaFormatInternal(
00507 const char * fullName,
00508 unsigned defaultSessionID,
00509 RTP_DataFrame::PayloadTypes rtpPayloadType,
00510 const char * encodingName,
00511 PBoolean needsJitter,
00512 unsigned bandwidth,
00513 PINDEX frameSize,
00514 unsigned frameTime,
00515 unsigned clockRate,
00516 time_t timeStamp
00517 );
00518
00519 virtual PObject * Clone() const;
00520 virtual void PrintOn(ostream & strm) const;
00521
00522 virtual PBoolean IsValid() const { return rtpPayloadType < RTP_DataFrame::IllegalPayloadType && !formatName.IsEmpty(); }
00523 virtual PBoolean IsTransportable() const { return rtpPayloadType < RTP_DataFrame::MaxPayloadType && !rtpEncodingName.IsEmpty(); }
00524
00525 virtual PStringToString GetOptions() const;
00526 virtual bool GetOptionValue(const PString & name, PString & value) const;
00527 virtual bool SetOptionValue(const PString & name, const PString & value);
00528 virtual bool GetOptionBoolean(const PString & name, bool dflt) const;
00529 virtual bool SetOptionBoolean(const PString & name, bool value);
00530 virtual int GetOptionInteger(const PString & name, int dflt) const;
00531 virtual bool SetOptionInteger(const PString & name, int value);
00532 virtual double GetOptionReal(const PString & name, double dflt) const;
00533 virtual bool SetOptionReal(const PString & name, double value);
00534 virtual PINDEX GetOptionEnum(const PString & name, PINDEX dflt) const;
00535 virtual bool SetOptionEnum(const PString & name, PINDEX value);
00536 virtual PString GetOptionString(const PString & name, const PString & dflt) const;
00537 virtual bool SetOptionString(const PString & name, const PString & value);
00538 virtual bool GetOptionOctets(const PString & name, PBYTEArray & octets) const;
00539 virtual bool SetOptionOctets(const PString & name, const PBYTEArray & octets);
00540 virtual bool SetOptionOctets(const PString & name, const BYTE * data, PINDEX length);
00541 virtual bool AddOption(OpalMediaOption * option, PBoolean overwrite = PFalse);
00542 virtual OpalMediaOption * FindOption(const PString & name) const;
00543
00544 virtual bool ToNormalisedOptions();
00545 virtual bool ToCustomisedOptions();
00546 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
00547 virtual bool IsValidForProtocol(const PString & protocol) const;
00548
00549 protected:
00550 PCaselessString formatName;
00551 RTP_DataFrame::PayloadTypes rtpPayloadType;
00552 PString rtpEncodingName;
00553 unsigned defaultSessionID;
00554 PMutex media_format_mutex;
00555 PSortedList<OpalMediaOption> options;
00556 time_t codecVersionTime;
00557
00558 friend bool operator==(const char * other, const OpalMediaFormat & fmt);
00559 friend bool operator!=(const char * other, const OpalMediaFormat & fmt);
00560 friend bool operator==(const PString & other, const OpalMediaFormat & fmt);
00561 friend bool operator!=(const PString & other, const OpalMediaFormat & fmt);
00562
00563 friend class OpalMediaFormat;
00564 friend class OpalMediaFormatList;
00565 friend class OpalAudioFormatInternal;
00566 };
00567
00568
00570
00576 class OpalMediaFormat : public PContainer
00577 {
00578 PCONTAINERINFO(OpalMediaFormat, PContainer);
00579
00580 public:
00583 OpalMediaFormat(
00584 OpalMediaFormatInternal * info = NULL
00585 );
00586
00600 OpalMediaFormat(
00601 const char * fullName,
00602 unsigned defaultSessionID,
00603 RTP_DataFrame::PayloadTypes rtpPayloadType,
00604 const char * encodingName,
00605 PBoolean needsJitter,
00606 unsigned bandwidth,
00607 PINDEX frameSize,
00608 unsigned frameTime,
00609 unsigned clockRate,
00610 time_t timeStamp = 0
00611 );
00612
00622 OpalMediaFormat(
00623 RTP_DataFrame::PayloadTypes rtpPayloadType,
00624 unsigned clockRate,
00625 const char * rtpEncodingName = NULL,
00626 const char * protocol = NULL
00627 );
00628
00642 OpalMediaFormat(
00643 const char * wildcard
00644 );
00645
00659 OpalMediaFormat(
00660 const PString & wildcard
00661 );
00662
00666 OpalMediaFormat & operator=(
00667 RTP_DataFrame::PayloadTypes rtpPayloadType
00668 );
00669
00673 OpalMediaFormat & operator=(
00674 const char * wildcard
00675 );
00676
00680 OpalMediaFormat & operator=(
00681 const PString & wildcard
00682 );
00683
00686 virtual PObject * Clone() const;
00687
00690 virtual Comparison Compare(const PObject & obj) const;
00691
00696 virtual void PrintOn(ostream & strm) const;
00697
00700 virtual void ReadFrom(istream & strm);
00701
00706 bool ToNormalisedOptions();
00707
00711 bool ToCustomisedOptions();
00712
00723 bool Merge(
00724 const OpalMediaFormat & mediaFormat
00725 );
00726
00729 PString GetName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
00730
00735 PBoolean IsValid() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValid(); }
00736
00740 PBoolean IsTransportable() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsTransportable(); }
00741
00747 RTP_DataFrame::PayloadTypes GetPayloadType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? RTP_DataFrame::IllegalPayloadType : m_info->rtpPayloadType; }
00748 void SetPayloadType(RTP_DataFrame::PayloadTypes type) { PWaitAndSignal m(_mutex); if (m_info != NULL && MakeUnique()) m_info->rtpPayloadType = type; }
00749
00752 const char * GetEncodingName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->rtpEncodingName; }
00753
00754 enum {
00755 DefaultAudioSessionID = 1,
00756 DefaultVideoSessionID = 2,
00757 DefaultDataSessionID = 3,
00758 DefaultH224SessionID = 4
00759 };
00760
00763 unsigned GetDefaultSessionID() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->defaultSessionID; }
00764
00768 bool NeedsJitterBuffer() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(NeedsJitterOption(), PFalse); }
00769 static const PString & NeedsJitterOption();
00770
00773 unsigned GetBandwidth() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxBitRateOption(), 0); }
00774 static const PString & MaxBitRateOption();
00775 static const PString & TargetBitRateOption();
00776
00781 PINDEX GetFrameSize() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxFrameSizeOption(), 0); }
00782 static const PString & MaxFrameSizeOption();
00783
00787 unsigned GetFrameTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(FrameTimeOption(), 0); }
00788 static const PString & FrameTimeOption();
00789
00792 unsigned GetTimeUnits() const { return GetClockRate()/1000; }
00793
00794 enum StandardClockRate {
00795 AudioClockRate = 8000,
00796 VideoClockRate = 90000
00797 };
00798
00801 unsigned GetClockRate() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(ClockRateOption(), 1000); }
00802 static const PString & ClockRateOption();
00803
00807 PStringToString GetOptions() const { PWaitAndSignal m(_mutex); return m_info == NULL ? PStringToString() : m_info->GetOptions(); }
00808
00811 PINDEX GetOptionCount() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->options.GetSize(); }
00812
00816 const OpalMediaOption & GetOption(
00817 PINDEX index
00818 ) const { PWaitAndSignal m(_mutex); return m_info->options[index]; }
00819
00824 bool GetOptionValue(
00825 const PString & name,
00826 PString & value
00827 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionValue(name, value); }
00828
00835 bool SetOptionValue(
00836 const PString & name,
00837 const PString & value
00838 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionValue(name, value); }
00839
00843 bool GetOptionBoolean(
00844 const PString & name,
00845 bool dflt = PFalse
00846 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(name, dflt); }
00847
00854 bool SetOptionBoolean(
00855 const PString & name,
00856 bool value
00857 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionBoolean(name, value); }
00858
00862 int GetOptionInteger(
00863 const PString & name,
00864 int dflt = 0
00865 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionInteger(name, dflt); }
00866
00874 bool SetOptionInteger(
00875 const PString & name,
00876 int value
00877 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionInteger(name, value); }
00878
00882 double GetOptionReal(
00883 const PString & name,
00884 double dflt = 0
00885 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionReal(name, dflt); }
00886
00893 bool SetOptionReal(
00894 const PString & name,
00895 double value
00896 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionReal(name, value); }
00897
00902 PINDEX GetOptionEnum(
00903 const PString & name,
00904 PINDEX dflt = 0
00905 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionEnum(name, dflt); }
00906
00913 bool SetOptionEnum(
00914 const PString & name,
00915 PINDEX value
00916 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionEnum(name, value); }
00917
00921 PString GetOptionString(
00922 const PString & name,
00923 const PString & dflt = PString::Empty()
00924 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionString(name, dflt); }
00925
00932 bool SetOptionString(
00933 const PString & name,
00934 const PString & value
00935 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionString(name, value); }
00936
00940 bool GetOptionOctets(
00941 const PString & name,
00942 PBYTEArray & octets
00943 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionOctets(name, octets); }
00944
00951 bool SetOptionOctets(
00952 const PString & name,
00953 const PBYTEArray & octets
00954 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, octets); }
00955 bool SetOptionOctets(
00956 const PString & name,
00957 const BYTE * data,
00958 PINDEX length
00959 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, data, length); }
00960
00963 static OpalMediaFormatList GetAllRegisteredMediaFormats();
00964 static void GetAllRegisteredMediaFormats(
00965 OpalMediaFormatList & copy
00966 );
00967
00971 static bool SetRegisteredMediaFormat(
00972 const OpalMediaFormat & mediaFormat
00973 );
00974
00978 bool AddOption(
00979 OpalMediaOption * option,
00980 PBoolean overwrite = PFalse
00981 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->AddOption(option, overwrite); }
00982
00986 bool HasOption(const PString & name) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->FindOption(name) != NULL; }
00987
00992 OpalMediaOption * FindOption(
00993 const PString & name
00994 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? NULL : m_info->FindOption(name); }
00995
01001 bool IsValidForProtocol(const PString & protocol) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValidForProtocol(protocol); }
01002
01003 time_t GetCodecVersionTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->codecVersionTime; }
01004
01005 ostream & PrintOptions(ostream & strm) const
01006 {
01007 PWaitAndSignal m(_mutex);
01008 if (m_info != NULL)
01009 strm << setw(-1) << *m_info;
01010 return strm;
01011 }
01012
01013
01014 virtual PBoolean IsEmpty() const { PWaitAndSignal m(_mutex); return m_info == NULL || !m_info->IsValid(); }
01015 operator PString() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01016 operator const char *() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01017 bool operator==(const char * other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01018 bool operator!=(const char * other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName == other; }
01019 bool operator==(const PString & other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01020 bool operator!=(const PString & other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName == other; }
01021 bool operator==(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) == EqualTo; }
01022 bool operator!=(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) != EqualTo; }
01023 friend bool operator==(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01024 friend bool operator!=(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName == other; }
01025 friend bool operator==(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01026 friend bool operator!=(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName == other; }
01027
01028 #if OPAL_H323
01029 static const PString & MediaPacketizationOption();
01030 #endif
01031
01032 private:
01033 PBoolean SetSize(PINDEX) { return PTrue; }
01034
01035 protected:
01036 PMutex _mutex;
01037 void Construct(OpalMediaFormatInternal * info);
01038 OpalMediaFormatInternal * m_info;
01039
01040 friend class OpalMediaFormatInternal;
01041 friend class OpalMediaFormatList;
01042 };
01043
01044
01045
01046
01047 #define OPAL_MEDIA_FORMAT(name, fullName, defaultSessionID, rtpPayloadType, encodingName, needsJitter, bandwidth, frameSize, frameTime, timeUnits) \
01048 const class name##_Class : public OpalMediaFormat \
01049 { \
01050 public: \
01051 name##_Class(); \
01052 } name; \
01053 name##_Class::name##_Class() \
01054 : OpalMediaFormat(fullName, defaultSessionID, rtpPayloadType, encodingName, needsJitter, bandwidth, frameSize, frameTime, timeUnits) \
01055
01056 #if OPAL_AUDIO
01057 class OpalAudioFormatInternal : public OpalMediaFormatInternal
01058 {
01059 public:
01060 OpalAudioFormatInternal(
01061 const char * fullName,
01062 RTP_DataFrame::PayloadTypes rtpPayloadType,
01063 const char * encodingName,
01064 PINDEX frameSize,
01065 unsigned frameTime,
01066 unsigned rxFrames,
01067 unsigned txFrames,
01068 unsigned maxFrames,
01069 unsigned clockRate,
01070 time_t timeStamp
01071 );
01072 virtual PObject * Clone() const;
01073 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01074 };
01075
01076 class OpalAudioFormat : public OpalMediaFormat
01077 {
01078 PCLASSINFO(OpalAudioFormat, OpalMediaFormat);
01079 public:
01080 OpalAudioFormat(
01081 const char * fullName,
01082 RTP_DataFrame::PayloadTypes rtpPayloadType,
01083 const char * encodingName,
01084 PINDEX frameSize,
01085 unsigned frameTime,
01086 unsigned rxFrames,
01087 unsigned txFrames,
01088 unsigned maxFrames = 256,
01089 unsigned clockRate = 8000,
01090 time_t timeStamp = 0
01091 );
01092
01093 static const PString & RxFramesPerPacketOption();
01094 static const PString & TxFramesPerPacketOption();
01095 };
01096 #endif
01097
01098 #if OPAL_VIDEO
01099 class OpalVideoFormatInternal : public OpalMediaFormatInternal
01100 {
01101 public:
01102 OpalVideoFormatInternal(
01103 const char * fullName,
01104 RTP_DataFrame::PayloadTypes rtpPayloadType,
01105 const char * encodingName,
01106 unsigned frameWidth,
01107 unsigned frameHeight,
01108 unsigned frameRate,
01109 unsigned bitRate,
01110 time_t timeStamp
01111 );
01112 virtual PObject * Clone() const;
01113 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01114 };
01115
01116
01117 class OpalVideoFormat : public OpalMediaFormat
01118 {
01119 PCLASSINFO(OpalVideoFormat, OpalMediaFormat);
01120 public:
01121 OpalVideoFormat(
01122 const char * fullName,
01123 RTP_DataFrame::PayloadTypes rtpPayloadType,
01124 const char * encodingName,
01125 unsigned frameWidth,
01126 unsigned frameHeight,
01127 unsigned frameRate,
01128 unsigned bitRate,
01129 time_t timeStamp = 0
01130 );
01131
01132 static const PString & FrameWidthOption();
01133 static const PString & FrameHeightOption();
01134 static const PString & MinRxFrameWidthOption();
01135 static const PString & MinRxFrameHeightOption();
01136 static const PString & MaxRxFrameWidthOption();
01137 static const PString & MaxRxFrameHeightOption();
01138 static const PString & TemporalSpatialTradeOffOption();
01139 static const PString & TxKeyFramePeriodOption();
01140 };
01141 #endif
01142
01143
01144
01145 #define OPAL_PCM16 "PCM-16"
01146 #define OPAL_PCM16_16KHZ "PCM-16-16kHz"
01147 #define OPAL_L16_MONO_8KHZ "Linear-16-Mono-8kHz"
01148 #define OPAL_L16_MONO_16KHZ "Linear-16-Mono-16kHz"
01149 #define OPAL_G711_ULAW_64K "G.711-uLaw-64k"
01150 #define OPAL_G711_ALAW_64K "G.711-ALaw-64k"
01151 #define OPAL_G728 "G.728"
01152 #define OPAL_G729 "G.729"
01153 #define OPAL_G729A "G.729A"
01154 #define OPAL_G729B "G.729B"
01155 #define OPAL_G729AB "G.729A/B"
01156 #define OPAL_G7231 "G.723.1"
01157 #define OPAL_G7231_6k3 OPAL_G7231
01158 #define OPAL_G7231_5k3 "G.723.1(5.3k)"
01159 #define OPAL_G7231A_6k3 "G.723.1A(6.3k)"
01160 #define OPAL_G7231A_5k3 "G.723.1A(5.3k)"
01161 #define OPAL_GSM0610 "GSM-06.10"
01162 #define OPAL_RFC2833 "UserInput/RFC2833"
01163 #define OPAL_CISCONSE "NamedSignalEvent"
01164
01165 #if OPAL_AUDIO
01166 extern const OpalAudioFormat & GetOpalPCM16();
01167 extern const OpalAudioFormat & GetOpalPCM16_16KHZ();
01168 extern const OpalAudioFormat & GetOpalL16_MONO_8KHZ();
01169 extern const OpalAudioFormat & GetOpalL16_MONO_16KHZ();
01170 extern const OpalAudioFormat & GetOpalG711_ULAW_64K();
01171 extern const OpalAudioFormat & GetOpalG711_ALAW_64K();
01172 extern const OpalAudioFormat & GetOpalG728();
01173 extern const OpalAudioFormat & GetOpalG729();
01174 extern const OpalAudioFormat & GetOpalG729A();
01175 extern const OpalAudioFormat & GetOpalG729B();
01176 extern const OpalAudioFormat & GetOpalG729AB();
01177 extern const OpalAudioFormat & GetOpalG7231_6k3();
01178 extern const OpalAudioFormat & GetOpalG7231_5k3();
01179 extern const OpalAudioFormat & GetOpalG7231A_6k3();
01180 extern const OpalAudioFormat & GetOpalG7231A_5k3();
01181 extern const OpalAudioFormat & GetOpalGSM0610();
01182 #endif
01183
01184 extern const OpalMediaFormat & GetOpalRFC2833();
01185 extern const OpalMediaFormat & GetOpalCiscoNSE();
01186
01187 #define OpalPCM16 GetOpalPCM16()
01188 #define OpalPCM16_16KHZ GetOpalPCM16_16KHZ()
01189 #define OpalL16_MONO_8KHZ GetOpalL16_MONO_8KHZ()
01190 #define OpalL16_MONO_16KHZ GetOpalL16_MONO_16KHZ()
01191 #define OpalG711_ULAW_64K GetOpalG711_ULAW_64K()
01192 #define OpalG711_ALAW_64K GetOpalG711_ALAW_64K()
01193 #define OpalG728 GetOpalG728()
01194 #define OpalG729 GetOpalG729()
01195 #define OpalG729A GetOpalG729A()
01196 #define OpalG729B GetOpalG729B()
01197 #define OpalG729AB GetOpalG729AB()
01198 #define OpalG7231_6k3 GetOpalG7231_6k3()
01199 #define OpalG7231_5k3 GetOpalG7231_5k3()
01200 #define OpalG7231A_6k3 GetOpalG7231A_6k3()
01201 #define OpalG7231A_5k3 GetOpalG7231A_5k3()
01202 #define OpalGSM0610 GetOpalGSM0610()
01203 #define OpalRFC2833 GetOpalRFC2833()
01204 #define OpalCiscoNSE GetOpalCiscoNSE()
01205
01206 #define OpalL16Mono8kHz OpalL16_MONO_8KHZ
01207 #define OpalL16Mono16kHz OpalL16_MONO_16KHZ
01208 #define OpalG711uLaw OpalG711_ULAW_64K
01209 #define OpalG711ALaw OpalG711_ALAW_64K
01210
01211
01212 #ifdef _MSC_VER
01213 #if _MSC_VER < 1300
01214 #pragma warning(default:4663)
01215 #endif
01216 #endif
01217
01218 #endif // __OPAL_MEDIAFMT_H
01219
01220
01221