diff --git a/main/bridge.c b/main/bridge.c index ea15d1b7a3..d44f6596e2 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -3818,13 +3818,15 @@ void ast_bridge_set_single_src_video_mode(struct ast_bridge *bridge, struct ast_ ast_bridge_lock(bridge); cleanup_video_mode(bridge); bridge->softmix.video_mode.mode = AST_BRIDGE_VIDEO_MODE_SINGLE_SRC; - bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc = ast_channel_ref(video_src_chan); - ast_verb(5, "Video source in bridge '%s' (%s) is now '%s' (%s)\n", - bridge->name, bridge->uniqueid, - ast_channel_name(video_src_chan), - ast_channel_uniqueid(video_src_chan)); + if (video_src_chan) { + bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc = ast_channel_ref(video_src_chan); + ast_verb(5, "Video source in bridge '%s' (%s) is now '%s' (%s)\n", + bridge->name, bridge->uniqueid, + ast_channel_name(video_src_chan), + ast_channel_uniqueid(video_src_chan)); + ast_indicate(video_src_chan, AST_CONTROL_VIDUPDATE); + } ast_bridge_publish_state(bridge); - ast_indicate(video_src_chan, AST_CONTROL_VIDUPDATE); ast_bridge_unlock(bridge); } diff --git a/res/ari/resource_bridges.h b/res/ari/resource_bridges.h index 83a353227c..95f43d0b39 100644 --- a/res/ari/resource_bridges.h +++ b/res/ari/resource_bridges.h @@ -52,7 +52,7 @@ struct ast_ari_bridges_list_args { void ast_ari_bridges_list(struct ast_variable *headers, struct ast_ari_bridges_list_args *args, struct ast_ari_response *response); /*! Argument struct for ast_ari_bridges_create() */ struct ast_ari_bridges_create_args { - /*! Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, video_sfu). */ + /*! Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, video_sfu, video_single). */ const char *type; /*! Unique ID to give to the bridge being created. */ const char *bridge_id; @@ -82,7 +82,7 @@ int ast_ari_bridges_create_parse_body( void ast_ari_bridges_create(struct ast_variable *headers, struct ast_ari_bridges_create_args *args, struct ast_ari_response *response); /*! Argument struct for ast_ari_bridges_create_with_id() */ struct ast_ari_bridges_create_with_id_args { - /*! Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, video_sfu) to set. */ + /*! Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, video_sfu, video_single) to set. */ const char *type; /*! Unique ID to give to the bridge being created. */ const char *bridge_id; diff --git a/res/res_stasis.c b/res/res_stasis.c index f975386a18..7d05e8b2eb 100644 --- a/res/res_stasis.c +++ b/res/res_stasis.c @@ -792,6 +792,8 @@ static struct ast_bridge *bridge_create_common(const char *type, const char *nam capabilities &= ~AST_BRIDGE_CAPABILITY_NATIVE; } else if (!strcmp(requested_type, "video_sfu")) { video_mode = AST_BRIDGE_VIDEO_MODE_SFU; + } else if (!strcmp(requested_type, "video_single")) { + video_mode = AST_BRIDGE_VIDEO_MODE_SINGLE_SRC; } } diff --git a/res/stasis/stasis_bridge.c b/res/stasis/stasis_bridge.c index d5f70a0ad6..fdfd8fb92b 100644 --- a/res/stasis/stasis_bridge.c +++ b/res/stasis/stasis_bridge.c @@ -313,6 +313,8 @@ struct ast_bridge *bridge_stasis_new(uint32_t capabilities, unsigned int flags, * this should rarely be changed but should become configurable in the future. */ ast_bridge_set_video_update_discard(bridge, 5); + } else if (video_mode == AST_BRIDGE_VIDEO_MODE_SINGLE_SRC) { + ast_bridge_set_single_src_video_mode(bridge, NULL); } else { ast_bridge_set_talker_src_video_mode(bridge); } diff --git a/rest-api/api-docs/bridges.json b/rest-api/api-docs/bridges.json index a46513791f..bf0a0016ec 100644 --- a/rest-api/api-docs/bridges.json +++ b/rest-api/api-docs/bridges.json @@ -30,7 +30,7 @@ "parameters": [ { "name": "type", - "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, video_sfu).", + "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, video_sfu, video_single).", "paramType": "query", "required": false, "allowMultiple": false, @@ -69,7 +69,7 @@ "parameters": [ { "name": "type", - "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, video_sfu) to set.", + "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, video_sfu, video_single) to set.", "paramType": "query", "required": false, "allowMultiple": false, @@ -755,7 +755,7 @@ }, "video_mode": { "type": "string", - "description": "The video mode the bridge is using. One of 'none', 'talker', or 'single'.", + "description": "The video mode the bridge is using. One of 'none', 'talker', 'sfu', or 'single'.", "required": false }, "video_source_id": {