mediafmt.h

Go to the documentation of this file.
00001 /*
00002  * mediafmt.h
00003  *
00004  * Media Format descriptions
00005  *
00006  * Open Phone Abstraction Library (OPAL)
00007  * Formally known as the Open H323 project.
00008  *
00009  * Copyright (c) 2001 Equivalence Pty. Ltd.
00010  *
00011  * The contents of this file are subject to the Mozilla Public License
00012  * Version 1.0 (the "License"); you may not use this file except in
00013  * compliance with the License. You may obtain a copy of the License at
00014  * http://www.mozilla.org/MPL/
00015  *
00016  * Software distributed under the License is distributed on an "AS IS"
00017  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00018  * the License for the specific language governing rights and limitations
00019  * under the License.
00020  *
00021  * The Original Code is Open H323 Library.
00022  *
00023  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
00024  *
00025  * Contributor(s): ______________________________________.
00026  *
00027  * $Revision: 20798 $
00028  * $Author: csoutheren $
00029  * $Date: 2008-08-31 13:09:49 +0000 (Sun, 31 Aug 2008) $
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       // Synonyms
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     // Backward compatibility
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 // List of known media formats
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 // End of File ///////////////////////////////////////////////////////////////

Generated on Mon Sep 15 11:49:14 2008 for OPAL by  doxygen 1.5.1