]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_pjsip.c: Change SSRC after media source change
authorMartin Tomec <tomec@ipex.cz>
Wed, 25 Jun 2025 13:20:17 +0000 (15:20 +0200)
committerAsterisk Development Team <asteriskteam@digium.com>
Wed, 10 Sep 2025 19:52:59 +0000 (19:52 +0000)
When the RTP media source changes, such as after a blind transfer, the new source introduces a discontinuous timestamp. According to RFC 3550, Section 5.1, an RTP stream's timestamp for a given SSRC must increment monotonically and linearly.
To comply with the standard and avoid a large timestamp jump on the existing SSRC, a new SSRC is generated for the new media stream.
This change resolves known interoperability issues with certain SBCs (like Sonus/Ribbon) that stop forwarding media when they detect such a timestamp violation. This code uses the existing implementation from chan_sip.

Resolves: #927
(cherry picked from commit 5946bc63633638cc92952bcb05ae0b22305017c1)

channels/chan_pjsip.c

index 8f5f1ee9790aac28d48e855141603e7a3ea735d9..db52168603526f9211d718b4a1328a52a1e987f6 100644 (file)
@@ -1820,6 +1820,14 @@ static int chan_pjsip_indicate(struct ast_channel *ast, int condition, const voi
        case AST_CONTROL_SRCUPDATE:
                break;
        case AST_CONTROL_SRCCHANGE:
+               /* Generate a new SSRC due to media source change and RTP timestamp reset.
+                  Ensures RFC 3550 compliance and avoids SBC interoperability issues (Sonus/Ribbon)*/
+               for (i = 0; i < AST_VECTOR_SIZE(&channel->session->active_media_state->sessions); ++i) {
+                       media = AST_VECTOR_GET(&channel->session->active_media_state->sessions, i);
+                       if (media && media->rtp) {
+                               ast_rtp_instance_change_source(media->rtp);
+                       }
+               }
                break;
        case AST_CONTROL_REDIRECTING:
                if (ast_channel_state(ast) != AST_STATE_UP) {