FS-7513 add video-auto-floor-msec param to control how long a member must have the audio floor before also taking the video floor %NEEDS_DOC

This commit is contained in:
Anthony Minessale 2015-06-01 11:54:43 -05:00
parent f792f9de9e
commit f82dd1e9ea
2 changed files with 29 additions and 6 deletions

View File

@ -185,6 +185,7 @@
<!-- <param name="video-layout-bgcolor" value="#000000"/> -->
<!-- <param name="video-codec-bandwidth" value="2mb"/> -->
<!-- <param name="video-fps" value="15"/> -->
<!-- <param name="video-auto-floor-msec" value="100"/> -->
<!-- <param name="tts-engine" value="flite"/> -->

View File

@ -594,6 +594,7 @@ typedef struct conference_obj {
struct conf_fps video_fps;
int playing_video_file;
int recording_members;
uint32_t video_floor_packets;
} conference_obj_t;
/* Relationship with another member */
@ -682,6 +683,7 @@ struct conference_member {
switch_frame_buffer_t *fb;
switch_image_t *avatar_png_img;
switch_image_t *video_mute_img;
uint32_t floor_packets;
int blanks;
int managed_kps;
int blackouts;
@ -4531,6 +4533,7 @@ static void conference_set_floor_holder(conference_obj_t *conference, conference
if (old_member) {
old_id = old_member->id;
member_update_status_field(old_member);
old_member->floor_packets = 0;
}
switch_set_flag(conference, CFLAG_FLOOR_CHANGE);
@ -6330,6 +6333,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v
check_agc_levels(member);
clear_avg(member);
member->score_iir = 0;
member->floor_packets = 0;
if (test_eflag(member->conference, EFLAG_STOP_TALKING) &&
switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
@ -6369,7 +6373,7 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v
if (member->volume_in_level) {
switch_change_sln_volume(read_frame->data, (read_frame->datalen / 2) * member->conference->channels, member->volume_in_level);
}
if (member->agc_volume_in_level) {
switch_change_sln_volume_granular(read_frame->data, (read_frame->datalen / 2) * member->conference->channels, member->agc_volume_in_level);
}
@ -6428,10 +6432,6 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v
member->score_iir = SCORE_MAX_IIR;
}
if (member == member->conference->floor_holder && member->id != member->conference->video_floor_holder) {
conference_set_video_floor_holder(member->conference, member, SWITCH_FALSE);
}
if (noise_gate_check(member)) {
uint32_t diff = member->score - member->energy_level;
if (hangover_hits) {
@ -6442,6 +6442,10 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v
member->nt_tally = 0;
}
if (member == member->conference->floor_holder) {
member->floor_packets++;
}
if (diff >= diff_level || ++hangunder_hits >= hangunder) {
hangover_hits = hangunder_hits = 0;
@ -6504,6 +6508,13 @@ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, v
member->last_score = member->score;
if (member == member->conference->floor_holder) {
if (member->id != member->conference->video_floor_holder &&
(member->floor_packets > member->conference->video_floor_packets || member->energy_level == 0)) {
conference_set_video_floor_holder(member->conference, member, SWITCH_FALSE);
}
}
}
loops++;
@ -12573,7 +12584,7 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c
switch_codec_implementation_t read_impl = { 0 };
switch_channel_t *channel = NULL;
const char *force_rate = NULL, *force_interval = NULL, *force_channels = NULL, *presence_id = NULL;
uint32_t force_rate_i = 0, force_interval_i = 0, force_channels_i = 0;
uint32_t force_rate_i = 0, force_interval_i = 0, force_channels_i = 0, video_auto_floor_msec = 0;
/* Validate the conference name */
if (zstr(name)) {
@ -12790,6 +12801,13 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c
} else if (switch_true(val)) {
comfort_noise_level = 1400;
}
} else if (!strcasecmp(var, "video-auto-floor-msec") && !zstr(val)) {
int tmp;
tmp = atoi(val);
if (tmp > 0) {
video_auto_floor_msec = tmp;
}
} else if (!strcasecmp(var, "sound-prefix") && !zstr(val)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "override sound-prefix with: %s\n", val);
sound_prefix = val;
@ -13170,6 +13188,10 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_c
conference->ivr_dtmf_timeout = ivr_dtmf_timeout;
conference->ivr_input_timeout = ivr_input_timeout;
if (video_auto_floor_msec) {
conference->video_floor_packets = video_auto_floor_msec / conference->interval;
}
conference->eflags = 0xFFFFFFFF;
if (!zstr(suppress_events)) {