From: Sungtae Kim Date: Sun, 30 Aug 2020 20:42:06 +0000 (+0200) Subject: res_stasis.c: Added video_single option for bridge creation X-Git-Tag: 13.38.0-rc1~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=022284f8af12e742aea98709d578b265064d14d9;p=thirdparty%2Fasterisk.git res_stasis.c: Added video_single option for bridge creation Currently, it was not possible to create bridge with video_mode single. This made hard to put the bridge in a vidoe_single mode. So, added video_single option for Bridge creation using the ARI. This allows create a bridge with video_mode single. ASTERISK-29055 Change-Id: I43e720e5c83fc75fafe10fe22808ae7f055da2ae --- diff --git a/main/bridge.c b/main/bridge.c index 351aaf1354..d3a87efbbd 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -3792,13 +3792,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 61fc6bb78d..6dd252f413 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). */ + /*! Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, 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) to set. */ + /*! Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, 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 4850f6af2f..4db58faee0 100644 --- a/res/res_stasis.c +++ b/res/res_stasis.c @@ -775,6 +775,7 @@ struct ast_bridge *stasis_app_bridge_create(const char *type, const char *name, 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; while ((requested_type = strsep(&requested_types, ","))) { requested_type = ast_strip(requested_type); @@ -787,6 +788,8 @@ struct ast_bridge *stasis_app_bridge_create(const char *type, const char *name, } else if (!strcmp(requested_type, "dtmf_events") || !strcmp(requested_type, "proxy_media")) { capabilities &= ~AST_BRIDGE_CAPABILITY_NATIVE; + } else if (!strcmp(requested_type, "video_single")) { + video_mode = AST_BRIDGE_VIDEO_MODE_SINGLE_SRC; } } @@ -797,7 +800,7 @@ struct ast_bridge *stasis_app_bridge_create(const char *type, const char *name, return NULL; } - bridge = bridge_stasis_new(capabilities, flags, name, id); + bridge = bridge_stasis_new(capabilities, flags, name, id, video_mode); if (bridge) { if (!ao2_link(app_bridges, bridge)) { ast_bridge_destroy(bridge, 0); diff --git a/res/stasis/stasis_bridge.c b/res/stasis/stasis_bridge.c index 1b87b48a45..00dd4b9bea 100644 --- a/res/stasis/stasis_bridge.c +++ b/res/stasis/stasis_bridge.c @@ -299,7 +299,7 @@ static void bridge_stasis_pull(struct ast_bridge *self, struct ast_bridge_channe ast_bridge_base_v_table.pull(self, bridge_channel); } -struct ast_bridge *bridge_stasis_new(uint32_t capabilities, unsigned int flags, const char *name, const char *id) +struct ast_bridge *bridge_stasis_new(uint32_t capabilities, unsigned int flags, const char *name, const char *id, enum ast_bridge_video_mode_type video_mode) { void *bridge; @@ -309,7 +309,12 @@ struct ast_bridge *bridge_stasis_new(uint32_t capabilities, unsigned int flags, return NULL; } - ast_bridge_set_talker_src_video_mode(bridge); + 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); + } + bridge = bridge_register(bridge); return bridge; diff --git a/res/stasis/stasis_bridge.h b/res/stasis/stasis_bridge.h index 2590fd7996..6e2a48bb3b 100644 --- a/res/stasis/stasis_bridge.h +++ b/res/stasis/stasis_bridge.h @@ -50,11 +50,12 @@ extern "C" { * \param flags Flags that will alter the behavior of the bridge * \param name Name given to the bridge by Stasis (optional) * \param id Unique ID given to the bridge by Stasis (optional) + * \param video_mode Video mode of the bridge * * \retval a pointer to a new bridge on success * \retval NULL on failure */ -struct ast_bridge *bridge_stasis_new(uint32_t capabilities, unsigned int flags, const char *name, const char *id); +struct ast_bridge *bridge_stasis_new(uint32_t capabilities, unsigned int flags, const char *name, const char *id, enum ast_bridge_video_mode_type video_mode); /*! * \internal diff --git a/rest-api/api-docs/bridges.json b/rest-api/api-docs/bridges.json index 78bd3afadf..6268c49e63 100644 --- a/rest-api/api-docs/bridges.json +++ b/rest-api/api-docs/bridges.json @@ -26,7 +26,7 @@ "parameters": [ { "name": "type", - "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media).", + "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, video_single).", "paramType": "query", "required": false, "allowMultiple": false, @@ -65,7 +65,7 @@ "parameters": [ { "name": "type", - "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media) to set.", + "description": "Comma separated list of bridge type attributes (mixing, holding, dtmf_events, proxy_media, video_single) to set.", "paramType": "query", "required": false, "allowMultiple": false,