]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Confbridge: Add "sfu" video mode to bridge profile options.
authorMark Michelson <mmichelson@digium.com>
Wed, 24 May 2017 15:09:22 +0000 (10:09 -0500)
committerMark Michelson <mmichelson@digium.com>
Tue, 30 May 2017 15:24:20 +0000 (10:24 -0500)
A previous commit added plumbing to bridge_softmix to allow for an SFU
experience with Asterisk. This commit adds an option to app_confbridge
that allows for a confbridge to actually make use of the SFU video mode.

SFU mode is implemented in a "set it and forget it" kind of way. That
is, when the bridge is created, if SFU mode is enabled, then the video
mode gets set to SFU and cannot be changed. Future improvements may
allow for a hybrid experience (e.g. forward multiple video streams,
specifically those of the most recent talkers), but for this addition,
no such capability is present.

Change-Id: I87bbcb63dec6dbbb42488f894871b86f112b2020

apps/app_confbridge.c
apps/confbridge/conf_config_parser.c
apps/confbridge/include/confbridge.h
include/asterisk/bridge.h
main/bridge.c

index a9f917b9a974bfc73b80007837f08dd2d752158e..1baf257a48f058f035283ba4928b9b99f453e567 100644 (file)
@@ -1483,6 +1483,8 @@ static struct confbridge_conference *join_conference_bridge(const char *conferen
 
                if (ast_test_flag(&conference->b_profile, BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER)) {
                        ast_bridge_set_talker_src_video_mode(conference->bridge);
+               } else if (ast_test_flag(&conference->b_profile, BRIDGE_OPT_VIDEO_SRC_SFU)) {
+                       ast_bridge_set_sfu_video_mode(conference->bridge);
                }
 
                /* Link it into the conference bridges container */
@@ -2770,7 +2772,9 @@ static int execute_menu_entry(struct confbridge_conference *conference,
                        break;
                case MENU_ACTION_SET_SINGLE_VIDEO_SRC:
                        ao2_lock(conference);
-                       ast_bridge_set_single_src_video_mode(conference->bridge, bridge_channel->chan);
+                       if (!ast_test_flag(&conference->b_profile, BRIDGE_OPT_VIDEO_SRC_SFU)) {
+                               ast_bridge_set_single_src_video_mode(conference->bridge, bridge_channel->chan);
+                       }
                        ao2_unlock(conference);
                        break;
                case MENU_ACTION_RELEASE_SINGLE_VIDEO_SRC:
index 3e4075ba94d92cd0583311100e6d300af96394de..cc8fcfe5df4150c4ea1d9da6b10aa4f144577ca9 100644 (file)
@@ -1952,25 +1952,36 @@ static int video_mode_handler(const struct aco_option *opt, struct ast_variable
                ast_set_flags_to(b_profile,
                        BRIDGE_OPT_VIDEO_SRC_FIRST_MARKED
                                | BRIDGE_OPT_VIDEO_SRC_LAST_MARKED
-                               | BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER,
+                               | BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER
+                               | BRIDGE_OPT_VIDEO_SRC_SFU,
                        BRIDGE_OPT_VIDEO_SRC_FIRST_MARKED);
        } else if (!strcasecmp(var->value, "last_marked")) {
                ast_set_flags_to(b_profile,
                        BRIDGE_OPT_VIDEO_SRC_FIRST_MARKED
                                | BRIDGE_OPT_VIDEO_SRC_LAST_MARKED
-                               | BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER,
+                               | BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER
+                               | BRIDGE_OPT_VIDEO_SRC_SFU,
                        BRIDGE_OPT_VIDEO_SRC_LAST_MARKED);
        } else if (!strcasecmp(var->value, "follow_talker")) {
                ast_set_flags_to(b_profile,
                        BRIDGE_OPT_VIDEO_SRC_FIRST_MARKED
                                | BRIDGE_OPT_VIDEO_SRC_LAST_MARKED
-                               | BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER,
+                               | BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER
+                               | BRIDGE_OPT_VIDEO_SRC_SFU,
                        BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER);
        } else if (!strcasecmp(var->value, "none")) {
                ast_clear_flag(b_profile,
                        BRIDGE_OPT_VIDEO_SRC_FIRST_MARKED
                                | BRIDGE_OPT_VIDEO_SRC_LAST_MARKED
-                               | BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER);
+                               | BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER
+                               | BRIDGE_OPT_VIDEO_SRC_SFU);
+       } else if (!strcasecmp(var->value, "sfu")) {
+               ast_set_flags_to(b_profile,
+                       BRIDGE_OPT_VIDEO_SRC_FIRST_MARKED
+                               | BRIDGE_OPT_VIDEO_SRC_LAST_MARKED
+                               | BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER
+                               | BRIDGE_OPT_VIDEO_SRC_SFU,
+                       BRIDGE_OPT_VIDEO_SRC_SFU);
        } else {
                return -1;
        }
index 584499ff391faa840b414f41797d19cbf4318079..cf30d5c62700a160adfd1fa1880966d4e3745769 100644 (file)
@@ -72,6 +72,7 @@ enum bridge_profile_flags {
        BRIDGE_OPT_RECORD_FILE_APPEND = (1 << 4), /*!< Set if the record file should be appended to between start/stops.  */
        BRIDGE_OPT_RECORD_FILE_TIMESTAMP = (1 << 5), /*< Set if the record file should have a timestamp appended */
        BRIDGE_OPT_BINAURAL_ACTIVE = (1 << 6), /*< Set if binaural convolution is activated */
+       BRIDGE_OPT_VIDEO_SRC_SFU = (1 << 7), /*< Selective forwarding unit */
 };
 
 enum conf_menu_action_id {
index 6915af28b4a445c4c241cb90e8ed09ae65a040ab..bc0e9c81e08cdbfa2fd9b2d62e192ce518baa782 100644 (file)
@@ -897,6 +897,11 @@ void ast_bridge_set_single_src_video_mode(struct ast_bridge *bridge, struct ast_
  */
 void ast_bridge_set_talker_src_video_mode(struct ast_bridge *bridge);
 
+/*!
+ * \brief Set the bridge to be a selective forwarding unit
+ */
+void ast_bridge_set_sfu_video_mode(struct ast_bridge *bridge);
+
 /*!
  * \brief Update information about talker energy for talker src video mode.
  */
index 7d6bdfaa07b07d6311087022aad692c84dcea3c3..4631e5a5276274daa2dd77a344b863a05b7cf0d7 100644 (file)
@@ -3807,6 +3807,14 @@ void ast_bridge_set_talker_src_video_mode(struct ast_bridge *bridge)
        ast_bridge_unlock(bridge);
 }
 
+void ast_bridge_set_sfu_video_mode(struct ast_bridge *bridge)
+{
+       ast_bridge_lock(bridge);
+       cleanup_video_mode(bridge);
+       bridge->softmix.video_mode.mode = AST_BRIDGE_VIDEO_MODE_SFU;
+       ast_bridge_unlock(bridge);
+}
+
 void ast_bridge_update_talker_src_video_mode(struct ast_bridge *bridge, struct ast_channel *chan, int talker_energy, int is_keyframe)
 {
        struct ast_bridge_video_talker_src_data *data;