diff options
author | Henri Herscher <henri@oreka.org> | 2005-10-28 03:07:51 +0000 |
---|---|---|
committer | Henri Herscher <henri@oreka.org> | 2005-10-28 03:07:51 +0000 |
commit | ef48a96e268f65e6651138e9902d309c18be2e23 (patch) | |
tree | 4eed3275fb80c2ad84b9118f7a3b236c4be503e2 /orkaudio | |
parent | e76fa0b3e203a5eeebc15eed92be79933bd94457 (diff) |
Now supports Raw RTP sessions as well as SIP/RTP. SipSession still needs renaming since it is effectively an RTP session object.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@19 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkaudio')
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/SipSession.cpp | 112 | ||||
-rw-r--r-- | orkaudio/audiocaptureplugins/voip/SipSession.h | 13 |
2 files changed, 106 insertions, 19 deletions
diff --git a/orkaudio/audiocaptureplugins/voip/SipSession.cpp b/orkaudio/audiocaptureplugins/voip/SipSession.cpp index 2139a28..b6b3132 100644 --- a/orkaudio/audiocaptureplugins/voip/SipSession.cpp +++ b/orkaudio/audiocaptureplugins/voip/SipSession.cpp @@ -37,11 +37,14 @@ SipSession::SipSession() m_inviteeIp.s_addr = 0; m_inviteeTcpPort = 0; m_direction = CaptureEvent::DirUnkn; + m_protocol = ProtocolEnum::ProtUnkn; + m_numRtpPackets = 0; + m_started = false; } void SipSession::Stop() { - LOG4CXX_DEBUG(m_log, m_capturePort + " SIP Session stop"); + LOG4CXX_DEBUG(m_log, m_capturePort + " Session stop"); CaptureEventRef stopEvent(new CaptureEvent); stopEvent->m_type = CaptureEvent::EtStop; stopEvent->m_timestamp = time(NULL); @@ -50,7 +53,8 @@ void SipSession::Stop() void SipSession::Start() { - LOG4CXX_DEBUG(m_log, m_capturePort + " SIP Session start"); + m_started = true; + LOG4CXX_DEBUG(m_log, m_capturePort + " Session start"); m_rtpRingBuffer.SetCapturePort(m_capturePort); CaptureEventRef startEvent(new CaptureEvent); startEvent->m_type = CaptureEvent::EtStart; @@ -58,7 +62,7 @@ void SipSession::Start() g_captureEventCallBack(startEvent, m_capturePort); } -void SipSession::ProcessMetadataIncoming() +void SipSession::ProcessMetadataSipIncoming() { m_remoteParty = m_invite->m_from; m_localParty = m_invite->m_to; @@ -66,7 +70,7 @@ void SipSession::ProcessMetadataIncoming() m_capturePort.Format("%s,%d", ACE_OS::inet_ntoa(m_inviteeIp), m_inviteeTcpPort); } -void SipSession::ProcessMetadataOutgoing() +void SipSession::ProcessMetadataSipOutgoing() { m_remoteParty = m_invite->m_to; m_localParty = m_invite->m_from; @@ -74,7 +78,54 @@ void SipSession::ProcessMetadataOutgoing() m_capturePort.Format("%s,%d", ACE_OS::inet_ntoa(m_invitorIp), m_invitorTcpPort); } -void SipSession::ProcessMetadata(RtpPacketInfoRef& rtpPacket) +void SipSession::ProcessMetadataRawRtp(RtpPacketInfoRef& rtpPacket) +{ + bool sourceIsLocal = true; + + if(DLLCONFIG.IsMediaGateway(rtpPacket->m_sourceIp)) + { + if(DLLCONFIG.IsMediaGateway(rtpPacket->m_destIp)) + { + // media gateway to media gateway + sourceIsLocal = false; + } + else if (DLLCONFIG.IsPartOfLan(rtpPacket->m_destIp)) + { + // Media gateway to internal + sourceIsLocal = false; + } + else + { + // Media gateway to external + sourceIsLocal = true; + } + } + else if (DLLCONFIG.IsPartOfLan(rtpPacket->m_sourceIp)) + { + // source address is internal + sourceIsLocal = true; + } + else + { + // source address is external + sourceIsLocal = false; + } + + if(sourceIsLocal) + { + m_localParty.Format("%s", ACE_OS::inet_ntoa(rtpPacket->m_sourceIp)); + m_remoteParty.Format("%s", ACE_OS::inet_ntoa(rtpPacket->m_destIp)); + m_capturePort.Format("%s,%d", ACE_OS::inet_ntoa(rtpPacket->m_sourceIp), rtpPacket->m_sourcePort); + } + else + { + m_localParty.Format("%s", ACE_OS::inet_ntoa(rtpPacket->m_destIp)); + m_remoteParty.Format("%s", ACE_OS::inet_ntoa(rtpPacket->m_sourceIp)); + m_capturePort.Format("%s,%d", ACE_OS::inet_ntoa(rtpPacket->m_destIp), rtpPacket->m_destPort); + } +} + +void SipSession::ProcessMetadataSip(RtpPacketInfoRef& rtpPacket) { bool done = false; @@ -105,12 +156,12 @@ void SipSession::ProcessMetadata(RtpPacketInfoRef& rtpPacket) } if(DLLCONFIG.IsPartOfLan(m_inviteeIp)) { - ProcessMetadataIncoming(); + ProcessMetadataSipIncoming(); } } else if (DLLCONFIG.IsPartOfLan(m_invitorIp)) { - ProcessMetadataOutgoing(); + ProcessMetadataSipOutgoing(); } else { @@ -121,12 +172,12 @@ void SipSession::ProcessMetadata(RtpPacketInfoRef& rtpPacket) } else if(DLLCONFIG.IsPartOfLan(m_inviteeIp)) { - ProcessMetadataIncoming(); + ProcessMetadataSipIncoming(); } else { // SIP invitee IP address is an outside IP address - ProcessMetadataOutgoing(); + ProcessMetadataSipOutgoing(); } } } @@ -158,20 +209,37 @@ void SipSession::AddRtpPacket(RtpPacketInfoRef& rtpPacket) // if first RTP packet, start session if(m_lastRtpPacket.get() == NULL) { - ProcessMetadata(rtpPacket); + if(m_protocol == ProtRawRtp) + { + ProcessMetadataRawRtp(rtpPacket); + } + else if(m_protocol == ProtSip) + { + ProcessMetadataSip(rtpPacket); + Start(); + ReportMetadata(); + } + } + m_lastRtpPacket = rtpPacket; + m_numRtpPackets++; + + if(m_protocol == ProtRawRtp && m_numRtpPackets == 50) + { + // We've got 50 RTP packets, this should be a "real" raw RTP session, not a leftover from a SIP session Start(); ReportMetadata(); } - m_lastRtpPacket = rtpPacket; // send audio buffer //AudioChunkRef chunkRef(new AudioChunk); //chunkRef->SetBuffer(rtpPacket->m_payload, rtpPacket->m_payloadSize, AudioChunk::AlawAudio); //g_audioChunkCallBack(chunkRef, m_ipAndPort); - - m_rtpRingBuffer.AddRtpPacket(rtpPacket); - - m_lastUpdated = time(NULL); + + if(m_started) + { + m_rtpRingBuffer.AddRtpPacket(rtpPacket); + m_lastUpdated = time(NULL); + } } @@ -204,6 +272,7 @@ void SipSessions::ReportSipInvite(SipInviteInfoRef& invite) // create new session and insert into both maps SipSessionRef session(new SipSession()); session->m_ipAndPort = key; + session->m_protocol = SipSession::ProtSip; session->ReportSipInvite(invite); m_byCallId.insert(std::make_pair(invite->m_callId, session)); m_byIpAndPort.insert(std::make_pair(key, session)); @@ -226,7 +295,10 @@ void SipSessions::Stop(SipSessionRef& session) { session->Stop(); m_byIpAndPort.erase(session->m_ipAndPort); - m_byCallId.erase(session->m_invite->m_callId); + if(session->m_invite.get() != NULL) + { + m_byCallId.erase(session->m_invite->m_callId); + } } @@ -253,6 +325,14 @@ void SipSessions::ReportRtpPacket(RtpPacketInfoRef& rtpPacket) { session = pair->second; } + else + { + // create new Raw RTP session and insert into IP+Port map + SipSessionRef session(new SipSession()); + session->m_protocol = SipSession::ProtRawRtp; + session->m_ipAndPort = ipAndPort; + m_byIpAndPort.insert(std::make_pair(ipAndPort, session)); + } } if (!session.get() == NULL) { diff --git a/orkaudio/audiocaptureplugins/voip/SipSession.h b/orkaudio/audiocaptureplugins/voip/SipSession.h index c1aa379..399e4f4 100644 --- a/orkaudio/audiocaptureplugins/voip/SipSession.h +++ b/orkaudio/audiocaptureplugins/voip/SipSession.h @@ -40,6 +40,8 @@ public: class SipSession { public: + typedef enum{ProtRawRtp, ProtSip, ProtUnkn} ProtocolEnum; + SipSession(); void Stop(); void Start(); @@ -49,13 +51,16 @@ public: CStdString m_ipAndPort; SipInviteInfoRef m_invite; time_t m_lastUpdated; + ProtocolEnum m_protocol; private: - void ProcessMetadata(RtpPacketInfoRef&); - void ProcessMetadataIncoming(); - void ProcessMetadataOutgoing(); + void ProcessMetadataSip(RtpPacketInfoRef&); + void ProcessMetadataSipIncoming(); + void ProcessMetadataSipOutgoing(); + void ProcessMetadataRawRtp(RtpPacketInfoRef&); void ReportMetadata(); RtpPacketInfoRef m_lastRtpPacket; + int m_numRtpPackets; RtpRingBuffer m_rtpRingBuffer; struct in_addr m_invitorIp; int m_invitorTcpPort; @@ -66,6 +71,7 @@ private: CStdString m_localParty; CStdString m_remoteParty; CaptureEvent::DirectionEnum m_direction; + bool m_started; }; typedef boost::shared_ptr<SipSession> SipSessionRef; @@ -73,6 +79,7 @@ class SipSessions { public: SipSessions(); + void Create(CStdString& ipAndPort); void Stop(SipSessionRef& session); void ReportSipInvite(SipInviteInfoRef& invite); void ReportSipBye(SipByeInfo bye); |