diff --git a/sems-0001-Force-to-use-system-wide-GSM-includes.patch b/sems-0001-Force-to-use-system-wide-GSM-includes.patch index 1be55f5..48d064d 100644 --- a/sems-0001-Force-to-use-system-wide-GSM-includes.patch +++ b/sems-0001-Force-to-use-system-wide-GSM-includes.patch @@ -1,7 +1,7 @@ From eff73786b505f8be8bf54815c379323f01cf7fd2 Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Wed, 31 Mar 2010 11:52:52 +0400 -Subject: [PATCH 01/11] Force to use system-wide GSM includes +Subject: [PATCH 01/12] Force to use system-wide GSM includes Signed-off-by: Peter Lemenkov --- @@ -22,5 +22,5 @@ index 805ef78..bfc6a59 100644 #include -- -1.7.0.1 +1.7.2.1 diff --git a/sems-0002-Allow-rewrite-of-custom-makefiles-by-CMake.patch b/sems-0002-Allow-rewrite-of-custom-makefiles-by-CMake.patch index a2b7fd3..652d32b 100644 --- a/sems-0002-Allow-rewrite-of-custom-makefiles-by-CMake.patch +++ b/sems-0002-Allow-rewrite-of-custom-makefiles-by-CMake.patch @@ -1,7 +1,7 @@ From d4fd6eb9b0964fdf982c35a919b254d1f50a6c2d Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Wed, 31 Mar 2010 11:53:48 +0400 -Subject: [PATCH 02/11] Allow rewrite of custom makefiles by CMake +Subject: [PATCH 02/12] Allow rewrite of custom makefiles by CMake Signed-off-by: Peter Lemenkov --- @@ -29,5 +29,5 @@ index 518b14c..c7c6e40 100644 OPTION(SEMS_USE_LIBSAMPLERATE "Build with libsamplerate" OFF) OPTION(SEMS_USE_ZRTP "Build with ZRTP" OFF) -- -1.7.0.1 +1.7.2.1 diff --git a/sems-0003-Set-CFG_PREFIX-to-empty-string-by-default.patch b/sems-0003-Set-CFG_PREFIX-to-empty-string-by-default.patch index 67bdd05..98b7b52 100644 --- a/sems-0003-Set-CFG_PREFIX-to-empty-string-by-default.patch +++ b/sems-0003-Set-CFG_PREFIX-to-empty-string-by-default.patch @@ -1,7 +1,7 @@ From fae8f9be9808a690bf8e75fa9b330b32f6953e28 Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Wed, 31 Mar 2010 18:56:39 +0400 -Subject: [PATCH 03/11] Set CFG_PREFIX to empty string by default +Subject: [PATCH 03/12] Set CFG_PREFIX to empty string by default Signed-off-by: Peter Lemenkov --- @@ -22,5 +22,5 @@ index c7c6e40..e0d749a 100644 MESSAGE(STATUS "SEMS cfg prefix was set to: ${SEMS_CFG_PREFIX}") -- -1.7.0.1 +1.7.2.1 diff --git a/sems-0004-Fix-for-old-python-2.4.patch b/sems-0004-Fix-for-old-python-2.4.patch index 89a9231..7aabae9 100644 --- a/sems-0004-Fix-for-old-python-2.4.patch +++ b/sems-0004-Fix-for-old-python-2.4.patch @@ -1,7 +1,7 @@ From 981076a117ca8dd86b7f500c9ecf1def548ff008 Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Sat, 1 May 2010 22:19:48 +0400 -Subject: [PATCH 04/11] Fix for old python 2.4 +Subject: [PATCH 04/12] Fix for old python 2.4 Signed-off-by: Peter Lemenkov --- @@ -22,5 +22,5 @@ index f4ed59f..1a0dccb 100644 void IvrFactory::import_ivr_builtins() -- -1.7.0.1 +1.7.2.1 diff --git a/sems-0005-More-compatibility-with-older-CMake-2.4.patch b/sems-0005-More-compatibility-with-older-CMake-2.4.patch index e93f4f5..151699c 100644 --- a/sems-0005-More-compatibility-with-older-CMake-2.4.patch +++ b/sems-0005-More-compatibility-with-older-CMake-2.4.patch @@ -1,7 +1,7 @@ From 70caab6374a2c288d589be0e7200a06c6c5bfa4f Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Tue, 18 May 2010 17:31:11 +0000 -Subject: [PATCH 05/11] More compatibility with older CMake (2.4). +Subject: [PATCH 05/12] More compatibility with older CMake (2.4). Signed-off-by: Peter Lemenkov --- @@ -173,5 +173,5 @@ index 959f268..1f4dcfb 100644 SET(sems_module_libs libilbc) INCLUDE(${CMAKE_SOURCE_DIR}/cmake/module.rules.txt) -- -1.7.0.1 +1.7.2.1 diff --git a/sems-0006-Typo-paramater-parameter.patch b/sems-0006-Typo-paramater-parameter.patch index 1410e77..6d20d2b 100644 --- a/sems-0006-Typo-paramater-parameter.patch +++ b/sems-0006-Typo-paramater-parameter.patch @@ -1,7 +1,7 @@ From d5cdf8f173398c3a46754efebdcb7b5d2194d559 Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Wed, 2 Jun 2010 09:15:40 +0000 -Subject: [PATCH 06/11] Typo: paramater => parameter +Subject: [PATCH 06/12] Typo: paramater => parameter Signed-off-by: Peter Lemenkov @@ -73,5 +73,5 @@ index 35ad77a..d834dc7 100644 } -- -1.7.0.1 +1.7.2.1 diff --git a/sems-0007-Copy-paste-typo-this-conf-file-actually-is-a-early_a.patch b/sems-0007-Copy-paste-typo-this-conf-file-actually-is-a-early_a.patch index a07bb11..a670426 100644 --- a/sems-0007-Copy-paste-typo-this-conf-file-actually-is-a-early_a.patch +++ b/sems-0007-Copy-paste-typo-this-conf-file-actually-is-a-early_a.patch @@ -1,7 +1,7 @@ From dce67b7d86d73820adec085199a7fcc6de1fe096 Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Wed, 2 Jun 2010 09:15:46 +0000 -Subject: [PATCH 07/11] Copy+paste typo: this conf-file actually is a early_announce.conf +Subject: [PATCH 07/12] Copy+paste typo: this conf-file actually is a early_announce.conf Signed-off-by: Peter Lemenkov @@ -31,5 +31,5 @@ index 0802758..2db385b 100644 } -- -1.7.0.1 +1.7.2.1 diff --git a/sems-0008-Fix-MOD_NAME-passing-to-gcc.patch b/sems-0008-Fix-MOD_NAME-passing-to-gcc.patch index d194d65..b34fcb1 100644 --- a/sems-0008-Fix-MOD_NAME-passing-to-gcc.patch +++ b/sems-0008-Fix-MOD_NAME-passing-to-gcc.patch @@ -1,7 +1,7 @@ From d84e195c467dbd7a611b67f8110039916c799ada Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Wed, 2 Jun 2010 11:12:34 +0000 -Subject: [PATCH 08/11] Fix MOD_NAME passing to gcc +Subject: [PATCH 08/12] Fix MOD_NAME passing to gcc Signed-off-by: Peter Lemenkov @@ -24,5 +24,5 @@ index 80ec94e..6299ee0 100644 # all modules should be linked against ${CMAKE_DL_LIBS} at least # and with additional ${sems_module_libs} if they exists -- -1.7.0.1 +1.7.2.1 diff --git a/sems-0009-More-CMake-templates-for-config-files.patch b/sems-0009-More-CMake-templates-for-config-files.patch index 6a3560f..454b407 100644 --- a/sems-0009-More-CMake-templates-for-config-files.patch +++ b/sems-0009-More-CMake-templates-for-config-files.patch @@ -1,7 +1,7 @@ From 097859c512f325ea877d6b427a0ce9ac5d1c10fb Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Wed, 2 Jun 2010 12:02:20 +0000 -Subject: [PATCH 09/11] More CMake templates for config-files +Subject: [PATCH 09/12] More CMake templates for config-files Signed-off-by: Peter Lemenkov @@ -45,5 +45,5 @@ index 0000000..96ba1e1 @@ -0,0 +1 @@ +script_path=${SEMS_EXEC_PREFIX}/${SEMS_LIBDIR}/sems/py_sems/ -- -1.7.0.1 +1.7.2.1 diff --git a/sems-0010-Fix-newest-variables-escaping-strategy-on-new-CMake.patch b/sems-0010-Fix-newest-variables-escaping-strategy-on-new-CMake.patch index 2fa7d15..f84b005 100644 --- a/sems-0010-Fix-newest-variables-escaping-strategy-on-new-CMake.patch +++ b/sems-0010-Fix-newest-variables-escaping-strategy-on-new-CMake.patch @@ -1,7 +1,7 @@ From 0ebc0eb0051a62d26e9788af15b4a8cb7c2e9562 Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Wed, 2 Jun 2010 13:13:04 +0000 -Subject: [PATCH 10/11] Fix newest variables escaping strategy on new CMake +Subject: [PATCH 10/12] Fix newest variables escaping strategy on new CMake Signed-off-by: Peter Lemenkov @@ -24,5 +24,5 @@ index 0cfb538..8eb128b 100644 SET(SEMS_MAJOR_VERSION 1) -- -1.7.0.1 +1.7.2.1 diff --git a/sems-0011-Disable-mysql-in-conference-and-early_announce-modul.patch b/sems-0011-Disable-mysql-in-conference-and-early_announce-modul.patch index 587e8ba..c0c0cd9 100644 --- a/sems-0011-Disable-mysql-in-conference-and-early_announce-modul.patch +++ b/sems-0011-Disable-mysql-in-conference-and-early_announce-modul.patch @@ -1,7 +1,7 @@ From 90b5fcd79d4c6366b1b8f8d12c8670968d6c70d3 Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Fri, 25 Jun 2010 12:16:45 +0400 -Subject: [PATCH 11/11] Disable mysql++ in conference and early_announce modules +Subject: [PATCH 11/12] Disable mysql++ in conference and early_announce modules Unfortunately, this breaks existing configurations, which is a no-go situation for EPEL repository. We'll enable it later. @@ -59,5 +59,5 @@ index 184d282..1e23638 100644 SET(sems_module_name early_announce) INCLUDE(${CMAKE_SOURCE_DIR}/cmake/module.rules.txt) -- -1.7.0.1 +1.7.2.1 diff --git a/sems-0012-create-RTP-stream-AmSession-rtp_str-only-if-really-n.patch b/sems-0012-create-RTP-stream-AmSession-rtp_str-only-if-really-n.patch new file mode 100644 index 0000000..4723a8a --- /dev/null +++ b/sems-0012-create-RTP-stream-AmSession-rtp_str-only-if-really-n.patch @@ -0,0 +1,549 @@ +From f520621508d13311cde0d7d91df458603a1b2d63 Mon Sep 17 00:00:00 2001 +From: Stefan Sayer +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& 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 _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 + diff --git a/sems.spec b/sems.spec index 5b4341e..993c411 100644 --- a/sems.spec +++ b/sems.spec @@ -1,7 +1,7 @@ Summary: SIP Express Media Server, an extensible SIP media server Name: sems Version: 1.2.1 -Release: 5%{?dist} +Release: 6%{?dist} URL: http://www.iptel.org/sems ## wget http://ftp.iptel.org/pub/sems/1.2/1.2.1/src/sems-1.2.1.tar.gz ## tar zx --exclude iLBC_rfc3951 -f sems-1.2.1.tar.gz @@ -32,6 +32,8 @@ Patch10: sems-0010-Fix-newest-variables-escaping-strategy-on-new-CMake.patch # Disable MySQL++ in conference and early_announce until good docs and failover to # existing file-based configuration will be provided Patch11: sems-0011-Disable-mysql-in-conference-and-early_announce-modul.patch +# Backported from upstream +Patch12: sems-0012-create-RTP-stream-AmSession-rtp_str-only-if-really-n.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: python >= 2.3 @@ -212,6 +214,7 @@ rm -rf core/plug-in/gsm/gsm-1.0-pl10/ %patch10 -p1 -b .fix_escaping_in_cmake %endif %patch11 -p1 -b .disable_mysqlpp_in_conf_and_ea +%patch12 -p1 -b .fix_segfault iconv -f iso8859-1 -t UTF-8 doc/Readme.diameter_client.txt > doc/Readme.diameter_client.utf8 && mv doc/Readme.diameter_client.{utf8,txt} @@ -625,6 +628,9 @@ fi %{_libdir}/%{name}/plug-in/xmlrpc2di.so %changelog +* Fri Aug 20 2010 Peter Lemenkov 1.2.1-6 +- Fixed severe issue in early_announce module (see %%patch12) + * Sat Jul 31 2010 Toshio Kuratomi 1.2.1-5 - rebuild for python 2.7