res_stasis: Add 'video_sfu' as a requested bridge type.
authorJoshua Colp <jcolp@digium.com>
Thu, 28 Sep 2017 10:33:00 +0000 (10:33 +0000)
committerJoshua Colp <jcolp@digium.com>
Thu, 28 Sep 2017 10:34:15 +0000 (05:34 -0500)
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
rest-api/api-docs/bridges.json

index 899c8f7..f99dcee 100644 (file)
@@ -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;
index 03a1e7a..877fdf8 100644 (file)
@@ -26,7 +26,7 @@
                                        "parameters": [
                                                {
                                                        "name": "type",
-                                                       "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media).",
+                                                       "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, video_sfu).",
                                                        "paramType": "query",
                                                        "required": false,
                                                        "allowMultiple": false,
@@ -65,7 +65,7 @@
                                        "parameters": [
                                                {
                                                        "name": "type",
-                                                       "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media) to set.",
+                                                       "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, video_sfu) to set.",
                                                        "paramType": "query",
                                                        "required": false,
                                                        "allowMultiple": false,