From ccfa304354ed85e6aa181a70146bebca1e55a96d Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 23 Jan 2013 15:22:02 -0500 Subject: [PATCH] sdp_streams() initial implementation --- daemon/call.c | 11 +++++++++-- daemon/sdp.c | 39 +++++++++++++++++++++++++++++++++++++++ daemon/sdp.h | 1 + 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index 0c57aaf..92c1e73 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2114,7 +2114,7 @@ struct callstream *callstream_new(struct call *ca, int num) { const char *call_offer(bencode_item_t *input, struct callmaster *m, bencode_item_t *output) { - const char *sdp; + const char *sdp, *errstr; int sdp_len; GQueue parsed = G_QUEUE_INIT; GQueue streams = G_QUEUE_INIT; @@ -2126,9 +2126,16 @@ const char *call_offer(bencode_item_t *input, struct callmaster *m, bencode_item if (sdp_parse(sdp, sdp_len, &parsed)) return "Failed to parse SDP"; + errstr = "Incomplete SDP specification"; + if (sdp_streams(&parsed, &streams)) + goto out; + + errstr = NULL; +out: sdp_free(&parsed); + streams_free(&streams); - return NULL; + return errstr; } const char *call_answer(bencode_item_t *input, struct callmaster *m, bencode_item_t *output) { diff --git a/daemon/sdp.c b/daemon/sdp.c index df8e00b..55638b9 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -298,3 +298,42 @@ void sdp_free(GQueue *sessions) { g_slice_free1(sizeof(*session), session); } } + +int sdp_streams(const GQueue *sessions, GQueue *streams) { + struct sdp_session *session; + struct sdp_media *media; + struct stream *stream; + GList *l, *k; + const char *errstr; + int i, num; + + num = 0; + for (l = sessions->head; l; l = l->next) { + session = l->data; + + for (k = session->media_streams.head; k; k = k->next) { + media = k->data; + + for (i = 0; i < media->port_count; i++) { + stream = g_slice_alloc0(sizeof(*stream)); + + errstr = "No address info found for stream"; + if (media->connection.parsed) + stream->ip46 = media->connection.address.parsed; + else if (session->connection.parsed) + stream->ip46 = session->connection.address.parsed; + else + goto error; + + stream->port = (media->port_num + (i * 2)) & 0xffff; + stream->num = ++num; + } + } + } + + return 0; + +error: + mylog(LOG_WARNING, "Failed to extract streams from SDP: %s", errstr); + return -1; +} diff --git a/daemon/sdp.h b/daemon/sdp.h index 434b611..42bf995 100644 --- a/daemon/sdp.h +++ b/daemon/sdp.h @@ -4,6 +4,7 @@ #include int sdp_parse(const char *body, int len, GQueue *sessions); +int sdp_streams(const GQueue *sessions, GQueue *streams); void sdp_free(GQueue *sessions); #endif