diff options
author | Matt Jordan <mjordan@digium.com> | 2015-08-29 12:30:50 -0500 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2015-08-29 12:30:50 -0500 |
commit | 545795ae0dba6fdc81d3b54e435b5fad528f5add (patch) | |
tree | 23b4807d46acc104d5d1fef60f1018fe9bb5e11e | |
parent | 85e1cb51b21c2d194647e16b81b5a1344d2ff911 (diff) | |
parent | 1b1561f4c854c37691bd24227b8f722d1dac4291 (diff) |
Merge "res_pjsip_sdp_rtp: Fix multiple keepalive scheduled items." into 13
-rw-r--r-- | include/asterisk/res_pjsip_session.h | 6 | ||||
-rw-r--r-- | res/res_pjsip_sdp_rtp.c | 19 | ||||
-rw-r--r-- | res/res_pjsip_session.c | 7 |
3 files changed, 29 insertions, 3 deletions
diff --git a/include/asterisk/res_pjsip_session.h b/include/asterisk/res_pjsip_session.h index 2893f66ab..ddc87b024 100644 --- a/include/asterisk/res_pjsip_session.h +++ b/include/asterisk/res_pjsip_session.h @@ -355,6 +355,12 @@ struct ast_sip_session_sdp_handler { int (*apply_negotiated_sdp_stream)(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_session *local, const struct pjmedia_sdp_media *local_stream, const struct pjmedia_sdp_session *remote, const struct pjmedia_sdp_media *remote_stream); /*! + * \brief Stop a session_media created by this handler but do not destroy resources + * \param session The session for which media is being stopped + * \param session_media The media to destroy + */ + void (*stream_stop)(struct ast_sip_session_media *session_media); + /*! * \brief Destroy a session_media created by this handler * \param session The session for which media is being destroyed * \param session_media The media to destroy diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c index f6c300f1f..df2820479 100644 --- a/res/res_pjsip_sdp_rtp.c +++ b/res/res_pjsip_sdp_rtp.c @@ -1307,6 +1307,7 @@ static int apply_negotiated_sdp_stream(struct ast_sip_session *session, struct a * a NAT. This way there won't be an awkward delay before media starts flowing in some * scenarios. */ + AST_SCHED_DEL(sched, session_media->keepalive_sched_id); session_media->keepalive_sched_id = ast_sched_add_variable(sched, 500, send_keepalive, session_media, 1); } @@ -1358,13 +1359,23 @@ static void change_outgoing_sdp_stream_media_address(pjsip_tx_data *tdata, struc pj_strdup2(tdata->pool, &stream->conn->addr, transport->external_media_address); } +/*! \brief Function which stops the RTP instance */ +static void stream_stop(struct ast_sip_session_media *session_media) +{ + if (!session_media->rtp) { + return; + } + + AST_SCHED_DEL(sched, session_media->keepalive_sched_id); + AST_SCHED_DEL(sched, session_media->timeout_sched_id); + ast_rtp_instance_stop(session_media->rtp); +} + /*! \brief Function which destroys the RTP instance when session ends */ static void stream_destroy(struct ast_sip_session_media *session_media) { if (session_media->rtp) { - AST_SCHED_DEL(sched, session_media->keepalive_sched_id); - AST_SCHED_DEL(sched, session_media->timeout_sched_id); - ast_rtp_instance_stop(session_media->rtp); + stream_stop(session_media); ast_rtp_instance_destroy(session_media->rtp); } session_media->rtp = NULL; @@ -1377,6 +1388,7 @@ static struct ast_sip_session_sdp_handler audio_sdp_handler = { .create_outgoing_sdp_stream = create_outgoing_sdp_stream, .apply_negotiated_sdp_stream = apply_negotiated_sdp_stream, .change_outgoing_sdp_stream_media_address = change_outgoing_sdp_stream_media_address, + .stream_stop = stream_stop, .stream_destroy = stream_destroy, }; @@ -1387,6 +1399,7 @@ static struct ast_sip_session_sdp_handler video_sdp_handler = { .create_outgoing_sdp_stream = create_outgoing_sdp_stream, .apply_negotiated_sdp_stream = apply_negotiated_sdp_stream, .change_outgoing_sdp_stream_media_address = change_outgoing_sdp_stream_media_address, + .stream_stop = stream_stop, .stream_destroy = stream_destroy, }; diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index 16ac640d9..16ed38dd0 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -362,6 +362,13 @@ static int handle_negotiated_sdp_session_media(void *obj, void *arg, int flags) } } } + + if (session_media->handler && session_media->handler->stream_stop) { + ast_debug(1, "Stopping SDP media stream '%s' as it is not currently negotiated\n", + session_media->stream_type); + session_media->handler->stream_stop(session_media); + } + return CMP_MATCH; } |