|
|
|
@ -153,6 +153,11 @@ static str ice_foundation_str_alt; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static inline struct sdp_attribute *attr_get_by_id(struct sdp_attributes *a, int id) { |
|
|
|
return g_hash_table_lookup(a->id_hash, &id); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* hack hack */ |
|
|
|
static inline int inet_pton_str(int af, str *src, void *dst) { |
|
|
|
char *s = src->s; |
|
|
|
@ -764,7 +769,7 @@ int sdp_streams(const GQueue *sessions, GQueue *streams, GHashTable *streamhash, |
|
|
|
struct stream_input *si; |
|
|
|
GList *l, *k; |
|
|
|
const char *errstr; |
|
|
|
int i, num, id; |
|
|
|
int i, num; |
|
|
|
struct sdp_attribute *attr; |
|
|
|
enum transport_protocol tp; |
|
|
|
struct crypto_context cctx; |
|
|
|
@ -778,8 +783,7 @@ int sdp_streams(const GQueue *sessions, GQueue *streams, GHashTable *streamhash, |
|
|
|
tp = transport_protocol(&media->transport); |
|
|
|
|
|
|
|
ZERO(cctx); |
|
|
|
id = ATTR_CRYPTO; |
|
|
|
attr = g_hash_table_lookup(media->attributes.id_hash, &id); |
|
|
|
attr = attr_get_by_id(&media->attributes, ATTR_CRYPTO); |
|
|
|
if (attr) { |
|
|
|
cctx.crypto_suite = attr->u.crypto.crypto_suite; |
|
|
|
cctx.mki = attr->u.crypto.mki; |
|
|
|
@ -817,8 +821,7 @@ int sdp_streams(const GQueue *sessions, GQueue *streams, GHashTable *streamhash, |
|
|
|
|
|
|
|
if (!si || media->port_count != 1) |
|
|
|
continue; |
|
|
|
id = ATTR_RTCP; |
|
|
|
attr = g_hash_table_lookup(media->attributes.id_hash, &id); |
|
|
|
attr = attr_get_by_id(&media->attributes, ATTR_RTCP); |
|
|
|
if (!attr || !attr->u.rtcp.port_num) |
|
|
|
continue; |
|
|
|
if (attr->u.rtcp.port_num == si->stream.port + 1) |
|
|
|
@ -1257,20 +1260,17 @@ static int has_ice(GQueue *sessions) { |
|
|
|
GList *l, *m; |
|
|
|
struct sdp_session *session; |
|
|
|
struct sdp_media *media; |
|
|
|
int id; |
|
|
|
|
|
|
|
id = ATTR_ICE_UFRAG; |
|
|
|
|
|
|
|
for (l = sessions->head; l; l = l->next) { |
|
|
|
session = l->data; |
|
|
|
|
|
|
|
if (g_hash_table_lookup(session->attributes.id_hash, &id)) |
|
|
|
if (attr_get_by_id(&session->attributes, ATTR_ICE_UFRAG)) |
|
|
|
return 1; |
|
|
|
|
|
|
|
for (m = session->media_streams.head; m; m = m->next) { |
|
|
|
media = m->data; |
|
|
|
|
|
|
|
if (g_hash_table_lookup(media->attributes.id_hash, &id)) |
|
|
|
if (attr_get_by_id(&media->attributes, ATTR_ICE_UFRAG)) |
|
|
|
return 1; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -1282,7 +1282,6 @@ static int generate_crypto(struct sdp_media *media, struct sdp_ng_flags *flags, |
|
|
|
struct streamrelay *rtp, struct streamrelay *rtcp, |
|
|
|
struct sdp_chopper *chop) |
|
|
|
{ |
|
|
|
int id; |
|
|
|
struct crypto_context *c, *src = NULL; |
|
|
|
char b64_buf[64]; |
|
|
|
char *p; |
|
|
|
@ -1292,8 +1291,7 @@ static int generate_crypto(struct sdp_media *media, struct sdp_ng_flags *flags, |
|
|
|
&& flags->transport_protocol != PROTO_RTP_SAVPF) |
|
|
|
return 0; |
|
|
|
|
|
|
|
id = ATTR_CRYPTO; |
|
|
|
if (g_hash_table_lookup(media->attributes.id_hash, &id)) { |
|
|
|
if (attr_get_by_id(&media->attributes, ATTR_CRYPTO)) { |
|
|
|
/* SRTP <> SRTP case, copy from other stream |
|
|
|
* and leave SDP untouched */ |
|
|
|
src = &rtp->other->crypto.in; |
|
|
|
|