From 9e7788ad21e83d7eb2581b899e568e4e01429b25 Mon Sep 17 00:00:00 2001 From: Martin Tomec Date: Wed, 25 Jun 2025 15:20:17 +0200 Subject: [PATCH] chan_pjsip.c: Change SSRC after media source change 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 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 1582fb83d7..c7a2d6c28c 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -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) { -- 2.47.2