return NULL;
}
-static struct ast_json *get_media_labels(struct confbridge_conference *conference,
+static void set_media_labels(struct confbridge_conference *conference,
struct ast_channel *src_chan, struct ast_channel *dest_chan, enum label_direction dir)
{
struct ast_stream_topology *topology;
struct ast_stream *stream;
- const char *curr_a_label;
- const char *a_label = NULL;
- const char *v_label = NULL;
- struct ast_json *labels = ast_json_array_create();
+ struct ast_channel *chan = dir == LABEL_DIRECTION_SRC ? dest_chan : src_chan;
- if (!labels) {
- return NULL;
- }
-
- topology = ast_channel_get_stream_topology(dir == LABEL_DIRECTION_SRC ? src_chan : dest_chan);
- stream = get_stream(topology, AST_MEDIA_TYPE_AUDIO);
- curr_a_label = stream ? ast_stream_get_metadata(stream, "MSID:LABEL") : NULL;
- a_label = curr_a_label ?: conference->bridge->uniqueid;
- ast_json_array_append(labels, ast_json_string_create(a_label));
-
- topology = ast_channel_get_stream_topology(dir == LABEL_DIRECTION_SRC ? dest_chan : src_chan);
+ topology = ast_channel_get_stream_topology(chan);
stream = get_stream(topology, AST_MEDIA_TYPE_VIDEO);
- v_label = stream ? ast_stream_get_metadata(stream, "MSID:LABEL") : NULL;
- if (v_label) {
- ast_json_array_append(labels, ast_json_string_create(v_label));
+ if (stream) {
+ ast_stream_set_metadata(stream, "SDP:LABEL", ast_channel_uniqueid(chan));
}
-
- return ast_json_pack("{s: o }", "media_source_track_labels", labels);
}
static void send_message(const char *msg_name, char *conf_name, struct ast_json *json_object,
ao2_lock(conference);
AST_LIST_TRAVERSE(&conference->active_list, user, list) {
struct ast_json *json_object;
- struct ast_json* source_json_labels = NULL;
/*
* If the msg type is join, we need to capture all targets channel info so we can
if (source_send_events && stasis_message_type(msg) == confbridge_join_type()) {
struct ast_channel_snapshot *target_snapshot;
struct ast_json *target_json_channel;
- struct ast_json *target_json_labels;
target_snapshot = ast_channel_snapshot_get_latest(ast_channel_uniqueid(user->chan));
if (!target_snapshot) {
continue;
}
- target_json_labels = get_media_labels(conference, chan, user->chan, LABEL_DIRECTION_SRC);
- target_json_channel = channel_to_json(target_snapshot, extras, target_json_labels);
+ set_media_labels(conference, chan, user->chan, LABEL_DIRECTION_SRC);
+ target_json_channel = channel_to_json(target_snapshot, extras, NULL);
ao2_ref(target_snapshot, -1);
- ast_json_unref(target_json_labels);
if (!json_channels) {
json_channels = ast_json_array_create();
if (!json_channels) {
ast_log(LOG_ERROR, "Unable to allocate json array\n");
ast_json_unref(target_json_channel);
- ast_json_unref(target_json_labels);
return;
}
}
continue;
}
- source_json_labels = get_media_labels(conference, chan, user->chan, LABEL_DIRECTION_DEST);
- ast_json_object_update(extras, source_json_labels);
+ set_media_labels(conference, chan, user->chan, LABEL_DIRECTION_DEST);
- json_object = pack_snapshots(obj->bridge, obj->channel, extras, source_json_labels, msg);
- ast_json_unref(source_json_labels);
+ json_object = pack_snapshots(obj->bridge, obj->channel, extras, NULL, msg);
if (!json_object) {
ast_log(LOG_ERROR, "Unable to convert %s message to json\n", msg_name);
pj_str_t stmp;
pjmedia_sdp_attr *attr;
char msid[(AST_UUID_STR_LEN * 2) + 2];
+ const char *stream_label = ast_stream_get_metadata(stream, "SDP:LABEL");
if (!session->endpoint->media.webrtc) {
return;
}
if (ast_strlen_zero(session_media->label)) {
- /*
- * If this stream has already been assigned a label, use it.
- * This will ensure that a confbridge participant is known by
- * the same label by all other participants.
- */
- const char *stream_label = ast_stream_get_metadata(stream, "MSID:LABEL");
-
- if (!ast_strlen_zero(stream_label)) {
- ast_copy_string(session_media->label, stream_label, sizeof(session_media->label));
- } else {
ast_uuid_generate_str(session_media->label, sizeof(session_media->label));
- ast_stream_set_metadata(stream, "MSID:LABEL", session_media->label);
- }
}
snprintf(msid, sizeof(msid), "%s %s", session_media->mslabel, session_media->label);
ast_codec_media_type2str(ast_stream_get_type(stream)), msid);
attr = pjmedia_sdp_attr_create(pool, "msid", pj_cstr(&stmp, msid));
pjmedia_sdp_attr_add(&media->attr_count, media->attr, attr);
+
+ /* 'label' must come after 'msid' */
+ if (!ast_strlen_zero(stream_label)) {
+ ast_debug(3, "Stream Label: %p %s %s\n", stream,
+ ast_codec_media_type2str(ast_stream_get_type(stream)), stream_label);
+ attr = pjmedia_sdp_attr_create(pool, "label", pj_cstr(&stmp, stream_label));
+ pjmedia_sdp_attr_add(&media->attr_count, media->attr, attr);
+ }
}
static void add_rtcp_fb_to_stream(struct ast_sip_session *session,