mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-02-07 22:03:50 +00:00
FS-9906: [mod_conference] Member join/part in conference shows webcam briefly during slide transition #resolve
This commit is contained in:
parent
4ead2fcffc
commit
f0a0bbd728
@ -1415,12 +1415,13 @@ void conference_video_write_canvas_image_to_codec_group(conference_obj_t *confer
|
|||||||
} while(encode_status == SWITCH_STATUS_MORE_DATA);
|
} while(encode_status == SWITCH_STATUS_MORE_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
video_layout_t *conference_video_find_best_layout(conference_obj_t *conference, layout_group_t *lg, uint32_t count)
|
video_layout_t *conference_video_find_best_layout(conference_obj_t *conference, layout_group_t *lg, uint32_t count, uint32_t file_count)
|
||||||
{
|
{
|
||||||
video_layout_node_t *vlnode = NULL, *last = NULL;
|
video_layout_node_t *vlnode = NULL, *last = NULL;
|
||||||
|
|
||||||
if (!count) {
|
if (!count) {
|
||||||
count = conference->members_with_video;
|
count = conference->members_with_video;
|
||||||
|
file_count = 0;
|
||||||
|
|
||||||
if (!conference_utils_test_flag(conference, CFLAG_VIDEO_REQUIRED_FOR_CANVAS)) {
|
if (!conference_utils_test_flag(conference, CFLAG_VIDEO_REQUIRED_FOR_CANVAS)) {
|
||||||
count += conference->members_with_avatar;
|
count += conference->members_with_avatar;
|
||||||
@ -1432,7 +1433,15 @@ video_layout_t *conference_video_find_best_layout(conference_obj_t *conference,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (vlnode = lg->layouts; vlnode; vlnode = vlnode->next) {
|
for (vlnode = lg->layouts; vlnode; vlnode = vlnode->next) {
|
||||||
if (vlnode->vlayout->layers >= (int)count) {
|
int x, file_layers = 0, member_count = (int)count - file_count, total = vlnode->vlayout->layers;
|
||||||
|
|
||||||
|
for (x = total; x >= 0; x--) {
|
||||||
|
if (vlnode->vlayout->images[x].fileonly) {
|
||||||
|
file_layers++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((vlnode->vlayout->layers - file_layers >= member_count && file_layers >= file_count) || vlnode->vlayout->layers - file_layers > (int)count) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1449,7 +1458,7 @@ video_layout_t *conference_video_get_layout(conference_obj_t *conference, const
|
|||||||
|
|
||||||
if (video_layout_group) {
|
if (video_layout_group) {
|
||||||
lg = switch_core_hash_find(conference->layout_group_hash, video_layout_group);
|
lg = switch_core_hash_find(conference->layout_group_hash, video_layout_group);
|
||||||
vlayout = conference_video_find_best_layout(conference, lg, 0);
|
vlayout = conference_video_find_best_layout(conference, lg, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
vlayout = switch_core_hash_find(conference->layout_hash, video_layout_name);
|
vlayout = switch_core_hash_find(conference->layout_hash, video_layout_name);
|
||||||
}
|
}
|
||||||
@ -2464,7 +2473,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
|||||||
video_layout_t *vlayout = NULL;
|
video_layout_t *vlayout = NULL;
|
||||||
|
|
||||||
if (canvas->video_layout_group && (lg = switch_core_hash_find(conference->layout_group_hash, canvas->video_layout_group))) {
|
if (canvas->video_layout_group && (lg = switch_core_hash_find(conference->layout_group_hash, canvas->video_layout_group))) {
|
||||||
if ((vlayout = conference_video_find_best_layout(conference, lg, canvas->video_count))) {
|
if ((vlayout = conference_video_find_best_layout(conference, lg, canvas->video_count, file_count)) && vlayout != canvas->vlayout) {
|
||||||
switch_mutex_lock(conference->member_mutex);
|
switch_mutex_lock(conference->member_mutex);
|
||||||
canvas->new_vlayout = vlayout;
|
canvas->new_vlayout = vlayout;
|
||||||
switch_mutex_unlock(conference->member_mutex);
|
switch_mutex_unlock(conference->member_mutex);
|
||||||
@ -2800,7 +2809,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (canvas->video_layout_group && (lg = switch_core_hash_find(conference->layout_group_hash, canvas->video_layout_group))) {
|
if (canvas->video_layout_group && (lg = switch_core_hash_find(conference->layout_group_hash, canvas->video_layout_group))) {
|
||||||
if ((vlayout = conference_video_find_best_layout(conference, lg, total + file_count))) {
|
if ((vlayout = conference_video_find_best_layout(conference, lg, total + file_count, file_count))) {
|
||||||
conference_video_init_canvas_layers(conference, imember->canvas, vlayout);
|
conference_video_init_canvas_layers(conference, imember->canvas, vlayout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3373,7 +3382,7 @@ void *SWITCH_THREAD_FUNC conference_video_super_muxing_thread_run(switch_thread_
|
|||||||
if (total < 1) total = 1;
|
if (total < 1) total = 1;
|
||||||
|
|
||||||
if ((lg = switch_core_hash_find(conference->layout_group_hash, CONFERENCE_MUX_DEFAULT_SUPER_LAYOUT))) {
|
if ((lg = switch_core_hash_find(conference->layout_group_hash, CONFERENCE_MUX_DEFAULT_SUPER_LAYOUT))) {
|
||||||
if ((vlayout = conference_video_find_best_layout(conference, lg, total))) {
|
if ((vlayout = conference_video_find_best_layout(conference, lg, total, 0))) {
|
||||||
conference_video_init_canvas_layers(conference, canvas, vlayout);
|
conference_video_init_canvas_layers(conference, canvas, vlayout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -934,7 +934,7 @@ int conference_member_setup_media(conference_member_t *member, conference_obj_t
|
|||||||
|
|
||||||
al_handle_t *conference_al_create(switch_memory_pool_t *pool);
|
al_handle_t *conference_al_create(switch_memory_pool_t *pool);
|
||||||
switch_status_t conference_member_parse_position(conference_member_t *member, const char *data);
|
switch_status_t conference_member_parse_position(conference_member_t *member, const char *data);
|
||||||
video_layout_t *conference_video_find_best_layout(conference_obj_t *conference, layout_group_t *lg, uint32_t count);
|
video_layout_t *conference_video_find_best_layout(conference_obj_t *conference, layout_group_t *lg, uint32_t count, uint32_t file_count);
|
||||||
void conference_list_count_only(conference_obj_t *conference, switch_stream_handle_t *stream);
|
void conference_list_count_only(conference_obj_t *conference, switch_stream_handle_t *stream);
|
||||||
void conference_member_set_floor_holder(conference_obj_t *conference, conference_member_t *member);
|
void conference_member_set_floor_holder(conference_obj_t *conference, conference_member_t *member);
|
||||||
void conference_utils_member_clear_flag(conference_member_t *member, member_flag_t flag);
|
void conference_utils_member_clear_flag(conference_member_t *member, member_flag_t flag);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user