FS-8595 contd
This commit is contained in:
parent
7507636d48
commit
56a4557237
|
@ -610,6 +610,12 @@ void conference_video_release_canvas(mcu_canvas_t **canvasP)
|
||||||
*canvasP = NULL;
|
*canvasP = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void conference_video_clear_managed_kps(conference_member_t *member)
|
||||||
|
{
|
||||||
|
member->managed_kps_set = 0;
|
||||||
|
member->auto_kps_debounce_ticks = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void conference_video_detach_video_layer(conference_member_t *member)
|
void conference_video_detach_video_layer(conference_member_t *member)
|
||||||
{
|
{
|
||||||
mcu_layer_t *layer = NULL;
|
mcu_layer_t *layer = NULL;
|
||||||
|
@ -649,7 +655,7 @@ void conference_video_detach_video_layer(conference_member_t *member)
|
||||||
member->avatar_patched = 0;
|
member->avatar_patched = 0;
|
||||||
conference_video_check_used_layers(canvas);
|
conference_video_check_used_layers(canvas);
|
||||||
canvas->send_keyframe = 1;
|
canvas->send_keyframe = 1;
|
||||||
member->managed_kps = 0;
|
conference_video_clear_managed_kps(member);
|
||||||
|
|
||||||
if (conference_utils_test_flag(member->conference, CFLAG_JSON_STATUS)) {
|
if (conference_utils_test_flag(member->conference, CFLAG_JSON_STATUS)) {
|
||||||
conference_member_update_status_field(member);
|
conference_member_update_status_field(member);
|
||||||
|
@ -977,7 +983,7 @@ switch_status_t conference_video_attach_video_layer(conference_member_t *member,
|
||||||
|
|
||||||
switch_img_fill(canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &canvas->letterbox_bgcolor);
|
switch_img_fill(canvas->img, layer->x_pos, layer->y_pos, layer->screen_w, layer->screen_h, &canvas->letterbox_bgcolor);
|
||||||
conference_video_reset_video_bitrate_counters(member);
|
conference_video_reset_video_bitrate_counters(member);
|
||||||
member->managed_kps = 0;
|
conference_video_clear_managed_kps(member);
|
||||||
|
|
||||||
if (conference_utils_test_flag(member->conference, CFLAG_JSON_STATUS)) {
|
if (conference_utils_test_flag(member->conference, CFLAG_JSON_STATUS)) {
|
||||||
conference_member_update_status_field(member);
|
conference_member_update_status_field(member);
|
||||||
|
@ -1838,7 +1844,7 @@ void conference_video_pop_next_image(conference_member_t *member, switch_image_t
|
||||||
if (member->blanks == member->conference->video_fps.fps * 5) {
|
if (member->blanks == member->conference->video_fps.fps * 5) {
|
||||||
member->blackouts++;
|
member->blackouts++;
|
||||||
conference_video_check_avatar(member, SWITCH_TRUE);
|
conference_video_check_avatar(member, SWITCH_TRUE);
|
||||||
member->managed_kps = 0;
|
conference_video_clear_managed_kps(member);
|
||||||
|
|
||||||
if (member->avatar_png_img) {
|
if (member->avatar_png_img) {
|
||||||
//if (layer) {
|
//if (layer) {
|
||||||
|
@ -1857,31 +1863,52 @@ void conference_video_pop_next_image(conference_member_t *member, switch_image_t
|
||||||
*imgP = img;
|
*imgP = img;
|
||||||
}
|
}
|
||||||
|
|
||||||
void conference_video_set_incoming_bitrate(conference_member_t *member, int kps)
|
void conference_video_set_incoming_bitrate(conference_member_t *member, int kps, switch_bool_t force)
|
||||||
{
|
{
|
||||||
switch_core_session_message_t msg = { 0 };
|
switch_core_session_message_t msg = { 0 };
|
||||||
|
|
||||||
|
if (switch_channel_test_flag(member->channel, CF_VIDEO_BITRATE_UNMANAGABLE)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kps >= member->managed_kps) {
|
||||||
|
member->auto_kps_debounce_ticks = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!force && kps < member->managed_kps && member->conference->auto_kps_debounce) {
|
||||||
|
member->auto_kps_debounce_ticks = member->conference->auto_kps_debounce / member->conference->video_fps.ms;
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s setting bitrate debounce timer to %dms\n",
|
||||||
|
switch_channel_get_name(member->channel), member->conference->auto_kps_debounce);
|
||||||
|
member->managed_kps = kps;
|
||||||
|
member->managed_kps_set = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
msg.message_id = SWITCH_MESSAGE_INDICATE_BITRATE_REQ;
|
msg.message_id = SWITCH_MESSAGE_INDICATE_BITRATE_REQ;
|
||||||
msg.numeric_arg = kps * 1024;
|
msg.numeric_arg = kps * 1024;
|
||||||
msg.from = __FILE__;
|
msg.from = __FILE__;
|
||||||
|
|
||||||
switch_core_session_receive_message(member->session, &msg);
|
switch_core_session_receive_message(member->session, &msg);
|
||||||
|
|
||||||
|
|
||||||
|
member->managed_kps_set = 1;
|
||||||
member->managed_kps = kps;
|
member->managed_kps = kps;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void conference_video_set_max_incoming_bitrate_member(conference_member_t *member, int kps)
|
void conference_video_set_max_incoming_bitrate_member(conference_member_t *member, int kps)
|
||||||
{
|
{
|
||||||
member->max_bw_in = kps;
|
member->max_bw_in = kps;
|
||||||
member->managed_kps = 0;
|
conference_video_clear_managed_kps(member);
|
||||||
}
|
}
|
||||||
|
|
||||||
void conference_video_set_absolute_incoming_bitrate_member(conference_member_t *member, int kps)
|
void conference_video_set_absolute_incoming_bitrate_member(conference_member_t *member, int kps)
|
||||||
{
|
{
|
||||||
member->max_bw_in = 0;
|
member->max_bw_in = 0;
|
||||||
member->force_bw_in = kps;
|
member->force_bw_in = kps;
|
||||||
member->managed_kps = 0;
|
conference_video_clear_managed_kps(member);
|
||||||
if (!conference_utils_test_flag(member->conference, CFLAG_MANAGE_INBOUND_VIDEO_BITRATE) && switch_channel_test_flag(member->channel, CF_VIDEO_READY)) {
|
if (!conference_utils_test_flag(member->conference, CFLAG_MANAGE_INBOUND_VIDEO_BITRATE) && switch_channel_test_flag(member->channel, CF_VIDEO_READY)) {
|
||||||
conference_video_set_incoming_bitrate(member, kps);
|
conference_video_set_incoming_bitrate(member, kps, SWITCH_TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1914,6 +1941,23 @@ void conference_video_set_absolute_incoming_bitrate(conference_obj_t *conference
|
||||||
void conference_video_check_auto_bitrate(conference_member_t *member, mcu_layer_t *layer)
|
void conference_video_check_auto_bitrate(conference_member_t *member, mcu_layer_t *layer)
|
||||||
{
|
{
|
||||||
switch_vid_params_t vid_params = { 0 };
|
switch_vid_params_t vid_params = { 0 };
|
||||||
|
int kps = 0;
|
||||||
|
int max = 0;
|
||||||
|
int min = 0;
|
||||||
|
int w, h;
|
||||||
|
|
||||||
|
if (!conference_utils_test_flag(member->conference, CFLAG_MANAGE_INBOUND_VIDEO_BITRATE) ||
|
||||||
|
switch_channel_test_flag(member->channel, CF_VIDEO_BITRATE_UNMANAGABLE)) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
switch_core_media_get_vid_params(member->session, &vid_params);
|
switch_core_media_get_vid_params(member->session, &vid_params);
|
||||||
|
|
||||||
|
@ -1922,59 +1966,63 @@ void conference_video_check_auto_bitrate(conference_member_t *member, mcu_layer_
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vid_params.width != member->vid_params.width || vid_params.height != member->vid_params.height) {
|
if (vid_params.width != member->vid_params.width || vid_params.height != member->vid_params.height) {
|
||||||
member->managed_kps = 0;
|
conference_video_clear_managed_kps(member);
|
||||||
}
|
}
|
||||||
|
|
||||||
member->vid_params = vid_params;
|
member->vid_params = vid_params;
|
||||||
|
|
||||||
if (switch_channel_test_flag(member->channel, CF_VIDEO_BITRATE_UNMANAGABLE)) {
|
if (member->managed_kps_set) {
|
||||||
member->managed_kps = 0;
|
return;
|
||||||
} else if (conference_utils_test_flag(member->conference, CFLAG_MANAGE_INBOUND_VIDEO_BITRATE) && !member->managed_kps) {
|
}
|
||||||
int kps = 0;
|
|
||||||
int max = 0;
|
|
||||||
int min = 0;
|
|
||||||
|
|
||||||
kps = switch_calc_bitrate(layer->screen_w, layer->screen_h, member->conference->video_quality, (int)(member->conference->video_fps.fps));
|
if ((vid_params.width * vid_params.height) < (layer->screen_w * layer->screen_h)) {
|
||||||
min = switch_calc_bitrate(vid_params.width, vid_params.height, member->conference->video_quality, (int)(member->conference->video_fps.fps)) / 4;
|
w = vid_params.width;
|
||||||
|
h = vid_params.height;
|
||||||
|
} else {
|
||||||
|
w = layer->screen_w;
|
||||||
|
h = layer->screen_h;
|
||||||
|
}
|
||||||
|
|
||||||
|
kps = switch_calc_bitrate(w, h, member->conference->video_quality, (int)(member->conference->video_fps.fps));
|
||||||
|
min = switch_calc_bitrate(vid_params.width, vid_params.height, member->conference->video_quality, (int)(member->conference->video_fps.fps)) / 2;
|
||||||
|
|
||||||
if (member->conference->max_bw_in) {
|
if (member->conference->max_bw_in) {
|
||||||
max = member->conference->max_bw_in;
|
max = member->conference->max_bw_in;
|
||||||
} else {
|
} else {
|
||||||
max = member->max_bw_in;
|
max = member->max_bw_in;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (member->conference->force_bw_in || member->force_bw_in) {
|
if (member->conference->force_bw_in || member->force_bw_in) {
|
||||||
if (!(kps = member->conference->force_bw_in)) {
|
if (!(kps = member->conference->force_bw_in)) {
|
||||||
kps = member->force_bw_in;
|
kps = member->force_bw_in;
|
||||||
}
|
}
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s setting bitrate to %dkps because it was forced.\n",
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s setting bitrate to %dkps because it was forced.\n",
|
||||||
|
switch_channel_get_name(member->channel), kps);
|
||||||
|
} else {
|
||||||
|
if (layer && conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN)) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps to accomodate %dx%d resolution\n",
|
||||||
|
switch_channel_get_name(member->channel), kps, layer->screen_w, layer->screen_h);
|
||||||
|
} else {
|
||||||
|
kps = min;
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps because the user is not visible\n",
|
||||||
|
switch_channel_get_name(member->channel), kps);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kps) {
|
||||||
|
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);
|
switch_channel_get_name(member->channel), kps);
|
||||||
} else {
|
|
||||||
if (layer && conference_utils_member_test_flag(member, MFLAG_CAN_BE_SEEN)) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps to accomodate %dx%d resolution\n",
|
|
||||||
switch_channel_get_name(member->channel), kps, layer->screen_w, layer->screen_h);
|
|
||||||
} else {
|
|
||||||
kps = min;
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps because the user is not visible\n",
|
|
||||||
switch_channel_get_name(member->channel), kps);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kps) {
|
if (min && kps < min) {
|
||||||
if (max && kps > max) {
|
kps = min;
|
||||||
kps = max;
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s overriding bitrate setting to %dkps because it was the min allowed.\n",
|
||||||
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);
|
||||||
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",
|
|
||||||
switch_channel_get_name(member->channel), kps);
|
|
||||||
}
|
|
||||||
|
|
||||||
conference_video_set_incoming_bitrate(member, kps);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
conference_video_set_incoming_bitrate(member, kps, SWITCH_FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2483,7 +2531,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
|
||||||
conference_utils_test_flag(conference, CFLAG_MANAGE_INBOUND_VIDEO_BITRATE)) {
|
conference_utils_test_flag(conference, CFLAG_MANAGE_INBOUND_VIDEO_BITRATE)) {
|
||||||
switch_core_media_get_vid_params(imember->session, &vid_params);
|
switch_core_media_get_vid_params(imember->session, &vid_params);
|
||||||
kps = switch_calc_bitrate(vid_params.width, vid_params.height, conference->video_quality, (int)(imember->conference->video_fps.fps));
|
kps = switch_calc_bitrate(vid_params.width, vid_params.height, conference->video_quality, (int)(imember->conference->video_fps.fps));
|
||||||
conference_video_set_incoming_bitrate(imember, kps);
|
conference_video_set_incoming_bitrate(imember, kps, SWITCH_TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2380,6 +2380,7 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co
|
||||||
char *no_video_avatar = NULL;
|
char *no_video_avatar = NULL;
|
||||||
conference_video_mode_t conference_video_mode = CONF_VIDEO_MODE_PASSTHROUGH;
|
conference_video_mode_t conference_video_mode = CONF_VIDEO_MODE_PASSTHROUGH;
|
||||||
int conference_video_quality = 1;
|
int conference_video_quality = 1;
|
||||||
|
int auto_kps_debounce = 5000;
|
||||||
float fps = 15.0f;
|
float fps = 15.0f;
|
||||||
uint32_t max_members = 0;
|
uint32_t max_members = 0;
|
||||||
uint32_t announce_count = 0;
|
uint32_t announce_count = 0;
|
||||||
|
@ -2700,6 +2701,14 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co
|
||||||
} else {
|
} else {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Video quality must be between 0 and 4\n");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Video quality must be between 0 and 4\n");
|
||||||
}
|
}
|
||||||
|
} else if (!strcasecmp(var, "video-kps-debounce") && !zstr(val)) {
|
||||||
|
int tmp = atoi(val);
|
||||||
|
|
||||||
|
if (tmp >= 0) {
|
||||||
|
auto_kps_debounce = tmp;
|
||||||
|
} else {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "video-kps-debounce must be 0 or higher\n");
|
||||||
|
}
|
||||||
|
|
||||||
} else if (!strcasecmp(var, "video-mode") && !zstr(val)) {
|
} else if (!strcasecmp(var, "video-mode") && !zstr(val)) {
|
||||||
if (!strcasecmp(val, "passthrough")) {
|
if (!strcasecmp(val, "passthrough")) {
|
||||||
|
@ -2770,7 +2779,8 @@ conference_obj_t *conference_new(char *name, conference_xml_cfg_t cfg, switch_co
|
||||||
conference->moderator_controls = switch_core_strdup(conference->pool, moderator_controls);
|
conference->moderator_controls = switch_core_strdup(conference->pool, moderator_controls);
|
||||||
conference->broadcast_chat_messages = broadcast_chat_messages;
|
conference->broadcast_chat_messages = broadcast_chat_messages;
|
||||||
conference->video_quality = conference_video_quality;
|
conference->video_quality = conference_video_quality;
|
||||||
|
conference->auto_kps_debounce = auto_kps_debounce;
|
||||||
|
|
||||||
conference->conference_video_mode = conference_video_mode;
|
conference->conference_video_mode = conference_video_mode;
|
||||||
|
|
||||||
if (!switch_core_has_video() && (conference->conference_video_mode == CONF_VIDEO_MODE_MUX || conference->conference_video_mode == CONF_VIDEO_MODE_TRANSCODE)) {
|
if (!switch_core_has_video() && (conference->conference_video_mode == CONF_VIDEO_MODE_MUX || conference->conference_video_mode == CONF_VIDEO_MODE_TRANSCODE)) {
|
||||||
|
|
|
@ -564,6 +564,7 @@ typedef struct conference_obj {
|
||||||
int video_quality;
|
int video_quality;
|
||||||
int members_with_video;
|
int members_with_video;
|
||||||
int members_with_avatar;
|
int members_with_avatar;
|
||||||
|
uint32_t auto_kps_debounce;
|
||||||
switch_codec_settings_t video_codec_settings;
|
switch_codec_settings_t video_codec_settings;
|
||||||
uint32_t canvas_width;
|
uint32_t canvas_width;
|
||||||
uint32_t canvas_height;
|
uint32_t canvas_height;
|
||||||
|
@ -749,12 +750,14 @@ struct conference_member {
|
||||||
char *video_mute_png;
|
char *video_mute_png;
|
||||||
char *video_reservation_id;
|
char *video_reservation_id;
|
||||||
switch_vid_params_t vid_params;
|
switch_vid_params_t vid_params;
|
||||||
|
uint32_t auto_kps_debounce_ticks;
|
||||||
switch_frame_buffer_t *fb;
|
switch_frame_buffer_t *fb;
|
||||||
switch_image_t *avatar_png_img;
|
switch_image_t *avatar_png_img;
|
||||||
switch_image_t *video_mute_img;
|
switch_image_t *video_mute_img;
|
||||||
uint32_t floor_packets;
|
uint32_t floor_packets;
|
||||||
int blanks;
|
int blanks;
|
||||||
int managed_kps;
|
int managed_kps;
|
||||||
|
int managed_kps_set;
|
||||||
int blackouts;
|
int blackouts;
|
||||||
int good_img;
|
int good_img;
|
||||||
int auto_avatar;
|
int auto_avatar;
|
||||||
|
|
Loading…
Reference in New Issue