bridge / res_pjsip_sdp_rtp: Fix issues with media not being reinvited during direct media.

This change fixes two issues:

1. During a swap operation bridging added the new channel before having the swap channel
leave. This was not handled in bridge_native_rtp and could result in a channel not getting
reinvited back to Asterisk. After this change the swap channel will leave first and the
new channel will then join.

2. If a re-invite was received after a session had been established any upstream elements
(such as bridge_native_rtp) were not notified that they may want to re-evaluate things.
After this change an UPDATE_RTP_PEER control frame is queued when this situation occurs
and upstream can react.

AST-1524 #close

Review: https://reviewboard.asterisk.org/r/4378/


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@431157 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Joshua Colp
2015-01-27 17:32:36 +00:00
parent a620b287bd
commit b64f4bb6ee
2 changed files with 20 additions and 4 deletions

View File

@@ -1179,6 +1179,10 @@ static int apply_negotiated_sdp_stream(struct ast_sip_session *session, struct a
/* audio stream handles music on hold */
if (media_type != AST_MEDIA_TYPE_AUDIO) {
if ((pjmedia_sdp_neg_was_answer_remote(session->inv_session->neg) == PJ_FALSE)
&& (session->inv_session->state == PJSIP_INV_STATE_CONFIRMED)) {
ast_queue_control(session->channel, AST_CONTROL_UPDATE_RTP_PEER);
}
return 1;
}
@@ -1198,6 +1202,9 @@ static int apply_negotiated_sdp_stream(struct ast_sip_session *session, struct a
ast_queue_unhold(session->channel);
ast_queue_frame(session->channel, &ast_null_frame);
session_media->held = 0;
} else if ((pjmedia_sdp_neg_was_answer_remote(session->inv_session->neg) == PJ_FALSE)
&& (session->inv_session->state == PJSIP_INV_STATE_CONFIRMED)) {
ast_queue_control(session->channel, AST_CONTROL_UPDATE_RTP_PEER);
}
/* This purposely resets the encryption to the configured in case it gets added later */