diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index efeff24dbc..f2a430402b 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -735,10 +735,11 @@ static void *SWITCH_THREAD_FUNC conference_video_thread_run(switch_thread_t *thr conference_member_t *imember, *last_member = NULL; switch_frame_t *vid_frame; switch_status_t status; + int skip = 0, has_vid = 1; conference->video_running = 1; - while (conference->video_running == 1 && globals.running && !switch_test_flag(conference, CFLAG_DESTRUCT)) { + while (has_vid && conference->video_running == 1 && globals.running && !switch_test_flag(conference, CFLAG_DESTRUCT)) { if (!conference->floor_holder) { switch_yield(100000); continue; @@ -752,23 +753,34 @@ static void *SWITCH_THREAD_FUNC conference_video_thread_run(switch_thread_t *thr continue; } - if (last_member != conference->floor_holder && vid_frame->datalen < 1000) { + if (switch_test_flag(vid_frame, SFF_CNG)) { continue; - } + } + + if (last_member != conference->floor_holder && vid_frame->datalen < 1000) { + skip = 1000; + } - switch_mutex_lock(conference->member_mutex); last_member = conference->floor_holder; + if (skip && vid_frame->datalen >= skip) { + skip = 0; + } + + if (skip) { + continue; + } + + switch_mutex_lock(conference->member_mutex); + has_vid = 0; for (imember = conference->members; imember; imember = imember->next) { if (switch_channel_test_flag(switch_core_session_get_channel(imember->session), CF_VIDEO)) { + has_vid++; switch_core_session_write_video_frame(imember->session, vid_frame, -1, 0); } } switch_mutex_unlock(conference->member_mutex); } - - - } conference->video_running = 0; @@ -1627,10 +1639,6 @@ static void conference_loop_output(conference_member_t * member) /* Start the input thread */ launch_conference_loop_input(member, switch_core_session_get_pool(member->session)); - if (switch_channel_test_flag(channel, CF_VIDEO) && member->conference->video_running != 1) { - launch_conference_video_thread(member->conference); - } - /* build a digit stream object */ if (member->conference->dtmf_parser != NULL && switch_ivr_digit_stream_new(member->conference->dtmf_parser, &member->digit_stream) != SWITCH_STATUS_SUCCESS) { @@ -1675,8 +1683,15 @@ static void conference_loop_output(conference_member_t * member) switch_size_t file_sample_len = csamples; switch_size_t file_data_len = file_sample_len * 2; + + if (switch_channel_test_flag(channel, CF_VIDEO) && member->conference->video_running != 1) { + launch_conference_video_thread(member->conference); + } + + switch_mutex_lock(member->flag_mutex); + if (switch_core_session_dequeue_event(member->session, &event) == SWITCH_STATUS_SUCCESS) { char *from = switch_event_get_header(event, "from"); char *to = switch_event_get_header(event, "to"); diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 3efa9a43d1..209292b731 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -404,20 +404,29 @@ void sofia_glue_attach_private(switch_core_session_t *session, sofia_profile_t * switch_status_t sofia_glue_ext_address_lookup(char **ip, switch_port_t *port, char *sourceip, switch_memory_pool_t *pool) { char *error; + switch_status_t status; + int x; if (!sourceip) { return SWITCH_STATUS_FALSE; } if (!strncasecmp(sourceip, "stun:", 5)) { - char *stun_ip = sourceip + 5; - if (!stun_ip) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Stun Failed! NO STUN SERVER\n"); - return SWITCH_STATUS_FALSE; + for (x = 0; x < 5; x++) { + char *stun_ip = sourceip + 5; + if (!stun_ip) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Stun Failed! NO STUN SERVER\n"); + return SWITCH_STATUS_FALSE; + } + if ((status = switch_stun_lookup(ip, port, stun_ip, SWITCH_STUN_DEFAULT_PORT, &error, pool)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Stun Failed! %s:%d [%s]\n", stun_ip, SWITCH_STUN_DEFAULT_PORT, error); + switch_yield(100000); + } else { + break; + } } - if (switch_stun_lookup(ip, port, stun_ip, SWITCH_STUN_DEFAULT_PORT, &error, pool) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Stun Failed! %s:%d [%s]\n", stun_ip, SWITCH_STUN_DEFAULT_PORT, error); - return SWITCH_STATUS_FALSE; + if (status != SWITCH_STATUS_SUCCESS) { + return status; } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Stun Success [%s]:[%d]\n", *ip, *port); } else {