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 #include <opal/mediatype.h>
00047
00048 #include <rtp/rtp.h>
00049
00050 #include <limits>
00051
00052 #ifdef min
00053 #undef min
00054 #endif
00055 #ifdef max
00056 #undef max
00057 #endif
00058
00059 class OpalMediaFormat;
00060
00061
00063
00064 PLIST(OpalMediaFormatBaseList, OpalMediaFormat);
00065
00068 class OpalMediaFormatList : public OpalMediaFormatBaseList
00069 {
00070 PCLASSINFO(OpalMediaFormatList, OpalMediaFormatBaseList);
00071 public:
00076 OpalMediaFormatList();
00077
00080 OpalMediaFormatList(
00081 const OpalMediaFormat & format
00082 );
00083
00086 OpalMediaFormatList(const OpalMediaFormatList & l) : OpalMediaFormatBaseList(l) { }
00088
00094 OpalMediaFormatList & operator+=(
00095 const OpalMediaFormat & format
00096 );
00097
00101 OpalMediaFormatList & operator+=(
00102 const OpalMediaFormatList & formats
00103 );
00104
00108 OpalMediaFormatList & operator-=(
00109 const OpalMediaFormat & format
00110 );
00111
00115 OpalMediaFormatList & operator-=(
00116 const OpalMediaFormatList & formats
00117 );
00118
00123 const_iterator FindFormat(
00124 RTP_DataFrame::PayloadTypes rtpPayloadType,
00125 const unsigned clockRate,
00126 const char * rtpEncodingName = NULL,
00127 const char * protocol = NULL
00128 ) const;
00129
00137 const_iterator FindFormat(
00138 const PString & wildcard,
00139 const_iterator start = const_iterator()
00140 ) const;
00141
00144 PBoolean HasFormat(
00145 RTP_DataFrame::PayloadTypes rtpPayloadType
00146 ) const { return FindFormat(rtpPayloadType) != end(); }
00147
00153 PBoolean HasFormat(
00154 const PString & wildcard
00155 ) const { return FindFormat(wildcard) != end(); }
00156
00159 void Remove(
00160 const PStringArray & mask
00161 );
00162
00167 void Reorder(
00168 const PStringArray & order
00169 );
00171
00172 private:
00173 virtual PINDEX Append(PObject *) { return P_MAX_INDEX; }
00174 virtual PINDEX Insert(const PObject &, PObject *) { return P_MAX_INDEX; }
00175 virtual PINDEX InsertAt(PINDEX, PObject *) { return P_MAX_INDEX; }
00176 virtual PBoolean SetAt(PINDEX, PObject *) { return PFalse; }
00177 };
00178
00179
00181
00184 class OpalMediaOption : public PObject
00185 {
00186 PCLASSINFO(OpalMediaOption, PObject);
00187 public:
00188 enum MergeType {
00189 NoMerge,
00190 MinMerge,
00191 MaxMerge,
00192 EqualMerge,
00193 NotEqualMerge,
00194 AlwaysMerge,
00195
00196
00197 AndMerge = MinMerge,
00198 OrMerge = MaxMerge
00199 };
00200
00201 protected:
00202 OpalMediaOption(
00203 const PString & name
00204 );
00205 OpalMediaOption(
00206 const char * name,
00207 bool readOnly,
00208 MergeType merge
00209 );
00210
00211 public:
00212 virtual Comparison Compare(const PObject & obj) const;
00213
00214 virtual bool Merge(
00215 const OpalMediaOption & option
00216 );
00217 virtual Comparison CompareValue(
00218 const OpalMediaOption & option
00219 ) const = 0;
00220 virtual void Assign(
00221 const OpalMediaOption & option
00222 ) = 0;
00223
00224 PString AsString() const;
00225 bool FromString(const PString & value);
00226
00227 const PString & GetName() const { return m_name; }
00228
00229 bool IsReadOnly() const { return m_readOnly; }
00230 void SetReadOnly(bool readOnly) { m_readOnly = readOnly; }
00231
00232 MergeType GetMerge() const { return m_merge; }
00233 void SetMerge(MergeType merge) { m_merge = merge; }
00234
00235 #if OPAL_SIP
00236 const PString & GetFMTPName() const { return m_FMTPName; }
00237 void SetFMTPName(const char * name) { m_FMTPName = name; }
00238
00239 const PString & GetFMTPDefault() const { return m_FMTPDefault; }
00240 void SetFMTPDefault(const char * value) { m_FMTPDefault = value; }
00241 #endif // OPAL_SIP
00242
00243 #if OPAL_H323
00244 struct H245GenericInfo {
00245 H245GenericInfo() { memset(this, 0, sizeof(*this)); }
00246 unsigned ordinal:16;
00247 enum Modes {
00248 None,
00249 Collapsing,
00250 NonCollapsing
00251 } mode:3;
00252 enum IntegerTypes {
00253 UnsignedInt,
00254 Unsigned32,
00255 BooleanArray
00256 } integerType:3;
00257 bool excludeTCS:1;
00258 bool excludeOLC:1;
00259 bool excludeReqMode:1;
00260 };
00261
00262 const H245GenericInfo & GetH245Generic() const { return m_H245Generic; }
00263 void SetH245Generic(const H245GenericInfo & generic) { m_H245Generic = generic; }
00264 #endif // OPAL_H323
00265
00266 protected:
00267 PCaselessString m_name;
00268 bool m_readOnly;
00269 MergeType m_merge;
00270
00271 #if OPAL_SIP
00272 PCaselessString m_FMTPName;
00273 PString m_FMTPDefault;
00274 #endif // OPAL_SIP
00275
00276 #if OPAL_H323
00277 H245GenericInfo m_H245Generic;
00278 #endif // OPAL_H323
00279 };
00280
00281
00282 template <typename T>
00283 class OpalMediaOptionValue : public OpalMediaOption
00284 {
00285 PCLASSINFO(OpalMediaOptionValue, OpalMediaOption);
00286 public:
00287 OpalMediaOptionValue(
00288 const char * name,
00289 bool readOnly,
00290 MergeType merge = MinMerge,
00291 T value = 0,
00292 T minimum = std::numeric_limits<T>::min(),
00293 T maximum = std::numeric_limits<T>::max()
00294 ) : OpalMediaOption(name, readOnly, merge),
00295 m_value(value),
00296 m_minimum(minimum),
00297 m_maximum(maximum)
00298 { }
00299
00300 virtual PObject * Clone() const
00301 {
00302 return new OpalMediaOptionValue(*this);
00303 }
00304
00305 virtual void PrintOn(ostream & strm) const
00306 {
00307 strm << m_value;
00308 }
00309
00310 virtual void ReadFrom(istream & strm)
00311 {
00312 T temp;
00313 strm >> temp;
00314 if (temp >= m_minimum && temp <= m_maximum)
00315 m_value = temp;
00316 else
00317 strm.setstate(ios::badbit);
00318 }
00319
00320 virtual Comparison CompareValue(const OpalMediaOption & option) const
00321 {
00322 const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00323 if (otherOption == NULL)
00324 return GreaterThan;
00325 if (m_value < otherOption->m_value)
00326 return LessThan;
00327 if (m_value > otherOption->m_value)
00328 return GreaterThan;
00329 return EqualTo;
00330 }
00331
00332 virtual void Assign(
00333 const OpalMediaOption & option
00334 ) {
00335 const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00336 if (otherOption != NULL)
00337 m_value = otherOption->m_value;
00338 }
00339
00340 T GetValue() const
00341 {
00342 return m_value;
00343 }
00344
00345 void SetValue(T value)
00346 {
00347 if (value < m_minimum)
00348 m_value = m_minimum;
00349 else if (value > m_maximum)
00350 m_value = m_maximum;
00351 else
00352 m_value = value;
00353 }
00354
00355 void SetMinimum(T m)
00356 {
00357 m_minimum = m;
00358 }
00359
00360 void SetMaximum(T m)
00361 {
00362 m_maximum = m;
00363 }
00364
00365 protected:
00366 T m_value;
00367 T m_minimum;
00368 T m_maximum;
00369 };
00370
00371
00372 typedef OpalMediaOptionValue<bool> OpalMediaOptionBoolean;
00373 typedef OpalMediaOptionValue<int> OpalMediaOptionInteger;
00374 typedef OpalMediaOptionValue<unsigned> OpalMediaOptionUnsigned;
00375 typedef OpalMediaOptionValue<double> OpalMediaOptionReal;
00376
00377
00378 class OpalMediaOptionEnum : public OpalMediaOption
00379 {
00380 PCLASSINFO(OpalMediaOptionEnum, OpalMediaOption);
00381 public:
00382 OpalMediaOptionEnum(
00383 const char * name,
00384 bool readOnly
00385 );
00386 OpalMediaOptionEnum(
00387 const char * name,
00388 bool readOnly,
00389 const char * const * enumerations,
00390 PINDEX count,
00391 MergeType merge = EqualMerge,
00392 PINDEX value = 0
00393 );
00394
00395 virtual PObject * Clone() const;
00396 virtual void PrintOn(ostream & strm) const;
00397 virtual void ReadFrom(istream & strm);
00398
00399 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00400 virtual void Assign(const OpalMediaOption & option);
00401
00402 PINDEX GetValue() const { return m_value; }
00403 void SetValue(PINDEX value);
00404
00405 void SetEnumerations(const PStringArray & e)
00406 {
00407 m_enumerations = e;
00408 }
00409
00410 protected:
00411 PStringArray m_enumerations;
00412 PINDEX m_value;
00413 };
00414
00415
00416 class OpalMediaOptionString : public OpalMediaOption
00417 {
00418 PCLASSINFO(OpalMediaOptionString, OpalMediaOption);
00419 public:
00420 OpalMediaOptionString(
00421 const char * name,
00422 bool readOnly
00423 );
00424 OpalMediaOptionString(
00425 const char * name,
00426 bool readOnly,
00427 const PString & value
00428 );
00429
00430 virtual PObject * Clone() const;
00431 virtual void PrintOn(ostream & strm) const;
00432 virtual void ReadFrom(istream & strm);
00433
00434 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00435 virtual void Assign(const OpalMediaOption & option);
00436
00437 const PString & GetValue() const { return m_value; }
00438 void SetValue(const PString & value);
00439
00440 protected:
00441 PString m_value;
00442 };
00443
00444
00445 class OpalMediaOptionOctets : public OpalMediaOption
00446 {
00447 PCLASSINFO(OpalMediaOptionOctets, OpalMediaOption);
00448 public:
00449 OpalMediaOptionOctets(
00450 const char * name,
00451 bool readOnly,
00452 bool base64 = false
00453 );
00454 OpalMediaOptionOctets(
00455 const char * name,
00456 bool readOnly,
00457 bool base64,
00458 const PBYTEArray & value
00459 );
00460 OpalMediaOptionOctets(
00461 const char * name,
00462 bool readOnly,
00463 bool base64,
00464 const BYTE * data,
00465 PINDEX length
00466 );
00467
00468 virtual PObject * Clone() const;
00469 virtual void PrintOn(ostream & strm) const;
00470 virtual void ReadFrom(istream & strm);
00471
00472 virtual Comparison CompareValue(const OpalMediaOption & option) const;
00473 virtual void Assign(const OpalMediaOption & option);
00474
00475 const PBYTEArray & GetValue() const { return m_value; }
00476 void SetValue(const PBYTEArray & value);
00477 void SetValue(const BYTE * data, PINDEX length);
00478
00479 void SetBase64(bool b)
00480 {
00481 m_base64 = b;
00482 }
00483
00484 protected:
00485 PBYTEArray m_value;
00486 bool m_base64;
00487 };
00488
00489
00491
00492 class OpalMediaFormatInternal : public PObject
00493 {
00494 PCLASSINFO(OpalMediaFormatInternal, PObject);
00495 public:
00496 OpalMediaFormatInternal(
00497 const char * fullName,
00498 const OpalMediaType & mediaType,
00499 RTP_DataFrame::PayloadTypes rtpPayloadType,
00500 const char * encodingName,
00501 PBoolean needsJitter,
00502 unsigned bandwidth,
00503 PINDEX frameSize,
00504 unsigned frameTime,
00505 unsigned clockRate,
00506 time_t timeStamp
00507 );
00508
00509 virtual PObject * Clone() const;
00510 virtual void PrintOn(ostream & strm) const;
00511
00512 virtual PBoolean IsValid() const { return rtpPayloadType < RTP_DataFrame::IllegalPayloadType && !formatName.IsEmpty(); }
00513 virtual PBoolean IsTransportable() const { return rtpPayloadType < RTP_DataFrame::MaxPayloadType && !rtpEncodingName.IsEmpty(); }
00514
00515 virtual PStringToString GetOptions() const;
00516 virtual bool GetOptionValue(const PString & name, PString & value) const;
00517 virtual bool SetOptionValue(const PString & name, const PString & value);
00518 virtual bool GetOptionBoolean(const PString & name, bool dflt) const;
00519 virtual bool SetOptionBoolean(const PString & name, bool value);
00520 virtual int GetOptionInteger(const PString & name, int dflt) const;
00521 virtual bool SetOptionInteger(const PString & name, int value);
00522 virtual double GetOptionReal(const PString & name, double dflt) const;
00523 virtual bool SetOptionReal(const PString & name, double value);
00524 virtual PINDEX GetOptionEnum(const PString & name, PINDEX dflt) const;
00525 virtual bool SetOptionEnum(const PString & name, PINDEX value);
00526 virtual PString GetOptionString(const PString & name, const PString & dflt) const;
00527 virtual bool SetOptionString(const PString & name, const PString & value);
00528 virtual bool GetOptionOctets(const PString & name, PBYTEArray & octets) const;
00529 virtual bool SetOptionOctets(const PString & name, const PBYTEArray & octets);
00530 virtual bool SetOptionOctets(const PString & name, const BYTE * data, PINDEX length);
00531 virtual bool AddOption(OpalMediaOption * option, PBoolean overwrite = PFalse);
00532 virtual OpalMediaOption * FindOption(const PString & name) const;
00533
00534 virtual bool ToNormalisedOptions();
00535 virtual bool ToCustomisedOptions();
00536 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
00537 virtual bool IsValidForProtocol(const PString & protocol) const;
00538
00539 protected:
00540 PCaselessString formatName;
00541 RTP_DataFrame::PayloadTypes rtpPayloadType;
00542 PString rtpEncodingName;
00543 OpalMediaType mediaType;
00544 PMutex media_format_mutex;
00545 PSortedList<OpalMediaOption> options;
00546 time_t codecVersionTime;
00547
00548 friend bool operator==(const char * other, const OpalMediaFormat & fmt);
00549 friend bool operator!=(const char * other, const OpalMediaFormat & fmt);
00550 friend bool operator==(const PString & other, const OpalMediaFormat & fmt);
00551 friend bool operator!=(const PString & other, const OpalMediaFormat & fmt);
00552
00553 friend class OpalMediaFormat;
00554 friend class OpalMediaFormatList;
00555 friend class OpalAudioFormatInternal;
00556 };
00557
00558
00560
00566 class OpalMediaFormat : public PContainer
00567 {
00568 PCONTAINERINFO(OpalMediaFormat, PContainer);
00569
00570 public:
00573 OpalMediaFormat(
00574 OpalMediaFormatInternal * info = NULL
00575 );
00576
00590 OpalMediaFormat(
00591 const char * fullName,
00592 const OpalMediaType & mediaType,
00593 RTP_DataFrame::PayloadTypes rtpPayloadType,
00594 const char * encodingName,
00595 PBoolean needsJitter,
00596 unsigned bandwidth,
00597 PINDEX frameSize,
00598 unsigned frameTime,
00599 unsigned clockRate,
00600 time_t timeStamp = 0
00601 );
00602
00612 OpalMediaFormat(
00613 RTP_DataFrame::PayloadTypes rtpPayloadType,
00614 unsigned clockRate,
00615 const char * rtpEncodingName = NULL,
00616 const char * protocol = NULL
00617 );
00618
00632 OpalMediaFormat(
00633 const char * wildcard
00634 );
00635
00649 OpalMediaFormat(
00650 const PString & wildcard
00651 );
00652
00656 OpalMediaFormat & operator=(
00657 RTP_DataFrame::PayloadTypes rtpPayloadType
00658 );
00659
00663 OpalMediaFormat & operator=(
00664 const char * wildcard
00665 );
00666
00670 OpalMediaFormat & operator=(
00671 const PString & wildcard
00672 );
00673
00676 virtual PObject * Clone() const;
00677
00680 virtual Comparison Compare(const PObject & obj) const;
00681
00686 virtual void PrintOn(ostream & strm) const;
00687
00690 virtual void ReadFrom(istream & strm);
00691
00696 bool ToNormalisedOptions();
00697
00701 bool ToCustomisedOptions();
00702
00713 bool Merge(
00714 const OpalMediaFormat & mediaFormat
00715 );
00716
00719 PString GetName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
00720
00725 PBoolean IsValid() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValid(); }
00726
00730 PBoolean IsTransportable() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsTransportable(); }
00731
00737 RTP_DataFrame::PayloadTypes GetPayloadType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? RTP_DataFrame::IllegalPayloadType : m_info->rtpPayloadType; }
00738 void SetPayloadType(RTP_DataFrame::PayloadTypes type) { PWaitAndSignal m(_mutex); MakeUnique(); if (m_info != NULL) m_info->rtpPayloadType = type; }
00739
00742 const char * GetEncodingName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->rtpEncodingName.GetPointer(); }
00743
00744 enum {
00745 DefaultAudioSessionID = 1,
00746 DefaultVideoSessionID = 2,
00747 DefaultDataSessionID = 3,
00748 DefaultH224SessionID = 4
00749 };
00750
00753 unsigned GetDefaultSessionID() const {
00754 PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : OpalMediaTypeDefinition::GetDefaultSessionId(m_info->mediaType);
00755 }
00756
00759 OpalMediaType GetMediaType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? OpalMediaType() : m_info->mediaType; }
00760
00764 bool NeedsJitterBuffer() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(NeedsJitterOption(), PFalse); }
00765 static const PString & NeedsJitterOption();
00766
00769 unsigned GetBandwidth() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxBitRateOption(), 0); }
00770 static const PString & MaxBitRateOption();
00771 static const PString & TargetBitRateOption();
00772
00777 PINDEX GetFrameSize() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxFrameSizeOption(), 0); }
00778 static const PString & MaxFrameSizeOption();
00779
00783 unsigned GetFrameTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(FrameTimeOption(), 0); }
00784 static const PString & FrameTimeOption();
00785
00788 unsigned GetTimeUnits() const { return GetClockRate()/1000; }
00789
00790 enum StandardClockRate {
00791 AudioClockRate = 8000,
00792 VideoClockRate = 90000
00793 };
00794
00797 unsigned GetClockRate() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(ClockRateOption(), 1000); }
00798 static const PString & ClockRateOption();
00799
00803 PStringToString GetOptions() const { PWaitAndSignal m(_mutex); return m_info == NULL ? PStringToString() : m_info->GetOptions(); }
00804
00807 PINDEX GetOptionCount() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->options.GetSize(); }
00808
00812 const OpalMediaOption & GetOption(
00813 PINDEX index
00814 ) const { PWaitAndSignal m(_mutex); return m_info->options[index]; }
00815
00820 bool GetOptionValue(
00821 const PString & name,
00822 PString & value
00823 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionValue(name, value); }
00824
00831 bool SetOptionValue(
00832 const PString & name,
00833 const PString & value
00834 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionValue(name, value); }
00835
00839 bool GetOptionBoolean(
00840 const PString & name,
00841 bool dflt = PFalse
00842 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(name, dflt); }
00843
00850 bool SetOptionBoolean(
00851 const PString & name,
00852 bool value
00853 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionBoolean(name, value); }
00854
00858 int GetOptionInteger(
00859 const PString & name,
00860 int dflt = 0
00861 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionInteger(name, dflt); }
00862
00870 bool SetOptionInteger(
00871 const PString & name,
00872 int value
00873 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionInteger(name, value); }
00874
00878 double GetOptionReal(
00879 const PString & name,
00880 double dflt = 0
00881 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionReal(name, dflt); }
00882
00889 bool SetOptionReal(
00890 const PString & name,
00891 double value
00892 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionReal(name, value); }
00893
00898 PINDEX GetOptionEnum(
00899 const PString & name,
00900 PINDEX dflt = 0
00901 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionEnum(name, dflt); }
00902
00909 bool SetOptionEnum(
00910 const PString & name,
00911 PINDEX value
00912 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionEnum(name, value); }
00913
00917 PString GetOptionString(
00918 const PString & name,
00919 const PString & dflt = PString::Empty()
00920 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionString(name, dflt); }
00921
00928 bool SetOptionString(
00929 const PString & name,
00930 const PString & value
00931 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionString(name, value); }
00932
00936 bool GetOptionOctets(
00937 const PString & name,
00938 PBYTEArray & octets
00939 ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionOctets(name, octets); }
00940
00947 bool SetOptionOctets(
00948 const PString & name,
00949 const PBYTEArray & octets
00950 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, octets); }
00951 bool SetOptionOctets(
00952 const PString & name,
00953 const BYTE * data,
00954 PINDEX length
00955 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, data, length); }
00956
00959 static OpalMediaFormatList GetAllRegisteredMediaFormats();
00960 static void GetAllRegisteredMediaFormats(
00961 OpalMediaFormatList & copy
00962 );
00963
00967 static bool SetRegisteredMediaFormat(
00968 const OpalMediaFormat & mediaFormat
00969 );
00970
00974 bool AddOption(
00975 OpalMediaOption * option,
00976 PBoolean overwrite = PFalse
00977 ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->AddOption(option, overwrite); }
00978
00982 bool HasOption(const PString & name) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->FindOption(name) != NULL; }
00983
00988 OpalMediaOption * FindOption(
00989 const PString & name
00990 ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? NULL : m_info->FindOption(name); }
00991
00997 bool IsValidForProtocol(const PString & protocol) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValidForProtocol(protocol); }
00998
00999 time_t GetCodecVersionTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->codecVersionTime; }
01000
01001 ostream & PrintOptions(ostream & strm) const
01002 {
01003 PWaitAndSignal m(_mutex);
01004 if (m_info != NULL)
01005 strm << setw(-1) << *m_info;
01006 return strm;
01007 }
01008
01009
01010 virtual PBoolean IsEmpty() const { PWaitAndSignal m(_mutex); return m_info == NULL || !m_info->IsValid(); }
01011 operator PString() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01012 operator const char *() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01013 bool operator==(const char * other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01014 bool operator!=(const char * other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName == other; }
01015 bool operator==(const PString & other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01016 bool operator!=(const PString & other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName == other; }
01017 bool operator==(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) == EqualTo; }
01018 bool operator!=(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) != EqualTo; }
01019 friend bool operator==(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01020 friend bool operator!=(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName == other; }
01021 friend bool operator==(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01022 friend bool operator!=(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName == other; }
01023
01024 #if OPAL_H323
01025 static const PString & MediaPacketizationOption();
01026 #endif
01027
01028 private:
01029 PBoolean SetSize(PINDEX) { return PTrue; }
01030
01031 protected:
01032 PMutex _mutex;
01033 void Construct(OpalMediaFormatInternal * info);
01034 OpalMediaFormatInternal * m_info;
01035
01036 friend class OpalMediaFormatInternal;
01037 friend class OpalMediaFormatList;
01038 };
01039
01040
01041 class OpalAudioFormatInternal : public OpalMediaFormatInternal
01042 {
01043 public:
01044 OpalAudioFormatInternal(
01045 const char * fullName,
01046 RTP_DataFrame::PayloadTypes rtpPayloadType,
01047 const char * encodingName,
01048 PINDEX frameSize,
01049 unsigned frameTime,
01050 unsigned rxFrames,
01051 unsigned txFrames,
01052 unsigned maxFrames,
01053 unsigned clockRate,
01054 time_t timeStamp
01055 );
01056 virtual PObject * Clone() const;
01057 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01058 };
01059
01060 class OpalAudioFormat : public OpalMediaFormat
01061 {
01062 PCLASSINFO(OpalAudioFormat, OpalMediaFormat);
01063 public:
01064 OpalAudioFormat(
01065 const char * fullName,
01066 RTP_DataFrame::PayloadTypes rtpPayloadType,
01067 const char * encodingName,
01068 PINDEX frameSize,
01069 unsigned frameTime,
01070 unsigned rxFrames,
01071 unsigned txFrames,
01072 unsigned maxFrames = 256,
01073 unsigned clockRate = 8000,
01074 time_t timeStamp = 0
01075 );
01076
01077 static const PString & RxFramesPerPacketOption();
01078 static const PString & TxFramesPerPacketOption();
01079 static const PString & MaxFramesPerPacketOption();
01080 static const PString & ChannelsOption();
01081 };
01082
01083 #if OPAL_VIDEO
01084 class OpalVideoFormatInternal : public OpalMediaFormatInternal
01085 {
01086 public:
01087 OpalVideoFormatInternal(
01088 const char * fullName,
01089 RTP_DataFrame::PayloadTypes rtpPayloadType,
01090 const char * encodingName,
01091 unsigned maxFrameWidth,
01092 unsigned maxFrameHeight,
01093 unsigned maxFrameRate,
01094 unsigned maxBitRate,
01095 time_t timeStamp
01096 );
01097 virtual PObject * Clone() const;
01098 virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01099 };
01100
01101
01102 class OpalVideoFormat : public OpalMediaFormat
01103 {
01104 PCLASSINFO(OpalVideoFormat, OpalMediaFormat);
01105 public:
01106 OpalVideoFormat(
01107 const char * fullName,
01108 RTP_DataFrame::PayloadTypes rtpPayloadType,
01109 const char * encodingName,
01110 unsigned maxFrameWidth,
01111 unsigned maxFrameHeight,
01112 unsigned maxFrameRate,
01113 unsigned maxBitRate,
01114 time_t timeStamp = 0
01115 );
01116
01117 static const PString & FrameWidthOption();
01118 static const PString & FrameHeightOption();
01119 static const PString & MinRxFrameWidthOption();
01120 static const PString & MinRxFrameHeightOption();
01121 static const PString & MaxRxFrameWidthOption();
01122 static const PString & MaxRxFrameHeightOption();
01123 static const PString & TemporalSpatialTradeOffOption();
01124 static const PString & TxKeyFramePeriodOption();
01125 static const PString & RateControlEnableOption();
01126 static const PString & RateControlWindowSizeOption();
01127 static const PString & RateControlMaxFramesSkipOption();
01128 };
01129 #endif
01130
01131
01132
01133 #define OPAL_PCM16 "PCM-16"
01134 #define OPAL_PCM16_16KHZ "PCM-16-16kHz"
01135 #define OPAL_L16_MONO_8KHZ "Linear-16-Mono-8kHz"
01136 #define OPAL_L16_MONO_16KHZ "Linear-16-Mono-16kHz"
01137 #define OPAL_G711_ULAW_64K "G.711-uLaw-64k"
01138 #define OPAL_G711_ALAW_64K "G.711-ALaw-64k"
01139 #define OPAL_G726_40K "G.726-40K"
01140 #define OPAL_G726_32K "G.726-32K"
01141 #define OPAL_G726_24K "G.726-24K"
01142 #define OPAL_G726_16K "G.726-16K"
01143 #define OPAL_G728 "G.728"
01144 #define OPAL_G729 "G.729"
01145 #define OPAL_G729A "G.729A"
01146 #define OPAL_G729B "G.729B"
01147 #define OPAL_G729AB "G.729A/B"
01148 #define OPAL_G7231 "G.723.1"
01149 #define OPAL_G7231_6k3 OPAL_G7231
01150 #define OPAL_G7231_5k3 "G.723.1(5.3k)"
01151 #define OPAL_G7231A_6k3 "G.723.1A(6.3k)"
01152 #define OPAL_G7231A_5k3 "G.723.1A(5.3k)"
01153 #define OPAL_GSM0610 "GSM-06.10"
01154 #define OPAL_GSMAMR "GSM-AMR"
01155 #define OPAL_iLBC "iLBC"
01156 #define OPAL_RFC2833 "UserInput/RFC2833"
01157 #define OPAL_CISCONSE "NamedSignalEvent"
01158 #define OPAL_T38 "T.38"
01159 #define OPAL_H224 "H.224"
01160
01161 extern const OpalAudioFormat & GetOpalPCM16();
01162 extern const OpalAudioFormat & GetOpalPCM16_16KHZ();
01163 extern const OpalAudioFormat & GetOpalL16_MONO_8KHZ();
01164 extern const OpalAudioFormat & GetOpalL16_MONO_16KHZ();
01165 extern const OpalAudioFormat & GetOpalL16_STEREO_48KHZ();
01166 extern const OpalAudioFormat & GetOpalG711_ULAW_64K();
01167 extern const OpalAudioFormat & GetOpalG711_ALAW_64K();
01168 extern const OpalAudioFormat & GetOpalG726_40K();
01169 extern const OpalAudioFormat & GetOpalG726_32K();
01170 extern const OpalAudioFormat & GetOpalG726_24K();
01171 extern const OpalAudioFormat & GetOpalG726_16K();
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 extern const OpalAudioFormat & GetOpalGSMAMR();
01183 extern const OpalAudioFormat & GetOpaliLBC();
01184
01185 extern const OpalMediaFormat & GetOpalRFC2833();
01186 #if OPAL_T38_CAPABILITY
01187 extern const OpalMediaFormat & GetOpalCiscoNSE();
01188 extern const OpalMediaFormat & GetOpalT38();
01189 #endif
01190
01191 #define OpalPCM16 GetOpalPCM16()
01192 #define OpalPCM16_16KHZ GetOpalPCM16_16KHZ()
01193 #define OpalL16_MONO_8KHZ GetOpalL16_MONO_8KHZ()
01194 #define OpalL16_MONO_16KHZ GetOpalL16_MONO_16KHZ()
01195 #define OpalL16_STEREO_48KHZ GetOpalL16_STEREO_48KHZ()
01196 #define OpalG711_ULAW_64K GetOpalG711_ULAW_64K()
01197 #define OpalG711_ALAW_64K GetOpalG711_ALAW_64K()
01198 #define OpalG726_40K GetOpalG726_40K()
01199 #define OpalG726_32K GetOpalG726_32K()
01200 #define OpalG726_24K GetOpalG726_24K()
01201 #define OpalG726_16K GetOpalG726_16K()
01202 #define OpalG728 GetOpalG728()
01203 #define OpalG729 GetOpalG729()
01204 #define OpalG729A GetOpalG729A()
01205 #define OpalG729B GetOpalG729B()
01206 #define OpalG729AB GetOpalG729AB()
01207 #define OpalG7231_6k3 GetOpalG7231_6k3()
01208 #define OpalG7231_5k3 GetOpalG7231_5k3()
01209 #define OpalG7231A_6k3 GetOpalG7231A_6k3()
01210 #define OpalG7231A_5k3 GetOpalG7231A_5k3()
01211 #define OpalGSM0610 GetOpalGSM0610()
01212 #define OpalGSMAMR GetOpalGSMAMR()
01213 #define OpaliLBC GetOpaliLBC()
01214 #define OpalRFC2833 GetOpalRFC2833()
01215 #define OpalCiscoNSE GetOpalCiscoNSE()
01216 #define OpalT38 GetOpalT38()
01217
01218 #define OpalL16Mono8kHz OpalL16_MONO_8KHZ
01219 #define OpalL16Mono16kHz OpalL16_MONO_16KHZ
01220 #define OpalG711uLaw OpalG711_ULAW_64K
01221 #define OpalG711ALaw OpalG711_ALAW_64K
01222
01223 #ifdef _MSC_VER
01224 #if _MSC_VER < 1300
01225 #pragma warning(default:4663)
01226 #endif
01227 #endif
01228
01229 #endif // __OPAL_MEDIAFMT_H
01230
01231
01232