diff options
author | Joshua Colp <jcolp@digium.com> | 2017-09-16 11:19:59 -0300 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2017-09-21 12:20:02 -0500 |
commit | f2985e310663b67ccc948515efeae500bdf94a0c (patch) | |
tree | 311acb73d162a6611503b0e859b4576f7b6426d8 /res/res_pjsip_session.c | |
parent | 5ff46578aa20921cf3649809a9be9b7231acc507 (diff) |
bridge: Change participant SFU streams when source streams change.
Some endpoints do not like a stream being reused for a new
media stream. The frame/jitterbuffer can rely on underlying
attributes of the media stream in order to order the packets.
When a new stream takes its place without any notice the
buffer can get confused and the media ends up getting dropped.
This change uses the SSRC change to determine that a new source
is reusing an existing stream and then bridge_softmix renegotiates
each participant such that they see a new media stream. This
causes the frame/jitterbuffer to start fresh and work as expected.
ASTERISK-27277
Change-Id: I30ccbdba16ca073d7f31e0e59ab778c153afae07
Diffstat (limited to 'res/res_pjsip_session.c')
-rw-r--r-- | res/res_pjsip_session.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index 64416a063..4b3bdb812 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -765,6 +765,7 @@ static int handle_negotiated_sdp(struct ast_sip_session *session, const pjmedia_ { int i; struct ast_stream_topology *topology; + unsigned int changed = 0; for (i = 0; i < local->media_count; ++i) { struct ast_sip_session_media *session_media; @@ -802,6 +803,9 @@ static int handle_negotiated_sdp(struct ast_sip_session *session, const pjmedia_ if (handle_negotiated_sdp_session_media(session_media, session, local, remote, i, stream)) { return -1; } + + changed |= session_media->changed; + session_media->changed = 0; } /* Apply the pending media state to the channel and make it active */ @@ -858,7 +862,13 @@ static int handle_negotiated_sdp(struct ast_sip_session *session, const pjmedia_ ast_channel_unlock(session->channel); - ast_queue_frame(session->channel, &ast_null_frame); + if (changed) { + struct ast_frame f = { AST_FRAME_CONTROL, .subclass.integer = AST_CONTROL_STREAM_TOPOLOGY_SOURCE_CHANGED }; + + ast_queue_frame(session->channel, &f); + } else { + ast_queue_frame(session->channel, &ast_null_frame); + } return 0; } |