From: Xiemin Chen Date: Sun, 16 Dec 2018 12:43:42 +0000 (+0800) Subject: bridge_softmix: Use MSID:LABEL metadata as the cloned stream's appendix X-Git-Tag: 16.2.0-rc1~16^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f6cf837aede9dd8d805991d1e065baa699145ef2;p=thirdparty%2Fasterisk.git bridge_softmix: Use MSID:LABEL metadata as the cloned stream's appendix To avoid the stream name collide if there're more than one video track in one client. If client has multi video tracks, the name of ast_stream which represents each video track may be the same. Use the MSID:LABEL here because it's identifiable. ASTERISK-28196 #close Reported-by: xiemchen Change-Id: Ib62b2886e8d3a30e481d94616b0ceaeab68a870b --- diff --git a/bridges/bridge_softmix.c b/bridges/bridge_softmix.c index cf61340f25..290ea2b292 100644 --- a/bridges/bridge_softmix.c +++ b/bridges/bridge_softmix.c @@ -502,6 +502,7 @@ static int append_source_streams(struct ast_stream_topology *dest, const struct ast_stream_topology *source) { int i; + const char *stream_identify; for (i = 0; i < ast_stream_topology_get_count(source); ++i) { struct ast_stream *stream; @@ -513,8 +514,13 @@ static int append_source_streams(struct ast_stream_topology *dest, continue; } + stream_identify = ast_stream_get_metadata(stream, "MSID:LABEL"); + if (!stream_identify) { + stream_identify = ast_stream_get_name(stream); + } + if (ast_asprintf(&stream_clone_name, "%s_%s_%s", SOFTBRIDGE_VIDEO_DEST_PREFIX, - channel_name, ast_stream_get_name(stream)) < 0) { + channel_name, stream_identify) < 0) { return -1; } @@ -2186,6 +2192,7 @@ static void softmix_bridge_stream_topology_changed(struct ast_bridge *bridge, st for (i = 0; i < ast_stream_topology_get_count(topology); ++i) { struct ast_stream *stream = ast_stream_topology_get_stream(topology, i); + const char *stream_identify; if (is_video_source(stream)) { AST_VECTOR_APPEND(&media_types, AST_MEDIA_TYPE_VIDEO); @@ -2202,7 +2209,12 @@ static void softmix_bridge_stream_topology_changed(struct ast_bridge *bridge, st */ ast_channel_unlock(participant->chan); ast_bridge_channel_unlock(participant); - map_source_to_destinations(ast_stream_get_name(stream), ast_channel_name(participant->chan), + + stream_identify = ast_stream_get_metadata(stream, "MSID:LABEL"); + if (!stream_identify) { + stream_identify = ast_stream_get_name(stream); + } + map_source_to_destinations(stream_identify, ast_channel_name(participant->chan), AST_VECTOR_SIZE(&media_types) - 1, &bridge->channels); ast_bridge_channel_lock(participant); ast_channel_lock(participant->chan); diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c index c18627ed3d..c2b7d67037 100644 --- a/res/res_pjsip_sdp_rtp.c +++ b/res/res_pjsip_sdp_rtp.c @@ -1157,7 +1157,9 @@ static void add_msid_to_stream(struct ast_sip_session *session, } if (ast_strlen_zero(session_media->label)) { - ast_uuid_generate_str(session_media->label, sizeof(session_media->label)); + ast_uuid_generate_str(session_media->label, sizeof(session_media->label)); + /* add for stream identification to replace stream_name */ + ast_stream_set_metadata(stream, "MSID:LABEL", session_media->label); } snprintf(msid, sizeof(msid), "%s %s", session_media->mslabel, session_media->label);