mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-30 02:26:23 +00:00
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:
@@ -1994,6 +1994,19 @@ int bridge_channel_internal_push(struct ast_bridge_channel *bridge_channel)
|
|||||||
bridge->uniqueid, bridge_channel, ast_channel_name(bridge_channel->chan));
|
bridge->uniqueid, bridge_channel, ast_channel_name(bridge_channel->chan));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (swap) {
|
||||||
|
int dissolve = ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_DISSOLVE_EMPTY);
|
||||||
|
|
||||||
|
/* This flag is cleared so the act of this channel leaving does not cause it to dissolve if need be */
|
||||||
|
ast_clear_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_DISSOLVE_EMPTY);
|
||||||
|
|
||||||
|
ast_bridge_channel_leave_bridge(swap, BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, 0);
|
||||||
|
bridge_channel_internal_pull(swap);
|
||||||
|
|
||||||
|
ast_set2_flag(&bridge->feature_flags, dissolve, AST_BRIDGE_FLAG_DISSOLVE_EMPTY);
|
||||||
|
}
|
||||||
|
|
||||||
bridge_channel->in_bridge = 1;
|
bridge_channel->in_bridge = 1;
|
||||||
bridge_channel->just_joined = 1;
|
bridge_channel->just_joined = 1;
|
||||||
AST_LIST_INSERT_TAIL(&bridge->channels, bridge_channel, entry);
|
AST_LIST_INSERT_TAIL(&bridge->channels, bridge_channel, entry);
|
||||||
@@ -2015,10 +2028,6 @@ int bridge_channel_internal_push(struct ast_bridge_channel *bridge_channel)
|
|||||||
bridge->uniqueid);
|
bridge->uniqueid);
|
||||||
|
|
||||||
ast_bridge_publish_enter(bridge, bridge_channel->chan, swap ? swap->chan : NULL);
|
ast_bridge_publish_enter(bridge, bridge_channel->chan, swap ? swap->chan : NULL);
|
||||||
if (swap) {
|
|
||||||
ast_bridge_channel_leave_bridge(swap, BRIDGE_CHANNEL_STATE_END_NO_DISSOLVE, 0);
|
|
||||||
bridge_channel_internal_pull(swap);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clear any BLINDTRANSFER and ATTENDEDTRANSFER since the transfer has completed. */
|
/* Clear any BLINDTRANSFER and ATTENDEDTRANSFER since the transfer has completed. */
|
||||||
pbx_builtin_setvar_helper(bridge_channel->chan, "BLINDTRANSFER", NULL);
|
pbx_builtin_setvar_helper(bridge_channel->chan, "BLINDTRANSFER", NULL);
|
||||||
|
@@ -1179,6 +1179,10 @@ static int apply_negotiated_sdp_stream(struct ast_sip_session *session, struct a
|
|||||||
|
|
||||||
/* audio stream handles music on hold */
|
/* audio stream handles music on hold */
|
||||||
if (media_type != AST_MEDIA_TYPE_AUDIO) {
|
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;
|
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_unhold(session->channel);
|
||||||
ast_queue_frame(session->channel, &ast_null_frame);
|
ast_queue_frame(session->channel, &ast_null_frame);
|
||||||
session_media->held = 0;
|
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 */
|
/* This purposely resets the encryption to the configured in case it gets added later */
|
||||||
|
Reference in New Issue
Block a user