res_pjsip_session: Preserve stream name during renegotiation.
authorJoshua Colp <jcolp@digium.com>
Tue, 5 Sep 2017 13:39:43 +0000 (13:39 +0000)
committerJoshua Colp <jcolp@digium.com>
Tue, 5 Sep 2017 13:41:08 +0000 (08:41 -0500)
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

index f6b3b93..7d0724d 100644 (file)
@@ -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;
                }