fix ICE priority calculation

pull/6/head
Richard Fuchs 11 years ago
parent 6c1cb067c3
commit 09b9303eac

@ -1437,20 +1437,24 @@ strip:
return 0; return 0;
} }
static unsigned long prio_calc(unsigned int pref) { INLINE unsigned long prio_calc(unsigned int pref, unsigned int tpref) {
return (1 << 24) * 126 + (1 << 8) * pref + 256 * 1; return (1 << 24) * tpref + (1 << 8) * pref + 256 * 1;
} }
static unsigned long new_priority(struct sdp_media *media) { static unsigned long new_priority(struct sdp_media *media, int relay) {
int id; int id;
GQueue *cands; GQueue *cands;
unsigned int pref; int pref;
unsigned long prio; unsigned long prio, tpref;
GList *l; GList *l;
struct sdp_attribute *a;
struct attribute_candidate *c; struct attribute_candidate *c;
tpref = 126;
if (relay)
tpref = 0;
pref = 65535; pref = 65535;
prio = prio_calc(pref); prio = prio_calc(pref, tpref);
if (!media) if (!media)
goto out; goto out;
@ -1461,10 +1465,11 @@ static unsigned long new_priority(struct sdp_media *media) {
goto out; goto out;
for (l = cands->head; l; l = l->next) { for (l = cands->head; l; l = l->next) {
c = l->data; a = l->data;
while (c->priority >= prio) { c = &a->u.candidate;
while (c->priority >= prio && pref >= 1) {
pref--; pref--;
prio = prio_calc(pref); prio = prio_calc(pref, tpref);
} }
} }
@ -1773,7 +1778,10 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
} }
if (!flags->ice_remove) { if (!flags->ice_remove) {
priority = new_priority(flags->ice_force ? NULL : sdp_media); priority = new_priority(
(flags->ice_force || flags->ice_force_relay) ? NULL : sdp_media,
flags->ice_force_relay
);
insert_candidates(chop, ps, ps_rtcp, insert_candidates(chop, ps, ps_rtcp,
priority, sdp_media, flags->ice_force_relay); priority, sdp_media, flags->ice_force_relay);

Loading…
Cancel
Save