diff --git a/src/mod/applications/mod_conference/conference_api.c b/src/mod/applications/mod_conference/conference_api.c index a6b3357187..c1a3ce81b7 100644 --- a/src/mod/applications/mod_conference/conference_api.c +++ b/src/mod/applications/mod_conference/conference_api.c @@ -1589,6 +1589,24 @@ switch_status_t conference_api_sub_get_uuid(conference_member_t *member, switch_ return SWITCH_STATUS_SUCCESS; } +static void clear_res_id(conference_obj_t *conference, conference_member_t *member, const char *id) +{ + conference_member_t *imember; + + switch_mutex_lock(conference->member_mutex); + for (imember = conference->members; imember; imember = imember->next) { + if (imember == member) { + continue; + } + + if (imember->video_reservation_id && !strcasecmp(imember->video_reservation_id, id)) { + imember->video_reservation_id = NULL; + conference_video_detach_video_layer(imember); + } + } + switch_mutex_unlock(conference->member_mutex); +} + switch_status_t conference_api_sub_vid_res_id(conference_member_t *member, switch_stream_handle_t *stream, void *data) { char *text = (char *) data; @@ -1608,12 +1626,18 @@ switch_status_t conference_api_sub_vid_res_id(conference_member_t *member, switc if (zstr(text) || !strcasecmp(text, "clear") || (member->video_reservation_id && !strcasecmp(text, member->video_reservation_id))) { member->video_reservation_id = NULL; stream->write_function(stream, "+OK reservation_id cleared\n"); + conference_video_detach_video_layer(member); } else { - member->video_reservation_id = switch_core_strdup(member->pool, text); + clear_res_id(member->conference, member, text); + if (!member->video_reservation_id || strcmp(member->video_reservation_id, text)) { + member->video_reservation_id = switch_core_strdup(member->pool, text); + } stream->write_function(stream, "+OK reservation_id %s\n", text); conference_video_detach_video_layer(member); } + + return SWITCH_STATUS_SUCCESS; } diff --git a/src/mod/applications/mod_conference/conference_video.c b/src/mod/applications/mod_conference/conference_video.c index 2eb91fb95c..042bebfc2b 100644 --- a/src/mod/applications/mod_conference/conference_video.c +++ b/src/mod/applications/mod_conference/conference_video.c @@ -2144,11 +2144,13 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr int j = 0, personal = conference_utils_test_flag(conference, CFLAG_PERSONAL_CANVAS) ? 1 : 0; if (!personal) { + switch_mutex_lock(conference->canvas_mutex); switch_mutex_lock(canvas->mutex); if (canvas->new_vlayout) { conference_video_init_canvas_layers(conference, canvas, NULL); } switch_mutex_unlock(canvas->mutex); + switch_mutex_unlock(conference->canvas_mutex); } if (canvas->video_timer_reset) {