]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7513: fix overlap
authorAnthony Minessale <anthm@freeswitch.org>
Fri, 30 Jan 2015 23:48:24 +0000 (17:48 -0600)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:46:57 +0000 (12:46 -0500)
src/mod/applications/mod_conference/mod_conference.c

index d2361eaa9b247162bbafa503491a700462567c1d..46f1ab7e31d6f3496aa24174ffd4d791611b276f 100644 (file)
@@ -1121,14 +1121,21 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
                                int i;
 
                                remaining += switch_queue_size(imember->video_queue);
+
+                               switch_mutex_lock(conference->canvas->mutex);
                                
                                if (imember->video_layer_id > -1) {
-                                       layer = &conference->canvas->layers[imember->video_layer_id];
+                                       if (imember->video_layer_id >= conference->canvas->total_layers) {
+                                               conference->canvas->layers[imember->video_layer_id].member_id = 0;
+                                               imember->video_layer_id = -1;
+                                               conference->canvas->layers_used--;
+                                       } else {
+                                               layer = &conference->canvas->layers[imember->video_layer_id];
+                                       }
                                }
-
-                               if (!layer) {
+                               
+                               if (!layer && conference->canvas->layers_used < conference->canvas->total_layers) {
                                        /* find an empty layer */
-                                       switch_mutex_lock(conference->canvas->mutex);
                                        for (i = 0; i < conference->canvas->total_layers; i++) {
                                                layer = &conference->canvas->layers[i];
                                                if (!layer->member_id) {
@@ -1138,8 +1145,8 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
                                                        break;
                                                }
                                        }
-                                       switch_mutex_unlock(conference->canvas->mutex);
                                }
+                               switch_mutex_unlock(conference->canvas->mutex);
                                
                                if (layer) {
                                        scale_and_patch(conference->canvas->img, img, layer);
@@ -1153,6 +1160,9 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
                        }
                }
 
+               if (remaining) goto top;
+
+
                for (imember = conference->members; imember; imember = imember->next) {
                        switch_channel_t *ichannel = switch_core_session_get_channel(imember->session);
 
@@ -1176,8 +1186,6 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
                        }
                }
 
-               if (remaining) goto top;
-
                switch_mutex_unlock(conference->member_mutex);
 
                switch_mutex_lock(conference->canvas->cond2_mutex);