Merge "bridge_softmix: Use removed stream spots when renegotiating."
[asterisk/asterisk.git] / bridges / bridge_softmix.c
index 3801ccb..f3b5b2a 100644 (file)
@@ -617,7 +617,7 @@ static void sfu_topologies_on_join(struct ast_bridge_channel *joiner, struct ast
                if (participant == joiner) {
                        continue;
                }
-               participant_topology = ast_stream_topology_clone(ast_channel_get_stream_topology(joiner->chan));
+               participant_topology = ast_stream_topology_clone(ast_channel_get_stream_topology(participant->chan));
                if (!participant_topology) {
                        goto cleanup;
                }
@@ -718,14 +718,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);
                }
@@ -1981,9 +1982,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;
@@ -2050,6 +2051,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;
+                       }
                }
        }