]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-8595 contd
authorAnthony Minessale <anthm@freeswitch.org>
Thu, 17 Dec 2015 00:20:21 +0000 (18:20 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Thu, 17 Dec 2015 00:20:21 +0000 (18:20 -0600)
src/mod/applications/mod_conference/conference_video.c
src/mod/applications/mod_conference/mod_conference.c
src/mod/applications/mod_conference/mod_conference.h

index f061d5bdaa13c25156fbbdc4ebc1306c73995cb2..d5a3b5e6226bec205eca7986afbcd26f6b7c3623 100644 (file)
@@ -614,6 +614,7 @@ void conference_video_clear_managed_kps(conference_member_t *member)
 {
        member->managed_kps_set = 0;
        member->auto_kps_debounce_ticks = 0;
+       member->layer_loops = 0;
 }
 
 void conference_video_detach_video_layer(conference_member_t *member)
@@ -886,6 +887,7 @@ void conference_video_reset_video_bitrate_counters(conference_member_t *member)
        member->blackouts = 0;
        member->good_img = 0;
        member->blanks = 0;
+       member->layer_loops = 0;
 }
 
 switch_status_t conference_video_attach_video_layer(conference_member_t *member, mcu_canvas_t *canvas, int idx)
@@ -1062,6 +1064,7 @@ void conference_video_init_canvas_layers(conference_obj_t *conference, mcu_canva
                mcu_layer_t *layer = &canvas->layers[i];
                if (layer->member) {
                        //conference_video_detach_video_layer(layer->member);
+                       conference_video_clear_managed_kps(layer->member);
                        layer->member->video_layer_id = -1;
                        layer->member = NULL;
                }
@@ -1890,7 +1893,6 @@ void conference_video_set_incoming_bitrate(conference_member_t *member, int kps,
        
        switch_core_session_receive_message(member->session, &msg);     
 
-       
        member->managed_kps_set = 1;
        member->managed_kps = kps;
 
@@ -1951,17 +1953,21 @@ void conference_video_check_auto_bitrate(conference_member_t *member, mcu_layer_
                return;
        }
 
-       if (member->auto_kps_debounce_ticks) {
-               if (--member->auto_kps_debounce_ticks == 0) {
-                       conference_video_set_incoming_bitrate(member, member->managed_kps, SWITCH_TRUE);
-               }
+       switch_core_media_get_vid_params(member->session, &vid_params);
 
+       if (!switch_channel_test_flag(member->channel, CF_VIDEO_READY) || !vid_params.width || !vid_params.height) {
                return;
        }
-       
-       switch_core_media_get_vid_params(member->session, &vid_params);
 
-       if (!switch_channel_test_flag(member->channel, CF_VIDEO_READY) || !vid_params.width || !vid_params.height) {
+       if (member->layer_loops < 10) {
+               return;
+       }
+
+
+       if (member->auto_kps_debounce_ticks) {
+               if (--member->auto_kps_debounce_ticks == 0) {
+                       conference_video_set_incoming_bitrate(member, member->managed_kps, SWITCH_TRUE);
+               }
                return;
        }
        
@@ -1975,7 +1981,7 @@ void conference_video_check_auto_bitrate(conference_member_t *member, mcu_layer_
                return;
        }
 
-       if ((vid_params.width * vid_params.height) < (layer->screen_w * layer->screen_h)) {
+       if (!layer || (vid_params.width * vid_params.height) < (layer->screen_w * layer->screen_h)) {
                w = vid_params.width;
                h = vid_params.height;
        } else {
@@ -2010,12 +2016,18 @@ void conference_video_check_auto_bitrate(conference_member_t *member, mcu_layer_
        }
 
        if (kps) {
+
+               if (min > max) {
+                       min = max;
+               }
+
                if (max && kps > max) {
                        kps = max;
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s overriding bitrate setting to %dkps because it was the max allowed.\n",
                                                          switch_channel_get_name(member->channel), kps);
                }
 
+
                if (min && kps < min) {
                        kps = min;
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s overriding bitrate setting to %dkps because it was the min allowed.\n",
@@ -2381,6 +2393,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
                                }
                        }
 
+                       imember->layer_loops++;
                        conference_video_check_auto_bitrate(imember, layer);
 
                        if (layer) {
@@ -3404,7 +3417,7 @@ void conference_video_set_floor_holder(conference_obj_t *conference, conference_
 
                        if (conference->last_video_floor_holder && (imember = conference_member_get(conference, conference->last_video_floor_holder))) {
                                switch_core_session_request_video_refresh(imember->session);
-
+                               conference_video_clear_managed_kps(imember);
                                if (conference_utils_member_test_flag(imember, MFLAG_VIDEO_BRIDGE)) {
                                        conference_utils_set_flag(conference, CFLAG_VID_FLOOR_LOCK);
                                }
@@ -3447,6 +3460,7 @@ void conference_video_set_floor_holder(conference_obj_t *conference, conference_
                switch_core_session_video_reinit(member->session);
                conference->video_floor_holder = member->id;
                conference_member_update_status_field(member);
+               conference_video_clear_managed_kps(member);
        } else {
                conference->video_floor_holder = 0;
        }
index c012f6d734e253e9ec80205d4941c77b9bdd75c4..b62061967be9b1c53c72a071d659f142aa8528a1 100644 (file)
@@ -2380,7 +2380,7 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co
        char *no_video_avatar = NULL;
        conference_video_mode_t conference_video_mode = CONF_VIDEO_MODE_PASSTHROUGH;
        int conference_video_quality = 1;
-       int auto_kps_debounce = 5000;
+       int auto_kps_debounce = 30000;
        float fps = 15.0f;
        uint32_t max_members = 0;
        uint32_t announce_count = 0;
index 0ccd2cd38b31737b681cce9b6e74812f27c5c447..0554bfd53c42452c79a810b535c9ada6306cfb99 100644 (file)
@@ -751,6 +751,7 @@ struct conference_member {
        char *video_reservation_id;
        switch_vid_params_t vid_params;
        uint32_t auto_kps_debounce_ticks;
+       uint32_t layer_loops;
        switch_frame_buffer_t *fb;
        switch_image_t *avatar_png_img;
        switch_image_t *video_mute_img;