diff --git a/daemon/call.c b/daemon/call.c index 8ef9a5e67..7523c68af 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2678,9 +2678,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; @@ -2688,9 +2686,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 @@ -2916,6 +2917,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 88310583d..f1ff6afb9 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -106,6 +106,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 { @@ -126,7 +130,7 @@ 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 unsigned int legacy_osrtp:1; }; @@ -1359,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; @@ -1822,6 +1847,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) @@ -1865,6 +1894,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) @@ -2644,6 +2675,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, @@ -2660,6 +2705,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); @@ -2989,6 +3036,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); @@ -3101,6 +3149,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 e041c0e52..7e35afc1b 100644 --- a/include/call.h +++ b/include/call.h @@ -374,6 +374,7 @@ struct stream_params { str tls_id; int media_sdp_id; struct session_bandwidth media_session_bandiwdth; + str sdp_information; }; struct endpoint_map { @@ -537,6 +538,8 @@ struct call_media { /* bandwidth */ struct session_bandwidth sdp_media_bandwidth; + str sdp_information; + #ifdef WITH_TRANSCODING encoder_callback_t encoder_callback; #endif @@ -600,6 +603,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 1e3c46218..47814e9b4 100644 --- a/include/call_interfaces.h +++ b/include/call_interfaces.h @@ -75,6 +75,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 e0fcd0477..13e0b152f 100755 --- a/t/auto-daemon-tests.pl +++ b/t/auto-daemon-tests.pl @@ -19010,6 +19010,7 @@ offer('plain SDP, no ICE', { ICE => 'remove' }, < 'default' }, < 'optional' }, <