[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