diff options
author | Jenkins2 <jenkins2@gerrit.asterisk.org> | 2017-08-09 08:15:24 -0500 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2017-08-09 08:15:24 -0500 |
commit | df4bcdda2ac6f52ad2f75365c2b2d9fb77c19e85 (patch) | |
tree | 0523315ed861e3c9f84b23988ded7865a4c62efb /res/res_pjsip_sdp_rtp.c | |
parent | 62092bc1140a29c86e1fe4dd195ff819e6e7569b (diff) | |
parent | 104a8047a53b538b76d7befaf1c95eea9ad5114e (diff) |
Merge "res_pjsip_session/_sdp_rtp: Handling of 'msid' is incorrect"
Diffstat (limited to 'res/res_pjsip_sdp_rtp.c')
-rw-r--r-- | res/res_pjsip_sdp_rtp.c | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c index f79c4cbf0..77cd80782 100644 --- a/res/res_pjsip_sdp_rtp.c +++ b/res/res_pjsip_sdp_rtp.c @@ -1025,44 +1025,46 @@ static void process_ssrc_attributes(struct ast_sip_session *session, struct ast_ } } -static void process_msid_attribute(struct ast_sip_session *session, - struct ast_sip_session_media *session_media, pjmedia_sdp_media *media) +static void add_msid_to_stream(struct ast_sip_session *session, + struct ast_sip_session_media *session_media, pj_pool_t *pool, pjmedia_sdp_media *media, + struct ast_stream *stream) { + pj_str_t stmp; pjmedia_sdp_attr *attr; + char msid[(AST_UUID_STR_LEN * 2) + 2]; if (!session->endpoint->media.webrtc) { return; } - attr = pjmedia_sdp_media_find_attr2(media, "msid", NULL); - if (attr) { - ast_free(session_media->msid); - ast_copy_pj_str2(&session_media->msid, &attr->value); - } -} + if (ast_strlen_zero(session_media->mslabel)) { + if (ast_sip_session_is_pending_stream_default(session, stream)) { + int index; -static void add_msid_to_stream(struct ast_sip_session *session, - struct ast_sip_session_media *session_media, pj_pool_t *pool, pjmedia_sdp_media *media) -{ - pj_str_t stmp; - pjmedia_sdp_attr *attr; + /* If this is a default stream we group them together under the same stream, but as different tracks */ + for (index = 0; index < AST_VECTOR_SIZE(&session->pending_media_state->sessions); ++index) { + struct ast_sip_session_media *other_session_media = AST_VECTOR_GET(&session->pending_media_state->sessions, index); - if (!session->endpoint->media.webrtc) { - return; - } + if (session_media == other_session_media) { + continue; + } - if (ast_strlen_zero(session_media->msid)) { - char uuid1[AST_UUID_STR_LEN], uuid2[AST_UUID_STR_LEN]; + ast_copy_string(session_media->mslabel, other_session_media->mslabel, sizeof(session_media->mslabel)); + break; + } + } - if (ast_asprintf(&session_media->msid, "{%s} {%s}", - ast_uuid_generate_str(uuid1, sizeof(uuid1)), - ast_uuid_generate_str(uuid2, sizeof(uuid2))) < 0) { - session_media->msid = NULL; - return; + if (ast_strlen_zero(session_media->mslabel)) { + ast_uuid_generate_str(session_media->mslabel, sizeof(session_media->mslabel)); } } - attr = pjmedia_sdp_attr_create(pool, "msid", pj_cstr(&stmp, session_media->msid)); + if (ast_strlen_zero(session_media->label)) { + ast_uuid_generate_str(session_media->label, sizeof(session_media->label)); + } + + snprintf(msid, sizeof(msid), "%s %s", session_media->mslabel, session_media->label); + attr = pjmedia_sdp_attr_create(pool, "msid", pj_cstr(&stmp, msid)); pjmedia_sdp_attr_add(&media->attr_count, media->attr, attr); } @@ -1127,7 +1129,6 @@ static int negotiate_incoming_sdp_stream(struct ast_sip_session *session, } process_ssrc_attributes(session, session_media, stream); - process_msid_attribute(session, session_media, stream); session_media_transport = ast_sip_session_media_get_transport(session, session_media); if (session_media_transport == session_media || !session_media->bundled) { @@ -1586,7 +1587,7 @@ static int create_outgoing_sdp_stream(struct ast_sip_session *session, struct as } add_ssrc_to_stream(session, session_media, pool, media); - add_msid_to_stream(session, session_media, pool, media); + add_msid_to_stream(session, session_media, pool, media, stream); add_rtcp_fb_to_stream(session, session_media, pool, media); /* Add the media stream to the SDP */ |