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: 21833 $
00027  * $Author: rjongbloed $
00028  * $Date: 2008-12-18 05:15:31 +0000 (Thu, 18 Dec 2008) $
00029  */
00030 
00031 #ifndef OPAL_OPAL_MEDIATYPE_H
00032 #define OPAL_OPAL_MEDIATYPE_H
00033 
00034 #include <ptbuildopts.h>
00035 #include <ptlib/pfactory.h>
00036 #include <opal/buildopts.h>
00037 
00038 #ifdef P_USE_PRAGMA
00039 #pragma interface
00040 #endif
00041 
00042 namespace PWLibStupidLinkerHacks {
00043 extern int mediaTypeLoader;
00044 }; // namespace PWLibStupidLinkerHacks
00045 
00046 class OpalMediaTypeDefinition;
00047 class OpalSecurityMode;
00048 class OpalConnection;
00049 
00051 //
00052 //  define the factory used for keeping track of OpalMediaTypeDefintions
00053 //
00054 typedef PFactory<OpalMediaTypeDefinition> OpalMediaTypeFactory;
00055 typedef OpalMediaTypeFactory::KeyList_T OpalMediaTypeList;
00056 
00057 
00060 class OpalMediaType : public std::string     // do not make this PCaselessString as that type does not work as index for std::map etc
00061 {
00062   public:
00063     OpalMediaType()
00064     { }
00065 
00066     virtual ~OpalMediaType()
00067     { }
00068 
00069     OpalMediaType(const std::string & str)
00070       : std::string(str) { }
00071 
00072     OpalMediaType(const char * str)
00073       : std::string(str) { }
00074 
00075     OpalMediaType(const PString & str)
00076       : std::string((const char *)str) { }
00077 
00078     static const OpalMediaType & Audio();
00079     static const OpalMediaType & Video();
00080     static const OpalMediaType & Fax();
00081     static const OpalMediaType & UserInput();
00082 
00083     void PrintOn(ostream & strm) const { strm << c_str(); }
00084 
00085     OpalMediaTypeDefinition * GetDefinition() const;
00086     static OpalMediaTypeDefinition * GetDefinition(const OpalMediaType & key);
00087 
00088     static OpalMediaTypeFactory::KeyList_T GetList() { return OpalMediaTypeFactory::GetKeyList(); }
00089 
00090 #if OPAL_SIP
00091     static OpalMediaType GetMediaTypeFromSDP(const std::string & key, const std::string & transport);
00092 #endif  // OPAL_SIP
00093 
00094     enum AutoStartMode {
00095       DontOffer = -1, // Do not change order of enum as useful for bitmasking rx/tx
00096       OfferInactive,
00097       Receive,
00098       Transmit,
00099       ReceiveTransmit,
00100       TransmitReceive = ReceiveTransmit
00101     };
00102     AutoStartMode GetAutoStart() const;
00103 };
00104 
00105 ostream & operator << (ostream & strm, const OpalMediaType & mediaType);
00106 
00107 
00109 //
00110 //  this class defines the functions needed to work with the media type, i.e. 
00111 //
00112 class OpalRTPConnection;
00113 class RTP_UDP;
00114 
00115 #if OPAL_SIP
00116 class SDPMediaDescription;
00117 class OpalTransportAddress;
00118 #endif
00119 
00120 class OpalMediaSession;
00121 
00124 class OpalMediaTypeDefinition
00125 {
00126   public:
00128     OpalMediaTypeDefinition(
00129       const char * mediaType,          
00130       const char * sdpType,            
00131       unsigned     preferredSessionId, 
00132       OpalMediaType::AutoStartMode autoStart = OpalMediaType::DontOffer   
00133     );
00134 
00135     // Needed to avoid gcc warning about classes with virtual functions and 
00136     //  without a virtual destructor
00137     virtual ~OpalMediaTypeDefinition() { }
00138 
00141     OpalMediaType::AutoStartMode GetAutoStart() const { return m_autoStart; }
00142 
00145     void SetAutoStart(OpalMediaType::AutoStartMode v) { m_autoStart = v; }
00146 
00150     virtual bool UsesRTP() const { return true; }
00151 
00154     virtual OpalMediaSession * CreateMediaSession(
00155       OpalConnection & connection,  
00156       unsigned         sessionID    
00157     ) const;
00158 
00165     virtual PString GetRTPEncoding() const = 0;
00166 
00172     virtual RTP_UDP * CreateRTPSession(
00173       OpalRTPConnection & conn,
00174       unsigned sessionID, 
00175       bool remoteIsNAT);
00176 
00179     unsigned GetDefaultSessionId() const { return GetDefaultSessionId(m_mediaType); }
00180 
00183     static unsigned GetDefaultSessionId(
00184       const OpalMediaType & mediaType   
00185     );
00186 
00189     static OpalMediaType GetMediaTypeForSessionId(
00190       unsigned sessionId      
00191     );
00192 
00193   protected:
00194     static PMutex & GetMapMutex();
00195 
00196     typedef std::map<OpalMediaType, unsigned> MediaTypeToSessionIDMap_T;
00197     static MediaTypeToSessionIDMap_T & GetMediaTypeToSessionIDMap();
00198 
00199     typedef std::map<unsigned, OpalMediaType> SessionIDToMediaTypeMap_T;
00200     static SessionIDToMediaTypeMap_T & GetSessionIDToMediaTypeMap();
00201 
00202     std::string m_mediaType;
00203     OpalMediaType::AutoStartMode m_autoStart;
00204 
00205 #if OPAL_SIP
00206   public:
00207     //
00208     //  return the SDP type for this media type
00209     //
00210     virtual std::string GetSDPType() const 
00211     { return m_sdpType; }
00212 
00213     //
00214     //  create an SDP media description entry for this media type
00215     //
00216     virtual SDPMediaDescription * CreateSDPMediaDescription(
00217       const OpalTransportAddress & localAddress
00218     ) = 0;
00219 
00220   protected:
00221     std::string m_sdpType;
00222 #endif
00223 };
00224 
00225 
00227 //
00228 //  define a macro for declaring a new OpalMediaTypeDefinition factory
00229 //
00230 
00231 #define OPAL_INSTANTIATE_MEDIATYPE2(title, name, cls) \
00232 namespace OpalMediaTypeSpace { \
00233   static PFactory<OpalMediaTypeDefinition>::Worker<cls> static_##title##_##cls(name, true); \
00234 }; \
00235 
00236 #define OPAL_INSTANTIATE_MEDIATYPE(type, cls) \
00237   OPAL_INSTANTIATE_MEDIATYPE2(type, #type, cls) \
00238 
00239 
00240 #ifdef SOLARIS
00241 template <char * Type, char * sdp>
00242 #else
00243 template <char * Type, const char * sdp>
00244 #endif
00245 class SimpleMediaType : public OpalMediaTypeDefinition
00246 {
00247   public:
00248     SimpleMediaType()
00249       : OpalMediaTypeDefinition(Type, sdp, 0)
00250     { }
00251 
00252     virtual ~SimpleMediaType()                     { }
00253 
00254     virtual RTP_UDP * CreateRTPSession(OpalRTPConnection & ,unsigned , bool ) { return NULL; }
00255 
00256     PString GetRTPEncoding() const { return PString::Empty(); } 
00257 
00258 #if OPAL_SIP
00259   public:
00260     virtual SDPMediaDescription * CreateSDPMediaDescription(const OpalTransportAddress & ) { return NULL; }
00261 #endif
00262 };
00263 
00264 
00265 #define OPAL_INSTANTIATE_SIMPLE_MEDIATYPE(type, sdp) \
00266 namespace OpalMediaTypeSpace { \
00267   char type##_type_string[] = #type; \
00268   char type##_sdp_string[] = #sdp; \
00269   typedef SimpleMediaType<type##_type_string, type##_sdp_string> type##_MediaType; \
00270 }; \
00271 OPAL_INSTANTIATE_MEDIATYPE(type, type##_MediaType) \
00272 
00273 #define OPAL_INSTANTIATE_SIMPLE_MEDIATYPE_NO_SDP(type) OPAL_INSTANTIATE_SIMPLE_MEDIATYPE(type, "") 
00274 
00276 //
00277 //  common ancestor for audio and video OpalMediaTypeDefinitions
00278 //
00279 
00280 class OpalRTPAVPMediaType : public OpalMediaTypeDefinition {
00281   public:
00282     OpalRTPAVPMediaType(
00283       const char * mediaType, 
00284       const char * sdpType, 
00285       unsigned     preferredSessionId,
00286       OpalMediaType::AutoStartMode autoStart = OpalMediaType::DontOffer
00287     );
00288 
00289     virtual PString GetRTPEncoding() const;
00290 
00291     OpalMediaSession * CreateMediaSession(OpalConnection & /*conn*/, unsigned /* sessionID*/) const;
00292 };
00293 
00294 
00295 class OpalAudioMediaType : public OpalRTPAVPMediaType {
00296   public:
00297     OpalAudioMediaType();
00298 
00299 #if OPAL_SIP
00300     SDPMediaDescription * CreateSDPMediaDescription(const OpalTransportAddress & localAddress);
00301 #endif
00302 };
00303 
00304 
00305 #if OPAL_VIDEO
00306 
00307 class OpalVideoMediaType : public OpalRTPAVPMediaType {
00308   public:
00309     OpalVideoMediaType();
00310 
00311 #if OPAL_SIP
00312     SDPMediaDescription * CreateSDPMediaDescription(const OpalTransportAddress & localAddress);
00313 #endif
00314 };
00315 
00316 #endif // OPAL_VIDEO
00317 
00318 
00319 #if OPAL_T38_CAPABILITY
00320 
00321 class OpalFaxMediaType : public OpalMediaTypeDefinition 
00322 {
00323   public:
00324     OpalFaxMediaType();
00325 
00326     PString GetRTPEncoding(void) const;
00327     RTP_UDP * CreateRTPSession(OpalRTPConnection & conn,
00328                                unsigned sessionID, bool remoteIsNAT);
00329 
00330     OpalMediaSession * CreateMediaSession(OpalConnection & conn, unsigned /* sessionID*/) const;
00331 
00332 #if OPAL_SIP
00333     SDPMediaDescription * CreateSDPMediaDescription(const OpalTransportAddress & localAddress);
00334 #endif
00335 };
00336 
00337 #endif // OPAL_T38_CAPABILITY
00338 
00339 
00340 __inline OpalMediaType::AutoStartMode OpalMediaType::GetAutoStart() const { return GetDefinition()->GetAutoStart(); }
00341 
00342 
00343 #endif // OPAL_OPAL_MEDIATYPE_H

Generated on Mon Feb 1 00:25:53 2010 for OPAL by  doxygen 1.5.1