From f520621508d13311cde0d7d91df458603a1b2d63 Mon Sep 17 00:00:00 2001
From: Stefan Sayer <stefan.sayer@googlemail.com>
Date: Thu, 15 Apr 2010 13:01:00 +0000
Subject: [PATCH 12/12] create RTP stream (AmSession::rtp_str) only if really needed
replace AmSession::rtp_str with AmSession::RTPStream() in your app.
for example for pure signaling B2B calls, no RTP stream instance is
created, which saves a lot of memory (especially because of
the RTP receive buffer)
ref r30371 r30372
git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1784 8eb893ce-cfd4-0310-b710-fb5ebe64c474
---
apps/auth_b2b/AuthB2B.cpp | 12 +++---
apps/call_timer/CallTimer.cpp | 4 +-
apps/callback/CallBack.cpp | 4 +-
apps/conference/Conference.cpp | 6 +-
apps/dsm/mods/mod_conference/ModConference.cpp | 6 +-
apps/examples/b2b_connect/b2b_connect.cpp | 4 +-
.../pinauthconference/PinAuthConference.cpp | 2 +-
apps/examples/serviceline/ServiceLine.cpp | 2 +-
.../simple_conference/SimpleConference.cpp | 2 +-
apps/gateway/GWSession.cpp | 2 +-
apps/sw_prepaid_sip/SWPrepaidSIP.cpp | 4 +-
apps/webconference/WebConferenceDialog.cpp | 4 +-
core/AmMediaProcessor.cpp | 18 ++++----
core/AmSession.cpp | 42 ++++++++++---------
core/AmSession.h | 19 +++++++--
core/plug-in/echo/Echo.cpp | 6 +-
16 files changed, 75 insertions(+), 62 deletions(-)
diff --git a/apps/auth_b2b/AuthB2B.cpp b/apps/auth_b2b/AuthB2B.cpp
index e415f9f..3cdd6ab 100644
--- a/apps/auth_b2b/AuthB2B.cpp
+++ b/apps/auth_b2b/AuthB2B.cpp
@@ -109,8 +109,8 @@ void AuthB2BDialog::onInvite(const AmSipRequest& req)
// -> only in SessionFactory::onInvite they do. todo: move the logic to
// session factory
- setReceiving(false);
- AmMediaProcessor::instance()->removeSession(this);
+ // this will prevent us from being added to media processor
+ setInOut(NULL,NULL);
if (AuthB2BFactory::user.empty()) {
string app_param = getHeader(req.hdrs, PARAM_HDR);
@@ -131,10 +131,10 @@ void AuthB2BDialog::onInvite(const AmSipRequest& req)
from = "sip:"+user+"@"+domain;
to = "sip:"+req.user+"@"+domain;
-// DBG("-----------------------------------------------------------------\n");
-// DBG("domain = %s, user = %s, pwd = %s, from = %s, to = %s;",
-// domain.c_str(), user.c_str(), password.c_str(), from.c_str(), to.c_str());
-// DBG("-----------------------------------------------------------------\n");
+ // DBG("-----------------------------------------------------------------\n");
+ // DBG("domain = %s, user = %s, pwd = %s, from = %s, to = %s;",
+ // domain.c_str(), user.c_str(), password.c_str(), from.c_str(), to.c_str());
+ // DBG("-----------------------------------------------------------------\n");
m_state = BB_Dialing;
diff --git a/apps/call_timer/CallTimer.cpp b/apps/call_timer/CallTimer.cpp
index 79a5bfe..24d6cd9 100644
--- a/apps/call_timer/CallTimer.cpp
+++ b/apps/call_timer/CallTimer.cpp
@@ -137,8 +137,8 @@ void CallTimerDialog::onInvite(const AmSipRequest& req)
return;
}
- setReceiving(false);
- AmMediaProcessor::instance()->removeSession(this);
+ // this will prevent us from being added to media processor
+ setInOut(NULL,NULL);
m_state = BB_Dialing;
diff --git a/apps/callback/CallBack.cpp b/apps/callback/CallBack.cpp
index c03f01d..988a61b 100644
--- a/apps/callback/CallBack.cpp
+++ b/apps/callback/CallBack.cpp
@@ -228,7 +228,7 @@ CallBackDialog::CallBackDialog(AmPromptCollection& prompts,
state(CBNone)
{
// set configured playout type
- rtp_str.setPlayoutType(CallBackFactory::m_PlayoutType);
+ RTPStream()->setPlayoutType(CallBackFactory::m_PlayoutType);
}
CallBackDialog::~CallBackDialog()
@@ -321,7 +321,7 @@ CallBackCalleeDialog::CallBackCalleeDialog(const string& other_tag,
: AmB2ABCalleeSession(other_tag, connector), cred(cred)
{
// set configured playout type
- rtp_str.setPlayoutType(CallBackFactory::m_PlayoutType);
+ RTPStream()->setPlayoutType(CallBackFactory::m_PlayoutType);
setDtmfDetectionEnabled(false);
}
diff --git a/apps/conference/Conference.cpp b/apps/conference/Conference.cpp
index 06ff807..4aad409 100644
--- a/apps/conference/Conference.cpp
+++ b/apps/conference/Conference.cpp
@@ -349,7 +349,7 @@ ConferenceDialog::ConferenceDialog(const string& conf_id,
allow_dialout(false)
{
dialedout = this->dialout_channel.get() != 0;
- rtp_str.setPlayoutType(ConferenceFactory::m_PlayoutType);
+ RTPStream()->setPlayoutType(ConferenceFactory::m_PlayoutType);
#ifdef WITH_SAS_TTS
tts_voice = register_cmu_us_kal();
#endif
@@ -763,7 +763,7 @@ void ConferenceDialog::createDialoutParticipant(const string& uri_user)
dialout_dlg.remote_uri = uri;
string body;
- int local_port = dialout_session->rtp_str.getLocalPort();
+ int local_port = dialout_session->RTPStream()->getLocalPort();
dialout_session->sdp.genRequest(AmConfig::LocalIP,local_port,body);
if (extra_headers.length() == 0) {
@@ -855,7 +855,7 @@ void ConferenceDialog::onSipRequest(const AmSipRequest& req)
DBG("ConferenceDialog::onSipRequest: remote_tag = %s\n",dlg.remote_tag.c_str());
string body;
- int local_port = rtp_str.getLocalPort();
+ int local_port = RTPStream()->getLocalPort();
sdp.genRequest(AmConfig::LocalIP,local_port,body);
dlg.sendRequest("INVITE","application/sdp",body,"");
diff --git a/apps/dsm/mods/mod_conference/ModConference.cpp b/apps/dsm/mods/mod_conference/ModConference.cpp
index 24f7306..791cdbc 100644
--- a/apps/dsm/mods/mod_conference/ModConference.cpp
+++ b/apps/dsm/mods/mod_conference/ModConference.cpp
@@ -195,9 +195,9 @@ EXEC_ACTION_START(ConfRejoinAction) {
EXEC_ACTION_START(ConfSetPlayoutTypeAction) {
string playout_type = resolveVars(arg, sess, sc_sess, event_params);
if (playout_type == "adaptive")
- sess->rtp_str.setPlayoutType(ADAPTIVE_PLAYOUT);
+ sess->RTPStream()->setPlayoutType(ADAPTIVE_PLAYOUT);
else if (playout_type == "jb")
- sess->rtp_str.setPlayoutType(JB_PLAYOUT);
+ sess->RTPStream()->setPlayoutType(JB_PLAYOUT);
else
- sess->rtp_str.setPlayoutType(SIMPLE_PLAYOUT);
+ sess->RTPStream()->setPlayoutType(SIMPLE_PLAYOUT);
} EXEC_ACTION_END;
diff --git a/apps/examples/b2b_connect/b2b_connect.cpp b/apps/examples/b2b_connect/b2b_connect.cpp
index 7c35c52..6c7ccfa 100644
--- a/apps/examples/b2b_connect/b2b_connect.cpp
+++ b/apps/examples/b2b_connect/b2b_connect.cpp
@@ -93,7 +93,7 @@ b2b_connectDialog::b2b_connectDialog() // AmDynInvoke* user_timer)
AmB2ABCallerSession()
{
- rtp_str.setPlayoutType(ADAPTIVE_PLAYOUT);
+ RTPStream()->setPlayoutType(ADAPTIVE_PLAYOUT);
}
b2b_connectDialog::~b2b_connectDialog()
@@ -274,7 +274,7 @@ b2b_connectCalleeSession::b2b_connectCalleeSession(const string& other_tag,
: credentials("", user, pwd), // domain (realm) is unused in credentials
AmB2ABCalleeSession(other_tag, connector)
{
- rtp_str.setPlayoutType(ADAPTIVE_PLAYOUT);
+ RTPStream()->setPlayoutType(ADAPTIVE_PLAYOUT);
setDtmfDetectionEnabled(false);
}
diff --git a/apps/examples/pinauthconference/PinAuthConference.cpp b/apps/examples/pinauthconference/PinAuthConference.cpp
index 521df25..d75e10d 100644
--- a/apps/examples/pinauthconference/PinAuthConference.cpp
+++ b/apps/examples/pinauthconference/PinAuthConference.cpp
@@ -101,7 +101,7 @@ PinAuthConferenceDialog::PinAuthConferenceDialog(AmPromptCollection& prompts)
: play_list(this), separator(this, 0), prompts(prompts), state(None)
{
// set configured playout type
- rtp_str.setPlayoutType(PinAuthConferenceFactory::m_PlayoutType);
+ RTPStream()->setPlayoutType(PinAuthConferenceFactory::m_PlayoutType);
}
PinAuthConferenceDialog::~PinAuthConferenceDialog()
diff --git a/apps/examples/serviceline/ServiceLine.cpp b/apps/examples/serviceline/ServiceLine.cpp
index a8c9b9e..427543d 100644
--- a/apps/examples/serviceline/ServiceLine.cpp
+++ b/apps/examples/serviceline/ServiceLine.cpp
@@ -204,7 +204,7 @@ ServiceLineCalleeDialog::ServiceLineCalleeDialog(const string& other_tag,
ServiceLineFactory::GWAuthuser,
ServiceLineFactory::GWAuthpwd)
{
- rtp_str.setPlayoutType(ADAPTIVE_PLAYOUT);
+ RTPStream()->setPlayoutType(ADAPTIVE_PLAYOUT);
setDtmfDetectionEnabled(false);
}
diff --git a/apps/examples/simple_conference/SimpleConference.cpp b/apps/examples/simple_conference/SimpleConference.cpp
index ccc0930..9a5c9f7 100644
--- a/apps/examples/simple_conference/SimpleConference.cpp
+++ b/apps/examples/simple_conference/SimpleConference.cpp
@@ -60,7 +60,7 @@ SimpleConferenceDialog::SimpleConferenceDialog()
: play_list(this)
{
// use adaptive playout - its the best method around
- rtp_str.setPlayoutType(ADAPTIVE_PLAYOUT);
+ RTPStream()->setPlayoutType(ADAPTIVE_PLAYOUT);
}
SimpleConferenceDialog::~SimpleConferenceDialog()
diff --git a/apps/gateway/GWSession.cpp b/apps/gateway/GWSession.cpp
index f7c3b00..e946839 100644
--- a/apps/gateway/GWSession.cpp
+++ b/apps/gateway/GWSession.cpp
@@ -26,7 +26,7 @@ void GWSession::setOtherLeg(AmAudio *otherleg) {
}
void GWSession::onInvite(const AmSipRequest& req) {
DBG("GWSession::onInvite\n");
-// rtp_str.setMonitorRTPTimeout(false);
+// RTPStream()->setMonitorRTPTimeout(false);
invite_req=req;
return;
}
diff --git a/apps/sw_prepaid_sip/SWPrepaidSIP.cpp b/apps/sw_prepaid_sip/SWPrepaidSIP.cpp
index d2d7fb9..339d1d2 100644
--- a/apps/sw_prepaid_sip/SWPrepaidSIP.cpp
+++ b/apps/sw_prepaid_sip/SWPrepaidSIP.cpp
@@ -118,8 +118,8 @@ void SWPrepaidSIPDialog::onInvite(const AmSipRequest& req)
// TODO: errors thrown as exception don't seem to trigger a reply?
- setReceiving(false);
- AmMediaProcessor::instance()->removeSession(this);
+ // this will prevent us from being added to media processor
+ setInOut(NULL,NULL);
m_uuid = getHeader(req.hdrs,"P-Caller-Uuid");
if(!m_uuid.length()) {
diff --git a/apps/webconference/WebConferenceDialog.cpp b/apps/webconference/WebConferenceDialog.cpp
index d41d191..d95ac6f 100644
--- a/apps/webconference/WebConferenceDialog.cpp
+++ b/apps/webconference/WebConferenceDialog.cpp
@@ -40,7 +40,7 @@ WebConferenceDialog::WebConferenceDialog(AmPromptCollection& prompts,
is_dialout = (cred != NULL);
accept_early_session = is_dialout;
// set configured playout type
- rtp_str.setPlayoutType(WebConferenceFactory::m_PlayoutType);
+ RTPStream()->setPlayoutType(WebConferenceFactory::m_PlayoutType);
}
WebConferenceDialog::WebConferenceDialog(AmPromptCollection& prompts,
@@ -54,7 +54,7 @@ WebConferenceDialog::WebConferenceDialog(AmPromptCollection& prompts,
DBG("set conf_id to %s\n", conf_id.c_str());
is_dialout = false;
// set configured playout type
- rtp_str.setPlayoutType(WebConferenceFactory::m_PlayoutType);
+ RTPStream()->setPlayoutType(WebConferenceFactory::m_PlayoutType);
}
WebConferenceDialog::~WebConferenceDialog()
diff --git a/core/AmMediaProcessor.cpp b/core/AmMediaProcessor.cpp
index c59b930..312d5c8 100644
--- a/core/AmMediaProcessor.cpp
+++ b/core/AmMediaProcessor.cpp
@@ -284,10 +284,10 @@ void AmMediaProcessorThread::processAudio(unsigned int ts)
AmSession* s = (*it);
// todo: get frame size/checkInterval from local audio if local in+out (?)
- unsigned int f_size = s->rtp_str.getFrameSize();
+ unsigned int f_size = s->RTPStream()->getFrameSize();
// complete frame time reached?
- if (s->rtp_str.checkInterval(ts, f_size)) {
+ if (s->RTPStream()->checkInterval(ts, f_size)) {
s->lockAudio();
int got_audio = -1;
@@ -295,8 +295,8 @@ void AmMediaProcessorThread::processAudio(unsigned int ts)
// get/receive audio
if (!s->getAudioLocal(AM_AUDIO_IN)) {
// input is not local - receive from rtp stream
- if (s->rtp_str.receiving || s->rtp_str.getPassiveMode()) {
- int ret = s->rtp_str.receive(ts);
+ if (s->RTPStream()->receiving || s->RTPStream()->getPassiveMode()) {
+ int ret = s->RTPStream()->receive(ts);
if(ret < 0){
switch(ret){
@@ -317,7 +317,7 @@ void AmMediaProcessorThread::processAudio(unsigned int ts)
break;
}
} else {
- got_audio = s->rtp_str.get(ts,buffer,f_size);
+ got_audio = s->RTPStream()->get(ts,buffer,f_size);
if (s->isDtmfDetectionEnabled() && got_audio > 0)
s->putDtmfAudio(buffer, got_audio, ts);
@@ -355,9 +355,9 @@ void AmMediaProcessorThread::processAudio(unsigned int ts)
s->lockAudio();
AmAudio* output = s->getOutput();
- if(output && s->rtp_str.sendIntReached()){
+ if(output && s->RTPStream()->sendIntReached()){
- int size = output->get(ts,buffer,s->rtp_str.getFrameSize());
+ int size = output->get(ts,buffer,s->RTPStream()->getFrameSize());
if(size <= 0){
DBG("output->get() returned: %i\n",size);
postRequest(new SchedRequest(AmMediaProcessor::ClearSession,s));
@@ -365,8 +365,8 @@ void AmMediaProcessorThread::processAudio(unsigned int ts)
else {
if (!s->getAudioLocal(AM_AUDIO_OUT)) {
// audio should go to RTP
- if(!s->rtp_str.mute){
- if(s->rtp_str.put(ts,buffer,size)<0)
+ if(!s->RTPStream()->mute){
+ if(s->RTPStream()->put(ts,buffer,size)<0)
postRequest(new SchedRequest(AmMediaProcessor::ClearSession,s));
}
} else {
diff --git a/core/AmSession.cpp b/core/AmSession.cpp
index e25caaf..38d23e3 100644
--- a/core/AmSession.cpp
+++ b/core/AmSession.cpp
@@ -60,7 +60,7 @@ AmSession::AmSession()
: AmEventQueue(this), // AmDialogState(),
dlg(this),
detached(true),
- sess_stopped(false),rtp_str(this),negotiate_onreply(false),
+ sess_stopped(false),negotiate_onreply(false),
input(0), output(0), local_input(0), local_output(0),
m_dtmfDetector(this), m_dtmfEventQueue(&m_dtmfDetector),
m_dtmfDetectionEnabled(true),
@@ -208,7 +208,7 @@ const vector<SdpPayload*>& AmSession::getPayloads()
int AmSession::getRPort()
{
- return rtp_str.getRPort();
+ return RTPStream()->getRPort();
}
AmPayloadProviderInterface* AmSession::getPayloadProvider() {
@@ -262,7 +262,7 @@ void AmSession::negotiate(const string& sdp_body,
telephone_event_payload->payload_type);
lockAudio();
- rtp_str.setTelephoneEventPT(telephone_event_payload);
+ RTPStream()->setTelephoneEventPT(telephone_event_payload);
unlockAudio();
}
else {
@@ -280,9 +280,9 @@ void AmSession::negotiate(const string& sdp_body,
lockAudio();
try {
- rtp_str.setLocalIP(AmConfig::LocalIP);
- rtp_str.setPassiveMode(passive_mode);
- rtp_str.setRAddr(r_host, r_port);
+ RTPStream()->setLocalIP(AmConfig::LocalIP);
+ RTPStream()->setPassiveMode(passive_mode);
+ RTPStream()->setRAddr(r_host, r_port);
} catch (const string& err_str) {
unlockAudio();
throw AmSession::Exception(400, err_str);
@@ -293,7 +293,9 @@ void AmSession::negotiate(const string& sdp_body,
unlockAudio();
if(sdp_reply)
- sdp.genResponse(advertisedIP(), rtp_str.getLocalPort(), *sdp_reply, AmConfig::SingleCodecInOK);
+ sdp.genResponse(advertisedIP(),
+ RTPStream()->getLocalPort(),
+ *sdp_reply, AmConfig::SingleCodecInOK);
}
void AmSession::run()
@@ -318,7 +320,7 @@ void AmSession::run()
return;
}
- zrtp_audio = zrtp_attach_stream(zrtp_session, rtp_str.get_ssrc());
+ zrtp_audio = zrtp_attach_stream(zrtp_session, RTPStream()->get_ssrc());
zrtp_audio->stream_usr_data = this;
if (NULL == zrtp_audio) {
@@ -648,7 +650,7 @@ void AmSession::onSipReply(const AmSipReply& reply)
case AmSipDialog::Connected:
try {
- rtp_str.setMonitorRTPTimeout(true);
+ RTPStream()->setMonitorRTPTimeout(true);
acceptAudio(reply.body,reply.hdrs);
@@ -681,7 +683,7 @@ void AmSession::onSipReply(const AmSipReply& reply)
onRinging(reply);
- rtp_str.setMonitorRTPTimeout(false);
+ RTPStream()->setMonitorRTPTimeout(false);
if(input || output || local_input || local_output)
AmMediaProcessor::instance()->addSession(this,
@@ -697,10 +699,10 @@ void AmSession::onSipReply(const AmSipReply& reply)
onEarlySessionStart(reply);
- rtp_str.setMonitorRTPTimeout(false);
+ RTPStream()->setMonitorRTPTimeout(false);
// ping the other side to open fw/NAT/symmetric RTP
- rtp_str.ping();
+ RTPStream()->ping();
if(input || output || local_input || local_output)
AmMediaProcessor::instance()->addSession(this,
@@ -760,11 +762,11 @@ int AmSession::acceptAudio(const string& body,
// enable RTP stream
lockAudio();
- rtp_str.init(m_payloads);
+ RTPStream()->init(m_payloads);
unlockAudio();
DBG("Sending Rtp data to %s/%i\n",
- rtp_str.getRHost().c_str(),rtp_str.getRPort());
+ RTPStream()->getRHost().c_str(),RTPStream()->getRPort());
return 0;
}
@@ -819,9 +821,9 @@ void AmSession::sendUpdate()
void AmSession::sendReinvite(bool updateSDP, const string& headers)
{
if (updateSDP) {
- rtp_str.setLocalIP(AmConfig::LocalIP);
+ RTPStream()->setLocalIP(AmConfig::LocalIP);
string sdp_body;
- sdp.genResponse(advertisedIP(), rtp_str.getLocalPort(), sdp_body);
+ sdp.genResponse(advertisedIP(), RTPStream()->getLocalPort(), sdp_body);
dlg.reinvite(headers, "application/sdp", sdp_body);
} else {
dlg.reinvite(headers, "", "");
@@ -834,19 +836,19 @@ int AmSession::sendInvite(const string& headers)
// Set local IP first, so that IP is set when
// getLocalPort/setLocalPort may bind.
- rtp_str.setLocalIP(AmConfig::LocalIP);
+ RTPStream()->setLocalIP(AmConfig::LocalIP);
// Generate SDP.
string sdp_body;
- sdp.genRequest(advertisedIP(), rtp_str.getLocalPort(), sdp_body);
+ sdp.genRequest(advertisedIP(), RTPStream()->getLocalPort(), sdp_body);
return dlg.invite(headers, "application/sdp", sdp_body);
}
void AmSession::setOnHold(bool hold)
{
lockAudio();
- bool old_hold = rtp_str.getOnHold();
- rtp_str.setOnHold(hold);
+ bool old_hold = RTPStream()->getOnHold();
+ RTPStream()->setOnHold(hold);
if (hold != old_hold)
sendReinvite();
unlockAudio();
diff --git a/core/AmSession.h b/core/AmSession.h
index 6fb4356..74c03bf 100644
--- a/core/AmSession.h
+++ b/core/AmSession.h
@@ -111,7 +111,9 @@ private:
friend class AmMediaProcessorThread;
friend class AmSessionContainer;
friend class AmSessionFactory;
-
+
+ auto_ptr<AmRtpAudio> _rtp_str;
+
protected:
AmSdp sdp;
@@ -126,7 +128,7 @@ protected:
public:
- AmRtpAudio rtp_str;
+ AmRtpAudio* RTPStream();
#ifdef WITH_ZRTP
zrtp_conn_ctx_t* zrtp_session; // ZRTP session
@@ -253,10 +255,10 @@ public:
void clearAudio();
/** setter for rtp_str->mute */
- void setMute(bool mute) { rtp_str.mute = mute; }
+ void setMute(bool mute) { RTPStream()->mute = mute; }
/** setter for rtp_str->receiving */
- void setReceiving(bool receive) { rtp_str.receiving = receive; }
+ void setReceiving(bool receive) { RTPStream()->receiving = receive; }
/** Gets the Session's call ID */
const string& getCallID() const;
@@ -477,6 +479,15 @@ public:
string advertisedIP();
};
+inline AmRtpAudio* AmSession::RTPStream() {
+ if (NULL == _rtp_str.get()) {
+ DBG("creating RTP stream instance for session [%p]\n",
+ this);
+ _rtp_str.reset(new AmRtpAudio(this));
+ }
+ return _rtp_str.get();
+}
+
#endif
// Local Variables:
diff --git a/core/plug-in/echo/Echo.cpp b/core/plug-in/echo/Echo.cpp
index 21a6a29..a90e051 100644
--- a/core/plug-in/echo/Echo.cpp
+++ b/core/plug-in/echo/Echo.cpp
@@ -104,13 +104,13 @@ EchoDialog::~EchoDialog()
void EchoDialog::onSessionStart(const AmSipRequest& req)
{
- rtp_str.setPlayoutType(playout_type);
+ RTPStream()->setPlayoutType(playout_type);
setInOut(&echo,&echo);
}
void EchoDialog::onSessionStart(const AmSipReply& req)
{
- rtp_str.setPlayoutType(playout_type);
+ RTPStream()->setPlayoutType(playout_type);
setInOut(&echo,&echo);
}
@@ -134,7 +134,7 @@ void EchoDialog::onDtmf(int event, int duration)
playout_type = SIMPLE_PLAYOUT;
DBG("received *. set playout technique to %s.\n", pt);
- rtp_str.setPlayoutType(playout_type);
+ RTPStream()->setPlayoutType(playout_type);
}
#endif
}
--
1.7.2.1