sdp_streams() initial implementation

remotes/origin/HEAD
Richard Fuchs 12 years ago
parent f6a336ce89
commit ccfa304354

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

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

@ -4,6 +4,7 @@
#include <glib.h>
int sdp_parse(const char *body, int len, GQueue *sessions);
int sdp_streams(const GQueue *sessions, GQueue *streams);
void sdp_free(GQueue *sessions);
#endif

Loading…
Cancel
Save