From d3aee10e286b8e75cef16feaf81aee0f89010f7f Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 23 Mar 2018 15:46:24 -0500 Subject: [PATCH] FS-11057: [mod_conference] CPU race on personal canvas #resolve --- .../mod_conference/conference_api.c | 21 +++++++++++------ .../mod_conference/conference_member.c | 10 +++++++- .../mod_conference/conference_video.c | 23 ++++++++----------- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/mod/applications/mod_conference/conference_api.c b/src/mod/applications/mod_conference/conference_api.c index b94e8ee104..bd379ea177 100644 --- a/src/mod/applications/mod_conference/conference_api.c +++ b/src/mod/applications/mod_conference/conference_api.c @@ -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; diff --git a/src/mod/applications/mod_conference/conference_member.c b/src/mod/applications/mod_conference/conference_member.c index 2ee3af83b8..b530a6e3ff 100644 --- a/src/mod/applications/mod_conference/conference_member.c +++ b/src/mod/applications/mod_conference/conference_member.c @@ -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"); diff --git a/src/mod/applications/mod_conference/conference_video.c b/src/mod/applications/mod_conference/conference_video.c index 1c94c6350a..4810f4359d 100644 --- a/src/mod/applications/mod_conference/conference_video.c +++ b/src/mod/applications/mod_conference/conference_video.c @@ -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); } }