mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 04:11:08 +00:00
Confbridge: Add "sfu" video mode to bridge profile options.
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
This commit is contained in:
@@ -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:
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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 {
|
||||
|
@@ -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.
|
||||
*/
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user