diff options
author | Joshua Colp <jcolp@digium.com> | 2017-07-17 12:19:59 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2017-07-17 14:42:10 +0000 |
commit | bcd3f65174ace4993c2f76095166b7a2110916a9 (patch) | |
tree | 2e0ae955faea1d31bdf0f24f4a7dad2348847104 /bridges | |
parent | 3fd1d520f73a279b78e3bcfadc3ab7f829ff44c0 (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.c | 19 |
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; + } } } |