]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-7513 add video-auto-floor-msec param to control how long a member must have the...
authorAnthony Minessale <anthm@freeswitch.org>
Mon, 1 Jun 2015 16:54:43 +0000 (11:54 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Mon, 1 Jun 2015 17:25:13 +0000 (12:25 -0500)
conf/vanilla/autoload_configs/conference.conf.xml
src/mod/applications/mod_conference/mod_conference.c

index ccde59f7f112cdb298f5d6ef135e6fb514bcd840..9dfb75b22de27e9f0dc34f81a5e0a6a5325ca4ec 100644 (file)
       <!-- <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"/> -->
index b4cc3e829d7f5753f204d41606443e821b1f8ce9..73237bc7b81d0fe602716e5d2b5a859c0205ee8b 100644 (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)) {