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