chan_pjsip: Update media translation paths when new SDP negotiated.
[asterisk/asterisk.git] / main / bridge_channel.c
index f6b4665..5bf8512 100644 (file)
@@ -323,6 +323,8 @@ void ast_bridge_channel_restore_formats(struct ast_bridge_channel *bridge_channe
        ast_assert(bridge_channel->read_format != NULL);
        ast_assert(bridge_channel->write_format != NULL);
 
+       ast_channel_lock(bridge_channel->chan);
+
        /* Restore original formats of the channel as they came in */
        if (ast_format_cmp(ast_channel_readformat(bridge_channel->chan), bridge_channel->read_format) == AST_FORMAT_CMP_NOT_EQUAL) {
                ast_debug(1, "Bridge is returning %p(%s) to read format %s\n",
@@ -344,6 +346,8 @@ void ast_bridge_channel_restore_formats(struct ast_bridge_channel *bridge_channe
                                ast_format_get_name(bridge_channel->write_format));
                }
        }
+
+       ast_channel_unlock(bridge_channel->chan);
 }
 
 struct ast_bridge *ast_bridge_channel_merge_inhibit(struct ast_bridge_channel *bridge_channel, int request)
@@ -2354,9 +2358,6 @@ int bridge_channel_internal_join(struct ast_bridge_channel *bridge_channel)
        int res = 0;
        struct ast_bridge_features *channel_features;
 
-       bridge_channel->read_format = ao2_bump(ast_channel_readformat(bridge_channel->chan));
-       bridge_channel->write_format = ao2_bump(ast_channel_writeformat(bridge_channel->chan));
-
        ast_debug(1, "Bridge %s: %p(%s) is joining\n",
                bridge_channel->bridge->uniqueid,
                bridge_channel, ast_channel_name(bridge_channel->chan));
@@ -2368,6 +2369,10 @@ int bridge_channel_internal_join(struct ast_bridge_channel *bridge_channel)
        ast_bridge_lock(bridge_channel->bridge);
 
        ast_channel_lock(bridge_channel->chan);
+
+       bridge_channel->read_format = ao2_bump(ast_channel_readformat(bridge_channel->chan));
+       bridge_channel->write_format = ao2_bump(ast_channel_writeformat(bridge_channel->chan));
+
        /* Make sure we're still good to be put into a bridge */
        if (ast_channel_internal_bridge(bridge_channel->chan)
                || ast_test_flag(ast_channel_flags(bridge_channel->chan), AST_FLAG_ZOMBIE)) {