Ignore:
Timestamp:
Mar 15, 2007 9:56:33 PM (13 years ago)
Author:
bennylp
Message:

Fixed ticket #178: Add flag in SDP negotiator to specify codec order preference (thanks Esbjörn Dominique)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/pjproject-0.5-stable/pjmedia/src/pjmedia/sdp_neg.c

    r1069 r1071  
    3232{ 
    3333    pjmedia_sdp_neg_state state;            /**< Negotiator state.           */ 
     34    pj_bool_t             prefer_remote_codec_order; 
    3435    pj_bool_t             has_remote_answer; 
    3536    pj_bool_t             answer_was_remote; 
     
    8788 
    8889    neg->state = PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER; 
     90    neg->prefer_remote_codec_order = PJMEDIA_SDP_NEG_PREFER_REMOTE_CODEC_ORDER; 
    8991    neg->initial_sdp = pjmedia_sdp_session_clone(pool, local); 
    9092    neg->neg_local_sdp = pjmedia_sdp_session_clone(pool, local); 
     
    120122    PJ_ASSERT_RETURN(neg != NULL, PJ_ENOMEM); 
    121123 
     124    neg->prefer_remote_codec_order = PJMEDIA_SDP_NEG_PREFER_REMOTE_CODEC_ORDER; 
    122125    neg->neg_remote_sdp = pjmedia_sdp_session_clone(pool, remote); 
    123126 
     
    140143    return PJ_SUCCESS; 
    141144} 
     145 
     146 
     147/* 
     148 * Set codec order preference. 
     149 */ 
     150PJ_DEF(pj_status_t) 
     151pjmedia_sdp_neg_set_prefer_remote_codec_order(pjmedia_sdp_neg *neg, 
     152                                              pj_bool_t prefer_remote) 
     153{ 
     154    PJ_ASSERT_RETURN(neg, PJ_EINVAL); 
     155    neg->prefer_remote_codec_order = prefer_remote; 
     156    return PJ_SUCCESS; 
     157} 
     158 
    142159 
    143160/* 
     
    668685static pj_status_t match_offer(pj_pool_t *pool, 
    669686                               const pjmedia_sdp_media *offer, 
    670                                const pjmedia_sdp_media *local, 
     687                               const pjmedia_sdp_media *preanswer, 
     688                               const pjmedia_sdp_media *orig_local, 
    671689                               pjmedia_sdp_media **p_answer) 
    672690{ 
     
    711729 
    712730                /* Find matching codec in local descriptor. */ 
    713                 for (j=0; j<local->desc.fmt_count; ++j) { 
     731                for (j=0; j<preanswer->desc.fmt_count; ++j) { 
    714732                    unsigned p; 
    715                     p = pj_strtoul(&local->desc.fmt[j]); 
    716                     if (p == pt && pj_isdigit(*local->desc.fmt[j].ptr)) { 
     733                    p = pj_strtoul(&preanswer->desc.fmt[j]); 
     734                    if (p == pt && pj_isdigit(*preanswer->desc.fmt[j].ptr)) { 
    717735                        found_matching_codec = 1; 
    718                         pt_answer[pt_answer_count++] = local->desc.fmt[j]; 
     736                        pt_answer[pt_answer_count++] = preanswer->desc.fmt[j]; 
    719737                        break; 
    720738                    } 
     
    754772                 * encoding name and clock rate. 
    755773                 */ 
    756                 for (j=0; j<local->desc.fmt_count; ++j) { 
    757                     a = pjmedia_sdp_media_find_attr2(local, "rtpmap",  
    758                                                      &local->desc.fmt[j]); 
     774                for (j=0; j<preanswer->desc.fmt_count; ++j) { 
     775                    a = pjmedia_sdp_media_find_attr2(preanswer, "rtpmap",  
     776                                                     &preanswer->desc.fmt[j]); 
    759777                    if (a) { 
    760778                        pjmedia_sdp_rtpmap lr; 
     
    774792                            else 
    775793                                found_matching_telephone_event = 1; 
    776                             pt_answer[pt_answer_count++] = local->desc.fmt[j]; 
     794                            pt_answer[pt_answer_count++] = preanswer->desc.fmt[j]; 
    777795                            break; 
    778796                        } 
     
    792810                continue; 
    793811 
    794             for (j=0; j<local->desc.fmt_count; ++j) { 
    795                 if (!pj_strcmp(&offer->desc.fmt[i], &local->desc.fmt[j])) { 
     812            for (j=0; j<preanswer->desc.fmt_count; ++j) { 
     813                if (!pj_strcmp(&offer->desc.fmt[i], &preanswer->desc.fmt[j])) { 
    796814                    /* Match */ 
    797815                    found_matching_other = 1; 
    798                     pt_answer[pt_answer_count++] = local->desc.fmt[j]; 
     816                    pt_answer[pt_answer_count++] = preanswer->desc.fmt[j]; 
    799817                    break; 
    800818                } 
     
    824842     * to suit the offer. 
    825843     */ 
    826     answer = pjmedia_sdp_media_clone(pool, local); 
     844    answer = pjmedia_sdp_media_clone(pool, orig_local); 
    827845    for (i=0; i<pt_answer_count; ++i) { 
    828846        unsigned j; 
     
    868886/* Create complete answer for remote's offer. */ 
    869887static pj_status_t create_answer( pj_pool_t *pool, 
     888                                  pj_bool_t prefer_remote_codec_order, 
    870889                                  const pjmedia_sdp_session *initial, 
    871890                                  const pjmedia_sdp_session *offer, 
     
    915934            { 
    916935                /* See if it has matching codec. */ 
    917                 status = match_offer(pool, om, im, &am); 
     936                if (prefer_remote_codec_order) { 
     937                    status = match_offer(pool, om, im, im, &am); 
     938                } else { 
     939                    status = match_offer(pool, im, om, im, &am); 
     940                } 
     941 
    918942                if (status == PJ_SUCCESS) { 
    919943                    /* Mark media as used. */ 
     
    9921016        pjmedia_sdp_session *answer = NULL; 
    9931017 
    994         status = create_answer(pool, neg->neg_local_sdp, neg->neg_remote_sdp, 
     1018        status = create_answer(pool, neg->prefer_remote_codec_order,  
     1019                               neg->neg_local_sdp, neg->neg_remote_sdp, 
    9951020                               &answer); 
    9961021        if (status == PJ_SUCCESS) { 
Note: See TracChangeset for help on using the changeset viewer.