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: 22679 $
00028  * $Author: rjongbloed $
00029  * $Date: 2009-05-21 00:38:09 +0000 (Thu, 21 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 #include <rtp/rtp.h>
00049 
00050 #if OPAL_VIDEO
00051 #include <ptlib/videoio.h>
00052 #endif
00053 
00054 #include <limits>
00055 
00056 #ifdef min
00057 #undef min
00058 #endif
00059 #ifdef max
00060 #undef max
00061 #endif
00062 
00063 class OpalMediaFormat;
00064 
00065 
00067 
00068 PLIST(OpalMediaFormatBaseList, OpalMediaFormat);
00069 
00072 class OpalMediaFormatList : public OpalMediaFormatBaseList
00073 {
00074   PCLASSINFO(OpalMediaFormatList, OpalMediaFormatBaseList);
00075   public:
00080     OpalMediaFormatList();
00081 
00084     OpalMediaFormatList(
00085       const OpalMediaFormat & format    
00086     );
00087 
00090     OpalMediaFormatList(const OpalMediaFormatList & l) : OpalMediaFormatBaseList(l) { }
00092 
00098     OpalMediaFormatList & operator+=(
00099       const OpalMediaFormat & format    
00100     );
00101 
00105     OpalMediaFormatList & operator+=(
00106       const OpalMediaFormatList & formats    
00107     );
00108 
00112     OpalMediaFormatList & operator-=(
00113       const OpalMediaFormat & format    
00114     );
00115 
00119     OpalMediaFormatList & operator-=(
00120       const OpalMediaFormatList & formats    
00121     );
00122 
00127     const_iterator FindFormat(
00128       RTP_DataFrame::PayloadTypes rtpPayloadType, 
00129       const unsigned clockRate,                   
00130       const char * rtpEncodingName = NULL,        
00131       const char * protocol = NULL                
00132     ) const;
00133 
00150     const_iterator FindFormat(
00151       const PString & wildcard,    
00152       const_iterator start = const_iterator()
00153     ) const;
00154 
00157     PBoolean HasFormat(
00158       RTP_DataFrame::PayloadTypes rtpPayloadType 
00159     ) const { return FindFormat(rtpPayloadType) != end(); }
00160 
00166     PBoolean HasFormat(
00167       const PString & wildcard    
00168     ) const { return FindFormat(wildcard) != end(); }
00169 
00188     void Remove(
00189       const PStringArray & mask
00190     );
00191 
00207     void Reorder(
00208       const PStringArray & order
00209     );
00210 
00213     bool HasType(
00214       const OpalMediaType & type,
00215       bool mustBeTransportable = true
00216     ) const;
00218 
00219   private:
00220     virtual PINDEX Append(PObject *) { return P_MAX_INDEX; }
00221     virtual PINDEX Insert(const PObject &, PObject *) { return P_MAX_INDEX; }
00222     virtual PINDEX InsertAt(PINDEX, PObject *) { return P_MAX_INDEX; }
00223     virtual PBoolean SetAt(PINDEX, PObject *) { return PFalse; }
00224 };
00225 
00226 
00228 
00231 class OpalMediaOption : public PObject
00232 {
00233     PCLASSINFO(OpalMediaOption, PObject);
00234   public:
00235     enum MergeType {
00236       NoMerge,
00237       MinMerge,
00238       MaxMerge,
00239       EqualMerge,
00240       NotEqualMerge,
00241       AlwaysMerge,
00242 
00243       // Synonyms
00244       AndMerge = MinMerge,
00245       OrMerge  = MaxMerge
00246     };
00247 
00248   protected:
00249     OpalMediaOption(
00250       const PString & name
00251     );
00252     OpalMediaOption(
00253       const char * name,
00254       bool readOnly,
00255       MergeType merge
00256     );
00257 
00258   public:
00259     virtual Comparison Compare(const PObject & obj) const;
00260 
00261     virtual bool Merge(
00262       const OpalMediaOption & option
00263     );
00264     virtual Comparison CompareValue(
00265       const OpalMediaOption & option
00266     ) const = 0;
00267     virtual void Assign(
00268       const OpalMediaOption & option
00269     ) = 0;
00270 
00271     PString AsString() const;
00272     bool FromString(const PString & value);
00273 
00274     const PString & GetName() const { return m_name; }
00275 
00276     bool IsReadOnly() const { return m_readOnly; }
00277     void SetReadOnly(bool readOnly) { m_readOnly = readOnly; }
00278 
00279     MergeType GetMerge() const { return m_merge; }
00280     void SetMerge(MergeType merge) { m_merge = merge; }
00281 
00282 #if OPAL_SIP
00283     const PString & GetFMTPName() const { return m_FMTPName; }
00284     void SetFMTPName(const char * name) { m_FMTPName = name; }
00285 
00286     const PString & GetFMTPDefault() const { return m_FMTPDefault; }
00287     void SetFMTPDefault(const char * value) { m_FMTPDefault = value; }
00288 #endif // OPAL_SIP
00289 
00290 #if OPAL_H323
00291     struct H245GenericInfo {
00292       H245GenericInfo() { memset(this, 0, sizeof(*this)); }
00293       unsigned ordinal:16;
00294       enum Modes {
00295         None,
00296         Collapsing,
00297         NonCollapsing
00298       } mode:3;
00299       enum IntegerTypes {
00300         UnsignedInt,
00301         Unsigned32,
00302         BooleanArray
00303       } integerType:3;
00304       bool excludeTCS:1;
00305       bool excludeOLC:1;
00306       bool excludeReqMode:1;
00307     };
00308 
00309     const H245GenericInfo & GetH245Generic() const { return m_H245Generic; }
00310     void SetH245Generic(const H245GenericInfo & genericInfo) { m_H245Generic = genericInfo; }
00311 #endif // OPAL_H323
00312 
00313   protected:
00314     PCaselessString m_name;
00315     bool            m_readOnly;
00316     MergeType       m_merge;
00317 
00318 #if OPAL_SIP
00319     PCaselessString m_FMTPName;
00320     PString         m_FMTPDefault;
00321 #endif // OPAL_SIP
00322 
00323 #if OPAL_H323
00324     H245GenericInfo m_H245Generic;
00325 #endif // OPAL_H323
00326 };
00327 
00328 
00329 template <typename T>
00330 class OpalMediaOptionValue : public OpalMediaOption
00331 {
00332     PCLASSINFO(OpalMediaOptionValue, OpalMediaOption);
00333   public:
00334     OpalMediaOptionValue(
00335       const char * name,
00336       bool readOnly,
00337       MergeType merge = MinMerge,
00338       T value = 0,
00339       T minimum = std::numeric_limits<T>::min(),
00340       T maximum = std::numeric_limits<T>::max()
00341     ) : OpalMediaOption(name, readOnly, merge),
00342         m_value(value),
00343         m_minimum(minimum),
00344         m_maximum(maximum)
00345     { }
00346 
00347     virtual PObject * Clone() const
00348     {
00349       return new OpalMediaOptionValue(*this);
00350     }
00351 
00352     virtual void PrintOn(ostream & strm) const
00353     {
00354       strm << m_value;
00355     }
00356 
00357     virtual void ReadFrom(istream & strm)
00358     {
00359       T temp;
00360       strm >> temp;
00361       if (temp >= m_minimum && temp <= m_maximum)
00362         m_value = temp;
00363       else
00364         strm.setstate(ios::badbit);
00365     }
00366 
00367     virtual Comparison CompareValue(const OpalMediaOption & option) const
00368     {
00369       const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00370       if (otherOption == NULL)
00371         return GreaterThan;
00372       if (m_value < otherOption->m_value)
00373         return LessThan;
00374       if (m_value > otherOption->m_value)
00375         return GreaterThan;
00376       return EqualTo;
00377     }
00378 
00379     virtual void Assign(
00380       const OpalMediaOption & option
00381     ) {
00382       const OpalMediaOptionValue * otherOption = PDownCast(const OpalMediaOptionValue, &option);
00383       if (otherOption != NULL)
00384         m_value = otherOption->m_value;
00385     }
00386 
00387     T GetValue() const
00388     {
00389       return m_value;
00390     }
00391 
00392     void SetValue(T value)
00393     {
00394       if (value < m_minimum)
00395         m_value = m_minimum;
00396       else if (value > m_maximum)
00397         m_value = m_maximum;
00398       else
00399         m_value = value;
00400     }
00401 
00402     void SetMinimum(T m)
00403     {
00404       m_minimum = m;
00405     }
00406 
00407     void SetMaximum(T m)
00408     {
00409       m_maximum = m;
00410     }
00411 
00412   protected:
00413     T m_value;
00414     T m_minimum;
00415     T m_maximum;
00416 };
00417 
00418 
00419 typedef OpalMediaOptionValue<bool>     OpalMediaOptionBoolean;
00420 typedef OpalMediaOptionValue<int>      OpalMediaOptionInteger;
00421 typedef OpalMediaOptionValue<unsigned> OpalMediaOptionUnsigned;
00422 typedef OpalMediaOptionValue<double>   OpalMediaOptionReal;
00423 
00424 
00425 class OpalMediaOptionEnum : public OpalMediaOption
00426 {
00427     PCLASSINFO(OpalMediaOptionEnum, OpalMediaOption);
00428   public:
00429     OpalMediaOptionEnum(
00430       const char * name,
00431       bool readOnly
00432     );
00433     OpalMediaOptionEnum(
00434       const char * name,
00435       bool readOnly,
00436       const char * const * enumerations,
00437       PINDEX count,
00438       MergeType merge = EqualMerge,
00439       PINDEX value = 0
00440     );
00441 
00442     virtual PObject * Clone() const;
00443     virtual void PrintOn(ostream & strm) const;
00444     virtual void ReadFrom(istream & strm);
00445 
00446     virtual Comparison CompareValue(const OpalMediaOption & option) const;
00447     virtual void Assign(const OpalMediaOption & option);
00448 
00449     PINDEX GetValue() const { return m_value; }
00450     void SetValue(PINDEX value);
00451 
00452     const PStringArray & GetEnumerations() const { return m_enumerations; }
00453     void SetEnumerations(const PStringArray & e)
00454     {
00455       m_enumerations = e;
00456     }
00457 
00458   protected:
00459     PStringArray m_enumerations;
00460     PINDEX       m_value;
00461 };
00462 
00463 
00464 class OpalMediaOptionString : public OpalMediaOption
00465 {
00466     PCLASSINFO(OpalMediaOptionString, OpalMediaOption);
00467   public:
00468     OpalMediaOptionString(
00469       const char * name,
00470       bool readOnly
00471     );
00472     OpalMediaOptionString(
00473       const char * name,
00474       bool readOnly,
00475       const PString & value
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 PString & GetValue() const { return m_value; }
00486     void SetValue(const PString & value);
00487 
00488   protected:
00489     PString m_value;
00490 };
00491 
00492 
00493 class OpalMediaOptionOctets : public OpalMediaOption
00494 {
00495     PCLASSINFO(OpalMediaOptionOctets, OpalMediaOption);
00496   public:
00497     OpalMediaOptionOctets(
00498       const char * name,
00499       bool readOnly,
00500       bool base64 = false
00501     );
00502     OpalMediaOptionOctets(
00503       const char * name,
00504       bool readOnly,
00505       bool base64,
00506       const PBYTEArray & value
00507     );
00508     OpalMediaOptionOctets(
00509       const char * name,
00510       bool readOnly,
00511       bool base64,
00512       const BYTE * data,
00513       PINDEX length
00514     );
00515 
00516     virtual PObject * Clone() const;
00517     virtual void PrintOn(ostream & strm) const;
00518     virtual void ReadFrom(istream & strm);
00519 
00520     virtual Comparison CompareValue(const OpalMediaOption & option) const;
00521     virtual void Assign(const OpalMediaOption & option);
00522 
00523     const PBYTEArray & GetValue() const { return m_value; }
00524     void SetValue(const PBYTEArray & value);
00525     void SetValue(const BYTE * data, PINDEX length);
00526 
00527     void SetBase64(bool b)
00528     {
00529       m_base64 = b;
00530     }
00531 
00532   protected:
00533     PBYTEArray m_value;
00534     bool       m_base64;
00535 };
00536 
00537 
00539 
00540 class OpalMediaFormatInternal : public PObject
00541 {
00542     PCLASSINFO(OpalMediaFormatInternal, PObject);
00543   public:
00544     OpalMediaFormatInternal(
00545       const char * fullName,
00546       const OpalMediaType & mediaType,
00547       RTP_DataFrame::PayloadTypes rtpPayloadType,
00548       const char * encodingName,
00549       PBoolean     needsJitter,
00550       unsigned bandwidth,
00551       PINDEX   frameSize,
00552       unsigned frameTime,
00553       unsigned clockRate,
00554       time_t timeStamp
00555     );
00556 
00557     const PCaselessString & GetName() const { return formatName; }
00558 
00559     virtual PObject * Clone() const;
00560     virtual void PrintOn(ostream & strm) const;
00561 
00562     virtual bool IsValid() const;
00563     virtual bool IsTransportable() const;
00564 
00565     virtual PStringToString GetOptions() const;
00566     virtual bool GetOptionValue(const PString & name, PString & value) const;
00567     virtual bool SetOptionValue(const PString & name, const PString & value);
00568     virtual bool GetOptionBoolean(const PString & name, bool dflt) const;
00569     virtual bool SetOptionBoolean(const PString & name, bool value);
00570     virtual int GetOptionInteger(const PString & name, int dflt) const;
00571     virtual bool SetOptionInteger(const PString & name, int value);
00572     virtual double GetOptionReal(const PString & name, double dflt) const;
00573     virtual bool SetOptionReal(const PString & name, double value);
00574     virtual PINDEX GetOptionEnum(const PString & name, PINDEX dflt) const;
00575     virtual bool SetOptionEnum(const PString & name, PINDEX value);
00576     virtual PString GetOptionString(const PString & name, const PString & dflt) const;
00577     virtual bool SetOptionString(const PString & name, const PString & value);
00578     virtual bool GetOptionOctets(const PString & name, PBYTEArray & octets) const;
00579     virtual bool SetOptionOctets(const PString & name, const PBYTEArray & octets);
00580     virtual bool SetOptionOctets(const PString & name, const BYTE * data, PINDEX length);
00581     virtual bool AddOption(OpalMediaOption * option, PBoolean overwrite = PFalse);
00582     virtual OpalMediaOption * FindOption(const PString & name) const;
00583 
00584     virtual bool ToNormalisedOptions();
00585     virtual bool ToCustomisedOptions();
00586     virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
00587     virtual bool IsValidForProtocol(const PString & protocol) const;
00588 
00589   protected:
00590     PCaselessString              formatName;
00591     RTP_DataFrame::PayloadTypes  rtpPayloadType;
00592     PString                      rtpEncodingName;
00593     OpalMediaType                mediaType;
00594     PMutex                       media_format_mutex;
00595     PSortedList<OpalMediaOption> options;
00596     time_t                       codecVersionTime;
00597     bool                         forceIsTransportable;
00598 
00599   friend bool operator==(const char * other, const OpalMediaFormat & fmt);
00600   friend bool operator!=(const char * other, const OpalMediaFormat & fmt);
00601   friend bool operator==(const PString & other, const OpalMediaFormat & fmt);
00602   friend bool operator!=(const PString & other, const OpalMediaFormat & fmt);
00603 
00604   friend class OpalMediaFormat;
00605   friend class OpalMediaFormatList;
00606   friend class OpalAudioFormatInternal;
00607 };
00608 
00609 
00611 
00617 class OpalMediaFormat : public PContainer
00618 {
00619   PCONTAINERINFO(OpalMediaFormat, PContainer);
00620 
00621   public:
00624     OpalMediaFormat(
00625       OpalMediaFormatInternal * info = NULL
00626     );
00627 
00641     OpalMediaFormat(
00642       const char * fullName,                      
00643       const OpalMediaType & mediaType,            
00644       RTP_DataFrame::PayloadTypes rtpPayloadType, 
00645       const char * encodingName,                  
00646       PBoolean     needsJitter,                   
00647       unsigned bandwidth,                         
00648       PINDEX   frameSize,                         
00649       unsigned frameTime,                         
00650       unsigned clockRate,                         
00651       time_t timeStamp = 0                        
00652     );
00653 
00663     OpalMediaFormat(
00664       RTP_DataFrame::PayloadTypes rtpPayloadType, 
00665       unsigned clockRate,                         
00666       const char * rtpEncodingName = NULL,        
00667       const char * protocol = NULL                
00668     );
00669 
00683     OpalMediaFormat(
00684       const char * wildcard  
00685     );
00686 
00700     OpalMediaFormat(
00701       const PString & wildcard  
00702     );
00703     
00707     OpalMediaFormat & operator=(
00708       RTP_DataFrame::PayloadTypes rtpPayloadType 
00709     );
00710 
00714     OpalMediaFormat & operator=(
00715       const char * wildcard  
00716     );
00717 
00721     OpalMediaFormat & operator=(
00722       const PString & wildcard  
00723     );
00724 
00727     virtual PObject * Clone() const;
00728 
00731     virtual Comparison Compare(const PObject & obj) const;
00732 
00737     virtual void PrintOn(ostream & strm) const;
00738 
00741     virtual void ReadFrom(istream & strm);
00742 
00747     bool ToNormalisedOptions();
00748 
00752     bool ToCustomisedOptions();
00753 
00764     bool Merge(
00765       const OpalMediaFormat & mediaFormat
00766     );
00767 
00770     PString GetName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
00771 
00776     PBoolean IsValid() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValid(); }
00777 
00781     PBoolean IsTransportable() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsTransportable(); }
00782 
00788     RTP_DataFrame::PayloadTypes GetPayloadType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? RTP_DataFrame::IllegalPayloadType : m_info->rtpPayloadType; }
00789     void SetPayloadType(RTP_DataFrame::PayloadTypes type) { PWaitAndSignal m(_mutex); MakeUnique(); if (m_info != NULL) m_info->rtpPayloadType = type; }
00790 
00793     const char * GetEncodingName() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->rtpEncodingName.GetPointer(); }
00794 
00797     OpalMediaType GetMediaType() const { PWaitAndSignal m(_mutex); return m_info == NULL ? OpalMediaType() : m_info->mediaType; }
00798 
00802     bool NeedsJitterBuffer() const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(NeedsJitterOption(), PFalse); }
00803     static const PString & NeedsJitterOption();
00804 
00807     unsigned GetBandwidth() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxBitRateOption(), 0); }
00808     static const PString & MaxBitRateOption();
00809     static const PString & TargetBitRateOption();
00810 
00815     PINDEX GetFrameSize() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(MaxFrameSizeOption(), 0); }
00816     static const PString & MaxFrameSizeOption();
00817 
00821     unsigned GetFrameTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(FrameTimeOption(), 0); }
00822     static const PString & FrameTimeOption();
00823 
00826     unsigned GetTimeUnits() const { return GetClockRate()/1000; }
00827 
00828     enum StandardClockRate {
00829       AudioClockRate = 8000,  
00830       VideoClockRate = 90000  
00831     };
00832 
00835     unsigned GetClockRate() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->GetOptionInteger(ClockRateOption(), 1000); }
00836     static const PString & ClockRateOption();
00837 
00840     static const PString & ProtocolOption();
00841 
00844     static const PString & MaxTxPacketSizeOption();
00845 
00849     PStringToString GetOptions() const { PWaitAndSignal m(_mutex); return m_info == NULL ? PStringToString() : m_info->GetOptions(); }
00850 
00853     PINDEX GetOptionCount() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->options.GetSize(); }
00854 
00858     const OpalMediaOption & GetOption(
00859       PINDEX index   
00860     ) const { PWaitAndSignal m(_mutex); return m_info->options[index]; }
00861 
00866     bool GetOptionValue(
00867       const PString & name,   
00868       PString & value         
00869     ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionValue(name, value); }
00870 
00877     bool SetOptionValue(
00878       const PString & name,   
00879       const PString & value   
00880     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionValue(name, value); }
00881 
00885     bool GetOptionBoolean(
00886       const PString & name,   
00887       bool dflt = PFalse       
00888     ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionBoolean(name, dflt); }
00889 
00896     bool SetOptionBoolean(
00897       const PString & name,   
00898       bool value              
00899     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionBoolean(name, value); }
00900 
00904     int GetOptionInteger(
00905       const PString & name,   
00906       int dflt = 0            
00907     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionInteger(name, dflt); }
00908 
00916     bool SetOptionInteger(
00917       const PString & name,   
00918       int value               
00919     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionInteger(name, value); }
00920 
00924     double GetOptionReal(
00925       const PString & name,   
00926       double dflt = 0         
00927     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionReal(name, dflt); }
00928 
00935     bool SetOptionReal(
00936       const PString & name,   
00937       double value            
00938     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionReal(name, value); }
00939 
00944     PINDEX GetOptionEnum(
00945       const PString & name,   
00946       PINDEX dflt = 0         
00947     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionEnum(name, dflt); }
00948 
00955     bool SetOptionEnum(
00956       const PString & name,   
00957       PINDEX value            
00958     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionEnum(name, value); }
00959 
00963     PString GetOptionString(
00964       const PString & name,                   
00965       const PString & dflt = PString::Empty() 
00966     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? dflt : m_info->GetOptionString(name, dflt); }
00967 
00974     bool SetOptionString(
00975       const PString & name,   
00976       const PString & value   
00977     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionString(name, value); }
00978 
00982     bool GetOptionOctets(
00983       const PString & name, 
00984       PBYTEArray & octets   
00985     ) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->GetOptionOctets(name, octets); }
00986 
00993     bool SetOptionOctets(
00994       const PString & name,       
00995       const PBYTEArray & octets   
00996     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, octets); }
00997     bool SetOptionOctets(
00998       const PString & name,       
00999       const BYTE * data,          
01000       PINDEX length               
01001     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->SetOptionOctets(name, data, length); }
01002 
01005     static OpalMediaFormatList GetAllRegisteredMediaFormats();
01006     static void GetAllRegisteredMediaFormats(
01007       OpalMediaFormatList & copy    
01008     );
01009 
01013     static bool SetRegisteredMediaFormat(
01014       const OpalMediaFormat & mediaFormat  
01015     );
01016 
01020     bool AddOption(
01021       OpalMediaOption * option,
01022       PBoolean overwrite = PFalse
01023     ) { PWaitAndSignal m(_mutex); MakeUnique(); return m_info != NULL && m_info->AddOption(option, overwrite); }
01024 
01028     bool HasOption(const PString & name) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->FindOption(name) != NULL; }
01029 
01034     OpalMediaOption * FindOption(
01035       const PString & name
01036     ) const { PWaitAndSignal m(_mutex); return m_info == NULL ? NULL : m_info->FindOption(name); }
01037 
01043     bool IsValidForProtocol(const PString & protocol) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->IsValidForProtocol(protocol); }
01044 
01045     time_t GetCodecVersionTime() const { PWaitAndSignal m(_mutex); return m_info == NULL ? 0 : m_info->codecVersionTime; }
01046 
01047     ostream & PrintOptions(ostream & strm) const
01048     {
01049       PWaitAndSignal m(_mutex);
01050       if (m_info != NULL)
01051         strm << setw(-1) << *m_info;
01052       return strm;
01053     }
01054 
01055 #if OPAL_VIDEO
01056 
01058     void AdjustVideoArgs(
01059       PVideoDevice::OpenArgs & args  
01060     ) const;
01061 #endif
01062 
01063     // Backward compatibility
01064     virtual PBoolean IsEmpty() const { PWaitAndSignal m(_mutex); return m_info == NULL || !m_info->IsValid(); }
01065     operator PString() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01066     operator const char *() const { PWaitAndSignal m(_mutex); return m_info == NULL ? "" : m_info->formatName; }
01067     bool operator==(const char * other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01068     bool operator!=(const char * other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName != other; }
01069     bool operator==(const PString & other) const { PWaitAndSignal m(_mutex); return m_info != NULL && m_info->formatName == other; }
01070     bool operator!=(const PString & other) const { PWaitAndSignal m(_mutex); return m_info == NULL || m_info->formatName != other; }
01071     bool operator==(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) == EqualTo; }
01072     bool operator!=(const OpalMediaFormat & other) const { PWaitAndSignal m(_mutex); return Compare(other) != EqualTo; }
01073     friend bool operator==(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01074     friend bool operator!=(const char * other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName != other; }
01075     friend bool operator==(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info != NULL && fmt.m_info->formatName == other; }
01076     friend bool operator!=(const PString & other, const OpalMediaFormat & fmt) { return fmt.m_info == NULL || fmt.m_info->formatName != other; }
01077 
01078 #if OPAL_H323
01079     static const PString & MediaPacketizationOption();
01080     static const PString & MediaPacketizationsOption();
01081 #endif
01082 
01083   private:
01084     PBoolean SetSize(PINDEX) { return PTrue; }
01085 
01086   protected:
01087     PMutex _mutex;
01088     void Construct(OpalMediaFormatInternal * info);
01089     OpalMediaFormatInternal * m_info;
01090 
01091   friend class OpalMediaFormatInternal;
01092   friend class OpalMediaFormatList;
01093 };
01094 
01095 
01096 class OpalAudioFormatInternal : public OpalMediaFormatInternal
01097 {
01098   public:
01099     OpalAudioFormatInternal(
01100       const char * fullName,
01101       RTP_DataFrame::PayloadTypes rtpPayloadType,
01102       const char * encodingName,
01103       PINDEX   frameSize,
01104       unsigned frameTime,
01105       unsigned rxFrames,
01106       unsigned txFrames,
01107       unsigned maxFrames,
01108       unsigned clockRate,
01109       time_t timeStamp
01110     );
01111     virtual PObject * Clone() const;
01112     virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01113 };
01114 
01115 class OpalAudioFormat : public OpalMediaFormat
01116 {
01117     PCLASSINFO(OpalAudioFormat, OpalMediaFormat);
01118   public:
01119     OpalAudioFormat(
01120       const char * fullName,    
01121       RTP_DataFrame::PayloadTypes rtpPayloadType, 
01122       const char * encodingName,
01123       PINDEX   frameSize,       
01124       unsigned frameTime,       
01125       unsigned rxFrames,        
01126       unsigned txFrames,        
01127       unsigned maxFrames = 256, 
01128       unsigned clockRate = 8000, 
01129       time_t timeStamp = 0       
01130     );
01131 
01132     static const PString & RxFramesPerPacketOption();
01133     static const PString & TxFramesPerPacketOption();
01134     static const PString & MaxFramesPerPacketOption();
01135     static const PString & ChannelsOption();
01136 };
01137 
01138 #if OPAL_VIDEO
01139 class OpalVideoFormatInternal : public OpalMediaFormatInternal
01140 {
01141   public:
01142     OpalVideoFormatInternal(
01143       const char * fullName,
01144       RTP_DataFrame::PayloadTypes rtpPayloadType,
01145       const char * encodingName,
01146       unsigned maxFrameWidth,
01147       unsigned maxFrameHeight,
01148       unsigned maxFrameRate,
01149       unsigned maxBitRate,
01150       time_t timeStamp
01151     );
01152     virtual PObject * Clone() const;
01153     virtual bool Merge(const OpalMediaFormatInternal & mediaFormat);
01154 };
01155 
01156 
01157 class OpalVideoFormat : public OpalMediaFormat
01158 {
01159     PCLASSINFO(OpalVideoFormat, OpalMediaFormat);
01160   public:
01161     OpalVideoFormat(
01162       const char * fullName,    
01163       RTP_DataFrame::PayloadTypes rtpPayloadType, 
01164       const char * encodingName,
01165       unsigned maxFrameWidth,   
01166       unsigned maxFrameHeight,  
01167       unsigned maxFrameRate,    
01168       unsigned maxBitRate,      
01169       time_t timeStamp = 0      
01170     );
01171 
01172     static const PString & FrameWidthOption();
01173     static const PString & FrameHeightOption();
01174     static const PString & MinRxFrameWidthOption();
01175     static const PString & MinRxFrameHeightOption();
01176     static const PString & MaxRxFrameWidthOption();
01177     static const PString & MaxRxFrameHeightOption();
01178     static const PString & TemporalSpatialTradeOffOption();
01179     static const PString & TxKeyFramePeriodOption();
01180     static const PString & RateControlEnableOption();
01181     static const PString & RateControllerOption();
01182     static const PString & RateControllerBitRateScalerOption();
01183 
01194     enum ContentRole {
01195       eNoRole,
01196       ePresentation,
01197       eMainRole,
01198       eSpeaker,
01199       eSignLanguage,
01200       eNumRoles
01201     };
01202     enum { ContentRoleMask = 15 };
01203     __inline static unsigned ContentRoleBit(ContentRole contentRole) { return contentRole != eNoRole ? (1<<(contentRole-1)) : 0; }
01204     static const PString & ContentRoleOption();
01205     static const PString & ContentRoleMaskOption();
01206 };
01207 #endif
01208 
01209 // List of known media formats
01210 
01211 #define OPAL_PCM16          "PCM-16"
01212 #define OPAL_PCM16_16KHZ    "PCM-16-16kHz"
01213 #define OPAL_PCM16_32KHZ    "PCM-16-32kHz"
01214 #define OPAL_PCM16_48KHZ    "PCM-16-48kHz"
01215 #define OPAL_L16_MONO_8KHZ  "Linear-16-Mono-8kHz"
01216 #define OPAL_L16_MONO_16KHZ "Linear-16-Mono-16kHz"
01217 #define OPAL_L16_MONO_32KHZ "Linear-16-Mono-32kHz"
01218 #define OPAL_L16_MONO_48KHZ "Linear-16-Mono-48kHz"
01219 #define OPAL_G711_ULAW_64K  "G.711-uLaw-64k"
01220 #define OPAL_G711_ALAW_64K  "G.711-ALaw-64k"
01221 #define OPAL_G722           "G.722"
01222 #define OPAL_G7221          "G.722.1"
01223 #define OPAL_G7222          "G.722.2"
01224 #define OPAL_G726_40K       "G.726-40K"
01225 #define OPAL_G726_32K       "G.726-32K"
01226 #define OPAL_G726_24K       "G.726-24K"
01227 #define OPAL_G726_16K       "G.726-16K"
01228 #define OPAL_G728           "G.728"
01229 #define OPAL_G729           "G.729"
01230 #define OPAL_G729A          "G.729A"
01231 #define OPAL_G729B          "G.729B"
01232 #define OPAL_G729AB         "G.729A/B"
01233 #define OPAL_G7231          "G.723.1"
01234 #define OPAL_G7231_6k3      OPAL_G7231
01235 #define OPAL_G7231_5k3      "G.723.1(5.3k)"
01236 #define OPAL_G7231A_6k3     "G.723.1A(6.3k)"
01237 #define OPAL_G7231A_5k3     "G.723.1A(5.3k)"
01238 #define OPAL_GSM0610        "GSM-06.10"
01239 #define OPAL_GSMAMR         "GSM-AMR"
01240 #define OPAL_iLBC           "iLBC"
01241 #define OPAL_H261           "H.261"
01242 #define OPAL_H263           "H.263"
01243 #define OPAL_H264           "H.264"
01244 #define OPAL_MPEG4          "MPEG4"
01245 #define OPAL_RFC2833        "UserInput/RFC2833"
01246 #define OPAL_CISCONSE       "NamedSignalEvent"
01247 #define OPAL_T38            "T.38"
01248 
01249 extern const OpalAudioFormat & GetOpalPCM16();
01250 extern const OpalAudioFormat & GetOpalPCM16_16KHZ();
01251 extern const OpalAudioFormat & GetOpalPCM16_32KHZ();
01252 extern const OpalAudioFormat & GetOpalPCM16_48KHZ();
01253 extern const OpalAudioFormat & GetOpalL16_MONO_8KHZ();
01254 extern const OpalAudioFormat & GetOpalL16_MONO_16KHZ();
01255 extern const OpalAudioFormat & GetOpalL16_MONO_32KHZ();
01256 extern const OpalAudioFormat & GetOpalL16_MONO_48KHZ();
01257 extern const OpalAudioFormat & GetOpalL16_STEREO_48KHZ();
01258 extern const OpalAudioFormat & GetOpalG711_ULAW_64K();
01259 extern const OpalAudioFormat & GetOpalG711_ALAW_64K();
01260 extern const OpalAudioFormat & GetOpalG722();
01261 extern const OpalAudioFormat & GetOpalG7221();
01262 extern const OpalMediaFormat & GetOpalG7222();
01263 extern const OpalAudioFormat & GetOpalG726_40K();
01264 extern const OpalAudioFormat & GetOpalG726_32K();
01265 extern const OpalAudioFormat & GetOpalG726_24K();
01266 extern const OpalAudioFormat & GetOpalG726_16K();
01267 extern const OpalAudioFormat & GetOpalG728();
01268 extern const OpalAudioFormat & GetOpalG729();
01269 extern const OpalAudioFormat & GetOpalG729A();
01270 extern const OpalAudioFormat & GetOpalG729B();
01271 extern const OpalAudioFormat & GetOpalG729AB();
01272 extern const OpalAudioFormat & GetOpalG7231_6k3();
01273 extern const OpalAudioFormat & GetOpalG7231_5k3();
01274 extern const OpalAudioFormat & GetOpalG7231A_6k3();
01275 extern const OpalAudioFormat & GetOpalG7231A_5k3();
01276 extern const OpalAudioFormat & GetOpalGSM0610();
01277 extern const OpalMediaFormat & GetOpalGSMAMR();
01278 extern const OpalMediaFormat & GetOpaliLBC();
01279 
01280 extern const OpalMediaFormat & GetOpalRFC2833();
01281 
01282 #if OPAL_T38_CAPABILITY
01283 extern const OpalMediaFormat & GetOpalCiscoNSE();
01284 extern const OpalMediaFormat & GetOpalT38();
01285 #endif
01286 
01287 
01288 #define OpalPCM16          GetOpalPCM16()
01289 #define OpalPCM16_16KHZ    GetOpalPCM16_16KHZ()
01290 #define OpalPCM16_32KHZ    GetOpalPCM16_32KHZ()
01291 #define OpalPCM16_48KHZ    GetOpalPCM16_48KHZ()
01292 #define OpalL16_MONO_8KHZ  GetOpalL16_MONO_8KHZ()
01293 #define OpalL16_MONO_16KHZ GetOpalL16_MONO_16KHZ()
01294 #define OpalL16_MONO_32KHZ GetOpalL16_MONO_32KHZ()
01295 #define OpalL16_MONO_48KHZ GetOpalL16_MONO_48KHZ()
01296 #define OpalL16_STEREO_48KHZ GetOpalL16_STEREO_48KHZ()
01297 #define OpalG711_ULAW_64K  GetOpalG711_ULAW_64K()
01298 #define OpalG711_ALAW_64K  GetOpalG711_ALAW_64K()
01299 #define OpalG722           GetOpalG722()
01300 #define OpalG7221          GetOpalG7221()
01301 #define OpalG7222          GetOpalG7222()
01302 #define OpalG726_40K       GetOpalG726_40K()
01303 #define OpalG726_32K       GetOpalG726_32K()
01304 #define OpalG726_24K       GetOpalG726_24K()
01305 #define OpalG726_16K       GetOpalG726_16K()
01306 #define OpalG728           GetOpalG728()
01307 #define OpalG729           GetOpalG729()
01308 #define OpalG729A          GetOpalG729A()
01309 #define OpalG729B          GetOpalG729B()
01310 #define OpalG729AB         GetOpalG729AB()
01311 #define OpalG7231_6k3      GetOpalG7231_6k3()
01312 #define OpalG7231_5k3      GetOpalG7231_5k3()
01313 #define OpalG7231A_6k3     GetOpalG7231A_6k3()
01314 #define OpalG7231A_5k3     GetOpalG7231A_5k3()
01315 #define OpalGSM0610        GetOpalGSM0610()
01316 #define OpalGSMAMR         GetOpalGSMAMR()
01317 #define OpaliLBC           GetOpaliLBC()
01318 #define OpalRFC2833        GetOpalRFC2833()
01319 #define OpalCiscoNSE       GetOpalCiscoNSE()
01320 #define OpalT38            GetOpalT38()
01321 
01322 #define OpalL16Mono8kHz    OpalL16_MONO_8KHZ
01323 #define OpalL16Mono16kHz   OpalL16_MONO_16KHZ
01324 #define OpalG711uLaw       OpalG711_ULAW_64K
01325 #define OpalG711ALaw       OpalG711_ALAW_64K
01326 
01327 #define OPAL_T140             "T.140"
01328 #define OpalT140              GetOpalT140()
01329 extern const OpalMediaFormat & GetOpalT140();
01330 
01331 #if OPAL_HAS_MSRP
01332 #define OPAL_MSRP           "MSRP"
01333 #define OpalMSRP            GetOpalMSRP()
01334 extern const OpalMediaFormat & GetOpalMSRP();
01335 #endif
01336 
01337 #if OPAL_HAS_SIPIM
01338 #define OPAL_SIPIM             "SIP-IM"
01339 #define OpalSIPIM              GetOpalSIPIM()
01340 extern const OpalMediaFormat & GetOpalSIPIM();
01341 #endif
01342 
01343 #ifdef _MSC_VER
01344 #if _MSC_VER < 1300
01345 #pragma warning(default:4663)
01346 #endif
01347 #endif
01348 
01349 #endif  // OPAL_OPAL_MEDIAFMT_H
01350 
01351 
01352 // End of File ///////////////////////////////////////////////////////////////

Generated on Mon Aug 3 20:50:24 2009 for OPAL by  doxygen 1.5.1