summaryrefslogtreecommitdiff
path: root/orkaudio
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2005-10-28 03:07:51 +0000
committerHenri Herscher <henri@oreka.org>2005-10-28 03:07:51 +0000
commitef48a96e268f65e6651138e9902d309c18be2e23 (patch)
tree4eed3275fb80c2ad84b9118f7a3b236c4be503e2 /orkaudio
parente76fa0b3e203a5eeebc15eed92be79933bd94457 (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.cpp112
-rw-r--r--orkaudio/audiocaptureplugins/voip/SipSession.h13
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);