]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7513: move layout switching to muxing thread for more protection
authorAnthony Minessale <anthm@freeswitch.org>
Mon, 9 Mar 2015 15:32:45 +0000 (10:32 -0500)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:47:10 +0000 (12:47 -0500)
src/mod/applications/mod_conference/mod_conference.c

index 17b1994e8451d2b4c653de71a6243bd176174d61..035c9d725f4c07be0f0c1796bd6d0cd724ba0b8a 100644 (file)
@@ -398,6 +398,22 @@ typedef struct mcu_layer_s {
        switch_img_txt_handle_t *txthandle;
 } mcu_layer_t;
 
+typedef struct video_layout_s {
+       char *name;
+       char *audio_position;
+       mcu_layer_geometry_t images[MCU_MAX_LAYERS];
+       int layers;
+} video_layout_t;
+
+typedef struct video_layout_node_s {
+       video_layout_t *vlayout;
+       struct video_layout_node_s *next;
+} video_layout_node_t;
+
+typedef struct layout_group_s {
+       video_layout_node_t *layouts;
+} layout_group_t;
+
 typedef struct mcu_canvas_s {
        int width;
        int height;
@@ -413,6 +429,8 @@ typedef struct mcu_canvas_s {
        switch_mutex_t *mutex;
        switch_timer_t timer;
        switch_memory_pool_t *pool;
+       video_layout_t *vlayout;
+       video_layout_t *new_vlayout;
 } mcu_canvas_t;
 
 struct conference_obj;
@@ -755,23 +773,6 @@ static switch_status_t conf_api_sub_position(conference_member_t *member, switch
 //#define lock_member(_member) switch_mutex_lock(_member->write_mutex)
 //#define unlock_member(_member) switch_mutex_unlock(_member->write_mutex)
 
-typedef struct video_layout_s {
-       char *name;
-       char *audio_position;
-       mcu_layer_geometry_t images[MCU_MAX_LAYERS];
-       int layers;
-} video_layout_t;
-
-typedef struct video_layout_node_s {
-       video_layout_t *vlayout;
-       struct video_layout_node_s *next;
-} video_layout_node_t;
-
-typedef struct layout_group_s {
-       video_layout_node_t *layouts;
-} layout_group_t;
-
-
 static void conference_parse_layouts(conference_obj_t *conference)
 {
        switch_event_t *params;
@@ -1384,6 +1385,17 @@ static void init_canvas_layers(conference_obj_t *conference, video_layout_t *vla
        switch_mutex_lock(conference->canvas->mutex);   
        conference->canvas->layout_floor_id = -1;
 
+       if (!vlayout) {
+               vlayout = conference->canvas->new_vlayout;
+               conference->canvas->new_vlayout = NULL;
+       }
+
+       if (!vlayout) {
+               return;
+       }
+
+       conference->canvas->vlayout = vlayout;
+       
        for (i = 0; i < vlayout->layers; i++) {
                mcu_layer_t *layer = &conference->canvas->layers[i];
 
@@ -1428,6 +1440,7 @@ static void init_canvas_layers(conference_obj_t *conference, video_layout_t *vla
        conference->canvas->layers_used = 0;
        conference->canvas->total_layers = vlayout->layers;
        conference->canvas->send_keyframe = 1;
+       reset_image(conference->canvas->img, &conference->canvas->bgcolor);
        switch_mutex_unlock(conference->canvas->mutex); 
 
 }
@@ -1677,6 +1690,13 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
                switch_time_t now;
                int min_members = 0;
 
+
+               switch_mutex_lock(conference->canvas->mutex);
+               if (conference->canvas->new_vlayout) {
+                       init_canvas_layers(conference, NULL);
+               }
+               switch_mutex_unlock(conference->canvas->mutex);
+
                if (conference->video_timer_reset) {
                        conference->video_timer_reset = 0;
 
@@ -3691,8 +3711,7 @@ static void find_video_floor(conference_member_t *member, switch_bool_t entering
        if (conference->canvas && conference->video_layout_group && (lg = switch_core_hash_find(conference->layout_group_hash, conference->video_layout_group))) {
                if ((vlayout = find_best_layout(conference, lg))) {
                        switch_mutex_lock(conference->member_mutex);
-                       init_canvas_layers(conference, vlayout);
-                       reset_image(conference->canvas->img, &conference->canvas->bgcolor);
+                       conference->canvas->new_vlayout = vlayout;
                        switch_mutex_unlock(conference->member_mutex);
                }
        }
@@ -8429,8 +8448,7 @@ static switch_status_t conf_api_sub_vid_layout(conference_obj_t *conference, swi
        stream->write_function(stream, "Change to layout [%s]\n", vlayout->name);
 
        switch_mutex_lock(conference->member_mutex);
-       init_canvas_layers(conference, vlayout);
-       reset_image(conference->canvas->img, &conference->canvas->bgcolor);
+       conference->canvas->new_vlayout = vlayout;
        switch_mutex_unlock(conference->member_mutex);
 
        return SWITCH_STATUS_SUCCESS;