summaryrefslogtreecommitdiff
path: root/res/res_pjsip_session.c
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2017-09-16 11:19:59 -0300
committerJoshua Colp <jcolp@digium.com>2017-09-21 12:20:02 -0500
commitf2985e310663b67ccc948515efeae500bdf94a0c (patch)
tree311acb73d162a6611503b0e859b4576f7b6426d8 /res/res_pjsip_session.c
parent5ff46578aa20921cf3649809a9be9b7231acc507 (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.c12
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;
}