diff --git a/daemon/call.c b/daemon/call.c index 2d8bbfd0e..ecc5161af 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2714,9 +2714,7 @@ static void __call_monologue_init_from_flags(struct call_monologue *ml, struct c { ml->sdp_session_name = call_str_cpy(&flags->session_sdp_name); } - /* sdp session timing */ - if (flags->session_timing.len) - ml->sdp_session_timing = call_str_cpy(&flags->session_timing); + ml->sdp_session_timing = call_str_cpy(&flags->session_timing); /* sdp bandwidth per session level * 0 value is supported (e.g. b=RR:0 and b=RS:0), to be able to disable rtcp */ ml->sdp_session_bandwidth.as = flags->session_bandwidth.as; @@ -2724,9 +2722,12 @@ static void __call_monologue_init_from_flags(struct call_monologue *ml, struct c ml->sdp_session_bandwidth.rs = flags->session_bandwidth.rs; ml->sdp_session_bandwidth.ct = flags->session_bandwidth.ct; ml->sdp_session_bandwidth.tias = flags->session_bandwidth.tias; - /* sdp session group */ - if (flags->session_group.len) - ml->sdp_session_group = call_str_cpy(&flags->session_group); + ml->sdp_session_group = call_str_cpy(&flags->session_group); + + ml->sdp_session_uri = call_str_cpy(&flags->session_uri); + ml->sdp_session_email = call_str_cpy(&flags->session_email); + ml->sdp_session_phone = call_str_cpy(&flags->session_phone); + ml->sdp_session_information = call_str_cpy(&flags->session_information); } // reset offer ipv4/ipv6/mixed media stats @@ -2950,6 +2951,8 @@ static void __media_init_from_flags(struct call_media *other_media, struct call_ /* bandwidth */ other_media->sdp_media_bandwidth = sp->media_session_bandiwdth; + + other_media->sdp_information = call_str_cpy(&sp->sdp_information); } unsigned int proto_num_ports(unsigned int sp_ports, struct call_media *media, sdp_ng_flags *flags, diff --git a/daemon/sdp.c b/daemon/sdp.c index 3cc49343c..9bebd3d2b 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -107,6 +107,10 @@ struct sdp_session { struct session_bandwidth bandwidth; struct sdp_attributes attributes; sdp_media_q media_streams; + str information; // i= line + str uri; // u= line + str email; // e= line + str phone; // p= line }; struct sdp_media { @@ -127,6 +131,8 @@ struct sdp_media { str_slice_q format_list; /* list of slice-alloc'd str objects */ enum media_type media_type_id; int media_sdp_id; + + str information; // i= line }; struct attribute_rtcp { @@ -1357,11 +1363,32 @@ new_session: session->session_timing = value; break; - case 'k': case 'i': + *(media ? &media->information : &session->information) = value; + break; + case 'u': + errstr = "u= line found within media section"; + if (media) + goto error; + session->uri = value; + break; + case 'e': + errstr = "e= line found within media section"; + if (media) + goto error; + session->email = value; + break; + case 'p': + errstr = "p= line found within media section"; + if (media) + goto error; + session->phone = value; + break; + + case 'k': case 'r': case 'z': break; @@ -1812,6 +1839,10 @@ int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_f flags->session_sdp_name = session->session_name; flags->session_bandwidth = session->bandwidth; flags->session_timing = session->session_timing; + flags->session_information = session->information; + flags->session_uri = session->uri; + flags->session_email = session->email; + flags->session_phone = session->phone; attr = attr_get_by_id(&session->attributes, ATTR_GROUP); if (attr) @@ -1855,6 +1886,8 @@ int sdp_streams(const sdp_sessions_q *sessions, sdp_streams_q *streams, sdp_ng_f /* b= (bandwidth), is parsed in sdp_parse() */ sp->media_session_bandiwdth = media->bandwidth; + sp->sdp_information = media->information; + // a=ptime attr = attr_get_by_id(&media->attributes, ATTR_PTIME); if (attr && attr->strs.value.s) @@ -2634,6 +2667,20 @@ static struct packet_stream *print_rtcp(GString *s, struct call_media *media, pa return ps_rtcp; } +static void sdp_out_print_line(GString *out, char letter, const str *value) { + if (!value->len) + return; + + g_string_append_c(out, letter); + g_string_append_c(out, '='); + g_string_append_len(out, value->s, value->len); + g_string_append(out, "\r\n"); +} + +static void sdp_out_print_information(GString *out, const str *s) { + sdp_out_print_line(out, 'i', s); +} + /* TODO: rework an appending of parameters in terms of sdp attribute manipulations */ static void print_sdp_media_section(GString *s, struct call_media *media, const endpoint_t *address, struct call_media *copy_media, @@ -2650,6 +2697,8 @@ static void print_sdp_media_section(GString *s, struct call_media *media, return; } + sdp_out_print_information(s, &media->sdp_information); + /* add actual media connection * print zeroed address for the non accepted media, see RFC 3264 */ sdp_out_add_media_connection(s, media, rtp_ps, (inactive_media ? NULL : &address->address), flags); @@ -3000,6 +3049,7 @@ static void sdp_out_original_media_attributes(GString *out, struct call_media *m const endpoint_t *address, struct call_media *source_media, struct packet_stream *rtp_ps, sdp_ng_flags *flags) { + sdp_out_print_information(out, &source_media->sdp_information); sdp_out_add_media_connection(out, media, rtp_ps, &address->address, flags); sdp_out_add_media_bandwidth(out, source_media, flags); sdp_insert_all_attributes(out, source_media, flags); @@ -3112,6 +3162,14 @@ int sdp_create(str *out, struct call_monologue *monologue, sdp_ng_flags *flags) /* don't set connection on the session level * but instead per media, below */ + if (source_ml) { + sdp_out_print_information(s, &source_ml->sdp_session_information); + + sdp_out_print_line(s, 'u', &source_ml->sdp_session_uri); + sdp_out_print_line(s, 'e', &source_ml->sdp_session_email); + sdp_out_print_line(s, 'p', &source_ml->sdp_session_phone); + } + /* add bandwidth control per session level */ sdp_out_add_session_bandwidth(s, source_ml, flags); diff --git a/include/call.h b/include/call.h index 485656e09..2384b7247 100644 --- a/include/call.h +++ b/include/call.h @@ -380,6 +380,7 @@ struct stream_params { str tls_id; int media_sdp_id; struct session_bandwidth media_session_bandiwdth; + str sdp_information; }; struct endpoint_map { @@ -546,6 +547,8 @@ struct call_media { /* bandwidth */ struct session_bandwidth sdp_media_bandwidth; + str sdp_information; + #ifdef WITH_TRANSCODING encoder_callback_t encoder_callback; #endif @@ -610,6 +613,10 @@ struct call_monologue { str sdp_session_name; str sdp_session_timing; str sdp_session_group; /* a=group: e.g. BUNDLE */ + str sdp_session_information; + str sdp_session_uri; + str sdp_session_phone; + str sdp_session_email; struct ssrc_hash *ssrc_hash; str metadata; struct janus_session *janus_session; diff --git a/include/call_interfaces.h b/include/call_interfaces.h index c14c18a44..e462ba1a7 100644 --- a/include/call_interfaces.h +++ b/include/call_interfaces.h @@ -77,6 +77,10 @@ struct sdp_ng_flags { str session_timing; /* t= line */ struct session_bandwidth session_bandwidth; str session_group; /* a=group: e.g. BUNDLE */ + str session_information; // i= line + str session_uri; // u= line + str session_email; // e= line + str session_phone; // p= line /* commands to manipulate attr lines in SDP */ struct sdp_manipulations * sdp_manipulations[__MT_MAX]; diff --git a/t/auto-daemon-tests.pl b/t/auto-daemon-tests.pl index 186dc9fcb..a5f777350 100755 --- a/t/auto-daemon-tests.pl +++ b/t/auto-daemon-tests.pl @@ -20054,6 +20054,7 @@ offer('plain SDP, no ICE', { ICE => 'remove' }, < 'default' }, < 'optional' }, <