From f21408c8669f42849fd10f27b357c84bc8f7eb44 Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Thu, 28 Sep 2017 10:33:00 +0000 Subject: res_stasis: Add 'video_sfu' as a requested bridge type. This change adds 'video_sfu' as a requested bridge type when creating a bridge. By specifying this a mixing type bridge is created that exchanges video in an SFU fashion. Change-Id: I2ada47cf5f3fc176518b647c0b4aa39d55339606 --- res/res_stasis.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'res') diff --git a/res/res_stasis.c b/res/res_stasis.c index 899c8f720..f99dcee37 100644 --- a/res/res_stasis.c +++ b/res/res_stasis.c @@ -766,6 +766,7 @@ static struct ast_bridge *bridge_create_common(const char *type, const char *nam int flags = AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM | AST_BRIDGE_FLAG_MERGE_INHIBIT_TO | AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM | AST_BRIDGE_FLAG_SWAP_INHIBIT_TO | AST_BRIDGE_FLAG_TRANSFER_BRIDGE_ONLY; + enum ast_bridge_video_mode_type video_mode = AST_BRIDGE_VIDEO_MODE_TALKER_SRC; if (invisible) { flags |= AST_BRIDGE_FLAG_INVISIBLE; @@ -782,9 +783,17 @@ static struct ast_bridge *bridge_create_common(const char *type, const char *nam } else if (!strcmp(requested_type, "dtmf_events") || !strcmp(requested_type, "proxy_media")) { capabilities &= ~AST_BRIDGE_CAPABILITY_NATIVE; + } else if (!strcmp(requested_type, "video_sfu")) { + video_mode = AST_BRIDGE_VIDEO_MODE_SFU; } } + /* For an SFU video bridge we ensure it always remains in multimix for the best experience. */ + if (video_mode == AST_BRIDGE_VIDEO_MODE_SFU) { + capabilities = AST_BRIDGE_CAPABILITY_MULTIMIX; + flags &= ~AST_BRIDGE_FLAG_SMART; + } + if (!capabilities /* Holding and mixing capabilities don't mix. */ || ((capabilities & AST_BRIDGE_CAPABILITY_HOLDING) @@ -794,7 +803,15 @@ static struct ast_bridge *bridge_create_common(const char *type, const char *nam bridge = bridge_stasis_new(capabilities, flags, name, id); if (bridge) { - ast_bridge_set_talker_src_video_mode(bridge); + if (video_mode == AST_BRIDGE_VIDEO_MODE_SFU) { + ast_bridge_set_sfu_video_mode(bridge); + /* We require a minimum 5 seconds between video updates to stop floods from clients, + * this should rarely be changed but should become configurable in the future. + */ + ast_bridge_set_video_update_discard(bridge, 5); + } else { + ast_bridge_set_talker_src_video_mode(bridge); + } if (!ao2_link(app_bridges, bridge)) { ast_bridge_destroy(bridge, 0); bridge = NULL; -- cgit v1.2.3