From 5272bbc83d0261685baf1c4509fcf3880fa94055 Mon Sep 17 00:00:00 2001
From: Anthony Minessale <anthm@freeswitch.org>
Date: Fri, 23 Mar 2018 18:00:32 -0500
Subject: [PATCH] FS-11057: [mod_conference] CPU race on personal canvas
 #resolve

---
 .../mod_conference/conference_video.c            | 16 ++++++----------
 src/switch_core_media.c                          |  2 ++
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/src/mod/applications/mod_conference/conference_video.c b/src/mod/applications/mod_conference/conference_video.c
index c9f3d36d44..7259fdb60f 100644
--- a/src/mod/applications/mod_conference/conference_video.c
+++ b/src/mod/applications/mod_conference/conference_video.c
@@ -2696,15 +2696,11 @@ void conference_video_pop_next_image(conference_member_t *member, switch_image_t
 	switch_image_t *img = *imgP;
 	int size = 0;
 	void *pop;
-	int half;
 	//if (member->avatar_png_img && switch_channel_test_flag(member->channel, CF_VIDEO_READY) && conference_utils_member_test_flag(member, MFLAG_ACK_VIDEO)) {
 	//	switch_img_free(&member->avatar_png_img);
 	//}
 
-	if ((half = switch_queue_size(member->video_queue) / 2) < 1) {
-		half = 1;
-	}
-	
+
 	if (switch_channel_test_flag(member->channel, CF_VIDEO_READY)) {
 		do {
 			pop = NULL;
@@ -2716,7 +2712,7 @@ void conference_video_pop_next_image(conference_member_t *member, switch_image_t
 				break;
 			}
 			size = switch_queue_size(member->video_queue);
-		} while(size > half);
+		} while(size > 1);
 
 		if (conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN) &&
 			member->video_layer_id > -1 &&
@@ -3547,12 +3543,14 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
 			layout_group_t *lg = NULL;
 			video_layout_t *vlayout = NULL;
 			conference_member_t *omember;
-
+			
 			if (video_key_freq && (now - last_key_time) > video_key_freq) {
 				send_keyframe = SWITCH_TRUE;
 				last_key_time = now;
 			}
 
+			switch_core_timer_next(&canvas->timer);
+			
 			switch_mutex_lock(conference->member_mutex);
 
 			for (imember = conference->members; imember; imember = imember->next) {
@@ -3697,9 +3695,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
 						switch_thread_rwlock_unlock(omember->rwlock);
 					}
 				}
-
-				switch_core_timer_next(&canvas->timer);
-			
+				
 				for (omember = conference->members; omember; omember = omember->next) {
 					mcu_layer_t *layer = NULL;
 					switch_image_t *use_img = NULL;
diff --git a/src/switch_core_media.c b/src/switch_core_media.c
index d574b05c9a..84405c4e80 100644
--- a/src/switch_core_media.c
+++ b/src/switch_core_media.c
@@ -12383,6 +12383,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_receive_message(switch_core_se
 
 	case SWITCH_MESSAGE_INDICATE_HARD_MUTE:
 		if (a_engine->rtp_session) {
+			a_engine->last_seq = 0;
+			
 			if (session->bugs && msg->numeric_arg) {
 				switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING,
 								  "%s has a media bug, hard mute not allowed.\n", switch_channel_get_name(session->channel));