]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-8938 #resolve [Clear res id when setting same res id to another member]
authorAnthony Minessale <anthm@freeswitch.org>
Mon, 14 Mar 2016 21:24:24 +0000 (16:24 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Mon, 14 Mar 2016 21:24:31 +0000 (16:24 -0500)
src/mod/applications/mod_conference/conference_api.c
src/mod/applications/mod_conference/conference_video.c

index a6b33571879bd8d04734062406587c969778150d..c1a3ce81b7327963b21f8a1f4d1a5fa83ac7d1d4 100644 (file)
@@ -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;
 
 }
index 2eb91fb95cc0815bb95dba5567d78ba8bef4cf55..042bebfc2b157a62b23aa12145a03c0e7799d508 100644 (file)
@@ -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) {