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