发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
/* The best bit: SDP negotiation function! */
PJ_DEF(pj_status_t) pjmedia_sdp_neg_negotiate( pj_pool_t *pool,
pjmedia_sdp_neg *neg,
pj_bool_t allow_asym)
{
pj_status_t status;
/* Check arguments are valid. */
PJ_ASSERT_RETURN(pool && neg, PJ_EINVAL);
/* Must be in STATE_WAIT_NEGO state. */
PJ_ASSERT_RETURN(neg->state == PJMEDIA_SDP_NEG_STATE_WAIT_NEGO,
PJMEDIA_SDPNEG_EINSTATE);
/* Must have remote offer. */
PJ_ASSERT_RETURN(neg->neg_remote_sdp, PJ_EBUG);
if (neg->has_remote_answer) {
pjmedia_sdp_session *active;
status = process_answer(pool, neg->neg_local_sdp, neg->neg_remote_sdp,
allow_asym, &active);
if (status == PJ_SUCCESS) {
/* Only update active SDPs when negotiation is successfull */
neg->active_local_sdp = active;
neg->active_remote_sdp = neg->neg_remote_sdp;
}
} else {
pjmedia_sdp_session *answer = NULL;
status = create_answer(pool, neg->prefer_remote_codec_order,
neg->answer_with_multiple_codecs,
neg->neg_local_sdp, neg->neg_remote_sdp,
&answer);
if (status == PJ_SUCCESS) {
pj_uint32_t active_ver;
if (neg->active_local_sdp)
active_ver = neg->active_local_sdp->origin.version;
else
active_ver = neg->initial_sdp->origin.version;
/* Only update active SDPs when negotiation is successfull */
neg->active_local_sdp = answer;
neg->active_remote_sdp = neg->neg_remote_sdp;
/* Increment SDP version */
neg->active_local_sdp->origin.version = ++active_ver;
}
}
/* State is DONE regardless */
neg->state = PJMEDIA_SDP_NEG_STATE_DONE;
/* Save state */
neg->answer_was_remote = neg->has_remote_answer;
/* Revert back initial SDP if nego fails */
if (status != PJ_SUCCESS)
neg->initial_sdp = neg->initial_sdp_tmp;
/* Clear temporary SDP */
neg->initial_sdp_tmp = NULL;
neg->neg_local_sdp = neg->neg_remote_sdp = NULL;
neg->has_remote_answer = PJ_FALSE;
return status;
}
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。