FS-10121: [mod_conference] Add role-id and layout transitions to conference
This commit is contained in:
parent
1b88dba5db
commit
b3b2f60545
|
@ -1415,6 +1415,9 @@ void conference_video_init_canvas_layers(conference_obj_t *conference, mcu_canva
|
||||||
|
|
||||||
canvas->vlayout = vlayout;
|
canvas->vlayout = vlayout;
|
||||||
|
|
||||||
|
canvas->res_count = 0;
|
||||||
|
canvas->role_count = 0;
|
||||||
|
|
||||||
for (i = 0; i < vlayout->layers; i++) {
|
for (i = 0; i < vlayout->layers; i++) {
|
||||||
mcu_layer_t *layer = &canvas->layers[i];
|
mcu_layer_t *layer = &canvas->layers[i];
|
||||||
|
|
||||||
|
@ -1454,8 +1457,15 @@ void conference_video_init_canvas_layers(conference_obj_t *conference, mcu_canva
|
||||||
|
|
||||||
/* if we ever decided to reload layers config on demand the pointer assignment below will lead to segs but we
|
/* if we ever decided to reload layers config on demand the pointer assignment below will lead to segs but we
|
||||||
only load them once forever per conference so these pointers are valid for the life of the conference */
|
only load them once forever per conference so these pointers are valid for the life of the conference */
|
||||||
layer->geometry.res_id = vlayout->images[i].res_id;
|
|
||||||
layer->geometry.role_id = vlayout->images[i].role_id;
|
if ((layer->geometry.res_id = vlayout->images[i].res_id)) {
|
||||||
|
canvas->res_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((layer->geometry.role_id = vlayout->images[i].role_id)) {
|
||||||
|
canvas->role_count++;
|
||||||
|
}
|
||||||
|
|
||||||
layer->geometry.audio_position = vlayout->images[i].audio_position;
|
layer->geometry.audio_position = vlayout->images[i].audio_position;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3056,25 +3066,29 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
||||||
layer = NULL;
|
layer = NULL;
|
||||||
|
|
||||||
switch_mutex_lock(canvas->mutex);
|
switch_mutex_lock(canvas->mutex);
|
||||||
|
|
||||||
|
|
||||||
if (canvas->layout_floor_id > -1 && imember->id == conference->video_floor_holder &&
|
if (zstr(imember->video_role_id) || !canvas->role_count) {
|
||||||
imember->video_layer_id != canvas->layout_floor_id) {
|
if (canvas->layout_floor_id > -1 && imember->id == conference->video_floor_holder &&
|
||||||
conference_video_attach_video_layer(imember, canvas, canvas->layout_floor_id);
|
imember->video_layer_id != canvas->layout_floor_id) {
|
||||||
|
conference_video_attach_video_layer(imember, canvas, canvas->layout_floor_id);
|
||||||
|
layer = &canvas->layers[imember->video_layer_id];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("MEMBER %d layer_id %d canvas: %d/%d\n", imember->id, imember->video_layer_id,
|
//printf("MEMBER %d layer_id %d canvas: %d/%d\n", imember->id, imember->video_layer_id,
|
||||||
// canvas->layers_used, canvas->total_layers);
|
// canvas->layers_used, canvas->total_layers);
|
||||||
|
|
||||||
if (imember->video_role_id) {
|
if (!zstr(imember->video_role_id) && canvas->role_count) {
|
||||||
if (imember->video_layer_id > -1) {
|
if (imember->video_layer_id > -1) {
|
||||||
layer = &canvas->layers[imember->video_layer_id];
|
layer = &canvas->layers[imember->video_layer_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!layer || (!layer->geometry.role_id || strcmp(layer->geometry.role_id, imember->video_role_id))) {
|
if (!layer || (zstr(layer->geometry.role_id) || strcmp(layer->geometry.role_id, imember->video_role_id))) {
|
||||||
for (i = 0; i < canvas->total_layers; i++) {
|
for (i = 0; i < canvas->total_layers; i++) {
|
||||||
mcu_layer_t *xlayer = &canvas->layers[i];
|
mcu_layer_t *xlayer = &canvas->layers[i];
|
||||||
|
|
||||||
if (imember->video_role_id && xlayer->geometry.role_id && !strcmp(xlayer->geometry.role_id, imember->video_role_id)) {
|
if (!zstr(imember->video_role_id) && !zstr(xlayer->geometry.role_id) && !strcmp(xlayer->geometry.role_id, imember->video_role_id)) {
|
||||||
conference_video_attach_video_layer(imember, canvas, i);
|
conference_video_attach_video_layer(imember, canvas, i);
|
||||||
layer = xlayer;
|
layer = xlayer;
|
||||||
}
|
}
|
||||||
|
@ -3082,8 +3096,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (imember->video_layer_id > -1) {
|
||||||
if (!layer && imember->video_layer_id > -1) {
|
|
||||||
layer = &canvas->layers[imember->video_layer_id];
|
layer = &canvas->layers[imember->video_layer_id];
|
||||||
|
|
||||||
if (layer->member_id != (int)imember->id) {
|
if (layer->member_id != (int)imember->id) {
|
||||||
|
|
|
@ -521,6 +521,8 @@ typedef struct mcu_canvas_s {
|
||||||
int height;
|
int height;
|
||||||
switch_image_t *img;
|
switch_image_t *img;
|
||||||
mcu_layer_t layers[MCU_MAX_LAYERS];
|
mcu_layer_t layers[MCU_MAX_LAYERS];
|
||||||
|
int res_count;
|
||||||
|
int role_count;
|
||||||
int total_layers;
|
int total_layers;
|
||||||
int layers_used;
|
int layers_used;
|
||||||
int layout_floor_id;
|
int layout_floor_id;
|
||||||
|
|
Loading…
Reference in New Issue