summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2017-09-05 13:39:43 +0000
committerJoshua Colp <jcolp@digium.com>2017-09-05 13:40:38 +0000
commit11d013a9dfb096329d2705f42c660ac78c1b517e (patch)
tree00d7b98152ba061df746adb603674138a5e006ff /res
parent53458b30eac2e5d676e1fd063224137ee7cd33c4 (diff)
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
Diffstat (limited to 'res')
-rw-r--r--res/res_pjsip_session.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c
index f6b3b937a..7d0724d53 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;
}