@ -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 ;