Changeset 3198


Ignore:
Timestamp:
Jun 4, 2010 1:41:34 PM (9 years ago)
Author:
nanang
Message:

Re #668:

  • Fixed process_answer() of SDP negotiation, when no common format in a media, instead of returning error, it should just deactivate the media (offer & answer) and continue negotiating next media.
  • Generalized the way of deactivating media: set port to 0 and remove all attributes.
  • Added new API pjmedia_sdp_media_clone_deactivate() to clone media and deactivate the newly cloned media.
  • Updated PJMEDIA SDP negotiation test.
Location:
pjproject/trunk
Files:
6 edited

Legend:

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

    r2995 r3198  
    532532 
    533533 
     534/** 
     535 * Clone SDP media description and deactivate the new SDP media. 
     536 * 
     537 * @param rhs       The SDP media to clone. 
     538 * 
     539 * @return          New media descrption with deactivated indication. 
     540 */ 
     541PJ_DECL(pjmedia_sdp_media*) pjmedia_sdp_media_clone_deactivate( 
     542                                                pj_pool_t *pool, 
     543                                                const pjmedia_sdp_media *rhs); 
     544 
     545 
    534546/* ************************************************************************** 
    535547 * SDP SESSION DESCRIPTION 
  • pjproject/trunk/pjmedia/src/pjmedia/sdp.c

    r3140 r3198  
    14311431                                                 pjmedia_sdp_media *m) 
    14321432{ 
    1433     pjmedia_sdp_attr *attr; 
    1434     static const pj_str_t ID_INACTIVE = { "inactive", 8 }; 
    1435  
    1436     if (m->attr_count >= PJMEDIA_MAX_SDP_ATTR) 
    1437         return PJ_ETOOMANY; 
    1438  
    1439     attr = pjmedia_sdp_attr_create(pool, ID_INACTIVE.ptr, NULL); 
    1440     if (NULL == attr) 
    1441         return PJ_ENOMEM; 
    1442  
    1443     pjmedia_sdp_media_add_attr(m, attr); 
     1433    PJ_ASSERT_RETURN(m, PJ_EINVAL); 
     1434    PJ_UNUSED_ARG(pool); 
     1435 
     1436    /* Set port to zero */ 
    14441437    m->desc.port = 0; 
    14451438 
     1439    /* And remove attributes */ 
     1440    m->attr_count = 0; 
     1441 
    14461442    return PJ_SUCCESS; 
    14471443} 
     1444 
     1445 
     1446PJ_DEF(pjmedia_sdp_media*) pjmedia_sdp_media_clone_deactivate( 
     1447                                                pj_pool_t *pool, 
     1448                                                const pjmedia_sdp_media *rhs) 
     1449{ 
     1450    unsigned int i; 
     1451    pjmedia_sdp_media *m; 
     1452 
     1453    PJ_ASSERT_RETURN(pool && rhs, NULL); 
     1454 
     1455    m = PJ_POOL_ZALLOC_T(pool, pjmedia_sdp_media); 
     1456    pj_memcpy(m, rhs, sizeof(*m)); 
     1457 
     1458    /* Clone the media line only */ 
     1459    pj_strdup (pool, &m->desc.media, &rhs->desc.media); 
     1460    pj_strdup (pool, &m->desc.transport, &rhs->desc.transport); 
     1461    for (i=0; i<rhs->desc.fmt_count; ++i) 
     1462        pj_strdup(pool, &m->desc.fmt[i], &rhs->desc.fmt[i]); 
     1463 
     1464    if (rhs->conn) { 
     1465        m->conn = pjmedia_sdp_conn_clone (pool, rhs->conn); 
     1466        PJ_ASSERT_RETURN(m->conn != NULL, NULL); 
     1467    } 
     1468 
     1469    /* And deactivate it */ 
     1470    pjmedia_sdp_media_deactivate(pool, m); 
     1471 
     1472    return m; 
     1473} 
  • pjproject/trunk/pjmedia/src/pjmedia/sdp_cmp.c

    r2394 r3198  
    184184        return PJMEDIA_SDP_ETPORTNOTEQUAL; 
    185185 
     186    /* For zeroed port media, stop comparing here */ 
     187    if (sd1->desc.port == 0) 
     188        return PJ_SUCCESS; 
     189 
    186190    /* Compare number of formats. */ 
    187191    if (sd1->desc.fmt_count != sd2->desc.fmt_count) 
  • pjproject/trunk/pjmedia/src/pjmedia/sdp_neg.c

    r3195 r3198  
    312312            pjmedia_sdp_media *m; 
    313313 
    314             m = pjmedia_sdp_media_clone(pool, om); 
    315             m->desc.port = 0; 
     314            m = pjmedia_sdp_media_clone_deactivate(pool, om); 
    316315 
    317316            pj_array_insert(new_offer->media, sizeof(new_offer->media[0]), 
     
    777776         
    778777        /* Remote has rejected our offer.  
    779          * Set our port to zero too in active SDP. 
     778         * Deactivate our media too. 
    780779         */ 
    781         offer->desc.port = 0; 
     780        pjmedia_sdp_media_deactivate(pool, offer); 
    782781 
    783782        /* Don't need to proceed */ 
     
    10121011 
    10131012            /* Generate matching-but-disabled-media for the answer */ 
    1014             am = pjmedia_sdp_media_clone(pool, offer->media[omi]); 
    1015             am->desc.port = 0; 
     1013            am = pjmedia_sdp_media_clone_deactivate(pool, offer->media[omi]); 
    10161014            answer->media[answer->media_count++] = am; 
    10171015            ++ami; 
    10181016 
     1017            /* Deactivate our media offer too */ 
     1018            pjmedia_sdp_media_deactivate(pool, offer->media[omi]); 
     1019 
    10191020            /* No answer media to be negotiated */ 
    1020             offer->media[omi]->desc.port = 0; 
    10211021            continue; 
    10221022        } 
     
    10271027        /* If media type is mismatched, just disable the media. */ 
    10281028        if (status == PJMEDIA_SDPNEG_EINVANSMEDIA) { 
    1029             offer->media[omi]->desc.port = 0; 
     1029            pjmedia_sdp_media_deactivate(pool, offer->media[omi]); 
    10301030            continue; 
    10311031        } 
    1032  
    1033         if (status != PJ_SUCCESS) 
     1032        /* No common format in the answer media. */ 
     1033        else if (status == PJMEDIA_SDPNEG_EANSNOMEDIA) { 
     1034            pjmedia_sdp_media_deactivate(pool, offer->media[omi]); 
     1035            pjmedia_sdp_media_deactivate(pool, answer->media[ami]); 
     1036        }  
     1037        /* Return the error code, for other errors. */ 
     1038        else if (status != PJ_SUCCESS) { 
    10341039            return status; 
     1040        } 
    10351041 
    10361042        if (offer->media[omi]->desc.port != 0) 
     
    10651071    pj_str_t pt_amr_need_adapt = {NULL, 0}; 
    10661072 
    1067     /* If offer has zero port, just clone the offer and update direction */ 
     1073    /* If offer has zero port, just clone the offer */ 
    10681074    if (offer->desc.port == 0) { 
    1069         answer = pjmedia_sdp_media_clone(pool, offer); 
    1070         remove_all_media_directions(answer); 
    1071         update_media_direction(pool, offer, answer); 
     1075        answer = pjmedia_sdp_media_clone_deactivate(pool, offer); 
    10721076        *p_answer = answer; 
    10731077        return PJ_SUCCESS; 
     
    13571361             * Reject the offer by setting the port to zero in the answer. 
    13581362             */ 
    1359             //pjmedia_sdp_attr *a; 
    1360  
    13611363            /* For simplicity in the construction of the answer, we'll 
    13621364             * just clone the media from the offer. Anyway receiver will 
     
    13641366             * number is zero. 
    13651367             */ 
    1366             am = pjmedia_sdp_media_clone(pool, om); 
    1367             am->desc.port = 0; 
    1368  
    1369             // Just set port zero to disable stream without set it to inactive. 
    1370             /* Remove direction attribute, and replace with inactive */ 
    1371             remove_all_media_directions(am); 
    1372             //a = pjmedia_sdp_attr_create(pool, "inactive", NULL); 
    1373             //pjmedia_sdp_media_add_attr(am, a); 
    1374  
    1375             /* Then update direction */ 
    1376             update_media_direction(pool, om, am); 
    1377  
     1368            am = pjmedia_sdp_media_clone_deactivate(pool, om); 
    13781369        } else { 
    13791370            /* The answer is in am */ 
     
    14391430            neg->active_local_sdp = active; 
    14401431            neg->active_remote_sdp = neg->neg_remote_sdp; 
    1441  
    14421432        } 
    14431433    } else { 
  • pjproject/trunk/pjmedia/src/test/sdp_neg_test.c

    r3014 r3198  
    9797            "a=rtpmap:0 PCMU/8000\r\n" 
    9898            "m=video 0 RTP/AVP 31\r\n" 
    99             "a=rtpmap:31 H261/90000\r\n" 
     99            //"a=rtpmap:31 H261/90000\r\n"      /* <-- this is not necessary (port 0) */ 
    100100            "m=video 53000 RTP/AVP 32\r\n" 
    101101            "a=rtpmap:32 MPV/90000\r\n" 
     
    130130            "a=rtpmap:0 PCMU/8000\r\n" 
    131131            "m=video 0 RTP/AVP 31\r\n" 
    132             //"a=rtpmap:31 H261/90000\r\n"      /* <-- this is not necessary */ 
     132            //"a=rtpmap:31 H261/90000\r\n"      /* <-- this is not necessary (port 0) */ 
    133133            "m=video 53000 RTP/AVP 32\r\n" 
    134134            "a=rtpmap:32 MPV/90000\r\n" 
    135135            "m=audio 0 RTP/AVP 110\r\n" 
    136             "a=rtpmap:110 telephone-events/8000\r\n" 
    137             "a=sendonly\r\n" 
     136            /* <-- the following attributes are not necessary (port 0) */ 
     137            //"a=rtpmap:110 telephone-events/8000\r\n" 
     138            //"a=sendonly\r\n" 
    138139          } 
    139140        } 
     
    556557            "a=rtpmap:0 PCMU/8000\r\n" 
    557558            "a=rtpmap:8 PCMA/8000\r\n" 
    558             "m=video 0 RTP/AVP 31\r\n" 
    559             "a=rtpmap:31 H261/90000\r\n" 
     559            // By #1088, the formats won't be negotiated when the media has port 0. 
     560            //"m=video 0 RTP/AVP 31\r\n" 
     561            "m=video 0 RTP/AVP 31 32\r\n" 
     562            //"a=rtpmap:31 H261/90000\r\n"  /* <-- this is not necessary (port 0) */ 
    560563          }, 
    561564          { 
     
    590593            "a=rtpmap:0 PCMU/8000\r\n" 
    591594            "m=video 0 RTP/AVP 31\r\n" 
    592             "a=rtpmap:31 H261/90000\r\n" 
     595            //"a=rtpmap:31 H261/90000\r\n"  /* <-- this is not necessary (port 0) */ 
    593596          } 
    594597        } 
     
    666669            "a=rtpmap:0 PCMU/8000\r\n" 
    667670            "m=video 0 RTP/AVP 31\r\n" 
    668             "a=rtpmap:31 H261/90000\r\n" 
     671            //"a=rtpmap:31 H261/90000\r\n"  /* <-- this is not necessary (port 0) */ 
    669672          } 
    670673        } 
     
    817820            "t=0 0\r\n" 
    818821            "m=audio 0 RTP/AVP 0\r\n" 
    819             "a=rtpmap:0 PCMU/8000\r\n" 
     822            //"a=rtpmap:0 PCMU/8000\r\n"          /* <-- this is not necessary (port 0) */ 
    820823            "m=audio 51372 RTP/AVP 97 101\r\n" 
    821824            "a=rtpmap:97 iLBC/8000\r\n" 
     
    871874            "t=0 0\r\n" 
    872875            "m=audio 0 RTP/AVP 0\r\n" 
    873             "a=rtpmap:0 PCMU/8000\r\n" 
     876            //"a=rtpmap:0 PCMU/8000\r\n"      /* <-- this is not necessary (port 0) */ 
    874877            "m=audio 49170 RTP/AVP 97 101\r\n" 
    875878            "a=rtpmap:97 iLBC/8000\r\n" 
     
    917920            "a=rtpmap:0 PCMU/8000\r\n" 
    918921            "m=video 0 RTP/AVP 31\r\n" 
    919             "a=rtpmap:31 H261/90000\r\n" 
     922            //"a=rtpmap:31 H261/90000\r\n"    /* <-- this is not necessary (port 0) */ 
    920923            "", 
    921924          } 
     
    963966            "a=rtpmap:0 PCMU/8000\r\n" 
    964967            "m=video 0 RTP/AVP 31\r\n" 
    965             "a=rtpmap:31 H261/90000\r\n" 
     968            //"a=rtpmap:31 H261/90000\r\n"    /* <-- this is not necessary (port 0) */ 
    966969            "", 
    967970          } 
     
    10531056            "a=rtpmap:0 PCMU/8000\r\n" 
    10541057            "m=audio 0 RTP/AVP 0\r\n" 
    1055             "a=rtpmap:0 PCMU/8000\r\n" 
    1056             "m=video 0 RTP/AVP 31\r\n" 
    1057             "a=rtpmap:31 H261/90000\r\n" 
     1058            //"a=rtpmap:0 PCMU/8000\r\n"      /* <-- this is not necessary (port 0) */ 
     1059            "m=video 0 RTP/AVP 31\r\n" 
     1060            //"a=rtpmap:31 H261/90000\r\n"    /* <-- this is not necessary (port 0) */ 
    10581061            "", 
    10591062          } 
     
    12311234            "a=rtpmap:0 PCMU/8000\r\n" 
    12321235            "m=audio 0 RTP/AVP 0\r\n" 
    1233             "a=rtpmap:0 PCMU/8000\r\n" 
     1236            //"a=rtpmap:0 PCMU/8000\r\n"      /* <-- this is not necessary (port 0) */ 
    12341237            "m=video 5000 RTP/AVP 31\r\n" 
    12351238            "a=rtpmap:31 H261/90000\r\n" 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c

    r3172 r3198  
    13021302            const pjmedia_sdp_media *rem_m = rem_sdp->media[i]; 
    13031303            pjmedia_sdp_media *m; 
    1304             const pjmedia_sdp_attr *a; 
    13051304 
    13061305            if ((int)i == call->audio_idx) 
    13071306                continue; 
    13081307 
    1309             m = PJ_POOL_ZALLOC_T(pool, pjmedia_sdp_media); 
    1310             pj_strdup(pool, &m->desc.media, &rem_m->desc.media); 
    1311             pj_strdup(pool, &m->desc.transport, &rem_m->desc.transport); 
    1312             m->desc.port = 0; 
    1313  
    1314             /* Add one format, copy from the offer. And copy the corresponding 
    1315              * rtpmap and fmtp attributes too. 
    1316              */ 
    1317             m->desc.fmt_count = 1; 
    1318             pj_strdup(pool, &m->desc.fmt[0], &rem_m->desc.fmt[0]); 
    1319             if ((a=pjmedia_sdp_attr_find2(rem_m->attr_count, rem_m->attr, 
    1320                                           "rtpmap", &m->desc.fmt[0])) != NULL) 
    1321             { 
    1322                 m->attr[m->attr_count++] = pjmedia_sdp_attr_clone(pool, a); 
    1323             } 
    1324             if ((a=pjmedia_sdp_attr_find2(rem_m->attr_count, rem_m->attr, 
    1325                                           "fmtp", &m->desc.fmt[0])) != NULL) 
    1326             { 
    1327                 m->attr[m->attr_count++] = pjmedia_sdp_attr_clone(pool, a); 
    1328             } 
    1329  
     1308            m = pjmedia_sdp_media_clone_deactivate(pool, rem_m); 
    13301309            if (i==sdp->media_count) 
    13311310                sdp->media[sdp->media_count++] = m; 
Note: See TracChangeset for help on using the changeset viewer.