OPAL
Version 3.10.4
|
00001 /* 00002 * rtpconn.h 00003 * 00004 * Connection abstraction 00005 * 00006 * Open Phone Abstraction Library (OPAL) 00007 * 00008 * Copyright (C) 2007 Post Increment 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 Open Phone Abstraction Library. 00021 * 00022 * The Initial Developer of the Original Code is Post Increment 00023 * 00024 * Contributor(s): ______________________________________. 00025 * 00026 * $Revision: 26728 $ 00027 * $Author: rjongbloed $ 00028 * $Date: 2011-12-01 22:59:14 -0600 (Thu, 01 Dec 2011) $ 00029 */ 00030 00031 #ifndef OPAL_OPAL_RTPCONN_H 00032 #define OPAL_OPAL_RTPCONN_H 00033 00034 #ifdef P_USE_PRAGMA 00035 #pragma interface 00036 #endif 00037 00038 #include <opal/buildopts.h> 00039 00040 #include <opal/connection.h> 00041 #include <opal/mediatype.h> 00042 00043 #ifdef OPAL_ZRTP 00044 00045 class OpalZRTPStreamInfo { 00046 public: 00047 virtual bool Open() = 0; 00048 virtual RTP_UDP * CreateRTPSession(OpalConnection & conn, unsigned sessionId, bool remoteIsNat) = 0; 00049 }; 00050 00051 class OpalZRTPConnectionInfo { 00052 public: 00053 virtual bool Open() = 0; 00054 virtual RTP_UDP * CreateRTPSession(OpalConnection & conn, unsigned sessionId, bool remoteIsNat) = 0; 00055 00056 PMutex mutex; 00057 }; 00058 00059 #endif // OPAL_ZRTP 00060 00061 00062 class OpalRTPEndPoint; 00063 00064 //#ifdef HAS_LIBZRTP 00065 //#ifndef __ZRTP_TYPES_H__ 00066 //struct zrtp_conn_ctx_t; 00067 //#endif 00068 //#endif 00069 00072 class OpalMediaSession : public PObject 00073 { 00074 PCLASSINFO(OpalMediaSession, PObject); 00075 public: 00076 OpalMediaSession(OpalConnection & conn, const OpalMediaType & _mediaType, unsigned sessionId); 00077 OpalMediaSession(const OpalMediaSession & _obj); 00078 00079 virtual void Close() = 0; 00080 00081 virtual PObject * Clone() const = 0; 00082 00083 virtual bool IsActive() const = 0; 00084 00085 virtual bool IsRTP() const = 0; 00086 00087 virtual bool HasFailed() const = 0; 00088 00089 virtual OpalTransportAddress GetLocalMediaAddress() const = 0; 00090 00091 virtual void SetRemoteMediaAddress(const OpalTransportAddress &, const OpalMediaFormatList & ) { } 00092 00093 #if OPAL_SIP 00094 virtual SDPMediaDescription * CreateSDPMediaDescription( 00095 const OpalTransportAddress & localAddress 00096 ) = 0; 00097 #endif 00098 00099 virtual OpalMediaStream * CreateMediaStream( 00100 const OpalMediaFormat & mediaFormat, 00101 unsigned sessionID, 00102 PBoolean isSource 00103 ) = 0; 00104 00105 OpalConnection & connection; 00106 OpalMediaType mediaType; // media type for session 00107 unsigned sessionId; // unique session ID 00108 }; 00109 00110 00113 class OpalRTPMediaSession : public OpalMediaSession 00114 { 00115 PCLASSINFO(OpalRTPMediaSession, OpalMediaSession); 00116 public: 00117 OpalRTPMediaSession( 00118 OpalConnection & conn, 00119 const OpalMediaType & mediaType, 00120 unsigned sessionId 00121 ); 00122 OpalRTPMediaSession(const OpalRTPMediaSession & obj); 00123 ~OpalRTPMediaSession(); 00124 00125 PObject * Clone() const { return new OpalRTPMediaSession(*this); } 00126 00127 void Attach(RTP_Session * rtpSession); 00128 00129 virtual void Close(); 00130 00131 virtual bool IsActive() const { return rtpSession != NULL; } 00132 00133 virtual bool IsRTP() const { return true; } 00134 00135 virtual bool HasFailed() const { return (rtpSession != NULL) && (rtpSession->HasFailed() || (rtpSession->GetPacketsReceived() == 0)); } 00136 00137 virtual OpalTransportAddress GetLocalMediaAddress() const; 00138 00139 #if OPAL_SIP 00140 virtual SDPMediaDescription * CreateSDPMediaDescription( 00141 const OpalTransportAddress & localAddress 00142 ); 00143 #endif 00144 00145 virtual OpalMediaStream * CreateMediaStream( 00146 const OpalMediaFormat & mediaFormat, 00147 unsigned sessionID, 00148 PBoolean isSource 00149 ); 00150 00151 RTP_Session * GetSession() const { return rtpSession; } 00152 00153 protected: 00154 RTP_Session * rtpSession; // RTP session 00155 }; 00156 00159 class OpalRTPSessionManager : public PObject 00160 { 00161 PCLASSINFO(OpalRTPSessionManager , PObject); 00162 public: 00167 OpalRTPSessionManager( 00168 OpalRTPConnection & connection 00169 ); 00170 00172 ~OpalRTPSessionManager(); 00173 00175 OpalRTPSessionManager(const OpalRTPSessionManager & other); 00176 00178 void operator=(const OpalRTPSessionManager & other) { sessions = other.sessions; } 00180 00185 unsigned GetNextSessionID(); 00186 00193 void AddSession( 00194 RTP_Session * session, 00195 const OpalMediaType & mediaType 00196 ); 00197 void AddMediaSession( 00198 OpalMediaSession * session, 00199 const OpalMediaType & mediaType 00200 ); 00201 00204 virtual void CloseSession( 00205 unsigned sessionID 00206 ); 00207 00210 RTP_Session * GetSession( 00211 unsigned sessionID 00212 ) const; 00213 OpalMediaSession * GetMediaSession( 00214 unsigned sessionID 00215 ) const; 00216 00222 bool ChangeSessionID( 00223 unsigned fromSessionID, 00224 unsigned toSessionID 00225 ); 00227 00228 PMutex & GetMutex() { return m_mutex; } 00229 00230 virtual bool AllSessionsFailing(); 00231 00232 protected: 00233 OpalRTPConnection & m_connection; 00234 PMutex m_mutex; 00235 00236 PDICTIONARY(SessionDict, POrdinalKey, OpalMediaSession); 00237 SessionDict sessions; 00238 }; 00239 00240 00241 typedef OpalRTPSessionManager RTP_SessionManager; 00242 00243 00247 class OpalRTPConnection : public OpalConnection 00248 { 00249 PCLASSINFO(OpalRTPConnection, OpalConnection); 00250 public: 00255 OpalRTPConnection( 00256 OpalCall & call, 00257 OpalRTPEndPoint & endpoint, 00258 const PString & token, 00259 unsigned options = 0, 00260 OpalConnection::StringOptions * stringOptions = NULL 00261 ); 00262 00265 ~OpalRTPConnection(); 00266 00284 virtual void OnReleased(); 00286 00287 00292 virtual unsigned GetNextSessionID( 00293 const OpalMediaType & mediaType, 00294 bool isSource 00295 ); 00296 00300 virtual RTP_Session * GetSession( 00301 unsigned sessionID 00302 ) const; 00303 virtual OpalMediaSession * GetMediaSession( 00304 unsigned sessionID 00305 ) const; 00306 00315 virtual RTP_Session * UseSession( 00316 const OpalTransport & transport, 00317 unsigned sessionID, 00318 const OpalMediaType & mediatype, 00319 RTP_QOS * rtpqos = NULL 00320 ); 00321 00324 virtual void CloseSession( 00325 unsigned sessionID 00326 ); 00327 00332 virtual RTP_Session * CreateSession( 00333 const OpalTransport & transport, 00334 unsigned sessionID, 00335 const OpalMediaType & mediaType, 00336 RTP_QOS * rtpqos 00337 ); 00338 00341 virtual RTP_UDP * CreateRTPSession( 00342 unsigned sessionId, 00343 const OpalMediaType & mediaType, 00344 bool remoteIsNat 00345 ); 00346 00352 virtual bool ChangeSessionID( 00353 unsigned fromSessionID, 00354 unsigned toSessionID 00355 ); 00357 00362 virtual PBoolean RemoteIsNAT() const 00363 { return remoteIsNAT; } 00364 00382 virtual PBoolean IsRTPNATEnabled( 00383 const PIPSocket::Address & localAddr, 00384 const PIPSocket::Address & peerAddr, 00385 const PIPSocket::Address & signalAddr, 00386 PBoolean incoming 00387 ); 00389 00394 virtual void AttachRFC2833HandlerToPatch(PBoolean isSource, OpalMediaPatch & patch); 00395 00396 virtual PBoolean SendUserInputTone( 00397 char tone, 00398 unsigned duration = 0 00399 ); 00400 00403 struct MediaInformation { 00404 MediaInformation() { 00405 rfc2833 = RTP_DataFrame::IllegalPayloadType; 00406 ciscoNSE = RTP_DataFrame::IllegalPayloadType; 00407 } 00408 00409 OpalTransportAddress data; 00410 OpalTransportAddress control; 00411 RTP_DataFrame::PayloadTypes rfc2833; 00412 RTP_DataFrame::PayloadTypes ciscoNSE; 00413 }; 00415 00426 virtual PBoolean GetMediaInformation( 00427 unsigned sessionID, 00428 MediaInformation & info 00429 ) const; 00430 00435 virtual PBoolean IsMediaBypassPossible( 00436 unsigned sessionID 00437 ) const; 00438 00451 virtual OpalMediaStream * CreateMediaStream( 00452 const OpalMediaFormat & mediaFormat, 00453 unsigned sessionID, 00454 PBoolean isSource 00455 ); 00456 00470 virtual void AdjustMediaFormats( 00471 bool local, 00472 const OpalConnection * otherConnection, 00473 OpalMediaFormatList & mediaFormats 00474 ) const; 00475 00484 virtual void OnPatchMediaStream( 00485 PBoolean isSource, 00486 OpalMediaPatch & patch 00487 ); 00488 00494 virtual bool OnMediaCommand( 00495 OpalMediaStream & stream, 00496 const OpalMediaCommand & command 00497 ); 00499 00500 virtual void SessionFailing(RTP_Session & session); 00501 00502 protected: 00503 PDECLARE_NOTIFIER(OpalRFC2833Info, OpalRTPConnection, OnUserInputInlineRFC2833); 00504 PDECLARE_NOTIFIER(OpalRFC2833Info, OpalRTPConnection, OnUserInputInlineCiscoNSE); 00505 00506 OpalRTPSessionManager m_rtpSessions; 00507 OpalRFC2833Proto * rfc2833Handler; 00508 #if OPAL_T38_CAPABILITY 00509 OpalRFC2833Proto * ciscoNSEHandler; 00510 #endif 00511 00512 PBoolean remoteIsNAT; 00513 PBoolean useRTPAggregation; 00514 00515 #ifdef OPAL_ZRTP 00516 bool zrtpEnabled; 00517 PMutex zrtpConnInfoMutex; 00518 OpalZRTPConnectionInfo * zrtpConnInfo; 00519 #endif 00520 }; 00521 00522 00523 class RTP_UDP; 00524 00525 class OpalSecurityMode : public PObject 00526 { 00527 PCLASSINFO(OpalSecurityMode, PObject); 00528 public: 00529 virtual RTP_UDP * CreateRTPSession( 00530 OpalRTPConnection & connection, 00531 const RTP_Session::Params & options 00532 ) = 0; 00533 virtual PBoolean Open() = 0; 00534 }; 00535 00536 #endif // OPAL_OPAL_RTPCONN_H