# mediatype.h

Go to the documentation of this file.

    00001 /*
    00002  * mediatype.h
    00003  *
    00004  * Media Format Type descriptions
    00005  *
    00006  * Open Phone Abstraction Library (OPAL)
    00007  *
    00008  * Copyright (C) 2007 Post Increment and Hannes Friederich
    00009  *
    00010  * The contents of this file are subject to the Mozilla Public License
    00011  * Version 1.0 (the "License"); you may not use this file except in
    00012  * compliance with the License. You may obtain a copy of the License at
    00013  * http://www.mozilla.org/MPL/
    00014  *
    00015  * Software distributed under the License is distributed on an "AS IS"
    00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
    00017  * the License for the specific language governing rights and limitations
    00018  * under the License.
    00019  *
    00020  * The Original Code is OPAL
    00021  *
    00022  * The Initial Developer of the Original Code is Hannes Friederich and Post Increment
    00023  *
    00024  * Contributor(s): ______________________________________.
    00025  *
    00026  * $Revision: 28946 $
    00027  * $Author: rjongbloed $
    00028  * $Date: 2013-01-18 22:27:47 -0600 (Fri, 18 Jan 2013) $
    00029  */
    00030
    00031 #ifndef OPAL_OPAL_MEDIATYPE_H
    00032 #define OPAL_OPAL_MEDIATYPE_H
    00033
    00034 #include <opal/buildopts.h>
    00035
    00036 #include <ptlib/pfactory.h>
    00037 #include <ptlib/bitwise_enum.h>
    00038
    00039
    00040 #ifdef P_USE_PRAGMA
    00041 #pragma interface
    00042 #endif
    00043
    00044
    00045 class OpalMediaTypeDefinition;
    00046 class OpalConnection;
    00047
    00049 //
    00050 //  define the factory used for keeping track of OpalMediaTypeDefintions
    00051 //
    00052 class OpalMediaType;
    00053 typedef PFactory<OpalMediaTypeDefinition, OpalMediaType> OpalMediaTypesFactory;
    00054 typedef OpalMediaTypesFactory::KeyList_T OpalMediaTypeList;
    00055
    00056
    00059 class OpalMediaType : public std::string     // do not make this PCaselessString as that type does not work as index for std::map etc
    00060 {
    00061   public:
    00062     OpalMediaType()
    00063     { }
    00064
    00065     virtual ~OpalMediaType()
    00066     { }
    00067
    00068     OpalMediaType(const std::string & str)
    00069       : std::string(str) { }
    00070
    00071     OpalMediaType(const char * str)
    00072       : std::string(str) { }
    00073
    00074     OpalMediaType(const PString & str)
    00075       : std::string((const char *)str) { }
    00076
    00077     static const OpalMediaType & Audio();
    00078 #if OPAL_VIDEO
    00079     static const OpalMediaType & Video();
    00080 #endif
    00081 #if OPAL_T38_CAPABILITY
    00082     static const OpalMediaType & Fax();
    00083 #endif
    00084     static const OpalMediaType & UserInput();
    00085
    00086     OpalMediaTypeDefinition * operator->() const { return GetDefinition(); }
    00087     OpalMediaTypeDefinition * GetDefinition() const;
    00088     static OpalMediaTypeDefinition * GetDefinition(const OpalMediaType & key);
    00089     static OpalMediaTypeDefinition * GetDefinition(unsigned sessionId);
    00090
    00094     static OpalMediaTypeList GetList();
    00095
    00096     P_DECLARE_BITWISE_ENUM_EX(AutoStartMode, 3,
    00097                               (OfferInactive, Receive, Transmit, DontOffer),
    00098                               ReceiveTransmit = Receive|Transmit,
    00099                               TransmitReceive = Receive|Transmit);
    00100
    00101     AutoStartMode GetAutoStart() const;
    00102 };
    00103
    00104
    00105 __inline ostream & operator << (ostream & strm, const OpalMediaType & mediaType)
    00106 {
    00107   return strm << mediaType.c_str();
    00108 }
    00109
    00110
    00112 //
    00113 //  this class defines the functions needed to work with the media type, i.e.
    00114 //
    00115
    00116 class SDPMediaDescription;
    00117 class OpalTransportAddress;
    00118 class OpalMediaSession;
    00119
    00120
    00123 class OpalMediaTypeDefinition
    00124 {
    00125   public:
    00127     OpalMediaTypeDefinition(
    00128       const char * mediaType,
    00129       const char * mediaSession,
    00130       unsigned requiredSessionId = 0,
    00131       OpalMediaType::AutoStartMode autoStart = OpalMediaType::DontOffer
    00132     );
    00133
    00134     // Needed to avoid gcc warning about classes with virtual functions and
    00135     //  without a virtual destructor
    00136     virtual ~OpalMediaTypeDefinition();
    00137
    00140     OpalMediaType::AutoStartMode GetAutoStart() const { return m_autoStart; }
    00141
    00144     void SetAutoStart(OpalMediaType::AutoStartMode v) { m_autoStart = v; }
    00145     void SetAutoStart(OpalMediaType::AutoStartMode v, bool on) { if (on) m_autoStart |= v; else m_autoStart -= v; }
    00146
    00149     unsigned GetDefaultSessionId() const { return m_defaultSessionId; }
    00150
    00153     const PString & GetMediaSessionType() const { return m_mediaSessionType; }
    00154
    00155 #if OPAL_SIP
    00157     virtual bool MatchesSDP(
    00158       const PCaselessString & sdpMediaType,
    00159       const PCaselessString & sdpTransport,
    00160       const PStringArray & sdpLines,
    00161       PINDEX index
    00162     );
    00163
    00165     virtual SDPMediaDescription * CreateSDPMediaDescription(
    00166       const OpalTransportAddress & localAddress
    00167     ) const;
    00168 #endif // OPAL_SIP
    00169
    00170   protected:
    00171     OpalMediaType m_mediaType;
    00172     PString       m_mediaSessionType;
    00173     unsigned      m_defaultSessionId;
    00174     OpalMediaType::AutoStartMode m_autoStart;
    00175
    00176   private:
    00177     P_REMOVE_VIRTUAL(OpalMediaSession *, CreateMediaSession(OpalConnection &, unsigned), NULL);
    00178 };
    00179
    00180
    00182 //
    00183 //  define a macro for declaring a new OpalMediaTypeDefinition factory
    00184 //
    00185
    00186 #define OPAL_INSTANTIATE_MEDIATYPE2(cls, name) \
    00187   PFACTORY_CREATE(OpalMediaTypesFactory, cls, name, true)
    00188
    00189 #define OPAL_INSTANTIATE_MEDIATYPE(cls) \
    00190   OPAL_INSTANTIATE_MEDIATYPE2(cls, cls::Name())
    00191
    00192
    00193 template <const char * Type, unsigned SessionId = 0>
    00194 class SimpleMediaType : public OpalMediaTypeDefinition
    00195 {
    00196   public:
    00197     static const char * Name() { return Type; }
    00198
    00199     SimpleMediaType()
    00200       : OpalMediaTypeDefinition(Name(), PString::Empty(), SessionId)
    00201     { }
    00202 };
    00203
    00204 #define OPAL_INSTANTIATE_SIMPLE_MEDIATYPE(cls, name, ...) \
    00205   namespace OpalMediaTypeSpace { extern const char cls[] = name; }; \
    00206   typedef SimpleMediaType<OpalMediaTypeSpace::cls, ##__VA_ARGS__> cls; \
    00207   OPAL_INSTANTIATE_MEDIATYPE(cls) \
    00208
    00209
    00211 //
    00212 //  common ancestor for audio and video OpalMediaTypeDefinitions
    00213 //
    00214
    00215 class OpalRTPAVPMediaType : public OpalMediaTypeDefinition {
    00216   public:
    00217     OpalRTPAVPMediaType(
    00218       const char * mediaType,
    00219       unsigned     requiredSessionId = 0,
    00220       OpalMediaType::AutoStartMode autoStart = OpalMediaType::DontOffer
    00221     );
    00222
    00223 #if OPAL_SIP
    00224     virtual bool MatchesSDP(const PCaselessString &, const PCaselessString &, const PStringArray &, PINDEX);
    00225 #endif
    00226 };
    00227
    00228
    00229 class OpalAudioMediaType : public OpalRTPAVPMediaType {
    00230   public:
    00231     static const char * Name();
    00232
    00233     OpalAudioMediaType();
    00234
    00235 #if OPAL_SIP
    00236     SDPMediaDescription * CreateSDPMediaDescription(const OpalTransportAddress &) const;
    00237 #endif
    00238 };
    00239
    00240
    00241 #if OPAL_VIDEO
    00242
    00243 class OpalVideoMediaType : public OpalRTPAVPMediaType {
    00244   public:
    00245     static const char * Name();
    00246
    00247     OpalVideoMediaType();
    00248
    00249 #if OPAL_SIP
    00250     SDPMediaDescription * CreateSDPMediaDescription(const OpalTransportAddress &) const;
    00251 #endif
    00252 };
    00253
    00254 #endif // OPAL_VIDEO
    00255
    00256
    00257 #if OPAL_T38_CAPABILITY
    00258
    00259 class OpalFaxMediaType : public OpalMediaTypeDefinition
    00260 {
    00261   public:
    00262     static const char * Name();
    00263     static const PCaselessString & UDPTL();
    00264
    00265     OpalFaxMediaType();
    00266
    00267 #if OPAL_SIP
    00268     static const PCaselessString & GetSDPMediaType();
    00269     static const PString & GetSDPTransportType();
    00270
    00271     virtual bool MatchesSDP(
    00272       const PCaselessString & sdpMediaType,
    00273       const PCaselessString & sdpTransport,
    00274       const PStringArray & sdpLines,
    00275       PINDEX index
    00276     );
    00277
    00278     SDPMediaDescription * CreateSDPMediaDescription(
    00279       const OpalTransportAddress & localAddress
    00280     ) const;
    00281 #endif // OPAL_SIP
    00282 };
    00283
    00284 #endif // OPAL_T38_CAPABILITY
    00285
    00286
    00287 __inline OpalMediaType::AutoStartMode OpalMediaType::GetAutoStart() const { return GetDefinition()->GetAutoStart(); }
    00288
    00289
    00290 #endif // OPAL_OPAL_MEDIATYPE_H