diff --git a/src/mod/applications/mod_conference/conference_member.c b/src/mod/applications/mod_conference/conference_member.c index 594633075d..664cccfae9 100644 --- a/src/mod/applications/mod_conference/conference_member.c +++ b/src/mod/applications/mod_conference/conference_member.c @@ -675,7 +675,7 @@ switch_status_t conference_member_add(conference_obj_t *conference, conference_m switch_mutex_lock(member->audio_out_mutex); lock_member(member); switch_mutex_lock(conference->member_mutex); - + if (member->rec) { conference->recording_members++; } diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 70c53f4e49..2e69d76b4f 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -288,13 +288,26 @@ void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *ob if (conference_utils_member_test_flag(imember, MFLAG_RUNNING) && imember->session) { switch_channel_t *channel = switch_core_session_get_channel(imember->session); - + switch_media_flow_t video_media_flow; + if ((!floor_holder || (imember->score_iir > SCORE_IIR_SPEAKING_MAX && (floor_holder->score_iir < SCORE_IIR_SPEAKING_MIN)))) {// && //(!conference_utils_test_flag(conference, CFLAG_VID_FLOOR) || switch_channel_test_flag(channel, CF_VIDEO))) { floor_holder = imember; } - if (switch_channel_ready(channel) && switch_channel_test_flag(channel, CF_VIDEO) && switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO) != SWITCH_MEDIA_FLOW_SENDONLY) { + video_media_flow = switch_core_session_media_flow(imember->session, SWITCH_MEDIA_TYPE_VIDEO); + + if (video_media_flow != imember->video_media_flow) { + imember->video_media_flow = video_media_flow; + + if (imember->video_media_flow == SWITCH_MEDIA_FLOW_SENDONLY) { + conference_utils_member_clear_flag(imember, MFLAG_CAN_BE_SEEN); + } else { + conference_utils_member_set_flag(imember, MFLAG_CAN_BE_SEEN); + } + } + + if (switch_channel_ready(channel) && switch_channel_test_flag(channel, CF_VIDEO) && imember->video_media_flow != SWITCH_MEDIA_FLOW_SENDONLY) { members_with_video++; } diff --git a/src/mod/applications/mod_conference/mod_conference.h b/src/mod/applications/mod_conference/mod_conference.h index d301fb5706..12dc76d694 100644 --- a/src/mod/applications/mod_conference/mod_conference.h +++ b/src/mod/applications/mod_conference/mod_conference.h @@ -754,6 +754,7 @@ struct conference_member { int good_img; int auto_avatar; int avatar_patched; + switch_media_flow_t video_media_flow; mcu_canvas_t *canvas; switch_image_t *pcanvas_img; }; diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 54539868e7..5d36bdd0a3 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -3154,11 +3154,6 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t return SWITCH_STATUS_SUCCESS; } - if (switch_channel_test_flag(smh->session->channel, CF_REINVITE) && !switch_channel_test_flag(smh->session->channel, CF_RECOVERING)) { - engine->new_ice = 0; - engine->new_dtls = 0; - } - engine->ice_in.chosen[0] = 0; engine->ice_in.chosen[1] = 0; engine->ice_in.is_chosen[0] = 0; @@ -3595,10 +3590,18 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s switch_channel_clear_flag(smh->session->channel, CF_DTLS); } - a_engine->new_ice = 1; - a_engine->new_dtls = 1; - v_engine->new_ice = 1; - v_engine->new_dtls = 1; + /* may have to test for a new dtls fingerprint here too and clear these flags */ + if (switch_channel_test_flag(smh->session->channel, CF_REINVITE) && !switch_channel_test_flag(smh->session->channel, CF_RECOVERING)) { + a_engine->new_ice = 0; + a_engine->new_dtls = 0; + v_engine->new_ice = 0; + v_engine->new_dtls = 0; + } else { + a_engine->new_ice = 1; + a_engine->new_dtls = 1; + v_engine->new_ice = 1; + v_engine->new_dtls = 1; + } //if (switch_channel_test_flag(session->channel, CF_REINVITE)) { // switch_core_media_clear_ice(session);