]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7513: do layers in order and reset when attaching
authorAnthony Minessale <anthm@freeswitch.org>
Fri, 6 Feb 2015 23:28:52 +0000 (17:28 -0600)
committerMichael Jerris <mike@jerris.com>
Thu, 28 May 2015 17:46:58 +0000 (12:46 -0500)
src/include/switch_utils.h
src/mod/applications/mod_conference/mod_conference.c

index 4a35d23bf57e07c861dec9e713321a56f07c7ffe..a39edb3e567be4ad9e9dfe5efc700d8bc840f73d 100644 (file)
@@ -976,7 +976,7 @@ SWITCH_DECLARE(char *) switch_util_quote_shell_arg_pool(const char *string, swit
 
 #define SWITCH_READ_ACCEPTABLE(status) (status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK || status == SWITCH_STATUS_INUSE)
 
-static inline uint32_t switch_parse_bandwidth_string(const char *bwv)
+static inline int32_t switch_parse_bandwidth_string(const char *bwv)
 {
        int32_t bw = 0;
 
index af61eb9810cc60b9e9c5f786175db0fe8f681070..d60ffc1f35db3bd226d2186a17aae25edb87fbe8 100644 (file)
@@ -355,6 +355,7 @@ typedef struct mcu_layer_s {
        mcu_layer_geometry_t geometry;
        int member_id;
        int idx;
+       int tagged;
        switch_image_t *img;
        switch_image_t *cur_img;
 } mcu_layer_t;
@@ -931,9 +932,12 @@ static void set_bgcolor(bgcolor_yuv_t *bgcolor, char *bgcolor_str)
 
 static void reset_layer(mcu_canvas_t *canvas, mcu_layer_t *layer)
 {
+
        int x = 0, y = 0;
        int screen_w = 0, screen_h = 0;
 
+       layer->tagged = 0;
+
        screen_w = canvas->img->d_w * layer->geometry.scale / SCALE_FACTOR;
        screen_h = canvas->img->d_h * layer->geometry.scale / SCALE_FACTOR;
 
@@ -1085,6 +1089,7 @@ static switch_status_t attach_video_layer(conference_member_t *member, int idx)
        switch_mutex_lock(member->conference->canvas->mutex);
 
        layer = &member->conference->canvas->layers[idx];
+       layer->tagged = 0;
 
        if (layer->member_id && layer->member_id == member->id) {
                member->video_layer_id = idx;
@@ -1095,6 +1100,8 @@ static switch_status_t attach_video_layer(conference_member_t *member, int idx)
                detach_video_layer(member);
        }
 
+       reset_layer(member->conference->canvas, layer);
+
        channel = switch_core_session_get_channel(member->session);
        res_id = switch_channel_get_variable_dup(channel, "video_reservation_id", SWITCH_FALSE, -1);
        
@@ -1150,6 +1157,7 @@ static void init_canvas_layers(conference_obj_t *conference, video_layout_t *vla
        for (i = 0; i < MCU_MAX_LAYERS; i++) {
                mcu_layer_t *layer = &conference->canvas->layers[i];
                layer->member_id = 0;
+               layer->tagged = 0;
        }
 
        conference->canvas->layers_used = 0;
@@ -1444,7 +1452,7 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
                                if (layer) {
                                        switch_img_free(&layer->cur_img);
                                        layer->cur_img = img;
-                                       scale_and_patch(conference, layer);
+                                       layer->tagged = 1;
                                }
                        }
 
@@ -1457,6 +1465,17 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
 
                if (remaining) goto top;
 
+               
+               for (i = 0; i < conference->canvas->total_layers; i++) {
+                       mcu_layer_t *layer = &conference->canvas->layers[i];
+                       
+                       if (layer->member_id > -1 && layer->cur_img && layer->tagged) {
+                               scale_and_patch(conference, layer);
+                               layer->tagged = 0;
+                       }
+               }
+
+
                if (used) {
                        switch_time_t now = switch_micro_time_now();