|
|
@ -119,6 +119,7 @@ struct sdp_attribute { |
|
|
param; /* "PCMA/8000" */ |
|
|
param; /* "PCMA/8000" */ |
|
|
|
|
|
|
|
|
enum { |
|
|
enum { |
|
|
|
|
|
ATTR_INVALID = -1, |
|
|
ATTR_OTHER = 0, |
|
|
ATTR_OTHER = 0, |
|
|
ATTR_RTCP, |
|
|
ATTR_RTCP, |
|
|
ATTR_CANDIDATE, |
|
|
ATTR_CANDIDATE, |
|
|
@ -445,6 +446,8 @@ static int parse_attribute_candidate(struct sdp_attribute *output) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void parse_attribute(struct sdp_attribute *a) { |
|
|
static void parse_attribute(struct sdp_attribute *a) { |
|
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
a->name = a->line_value; |
|
|
a->name = a->line_value; |
|
|
str_chr_str(&a->value, &a->name, ':'); |
|
|
str_chr_str(&a->value, &a->name, ':'); |
|
|
if (a->value.s) { |
|
|
if (a->value.s) { |
|
|
@ -468,18 +471,17 @@ static void parse_attribute(struct sdp_attribute *a) { |
|
|
a->key.len += 1 + a->value.len; |
|
|
a->key.len += 1 + a->value.len; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/* XXX add error handling */ |
|
|
|
|
|
|
|
|
ret = 0; |
|
|
switch (a->name.len) { |
|
|
switch (a->name.len) { |
|
|
case 4: |
|
|
case 4: |
|
|
if (!str_cmp(&a->name, "rtcp")) |
|
|
if (!str_cmp(&a->name, "rtcp")) |
|
|
parse_attribute_rtcp(a); |
|
|
|
|
|
|
|
|
ret = parse_attribute_rtcp(a); |
|
|
else if (!str_cmp(&a->name, "ssrc")) |
|
|
else if (!str_cmp(&a->name, "ssrc")) |
|
|
parse_attribute_ssrc(a); |
|
|
|
|
|
; |
|
|
|
|
|
|
|
|
ret = parse_attribute_ssrc(a); |
|
|
break; |
|
|
break; |
|
|
case 6: |
|
|
case 6: |
|
|
if (!str_cmp(&a->name, "crypto")) |
|
|
if (!str_cmp(&a->name, "crypto")) |
|
|
parse_attribute_crypto(a); |
|
|
|
|
|
|
|
|
ret = parse_attribute_crypto(a); |
|
|
break; |
|
|
break; |
|
|
case 7: |
|
|
case 7: |
|
|
if (!str_cmp(&a->name, "ice-pwd")) |
|
|
if (!str_cmp(&a->name, "ice-pwd")) |
|
|
@ -491,7 +493,7 @@ static void parse_attribute(struct sdp_attribute *a) { |
|
|
break; |
|
|
break; |
|
|
case 9: |
|
|
case 9: |
|
|
if (!str_cmp(&a->name, "candidate")) |
|
|
if (!str_cmp(&a->name, "candidate")) |
|
|
parse_attribute_candidate(a); |
|
|
|
|
|
|
|
|
ret = parse_attribute_candidate(a); |
|
|
else if (!str_cmp(&a->name, "ice-ufrag")) |
|
|
else if (!str_cmp(&a->name, "ice-ufrag")) |
|
|
a->attr = ATTR_ICE; |
|
|
a->attr = ATTR_ICE; |
|
|
break; |
|
|
break; |
|
|
@ -508,6 +510,9 @@ static void parse_attribute(struct sdp_attribute *a) { |
|
|
a->attr = ATTR_ICE; |
|
|
a->attr = ATTR_ICE; |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (ret) |
|
|
|
|
|
a->attr = ATTR_INVALID; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int sdp_parse(str *body, GQueue *sessions) { |
|
|
int sdp_parse(str *body, GQueue *sessions) { |
|
|
|