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;
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;
//#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;
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];
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);
}
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;
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);
}
}
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;