diff options
-rw-r--r-- | pjmedia/src/pjmedia/sdp_neg.c | 4 | ||||
-rw-r--r-- | pjsip/src/pjsip-ua/sip_inv.c | 41 |
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; } |