|
|
|
@ -720,79 +720,80 @@ static const char *janus_videoroom_configure(struct websocket_message *wm, struc
|
|
|
|
|
|
|
|
|
|
AUTO_CLEANUP(str sdp_out, str_free_dup) = STR_NULL;
|
|
|
|
|
ret = sdp_create(&sdp_out, ml, &flags);
|
|
|
|
|
if (!ret) {
|
|
|
|
|
save_last_sdp(ml, &sdp_in, &parsed, &streams);
|
|
|
|
|
*jsep_sdp_out = sdp_out;
|
|
|
|
|
sdp_out = STR_NULL; // ownership passed to output
|
|
|
|
|
if (ret)
|
|
|
|
|
return "Publish error";
|
|
|
|
|
|
|
|
|
|
*jsep_type_out = "answer";
|
|
|
|
|
save_last_sdp(ml, &sdp_in, &parsed, &streams);
|
|
|
|
|
*jsep_sdp_out = sdp_out;
|
|
|
|
|
sdp_out = STR_NULL; // ownership passed to output
|
|
|
|
|
|
|
|
|
|
*successp = "event";
|
|
|
|
|
json_builder_set_member_name(builder, "videoroom");
|
|
|
|
|
json_builder_add_string_value(builder, "event");
|
|
|
|
|
json_builder_set_member_name(builder, "room");
|
|
|
|
|
json_builder_add_int_value(builder, room_id);
|
|
|
|
|
json_builder_set_member_name(builder, "configured");
|
|
|
|
|
json_builder_add_string_value(builder, "ok");
|
|
|
|
|
|
|
|
|
|
json_builder_set_member_name(builder, "streams");
|
|
|
|
|
json_builder_begin_array(builder);
|
|
|
|
|
|
|
|
|
|
const char *a_codec = NULL, *v_codec = NULL;
|
|
|
|
|
|
|
|
|
|
for (GList *l = ml->medias.head; l; l = l->next) {
|
|
|
|
|
struct call_media *media = l->data;
|
|
|
|
|
|
|
|
|
|
const char *codec = NULL;
|
|
|
|
|
for (GList *k = media->codecs.codec_prefs.head; k; k = k->next) {
|
|
|
|
|
struct rtp_payload_type *pt = k->data;
|
|
|
|
|
codec = pt->encoding.s;
|
|
|
|
|
// XXX check codec support?
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
*jsep_type_out = "answer";
|
|
|
|
|
|
|
|
|
|
json_builder_begin_object(builder);
|
|
|
|
|
*successp = "event";
|
|
|
|
|
json_builder_set_member_name(builder, "videoroom");
|
|
|
|
|
json_builder_add_string_value(builder, "event");
|
|
|
|
|
json_builder_set_member_name(builder, "room");
|
|
|
|
|
json_builder_add_int_value(builder, room_id);
|
|
|
|
|
json_builder_set_member_name(builder, "configured");
|
|
|
|
|
json_builder_add_string_value(builder, "ok");
|
|
|
|
|
|
|
|
|
|
json_builder_set_member_name(builder, "type");
|
|
|
|
|
json_builder_add_string_value(builder, media->type.s);
|
|
|
|
|
json_builder_set_member_name(builder, "mindex");
|
|
|
|
|
json_builder_add_int_value(builder, media->index - 1);
|
|
|
|
|
json_builder_set_member_name(builder, "mid");
|
|
|
|
|
if (media->media_id.s)
|
|
|
|
|
json_builder_add_string_value(builder, media->media_id.s);
|
|
|
|
|
else
|
|
|
|
|
json_builder_add_null_value(builder);
|
|
|
|
|
json_builder_set_member_name(builder, "codec");
|
|
|
|
|
if (codec)
|
|
|
|
|
json_builder_add_string_value(builder, codec);
|
|
|
|
|
else
|
|
|
|
|
json_builder_add_null_value(builder);
|
|
|
|
|
json_builder_set_member_name(builder, "streams");
|
|
|
|
|
json_builder_begin_array(builder);
|
|
|
|
|
|
|
|
|
|
json_builder_end_object(builder);
|
|
|
|
|
const char *a_codec = NULL, *v_codec = NULL;
|
|
|
|
|
|
|
|
|
|
if (media->type_id == MT_AUDIO)
|
|
|
|
|
a_codec = codec;
|
|
|
|
|
else if (media->type_id == MT_VIDEO)
|
|
|
|
|
v_codec = codec;
|
|
|
|
|
for (GList *l = ml->medias.head; l; l = l->next) {
|
|
|
|
|
struct call_media *media = l->data;
|
|
|
|
|
|
|
|
|
|
const char *codec = NULL;
|
|
|
|
|
for (GList *k = media->codecs.codec_prefs.head; k; k = k->next) {
|
|
|
|
|
struct rtp_payload_type *pt = k->data;
|
|
|
|
|
codec = pt->encoding.s;
|
|
|
|
|
// XXX check codec support?
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
json_builder_end_array(builder);
|
|
|
|
|
json_builder_begin_object(builder);
|
|
|
|
|
|
|
|
|
|
json_builder_set_member_name(builder, "audio_codec");
|
|
|
|
|
if (a_codec)
|
|
|
|
|
json_builder_add_string_value(builder, a_codec);
|
|
|
|
|
json_builder_set_member_name(builder, "type");
|
|
|
|
|
json_builder_add_string_value(builder, media->type.s);
|
|
|
|
|
json_builder_set_member_name(builder, "mindex");
|
|
|
|
|
json_builder_add_int_value(builder, media->index - 1);
|
|
|
|
|
json_builder_set_member_name(builder, "mid");
|
|
|
|
|
if (media->media_id.s)
|
|
|
|
|
json_builder_add_string_value(builder, media->media_id.s);
|
|
|
|
|
else
|
|
|
|
|
json_builder_add_null_value(builder);
|
|
|
|
|
|
|
|
|
|
json_builder_set_member_name(builder, "video_codec");
|
|
|
|
|
if (v_codec)
|
|
|
|
|
json_builder_add_string_value(builder, v_codec);
|
|
|
|
|
json_builder_set_member_name(builder, "codec");
|
|
|
|
|
if (codec)
|
|
|
|
|
json_builder_add_string_value(builder, codec);
|
|
|
|
|
else
|
|
|
|
|
json_builder_add_null_value(builder);
|
|
|
|
|
|
|
|
|
|
janus_notify_publishers(wm, room_id, handle->id);
|
|
|
|
|
json_builder_end_object(builder);
|
|
|
|
|
|
|
|
|
|
if (media->type_id == MT_AUDIO)
|
|
|
|
|
a_codec = codec;
|
|
|
|
|
else if (media->type_id == MT_VIDEO)
|
|
|
|
|
v_codec = codec;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
json_builder_end_array(builder);
|
|
|
|
|
|
|
|
|
|
json_builder_set_member_name(builder, "audio_codec");
|
|
|
|
|
if (a_codec)
|
|
|
|
|
json_builder_add_string_value(builder, a_codec);
|
|
|
|
|
else
|
|
|
|
|
json_builder_add_null_value(builder);
|
|
|
|
|
|
|
|
|
|
json_builder_set_member_name(builder, "video_codec");
|
|
|
|
|
if (v_codec)
|
|
|
|
|
json_builder_add_string_value(builder, v_codec);
|
|
|
|
|
else
|
|
|
|
|
json_builder_add_null_value(builder);
|
|
|
|
|
|
|
|
|
|
janus_notify_publishers(wm, room_id, handle->id);
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|