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: 19522 $
00028  * $Author: rjongbloed $
00029  * $Date: 2008-02-15 11:37:24 +0000 (Fri, 15 Feb 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 
00047 #include <rtp/rtp.h>
00048 
00049 #include <limits>
00050 
00051 #ifdef min
00052 #undef min
00053 #endif
00054 #ifdef max
00055 #undef max
00056 #endif
00057 
00058 class OpalMediaFormat;
00059 
00060 
00062 
00063 PLIST(OpalMediaFormatBaseList, OpalMediaFormat);
00064 
00067 class OpalMediaFormatList : public OpalMediaFormatBaseList
00068 {
00069   PCLASSINFO(OpalMediaFormatList, OpalMediaFormatBaseList);
00070   public:
00075     OpalMediaFormatList();
00076 
00079     OpalMediaFormatList(
00080       const OpalMediaFormat & format    
00081     );
00082 
00085     OpalMediaFormatList(const OpalMediaFormatList & l) : OpalMediaFormatBaseList(l) { }
00087 
00093     OpalMediaFormatList & operator+=(
00094       const OpalMediaFormat & format    
00095     );
00096 
00100     OpalMediaFormatList & operator+=(
00101       const OpalMediaFormatList & formats    
00102     );
00103 
00107     OpalMediaFormatList & operator-=(
00108       const OpalMediaFormat & format    
00109     );
00110 
00114     OpalMediaFormatList & operator-=(
00115       const OpalMediaFormatList & formats    
00116     );
00117 
00122     const_iterator FindFormat(
00123       RTP_DataFrame::PayloadTypes rtpPayloadType, 
00124       const unsigned clockRate,                   
00125       const char * rtpEncodingName = NULL,        
00126       const char * protocol = NULL                
00127     ) const;
00128 
00136     const_iterator FindFormat(
00137       const PString & wildcard,    
00138       const_iterator start = const_iterator()
00139     ) const;
00140 
00143     PBoolean HasFormat(
00144       RTP_DataFrame::PayloadTypes rtpPayloadType 
00145     ) const { return FindFormat(rtpPayloadType) != end(); }
00146 
00152     PBoolean HasFormat(
00153       const PString & wildcard    
00154     ) const { return FindFormat(wildcard) != end(); }
00155 
00158     void Remove(
00159       const PStringArray & mask
00160     );
00161 
00166     void Reorder(
00167       const PStringArray & order
00168     );
00170 
00171   private:
00172     virtual PINDEX Append(PObject *) { return P_MAX_INDEX; }
00173     virtual PINDEX Insert(const PObject &, PObject *) { return P_MAX_INDEX; }
00174     virtual PINDEX InsertAt(PINDEX, PObject *) { return P_MAX_INDEX; }
00175     virtual PBoolean SetAt(PINDEX, PObject *) { return PFalse; }
00176 };
00177 
00178 
00180 
00183 class OpalMediaOption : public PObject
00184 {
00185     PCLASSINFO(OpalMediaOption, PObject);
00186   public:
00187     enum MergeType {
00188       NoMerge,
00189       MinMerge,
00190       MaxMerge,
00191       EqualMerge,
00192       NotEqualMerge,
00193       AlwaysMerge,
00194 
00195       // Synonyms
00196       AndMerge = MinMerge,
00197       OrMerge  = MaxMerge
00198     };
00199 
00200   protected:
00201     OpalMediaOption(
00202       const PString & name
00203     );
00204     OpalMediaOption(
00205       const char * name,
00206       bool readOnly,
00207       MergeType merge
00208     );
00209 
00210   public:
00211     virtual Comparison Compare(const PObject & obj) const;
00212 
00213     virtual bool Merge(
00214       const OpalMediaOption & option
00215     );
00216     virtual Comparison CompareValue(
00217       const OpalMediaOption & option
00218     ) const = 0;
00219     virtual void Assign(
00220       const OpalMediaOption & option
00221     ) = 0;
00222 
00223     PString AsString() const;
00224     bool FromString(const PString & value);
00225 
00226     const PString & GetName() const { return m_name; }
00227 
00228     bool IsReadOnly() const { return m_readOnly; }
00229     void SetReadOnly(bool readOnly) { m_readOnly = readOnly; }
00230 
00231     MergeType GetMerge() const { return m_merge; }
00232     void SetMerge(MergeType merge) { m_merge = merge; }
00233 
00234 #if OPAL_SIP
00235     const PString & GetFMTPName() const { return m_FMTPName; }
00236     void SetFMTPName(const char * name) { m_FMTPName = name; }
00237 
00238     const PString & GetFMTPDefault() const { return m_FMTPDefault; }
00239     void SetFMTPDefault(const char * value) { m_FMTPDefault = value; }
00240 #endif // OPAL_SIP
00241 
00242 #if OPAL_H323
00243     struct H245GenericInfo {
00244       H245GenericInfo() { memset(this, 0, sizeof(*this)); }
00245       unsigned ordinal:16;
00246       enum Modes {
00247         None,
00248         Collapsing,
00249         NonCollapsing
00250       } mode:3;
00251       enum IntegerTypes {
00252         UnsignedInt,
00253         Unsigned32,
00254         BooleanArray
00255       } integerType:3;
00256       bool excludeTCS:1;
00257       bool excludeOLC:1;
00258       bool excludeReqMode:1;
00259     };
00260 
00261     const H245GenericInfo & GetH245Generic() const { return m_H245Generic; }
00262     void SetH245Generic(const H245GenericInfo & generic) { m_H245Generic = generic; }
00263 #endif // OPAL_H323
00264 
00265   protected:
00266     PCaselessString m_name;
00267     bool            m_readOnly;
00268     MergeType       m_merge;
00269 
00270 #if OPAL_SIP
00271     PCaselessString m_FMTPName;
00272     PString         m_FMTPDefault;
00273 #endif // OPAL_SIP
00274 
00275 #if OPAL_H323
00276     H245GenericInfo m_H245Generic;
00277 #endif // OPAL_H323
00278 };
00279 
00280 #ifndef __USE_STL__
00281 __inline istream & operator>>(istream & strm, bool& b)
00282 {
00283    int i;strm >> i;b = i; return strm;
00284 }
00285 #endif
00286 
00287 template <typename T>
00288 class OpalMediaOptionValue : public OpalMediaOption
00289 {
00290     PCLASSINFO(OpalMediaOptionValue, OpalMediaOption);
00291   public:
00292     OpalMediaOptionValue(
00293       const char * name,
00294       bool readOnly,
00295       MergeType merge = MinMerge,
00296       T value = 0,
00297       T minimum = std::numeric_limits<T>::min(),
00298       T maximum = std::numeric_limits<T>::max()
00299     ) : OpalMediaOption(name, readOnly, merge),
00300         m_value(value),
00301         m_minimum(minimum),
00302         m_maximum(maximum)
00303     { }
00304 
00305     virtual PObject * Clone() const
00306     {
00307       return new OpalMediaOptionValue(*this);
00308     }
00309 
00310     virtual void PrintOn(ostream & strm) const
00311     {
00312       strm << m_value;
00313     }
00314 
00315     virtual void ReadFrom(istream & strm)
00316     {
00317       T temp;
00318       strm >> temp;
00319       if (temp >= m_minimum && temp <= m_maximum)
00320         m_value = temp;
00321       else {
00322 #ifdef __USE_STL__
00323            strm.setstate(ios::badbit);
00324 #else
00325            strm.setf(ios::badbit , ios::badbit);
00326 #endif
00327        }
00328     }
00329 
00330     virtual Comparison CompareValue(const OpalMediaOption & option) const
00331     {
00332       const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00333       if (otherOption == NULL)
00334         return GreaterThan;
00335       if (m_value < otherOption->m_value)
00336         return LessThan;
00337       if (m_value > otherOption->m_value)
00338         return GreaterThan;
00339       return EqualTo;
00340     }
00341 
00342     virtual void Assign(
00343       const OpalMediaOption & option
00344     ) {
00345       const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00346       if (otherOption != NULL)
00347         m_value = otherOption->m_value;
00348     }
00349 
00350     T GetValue() const
00351     {
00352       return m_value;
00353     }
00354 
00355     void SetValue(T value)
00356     {
00357       if (value < m_minimum)
00358         m_value = m_minimum;
00359       else if (value > m_maximum)
00360         m_value = m_maximum;
00361       else
00362         m_value = value;
00363     }
00364 
00365     void SetMinimum(T m)
00366     {
00367       m_minimum = m;
00368     }
00369 
00370     void SetMaximum(T m)
00371     {
00372       m_maximum = m;
00373     }
00374 
00375   protected:
00376     T m_value;
00377     T m_minimum;
00378     T m_maximum;
00379 };
00380 
00381 
00382 typedef OpalMediaOptionValue<bool>     OpalMediaOptionBoolean;
00383 typedef OpalMediaOptionValue<int>      OpalMediaOptionInteger;
00384 typedef OpalMediaOptionValue<unsigned> OpalMediaOptionUnsigned;
00385 typedef OpalMediaOptionValue<double>   OpalMediaOptionReal;
00386 
00387 
00388 class OpalMediaOptionEnum : public OpalMediaOption
00389 {
00390     PCLASSINFO(OpalMediaOptionEnum, OpalMediaOption);
00391   public:
00392     OpalMediaOptionEnum(
00393       const char * name,
00394       bool readOnly
00395     );
00396     OpalMediaOptionEnum(
00397       const char * name,
00398       bool readOnly,
00399       const char * const * enumerations,
00400       PINDEX count,
00401       MergeType merge = EqualMerge,
00402       PINDEX value = 0
00403     );
00404 
00405     virtual PObject * Clone() const;
00406     virtual void PrintOn(ostream & strm) const;
00407     virtual void ReadFrom(istream & strm);
00408 
00409     virtual Comparison CompareValue(const OpalMediaOption & option) const;
00410     virtual void Assign(const OpalMediaOption & option);
00411 
00412     PINDEX GetValue() const { return m_value; }
00413     void SetValue(PINDEX value);
00414 
00415     void SetEnumerations(const PStringArray & e)
00416     {
00417       m_enumerations = e;
00418     }
00419 
00420   protected:
00421     PStringArray m_enumerations;
00422     PINDEX       m_value;
00423 };
00424 
00425 
00426 class OpalMediaOptionString : public OpalMediaOption
00427 {
00428     PCLASSINFO(OpalMediaOptionString, OpalMediaOption);
00429   public:
00430     OpalMediaOptionString(
00431       const char * name,
00432       bool readOnly
00433     );
00434     OpalMediaOptionString(
00435       const char * name,
00436       bool readOnly,
00437       const PString & value
00438     );
00439 
00440     virtual PObject * Clone() const;
00441     virtual void PrintOn(ostream & strm) const;
00442     virtual void ReadFrom(istream & strm);
00443 
00444     virtual Comparison CompareValue(const OpalMediaOption & option) const;
00445     virtual void Assign(const OpalMediaOption & option);
00446 
00447     const PString & GetValue() const { return m_value; }
00448     void SetValue(const PString & value);
00449 
00450   protected:
00451     PString m_value;
00452 };
00453 
00454 
00455 class OpalMediaOptionOctets : public OpalMediaOption
00456 {
00457     PCLASSINFO(OpalMediaOptionOctets, OpalMediaOption);
00458   public:
00459     OpalMediaOptionOctets(
00460       const char * name,
00461       bool readOnly,
00462       bool base64 = false
00463     );
00464     OpalMediaOptionOctets(
00465       const char * name,
00466       bool readOnly,
00467       bool base64,
00468       const PBYTEArray & value
00469     );
00470     OpalMediaOptionOctets(
00471       const char * name,
00472       bool readOnly,
00473       bool base64,
00474       const BYTE * data,
00475       PINDEX length
00476     );
00477 
00478     virtual PObject * Clone() const;
00479     virtual void PrintOn(ostream & strm) const;
00480     virtual void ReadFrom(istream & strm);
00481 
00482     virtual Comparison CompareValue(const OpalMediaOption & option) const;
00483     virtual void Assign(const OpalMediaOption & option);
00484 
00485     const PBYTEArray & GetValue() const { return m_value; }
00486     void SetValue(const PBYTEArray & value);
00487     void SetValue(const BYTE * data, PINDEX length);
00488 
00489     void SetBase64(bool b)
00490     {
00491       m_base64 = b;
00492     }
00493 
00494   protected:
00495     PBYTEArray m_value;
00496     bool       m_base64;
00497 };
00498 
00499 
00501 
00502 class OpalMediaFormatInternal : public PObject
00503 {
00504     PCLASSINFO(OpalMediaFormatInternal, PObject);
00505   public:
00506     OpalMediaFormatInternal(
00507       const char * fullName,
00508       unsigned defaultSessionID,
00509       RTP_DataFrame::PayloadTypes rtpPayloadType,
00510       const char * encodingName,
00511       PBoolean     needsJitter,
00512       unsigned bandwidth,
00513       PINDEX   frameSize,
00514       unsigned frameTime,
00515       unsigned clockRate,
00516       time_t timeStamp
00517     );
00518 
00519     virtual PObject * Clone() const;
00520     virtual void PrintOn(ostream & strm) const;
00521 
00522     virtual PBoolean IsValid() const { return rtpPayloadType < RTP_DataFrame::IllegalPayloadType && !formatName.IsEmpty(); }
00523     virtual PBoolean IsTransportable() const { return rtpPayloadType < RTP_DataFrame::MaxPayloadType && !rtpEncodingName.IsEmpty(); }
00524 
00525     virtual PStringToString GetOptions() const;
00526     virtual bool GetOptionValue(const PString & name, PString & value) const;
00527     virtual bool SetOptionValue(const PString & name, const PString & value);
00528     virtual bool GetOptionBoolean(const PString & name, bool dflt) const;
00529     virtual bool SetOptionBoolean(const PString & name, bool value);
00530     virtual int GetOptionInteger(const PString & name, int dflt) const;
00531     virtual bool SetOptionInteger(const PString & name, int value);
00532     virtual double GetOptionReal(const PString & name, double dflt) const;
00533     virtual bool SetOptionReal(const PString & name, double value);
00534     virtual PINDEX GetOptionEnum(const PString & name, PINDEX dflt) const;
00535     virtual bool SetOptionEnum(const PString & name, PINDEX value);
00536     virtual PString GetOptionString(const PString & name, const PString & dflt) const;
00537     virtual bool SetOptionString(const PString & name, const PString & value);
00538     virtual bool GetOptionOctets(const PString & name, PBYTEArray & octets) const;
00539     virtual bool SetOptionOctets(const PString & name, const PBYTEArray & octets);
00540     virtual bool SetOptionOctets(const PString & name, const BYTE * data, PINDEX length);
00541     virtual bool AddOption(OpalMediaOption * option, PBoolean overwrite = PFalse);
00542     virtual OpalMediaOption * FindOption(const PString & name) const;
00543 
00544     virtual bool ToNormalisedOptions();
00545     virtual bool ToCustomisedOptions();
00546     virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
00547     virtual bool IsValidForProtocol(const PString & protocol) const;
00548 
00549   protected:
00550     PCaselessString              formatName;
00551     RTP_DataFrame::PayloadTypes  rtpPayloadType;
00552     PString                      rtpEncodingName;
00553     unsigned                     defaultSessionID;
00554     PMutex                       media_format_mutex;
00555     PSortedList<OpalMediaOption> options;
00556     time_t                       codecVersionTime;
00557 
00558   friend bool operator==(const char * other, const OpalMediaFormat & fmt);
00559   friend bool operator!=(const char * other, const OpalMediaFormat & fmt);
00560   friend bool operator==(const PString & other, const OpalMediaFormat & fmt);
00561   friend bool operator!=(const PString & other, const OpalMediaFormat & fmt);
00562 
00563   friend class OpalMediaFormat;
00564   friend class OpalMediaFormatList;
00565   friend class OpalAudioFormatInternal;
00566 };
00567 
00568 
00570 
00576 class OpalMediaFormat : public PContainer
00577 {
00578   PCONTAINERINFO(OpalMediaFormat, PContainer);
00579 
00580   public:
00583     OpalMediaFormat(
00584       OpalMediaFormatInternal * info = NULL
00585     );
00586 
00600     OpalMediaFormat(
00601       const char * fullName,      
00602       unsigned defaultSessionID,  
00603       RTP_DataFrame::PayloadTypes rtpPayloadType, 
00604       const char * encodingName,  
00605       PBoolean     needsJitter,       
00606       unsigned bandwidth,         
00607       PINDEX   frameSize,         
00608       unsigned frameTime,         
00609       unsigned clockRate,         
00610       time_t timeStamp = 0        
00611     );
00612 
00622     OpalMediaFormat(
00623       RTP_DataFrame::PayloadTypes rtpPayloadType, 
00624       unsigned clockRate,                         
00625       const char * rtpEncodingName = NULL,        
00626       const char * protocol = NULL                
00627     );
00628 
00642     OpalMediaFormat(
00643       const char * wildcard  
00644     );
00645 
00659     OpalMediaFormat(
00660       const PString & wildcard  
00661     );
00662     
00666     OpalMediaFormat & operator=(
00667       RTP_DataFrame::PayloadTypes rtpPayloadType 
00668     );
00669 
00673     OpalMediaFormat & operator=(
00674       const char * wildcard  
00675     );
00676 
00680     OpalMediaFormat & operator=(
00681       const PString & wildcard  
00682     );
00683 
00686     virtual PObject * Clone() const;
00687 
00690     virtual Comparison Compare(const PObject & obj) const;
00691 
00696     virtual void PrintOn(ostream & strm) const;
00697 
00700     virtual void ReadFrom(istream & strm);
00701 
00706     bool ToNormalisedOptions();
00707 
00711     bool ToCustomisedOptions();
00712 
00723     bool Merge(
00724       const OpalMediaFormat & mediaFormat
00725     );
00726 
00729     PString GetName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
00730 
00735     PBoolean IsValid() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValid(); }
00736 
00740     PBoolean IsTransportable() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsTransportable(); }
00741 
00747     RTP_DataFrame::PayloadTypes GetPayloadType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? RTP_DataFrame::IllegalPayloadType : m_info->rtpPayloadType; }
00748     void SetPayloadType(RTP_DataFrame::PayloadTypes type) { PWaitAndSignal m(_mutex); if (m_info != NULL && MakeUnique()) m_info->rtpPayloadType = type; }
00749 
00752     const char * GetEncodingName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->rtpEncodingName; }
00753 
00754     enum {
00755       DefaultAudioSessionID = 1,
00756       DefaultVideoSessionID = 2,
00757       DefaultDataSessionID  = 3,
00758       DefaultH224SessionID  = 4
00759     };
00760 
00763     unsigned GetDefaultSessionID() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->defaultSessionID; }
00764 
00768     bool NeedsJitterBuffer() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(NeedsJitterOption(), PFalse); }
00769     static const PString & NeedsJitterOption();
00770 
00773     unsigned GetBandwidth() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxBitRateOption(), 0); }
00774     static const PString & MaxBitRateOption();
00775     static const PString & TargetBitRateOption();
00776 
00781     PINDEX GetFrameSize() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxFrameSizeOption(), 0); }
00782     static const PString & MaxFrameSizeOption();
00783 
00787     unsigned GetFrameTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(FrameTimeOption(), 0); }
00788     static const PString & FrameTimeOption();
00789 
00792     unsigned GetTimeUnits() const { return GetClockRate()/1000; }
00793 
00794     enum StandardClockRate {
00795       AudioClockRate = 8000,  
00796       VideoClockRate = 90000  
00797     };
00798 
00801     unsigned GetClockRate() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(ClockRateOption(), 1000); }
00802     static const PString & ClockRateOption();
00803 
00807     PStringToString GetOptions() const { PWaitAndSignal m(_mutex); return m_info == NULL ? PStringToString() : m_info->GetOptions(); }
00808 
00811     PINDEX GetOptionCount() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->options.GetSize(); }
00812 
00816     const OpalMediaOption & GetOption(
00817       PINDEX index   
00818     ) const { PWaitAndSignal m(_mutex); return m_info->options[index]; }
00819 
00824     bool GetOptionValue(
00825       const PString & name,   
00826       PString & value         
00827     ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionValue(name, value); }
00828 
00835     bool SetOptionValue(
00836       const PString & name,   
00837       const PString & value   
00838     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionValue(name, value); }
00839 
00843     bool GetOptionBoolean(
00844       const PString & name,   
00845       bool dflt = PFalse       
00846     ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(name, dflt); }
00847 
00854     bool SetOptionBoolean(
00855       const PString & name,   
00856       bool value              
00857     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionBoolean(name, value); }
00858 
00862     int GetOptionInteger(
00863       const PString & name,   
00864       int dflt = 0            
00865     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionInteger(name, dflt); }
00866 
00874     bool SetOptionInteger(
00875       const PString & name,   
00876       int value               
00877     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionInteger(name, value); }
00878 
00882     double GetOptionReal(
00883       const PString & name,   
00884       double dflt = 0         
00885     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionReal(name, dflt); }
00886 
00893     bool SetOptionReal(
00894       const PString & name,   
00895       double value            
00896     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionReal(name, value); }
00897 
00902     PINDEX GetOptionEnum(
00903       const PString & name,   
00904       PINDEX dflt = 0         
00905     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionEnum(name, dflt); }
00906 
00913     bool SetOptionEnum(
00914       const PString & name,   
00915       PINDEX value            
00916     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionEnum(name, value); }
00917 
00921     PString GetOptionString(
00922       const PString & name,                   
00923       const PString & dflt = PString::Empty() 
00924     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionString(name, dflt); }
00925 
00932     bool SetOptionString(
00933       const PString & name,   
00934       const PString & value   
00935     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionString(name, value); }
00936 
00940     bool GetOptionOctets(
00941       const PString & name, 
00942       PBYTEArray & octets   
00943     ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionOctets(name, octets); }
00944 
00951     bool SetOptionOctets(
00952       const PString & name,       
00953       const PBYTEArray & octets   
00954     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, octets); }
00955     bool SetOptionOctets(
00956       const PString & name,       
00957       const BYTE * data,          
00958       PINDEX length               
00959     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, data, length); }
00960 
00963     static OpalMediaFormatList GetAllRegisteredMediaFormats();
00964     static void GetAllRegisteredMediaFormats(
00965       OpalMediaFormatList & copy    
00966     );
00967 
00971     static bool SetRegisteredMediaFormat(
00972       const OpalMediaFormat & mediaFormat  
00973     );
00974 
00978     bool AddOption(
00979       OpalMediaOption * option,
00980       PBoolean overwrite = PFalse
00981     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->AddOption(option, overwrite); }
00982 
00986     bool HasOption(const PString & name) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->FindOption(name) != NULL; }
00987 
00992     OpalMediaOption * FindOption(
00993       const PString & name
00994     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? NULL : m_info->FindOption(name); }
00995 
01001     bool IsValidForProtocol(const PString & protocol) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValidForProtocol(protocol); }
01002 
01003     time_t GetCodecVersionTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->codecVersionTime; }
01004 
01005     ostream & PrintOptions(ostream & strm) const
01006     {
01007       PWaitAndSignal m(_mutex);
01008       if (m_info != NULL)
01009         strm << setw(-1) << *m_info;
01010       return strm;
01011     }
01012 
01013     // Backward compatibility
01014     virtual PBoolean IsEmpty() const { PWaitAndSignal m(_mutex); return m_info == NULL || !m_info->IsValid(); }
01015     operator PString() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01016     operator const char *() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01017     bool operator==(const char * other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01018     bool operator!=(const char * other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName == other; }
01019     bool operator==(const PString & other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01020     bool operator!=(const PString & other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName == other; }
01021     bool operator==(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) == EqualTo; }
01022     bool operator!=(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) != EqualTo; }
01023     friend bool operator==(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01024     friend bool operator!=(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName == other; }
01025     friend bool operator==(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01026     friend bool operator!=(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName == other; }
01027 
01028 #if OPAL_H323
01029     static const PString & MediaPacketizationOption();
01030 #endif
01031 
01032   private:
01033     PBoolean SetSize(PINDEX) { return PTrue; }
01034 
01035   protected:
01036     PMutex _mutex;
01037     void Construct(OpalMediaFormatInternal * info);
01038     OpalMediaFormatInternal * m_info;
01039 
01040   friend class OpalMediaFormatInternal;
01041   friend class OpalMediaFormatList;
01042 };
01043 
01044 
01045 // A pair of macros to simplify cration of OpalMediFormat instances.
01046 
01047 #define OPAL_MEDIA_FORMAT(name, fullName, defaultSessionID, rtpPayloadType, encodingName, needsJitter, bandwidth, frameSize, frameTime, timeUnits) \
01048 const class name##_Class : public OpalMediaFormat \
01049 { \
01050   public: \
01051     name##_Class(); \
01052 } name; \
01053 name##_Class::name##_Class() \
01054       : OpalMediaFormat(fullName, defaultSessionID, rtpPayloadType, encodingName, needsJitter, bandwidth, frameSize, frameTime, timeUnits) \
01055 
01056 #if OPAL_AUDIO
01057 class OpalAudioFormatInternal : public OpalMediaFormatInternal
01058 {
01059   public:
01060     OpalAudioFormatInternal(
01061       const char * fullName,
01062       RTP_DataFrame::PayloadTypes rtpPayloadType,
01063       const char * encodingName,
01064       PINDEX   frameSize,
01065       unsigned frameTime,
01066       unsigned rxFrames,
01067       unsigned txFrames,
01068       unsigned maxFrames,
01069       unsigned clockRate,
01070       time_t timeStamp
01071     );
01072     virtual PObject * Clone() const;
01073     virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01074 };
01075 
01076 class OpalAudioFormat : public OpalMediaFormat
01077 {
01078     PCLASSINFO(OpalAudioFormat, OpalMediaFormat);
01079   public:
01080     OpalAudioFormat(
01081       const char * fullName,    
01082       RTP_DataFrame::PayloadTypes rtpPayloadType, 
01083       const char * encodingName,
01084       PINDEX   frameSize,       
01085       unsigned frameTime,       
01086       unsigned rxFrames,        
01087       unsigned txFrames,        
01088       unsigned maxFrames = 256, 
01089       unsigned clockRate = 8000, 
01090       time_t timeStamp = 0       
01091     );
01092 
01093     static const PString & RxFramesPerPacketOption();
01094     static const PString & TxFramesPerPacketOption();
01095 };
01096 #endif
01097 
01098 #if OPAL_VIDEO
01099 class OpalVideoFormatInternal : public OpalMediaFormatInternal
01100 {
01101   public:
01102     OpalVideoFormatInternal(
01103       const char * fullName,
01104       RTP_DataFrame::PayloadTypes rtpPayloadType,
01105       const char * encodingName,
01106       unsigned frameWidth,
01107       unsigned frameHeight,
01108       unsigned frameRate,
01109       unsigned bitRate,
01110       time_t timeStamp
01111     );
01112     virtual PObject * Clone() const;
01113     virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01114 };
01115 
01116 
01117 class OpalVideoFormat : public OpalMediaFormat
01118 {
01119     PCLASSINFO(OpalVideoFormat, OpalMediaFormat);
01120   public:
01121     OpalVideoFormat(
01122       const char * fullName,    
01123       RTP_DataFrame::PayloadTypes rtpPayloadType, 
01124       const char * encodingName,
01125       unsigned frameWidth,      
01126       unsigned frameHeight,     
01127       unsigned frameRate,       
01128       unsigned bitRate,         
01129       time_t timeStamp = 0        
01130     );
01131 
01132     static const PString & FrameWidthOption();
01133     static const PString & FrameHeightOption();
01134     static const PString & MinRxFrameWidthOption();
01135     static const PString & MinRxFrameHeightOption();
01136     static const PString & MaxRxFrameWidthOption();
01137     static const PString & MaxRxFrameHeightOption();
01138     static const PString & TemporalSpatialTradeOffOption();
01139     static const PString & TxKeyFramePeriodOption();
01140 };
01141 #endif
01142 
01143 // List of known media formats
01144 
01145 #define OPAL_PCM16          "PCM-16"
01146 #define OPAL_PCM16_16KHZ    "PCM-16-16kHz"
01147 #define OPAL_L16_MONO_8KHZ  "Linear-16-Mono-8kHz"
01148 #define OPAL_L16_MONO_16KHZ "Linear-16-Mono-16kHz"
01149 #define OPAL_G711_ULAW_64K  "G.711-uLaw-64k"
01150 #define OPAL_G711_ALAW_64K  "G.711-ALaw-64k"
01151 #define OPAL_G728           "G.728"
01152 #define OPAL_G729           "G.729"
01153 #define OPAL_G729A          "G.729A"
01154 #define OPAL_G729B          "G.729B"
01155 #define OPAL_G729AB         "G.729A/B"
01156 #define OPAL_G7231          "G.723.1"
01157 #define OPAL_G7231_6k3      OPAL_G7231
01158 #define OPAL_G7231_5k3      "G.723.1(5.3k)"
01159 #define OPAL_G7231A_6k3     "G.723.1A(6.3k)"
01160 #define OPAL_G7231A_5k3     "G.723.1A(5.3k)"
01161 #define OPAL_GSM0610        "GSM-06.10"
01162 #define OPAL_RFC2833        "UserInput/RFC2833"
01163 #define OPAL_CISCONSE       "NamedSignalEvent"
01164 
01165 #if OPAL_AUDIO
01166 extern const OpalAudioFormat & GetOpalPCM16();
01167 extern const OpalAudioFormat & GetOpalPCM16_16KHZ();
01168 extern const OpalAudioFormat & GetOpalL16_MONO_8KHZ();
01169 extern const OpalAudioFormat & GetOpalL16_MONO_16KHZ();
01170 extern const OpalAudioFormat & GetOpalG711_ULAW_64K();
01171 extern const OpalAudioFormat & GetOpalG711_ALAW_64K();
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 #endif
01183 
01184 extern const OpalMediaFormat & GetOpalRFC2833();
01185 extern const OpalMediaFormat & GetOpalCiscoNSE();
01186 
01187 #define OpalPCM16          GetOpalPCM16()
01188 #define OpalPCM16_16KHZ    GetOpalPCM16_16KHZ()
01189 #define OpalL16_MONO_8KHZ  GetOpalL16_MONO_8KHZ()
01190 #define OpalL16_MONO_16KHZ GetOpalL16_MONO_16KHZ()
01191 #define OpalG711_ULAW_64K  GetOpalG711_ULAW_64K()
01192 #define OpalG711_ALAW_64K  GetOpalG711_ALAW_64K()
01193 #define OpalG728           GetOpalG728()
01194 #define OpalG729           GetOpalG729()
01195 #define OpalG729A          GetOpalG729A()
01196 #define OpalG729B          GetOpalG729B()
01197 #define OpalG729AB         GetOpalG729AB()
01198 #define OpalG7231_6k3      GetOpalG7231_6k3()
01199 #define OpalG7231_5k3      GetOpalG7231_5k3()
01200 #define OpalG7231A_6k3     GetOpalG7231A_6k3()
01201 #define OpalG7231A_5k3     GetOpalG7231A_5k3()
01202 #define OpalGSM0610        GetOpalGSM0610()
01203 #define OpalRFC2833        GetOpalRFC2833()
01204 #define OpalCiscoNSE       GetOpalCiscoNSE()
01205 
01206 #define OpalL16Mono8kHz    OpalL16_MONO_8KHZ
01207 #define OpalL16Mono16kHz   OpalL16_MONO_16KHZ
01208 #define OpalG711uLaw       OpalG711_ULAW_64K
01209 #define OpalG711ALaw       OpalG711_ALAW_64K
01210 
01211 
01212 #ifdef _MSC_VER
01213 #if _MSC_VER < 1300
01214 #pragma warning(default:4663)
01215 #endif
01216 #endif
01217 
01218 #endif  // __OPAL_MEDIAFMT_H
01219 
01220 
01221 // End of File ///////////////////////////////////////////////////////////////

Generated on Fri Mar 7 07:36:38 2008 for OPAL by  doxygen 1.5.1