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

FreeSWITCH SVN anthm at freeswitch.org
Tue Dec 2 13:33:02 PST 2008


Author: anthm
Date: Tue Dec  2 16:33:01 2008
New Revision: 10566

Log:
fix random issues

Modified:
   freeswitch/trunk/src/include/switch_types.h
   freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
   freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h
   freeswitch/trunk/src/switch_core_io.c
   freeswitch/trunk/src/switch_rtp.c

Modified: freeswitch/trunk/src/include/switch_types.h
==============================================================================
--- freeswitch/trunk/src/include/switch_types.h	(original)
+++ freeswitch/trunk/src/include/switch_types.h	Tue Dec  2 16:33:01 2008
@@ -451,7 +451,8 @@
 	SWITCH_RTP_FLAG_SECURE_SEND_RESET = (1 << 16),
 	SWITCH_RTP_FLAG_SECURE_RECV_RESET = (1 << 17),
 	SWITCH_RTP_FLAG_PROXY_MEDIA = (1 << 18),
-	SWITCH_RTP_FLAG_SHUTDOWN = (1 << 19)
+	SWITCH_RTP_FLAG_SHUTDOWN = (1 << 19),
+	SWITCH_RTP_FLAG_FLUSH = (1 << 20)
 } switch_rtp_flag_enum_t;
 typedef uint32_t switch_rtp_flag_t;
 

Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.c	Tue Dec  2 16:33:01 2008
@@ -710,72 +710,79 @@
 						}
 
 						if (tech_pvt->last_ts && tech_pvt->read_frame.datalen != tech_pvt->read_codec.implementation->encoded_bytes_per_packet) {
-							if (++tech_pvt->mismatch_count >= MAX_MISMATCH_FRAMES) {
-								switch_size_t codec_ms = (int)(tech_pvt->read_frame.timestamp - 
-															   tech_pvt->last_ts) / (tech_pvt->read_codec.implementation->samples_per_second / 1000);
-								
-								if ((codec_ms % 10) != 0) {
-									tech_pvt->check_frames = MAX_CODEC_CHECK_FRAMES;
-									goto skip;
-								} else {
-									if (switch_rtp_ready(tech_pvt->rtp_session) && codec_ms != tech_pvt->codec_ms) {
-										const char *val;
-										int rtp_timeout_sec = 0;
-										int rtp_hold_timeout_sec = 0;
+							switch_size_t codec_ms = (int)(tech_pvt->read_frame.timestamp - 
+														   tech_pvt->last_ts) / (tech_pvt->read_codec.implementation->samples_per_second / 1000);
+
+							if ((codec_ms % 10) != 0) {
+								tech_pvt->check_frames = MAX_CODEC_CHECK_FRAMES;
+								goto skip;
+							}
+							
+							if (tech_pvt->last_codec_ms && tech_pvt->last_codec_ms == codec_ms) {
+								tech_pvt->mismatch_count++;
+							}
+							
+							tech_pvt->last_codec_ms = codec_ms;
+							
+							if (tech_pvt->mismatch_count > MAX_MISMATCH_FRAMES) {
+								if (switch_rtp_ready(tech_pvt->rtp_session) && codec_ms != tech_pvt->codec_ms) {
+									const char *val;
+									int rtp_timeout_sec = 0;
+									int rtp_hold_timeout_sec = 0;
 									
-										tech_pvt->codec_ms = codec_ms;
-										switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, 
-														  "Changing codec ptime to %d. I bet you have a linksys/sipura =D\n", tech_pvt->codec_ms);
-										switch_core_codec_destroy(&tech_pvt->read_codec);
-										switch_core_codec_destroy(&tech_pvt->write_codec);
-										if (sofia_glue_tech_set_codec(tech_pvt, 2) != SWITCH_STATUS_SUCCESS) {
-											*frame = NULL;
-											return SWITCH_STATUS_GENERR;
-										}
+									tech_pvt->codec_ms = codec_ms;
+									switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, 
+													  "Changing codec ptime to %d. I bet you have a linksys/sipura =D\n", tech_pvt->codec_ms);
+									switch_core_codec_destroy(&tech_pvt->read_codec);
+									switch_core_codec_destroy(&tech_pvt->write_codec);
+									if (sofia_glue_tech_set_codec(tech_pvt, 2) != SWITCH_STATUS_SUCCESS) {
+										*frame = NULL;
+										return SWITCH_STATUS_GENERR;
+									}
 
 
-										if ((val = switch_channel_get_variable(tech_pvt->channel, "rtp_timeout_sec"))) {
-											int v = atoi(val);
-											if (v >= 0) {
-												rtp_timeout_sec = v;
-											}
+									if ((val = switch_channel_get_variable(tech_pvt->channel, "rtp_timeout_sec"))) {
+										int v = atoi(val);
+										if (v >= 0) {
+											rtp_timeout_sec = v;
 										}
+									}
 									
-										if ((val = switch_channel_get_variable(tech_pvt->channel, "rtp_hold_timeout_sec"))) {
-											int v = atoi(val);
-											if (v >= 0) {
-												rtp_hold_timeout_sec = v;
-											}
+									if ((val = switch_channel_get_variable(tech_pvt->channel, "rtp_hold_timeout_sec"))) {
+										int v = atoi(val);
+										if (v >= 0) {
+											rtp_hold_timeout_sec = v;
 										}
+									}
 									
-										if (rtp_timeout_sec) {
-											tech_pvt->max_missed_packets = (tech_pvt->read_codec.implementation->samples_per_second * rtp_timeout_sec) /
-												tech_pvt->read_codec.implementation->samples_per_packet;
+									if (rtp_timeout_sec) {
+										tech_pvt->max_missed_packets = (tech_pvt->read_codec.implementation->samples_per_second * rtp_timeout_sec) /
+											tech_pvt->read_codec.implementation->samples_per_packet;
 										
-											switch_rtp_set_max_missed_packets(tech_pvt->rtp_session, tech_pvt->max_missed_packets);
-											if (!rtp_hold_timeout_sec) {
-												rtp_hold_timeout_sec = rtp_timeout_sec * 10;
-											}
+										switch_rtp_set_max_missed_packets(tech_pvt->rtp_session, tech_pvt->max_missed_packets);
+										if (!rtp_hold_timeout_sec) {
+											rtp_hold_timeout_sec = rtp_timeout_sec * 10;
 										}
+									}
 									
-										if (rtp_hold_timeout_sec) {
-											tech_pvt->max_missed_hold_packets = (tech_pvt->read_codec.implementation->samples_per_second * rtp_hold_timeout_sec) /
-												tech_pvt->read_codec.implementation->samples_per_packet;
-										}
+									if (rtp_hold_timeout_sec) {
+										tech_pvt->max_missed_hold_packets = (tech_pvt->read_codec.implementation->samples_per_second * rtp_hold_timeout_sec) /
+											tech_pvt->read_codec.implementation->samples_per_packet;
+									}
 									
-										if (switch_rtp_change_interval(tech_pvt->rtp_session, 
-																	   tech_pvt->codec_ms * 1000,
-																	   tech_pvt->read_codec.implementation->samples_per_packet
-																	   ) != SWITCH_STATUS_SUCCESS) {
-											switch_channel_hangup(tech_pvt->channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
+									if (switch_rtp_change_interval(tech_pvt->rtp_session, 
+																   tech_pvt->codec_ms * 1000,
+																   tech_pvt->read_codec.implementation->samples_per_packet
+																   ) != SWITCH_STATUS_SUCCESS) {
+										switch_channel_hangup(tech_pvt->channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
 										
-										}
-
-										tech_pvt->check_frames = MAX_CODEC_CHECK_FRAMES;
 									}
-							
+
+									tech_pvt->check_frames = MAX_CODEC_CHECK_FRAMES;
 								}
+							
 							}
+							
 						} else {
 							tech_pvt->mismatch_count = 0;
 						}

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 Dec  2 16:33:01 2008
@@ -547,6 +547,7 @@
 	switch_size_t last_ts;
 	uint32_t check_frames;
 	uint32_t mismatch_count;
+	uint32_t last_codec_ms;
 	nua_event_t want_event;
 };
 

Modified: freeswitch/trunk/src/switch_core_io.c
==============================================================================
--- freeswitch/trunk/src/switch_core_io.c	(original)
+++ freeswitch/trunk/src/switch_core_io.c	Tue Dec  2 16:33:01 2008
@@ -608,10 +608,14 @@
 	switch_mutex_lock(session->codec_write_mutex);	
 
 	if ((session->write_codec && frame->codec && session->write_codec->implementation != frame->codec->implementation)) {
-		need_codec = TRUE;
 		if (session->write_codec->implementation->codec_id == frame->codec->implementation->codec_id) {
 			ptime_mismatch = TRUE;
+			if (!need_codec) {
+				status = perform_write(session, frame, flags, stream_id);
+				goto error;
+			}
 		}
+		need_codec = TRUE;
 	}
 
 	if (session->write_codec && !frame->codec) {

Modified: freeswitch/trunk/src/switch_rtp.c
==============================================================================
--- freeswitch/trunk/src/switch_rtp.c	(original)
+++ freeswitch/trunk/src/switch_rtp.c	Tue Dec  2 16:33:01 2008
@@ -1265,6 +1265,11 @@
 
 SWITCH_DECLARE(void) rtp_flush_read_buffer(switch_rtp_t *rtp_session)
 {
+	switch_set_flag_locked(rtp_session, SWITCH_RTP_FLAG_FLUSH);
+}
+
+static void do_flush(switch_rtp_t *rtp_session)
+{
 	int was_blocking = 0;
 	switch_size_t bytes;
 	switch_status_t status;
@@ -1338,6 +1343,12 @@
 			goto end;
 		}
 		
+		if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_FLUSH)) {
+			do_flush(rtp_session);
+			switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_FLUSH);
+			continue;
+		}
+
 		if (rtp_session->max_missed_packets) {
 			if (bytes) {
 				rtp_session->missed_count = 0;



More information about the Freeswitch-svn mailing list