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: 23153 $
00028  * $Author: rjongbloed $
00029  * $Date: 2009-07-29 02:22:00 +0000 (Wed, 29 Jul 2009) $
00030  */
00031 
00032 #ifndef OPAL_OPAL_MEDIAFMT_H
00033 #define OPAL_OPAL_MEDIAFMT_H
00034 
00035 #ifdef P_USE_PRAGMA
00036 #pragma interface
00037 #endif
00038 
00039 #ifdef _MSC_VER
00040 #if _MSC_VER < 1300   
00041 #pragma warning(disable:4663)
00042 #endif
00043 #endif
00044 
00045 #include <opal/buildopts.h>
00046 
00047 #include <opal/mediatype.h>
00048 
00049 #include <rtp/rtp.h>
00050 
00051 #include <limits>
00052 
00053 #ifdef min
00054 #undef min
00055 #endif
00056 #ifdef max
00057 #undef max
00058 #endif
00059 
00060 class OpalMediaFormat;
00061 
00062 
00064 
00065 PLIST(OpalMediaFormatBaseList, OpalMediaFormat);
00066 
00069 class OpalMediaFormatList : public OpalMediaFormatBaseList
00070 {
00071   PCLASSINFO(OpalMediaFormatList, OpalMediaFormatBaseList);
00072   public:
00077     OpalMediaFormatList();
00078 
00081     OpalMediaFormatList(
00082       const OpalMediaFormat & format    
00083     );
00084 
00087     OpalMediaFormatList(const OpalMediaFormatList & l) : OpalMediaFormatBaseList(l) { }
00089 
00095     OpalMediaFormatList & operator+=(
00096       const OpalMediaFormat & format    
00097     );
00098 
00102     OpalMediaFormatList & operator+=(
00103       const OpalMediaFormatList & formats    
00104     );
00105 
00109     OpalMediaFormatList & operator-=(
00110       const OpalMediaFormat & format    
00111     );
00112 
00116     OpalMediaFormatList & operator-=(
00117       const OpalMediaFormatList & formats    
00118     );
00119 
00124     const_iterator FindFormat(
00125       RTP_DataFrame::PayloadTypes rtpPayloadType, 
00126       const unsigned clockRate,                   
00127       const char * rtpEncodingName = NULL,        
00128       const char * protocol = NULL                
00129     ) const;
00130 
00147     const_iterator FindFormat(
00148       const PString & wildcard,    
00149       const_iterator start = const_iterator()
00150     ) const;
00151 
00154     PBoolean HasFormat(
00155       RTP_DataFrame::PayloadTypes rtpPayloadType 
00156     ) const { return FindFormat(rtpPayloadType) != end(); }
00157 
00163     PBoolean HasFormat(
00164       const PString & wildcard    
00165     ) const { return FindFormat(wildcard) != end(); }
00166 
00185     void Remove(
00186       const PStringArray & mask
00187     );
00188 
00204     void Reorder(
00205       const PStringArray & order
00206     );
00207 
00210     bool HasType(
00211       const OpalMediaType & type,
00212       bool mustBeTransportable = true
00213     ) const;
00215 
00216   private:
00217     virtual PINDEX Append(PObject *) { return P_MAX_INDEX; }
00218     virtual PINDEX Insert(const PObject &, PObject *) { return P_MAX_INDEX; }
00219     virtual PINDEX InsertAt(PINDEX, PObject *) { return P_MAX_INDEX; }
00220     virtual PBoolean SetAt(PINDEX, PObject *) { return PFalse; }
00221 };
00222 
00223 
00225 
00228 class OpalMediaOption : public PObject
00229 {
00230     PCLASSINFO(OpalMediaOption, PObject);
00231   public:
00232     enum MergeType {
00233       NoMerge,
00234       MinMerge,
00235       MaxMerge,
00236       EqualMerge,
00237       NotEqualMerge,
00238       AlwaysMerge,
00239 
00240       // Synonyms
00241       AndMerge = MinMerge,
00242       OrMerge  = MaxMerge
00243     };
00244 
00245   protected:
00246     OpalMediaOption(
00247       const PString & name
00248     );
00249     OpalMediaOption(
00250       const char * name,
00251       bool readOnly,
00252       MergeType merge
00253     );
00254 
00255   public:
00256     virtual Comparison Compare(const PObject & obj) const;
00257 
00258     virtual bool Merge(
00259       const OpalMediaOption & option
00260     );
00261     virtual Comparison CompareValue(
00262       const OpalMediaOption & option
00263     ) const = 0;
00264     virtual void Assign(
00265       const OpalMediaOption & option
00266     ) = 0;
00267 
00268     PString AsString() const;
00269     bool FromString(const PString & value);
00270 
00271     const PString & GetName() const { return m_name; }
00272 
00273     bool IsReadOnly() const { return m_readOnly; }
00274     void SetReadOnly(bool readOnly) { m_readOnly = readOnly; }
00275 
00276     MergeType GetMerge() const { return m_merge; }
00277     void SetMerge(MergeType merge) { m_merge = merge; }
00278 
00279 #if OPAL_SIP
00280     const PString & GetFMTPName() const { return m_FMTPName; }
00281     void SetFMTPName(const char * name) { m_FMTPName = name; }
00282 
00283     const PString & GetFMTPDefault() const { return m_FMTPDefault; }
00284     void SetFMTPDefault(const char * value) { m_FMTPDefault = value; }
00285 #endif // OPAL_SIP
00286 
00287 #if OPAL_H323
00288     struct H245GenericInfo {
00289       H245GenericInfo() { memset(this, 0, sizeof(*this)); }
00290       unsigned ordinal:16;
00291       enum Modes {
00292         None,
00293         Collapsing,
00294         NonCollapsing
00295       } mode:3;
00296       enum IntegerTypes {
00297         UnsignedInt,
00298         Unsigned32,
00299         BooleanArray
00300       } integerType:3;
00301       bool excludeTCS:1;
00302       bool excludeOLC:1;
00303       bool excludeReqMode:1;
00304     };
00305 
00306     const H245GenericInfo & GetH245Generic() const { return m_H245Generic; }
00307     void SetH245Generic(const H245GenericInfo & genericInfo) { m_H245Generic = genericInfo; }
00308 #endif // OPAL_H323
00309 
00310   protected:
00311     PCaselessString m_name;
00312     bool            m_readOnly;
00313     MergeType       m_merge;
00314 
00315 #if OPAL_SIP
00316     PCaselessString m_FMTPName;
00317     PString         m_FMTPDefault;
00318 #endif // OPAL_SIP
00319 
00320 #if OPAL_H323
00321     H245GenericInfo m_H245Generic;
00322 #endif // OPAL_H323
00323 };
00324 
00325 
00326 template <typename T>
00327 class OpalMediaOptionValue : public OpalMediaOption
00328 {
00329     PCLASSINFO(OpalMediaOptionValue, OpalMediaOption);
00330   public:
00331     OpalMediaOptionValue(
00332       const char * name,
00333       bool readOnly,
00334       MergeType merge = MinMerge,
00335       T value = 0,
00336       T minimum = std::numeric_limits<T>::min(),
00337       T maximum = std::numeric_limits<T>::max()
00338     ) : OpalMediaOption(name, readOnly, merge),
00339         m_value(value),
00340         m_minimum(minimum),
00341         m_maximum(maximum)
00342     { }
00343 
00344     virtual PObject * Clone() const
00345     {
00346       return new OpalMediaOptionValue(*this);
00347     }
00348 
00349     virtual void PrintOn(ostream & strm) const
00350     {
00351       strm << m_value;
00352     }
00353 
00354     virtual void ReadFrom(istream & strm)
00355     {
00356       T temp;
00357       strm >> temp;
00358       if (temp >= m_minimum && temp <= m_maximum)
00359         m_value = temp;
00360       else
00361         strm.setstate(ios::badbit);
00362     }
00363 
00364     virtual Comparison CompareValue(const OpalMediaOption & option) const
00365     {
00366       const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00367       if (otherOption == NULL)
00368         return GreaterThan;
00369       if (m_value < otherOption->m_value)
00370         return LessThan;
00371       if (m_value > otherOption->m_value)
00372         return GreaterThan;
00373       return EqualTo;
00374     }
00375 
00376     virtual void Assign(
00377       const OpalMediaOption & option
00378     ) {
00379       const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00380       if (otherOption != NULL)
00381         m_value = otherOption->m_value;
00382     }
00383 
00384     T GetValue() const
00385     {
00386       return m_value;
00387     }
00388 
00389     void SetValue(T value)
00390     {
00391       if (value < m_minimum)
00392         m_value = m_minimum;
00393       else if (value > m_maximum)
00394         m_value = m_maximum;
00395       else
00396         m_value = value;
00397     }
00398 
00399     void SetMinimum(T m)
00400     {
00401       m_minimum = m;
00402     }
00403 
00404     void SetMaximum(T m)
00405     {
00406       m_maximum = m;
00407     }
00408 
00409   protected:
00410     T m_value;
00411     T m_minimum;
00412     T m_maximum;
00413 };
00414 
00415 
00416 typedef OpalMediaOptionValue<bool>     OpalMediaOptionBoolean;
00417 typedef OpalMediaOptionValue<int>      OpalMediaOptionInteger;
00418 typedef OpalMediaOptionValue<unsigned> OpalMediaOptionUnsigned;
00419 typedef OpalMediaOptionValue<double>   OpalMediaOptionReal;
00420 
00421 
00422 class OpalMediaOptionEnum : public OpalMediaOption
00423 {
00424     PCLASSINFO(OpalMediaOptionEnum, OpalMediaOption);
00425   public:
00426     OpalMediaOptionEnum(
00427       const char * name,
00428       bool readOnly
00429     );
00430     OpalMediaOptionEnum(
00431       const char * name,
00432       bool readOnly,
00433       const char * const * enumerations,
00434       PINDEX count,
00435       MergeType merge = EqualMerge,
00436       PINDEX value = 0
00437     );
00438 
00439     virtual PObject * Clone() const;
00440     virtual void PrintOn(ostream & strm) const;
00441     virtual void ReadFrom(istream & strm);
00442 
00443     virtual Comparison CompareValue(const OpalMediaOption & option) const;
00444     virtual void Assign(const OpalMediaOption & option);
00445 
00446     PINDEX GetValue() const { return m_value; }
00447     void SetValue(PINDEX value);
00448 
00449     const PStringArray & GetEnumerations() const { return m_enumerations; }
00450     void SetEnumerations(const PStringArray & e)
00451     {
00452       m_enumerations = e;
00453     }
00454 
00455   protected:
00456     PStringArray m_enumerations;
00457     PINDEX       m_value;
00458 };
00459 
00460 
00461 class OpalMediaOptionString : public OpalMediaOption
00462 {
00463     PCLASSINFO(OpalMediaOptionString, OpalMediaOption);
00464   public:
00465     OpalMediaOptionString(
00466       const char * name,
00467       bool readOnly
00468     );
00469     OpalMediaOptionString(
00470       const char * name,
00471       bool readOnly,
00472       const PString & value
00473     );
00474 
00475     virtual PObject * Clone() const;
00476     virtual void PrintOn(ostream & strm) const;
00477     virtual void ReadFrom(istream & strm);
00478 
00479     virtual Comparison CompareValue(const OpalMediaOption & option) const;
00480     virtual void Assign(const OpalMediaOption & option);
00481 
00482     const PString & GetValue() const { return m_value; }
00483     void SetValue(const PString & value);
00484 
00485   protected:
00486     PString m_value;
00487 };
00488 
00489 
00490 class OpalMediaOptionOctets : public OpalMediaOption
00491 {
00492     PCLASSINFO(OpalMediaOptionOctets, OpalMediaOption);
00493   public:
00494     OpalMediaOptionOctets(
00495       const char * name,
00496       bool readOnly,
00497       bool base64 = false
00498     );
00499     OpalMediaOptionOctets(
00500       const char * name,
00501       bool readOnly,
00502       bool base64,
00503       const PBYTEArray & value
00504     );
00505     OpalMediaOptionOctets(
00506       const char * name,
00507       bool readOnly,
00508       bool base64,
00509       const BYTE * data,
00510       PINDEX length
00511     );
00512 
00513     virtual PObject * Clone() const;
00514     virtual void PrintOn(ostream & strm) const;
00515     virtual void ReadFrom(istream & strm);
00516 
00517     virtual Comparison CompareValue(const OpalMediaOption & option) const;
00518     virtual void Assign(const OpalMediaOption & option);
00519 
00520     const PBYTEArray & GetValue() const { return m_value; }
00521     void SetValue(const PBYTEArray & value);
00522     void SetValue(const BYTE * data, PINDEX length);
00523 
00524     void SetBase64(bool b)
00525     {
00526       m_base64 = b;
00527     }
00528 
00529   protected:
00530     PBYTEArray m_value;
00531     bool       m_base64;
00532 };
00533 
00534 
00536 
00537 class OpalMediaFormatInternal : public PObject
00538 {
00539     PCLASSINFO(OpalMediaFormatInternal, PObject);
00540   public:
00541     OpalMediaFormatInternal(
00542       const char * fullName,
00543       const OpalMediaType & mediaType,
00544       RTP_DataFrame::PayloadTypes rtpPayloadType,
00545       const char * encodingName,
00546       PBoolean     needsJitter,
00547       unsigned bandwidth,
00548       PINDEX   frameSize,
00549       unsigned frameTime,
00550       unsigned clockRate,
00551       time_t timeStamp
00552     );
00553 
00554     virtual PObject * Clone() const;
00555     virtual void PrintOn(ostream & strm) const;
00556 
00557     virtual bool IsValid() const;
00558     virtual bool IsTransportable() const;
00559 
00560     virtual PStringToString GetOptions() const;
00561     virtual bool GetOptionValue(const PString & name, PString & value) const;
00562     virtual bool SetOptionValue(const PString & name, const PString & value);
00563     virtual bool GetOptionBoolean(const PString & name, bool dflt) const;
00564     virtual bool SetOptionBoolean(const PString & name, bool value);
00565     virtual int GetOptionInteger(const PString & name, int dflt) const;
00566     virtual bool SetOptionInteger(const PString & name, int value);
00567     virtual double GetOptionReal(const PString & name, double dflt) const;
00568     virtual bool SetOptionReal(const PString & name, double value);
00569     virtual PINDEX GetOptionEnum(const PString & name, PINDEX dflt) const;
00570     virtual bool SetOptionEnum(const PString & name, PINDEX value);
00571     virtual PString GetOptionString(const PString & name, const PString & dflt) const;
00572     virtual bool SetOptionString(const PString & name, const PString & value);
00573     virtual bool GetOptionOctets(const PString & name, PBYTEArray & octets) const;
00574     virtual bool SetOptionOctets(const PString & name, const PBYTEArray & octets);
00575     virtual bool SetOptionOctets(const PString & name, const BYTE * data, PINDEX length);
00576     virtual bool AddOption(OpalMediaOption * option, PBoolean overwrite = PFalse);
00577     virtual OpalMediaOption * FindOption(const PString & name) const;
00578 
00579     virtual bool ToNormalisedOptions();
00580     virtual bool ToCustomisedOptions();
00581     virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
00582     virtual bool IsValidForProtocol(const PString & protocol) const;
00583 
00584   protected:
00585     PCaselessString              formatName;
00586     RTP_DataFrame::PayloadTypes  rtpPayloadType;
00587     PString                      rtpEncodingName;
00588     OpalMediaType                mediaType;
00589     PMutex                       media_format_mutex;
00590     PSortedList<OpalMediaOption> options;
00591     time_t                       codecVersionTime;
00592     bool                         forceIsTransportable;
00593 
00594   friend bool operator==(const char * other, const OpalMediaFormat & fmt);
00595   friend bool operator!=(const char * other, const OpalMediaFormat & fmt);
00596   friend bool operator==(const PString & other, const OpalMediaFormat & fmt);
00597   friend bool operator!=(const PString & other, const OpalMediaFormat & fmt);
00598 
00599   friend class OpalMediaFormat;
00600   friend class OpalMediaFormatList;
00601   friend class OpalAudioFormatInternal;
00602 };
00603 
00604 
00606 
00612 class OpalMediaFormat : public PContainer
00613 {
00614   PCONTAINERINFO(OpalMediaFormat, PContainer);
00615 
00616   public:
00619     OpalMediaFormat(
00620       OpalMediaFormatInternal * info = NULL
00621     );
00622 
00636     OpalMediaFormat(
00637       const char * fullName,                      
00638       const OpalMediaType & mediaType,            
00639       RTP_DataFrame::PayloadTypes rtpPayloadType, 
00640       const char * encodingName,                  
00641       PBoolean     needsJitter,                   
00642       unsigned bandwidth,                         
00643       PINDEX   frameSize,                         
00644       unsigned frameTime,                         
00645       unsigned clockRate,                         
00646       time_t timeStamp = 0                        
00647     );
00648 
00658     OpalMediaFormat(
00659       RTP_DataFrame::PayloadTypes rtpPayloadType, 
00660       unsigned clockRate,                         
00661       const char * rtpEncodingName = NULL,        
00662       const char * protocol = NULL                
00663     );
00664 
00678     OpalMediaFormat(
00679       const char * wildcard  
00680     );
00681 
00695     OpalMediaFormat(
00696       const PString & wildcard  
00697     );
00698     
00702     OpalMediaFormat & operator=(
00703       RTP_DataFrame::PayloadTypes rtpPayloadType 
00704     );
00705 
00709     OpalMediaFormat & operator=(
00710       const char * wildcard  
00711     );
00712 
00716     OpalMediaFormat & operator=(
00717       const PString & wildcard  
00718     );
00719 
00722     virtual PObject * Clone() const;
00723 
00726     virtual Comparison Compare(const PObject & obj) const;
00727 
00732     virtual void PrintOn(ostream & strm) const;
00733 
00736     virtual void ReadFrom(istream & strm);
00737 
00742     bool ToNormalisedOptions();
00743 
00747     bool ToCustomisedOptions();
00748 
00759     bool Merge(
00760       const OpalMediaFormat & mediaFormat
00761     );
00762 
00765     PString GetName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
00766 
00771     PBoolean IsValid() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValid(); }
00772 
00776     PBoolean IsTransportable() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsTransportable(); }
00777 
00783     RTP_DataFrame::PayloadTypes GetPayloadType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? RTP_DataFrame::IllegalPayloadType : m_info->rtpPayloadType; }
00784     void SetPayloadType(RTP_DataFrame::PayloadTypes type) { PWaitAndSignal m(_mutex); MakeUnique(); if (m_info != NULL) m_info->rtpPayloadType = type; }
00785 
00788     const char * GetEncodingName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->rtpEncodingName.GetPointer(); }
00789 
00792     OpalMediaType GetMediaType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? OpalMediaType() : m_info->mediaType; }
00793 
00797     bool NeedsJitterBuffer() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(NeedsJitterOption(), PFalse); }
00798     static const PString & NeedsJitterOption();
00799 
00802     unsigned GetBandwidth() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxBitRateOption(), 0); }
00803     static const PString & MaxBitRateOption();
00804     static const PString & TargetBitRateOption();
00805 
00810     PINDEX GetFrameSize() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxFrameSizeOption(), 0); }
00811     static const PString & MaxFrameSizeOption();
00812 
00816     unsigned GetFrameTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(FrameTimeOption(), 0); }
00817     static const PString & FrameTimeOption();
00818 
00821     unsigned GetTimeUnits() const { return GetClockRate()/1000; }
00822 
00823     enum StandardClockRate {
00824       AudioClockRate = 8000,  
00825       VideoClockRate = 90000  
00826     };
00827 
00830     unsigned GetClockRate() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(ClockRateOption(), 1000); }
00831     static const PString & ClockRateOption();
00832 
00835     static const PString & ProtocolOption();
00836 
00839     static const PString & MaxTxPacketSizeOption();
00840 
00844     PStringToString GetOptions() const { PWaitAndSignal m(_mutex); return m_info == NULL ? PStringToString() : m_info->GetOptions(); }
00845 
00848     PINDEX GetOptionCount() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->options.GetSize(); }
00849 
00853     const OpalMediaOption & GetOption(
00854       PINDEX index   
00855     ) const { PWaitAndSignal m(_mutex); return m_info->options[index]; }
00856 
00861     bool GetOptionValue(
00862       const PString & name,   
00863       PString & value         
00864     ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionValue(name, value); }
00865 
00872     bool SetOptionValue(
00873       const PString & name,   
00874       const PString & value   
00875     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionValue(name, value); }
00876 
00880     bool GetOptionBoolean(
00881       const PString & name,   
00882       bool dflt = PFalse       
00883     ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(name, dflt); }
00884 
00891     bool SetOptionBoolean(
00892       const PString & name,   
00893       bool value              
00894     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionBoolean(name, value); }
00895 
00899     int GetOptionInteger(
00900       const PString & name,   
00901       int dflt = 0            
00902     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionInteger(name, dflt); }
00903 
00911     bool SetOptionInteger(
00912       const PString & name,   
00913       int value               
00914     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionInteger(name, value); }
00915 
00919     double GetOptionReal(
00920       const PString & name,   
00921       double dflt = 0         
00922     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionReal(name, dflt); }
00923 
00930     bool SetOptionReal(
00931       const PString & name,   
00932       double value            
00933     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionReal(name, value); }
00934 
00939     PINDEX GetOptionEnum(
00940       const PString & name,   
00941       PINDEX dflt = 0         
00942     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionEnum(name, dflt); }
00943 
00950     bool SetOptionEnum(
00951       const PString & name,   
00952       PINDEX value            
00953     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionEnum(name, value); }
00954 
00958     PString GetOptionString(
00959       const PString & name,                   
00960       const PString & dflt = PString::Empty() 
00961     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionString(name, dflt); }
00962 
00969     bool SetOptionString(
00970       const PString & name,   
00971       const PString & value   
00972     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionString(name, value); }
00973 
00977     bool GetOptionOctets(
00978       const PString & name, 
00979       PBYTEArray & octets   
00980     ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionOctets(name, octets); }
00981 
00988     bool SetOptionOctets(
00989       const PString & name,       
00990       const PBYTEArray & octets   
00991     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, octets); }
00992     bool SetOptionOctets(
00993       const PString & name,       
00994       const BYTE * data,          
00995       PINDEX length               
00996     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, data, length); }
00997 
01000     static OpalMediaFormatList GetAllRegisteredMediaFormats();
01001     static void GetAllRegisteredMediaFormats(
01002       OpalMediaFormatList & copy    
01003     );
01004 
01008     static bool SetRegisteredMediaFormat(
01009       const OpalMediaFormat & mediaFormat  
01010     );
01011 
01015     bool AddOption(
01016       OpalMediaOption * option,
01017       PBoolean overwrite = PFalse
01018     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->AddOption(option, overwrite); }
01019 
01023     bool HasOption(const PString & name) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->FindOption(name) != NULL; }
01024 
01029     OpalMediaOption * FindOption(
01030       const PString & name
01031     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? NULL : m_info->FindOption(name); }
01032 
01038     bool IsValidForProtocol(const PString & protocol) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValidForProtocol(protocol); }
01039 
01040     time_t GetCodecVersionTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->codecVersionTime; }
01041 
01042     ostream & PrintOptions(ostream & strm) const
01043     {
01044       PWaitAndSignal m(_mutex);
01045       if (m_info != NULL)
01046         strm << setw(-1) << *m_info;
01047       return strm;
01048     }
01049 
01050     // Backward compatibility
01051     virtual PBoolean IsEmpty() const { PWaitAndSignal m(_mutex); return m_info == NULL || !m_info->IsValid(); }
01052     operator PString() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01053     operator const char *() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01054     bool operator==(const char * other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01055     bool operator!=(const char * other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName != other; }
01056     bool operator==(const PString & other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01057     bool operator!=(const PString & other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName != other; }
01058     bool operator==(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) == EqualTo; }
01059     bool operator!=(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) != EqualTo; }
01060     friend bool operator==(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01061     friend bool operator!=(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName != other; }
01062     friend bool operator==(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01063     friend bool operator!=(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName != other; }
01064 
01065 #if OPAL_H323
01066     static const PString & MediaPacketizationOption();
01067     static const PString & MediaPacketizationsOption();
01068 #endif
01069 
01070   private:
01071     PBoolean SetSize(PINDEX) { return PTrue; }
01072 
01073   protected:
01074     PMutex _mutex;
01075     void Construct(OpalMediaFormatInternal * info);
01076     OpalMediaFormatInternal * m_info;
01077 
01078   friend class OpalMediaFormatInternal;
01079   friend class OpalMediaFormatList;
01080 };
01081 
01082 
01083 class OpalAudioFormatInternal : public OpalMediaFormatInternal
01084 {
01085   public:
01086     OpalAudioFormatInternal(
01087       const char * fullName,
01088       RTP_DataFrame::PayloadTypes rtpPayloadType,
01089       const char * encodingName,
01090       PINDEX   frameSize,
01091       unsigned frameTime,
01092       unsigned rxFrames,
01093       unsigned txFrames,
01094       unsigned maxFrames,
01095       unsigned clockRate,
01096       time_t timeStamp
01097     );
01098     virtual PObject * Clone() const;
01099     virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01100 };
01101 
01102 class OpalAudioFormat : public OpalMediaFormat
01103 {
01104     PCLASSINFO(OpalAudioFormat, OpalMediaFormat);
01105   public:
01106     OpalAudioFormat(
01107       const char * fullName,    
01108       RTP_DataFrame::PayloadTypes rtpPayloadType, 
01109       const char * encodingName,
01110       PINDEX   frameSize,       
01111       unsigned frameTime,       
01112       unsigned rxFrames,        
01113       unsigned txFrames,        
01114       unsigned maxFrames = 256, 
01115       unsigned clockRate = 8000, 
01116       time_t timeStamp = 0       
01117     );
01118 
01119     static const PString & RxFramesPerPacketOption();
01120     static const PString & TxFramesPerPacketOption();
01121     static const PString & MaxFramesPerPacketOption();
01122     static const PString & ChannelsOption();
01123 };
01124 
01125 #if OPAL_VIDEO
01126 class OpalVideoFormatInternal : public OpalMediaFormatInternal
01127 {
01128   public:
01129     OpalVideoFormatInternal(
01130       const char * fullName,
01131       RTP_DataFrame::PayloadTypes rtpPayloadType,
01132       const char * encodingName,
01133       unsigned maxFrameWidth,
01134       unsigned maxFrameHeight,
01135       unsigned maxFrameRate,
01136       unsigned maxBitRate,
01137       time_t timeStamp
01138     );
01139     virtual PObject * Clone() const;
01140     virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01141 };
01142 
01143 
01144 class OpalVideoFormat : public OpalMediaFormat
01145 {
01146     PCLASSINFO(OpalVideoFormat, OpalMediaFormat);
01147   public:
01148     OpalVideoFormat(
01149       const char * fullName,    
01150       RTP_DataFrame::PayloadTypes rtpPayloadType, 
01151       const char * encodingName,
01152       unsigned maxFrameWidth,   
01153       unsigned maxFrameHeight,  
01154       unsigned maxFrameRate,    
01155       unsigned maxBitRate,      
01156       time_t timeStamp = 0      
01157     );
01158 
01159     static const PString & FrameWidthOption();
01160     static const PString & FrameHeightOption();
01161     static const PString & MinRxFrameWidthOption();
01162     static const PString & MinRxFrameHeightOption();
01163     static const PString & MaxRxFrameWidthOption();
01164     static const PString & MaxRxFrameHeightOption();
01165     static const PString & TemporalSpatialTradeOffOption();
01166     static const PString & TxKeyFramePeriodOption();
01167     static const PString & RateControlEnableOption();
01168     static const PString & RateControllerOption();
01169     static const PString & RateControllerBitRateScalerOption();
01170 };
01171 #endif
01172 
01173 // List of known media formats
01174 
01175 #define OPAL_PCM16          "PCM-16"
01176 #define OPAL_PCM16_16KHZ    "PCM-16-16kHz"
01177 #define OPAL_PCM16_32KHZ    "PCM-16-32kHz"
01178 #define OPAL_PCM16_48KHZ    "PCM-16-48kHz"
01179 #define OPAL_L16_MONO_8KHZ  "Linear-16-Mono-8kHz"
01180 #define OPAL_L16_MONO_16KHZ "Linear-16-Mono-16kHz"
01181 #define OPAL_L16_MONO_32KHZ "Linear-16-Mono-32kHz"
01182 #define OPAL_L16_MONO_48KHZ "Linear-16-Mono-48kHz"
01183 #define OPAL_G711_ULAW_64K  "G.711-uLaw-64k"
01184 #define OPAL_G711_ALAW_64K  "G.711-ALaw-64k"
01185 #define OPAL_G722           "G.722"
01186 #define OPAL_G7221          "G.722.1"
01187 #define OPAL_G7222          "G.722.2"
01188 #define OPAL_G726_40K       "G.726-40K"
01189 #define OPAL_G726_32K       "G.726-32K"
01190 #define OPAL_G726_24K       "G.726-24K"
01191 #define OPAL_G726_16K       "G.726-16K"
01192 #define OPAL_G728           "G.728"
01193 #define OPAL_G729           "G.729"
01194 #define OPAL_G729A          "G.729A"
01195 #define OPAL_G729B          "G.729B"
01196 #define OPAL_G729AB         "G.729A/B"
01197 #define OPAL_G7231          "G.723.1"
01198 #define OPAL_G7231_6k3      OPAL_G7231
01199 #define OPAL_G7231_5k3      "G.723.1(5.3k)"
01200 #define OPAL_G7231A_6k3     "G.723.1A(6.3k)"
01201 #define OPAL_G7231A_5k3     "G.723.1A(5.3k)"
01202 #define OPAL_GSM0610        "GSM-06.10"
01203 #define OPAL_GSMAMR         "GSM-AMR"
01204 #define OPAL_iLBC           "iLBC"
01205 #define OPAL_H261           "H.261"
01206 #define OPAL_H263           "H.263"
01207 #define OPAL_H264           "H.264"
01208 #define OPAL_MPEG4          "MPEG4"
01209 #define OPAL_RFC2833        "UserInput/RFC2833"
01210 #define OPAL_CISCONSE       "NamedSignalEvent"
01211 #define OPAL_T38            "T.38"
01212 
01213 extern const OpalAudioFormat & GetOpalPCM16();
01214 extern const OpalAudioFormat & GetOpalPCM16_16KHZ();
01215 extern const OpalAudioFormat & GetOpalPCM16_32KHZ();
01216 extern const OpalAudioFormat & GetOpalPCM16_48KHZ();
01217 extern const OpalAudioFormat & GetOpalL16_MONO_8KHZ();
01218 extern const OpalAudioFormat & GetOpalL16_MONO_16KHZ();
01219 extern const OpalAudioFormat & GetOpalL16_MONO_32KHZ();
01220 extern const OpalAudioFormat & GetOpalL16_MONO_48KHZ();
01221 extern const OpalAudioFormat & GetOpalL16_STEREO_48KHZ();
01222 extern const OpalAudioFormat & GetOpalG711_ULAW_64K();
01223 extern const OpalAudioFormat & GetOpalG711_ALAW_64K();
01224 extern const OpalAudioFormat & GetOpalG722();
01225 extern const OpalAudioFormat & GetOpalG7221();
01226 extern const OpalMediaFormat & GetOpalG7222();
01227 extern const OpalAudioFormat & GetOpalG726_40K();
01228 extern const OpalAudioFormat & GetOpalG726_32K();
01229 extern const OpalAudioFormat & GetOpalG726_24K();
01230 extern const OpalAudioFormat & GetOpalG726_16K();
01231 extern const OpalAudioFormat & GetOpalG728();
01232 extern const OpalAudioFormat & GetOpalG729();
01233 extern const OpalAudioFormat & GetOpalG729A();
01234 extern const OpalAudioFormat & GetOpalG729B();
01235 extern const OpalAudioFormat & GetOpalG729AB();
01236 extern const OpalAudioFormat & GetOpalG7231_6k3();
01237 extern const OpalAudioFormat & GetOpalG7231_5k3();
01238 extern const OpalAudioFormat & GetOpalG7231A_6k3();
01239 extern const OpalAudioFormat & GetOpalG7231A_5k3();
01240 extern const OpalAudioFormat & GetOpalGSM0610();
01241 extern const OpalMediaFormat & GetOpalGSMAMR();
01242 extern const OpalMediaFormat & GetOpaliLBC();
01243 
01244 extern const OpalMediaFormat & GetOpalRFC2833();
01245 
01246 #if OPAL_T38_CAPABILITY
01247 extern const OpalMediaFormat & GetOpalCiscoNSE();
01248 extern const OpalMediaFormat & GetOpalT38();
01249 #endif
01250 
01251 
01252 #define OpalPCM16          GetOpalPCM16()
01253 #define OpalPCM16_16KHZ    GetOpalPCM16_16KHZ()
01254 #define OpalPCM16_32KHZ    GetOpalPCM16_32KHZ()
01255 #define OpalPCM16_48KHZ    GetOpalPCM16_48KHZ()
01256 #define OpalL16_MONO_8KHZ  GetOpalL16_MONO_8KHZ()
01257 #define OpalL16_MONO_16KHZ GetOpalL16_MONO_16KHZ()
01258 #define OpalL16_MONO_32KHZ GetOpalL16_MONO_32KHZ()
01259 #define OpalL16_MONO_48KHZ GetOpalL16_MONO_48KHZ()
01260 #define OpalL16_STEREO_48KHZ GetOpalL16_STEREO_48KHZ()
01261 #define OpalG711_ULAW_64K  GetOpalG711_ULAW_64K()
01262 #define OpalG711_ALAW_64K  GetOpalG711_ALAW_64K()
01263 #define OpalG722           GetOpalG722()
01264 #define OpalG7221          GetOpalG7221()
01265 #define OpalG7222          GetOpalG7222()
01266 #define OpalG726_40K       GetOpalG726_40K()
01267 #define OpalG726_32K       GetOpalG726_32K()
01268 #define OpalG726_24K       GetOpalG726_24K()
01269 #define OpalG726_16K       GetOpalG726_16K()
01270 #define OpalG728           GetOpalG728()
01271 #define OpalG729           GetOpalG729()
01272 #define OpalG729A          GetOpalG729A()
01273 #define OpalG729B          GetOpalG729B()
01274 #define OpalG729AB         GetOpalG729AB()
01275 #define OpalG7231_6k3      GetOpalG7231_6k3()
01276 #define OpalG7231_5k3      GetOpalG7231_5k3()
01277 #define OpalG7231A_6k3     GetOpalG7231A_6k3()
01278 #define OpalG7231A_5k3     GetOpalG7231A_5k3()
01279 #define OpalGSM0610        GetOpalGSM0610()
01280 #define OpalGSMAMR         GetOpalGSMAMR()
01281 #define OpaliLBC           GetOpaliLBC()
01282 #define OpalRFC2833        GetOpalRFC2833()
01283 #define OpalCiscoNSE       GetOpalCiscoNSE()
01284 #define OpalT38            GetOpalT38()
01285 
01286 #define OpalL16Mono8kHz    OpalL16_MONO_8KHZ
01287 #define OpalL16Mono16kHz   OpalL16_MONO_16KHZ
01288 #define OpalG711uLaw       OpalG711_ULAW_64K
01289 #define OpalG711ALaw       OpalG711_ALAW_64K
01290 
01291 #define OPAL_T140             "T.140"
01292 #define OpalT140              GetOpalT140()
01293 extern const OpalMediaFormat & GetOpalT140();
01294 
01295 #if OPAL_HAS_MSRP
01296 #define OPAL_MSRP           "MSRP"
01297 #define OpalMSRP            GetOpalMSRP()
01298 extern const OpalMediaFormat & GetOpalMSRP();
01299 #endif
01300 
01301 #if OPAL_HAS_SIPIM
01302 #define OPAL_SIPIM             "SIP-IM"
01303 #define OpalSIPIM              GetOpalSIPIM()
01304 extern const OpalMediaFormat & GetOpalSIPIM();
01305 #endif
01306 
01307 #ifdef _MSC_VER
01308 #if _MSC_VER < 1300
01309 #pragma warning(default:4663)
01310 #endif
01311 #endif
01312 
01313 #endif  // OPAL_OPAL_MEDIAFMT_H
01314 
01315 
01316 // End of File ///////////////////////////////////////////////////////////////

Generated on Mon Feb 1 00:25:53 2010 for OPAL by  doxygen 1.5.1