]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-10254: [mod_conference] Send keyframe from shared encoder on layout changes #resolve
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 20 Apr 2017 15:53:55 +0000 (10:53 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 20 Apr 2017 15:54:01 +0000 (10:54 -0500)
src/mod/applications/mod_conference/conference_video.c

index c88cad9817d45a78c92c3edf15aecfa4fe5ea67d..1c4d67d2223ba28fbae4b7c62c3705e8ce82850f 100644 (file)
@@ -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) {