Revision
15590
Author
anthm
Date
2009-11-20 23:09:10 -0600 (Fri, 20 Nov 2009)

Log Message

fix video thread

Modified Paths

Diff

Modified: freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c (15589 => 15590)


--- freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c	2009-11-21 04:39:38 UTC (rev 15589)
+++ freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c	2009-11-21 05:09:10 UTC (rev 15590)
@@ -172,7 +172,8 @@
 	CFLAG_LOCKED = (1 << 4),
 	CFLAG_ANSWERED = (1 << 5),
 	CFLAG_BRIDGE_TO = (1 << 6),
-	CFLAG_WAIT_MOD = (1 << 7)
+	CFLAG_WAIT_MOD = (1 << 7),
+	CFLAG_VID_FLOOR = (1 << 8)
 } conf_flag_t;
 
 typedef enum {
@@ -881,7 +882,7 @@
 		}
 
 		if (!switch_channel_test_flag(switch_core_session_get_channel(conference->floor_holder->session), CF_VIDEO)) {
-			switch_cond_next();
+			yield = 100000;
 			goto do_continue;
 		}
 
@@ -934,10 +935,11 @@
 
 		last_member = conference->floor_holder->id;
 
-		
+		switch_mutex_unlock(conference->member_mutex);
+		switch_mutex_lock(conference->member_mutex);
 		has_vid = 0;
 		for (imember = conference->members; imember; imember = imember->next) {
-			if (switch_channel_test_flag(switch_core_session_get_channel(imember->session), CF_VIDEO)) {
+			if (imember->session && switch_channel_test_flag(switch_core_session_get_channel(imember->session), CF_VIDEO)) {
 				has_vid++;
 				switch_core_session_write_video_frame(imember->session, vid_frame, SWITCH_IO_FLAG_NONE, 0);
 			}
@@ -1873,9 +1875,11 @@
 						switch_event_t *event;
 						switch_set_flag_locked(member, MFLAG_TALKING);
 						switch_mutex_lock(member->conference->member_mutex);
-						if (!member->conference->floor_holder ||
-							!switch_test_flag(member->conference->floor_holder, MFLAG_TALKING) ||
-							((member->score_iir > SCORE_IIR_SPEAKING_MAX) && (member->conference->floor_holder->score_iir < SCORE_IIR_SPEAKING_MIN))) {
+						if ((!member->conference->floor_holder ||
+							 !switch_test_flag(member->conference->floor_holder, MFLAG_TALKING) ||
+							 ((member->score_iir > SCORE_IIR_SPEAKING_MAX) && (member->conference->floor_holder->score_iir < SCORE_IIR_SPEAKING_MIN))) &&
+							(!switch_test_flag(member->conference, CFLAG_VID_FLOOR) || switch_channel_test_flag(channel, CF_VIDEO))) {
+
 							if (test_eflag(member->conference, EFLAG_FLOOR_CHANGE) &&
 								switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
 								conference_add_event_member_data(member, event);
@@ -4773,6 +4777,8 @@
 		for(i = 0; i < argc && argv[i]; i++) {
 			if (!strcasecmp(argv[i], "wait-mod")) {
 				*f |= CFLAG_WAIT_MOD;
+			} else if (!strcasecmp(argv[i], "video-floor-only")) {
+				*f |= CFLAG_VID_FLOOR;
 			}
 		}