diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/bridge.c | 11 | ||||
-rw-r--r-- | main/bridge_channel.c | 13 | ||||
-rw-r--r-- | main/sdp_state.c | 4 | ||||
-rw-r--r-- | main/stream.c | 11 |
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 4f166fff0..b299ca98f 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); |