if (topology) {
ast_channel_set_stream_topology(session->channel, topology);
/* If this is a remotely done renegotiation that has changed the stream topology notify what is
- * currently handling this channel.
+ * currently handling this channel. Note that fax uses its own process, so if we are transitioning
+ * between audio and fax or vice versa we don't notify.
*/
if (pjmedia_sdp_neg_was_answer_remote(session->inv_session->neg) == PJ_FALSE &&
session->active_media_state && session->active_media_state->topology &&
- !ast_stream_topology_equal(session->active_media_state->topology, topology)) {
+ !ast_stream_topology_equal(session->active_media_state->topology, topology) &&
+ !session->active_media_state->default_session[AST_MEDIA_TYPE_IMAGE] &&
+ !session->pending_media_state->default_session[AST_MEDIA_TYPE_IMAGE]) {
changed = 2;
}
}
pjsip_dialog *dlg;
RAII_VAR(struct ast_sip_session *, session, NULL, ao2_cleanup);
pjsip_rdata_sdp_info *sdp_info;
+ int deferred;
if (rdata->msg_info.msg->line.req.method.id != PJSIP_INVITE_METHOD ||
!(dlg = pjsip_ua_find_dialog(&rdata->msg_info.cid->id, &rdata->msg_info.to->tag, &rdata->msg_info.from->tag, PJ_FALSE)) ||
return PJ_FALSE;
}
- if (!sdp_requires_deferral(session, sdp_info->sdp)) {
+ deferred = sdp_requires_deferral(session, sdp_info->sdp);
+ if (deferred == -1) {
+ ast_sip_session_media_state_reset(session->pending_media_state);
+ return PJ_FALSE;
+ } else if (!deferred) {
return PJ_FALSE;
}
session = inv->mod_data[session_module.id];
if (handle_incoming_sdp(session, offer)) {
+ ast_sip_session_media_state_reset(session->pending_media_state);
return;
}
return;
}
- handle_negotiated_sdp(session, local, remote);
+ if (handle_negotiated_sdp(session, local, remote)) {
+ ast_sip_session_media_state_reset(session->pending_media_state);
+ }
}
static pjsip_redirect_op session_inv_on_redirected(pjsip_inv_session *inv, const pjsip_uri *target, const pjsip_event *e)