]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-11057: [mod_conference] CPU race on personal canvas #resolve
authorAnthony Minessale <anthm@freeswitch.org>
Fri, 23 Mar 2018 20:46:24 +0000 (15:46 -0500)
committerMuteesa Fred <muteesafred@hotmail.com>
Tue, 24 Jul 2018 07:21:46 +0000 (07:21 +0000)
src/mod/applications/mod_conference/conference_api.c
src/mod/applications/mod_conference/conference_member.c
src/mod/applications/mod_conference/conference_video.c

index b94e8ee1048b257eab8908f5d1cc6fe5f8d01b71..bd379ea17784c2114fe04e605c093d55d6f72a5a 100644 (file)
@@ -1486,13 +1486,8 @@ switch_status_t conference_api_sub_vid_bandwidth(conference_obj_t *conference, s
        float sdiv = 0;
        int fdiv = 0;
        int force_w = 0, force_h = 0;
-
-                       
-       if (!conference_utils_test_flag(conference, CFLAG_MINIMIZE_VIDEO_ENCODING)) {
-               stream->write_function(stream, "-ERR Bandwidth control not available.\n");
-               return SWITCH_STATUS_SUCCESS;
-       }
-
+       conference_member_t *imember;
+       
        if (!argv[2]) {
                stream->write_function(stream, "-ERR Invalid input\n");
                return SWITCH_STATUS_SUCCESS;
@@ -1553,6 +1548,18 @@ switch_status_t conference_api_sub_vid_bandwidth(conference_obj_t *conference, s
        }
 
        switch_mutex_lock(conference->member_mutex);
+
+       for (imember = conference->members; imember; imember = imember->next) {
+               
+               if (!imember->session || !switch_channel_test_flag(imember->channel, CF_VIDEO_READY)) {
+                       continue;
+               }
+
+               switch_core_media_set_outgoing_bitrate(imember->session, SWITCH_MEDIA_TYPE_VIDEO, video_write_bandwidth);
+               
+               stream->write_function(stream, "+OK Set Bandwidth %d kps for member %s\n", video_write_bandwidth, switch_channel_get_name(imember->channel));
+       }
+
        for (i = 0; i <= conference->canvas_count; i++) {
                if (i > -1 && i != id - 1) {
                        continue;
index 2ee3af83b8eb176167db70fc3cc1b1dec8218fd5..b530a6e3fff246cac505153686f6d8443428763a 100644 (file)
@@ -806,6 +806,8 @@ switch_status_t conference_member_add(conference_obj_t *conference, conference_m
                conference_video_reset_member_codec_index(member);
 
                if (has_video) {
+                       int bitrate = conference->video_codec_settings.video.bandwidth;
+                       
                        if ((var = switch_channel_get_variable_dup(member->channel, "video_mute_png", SWITCH_FALSE, -1))) {
                                member->video_mute_png = switch_core_strdup(member->pool, var);
                                member->video_mute_img = switch_img_read_png(member->video_mute_png, SWITCH_IMG_FMT_I420);
@@ -832,11 +834,17 @@ switch_status_t conference_member_add(conference_obj_t *conference, conference_m
 
                                if (member->max_bw_out < conference->video_codec_settings.video.bandwidth) {
                                        conference_utils_member_set_flag_locked(member, MFLAG_NO_MINIMIZE_ENCODING);
-                                       switch_core_media_set_outgoing_bitrate(member->session, SWITCH_MEDIA_TYPE_VIDEO, member->max_bw_out);
+                                       bitrate = member->max_bw_out;
                                }
                        }
+                       
+                       if (bitrate) {
+                               switch_core_media_set_outgoing_bitrate(member->session, SWITCH_MEDIA_TYPE_VIDEO, bitrate);
+                       }
+               
                }
 
+               
                switch_channel_set_variable_printf(channel, "conference_member_id", "%d", member->id);
                switch_channel_set_variable_printf(channel, "conference_moderator", "%s", conference_utils_member_test_flag(member, MFLAG_MOD) ? "true" : "false");
                switch_channel_set_variable_printf(channel, "conference_ghost", "%s", conference_utils_member_test_flag(member, MFLAG_GHOST) ? "true" : "false");
index 1c94c6350ae71b9cdbafd5b85a0d414640b8983b..4810f4359d9616ceb795f236551245897945dd39 100644 (file)
@@ -2704,15 +2704,11 @@ void conference_video_pop_next_image(conference_member_t *member, switch_image_t
        switch_image_t *img = *imgP;
        int size = 0;
        void *pop;
-       int half;
        //if (member->avatar_png_img && switch_channel_test_flag(member->channel, CF_VIDEO_READY) && conference_utils_member_test_flag(member, MFLAG_ACK_VIDEO)) {
        //      switch_img_free(&member->avatar_png_img);
        //}
 
-       if ((half = switch_queue_size(member->video_queue) / 2) < 1) {
-               half = 1;
-       }
-       
+
        if (switch_channel_test_flag(member->channel, CF_VIDEO_READY)) {
                do {
                        pop = NULL;
@@ -2724,7 +2720,7 @@ void conference_video_pop_next_image(conference_member_t *member, switch_image_t
                                break;
                        }
                        size = switch_queue_size(member->video_queue);
-               } while(size > half);
+               } while(size > 1);
 
                if (conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN) &&
                        member->video_layer_id > -1 &&
@@ -3555,12 +3551,14 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
                        layout_group_t *lg = NULL;
                        video_layout_t *vlayout = NULL;
                        conference_member_t *omember;
-
+                       
                        if (video_key_freq && (now - last_key_time) > video_key_freq) {
                                send_keyframe = SWITCH_TRUE;
                                last_key_time = now;
                        }
 
+                       switch_core_timer_next(&canvas->timer);
+                       
                        switch_mutex_lock(conference->member_mutex);
 
                        for (imember = conference->members; imember; imember = imember->next) {
@@ -3705,8 +3703,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
                                                switch_thread_rwlock_unlock(omember->rwlock);
                                        }
                                }
-
-
+                               
                                for (omember = conference->members; omember; omember = omember->next) {
                                        mcu_layer_t *layer = NULL;
                                        switch_image_t *use_img = NULL;
@@ -3794,8 +3791,8 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
                                                }
 
                                                if (layer && use_img) {
-                                                       switch_img_copy(use_img, &layer->cur_img);
-                                                       conference_video_scale_and_patch(layer, NULL, SWITCH_FALSE);
+                                                       //switch_img_copy(use_img, &layer->cur_img);
+                                                       conference_video_scale_and_patch(layer, use_img, SWITCH_FALSE);
                                                }
                                                
                                        }                                       
@@ -3817,8 +3814,8 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
                                                switch_img_free(&layer->banner_img);
                                                switch_img_free(&layer->logo_img);
                                                layer->member_id = -1;
-                                               switch_img_copy(img, &layer->cur_img);
-                                               conference_video_scale_and_patch(layer, NULL, SWITCH_FALSE);
+                                               //switch_img_copy(img, &layer->cur_img);
+                                               conference_video_scale_and_patch(layer, img, SWITCH_FALSE);
                                        }
                                }