summaryrefslogtreecommitdiff
path: root/res/ari/resource_bridges.c
diff options
context:
space:
mode:
authorMatt Jordan <mjordan@digium.com>2016-11-08 10:11:41 -0600
committerMatt Jordan <mjordan@digium.com>2016-11-14 15:56:45 -0600
commit62cbcb2e5423cae87e0f84d5e229531b088933b5 (patch)
tree2707ddf66e052b601f07412ae581b00ee2afd7aa /res/ari/resource_bridges.c
parentcc4a2c8c765cf2ebf94096546e1254bb786cad18 (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.c66
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);
+}