summaryrefslogtreecommitdiff
path: root/pjmedia/src
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2013-08-01 04:18:15 +0000
committerLiong Sauw Ming <ming@teluu.com>2013-08-01 04:18:15 +0000
commita088975f81907044c195a49d31790fee43b973a6 (patch)
tree43a01ed1a42236c4c79ce47e15ccab3148756c1c /pjmedia/src
parent208181b3db6080dfca9e0b98456d4746cfc346fa (diff)
Closed #1692: Allow multiple codecs in SDP answer
By default, the setting is disabled, to change it during run-time, use the function pjmedia_sdp_neg_set_allow_multiple_codecs(). git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4577 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src')
-rw-r--r--pjmedia/src/pjmedia/sdp_neg.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/pjmedia/src/pjmedia/sdp_neg.c b/pjmedia/src/pjmedia/sdp_neg.c
index 160a082e..ebed3a36 100644
--- a/pjmedia/src/pjmedia/sdp_neg.c
+++ b/pjmedia/src/pjmedia/sdp_neg.c
@@ -33,6 +33,7 @@ struct pjmedia_sdp_neg
{
pjmedia_sdp_neg_state state; /**< Negotiator state. */
pj_bool_t prefer_remote_codec_order;
+ pj_bool_t answer_with_multiple_codecs;
pj_bool_t has_remote_answer;
pj_bool_t answer_was_remote;
@@ -114,6 +115,7 @@ PJ_DEF(pj_status_t) pjmedia_sdp_neg_create_w_local_offer( pj_pool_t *pool,
neg->state = PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER;
neg->prefer_remote_codec_order = PJMEDIA_SDP_NEG_PREFER_REMOTE_CODEC_ORDER;
+ neg->answer_with_multiple_codecs = PJMEDIA_SDP_NEG_ANSWER_MULTIPLE_CODECS;
neg->initial_sdp = pjmedia_sdp_session_clone(pool, local);
neg->neg_local_sdp = pjmedia_sdp_session_clone(pool, local);
@@ -183,6 +185,19 @@ PJ_DEF(pj_status_t) pjmedia_sdp_neg_set_prefer_remote_codec_order(
/*
+ * Set multiple codec answering.
+ */
+PJ_DEF(pj_status_t) pjmedia_sdp_neg_set_answer_multiple_codecs(
+ pjmedia_sdp_neg *neg,
+ pj_bool_t answer_multiple)
+{
+ PJ_ASSERT_RETURN(neg, PJ_EINVAL);
+ neg->answer_with_multiple_codecs = answer_multiple;
+ return PJ_SUCCESS;
+}
+
+
+/*
* Get SDP negotiator state.
*/
PJ_DEF(pjmedia_sdp_neg_state) pjmedia_sdp_neg_get_state( pjmedia_sdp_neg *neg )
@@ -1010,6 +1025,7 @@ static void apply_answer_symmetric_pt(pj_pool_t *pool,
/* Try to match offer with answer. */
static pj_status_t match_offer(pj_pool_t *pool,
pj_bool_t prefer_remote_codec_order,
+ pj_bool_t answer_with_multiple_codecs,
const pjmedia_sdp_media *offer,
const pjmedia_sdp_media *preanswer,
const pjmedia_sdp_session *preanswer_sdp,
@@ -1075,11 +1091,11 @@ static pj_status_t match_offer(pj_pool_t *pool,
master_has_codec = 1;
- /* We just need to select one codec.
+ /* We just need to select one codec if not allowing multiple.
* Continue if we have selected matching codec for previous
* payload.
*/
- if (found_matching_codec)
+ if (!answer_with_multiple_codecs && found_matching_codec)
continue;
/* Find matching codec in local descriptor. */
@@ -1119,7 +1135,7 @@ static pj_status_t match_offer(pj_pool_t *pool,
is_codec = 0;
} else {
master_has_codec = 1;
- if (found_matching_codec)
+ if (!answer_with_multiple_codecs && found_matching_codec)
continue;
is_codec = 1;
}
@@ -1277,6 +1293,7 @@ static pj_status_t match_offer(pj_pool_t *pool,
/* Create complete answer for remote's offer. */
static pj_status_t create_answer( pj_pool_t *pool,
pj_bool_t prefer_remote_codec_order,
+ pj_bool_t answer_with_multiple_codecs,
const pjmedia_sdp_session *initial,
const pjmedia_sdp_session *offer,
pjmedia_sdp_session **p_answer)
@@ -1326,7 +1343,8 @@ static pj_status_t create_answer( pj_pool_t *pool,
pj_status_t status2;
/* See if it has matching codec. */
- status2 = match_offer(pool, prefer_remote_codec_order,
+ status2 = match_offer(pool, prefer_remote_codec_order,
+ answer_with_multiple_codecs,
om, im, initial, &am);
if (status2 == PJ_SUCCESS) {
/* Mark media as used. */
@@ -1424,7 +1442,8 @@ PJ_DEF(pj_status_t) pjmedia_sdp_neg_negotiate( pj_pool_t *pool,
} else {
pjmedia_sdp_session *answer = NULL;
- status = create_answer(pool, neg->prefer_remote_codec_order,
+ 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) {