@ -577,13 +577,18 @@ static void sfu_topologies_on_join(struct ast_bridge_channel *joiner, struct ast
struct ast_stream_topology * joiner_video = NULL ;
struct ast_stream_topology * existing_video = NULL ;
struct ast_bridge_channel * participant ;
int res ;
joiner_video = ast_stream_topology_alloc ( ) ;
if ( ! joiner_video ) {
return ;
}
if ( append_source_streams ( joiner_video , ast_channel_name ( joiner - > chan ) , ast_channel_get_stream_topology ( joiner - > chan ) ) ) {
ast_channel_lock ( joiner - > chan ) ;
res = append_source_streams ( joiner_video , ast_channel_name ( joiner - > chan ) , ast_channel_get_stream_topology ( joiner - > chan ) ) ;
ast_channel_unlock ( joiner - > chan ) ;
if ( res ) {
goto cleanup ;
}
@ -596,13 +601,18 @@ static void sfu_topologies_on_join(struct ast_bridge_channel *joiner, struct ast
if ( participant = = joiner ) {
continue ;
}
if ( append_source_streams ( existing_video , ast_channel_name ( participant - > chan ) ,
ast_channel_get_stream_topology ( participant - > chan ) ) ) {
ast_channel_lock ( participant - > chan ) ;
res = append_source_streams ( existing_video , ast_channel_name ( participant - > chan ) ,
ast_channel_get_stream_topology ( participant - > chan ) ) ;
ast_channel_unlock ( participant - > chan ) ;
if ( res ) {
goto cleanup ;
}
}
ast_channel_lock ( joiner - > chan ) ;
joiner_topology = ast_stream_topology_clone ( ast_channel_get_stream_topology ( joiner - > chan ) ) ;
ast_channel_unlock ( joiner - > chan ) ;
if ( ! joiner_topology ) {
goto cleanup ;
}
@ -617,7 +627,9 @@ static void sfu_topologies_on_join(struct ast_bridge_channel *joiner, struct ast
if ( participant = = joiner ) {
continue ;
}
ast_channel_lock ( participant - > chan ) ;
participant_topology = ast_stream_topology_clone ( ast_channel_get_stream_topology ( participant - > chan ) ) ;
ast_channel_unlock ( participant - > chan ) ;
if ( ! participant_topology ) {
goto cleanup ;
}
@ -753,12 +765,16 @@ static int sfu_topologies_on_leave(struct ast_bridge_channel *leaver, struct ast
continue ;
}
ast_channel_lock ( participant - > chan ) ;
remove_destination_streams ( participant_topology , ast_channel_name ( leaver - > chan ) , ast_channel_get_stream_topology ( participant - > chan ) ) ;
ast_channel_unlock ( participant - > chan ) ;
ast_channel_request_stream_topology_change ( participant - > chan , participant_topology , NULL ) ;
ast_stream_topology_free ( participant_topology ) ;
}
ast_channel_lock ( leaver - > chan ) ;
remove_destination_streams ( leaver_topology , " " , ast_channel_get_stream_topology ( leaver - > chan ) ) ;
ast_channel_unlock ( leaver - > chan ) ;
ast_channel_request_stream_topology_change ( leaver - > chan , leaver_topology , NULL ) ;
ast_stream_topology_free ( leaver_topology ) ;
@ -1657,6 +1673,7 @@ static void map_source_to_destinations(const char *source_stream_name, const cha
}
ast_bridge_channel_lock ( participant ) ;
ast_channel_lock ( participant - > chan ) ;
topology = ast_channel_get_stream_topology ( participant - > chan ) ;
for ( i = 0 ; i < ast_stream_topology_get_count ( topology ) ; + + i ) {
@ -1668,6 +1685,7 @@ static void map_source_to_destinations(const char *source_stream_name, const cha
break ;
}
}
ast_channel_unlock ( participant - > chan ) ;
ast_bridge_channel_unlock ( participant ) ;
}
}
@ -1702,16 +1720,9 @@ static void softmix_bridge_stream_topology_changed(struct ast_bridge *bridge, st
/* First traversal: re-initialize all of the participants' stream maps */
AST_LIST_TRAVERSE ( & bridge - > channels , participant , entry ) {
int size ;
ast_bridge_channel_lock ( participant ) ;
size = ast_stream_topology_get_count ( ast_channel_get_stream_topology ( participant - > chan ) ) ;
AST_VECTOR_FREE ( & participant - > stream_map . to_channel ) ;
AST_VECTOR_FREE ( & participant - > stream_map . to_bridge ) ;
AST_VECTOR_INIT ( & participant - > stream_map . to_channel , size ) ;
AST_VECTOR_INIT ( & participant - > stream_map . to_bridge , size ) ;
AST_VECTOR_RESET ( & participant - > stream_map . to_channel , AST_VECTOR_ELEM_CLEANUP_NOOP ) ;
AST_VECTOR_RESET ( & participant - > stream_map . to_bridge , AST_VECTOR_ELEM_CLEANUP_NOOP ) ;
ast_bridge_channel_unlock ( participant ) ;
}
@ -1727,6 +1738,8 @@ static void softmix_bridge_stream_topology_changed(struct ast_bridge *bridge, st
int i ;
struct ast_stream_topology * topology ;
ast_channel_lock ( participant - > chan ) ;
topology = ast_channel_get_stream_topology ( participant - > chan ) ;
for ( i = 0 ; i < ast_stream_topology_get_count ( topology ) ; + + i ) {
@ -1766,6 +1779,8 @@ static void softmix_bridge_stream_topology_changed(struct ast_bridge *bridge, st
}
ast_bridge_channel_unlock ( participant ) ;
}
ast_channel_unlock ( participant - > chan ) ;
}
}