From 1aa66ef30abcb5767ec046f2d6b67664bc34e479 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 6 Feb 2015 17:28:52 -0600 Subject: [PATCH] FS-7513: do layers in order and reset when attaching --- src/include/switch_utils.h | 2 +- .../mod_conference/mod_conference.c | 21 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/include/switch_utils.h b/src/include/switch_utils.h index 4a35d23bf5..a39edb3e56 100644 --- a/src/include/switch_utils.h +++ b/src/include/switch_utils.h @@ -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; diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index af61eb9810..d60ffc1f35 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -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();