diff --git a/src/include/switch_core_media.h b/src/include/switch_core_media.h
index 6379a88e6f..8483738286 100644
--- a/src/include/switch_core_media.h
+++ b/src/include/switch_core_media.h
@@ -144,8 +144,6 @@ typedef struct switch_core_media_params_s {
char *sdp_username;
- switch_mutex_t *mutex;
-
switch_payload_t te;
switch_payload_t recv_te;
diff --git a/src/mod/applications/mod_fifo/mod_fifo.c b/src/mod/applications/mod_fifo/mod_fifo.c
index 1ff920eedb..bcec97bbb4 100644
--- a/src/mod/applications/mod_fifo/mod_fifo.c
+++ b/src/mod/applications/mod_fifo/mod_fifo.c
@@ -4178,7 +4178,7 @@ static switch_status_t load_config(int reload, int del_all)
node = create_node(name, imp, globals.sql_mutex);
}
- if ((val = switch_xml_attr(fifo, "outbound_name")) && !zstr(val)) {
+ if ((val = switch_xml_attr(fifo, "outbound_name"))) {
node->outbound_name = switch_core_strdup(node->pool, val);
}
diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_modem.h b/src/mod/applications/mod_spandsp/mod_spandsp_modem.h
index 717cb909c4..81c46bae78 100644
--- a/src/mod/applications/mod_spandsp/mod_spandsp_modem.h
+++ b/src/mod/applications/mod_spandsp/mod_spandsp_modem.h
@@ -32,6 +32,7 @@
*/
#ifndef WIN32
+#undef HAVE_STDLIB_H
#include "switch_private.h"
#endif
#if defined(HAVE_OPENPTY) || defined(HAVE_DEV_PTMX) || defined(HAVE_POSIX_OPENPT) || WIN32
diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2010.vcxproj b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2010.vcxproj
index c71b738775..7014e8b1d9 100644
--- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2010.vcxproj
+++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2010.vcxproj
@@ -84,7 +84,7 @@
- gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories)
+ gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories)
NO_ALSA;%(PreprocessorDefinitions)
@@ -101,7 +101,7 @@
- gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories)
+ gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories)
@@ -117,7 +117,7 @@
X64
- gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories)
+ gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories)
NO_ALSA;%(PreprocessorDefinitions)
@@ -139,7 +139,7 @@ rpcrt4.lib "..\..\..\..\debug\libtiff.lib" "..\..\..\..\libs\spandsp\src\debug\
X64
- gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories)
+ gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories)
diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2012.vcxproj b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2012.vcxproj
index 30cb1f9fb2..004558e6b4 100644
--- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2012.vcxproj
+++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.2012.vcxproj
@@ -88,7 +88,7 @@
- gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories)
+ gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories)
NO_ALSA;%(PreprocessorDefinitions)
@@ -104,7 +104,7 @@
- gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories)
+ gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories)
@@ -120,7 +120,7 @@
X64
- gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories)
+ gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories)
NO_ALSA;%(PreprocessorDefinitions)
@@ -140,7 +140,7 @@
X64
- gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(AdditionalIncludeDirectories)
+ gsmlib\gsmlib-1.10-patched-13ubuntu;libctb-0.16\include;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src\msvc;%(RootDir)%(Directory)..\..\..\..\libs\spandsp\src;%(RootDir)%(Directory)..\..\..\..\libs\tiff-4.0.2\libtiff;%(RootDir)%(Directory)..\..\..\..\libs\jpeg-8d;%(AdditionalIncludeDirectories)
diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c
index 65b1984543..c99cd91068 100644
--- a/src/mod/endpoints/mod_sofia/sofia_glue.c
+++ b/src/mod/endpoints/mod_sofia/sofia_glue.c
@@ -156,7 +156,6 @@ void sofia_glue_attach_private(switch_core_session_t *session, sofia_profile_t *
tech_pvt->mparams.extsipip = profile->extsipip;
tech_pvt->mparams.extrtpip = profile->extrtpip;
tech_pvt->mparams.local_network = profile->local_network;
- tech_pvt->mparams.mutex = tech_pvt->sofia_mutex;
tech_pvt->mparams.sipip = profile->sipip;
tech_pvt->mparams.jb_msec = profile->jb_msec;
tech_pvt->mparams.rtcp_audio_interval_msec = profile->rtcp_audio_interval_msec;
diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx
index c37bffb7a1..90c1a2e68c 100644
--- a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx
+++ b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx
@@ -13563,6 +13563,18 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_cert_verify(void * jarg1) {
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_refresh_video(void * jarg1) {
+ int jresult ;
+ switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_core_session_t *)jarg1;
+ result = (switch_status_t)switch_core_session_refresh_video(arg1);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_loadable_module_interface_module_name_set(void * jarg1, char * jarg2) {
switch_loadable_module_interface *arg1 = (switch_loadable_module_interface *) 0 ;
char *arg2 = (char *) 0 ;
@@ -35218,26 +35230,6 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_rtp_get_private(void * jarg1) {
}
-SWIGEXPORT int SWIGSTDCALL CSharp_switch_rtp_activate_stun_ping(void * jarg1, char * jarg2, unsigned short jarg3, unsigned long jarg4, int jarg5) {
- int jresult ;
- switch_rtp_t *arg1 = (switch_rtp_t *) 0 ;
- char *arg2 = (char *) 0 ;
- switch_port_t arg3 ;
- uint32_t arg4 ;
- switch_bool_t arg5 ;
- switch_status_t result;
-
- arg1 = (switch_rtp_t *)jarg1;
- arg2 = (char *)jarg2;
- arg3 = (switch_port_t)jarg3;
- arg4 = (uint32_t)jarg4;
- arg5 = (switch_bool_t)jarg5;
- result = (switch_status_t)switch_rtp_activate_stun_ping(arg1,(char const *)arg2,arg3,arg4,arg5);
- jresult = result;
- return jresult;
-}
-
-
SWIGEXPORT void SWIGSTDCALL CSharp_switch_rtp_intentional_bugs(void * jarg1, int jarg2) {
switch_rtp_t *arg1 = (switch_rtp_t *) 0 ;
switch_rtp_bug_flag_t arg2 ;
@@ -35312,6 +35304,14 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_rtp_has_dtls() {
}
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_rtp_video_refresh(void * jarg1) {
+ switch_rtp_t *arg1 = (switch_rtp_t *) 0 ;
+
+ arg1 = (switch_rtp_t *)jarg1;
+ switch_rtp_video_refresh(arg1);
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_log_node_t_data_set(void * jarg1, char * jarg2) {
switch_log_node_t *arg1 = (switch_log_node_t *) 0 ;
char *arg2 = (char *) 0 ;
diff --git a/src/mod/languages/mod_managed/managed/swig.2010.cs b/src/mod/languages/mod_managed/managed/swig.2010.cs
index 44e6f034b9..ac74b01bb2 100644
--- a/src/mod/languages/mod_managed/managed/swig.2010.cs
+++ b/src/mod/languages/mod_managed/managed/swig.2010.cs
@@ -3127,6 +3127,11 @@ public class freeswitch {
return ret;
}
+ public static switch_status_t switch_core_session_refresh_video(SWIGTYPE_p_switch_core_session session) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_refresh_video(SWIGTYPE_p_switch_core_session.getCPtr(session));
+ return ret;
+ }
+
public static switch_status_t switch_loadable_module_init(switch_bool_t autoload) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_loadable_module_init((int)autoload);
return ret;
@@ -6042,11 +6047,6 @@ public class freeswitch {
return ret;
}
- public static switch_status_t switch_rtp_activate_stun_ping(SWIGTYPE_p_switch_rtp rtp_session, string stun_ip, ushort stun_port, uint packet_count, switch_bool_t funny) {
- switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_rtp_activate_stun_ping(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), stun_ip, stun_port, packet_count, (int)funny);
- return ret;
- }
-
public static void switch_rtp_intentional_bugs(SWIGTYPE_p_switch_rtp rtp_session, switch_rtp_bug_flag_t bugs) {
freeswitchPINVOKE.switch_rtp_intentional_bugs(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), (int)bugs);
}
@@ -6076,6 +6076,10 @@ public class freeswitch {
return ret;
}
+ public static void switch_rtp_video_refresh(SWIGTYPE_p_switch_rtp rtp_session) {
+ freeswitchPINVOKE.switch_rtp_video_refresh(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session));
+ }
+
public static switch_status_t switch_log_init(SWIGTYPE_p_apr_pool_t pool, switch_bool_t colorize) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_log_init(SWIGTYPE_p_apr_pool_t.getCPtr(pool), (int)colorize);
return ret;
@@ -10339,6 +10343,9 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_cert_verify")]
public static extern int switch_core_cert_verify(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_refresh_video")]
+ public static extern int switch_core_session_refresh_video(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_loadable_module_interface_module_name_set")]
public static extern void switch_loadable_module_interface_module_name_set(HandleRef jarg1, string jarg2);
@@ -15463,9 +15470,6 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_get_private")]
public static extern IntPtr switch_rtp_get_private(HandleRef jarg1);
- [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_activate_stun_ping")]
- public static extern int switch_rtp_activate_stun_ping(HandleRef jarg1, string jarg2, ushort jarg3, uint jarg4, int jarg5);
-
[DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_intentional_bugs")]
public static extern void switch_rtp_intentional_bugs(HandleRef jarg1, int jarg2);
@@ -15484,6 +15488,9 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_has_dtls")]
public static extern int switch_rtp_has_dtls();
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_video_refresh")]
+ public static extern void switch_rtp_video_refresh(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_log_node_t_data_set")]
public static extern void switch_log_node_t_data_set(HandleRef jarg1, string jarg2);
@@ -25819,6 +25826,7 @@ public enum switch_channel_flag_t {
CF_DTLS,
CF_VERBOSE_SDP,
CF_DTLS_OK,
+ CF_VIDEO_PASSIVE,
CF_FLAG_MAX
}
diff --git a/src/switch_core_media.c b/src/switch_core_media.c
index eb2f2eccf5..97ad761167 100644
--- a/src/switch_core_media.c
+++ b/src/switch_core_media.c
@@ -174,7 +174,7 @@ struct switch_media_handle_s {
int payload_space;
char *origin;
-
+ switch_mutex_t *mutex;
const switch_codec_implementation_t *negotiated_codecs[SWITCH_MAX_CODECS];
int num_negotiated_codecs;
@@ -1036,6 +1036,8 @@ SWITCH_DECLARE(switch_status_t) switch_media_handle_create(switch_media_handle_t
session->media_handle->engines[SWITCH_MEDIA_TYPE_VIDEO].read_frame.buflen = SWITCH_RTP_MAX_BUF_LEN;
session->media_handle->mparams = params;
+ switch_mutex_init(&session->media_handle->mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session));
+
session->media_handle->engines[SWITCH_MEDIA_TYPE_AUDIO].ssrc =
(uint32_t) ((intptr_t) &session->media_handle->engines[SWITCH_MEDIA_TYPE_AUDIO] + (uint32_t) time(NULL));
@@ -5022,10 +5024,10 @@ SWITCH_DECLARE(void)switch_core_media_set_local_sdp(switch_core_session_t *sessi
return;
}
- if (smh->mparams->mutex) switch_mutex_lock(smh->mparams->mutex);
+ if (smh->mutex) switch_mutex_lock(smh->mutex);
smh->mparams->local_sdp_str = dup ? switch_core_session_strdup(session, sdp_str) : (char *) sdp_str;
switch_channel_set_variable(session->channel, "rtp_local_sdp_str", smh->mparams->local_sdp_str);
- if (smh->mparams->mutex) switch_mutex_unlock(smh->mparams->mutex);
+ if (smh->mutex) switch_mutex_unlock(smh->mutex);
}
@@ -6612,7 +6614,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_receive_message(switch_core_se
}
- if (smh->mparams->mutex) switch_mutex_lock(smh->mparams->mutex);
+ if (smh->mutex) switch_mutex_lock(smh->mutex);
if (switch_channel_down(session->channel)) {
@@ -6698,7 +6700,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_receive_message(switch_core_se
end_lock:
- if (smh->mparams->mutex) switch_mutex_unlock(smh->mparams->mutex);
+ if (smh->mutex) switch_mutex_unlock(smh->mutex);
end:
diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c
index b7a6c01288..a3cb808ec0 100644
--- a/src/switch_ivr_async.c
+++ b/src/switch_ivr_async.c
@@ -1022,6 +1022,11 @@ struct record_helper {
int native;
uint32_t packet_len;
int min_sec;
+ int final_timeout_ms;
+ int initial_timeout_ms;
+ int silence_threshold;
+ int silence_timeout_ms;
+ switch_time_t silence_time;
int rready;
int wready;
switch_time_t last_read_time;
@@ -1030,6 +1035,34 @@ struct record_helper {
switch_codec_implementation_t read_impl;
};
+
+static switch_bool_t is_silence_frame(switch_frame_t *frame, int silence_threshold, switch_codec_implementation_t *codec_impl)
+{
+ int16_t *fdata = (int16_t *) frame->data;
+ uint32_t samples = frame->datalen / sizeof(*fdata);
+ switch_bool_t is_silence = SWITCH_TRUE;
+ uint32_t channel_num = 0;
+
+ int divisor = 0;
+ if (!(divisor = codec_impl->samples_per_second / 8000)) {
+ divisor = 1;
+ }
+
+ /* is silence only if every channel is silent */
+ for (channel_num = 0; channel_num < codec_impl->number_of_channels && is_silence; channel_num++) {
+ uint32_t count = 0, j = channel_num;
+ double energy = 0;
+ for (count = 0; count < samples; count++) {
+ energy += abs(fdata[j]);
+ j += codec_impl->number_of_channels;
+ }
+ is_silence &= (uint32_t) (energy / (samples / divisor)) < silence_threshold;
+ }
+
+ return is_silence;
+}
+
+
static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
{
switch_core_session_t *session = switch_core_media_bug_get_session(bug);
@@ -1048,6 +1081,8 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s
switch_channel_event_set_data(channel, event);
switch_event_fire(&event);
}
+ rh->silence_time = switch_micro_time_now();
+ rh->silence_timeout_ms = rh->initial_timeout_ms;
switch_core_session_get_read_impl(session, &rh->read_impl);
@@ -1204,6 +1239,7 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s
status = switch_core_media_bug_read(bug, &frame, SWITCH_FALSE);
if (status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK) {
+
len = (switch_size_t) frame.datalen / 2;
if (len && switch_core_file_write(rh->fh, mask ? null_data : data, &len) != SWITCH_STATUS_SUCCESS && rh->hangup_on_error) {
@@ -1212,6 +1248,32 @@ static switch_bool_t record_callback(switch_media_bug_t *bug, void *user_data, s
switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
return SWITCH_FALSE;
}
+
+ /* check for silence timeout */
+ if (rh->silence_threshold) {
+ switch_codec_implementation_t read_impl = { 0 };
+ switch_core_session_get_read_impl(session, &read_impl);
+ if (is_silence_frame(&frame, rh->silence_threshold, &read_impl)) {
+ if (!rh->silence_time) {
+ /* start of silence */
+ rh->silence_time = switch_micro_time_now();
+ } else {
+ /* continuing silence */
+ int duration_ms = (switch_micro_time_now() - rh->silence_time) / 1000;
+ if (rh->silence_timeout_ms > 0 && duration_ms >= rh->silence_timeout_ms) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Recording file %s timeout: %i >= %i\n", rh->file, duration_ms, rh->silence_timeout_ms);
+ switch_core_media_bug_set_flag(bug, SMBF_PRUNE);
+ }
+ }
+ } else { /* not silence */
+ if (rh->silence_time) {
+ /* end of silence */
+ rh->silence_time = 0;
+ /* switch from initial timeout to final timeout */
+ rh->silence_timeout_ms = rh->final_timeout_ms;
+ }
+ }
+ }
}
}
break;
@@ -2080,6 +2142,29 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_record_session(switch_core_session_t
}
}
+ if ((p = switch_channel_get_variable(channel, "RECORD_INITIAL_TIMEOUT_MS"))) {
+ int tmp = atoi(p);
+ if (tmp >= 0) {
+ rh->initial_timeout_ms = tmp;
+ rh->silence_threshold = 200;
+ }
+ }
+
+ if ((p = switch_channel_get_variable(channel, "RECORD_FINAL_TIMEOUT_MS"))) {
+ int tmp = atoi(p);
+ if (tmp >= 0) {
+ rh->final_timeout_ms = tmp;
+ rh->silence_threshold = 200;
+ }
+ }
+
+ if ((p = switch_channel_get_variable(channel, "RECORD_SILENCE_THRESHOLD"))) {
+ int tmp = atoi(p);
+ if (tmp >= 0) {
+ rh->silence_threshold = tmp;
+ }
+ }
+
rh->hangup_on_error = hangup_on_error;
if ((status = switch_core_media_bug_add(session, "session_record", file,
diff --git a/src/switch_ivr_bridge.c b/src/switch_ivr_bridge.c
index 0e51910cd8..9e718a1096 100644
--- a/src/switch_ivr_bridge.c
+++ b/src/switch_ivr_bridge.c
@@ -52,7 +52,7 @@ static void *SWITCH_THREAD_FUNC video_bridge_thread(switch_thread_t *thread, voi
switch_channel_t *channel = switch_core_session_get_channel(vh->session_a);
switch_channel_t *b_channel = switch_core_session_get_channel(vh->session_b);
switch_status_t status;
- switch_frame_t *read_frame;
+ switch_frame_t *read_frame = 0;
const char *source = switch_channel_get_variable(channel, "source");
const char *b_source = switch_channel_get_variable(b_channel, "source");
@@ -286,7 +286,13 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj)
}
if (bypass_media_after_bridge) {
- if (switch_stristr("loopback", switch_channel_get_name(chan_a)) || switch_stristr("loopback", switch_channel_get_name(chan_b))) {
+ const char *source_a = switch_channel_get_variable(chan_a, "source");
+ const char *source_b = switch_channel_get_variable(chan_b, "source");
+
+ if (!source_a) source_a = "";
+ if (!source_b) source_b = "";
+
+ if (switch_stristr("loopback", source_a) || switch_stristr("loopback", source_b)) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session_a), SWITCH_LOG_WARNING, "Cannot bypass media while bridged to a loopback address.\n");
bypass_media_after_bridge = 0;
}
diff --git a/src/switch_rtp.c b/src/switch_rtp.c
index 0e381d0825..9096e7e88c 100644
--- a/src/switch_rtp.c
+++ b/src/switch_rtp.c
@@ -1335,7 +1335,7 @@ static void send_fir(switch_rtp_t *rtp_session)
rtp_session->rtcp_ext_send_msg.header.recv_ssrc = htonl(rtp_session->stats.rtcp.peer_ssrc);
fir->ssrc = htonl(rtp_session->stats.rtcp.peer_ssrc);
- fir->seq = htonl(rtp_session->fir_seq++);
+ fir->seq = (uint8_t) htonl(rtp_session->fir_seq++);
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(rtp_session->session), SWITCH_LOG_DEBUG1, "Sending RTCP FIR %d\n", rtp_session->fir_seq);
@@ -1371,7 +1371,6 @@ static void send_fir(switch_rtp_t *rtp_session)
break;
case zrtp_status_drop:
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error: zRTP protection drop with code %d\n", stat);
- ret = (int)rtcp_bytes;
goto end;
break;
case zrtp_status_fail: