bridge_softmix: Use removed stream spots when renegotiating.

Streams are never truly removed in SDP, they still occupy
a location within the SDP. This location can be reused by
another stream if it so chooses.

This change takes advantage of this such that if a new stream
is needing to be added for a new participant any removed streams
are instead replaced first. This reduces the size of the SDP
and the number of streams.

ASTERISK-27134

Change-Id: I95cdcfd55cf47e02ea52abb5d94008db3fb68b1d
This commit is contained in:
Joshua Colp
2017-07-16 17:31:35 +00:00
parent 3fd1d520f7
commit f48695ce5b

View File

@@ -524,15 +524,32 @@ static int append_all_streams(struct ast_stream_topology *dest,
const struct ast_stream_topology *source)
{
int i;
int dest_index = 0;
for (i = 0; i < ast_stream_topology_get_count(source); ++i) {
struct ast_stream *clone;
int added = 0;
clone = ast_stream_clone(ast_stream_topology_get_stream(source, i), NULL);
if (!clone) {
return -1;
}
if (ast_stream_topology_append_stream(dest, clone) < 0) {
/* If we can reuse an existing removed stream then do so */
while (dest_index < ast_stream_topology_get_count(dest)) {
struct ast_stream *stream = ast_stream_topology_get_stream(dest, dest_index);
dest_index++;
if (ast_stream_get_state(stream) == AST_STREAM_STATE_REMOVED) {
ast_stream_topology_set_stream(dest, dest_index - 1, clone);
added = 1;
break;
}
}
/* If no removed stream exists that we took the place of append the stream */
if (!added && ast_stream_topology_append_stream(dest, clone) < 0) {
ast_stream_free(clone);
return -1;
}