res_rtp_asterisk: Allow remote SSRC to change on an RTP instance.

When SDP renegotiation occurs it is possible for an RTP
instance to be reused for a new stream, resulting in the remote
SSRC changing if it is part of a bundle group. This change
allows this and updates its mapping in the current bundle
group.

ASTERISK-27231

Change-Id: I6e3703974f236bc024c5dbe9bd43adae0c6fb490
This commit is contained in:
Joshua Colp
2017-08-30 12:28:58 +00:00
parent 36c1513148
commit 5ba82cedc6

View File

@@ -6173,10 +6173,35 @@ static void ast_rtp_set_remote_ssrc(struct ast_rtp_instance *instance, unsigned
{
struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
if (rtp->themssrc) {
if (rtp->themssrc == ssrc) {
return;
}
/* If this is bundled we need to update the SSRC mapping */
if (rtp->bundled) {
struct ast_rtp *bundled_rtp;
int index;
ao2_unlock(instance);
/* The child lock can't be held while accessing the parent */
ao2_lock(rtp->bundled);
bundled_rtp = ast_rtp_instance_get_data(rtp->bundled);
for (index = 0; index < AST_VECTOR_SIZE(&bundled_rtp->ssrc_mapping); ++index) {
struct rtp_ssrc_mapping *mapping = AST_VECTOR_GET_ADDR(&bundled_rtp->ssrc_mapping, index);
if (mapping->ssrc == rtp->themssrc) {
mapping->ssrc = ssrc;
break;
}
}
ao2_unlock(rtp->bundled);
ao2_lock(instance);
}
rtp->themssrc = ssrc;
}