]> 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)
committergithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Thu, 10 Jul 2025 14:49:00 +0000 (14:49 +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

channels/chan_pjsip.c

index 1582fb83d72f745219592d44ab459ffbd5081c67..c7a2d6c28c8316214a2e8eebf1e2edbcbb8b2bc5 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) {