diff options
author | Matt Jordan <mjordan@digium.com> | 2016-11-08 10:11:41 -0600 |
---|---|---|
committer | Matt Jordan <mjordan@digium.com> | 2016-11-14 15:56:45 -0600 |
commit | 62cbcb2e5423cae87e0f84d5e229531b088933b5 (patch) | |
tree | 2707ddf66e052b601f07412ae581b00ee2afd7aa /res/ari/resource_bridges.c | |
parent | cc4a2c8c765cf2ebf94096546e1254bb786cad18 (diff) |
res/ari/resource_bridges: Add the ability to manipulate the video source
In multi-party bridges, Asterisk currently supports two video modes:
* Follow the talker, in which the speaker with the most energy is shown
to all participants but the speaker, and the speaker sees the
previous video source
* Explicitly set video sources, in which all participants see a locked
video source
Prior to this patch, ARI had no ability to manipulate the video source.
This isn't important for two-party bridges, in which Asterisk merely
relays the video between the participants. However, in a multi-party
bridge, it can be advantageous to allow an external application to
manipulate the video source.
This patch provides two new routes to accomplish this:
(1) setVideoSource: POST /bridges/{bridgeId}/videoSource/{channelId}
Sets a video source to an explicit channel
(2) clearVideoSource: DELETE /bridges/{bridgeId}/videoSource
Removes any explicit video source, and sets the video mode to talk
detection
ASTERISK-26595 #close
Change-Id: I98e455d5bffc08ea5e8d6b84ccaf063c714e6621
Diffstat (limited to 'res/ari/resource_bridges.c')
-rw-r--r-- | res/ari/resource_bridges.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/res/ari/resource_bridges.c b/res/ari/resource_bridges.c index 28c3e4360..74fcfdb8f 100644 --- a/res/ari/resource_bridges.c +++ b/res/ari/resource_bridges.c @@ -37,6 +37,7 @@ ASTERISK_REGISTER_FILE() #include "asterisk/stasis.h" #include "asterisk/stasis_bridges.h" #include "asterisk/stasis_app.h" +#include "asterisk/stasis_app_impl.h" #include "asterisk/stasis_app_playback.h" #include "asterisk/stasis_app_recording.h" #include "asterisk/stasis_channels.h" @@ -1005,3 +1006,68 @@ void ast_ari_bridges_create_with_id(struct ast_variable *headers, ast_ari_response_ok(response, ast_bridge_snapshot_to_json(snapshot, stasis_app_get_sanitizer())); } + +static int bridge_set_video_source_cb(struct stasis_app_control *control, + struct ast_channel *chan, void *data) +{ + struct ast_bridge *bridge = data; + + ast_bridge_lock(bridge); + ast_bridge_set_single_src_video_mode(bridge, chan); + ast_bridge_unlock(bridge); + + return 0; +} + +void ast_ari_bridges_set_video_source(struct ast_variable *headers, + struct ast_ari_bridges_set_video_source_args *args, struct ast_ari_response *response) +{ + struct ast_bridge *bridge; + struct stasis_app_control *control; + + bridge = find_bridge(response, args->bridge_id); + if (!bridge) { + return; + } + + control = find_channel_control(response, args->channel_id); + if (!control) { + ao2_ref(bridge, -1); + return; + } + + if (stasis_app_get_bridge(control) != bridge) { + ast_ari_response_error(response, 422, + "Unprocessable Entity", + "Channel not in this bridge"); + ao2_ref(bridge, -1); + ao2_ref(control, -1); + return; + } + + stasis_app_send_command(control, bridge_set_video_source_cb, + ao2_bump(bridge), __ao2_cleanup); + + ao2_ref(bridge, -1); + ao2_ref(control, -1); + + ast_ari_response_no_content(response); +} + +void ast_ari_bridges_clear_video_source(struct ast_variable *headers, + struct ast_ari_bridges_clear_video_source_args *args, struct ast_ari_response *response) +{ + struct ast_bridge *bridge; + + bridge = find_bridge(response, args->bridge_id); + if (!bridge) { + return; + } + + ast_bridge_lock(bridge); + ast_bridge_set_talker_src_video_mode(bridge); + ast_bridge_unlock(bridge); + + ao2_ref(bridge, -1); + ast_ari_response_no_content(response); +} |