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
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) {