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: 22527 $
00028  * $Author: rjongbloed $
00029  * $Date: 2009-05-06 08:58:09 +0000 (Wed, 06 May 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 & generic) { m_H245Generic = generic; }
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     void SetEnumerations(const PStringArray & e)
00450     {
00451       m_enumerations = e;
00452     }
00453 
00454   protected:
00455     PStringArray m_enumerations;
00456     PINDEX       m_value;
00457 };
00458 
00459 
00460 class OpalMediaOptionString : public OpalMediaOption
00461 {
00462     PCLASSINFO(OpalMediaOptionString, OpalMediaOption);
00463   public:
00464     OpalMediaOptionString(
00465       const char * name,
00466       bool readOnly
00467     );
00468     OpalMediaOptionString(
00469       const char * name,
00470       bool readOnly,
00471       const PString & value
00472     );
00473 
00474     virtual PObject * Clone() const;
00475     virtual void PrintOn(ostream & strm) const;
00476     virtual void ReadFrom(istream & strm);
00477 
00478     virtual Comparison CompareValue(const OpalMediaOption & option) const;
00479     virtual void Assign(const OpalMediaOption & option);
00480 
00481     const PString & GetValue() const { return m_value; }
00482     void SetValue(const PString & value);
00483 
00484   protected:
00485     PString m_value;
00486 };
00487 
00488 
00489 class OpalMediaOptionOctets : public OpalMediaOption
00490 {
00491     PCLASSINFO(OpalMediaOptionOctets, OpalMediaOption);
00492   public:
00493     OpalMediaOptionOctets(
00494       const char * name,
00495       bool readOnly,
00496       bool base64 = false
00497     );
00498     OpalMediaOptionOctets(
00499       const char * name,
00500       bool readOnly,
00501       bool base64,
00502       const PBYTEArray & value
00503     );
00504     OpalMediaOptionOctets(
00505       const char * name,
00506       bool readOnly,
00507       bool base64,
00508       const BYTE * data,
00509       PINDEX length
00510     );
00511 
00512     virtual PObject * Clone() const;
00513     virtual void PrintOn(ostream & strm) const;
00514     virtual void ReadFrom(istream & strm);
00515 
00516     virtual Comparison CompareValue(const OpalMediaOption & option) const;
00517     virtual void Assign(const OpalMediaOption & option);
00518 
00519     const PBYTEArray & GetValue() const { return m_value; }
00520     void SetValue(const PBYTEArray & value);
00521     void SetValue(const BYTE * data, PINDEX length);
00522 
00523     void SetBase64(bool b)
00524     {
00525       m_base64 = b;
00526     }
00527 
00528   protected:
00529     PBYTEArray m_value;
00530     bool       m_base64;
00531 };
00532 
00533 
00535 
00536 class OpalMediaFormatInternal : public PObject
00537 {
00538     PCLASSINFO(OpalMediaFormatInternal, PObject);
00539   public:
00540     OpalMediaFormatInternal(
00541       const char * fullName,
00542       const OpalMediaType & mediaType,
00543       RTP_DataFrame::PayloadTypes rtpPayloadType,
00544       const char * encodingName,
00545       PBoolean     needsJitter,
00546       unsigned bandwidth,
00547       PINDEX   frameSize,
00548       unsigned frameTime,
00549       unsigned clockRate,
00550       time_t timeStamp
00551     );
00552 
00553     virtual PObject * Clone() const;
00554     virtual void PrintOn(ostream & strm) const;
00555 
00556     virtual bool IsValid() const;
00557     virtual bool IsTransportable() const;
00558 
00559     virtual PStringToString GetOptions() const;
00560     virtual bool GetOptionValue(const PString & name, PString & value) const;
00561     virtual bool SetOptionValue(const PString & name, const PString & value);
00562     virtual bool GetOptionBoolean(const PString & name, bool dflt) const;
00563     virtual bool SetOptionBoolean(const PString & name, bool value);
00564     virtual int GetOptionInteger(const PString & name, int dflt) const;
00565     virtual bool SetOptionInteger(const PString & name, int value);
00566     virtual double GetOptionReal(const PString & name, double dflt) const;
00567     virtual bool SetOptionReal(const PString & name, double value);
00568     virtual PINDEX GetOptionEnum(const PString & name, PINDEX dflt) const;
00569     virtual bool SetOptionEnum(const PString & name, PINDEX value);
00570     virtual PString GetOptionString(const PString & name, const PString & dflt) const;
00571     virtual bool SetOptionString(const PString & name, const PString & value);
00572     virtual bool GetOptionOctets(const PString & name, PBYTEArray & octets) const;
00573     virtual bool SetOptionOctets(const PString & name, const PBYTEArray & octets);
00574     virtual bool SetOptionOctets(const PString & name, const BYTE * data, PINDEX length);
00575     virtual bool AddOption(OpalMediaOption * option, PBoolean overwrite = PFalse);
00576     virtual OpalMediaOption * FindOption(const PString & name) const;
00577 
00578     virtual bool ToNormalisedOptions();
00579     virtual bool ToCustomisedOptions();
00580     virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
00581     virtual bool IsValidForProtocol(const PString & protocol) const;
00582 
00583   protected:
00584     PCaselessString              formatName;
00585     RTP_DataFrame::PayloadTypes  rtpPayloadType;
00586     PString                      rtpEncodingName;
00587     OpalMediaType                mediaType;
00588     PMutex                       media_format_mutex;
00589     PSortedList<OpalMediaOption> options;
00590     time_t                       codecVersionTime;
00591     bool                         forceIsTransportable;
00592 
00593   friend bool operator==(const char * other, const OpalMediaFormat & fmt);
00594   friend bool operator!=(const char * other, const OpalMediaFormat & fmt);
00595   friend bool operator==(const PString & other, const OpalMediaFormat & fmt);
00596   friend bool operator!=(const PString & other, const OpalMediaFormat & fmt);
00597 
00598   friend class OpalMediaFormat;
00599   friend class OpalMediaFormatList;
00600   friend class OpalAudioFormatInternal;
00601 };
00602 
00603 
00605 
00611 class OpalMediaFormat : public PContainer
00612 {
00613   PCONTAINERINFO(OpalMediaFormat, PContainer);
00614 
00615   public:
00618     OpalMediaFormat(
00619       OpalMediaFormatInternal * info = NULL
00620     );
00621 
00635     OpalMediaFormat(
00636       const char * fullName,                      
00637       const OpalMediaType & mediaType,            
00638       RTP_DataFrame::PayloadTypes rtpPayloadType, 
00639       const char * encodingName,                  
00640       PBoolean     needsJitter,                   
00641       unsigned bandwidth,                         
00642       PINDEX   frameSize,                         
00643       unsigned frameTime,                         
00644       unsigned clockRate,                         
00645       time_t timeStamp = 0                        
00646     );
00647 
00657     OpalMediaFormat(
00658       RTP_DataFrame::PayloadTypes rtpPayloadType, 
00659       unsigned clockRate,                         
00660       const char * rtpEncodingName = NULL,        
00661       const char * protocol = NULL                
00662     );
00663 
00677     OpalMediaFormat(
00678       const char * wildcard  
00679     );
00680 
00694     OpalMediaFormat(
00695       const PString & wildcard  
00696     );
00697     
00701     OpalMediaFormat & operator=(
00702       RTP_DataFrame::PayloadTypes rtpPayloadType 
00703     );
00704 
00708     OpalMediaFormat & operator=(
00709       const char * wildcard  
00710     );
00711 
00715     OpalMediaFormat & operator=(
00716       const PString & wildcard  
00717     );
00718 
00721     virtual PObject * Clone() const;
00722 
00725     virtual Comparison Compare(const PObject & obj) const;
00726 
00731     virtual void PrintOn(ostream & strm) const;
00732 
00735     virtual void ReadFrom(istream & strm);
00736 
00741     bool ToNormalisedOptions();
00742 
00746     bool ToCustomisedOptions();
00747 
00758     bool Merge(
00759       const OpalMediaFormat & mediaFormat
00760     );
00761 
00764     PString GetName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
00765 
00770     PBoolean IsValid() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValid(); }
00771 
00775     PBoolean IsTransportable() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsTransportable(); }
00776 
00782     RTP_DataFrame::PayloadTypes GetPayloadType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? RTP_DataFrame::IllegalPayloadType : m_info->rtpPayloadType; }
00783     void SetPayloadType(RTP_DataFrame::PayloadTypes type) { PWaitAndSignal m(_mutex); MakeUnique(); if (m_info != NULL) m_info->rtpPayloadType = type; }
00784 
00787     const char * GetEncodingName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->rtpEncodingName.GetPointer(); }
00788 
00791     OpalMediaType GetMediaType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? OpalMediaType() : m_info->mediaType; }
00792 
00796     bool NeedsJitterBuffer() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(NeedsJitterOption(), PFalse); }
00797     static const PString & NeedsJitterOption();
00798 
00801     unsigned GetBandwidth() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxBitRateOption(), 0); }
00802     static const PString & MaxBitRateOption();
00803     static const PString & TargetBitRateOption();
00804 
00809     PINDEX GetFrameSize() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxFrameSizeOption(), 0); }
00810     static const PString & MaxFrameSizeOption();
00811 
00815     unsigned GetFrameTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(FrameTimeOption(), 0); }
00816     static const PString & FrameTimeOption();
00817 
00820     unsigned GetTimeUnits() const { return GetClockRate()/1000; }
00821 
00822     enum StandardClockRate {
00823       AudioClockRate = 8000,  
00824       VideoClockRate = 90000  
00825     };
00826 
00829     unsigned GetClockRate() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(ClockRateOption(), 1000); }
00830     static const PString & ClockRateOption();
00831 
00834     static const PString & ProtocolOption();
00835 
00838     static const PString & MaxTxPacketSizeOption();
00839 
00843     PStringToString GetOptions() const { PWaitAndSignal m(_mutex); return m_info == NULL ? PStringToString() : m_info->GetOptions(); }
00844 
00847     PINDEX GetOptionCount() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->options.GetSize(); }
00848 
00852     const OpalMediaOption & GetOption(
00853       PINDEX index   
00854     ) const { PWaitAndSignal m(_mutex); return m_info->options[index]; }
00855 
00860     bool GetOptionValue(
00861       const PString & name,   
00862       PString & value         
00863     ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionValue(name, value); }
00864 
00871     bool SetOptionValue(
00872       const PString & name,   
00873       const PString & value   
00874     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionValue(name, value); }
00875 
00879     bool GetOptionBoolean(
00880       const PString & name,   
00881       bool dflt = PFalse       
00882     ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(name, dflt); }
00883 
00890     bool SetOptionBoolean(
00891       const PString & name,   
00892       bool value              
00893     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionBoolean(name, value); }
00894 
00898     int GetOptionInteger(
00899       const PString & name,   
00900       int dflt = 0            
00901     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionInteger(name, dflt); }
00902 
00910     bool SetOptionInteger(
00911       const PString & name,   
00912       int value               
00913     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionInteger(name, value); }
00914 
00918     double GetOptionReal(
00919       const PString & name,   
00920       double dflt = 0         
00921     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionReal(name, dflt); }
00922 
00929     bool SetOptionReal(
00930       const PString & name,   
00931       double value            
00932     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionReal(name, value); }
00933 
00938     PINDEX GetOptionEnum(
00939       const PString & name,   
00940       PINDEX dflt = 0         
00941     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionEnum(name, dflt); }
00942 
00949     bool SetOptionEnum(
00950       const PString & name,   
00951       PINDEX value            
00952     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionEnum(name, value); }
00953 
00957     PString GetOptionString(
00958       const PString & name,                   
00959       const PString & dflt = PString::Empty() 
00960     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionString(name, dflt); }
00961 
00968     bool SetOptionString(
00969       const PString & name,   
00970       const PString & value   
00971     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionString(name, value); }
00972 
00976     bool GetOptionOctets(
00977       const PString & name, 
00978       PBYTEArray & octets   
00979     ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionOctets(name, octets); }
00980 
00987     bool SetOptionOctets(
00988       const PString & name,       
00989       const PBYTEArray & octets   
00990     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, octets); }
00991     bool SetOptionOctets(
00992       const PString & name,       
00993       const BYTE * data,          
00994       PINDEX length               
00995     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, data, length); }
00996 
00999     static OpalMediaFormatList GetAllRegisteredMediaFormats();
01000     static void GetAllRegisteredMediaFormats(
01001       OpalMediaFormatList & copy    
01002     );
01003 
01007     static bool SetRegisteredMediaFormat(
01008       const OpalMediaFormat & mediaFormat  
01009     );
01010 
01014     bool AddOption(
01015       OpalMediaOption * option,
01016       PBoolean overwrite = PFalse
01017     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->AddOption(option, overwrite); }
01018 
01022     bool HasOption(const PString & name) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->FindOption(name) != NULL; }
01023 
01028     OpalMediaOption * FindOption(
01029       const PString & name
01030     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? NULL : m_info->FindOption(name); }
01031 
01037     bool IsValidForProtocol(const PString & protocol) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValidForProtocol(protocol); }
01038 
01039     time_t GetCodecVersionTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->codecVersionTime; }
01040 
01041     ostream & PrintOptions(ostream & strm) const
01042     {
01043       PWaitAndSignal m(_mutex);
01044       if (m_info != NULL)
01045         strm << setw(-1) << *m_info;
01046       return strm;
01047     }
01048 
01049     // Backward compatibility
01050     virtual PBoolean IsEmpty() const { PWaitAndSignal m(_mutex); return m_info == NULL || !m_info->IsValid(); }
01051     operator PString() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01052     operator const char *() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01053     bool operator==(const char * other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01054     bool operator!=(const char * other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName != other; }
01055     bool operator==(const PString & 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 OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) == EqualTo; }
01058     bool operator!=(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) != EqualTo; }
01059     friend bool operator==(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
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 PString & 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 
01064 #if OPAL_H323
01065     static const PString & MediaPacketizationOption();
01066     static const PString & MediaPacketizationsOption();
01067 #endif
01068 
01069   private:
01070     PBoolean SetSize(PINDEX) { return PTrue; }
01071 
01072   protected:
01073     PMutex _mutex;
01074     void Construct(OpalMediaFormatInternal * info);
01075     OpalMediaFormatInternal * m_info;
01076 
01077   friend class OpalMediaFormatInternal;
01078   friend class OpalMediaFormatList;
01079 };
01080 
01081 
01082 class OpalAudioFormatInternal : public OpalMediaFormatInternal
01083 {
01084   public:
01085     OpalAudioFormatInternal(
01086       const char * fullName,
01087       RTP_DataFrame::PayloadTypes rtpPayloadType,
01088       const char * encodingName,
01089       PINDEX   frameSize,
01090       unsigned frameTime,
01091       unsigned rxFrames,
01092       unsigned txFrames,
01093       unsigned maxFrames,
01094       unsigned clockRate,
01095       time_t timeStamp
01096     );
01097     virtual PObject * Clone() const;
01098     virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01099 };
01100 
01101 class OpalAudioFormat : public OpalMediaFormat
01102 {
01103     PCLASSINFO(OpalAudioFormat, OpalMediaFormat);
01104   public:
01105     OpalAudioFormat(
01106       const char * fullName,    
01107       RTP_DataFrame::PayloadTypes rtpPayloadType, 
01108       const char * encodingName,
01109       PINDEX   frameSize,       
01110       unsigned frameTime,       
01111       unsigned rxFrames,        
01112       unsigned txFrames,        
01113       unsigned maxFrames = 256, 
01114       unsigned clockRate = 8000, 
01115       time_t timeStamp = 0       
01116     );
01117 
01118     static const PString & RxFramesPerPacketOption();
01119     static const PString & TxFramesPerPacketOption();
01120     static const PString & MaxFramesPerPacketOption();
01121     static const PString & ChannelsOption();
01122 };
01123 
01124 #if OPAL_VIDEO
01125 class OpalVideoFormatInternal : public OpalMediaFormatInternal
01126 {
01127   public:
01128     OpalVideoFormatInternal(
01129       const char * fullName,
01130       RTP_DataFrame::PayloadTypes rtpPayloadType,
01131       const char * encodingName,
01132       unsigned maxFrameWidth,
01133       unsigned maxFrameHeight,
01134       unsigned maxFrameRate,
01135       unsigned maxBitRate,
01136       time_t timeStamp
01137     );
01138     virtual PObject * Clone() const;
01139     virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01140 };
01141 
01142 
01143 class OpalVideoFormat : public OpalMediaFormat
01144 {
01145     PCLASSINFO(OpalVideoFormat, OpalMediaFormat);
01146   public:
01147     OpalVideoFormat(
01148       const char * fullName,    
01149       RTP_DataFrame::PayloadTypes rtpPayloadType, 
01150       const char * encodingName,
01151       unsigned maxFrameWidth,   
01152       unsigned maxFrameHeight,  
01153       unsigned maxFrameRate,    
01154       unsigned maxBitRate,      
01155       time_t timeStamp = 0      
01156     );
01157 
01158     static const PString & FrameWidthOption();
01159     static const PString & FrameHeightOption();
01160     static const PString & MinRxFrameWidthOption();
01161     static const PString & MinRxFrameHeightOption();
01162     static const PString & MaxRxFrameWidthOption();
01163     static const PString & MaxRxFrameHeightOption();
01164     static const PString & TemporalSpatialTradeOffOption();
01165     static const PString & TxKeyFramePeriodOption();
01166     static const PString & RateControlEnableOption();
01167     static const PString & RateControllerOption();
01168     static const PString & RateControllerBitRateScalerOption();
01169 };
01170 #endif
01171 
01172 // List of known media formats
01173 
01174 #define OPAL_PCM16          "PCM-16"
01175 #define OPAL_PCM16_16KHZ    "PCM-16-16kHz"
01176 #define OPAL_PCM16_32KHZ    "PCM-16-32kHz"
01177 #define OPAL_PCM16_48KHZ    "PCM-16-48kHz"
01178 #define OPAL_L16_MONO_8KHZ  "Linear-16-Mono-8kHz"
01179 #define OPAL_L16_MONO_16KHZ "Linear-16-Mono-16kHz"
01180 #define OPAL_L16_MONO_32KHZ "Linear-16-Mono-32kHz"
01181 #define OPAL_L16_MONO_48KHZ "Linear-16-Mono-48kHz"
01182 #define OPAL_G711_ULAW_64K  "G.711-uLaw-64k"
01183 #define OPAL_G711_ALAW_64K  "G.711-ALaw-64k"
01184 #define OPAL_G722           "G.722"
01185 #define OPAL_G7221          "G.722.1"
01186 #define OPAL_G7222          "G.722.2"
01187 #define OPAL_G726_40K       "G.726-40K"
01188 #define OPAL_G726_32K       "G.726-32K"
01189 #define OPAL_G726_24K       "G.726-24K"
01190 #define OPAL_G726_16K       "G.726-16K"
01191 #define OPAL_G728           "G.728"
01192 #define OPAL_G729           "G.729"
01193 #define OPAL_G729A          "G.729A"
01194 #define OPAL_G729B          "G.729B"
01195 #define OPAL_G729AB         "G.729A/B"
01196 #define OPAL_G7231          "G.723.1"
01197 #define OPAL_G7231_6k3      OPAL_G7231
01198 #define OPAL_G7231_5k3      "G.723.1(5.3k)"
01199 #define OPAL_G7231A_6k3     "G.723.1A(6.3k)"
01200 #define OPAL_G7231A_5k3     "G.723.1A(5.3k)"
01201 #define OPAL_GSM0610        "GSM-06.10"
01202 #define OPAL_GSMAMR         "GSM-AMR"
01203 #define OPAL_iLBC           "iLBC"
01204 #define OPAL_H261           "H.261"
01205 #define OPAL_H263           "H.263"
01206 #define OPAL_H264           "H.264"
01207 #define OPAL_MPEG4          "MPEG4"
01208 #define OPAL_RFC2833        "UserInput/RFC2833"
01209 #define OPAL_CISCONSE       "NamedSignalEvent"
01210 #define OPAL_T38            "T.38"
01211 
01212 extern const OpalAudioFormat & GetOpalPCM16();
01213 extern const OpalAudioFormat & GetOpalPCM16_16KHZ();
01214 extern const OpalAudioFormat & GetOpalPCM16_32KHZ();
01215 extern const OpalAudioFormat & GetOpalPCM16_48KHZ();
01216 extern const OpalAudioFormat & GetOpalL16_MONO_8KHZ();
01217 extern const OpalAudioFormat & GetOpalL16_MONO_16KHZ();
01218 extern const OpalAudioFormat & GetOpalL16_MONO_32KHZ();
01219 extern const OpalAudioFormat & GetOpalL16_MONO_48KHZ();
01220 extern const OpalAudioFormat & GetOpalL16_STEREO_48KHZ();
01221 extern const OpalAudioFormat & GetOpalG711_ULAW_64K();
01222 extern const OpalAudioFormat & GetOpalG711_ALAW_64K();
01223 extern const OpalAudioFormat & GetOpalG722();
01224 extern const OpalAudioFormat & GetOpalG7221();
01225 extern const OpalMediaFormat & GetOpalG7222();
01226 extern const OpalAudioFormat & GetOpalG726_40K();
01227 extern const OpalAudioFormat & GetOpalG726_32K();
01228 extern const OpalAudioFormat & GetOpalG726_24K();
01229 extern const OpalAudioFormat & GetOpalG726_16K();
01230 extern const OpalAudioFormat & GetOpalG728();
01231 extern const OpalAudioFormat & GetOpalG729();
01232 extern const OpalAudioFormat & GetOpalG729A();
01233 extern const OpalAudioFormat & GetOpalG729B();
01234 extern const OpalAudioFormat & GetOpalG729AB();
01235 extern const OpalAudioFormat & GetOpalG7231_6k3();
01236 extern const OpalAudioFormat & GetOpalG7231_5k3();
01237 extern const OpalAudioFormat & GetOpalG7231A_6k3();
01238 extern const OpalAudioFormat & GetOpalG7231A_5k3();
01239 extern const OpalAudioFormat & GetOpalGSM0610();
01240 extern const OpalMediaFormat & GetOpalGSMAMR();
01241 extern const OpalMediaFormat & GetOpaliLBC();
01242 
01243 extern const OpalMediaFormat & GetOpalRFC2833();
01244 
01245 #if OPAL_T38_CAPABILITY
01246 extern const OpalMediaFormat & GetOpalCiscoNSE();
01247 extern const OpalMediaFormat & GetOpalT38();
01248 #endif
01249 
01250 
01251 #define OpalPCM16          GetOpalPCM16()
01252 #define OpalPCM16_16KHZ    GetOpalPCM16_16KHZ()
01253 #define OpalPCM16_32KHZ    GetOpalPCM16_32KHZ()
01254 #define OpalPCM16_48KHZ    GetOpalPCM16_48KHZ()
01255 #define OpalL16_MONO_8KHZ  GetOpalL16_MONO_8KHZ()
01256 #define OpalL16_MONO_16KHZ GetOpalL16_MONO_16KHZ()
01257 #define OpalL16_MONO_32KHZ GetOpalL16_MONO_32KHZ()
01258 #define OpalL16_MONO_48KHZ GetOpalL16_MONO_48KHZ()
01259 #define OpalL16_STEREO_48KHZ GetOpalL16_STEREO_48KHZ()
01260 #define OpalG711_ULAW_64K  GetOpalG711_ULAW_64K()
01261 #define OpalG711_ALAW_64K  GetOpalG711_ALAW_64K()
01262 #define OpalG722           GetOpalG722()
01263 #define OpalG7221          GetOpalG7221()
01264 #define OpalG7222          GetOpalG7222()
01265 #define OpalG726_40K       GetOpalG726_40K()
01266 #define OpalG726_32K       GetOpalG726_32K()
01267 #define OpalG726_24K       GetOpalG726_24K()
01268 #define OpalG726_16K       GetOpalG726_16K()
01269 #define OpalG728           GetOpalG728()
01270 #define OpalG729           GetOpalG729()
01271 #define OpalG729A          GetOpalG729A()
01272 #define OpalG729B          GetOpalG729B()
01273 #define OpalG729AB         GetOpalG729AB()
01274 #define OpalG7231_6k3      GetOpalG7231_6k3()
01275 #define OpalG7231_5k3      GetOpalG7231_5k3()
01276 #define OpalG7231A_6k3     GetOpalG7231A_6k3()
01277 #define OpalG7231A_5k3     GetOpalG7231A_5k3()
01278 #define OpalGSM0610        GetOpalGSM0610()
01279 #define OpalGSMAMR         GetOpalGSMAMR()
01280 #define OpaliLBC           GetOpaliLBC()
01281 #define OpalRFC2833        GetOpalRFC2833()
01282 #define OpalCiscoNSE       GetOpalCiscoNSE()
01283 #define OpalT38            GetOpalT38()
01284 
01285 #define OpalL16Mono8kHz    OpalL16_MONO_8KHZ
01286 #define OpalL16Mono16kHz   OpalL16_MONO_16KHZ
01287 #define OpalG711uLaw       OpalG711_ULAW_64K
01288 #define OpalG711ALaw       OpalG711_ALAW_64K
01289 
01290 #define OPAL_T140             "T.140"
01291 #define OpalT140              GetOpalT140()
01292 extern const OpalMediaFormat & GetOpalT140();
01293 
01294 #if OPAL_HAS_MSRP
01295 #define OPAL_MSRP           "MSRP"
01296 #define OpalMSRP            GetOpalMSRP()
01297 extern const OpalMediaFormat & GetOpalMSRP();
01298 #endif
01299 
01300 #if OPAL_HAS_SIPIM
01301 #define OPAL_SIPIM             "SIP-IM"
01302 #define OpalSIPIM              GetOpalSIPIM()
01303 extern const OpalMediaFormat & GetOpalSIPIM();
01304 #endif
01305 
01306 #ifdef _MSC_VER
01307 #if _MSC_VER < 1300
01308 #pragma warning(default:4663)
01309 #endif
01310 #endif
01311 
01312 #endif  // OPAL_OPAL_MEDIAFMT_H
01313 
01314 
01315 // End of File ///////////////////////////////////////////////////////////////

Generated on Tue May 19 09:56:26 2009 for OPAL by  doxygen 1.5.1