summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorJenkins2 <jenkins2@gerrit.asterisk.org>2017-06-06 06:57:24 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2017-06-06 06:57:24 -0500
commitbb2f6234da761194100d30f33d4d839f75ab78f1 (patch)
tree0e374db6de7d2347a216b4319311f03eb5ee9eb8 /main
parent97abf6d4759627aec3ef65e43413214b192918a5 (diff)
parent2da869408ae5556022526bcd0f526d92fdbb5a5f (diff)
Merge "Add primitive SFU support to bridge_softmix."
Diffstat (limited to 'main')
-rw-r--r--main/bridge.c11
-rw-r--r--main/bridge_channel.c13
-rw-r--r--main/sdp_state.c4
-rw-r--r--main/stream.c11
4 files changed, 29 insertions, 10 deletions
diff --git a/main/bridge.c b/main/bridge.c
index 9d9a3118b..7d6bdfaa0 100644
--- a/main/bridge.c
+++ b/main/bridge.c
@@ -3778,6 +3778,8 @@ static void cleanup_video_mode(struct ast_bridge *bridge)
if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc) {
ast_channel_unref(bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc);
}
+ case AST_BRIDGE_VIDEO_MODE_SFU:
+ break;
}
memset(&bridge->softmix.video_mode, 0, sizeof(bridge->softmix.video_mode));
}
@@ -3873,6 +3875,8 @@ int ast_bridge_number_video_src(struct ast_bridge *bridge)
if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc) {
res++;
}
+ case AST_BRIDGE_VIDEO_MODE_SFU:
+ break;
}
ast_bridge_unlock(bridge);
return res;
@@ -3897,7 +3901,8 @@ int ast_bridge_is_video_src(struct ast_bridge *bridge, struct ast_channel *chan)
} else if (bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc == chan) {
res = 2;
}
-
+ case AST_BRIDGE_VIDEO_MODE_SFU:
+ break;
}
ast_bridge_unlock(bridge);
return res;
@@ -3931,6 +3936,8 @@ void ast_bridge_remove_video_src(struct ast_bridge *bridge, struct ast_channel *
}
bridge->softmix.video_mode.mode_data.talker_src_data.chan_old_vsrc = NULL;
}
+ case AST_BRIDGE_VIDEO_MODE_SFU:
+ break;
}
ast_bridge_unlock(bridge);
}
@@ -3942,6 +3949,8 @@ const char *ast_bridge_video_mode_to_string(enum ast_bridge_video_mode_type vide
return "talker";
case AST_BRIDGE_VIDEO_MODE_SINGLE_SRC:
return "single";
+ case AST_BRIDGE_VIDEO_MODE_SFU:
+ return "sfu";
case AST_BRIDGE_VIDEO_MODE_NONE:
default:
return "none";
diff --git a/main/bridge_channel.c b/main/bridge_channel.c
index c6ea222ee..02783b103 100644
--- a/main/bridge_channel.c
+++ b/main/bridge_channel.c
@@ -989,6 +989,11 @@ int ast_bridge_channel_queue_frame(struct ast_bridge_channel *bridge_channel, st
/* Media frames need to be mapped to an appropriate write stream */
dup->stream_num = AST_VECTOR_GET(
&bridge_channel->stream_map.to_bridge, fr->stream_num);
+ if (dup->stream_num == -1) {
+ ast_bridge_channel_unlock(bridge_channel);
+ bridge_frame_free(dup);
+ return 0;
+ }
} else {
dup->stream_num = -1;
}
@@ -2339,7 +2344,9 @@ static void bridge_channel_handle_write(struct ast_bridge_channel *bridge_channe
case AST_FRAME_NULL:
break;
default:
- if (fr->stream_num >= (int)AST_VECTOR_SIZE(&bridge_channel->stream_map.to_channel)) {
+ if (fr->stream_num > 0 &&
+ (fr->stream_num >= (int)AST_VECTOR_SIZE(&bridge_channel->stream_map.to_channel) ||
+ AST_VECTOR_GET(&bridge_channel->stream_map.to_channel, fr->stream_num) == -1)) {
/* Nowhere to write to, so drop it */
break;
}
@@ -2473,11 +2480,11 @@ static void bridge_handle_trip(struct ast_bridge_channel *bridge_channel)
* If a stream topology has changed then the bridge_channel's
* media mapping needs to be updated.
*/
- ast_bridge_channel_stream_map(bridge_channel);
-
if (bridge_channel->bridge->technology->stream_topology_changed) {
bridge_channel->bridge->technology->stream_topology_changed(
bridge_channel->bridge, bridge_channel);
+ } else {
+ ast_bridge_channel_stream_map(bridge_channel);
}
break;
default:
diff --git a/main/sdp_state.c b/main/sdp_state.c
index 9b116ca54..00f147f47 100644
--- a/main/sdp_state.c
+++ b/main/sdp_state.c
@@ -747,7 +747,7 @@ static struct sdp_state_capabilities *merge_capabilities(const struct ast_sdp_st
if (is_local) {
/* Replace the local stream with the new local stream. */
- joint_stream = ast_stream_clone(new_stream);
+ joint_stream = ast_stream_clone(new_stream, NULL);
} else {
joint_stream = merge_streams(local_stream, new_stream);
}
@@ -800,7 +800,7 @@ static struct sdp_state_capabilities *merge_capabilities(const struct ast_sdp_st
/* We don't have a stream state that corresponds to the stream in the new topology, so
* create a stream state as appropriate.
*/
- joint_stream = ast_stream_clone(new_stream);
+ joint_stream = ast_stream_clone(new_stream, NULL);
if (!joint_stream) {
sdp_state_stream_free(joint_state_stream);
goto fail;
diff --git a/main/stream.c b/main/stream.c
index 804a0b8ee..fb146931d 100644
--- a/main/stream.c
+++ b/main/stream.c
@@ -95,23 +95,26 @@ struct ast_stream *ast_stream_alloc(const char *name, enum ast_media_type type)
return stream;
}
-struct ast_stream *ast_stream_clone(const struct ast_stream *stream)
+struct ast_stream *ast_stream_clone(const struct ast_stream *stream, const char *name)
{
struct ast_stream *new_stream;
size_t stream_size;
int idx;
+ const char *stream_name;
if (!stream) {
return NULL;
}
- stream_size = sizeof(*stream) + strlen(stream->name) + 1;
+ stream_name = name ?: stream->name;
+ stream_size = sizeof(*stream) + strlen(stream_name) + 1;
new_stream = ast_calloc(1, stream_size);
if (!new_stream) {
return NULL;
}
- memcpy(new_stream, stream, stream_size);
+ memcpy(new_stream, stream, sizeof(*new_stream));
+ strcpy(new_stream->name, stream_name); /* Safe */
if (new_stream->formats) {
ao2_ref(new_stream->formats, +1);
}
@@ -269,7 +272,7 @@ struct ast_stream_topology *ast_stream_topology_clone(
for (i = 0; i < AST_VECTOR_SIZE(&topology->streams); i++) {
struct ast_stream *stream =
- ast_stream_clone(AST_VECTOR_GET(&topology->streams, i));
+ ast_stream_clone(AST_VECTOR_GET(&topology->streams, i), NULL);
if (!stream || AST_VECTOR_APPEND(&new_topology->streams, stream)) {
ast_stream_free(stream);