mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-10-28 14:14:16 +00:00
FS-7800 fix some stuff in multi-canvas
This commit is contained in:
1 parent
3eff2d553d
commit
f93668e3fd
12 files changed
+139
-61
No files matched your search
@@ -1161,6 +1161,8 @@ switch_status_t conference_api_sub_write_png(conference_obj_t *conference, switc
|
||||
switch_status_t conference_api_sub_vid_layout(conference_obj_t *conference, switch_stream_handle_t *stream, int argc, char **argv)
|
||||
{
|
||||
video_layout_t *vlayout = NULL;
|
||||
char *group_name = NULL;
|
||||
|
||||
int idx = 0;
|
||||
|
||||
if (!argv[2]) {
|
||||
@@ -1186,7 +1188,6 @@ switch_status_t conference_api_sub_vid_layout(conference_obj_t *conference, swit
|
||||
|
||||
if (!strncasecmp(argv[2], "group", 5)) {
|
||||
layout_group_t *lg = NULL;
|
||||
char *group_name = NULL;
|
||||
int xx = 4;
|
||||
|
||||
if ((group_name = strchr(argv[2], ':'))) {
|
||||
@@ -1195,7 +1196,7 @@ switch_status_t conference_api_sub_vid_layout(conference_obj_t *conference, swit
|
||||
} else {
|
||||
group_name = argv[3];
|
||||
}
|
||||
|
||||
|
||||
if (!group_name) {
|
||||
stream->write_function(stream, "Group name not specified.\n");
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
@@ -1206,33 +1207,30 @@ switch_status_t conference_api_sub_vid_layout(conference_obj_t *conference, swit
|
||||
conference->video_layout_group = switch_core_strdup(conference->pool, group_name);
|
||||
conference_utils_set_flag(conference, CFLAG_REFRESH_LAYOUT);
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
} else {
|
||||
vlayout = conference_video_find_best_layout(conference, lg, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (!vlayout) {
|
||||
stream->write_function(stream, "Invalid group layout [%s]\n", group_name);
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
} else {
|
||||
group_name = NULL;
|
||||
}
|
||||
|
||||
stream->write_function(stream, "Change to layout group [%s]\n", group_name);
|
||||
conference->video_layout_group = switch_core_strdup(conference->pool, group_name);
|
||||
|
||||
if (argv[xx]) {
|
||||
idx = atoi(argv[xx]);
|
||||
if ((idx = atoi(argv[xx])) > 0) {
|
||||
idx--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!vlayout && (vlayout = switch_core_hash_find(conference->layout_hash, argv[2]))) {
|
||||
conference->video_layout_group = NULL;
|
||||
if (argv[3]) {
|
||||
idx = atoi(argv[3]);
|
||||
if ((idx = atoi(argv[3]))) {
|
||||
idx--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!vlayout) {
|
||||
if (!vlayout && !group_name) {
|
||||
stream->write_function(stream, "Invalid layout [%s]\n", argv[2]);
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
@@ -1246,9 +1244,15 @@ switch_status_t conference_api_sub_vid_layout(conference_obj_t *conference, swit
|
||||
conference->new_personal_vlayout = vlayout;
|
||||
switch_mutex_unlock(conference->member_mutex);
|
||||
} else {
|
||||
stream->write_function(stream, "Change canvas %d to layout [%s]\n", idx + 1, vlayout->name);
|
||||
|
||||
switch_mutex_lock(conference->canvases[idx]->mutex);
|
||||
conference->canvases[idx]->new_vlayout = vlayout;
|
||||
if (vlayout) {
|
||||
stream->write_function(stream, "Change canvas %d to layout [%s]\n", idx + 1, vlayout->name);
|
||||
conference->canvases[idx]->new_vlayout = vlayout;
|
||||
} else if (group_name) {
|
||||
conference->canvases[idx]->video_layout_group = switch_core_strdup(conference->pool, group_name);
|
||||
conference_utils_set_flag(conference, CFLAG_REFRESH_LAYOUT);
|
||||
}
|
||||
switch_mutex_unlock(conference->canvases[idx]->mutex);
|
||||
}
|
||||
|
||||
|
||||
@@ -736,12 +736,12 @@ switch_status_t conference_member_add(conference_obj_t *conference, conference_m
|
||||
|
||||
channel = switch_core_session_get_channel(member->session);
|
||||
|
||||
conference_video_check_avatar(member, SWITCH_FALSE);
|
||||
|
||||
if (switch_true(switch_channel_get_variable_dup(member->channel, "video_second_screen", SWITCH_FALSE, -1))) {
|
||||
conference_utils_member_set_flag(member, MFLAG_SECOND_SCREEN);
|
||||
}
|
||||
|
||||
conference_video_check_avatar(member, SWITCH_FALSE);
|
||||
|
||||
if ((var = switch_channel_get_variable_dup(member->channel, "video_initial_canvas", SWITCH_FALSE, -1))) {
|
||||
uint32_t id = atoi(var) - 1;
|
||||
if (id < conference->canvas_count) {
|
||||
|
||||
@@ -338,12 +338,18 @@ switch_bool_t conference_utils_test_mflag(conference_obj_t *conference, member_f
|
||||
void conference_utils_member_set_flag(conference_member_t *member, member_flag_t flag)
|
||||
{
|
||||
member->flags[flag] = 1;
|
||||
|
||||
if (flag == MFLAG_SECOND_SCREEN) {
|
||||
member->flags[MFLAG_CAN_SPEAK] = 0;
|
||||
member->flags[MFLAG_CAN_HEAR] = 0;
|
||||
member->flags[MFLAG_CAN_BE_SEEN] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void conference_utils_member_set_flag_locked(conference_member_t *member, member_flag_t flag)
|
||||
{
|
||||
switch_mutex_lock(member->flag_mutex);
|
||||
member->flags[flag] = 1;
|
||||
conference_utils_member_set_flag(member, flag);
|
||||
switch_mutex_unlock(member->flag_mutex);
|
||||
}
|
||||
|
||||
|
||||
@@ -1340,7 +1340,13 @@ video_layout_t *conference_video_find_best_layout(conference_obj_t *conference,
|
||||
{
|
||||
video_layout_node_t *vlnode = NULL, *last = NULL;
|
||||
|
||||
if (!count) count = conference->members_with_video + conference->members_with_avatar;
|
||||
if (!count) {
|
||||
count = conference->members_with_video;
|
||||
|
||||
if (!conference_utils_test_flag(conference, CFLAG_VIDEO_REQUIRED_FOR_CANVAS)) {
|
||||
count += conference->members_with_avatar;
|
||||
}
|
||||
}
|
||||
|
||||
for (vlnode = lg->layouts; vlnode; vlnode = vlnode->next) {
|
||||
if (vlnode->vlayout->layers >= (int)count) {
|
||||
@@ -1624,6 +1630,10 @@ void conference_video_check_avatar(conference_member_t *member, switch_bool_t fo
|
||||
return;
|
||||
}
|
||||
|
||||
if (conference_utils_member_test_flag(member, MFLAG_SECOND_SCREEN)) {
|
||||
return;
|
||||
}
|
||||
|
||||
canvas = conference_video_get_canvas_locked(member);
|
||||
|
||||
if (conference_utils_test_flag(member->conference, CFLAG_VIDEO_REQUIRED_FOR_CANVAS) &&
|
||||
@@ -2149,6 +2159,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
||||
int last_personal = conference_utils_test_flag(conference, CFLAG_PERSONAL_CANVAS) ? 1 : 0;
|
||||
|
||||
canvas->video_timer_reset = 1;
|
||||
canvas->video_layout_group = conference->video_layout_group;
|
||||
|
||||
packet = switch_core_alloc(conference->pool, SWITCH_RTP_MAX_BUF_LEN);
|
||||
|
||||
@@ -2161,7 +2172,8 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
||||
switch_image_t *async_file_img = NULL, *normal_file_img = NULL, *file_imgs[2] = { 0 };
|
||||
switch_frame_t file_frame = { 0 };
|
||||
int j = 0, personal = conference_utils_test_flag(conference, CFLAG_PERSONAL_CANVAS) ? 1 : 0;
|
||||
|
||||
int video_count = 0;
|
||||
|
||||
if (!personal) {
|
||||
if (canvas->new_vlayout && switch_mutex_trylock(conference->canvas_mutex) == SWITCH_STATUS_SUCCESS) {
|
||||
conference_video_init_canvas_layers(conference, canvas, NULL);
|
||||
@@ -2180,7 +2192,24 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
||||
canvas->send_keyframe = 1;
|
||||
}
|
||||
|
||||
|
||||
video_count = 0;
|
||||
|
||||
switch_mutex_lock(conference->member_mutex);
|
||||
for (imember = conference->members; imember; imember = imember->next) {
|
||||
int no_muted = conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS);
|
||||
int no_av = conference_utils_test_flag(imember->conference, CFLAG_VIDEO_REQUIRED_FOR_CANVAS);
|
||||
int seen = conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN);
|
||||
|
||||
if (imember->channel && switch_channel_ready(imember->channel) && switch_channel_test_flag(imember->channel, CF_VIDEO_READY) &&
|
||||
!conference_utils_member_test_flag(imember, MFLAG_SECOND_SCREEN) &&
|
||||
conference_utils_member_test_flag(imember, MFLAG_RUNNING) && (!no_muted || seen) && (!no_av || imember->avatar_png_img)
|
||||
&& imember->canvas_id == canvas->canvas_id && imember->video_media_flow != SWITCH_MEDIA_FLOW_SENDONLY) {
|
||||
video_count++;
|
||||
}
|
||||
}
|
||||
canvas->video_count = video_count;
|
||||
switch_mutex_unlock(conference->member_mutex);
|
||||
|
||||
switch_core_timer_next(&canvas->timer);
|
||||
|
||||
now = switch_micro_time_now();
|
||||
@@ -2204,28 +2233,18 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
||||
if (members_with_avatar != conference->members_with_avatar) {
|
||||
count_changed = 1;
|
||||
}
|
||||
|
||||
if (conference_utils_test_flag(conference, CFLAG_REFRESH_LAYOUT)) {
|
||||
count_changed = 1;
|
||||
conference_utils_clear_flag(conference, CFLAG_REFRESH_LAYOUT);
|
||||
}
|
||||
|
||||
if (count_changed && !personal) {
|
||||
layout_group_t *lg = NULL;
|
||||
video_layout_t *vlayout = NULL;
|
||||
int canvas_count = 0;
|
||||
|
||||
switch_mutex_lock(conference->member_mutex);
|
||||
for (imember = conference->members; imember; imember = imember->next) {
|
||||
int no_muted = conference_utils_test_flag(imember->conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS);
|
||||
int no_av = conference_utils_test_flag(imember->conference, CFLAG_VIDEO_REQUIRED_FOR_CANVAS);
|
||||
int seen = conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN);
|
||||
|
||||
if (imember->channel && switch_channel_ready(imember->channel) && switch_channel_test_flag(imember->channel, CF_VIDEO_READY) &&
|
||||
conference_utils_member_test_flag(imember, MFLAG_RUNNING) && (!no_muted || seen) && (!no_av || imember->avatar_png_img)
|
||||
&& imember->canvas_id == canvas->canvas_id && imember->video_media_flow != SWITCH_MEDIA_FLOW_SENDONLY) {
|
||||
canvas_count++;
|
||||
}
|
||||
}
|
||||
switch_mutex_unlock(conference->member_mutex);
|
||||
|
||||
if (conference->video_layout_group && (lg = switch_core_hash_find(conference->layout_group_hash, conference->video_layout_group))) {
|
||||
if ((vlayout = conference_video_find_best_layout(conference, lg, canvas_count))) {
|
||||
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))) {
|
||||
switch_mutex_lock(conference->member_mutex);
|
||||
canvas->new_vlayout = vlayout;
|
||||
switch_mutex_unlock(conference->member_mutex);
|
||||
@@ -2534,11 +2553,6 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
||||
|
||||
switch_mutex_lock(conference->member_mutex);
|
||||
|
||||
if (conference_utils_test_flag(conference, CFLAG_REFRESH_LAYOUT)) {
|
||||
count_changed = 1;
|
||||
conference_utils_clear_flag(conference, CFLAG_REFRESH_LAYOUT);
|
||||
}
|
||||
|
||||
for (imember = conference->members; imember; imember = imember->next) {
|
||||
|
||||
if (!imember->session || !switch_channel_test_flag(imember->channel, CF_VIDEO_READY) ||
|
||||
@@ -2547,7 +2561,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
||||
}
|
||||
|
||||
if (!imember->canvas) {
|
||||
if ((vlayout = conference_video_get_layout(conference, conference->video_layout_name, conference->video_layout_group))) {
|
||||
if ((vlayout = conference_video_get_layout(conference, conference->video_layout_name, canvas->video_layout_group))) {
|
||||
conference_video_init_canvas(conference, vlayout, &imember->canvas);
|
||||
conference_video_init_canvas_layers(conference, imember->canvas, vlayout);
|
||||
} else {
|
||||
@@ -2584,7 +2598,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
||||
total = 0;
|
||||
}
|
||||
|
||||
if (conference->video_layout_group && (lg = switch_core_hash_find(conference->layout_group_hash, conference->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))) {
|
||||
conference_video_init_canvas_layers(conference, imember->canvas, vlayout);
|
||||
}
|
||||
|
||||
@@ -279,7 +279,12 @@ void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, void *ob
|
||||
}
|
||||
}
|
||||
|
||||
if (switch_channel_ready(channel) && switch_channel_test_flag(channel, CF_VIDEO_READY) && imember->video_media_flow != SWITCH_MEDIA_FLOW_SENDONLY && (!conference_utils_test_flag(conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS) || conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN))) {
|
||||
if (switch_channel_ready(channel) &&
|
||||
switch_channel_test_flag(channel, CF_VIDEO_READY) &&
|
||||
imember->video_media_flow != SWITCH_MEDIA_FLOW_SENDONLY &&
|
||||
!conference_utils_member_test_flag(imember, MFLAG_SECOND_SCREEN) &&
|
||||
(!conference_utils_test_flag(conference, CFLAG_VIDEO_MUTE_EXIT_CANVAS) ||
|
||||
conference_utils_member_test_flag(imember, MFLAG_CAN_BE_SEEN))) {
|
||||
members_with_video++;
|
||||
}
|
||||
|
||||
|
||||
@@ -485,6 +485,8 @@ typedef struct mcu_canvas_s {
|
||||
int refresh;
|
||||
int send_keyframe;
|
||||
int play_file;
|
||||
int video_count;
|
||||
char *video_layout_group;
|
||||
switch_rgb_color_t bgcolor;
|
||||
switch_rgb_color_t border_color;
|
||||
switch_rgb_color_t letterbox_bgcolor;
|
||||
|
||||
Reference in new issue
Block a user