From 00c6dfb204c0d591a8ded48d3c23ec2a9d54b50e Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 7 Jun 2021 13:06:51 -0400 Subject: [PATCH] TT#91151 add function to create synthetic SDP Change-Id: I7c4698a61c380efc8043444e255f8d5a1c7f0c6d --- daemon/sdp.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++- include/call.h | 1 + include/sdp.h | 1 + 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/daemon/sdp.c b/daemon/sdp.c index 51bc6ede3..3c0131fc4 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -1798,7 +1798,7 @@ static int print_format_str(GString *s, struct call_media *cm) { } static int print_codec_list(GString *s, struct call_media *media) { - if (proto_is_not_rtp(media->protocol)) + if (!proto_is_rtp(media->protocol)) return print_format_str(s, media); if (media->codecs.codec_prefs.length == 0) @@ -2754,6 +2754,69 @@ error: return -1; } +int sdp_create(str *out, struct call_monologue *monologue, struct sdp_ng_flags *flags) { + if (!monologue->medias.length) + return -1; // need at least one media + + // grab first components + struct call_media *media = monologue->medias.head->data; + if (!media->streams.length) + return -1; + struct packet_stream *first_ps = media->streams.head->data; + if (!first_ps->selected_sfd) + return -1; + + GString *s = g_string_new("v=0\r\no=- "); + + // init session params + if (!monologue->sdp_session_id) + monologue->sdp_session_id = (unsigned long long) rtpe_now.tv_sec << 32 | rtpe_now.tv_usec; + if (!monologue->sdp_version) + monologue->sdp_version = monologue->sdp_session_id; + + g_string_append_printf(s, "%llu %llu %s %s\r\n", monologue->sdp_session_id, monologue->sdp_version, + first_ps->selected_sfd->local_intf->advertised_address.addr.family->rfc_name, + sockaddr_print_buf(&first_ps->selected_sfd->local_intf->advertised_address.addr)); + + g_string_append_printf(s, "s=%s\r\n", rtpe_config.software_id); + g_string_append(s, "t=0 0\r\n"); + + for (GList *l = monologue->medias.head; l; l = l->next) { + media = l->data; + if (!media->streams.length) + goto err; + GList *rtp_ps_link = media->streams.head; + struct packet_stream *rtp_ps = rtp_ps_link->data; + if (!rtp_ps->selected_sfd) + goto err; + if (media->protocol) + g_string_append_printf(s, "m=" STR_FORMAT " %i %s", + STR_FMT(&media->type), + rtp_ps->selected_sfd->socket.local.port, + media->protocol->name); + else if (media->protocol_str.s) + g_string_append_printf(s, "m=" STR_FORMAT " %i " STR_FORMAT, + STR_FMT(&media->type), + rtp_ps->selected_sfd->socket.local.port, + STR_FMT(&media->protocol_str)); + else + goto err; + print_codec_list(s, media); + g_string_append_printf(s, "\r\nc=%s %s\r\n", + rtp_ps->selected_sfd->local_intf->advertised_address.addr.family->rfc_name, + sockaddr_print_buf(&rtp_ps->selected_sfd->local_intf->advertised_address.addr)); + print_sdp_media_section(s, media, NULL, flags, rtp_ps_link, true, false); + } + + out->s = s->str; + out->len = s->len; + g_string_free(s, FALSE); + return 0; +err: + g_string_free(s, TRUE); + return -1; +} + int sdp_is_duplicate(GQueue *sessions) { for (GList *l = sessions->head; l; l = l->next) { struct sdp_session *s = l->data; diff --git a/include/call.h b/include/call.h index 536be8e0b..0e5bde6ba 100644 --- a/include/call.h +++ b/include/call.h @@ -404,6 +404,7 @@ struct call_monologue { GQueue medias; GHashTable *media_ids; struct media_player *player; + unsigned long long sdp_session_id; unsigned long long sdp_version; str last_in_sdp; GQueue last_in_sdp_parsed; diff --git a/include/sdp.h b/include/sdp.h index ee1f5cd41..e5ac63fd6 100644 --- a/include/sdp.h +++ b/include/sdp.h @@ -24,6 +24,7 @@ void sdp_streams_free(GQueue *); void sdp_free(GQueue *sessions); int sdp_replace(struct sdp_chopper *, GQueue *, struct call_monologue *, struct sdp_ng_flags *); int sdp_is_duplicate(GQueue *sessions); +int sdp_create(str *out, struct call_monologue *, struct sdp_ng_flags *flags); struct sdp_chopper *sdp_chopper_new(str *input); void sdp_chopper_destroy(struct sdp_chopper *chop);