bridge_softmix: Use MSID:LABEL metadata as the cloned stream's appendix
authorXiemin Chen <chenxiemin@gmail.com>
Sun, 16 Dec 2018 12:43:42 +0000 (20:43 +0800)
committerJoshua C. Colp <jcolp@digium.com>
Tue, 22 Jan 2019 15:01:34 +0000 (09:01 -0600)
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

bridges/bridge_softmix.c
res/res_pjsip_sdp_rtp.c

index cf61340..290ea2b 100644 (file)
@@ -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);
index c18627e..c2b7d67 100644 (file)
@@ -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);