summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorJenkins2 <jenkins2@gerrit.asterisk.org>2017-08-07 18:49:24 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2017-08-07 18:49:24 -0500
commit2ea19e714070d2807e7e5bc0db3cf4e6cb965193 (patch)
tree65a703058be9faf29555223438e94f7dd9573e13 /main
parent04b300525a190c7bdd22b7fc3364874dae800921 (diff)
parent88c65f7cb6f2064ba1b6a7713cb47c9a63790f8f (diff)
Merge "bridge: Fix stream topology/participant locking and video misrouting."
Diffstat (limited to 'main')
-rw-r--r--main/bridge.c7
-rw-r--r--main/bridge_channel.c27
2 files changed, 24 insertions, 10 deletions
diff --git a/main/bridge.c b/main/bridge.c
index a1a1a6f55..b732d5fc5 100644
--- a/main/bridge.c
+++ b/main/bridge.c
@@ -446,7 +446,12 @@ static void bridge_channel_complete_join(struct ast_bridge *bridge, struct ast_b
* media types vector. This way all streams map to the same media type index for
* a given channel.
*/
- 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);
+ }
}
/*!
diff --git a/main/bridge_channel.c b/main/bridge_channel.c
index 2e943000c..1427fd014 100644
--- a/main/bridge_channel.c
+++ b/main/bridge_channel.c
@@ -2344,16 +2344,23 @@ static void bridge_channel_handle_write(struct ast_bridge_channel *bridge_channe
case AST_FRAME_NULL:
break;
default:
- 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;
- }
+ /* Assume that there is no mapped stream for this */
+ num = -1;
- /* Find what stream number to write to for the channel */
- num = fr->stream_num < 0 ? -1 :
- AST_VECTOR_GET(&bridge_channel->stream_map.to_channel, fr->stream_num);
+ if (fr->stream_num > -1) {
+ ast_bridge_channel_lock(bridge_channel);
+ if (fr->stream_num < (int)AST_VECTOR_SIZE(&bridge_channel->stream_map.to_channel)) {
+ num = AST_VECTOR_GET(&bridge_channel->stream_map.to_channel, fr->stream_num);
+ }
+ ast_bridge_channel_unlock(bridge_channel);
+
+ /* If there is no mapped stream after checking the mapping then there is nowhere
+ * to write this frame to, so drop it.
+ */
+ if (num == -1) {
+ break;
+ }
+ }
/* Write the frame to the channel. */
bridge_channel->activity = BRIDGE_CHANNEL_THREAD_SIMPLE;
@@ -2983,7 +2990,9 @@ struct ast_bridge_channel *bridge_channel_internal_alloc(struct ast_bridge *brid
void ast_bridge_channel_stream_map(struct ast_bridge_channel *bridge_channel)
{
+ ast_channel_lock(bridge_channel->chan);
ast_stream_topology_map(ast_channel_get_stream_topology(bridge_channel->chan),
&bridge_channel->bridge->media_types, &bridge_channel->stream_map.to_bridge,
&bridge_channel->stream_map.to_channel);
+ ast_channel_unlock(bridge_channel->chan);
}