diff options
-rw-r--r-- | apps/app_confbridge.c | 6 | ||||
-rw-r--r-- | apps/confbridge/conf_config_parser.c | 19 | ||||
-rw-r--r-- | apps/confbridge/include/confbridge.h | 1 | ||||
-rw-r--r-- | include/asterisk/bridge.h | 5 | ||||
-rw-r--r-- | main/bridge.c | 8 |
5 files changed, 34 insertions, 5 deletions
diff --git a/apps/app_confbridge.c b/apps/app_confbridge.c index a9f917b9a..1baf257a4 100644 --- a/apps/app_confbridge.c +++ b/apps/app_confbridge.c @@ -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: diff --git a/apps/confbridge/conf_config_parser.c b/apps/confbridge/conf_config_parser.c index 3e4075ba9..cc8fcfe5d 100644 --- a/apps/confbridge/conf_config_parser.c +++ b/apps/confbridge/conf_config_parser.c @@ -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; } diff --git a/apps/confbridge/include/confbridge.h b/apps/confbridge/include/confbridge.h index 584499ff3..cf30d5c62 100644 --- a/apps/confbridge/include/confbridge.h +++ b/apps/confbridge/include/confbridge.h @@ -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 { diff --git a/include/asterisk/bridge.h b/include/asterisk/bridge.h index 6915af28b..bc0e9c81e 100644 --- a/include/asterisk/bridge.h +++ b/include/asterisk/bridge.h @@ -898,6 +898,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. */ void ast_bridge_update_talker_src_video_mode(struct ast_bridge *bridge, struct ast_channel *chan, int talker_energy, int is_keyfame); diff --git a/main/bridge.c b/main/bridge.c index 7d6bdfaa0..4631e5a52 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -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; |