From 68bcfccd5293476a3df3f832fe18cffdc5ea117f Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Tue, 5 Sep 2017 13:39:43 +0000 Subject: [PATCH] res_pjsip_session: Preserve stream name during renegotiation. Stream names within Asterisk can have meaning so when an externally initiated renegotiation occurs we need to preserve the name of the stream if it already exists. Change-Id: I29f50d0cc7f3238287d6d647777e76e1bdf8c596 --- res/res_pjsip_session.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index f6b3b937a1..7d0724d530 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -588,7 +588,14 @@ static int handle_incoming_sdp(struct ast_sip_session *session, const pjmedia_sd stream = ast_stream_topology_get_stream(session->pending_media_state->topology, i); } if (!stream) { - stream = ast_stream_alloc(ast_codec_media_type2str(type), type); + struct ast_stream *existing_stream = NULL; + + if (session->active_media_state->topology && + (i < ast_stream_topology_get_count(session->active_media_state->topology))) { + existing_stream = ast_stream_topology_get_stream(session->active_media_state->topology, i); + } + + stream = ast_stream_alloc(existing_stream ? ast_stream_get_name(existing_stream) : ast_codec_media_type2str(type), type); if (!stream) { return -1; } @@ -1626,6 +1633,7 @@ static int sdp_requires_deferral(struct ast_sip_session *session, const pjmedia_ char media[20]; struct ast_sip_session_sdp_handler *handler; RAII_VAR(struct sdp_handler_list *, handler_list, NULL, ao2_cleanup); + struct ast_stream *existing_stream = NULL; struct ast_stream *stream; enum ast_media_type type; struct ast_sip_session_media *session_media = NULL; @@ -1634,8 +1642,13 @@ static int sdp_requires_deferral(struct ast_sip_session *session, const pjmedia_ /* We need a null-terminated version of the media string */ ast_copy_pj_str(media, &sdp->media[i]->desc.media, sizeof(media)); + if (session->active_media_state->topology && + (i < ast_stream_topology_get_count(session->active_media_state->topology))) { + existing_stream = ast_stream_topology_get_stream(session->active_media_state->topology, i); + } + type = ast_media_type_from_str(media); - stream = ast_stream_alloc(ast_codec_media_type2str(type), type); + stream = ast_stream_alloc(existing_stream ? ast_stream_get_name(existing_stream) : ast_codec_media_type2str(type), type); if (!stream) { return -1; }