summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pjmedia/src/pjmedia/sdp_neg.c4
-rw-r--r--pjsip/src/pjsip-ua/sip_inv.c41
2 files changed, 43 insertions, 2 deletions
diff --git a/pjmedia/src/pjmedia/sdp_neg.c b/pjmedia/src/pjmedia/sdp_neg.c
index 46f23a03..596362fe 100644
--- a/pjmedia/src/pjmedia/sdp_neg.c
+++ b/pjmedia/src/pjmedia/sdp_neg.c
@@ -1400,7 +1400,9 @@ PJ_DEF(pj_status_t) pjmedia_sdp_neg_cancel_offer(pjmedia_sdp_neg *neg)
neg->neg_local_sdp = neg->neg_remote_sdp = NULL;
neg->has_remote_answer = PJ_FALSE;
- if (neg->state == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER) {
+ if (neg->state == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER &&
+ neg->active_local_sdp)
+ {
/* Increment next version number. This happens if for example
* the reinvite offer is rejected by 488. If we don't increment
* the version here, the next offer will have the same version.
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
index 0c08f076..73bbf3d5 100644
--- a/pjsip/src/pjsip-ua/sip_inv.c
+++ b/pjsip/src/pjsip-ua/sip_inv.c
@@ -162,6 +162,7 @@ struct tsx_inv_data
pj_bool_t retrying; /* Resend (e.g. due to 401/407) */
pj_str_t done_tag; /* To tag in RX response with answer */
pj_bool_t done_early;/* Negotiation was done for early med? */
+ pj_bool_t has_sdp; /* Message with SDP? */
};
/*
@@ -713,6 +714,40 @@ static void mod_inv_on_tsx_state(pjsip_transaction *tsx, pjsip_event *e)
}
}
+/*
+ * Check if tx_data has sdp.
+ */
+static pj_bool_t tx_data_has_sdp(const pjsip_tx_data *tdata)
+{
+ pjsip_msg_body *body = tdata->msg->body;
+ pjsip_media_type app_sdp;
+
+ PJ_ASSERT_RETURN(tdata, PJ_FALSE);
+
+ pjsip_media_type_init2(&app_sdp, "application", "sdp");
+
+ if (body &&
+ pj_stricmp(&body->content_type.type, &app_sdp.type)==0 &&
+ pj_stricmp(&body->content_type.subtype, &app_sdp.subtype)==0)
+ {
+ return PJ_TRUE;
+
+ } else if (body &&
+ pj_stricmp2(&body->content_type.type, "multipart") &&
+ (pj_stricmp2(&body->content_type.subtype, "mixed")==0 ||
+ pj_stricmp2(&body->content_type.subtype, "alternative")==0))
+ {
+ pjsip_multipart_part *part;
+
+ part = pjsip_multipart_find_part(body, &app_sdp, NULL);
+ if (part) {
+ return PJ_TRUE;
+ }
+ }
+
+ return PJ_FALSE;
+}
+
/*
* Initialize the invite module.
@@ -1495,6 +1530,7 @@ PJ_DEF(pj_status_t) pjsip_inv_create_uas( pjsip_dialog *dlg,
/* Attach our data to the transaction. */
tsx_inv_data = PJ_POOL_ZALLOC_T(inv->invite_tsx->pool, struct tsx_inv_data);
tsx_inv_data->inv = inv;
+ tsx_inv_data->has_sdp = (sdp_info->sdp!=NULL);
inv->invite_tsx->mod_data[mod_inv.mod.id] = tsx_inv_data;
/* Create 100rel handler */
@@ -1851,6 +1887,7 @@ static pj_status_t inv_check_sdp_in_incoming_msg( pjsip_inv_session *inv,
if (tsx_inv_data == NULL) {
tsx_inv_data = PJ_POOL_ZALLOC_T(tsx->pool, struct tsx_inv_data);
tsx_inv_data->inv = inv;
+ tsx_inv_data->has_sdp = (sdp_info->sdp!=NULL);
tsx->mod_data[mod_inv.mod.id] = tsx_inv_data;
}
@@ -3058,6 +3095,7 @@ PJ_DEF(pj_status_t) pjsip_inv_send_msg( pjsip_inv_session *inv,
/* Associate our data in outgoing invite transaction */
tsx_inv_data = PJ_POOL_ZALLOC_T(inv->pool, struct tsx_inv_data);
tsx_inv_data->inv = inv;
+ tsx_inv_data->has_sdp = tx_data_has_sdp(tdata);
pjsip_dlg_dec_lock(inv->dlg);
@@ -3493,7 +3531,7 @@ static pj_bool_t inv_handle_update_response( pjsip_inv_session *inv,
if (pjmedia_sdp_neg_get_state(inv->neg) ==
PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER &&
tsx_inv_data && tsx_inv_data->sdp_done == PJ_FALSE &&
- !tsx_inv_data->retrying)
+ !tsx_inv_data->retrying && tsx_inv_data->has_sdp)
{
pjmedia_sdp_neg_cancel_offer(inv->neg);
@@ -3569,6 +3607,7 @@ static void inv_respond_incoming_prack(pjsip_inv_session *inv,
tsx_inv_data = PJ_POOL_ZALLOC_T(inv->invite_tsx->pool,
struct tsx_inv_data);
tsx_inv_data->inv = inv;
+ tsx_inv_data->has_sdp = PJ_TRUE;
inv->invite_tsx->mod_data[mod_inv.mod.id] = tsx_inv_data;
}