Changeset 4577


Ignore:
Timestamp:
Aug 1, 2013 4:18:15 AM (11 years ago)
Author:
ming
Message:

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().

Location:
pjproject/trunk/pjmedia
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/include/pjmedia/config.h

    r4538 r4577  
    669669#endif 
    670670 
     671/** 
     672 * This specifies the behavior of the SDP negotiator when responding to an 
     673 * offer, whether it should answer with multiple formats or not. 
     674 * 
     675 * Note that this behavior can be changed during run-time by calling 
     676 * pjmedia_sdp_neg_set_allow_multiple_codecs(). 
     677 * 
     678 * Default is 0 (to maintain backward compatibility) 
     679 */ 
     680#ifndef PJMEDIA_SDP_NEG_ANSWER_MULTIPLE_CODECS 
     681#   define PJMEDIA_SDP_NEG_ANSWER_MULTIPLE_CODECS       0 
     682#endif 
     683 
    671684 
    672685/** 
  • pjproject/trunk/pjmedia/include/pjmedia/sdp_neg.h

    r4562 r4577  
    417417                                              pj_bool_t prefer_remote); 
    418418 
     419/** 
     420 * This specifies the behavior of the SDP negotiator when responding to an 
     421 * offer, whether it should answer with multiple formats or not. 
     422 * 
     423 * By default, the value in PJMEDIA_SDP_NEG_ANSWER_MULTIPLE_CODECS will 
     424 * be used. 
     425 * 
     426 * @param neg           The SDP negotiator instance. 
     427 * @param answer_multiple 
     428 *                      If non-zero, the negotiator will respond with 
     429 *                      multiple formats. If zero only a single format 
     430 *                      will be returned. 
     431 */ 
     432PJ_DECL(pj_status_t) 
     433pjmedia_sdp_neg_set_answer_multiple_codecs(pjmedia_sdp_neg *neg, 
     434                                           pj_bool_t answer_multiple); 
     435 
    419436 
    420437/** 
  • pjproject/trunk/pjmedia/src/pjmedia/sdp_neg.c

    r4554 r4577  
    3434    pjmedia_sdp_neg_state state;            /**< Negotiator state.           */ 
    3535    pj_bool_t             prefer_remote_codec_order; 
     36    pj_bool_t             answer_with_multiple_codecs; 
    3637    pj_bool_t             has_remote_answer; 
    3738    pj_bool_t             answer_was_remote; 
     
    115116    neg->state = PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER; 
    116117    neg->prefer_remote_codec_order = PJMEDIA_SDP_NEG_PREFER_REMOTE_CODEC_ORDER; 
     118    neg->answer_with_multiple_codecs = PJMEDIA_SDP_NEG_ANSWER_MULTIPLE_CODECS; 
    117119    neg->initial_sdp = pjmedia_sdp_session_clone(pool, local); 
    118120    neg->neg_local_sdp = pjmedia_sdp_session_clone(pool, local); 
     
    179181    PJ_ASSERT_RETURN(neg, PJ_EINVAL); 
    180182    neg->prefer_remote_codec_order = prefer_remote; 
     183    return PJ_SUCCESS; 
     184} 
     185 
     186 
     187/* 
     188 * Set multiple codec answering. 
     189 */ 
     190PJ_DEF(pj_status_t) pjmedia_sdp_neg_set_answer_multiple_codecs( 
     191                        pjmedia_sdp_neg *neg, 
     192                        pj_bool_t answer_multiple) 
     193{ 
     194    PJ_ASSERT_RETURN(neg, PJ_EINVAL); 
     195    neg->answer_with_multiple_codecs = answer_multiple; 
    181196    return PJ_SUCCESS; 
    182197} 
     
    10111026static pj_status_t match_offer(pj_pool_t *pool, 
    10121027                               pj_bool_t prefer_remote_codec_order, 
     1028                               pj_bool_t answer_with_multiple_codecs, 
    10131029                               const pjmedia_sdp_media *offer, 
    10141030                               const pjmedia_sdp_media *preanswer, 
     
    10761092                master_has_codec = 1; 
    10771093 
    1078                 /* We just need to select one codec.  
     1094                /* We just need to select one codec if not allowing multiple. 
    10791095                 * Continue if we have selected matching codec for previous  
    10801096                 * payload. 
    10811097                 */ 
    1082                 if (found_matching_codec) 
     1098                if (!answer_with_multiple_codecs && found_matching_codec) 
    10831099                    continue; 
    10841100 
     
    11201136                } else { 
    11211137                    master_has_codec = 1; 
    1122                     if (found_matching_codec) 
     1138                    if (!answer_with_multiple_codecs && found_matching_codec) 
    11231139                        continue; 
    11241140                    is_codec = 1; 
     
    12781294static pj_status_t create_answer( pj_pool_t *pool, 
    12791295                                  pj_bool_t prefer_remote_codec_order, 
     1296                                  pj_bool_t answer_with_multiple_codecs, 
    12801297                                  const pjmedia_sdp_session *initial, 
    12811298                                  const pjmedia_sdp_session *offer, 
     
    13271344 
    13281345                /* See if it has matching codec. */ 
    1329                 status2 = match_offer(pool, prefer_remote_codec_order,  
     1346                status2 = match_offer(pool, prefer_remote_codec_order, 
     1347                                      answer_with_multiple_codecs, 
    13301348                                      om, im, initial, &am); 
    13311349                if (status2 == PJ_SUCCESS) { 
     
    14251443        pjmedia_sdp_session *answer = NULL; 
    14261444 
    1427         status = create_answer(pool, neg->prefer_remote_codec_order,  
     1445        status = create_answer(pool, neg->prefer_remote_codec_order, 
     1446                               neg->answer_with_multiple_codecs, 
    14281447                               neg->neg_local_sdp, neg->neg_remote_sdp, 
    14291448                               &answer); 
Note: See TracChangeset for help on using the changeset viewer.