[Freeswitch-svn] [commit] r6093 - in freeswitch/trunk: conf src src/include src/mod/endpoints/mod_sofia

Freeswitch SVN anthm at freeswitch.org
Tue Oct 30 22:12:30 EDT 2007


Author: anthm
Date: Tue Oct 30 22:12:30 2007
New Revision: 6093

Modified:
   freeswitch/trunk/conf/sofia.conf.xml
   freeswitch/trunk/src/include/switch_rtp.h
   freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h
   freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
   freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c
   freeswitch/trunk/src/switch_rtp.c

Log:
rtp timeout 

Modified: freeswitch/trunk/conf/sofia.conf.xml
==============================================================================
--- freeswitch/trunk/conf/sofia.conf.xml	(original)
+++ freeswitch/trunk/conf/sofia.conf.xml	Tue Oct 30 22:12:30 2007
@@ -95,7 +95,8 @@
 
 	<param name="ext-rtp-ip" value="$${external_rtp_ip}"/>
 	<!-- <param name="ext-sip-ip" value="$${external_sip_ip}"/> -->
-
+	<!-- rtp inactivity timeout -->
+	<!--<param name="rtp-timeout-sec" value="300"/>-->
 	<!-- VAD choose one (out is a good choice); -->
 	<!-- <param name="vad" value="in"/> -->
 	<!-- <param name="vad" value="out"/> -->

Modified: freeswitch/trunk/src/include/switch_rtp.h
==============================================================================
--- freeswitch/trunk/src/include/switch_rtp.h	(original)
+++ freeswitch/trunk/src/include/switch_rtp.h	Tue Oct 30 22:12:30 2007
@@ -130,6 +130,8 @@
 */
 SWITCH_DECLARE(switch_status_t) switch_rtp_set_remote_address(switch_rtp_t *rtp_session, const char *host, switch_port_t port, const char **err);
 
+SWITCH_DECLARE(void) switch_rtp_set_max_missed_packets(switch_rtp_t *rtp_session, uint32_t max);
+
 /*! 
   \brief Assign a local address to the RTP session
   \param rtp_session an RTP session to assign the local address to

Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h	Tue Oct 30 22:12:30 2007
@@ -259,6 +259,7 @@
 	time_t started;
 	uint32_t session_timeout;
 	uint32_t max_proceeding;
+	uint32_t rtp_timeout_sec;
 #ifdef SWITCH_HAVE_ODBC
 	char *odbc_dsn;
 	char *odbc_user;

Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c	Tue Oct 30 22:12:30 2007
@@ -893,6 +893,11 @@
 						if (v_max_proceeding >= 0) {
 							profile->max_proceeding = v_max_proceeding;
 						}
+					} else if (!strcasecmp(var, "rtp-timeout-sec")) {
+						int v = atoi(val);
+						if (v >= 0) {
+							profile->rtp_timeout_sec = v;
+						}
 					} else if (!strcasecmp(var, "manage-presence")) {
 						if (switch_true(val)) {
 							profile->pflags |= PFLAG_PRESENCE;

Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c	Tue Oct 30 22:12:30 2007
@@ -937,6 +937,8 @@
 	switch_rtp_flag_t flags;
 	switch_status_t status;
 	char tmp[50];
+	uint32_t rtp_timeout_sec = tech_pvt->profile->rtp_timeout_sec;
+	
 	assert(tech_pvt != NULL);
 
 
@@ -1061,6 +1063,20 @@
 		}
 
 
+		if ((val = switch_channel_get_variable(tech_pvt->channel, "rtp_timeout_sec"))) {
+			int v = atoi(val);
+			if (v >= 0) {
+				rtp_timeout_sec = v;
+			}
+		}
+		
+		if (rtp_timeout_sec) {
+			uint32_t packets;
+			packets = (tech_pvt->read_codec.implementation->samples_per_second * rtp_timeout_sec) / 
+				tech_pvt->read_codec.implementation->samples_per_frame;
+			
+			switch_rtp_set_max_missed_packets(tech_pvt->rtp_session, packets);
+		}
 
 		if (tech_pvt->te) {
 			switch_rtp_set_telephony_event(tech_pvt->rtp_session, tech_pvt->te);

Modified: freeswitch/trunk/src/switch_rtp.c
==============================================================================
--- freeswitch/trunk/src/switch_rtp.c	(original)
+++ freeswitch/trunk/src/switch_rtp.c	Tue Oct 30 22:12:30 2007
@@ -168,6 +168,8 @@
 	uint8_t cn;
 	switch_time_t last_time;
 	stfu_instance_t *jb;
+	uint32_t max_missed_packets;
+	uint32_t missed_count;
 };
 
 static int global_init = 0;
@@ -392,6 +394,11 @@
 	return status;
 }
 
+SWITCH_DECLARE(void) switch_rtp_set_max_missed_packets(switch_rtp_t *rtp_session, uint32_t max)
+{
+	rtp_session->max_missed_packets = max;
+}
+
 SWITCH_DECLARE(switch_status_t) switch_rtp_set_remote_address(switch_rtp_t *rtp_session, const char *host, switch_port_t port, const char **err)
 {
 	*err = "Success";
@@ -897,6 +904,11 @@
 
 		if (check) {
 			do_2833(rtp_session);
+			if (!bytes && rtp_session->max_missed_packets) {
+				if (++rtp_session->missed_count >= rtp_session->max_missed_packets) {
+					return -1;
+				}
+			}
 			
 			if (rtp_session->jb && (jb_frame = stfu_n_read_a_frame(rtp_session->jb))) {
 				memcpy(rtp_session->recv_msg.body, jb_frame->data, jb_frame->dlen);
@@ -905,9 +917,9 @@
 				}
 				bytes = jb_frame->dlen + rtp_header_len;
 				rtp_session->recv_msg.header.ts = htonl(jb_frame->ts);
-			} else if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_USE_TIMER)) {
-				uint8_t *data = (uint8_t *) rtp_session->recv_msg.body;
-				/* We're late! We're Late! */
+			} else if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_USE_TIMER)) { /* We're late! We're Late! */
+				uint8_t *data = (uint8_t *) rtp_session->recv_msg.body;				
+				
 				if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_NOBLOCK) && status == SWITCH_STATUS_BREAK) {
 					switch_yield(1000);
 					continue;
@@ -942,7 +954,7 @@
 			return 2 + rtp_header_len;
 		}
 		
-
+		
 
 
 		if (bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_SECURE)) {
@@ -959,6 +971,9 @@
 			bytes = sbytes;
 		}
 
+		if (bytes > 0) {
+			rtp_session->missed_count = 0;
+		}
 
 		if (status == SWITCH_STATUS_BREAK || bytes == 0) {
 			if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_DATAWAIT)) {



More information about the Freeswitch-svn mailing list