]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_rtp_asterisk: Allow remote SSRC to change on an RTP instance.
authorJoshua Colp <jcolp@digium.com>
Wed, 30 Aug 2017 12:28:58 +0000 (12:28 +0000)
committerJoshua Colp <jcolp@digium.com>
Wed, 30 Aug 2017 14:18:40 +0000 (09:18 -0500)
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

res/res_rtp_asterisk.c

index 0f4f6abdafc3bc6b8e799fa311491043478993cc..ab80384220950f3659ffe706af0b57da6507fd5e 100644 (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;
 }