]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix race in codec failure condition, then fix bug in sdp parsing (likely a regression...
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 27 Oct 2010 21:37:22 +0000 (16:37 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 27 Oct 2010 21:37:35 +0000 (16:37 -0500)
src/mod/endpoints/mod_sofia/sofia_glue.c
src/switch_core_io.c

index c9b384b3e823336a80e27942af3fa9435efffd1b..181161617cf40a16d9131d5ba24a83d317ca0045 100644 (file)
@@ -2658,8 +2658,13 @@ switch_status_t sofia_glue_tech_set_codec(private_object_t *tech_pvt, int force)
                        tech_pvt->read_impl.samples_per_second != tech_pvt->rm_rate ||
                        tech_pvt->codec_ms != (uint32_t) tech_pvt->read_impl.microseconds_per_packet / 1000) {
 
-                       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, "Changing Codec from %s@%dms to %s@%dms\n",
-                                                         tech_pvt->read_impl.iananame, tech_pvt->read_impl.microseconds_per_packet / 1000, tech_pvt->rm_encoding, tech_pvt->codec_ms);
+                       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_DEBUG, 
+                                                         "Changing Codec from %s@%dms@%dhz to %s@%dms@%luhz\n",
+                                                         tech_pvt->read_impl.iananame, tech_pvt->read_impl.microseconds_per_packet / 1000,
+                                                         tech_pvt->read_impl.samples_per_second,
+                                                         tech_pvt->rm_encoding, 
+                                                         tech_pvt->codec_ms,
+                                                         tech_pvt->rm_rate);
 
                        switch_core_session_lock_codec_write(tech_pvt->session);
                        switch_core_session_lock_codec_read(tech_pvt->session);
@@ -4429,7 +4434,7 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s
                                        tech_pvt->rm_encoding = switch_core_session_strdup(session, (char *) map->rm_encoding);
                                        tech_pvt->iananame = switch_core_session_strdup(session, (char *) mimp->iananame);
                                        tech_pvt->pt = (switch_payload_t) map->rm_pt;
-                                       tech_pvt->rm_rate = map->rm_rate;
+                                       tech_pvt->rm_rate = mimp->samples_per_second;
                                        tech_pvt->codec_ms = mimp->microseconds_per_packet / 1000;
                                        tech_pvt->bitrate = mimp->bits_per_second;
                                        tech_pvt->remote_sdp_audio_ip = switch_core_session_strdup(session, (char *) connection->c_address);
index 766bec7a81bc17359efc0876e91288831eb40709..ec3fac60e4b722c904bfbd9ddf78b9918987fd80 100644 (file)
@@ -124,6 +124,15 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
        }
 
        switch_mutex_lock(session->codec_read_mutex);
+
+       if (!switch_core_codec_ready(session->read_codec)) {
+               switch_mutex_unlock(session->codec_read_mutex);
+               switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "%s has no read codec.\n", switch_channel_get_name(session->channel));
+               switch_channel_hangup(session->channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION);
+               *frame = &runtime.dummy_cng_frame;
+        return SWITCH_STATUS_FALSE;
+       }
+
        switch_mutex_lock(session->read_codec->mutex);
 
   top:
@@ -181,6 +190,15 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
                }
 
                switch_mutex_lock(session->codec_read_mutex);
+
+               if (!switch_core_codec_ready(session->read_codec)) {
+                       switch_mutex_unlock(session->codec_read_mutex);
+                       switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "%s has no read codec.\n", switch_channel_get_name(session->channel));
+                       switch_channel_hangup(session->channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION);
+                       *frame = &runtime.dummy_cng_frame;
+                       return SWITCH_STATUS_FALSE;
+               }
+
                switch_mutex_lock(session->read_codec->mutex);
                if (!switch_core_codec_ready(session->read_codec)) {
                        *frame = NULL;