From: Anthony Minessale Date: Thu, 20 Apr 2017 15:53:55 +0000 (-0500) Subject: FS-10254: [mod_conference] Send keyframe from shared encoder on layout changes #resolve X-Git-Tag: v1.8.0~587 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cb40b5f66738cdf2031ee7e470fd10825504808e;p=thirdparty%2Ffreeswitch.git FS-10254: [mod_conference] Send keyframe from shared encoder on layout changes #resolve --- diff --git a/src/mod/applications/mod_conference/conference_video.c b/src/mod/applications/mod_conference/conference_video.c index c88cad9817..1c4d67d222 100644 --- a/src/mod/applications/mod_conference/conference_video.c +++ b/src/mod/applications/mod_conference/conference_video.c @@ -2876,6 +2876,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr int files_playing = 0; int last_personal = conference_utils_test_flag(conference, CFLAG_PERSONAL_CANVAS) ? 1 : 0; int last_video_count = 0; + int watchers = 0, last_watchers = 0; canvas->video_timer_reset = 1; canvas->video_layout_group = conference->video_layout_group; @@ -2930,11 +2931,18 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr switch_mutex_unlock(conference->file_mutex); switch_mutex_lock(conference->member_mutex); + watchers = 0; + 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) && + imember->watching_canvas_id == canvas->canvas_id) { + watchers++; + } + 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 || (no_av && !imember->avatar_png_img)) @@ -2994,6 +3002,10 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr count_changed = 1; } + if (count_changed || watchers != last_watchers) { + canvas->send_keyframe = 1; + } + if (count_changed && !personal) { layout_group_t *lg = NULL; video_layout_t *vlayout = NULL; @@ -3007,7 +3019,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr } } - + last_watchers = watchers; last_file_count = file_count; if (do_refresh) {