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 */
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:
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;
}
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;