summaryrefslogtreecommitdiff
path: root/bridges
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2017-07-17 12:19:59 +0000
committerJoshua Colp <jcolp@digium.com>2017-07-17 14:42:10 +0000
commitbcd3f65174ace4993c2f76095166b7a2110916a9 (patch)
tree2e0ae955faea1d31bdf0f24f4a7dad2348847104 /bridges
parent3fd1d520f73a279b78e3bcfadc3ab7f829ff44c0 (diff)
bridge_softmix: Don't reorder streams on participant leaving.
When a participant leaves a bridge while operating in SFU mode their respective stream on every other participant needs to be removed. Leaving the stream out of the new topology results in every stream after it being moved and reordered. This causes problems with clients. Instead simply mark the stream as removed which leaves it in place in the SDP and doesn't reorder or touch any other streams. ASTERISK-27136 Change-Id: I4b3f840adcdf69b83842b0d8a737665ba0ef9cb1
Diffstat (limited to 'bridges')
-rw-r--r--bridges/bridge_softmix.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/bridges/bridge_softmix.c b/bridges/bridge_softmix.c
index ae877eb6e..9aa8a7a8a 100644
--- a/bridges/bridge_softmix.c
+++ b/bridges/bridge_softmix.c
@@ -701,14 +701,15 @@ static int remove_destination_streams(struct ast_stream_topology *dest,
stream = ast_stream_topology_get_stream(source, i);
- if (is_video_dest(stream, channel_name, NULL)) {
- continue;
- }
-
stream_clone = ast_stream_clone(stream, NULL);
if (!stream_clone) {
continue;
}
+
+ if (is_video_dest(stream, channel_name, NULL)) {
+ ast_stream_set_state(stream_clone, AST_STREAM_STATE_REMOVED);
+ }
+
if (ast_stream_topology_append_stream(dest, stream_clone) < 0) {
ast_stream_free(stream_clone);
}
@@ -1964,9 +1965,9 @@ AST_TEST_DEFINE(sfu_remove_destination_streams)
int num_streams;
int params_index[4];
} removal_results[] = {
- { "PJSIP/Bob-00000001", 3, { 0, 1, 3, -1 }, },
+ { "PJSIP/Bob-00000001", 4, { 0, 1, 2, 3 }, },
{ "PJSIP/Edward-00000004", 4, { 0, 1, 2, 3 }, },
- { "", 2, { 0, 1, -1, -1 }, },
+ { "", 4, { 0, 1, 2, 3 }, },
};
struct ast_stream_topology *orig = NULL;
struct ast_stream_topology *result = NULL;
@@ -2033,6 +2034,12 @@ AST_TEST_DEFINE(sfu_remove_destination_streams)
ast_format_cap_get_names(ast_stream_get_formats(actual), &actual_str));
goto end;
}
+
+ if (is_video_dest(actual, removal_results[i].channel_name, NULL) &&
+ ast_stream_get_state(actual) != AST_STREAM_STATE_REMOVED) {
+ ast_test_status_update(test, "Removed stream %s does not have a state of removed\n", ast_stream_get_name(actual));
+ goto end;
+ }
}
}