TT#91151 add function to create synthetic SDP

Change-Id: I7c4698a61c380efc8043444e255f8d5a1c7f0c6d
pull/1295/head
Richard Fuchs 4 years ago
parent ffaed806c3
commit 00c6dfb204

@ -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;

@ -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;

@ -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);

Loading…
Cancel
Save