|
|
|
|
@ -1892,8 +1892,11 @@ static int __num_media_streams(struct call_media *media, unsigned int num_ports)
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void __fill_stream(struct packet_stream *ps, const struct endpoint *epp, unsigned int port_off) {
|
|
|
|
|
static void __fill_stream(struct packet_stream *ps, const struct endpoint *epp, unsigned int port_off,
|
|
|
|
|
const struct stream_params *sp)
|
|
|
|
|
{
|
|
|
|
|
struct endpoint ep;
|
|
|
|
|
struct call_media *media = ps->media;
|
|
|
|
|
|
|
|
|
|
ep = *epp;
|
|
|
|
|
ep.port += port_off;
|
|
|
|
|
@ -1902,9 +1905,15 @@ static void __fill_stream(struct packet_stream *ps, const struct endpoint *epp,
|
|
|
|
|
if (PS_ISSET(ps, FILLED) && !memcmp(&ps->advertised_endpoint, &ep, sizeof(ep)))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
ps->endpoint = ep;
|
|
|
|
|
ps->advertised_endpoint = ep;
|
|
|
|
|
|
|
|
|
|
/* ignore endpoint changes if we're ICE-enabled and ICE data hasn't changed */
|
|
|
|
|
if (PS_ISSET(ps, FILLED) && MEDIA_ISSET(media, ICE) && media->ice_agent && sp
|
|
|
|
|
&& !ice_ufrag_cmp(media->ice_agent, &sp->ice_ufrag))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
ps->endpoint = ep;
|
|
|
|
|
|
|
|
|
|
if (PS_ISSET(ps, FILLED)) {
|
|
|
|
|
/* we reset crypto params whenever the endpoint changes */
|
|
|
|
|
crypto_reset(&ps->crypto);
|
|
|
|
|
@ -2020,7 +2029,7 @@ static int __init_streams(struct call_media *A, struct call_media *B, const stru
|
|
|
|
|
__rtp_stats_update(a->rtp_stats, A->rtp_payload_types);
|
|
|
|
|
|
|
|
|
|
if (sp) {
|
|
|
|
|
__fill_stream(a, &sp->rtp_endpoint, port_off);
|
|
|
|
|
__fill_stream(a, &sp->rtp_endpoint, port_off, sp);
|
|
|
|
|
bf_copy_same(&a->ps_flags, &sp->sp_flags,
|
|
|
|
|
SHARED_FLAG_STRICT_SOURCE | SHARED_FLAG_MEDIA_HANDOVER);
|
|
|
|
|
}
|
|
|
|
|
@ -2065,11 +2074,11 @@ static int __init_streams(struct call_media *A, struct call_media *B, const stru
|
|
|
|
|
|
|
|
|
|
if (sp) {
|
|
|
|
|
if (!SP_ISSET(sp, IMPLICIT_RTCP)) {
|
|
|
|
|
__fill_stream(a, &sp->rtcp_endpoint, port_off);
|
|
|
|
|
__fill_stream(a, &sp->rtcp_endpoint, port_off, sp);
|
|
|
|
|
PS_CLEAR(a, IMPLICIT_RTCP);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
__fill_stream(a, &sp->rtp_endpoint, port_off + 1);
|
|
|
|
|
__fill_stream(a, &sp->rtp_endpoint, port_off + 1, sp);
|
|
|
|
|
PS_SET(a, IMPLICIT_RTCP);
|
|
|
|
|
}
|
|
|
|
|
bf_copy_same(&a->ps_flags, &sp->sp_flags,
|
|
|
|
|
|