fix video thread

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15590 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2009-11-21 05:09:10 +00:00
parent 34cf898e0f
commit d0c16f7ae2
1 changed files with 13 additions and 7 deletions

View File

@ -172,7 +172,8 @@ typedef enum {
CFLAG_LOCKED = (1 << 4), CFLAG_LOCKED = (1 << 4),
CFLAG_ANSWERED = (1 << 5), CFLAG_ANSWERED = (1 << 5),
CFLAG_BRIDGE_TO = (1 << 6), CFLAG_BRIDGE_TO = (1 << 6),
CFLAG_WAIT_MOD = (1 << 7) CFLAG_WAIT_MOD = (1 << 7),
CFLAG_VID_FLOOR = (1 << 8)
} conf_flag_t; } conf_flag_t;
typedef enum { typedef enum {
@ -881,7 +882,7 @@ static void *SWITCH_THREAD_FUNC conference_video_thread_run(switch_thread_t *thr
} }
if (!switch_channel_test_flag(switch_core_session_get_channel(conference->floor_holder->session), CF_VIDEO)) { if (!switch_channel_test_flag(switch_core_session_get_channel(conference->floor_holder->session), CF_VIDEO)) {
switch_cond_next(); yield = 100000;
goto do_continue; goto do_continue;
} }
@ -934,10 +935,11 @@ static void *SWITCH_THREAD_FUNC conference_video_thread_run(switch_thread_t *thr
last_member = conference->floor_holder->id; last_member = conference->floor_holder->id;
switch_mutex_unlock(conference->member_mutex);
switch_mutex_lock(conference->member_mutex);
has_vid = 0; has_vid = 0;
for (imember = conference->members; imember; imember = imember->next) { 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++; has_vid++;
switch_core_session_write_video_frame(imember->session, vid_frame, SWITCH_IO_FLAG_NONE, 0); switch_core_session_write_video_frame(imember->session, vid_frame, SWITCH_IO_FLAG_NONE, 0);
} }
@ -1873,9 +1875,11 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v
switch_event_t *event; switch_event_t *event;
switch_set_flag_locked(member, MFLAG_TALKING); switch_set_flag_locked(member, MFLAG_TALKING);
switch_mutex_lock(member->conference->member_mutex); switch_mutex_lock(member->conference->member_mutex);
if (!member->conference->floor_holder || if ((!member->conference->floor_holder ||
!switch_test_flag(member->conference->floor_holder, MFLAG_TALKING) || !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))) { ((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) && if (test_eflag(member->conference, EFLAG_FLOOR_CHANGE) &&
switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
conference_add_event_member_data(member, event); conference_add_event_member_data(member, event);
@ -4773,6 +4777,8 @@ static void set_cflags(const char *flags, uint32_t *f)
for(i = 0; i < argc && argv[i]; i++) { for(i = 0; i < argc && argv[i]; i++) {
if (!strcasecmp(argv[i], "wait-mod")) { if (!strcasecmp(argv[i], "wait-mod")) {
*f |= CFLAG_WAIT_MOD; *f |= CFLAG_WAIT_MOD;
} else if (!strcasecmp(argv[i], "video-floor-only")) {
*f |= CFLAG_VID_FLOOR;
} }
} }