Ignore:
Timestamp:
Nov 8, 2019 10:17:16 AM (8 months ago)
Author:
nanang
Message:

Close #2088: Generate and negotiate telephone-event with multiple clock-rates in SDP offer/answer.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia/sdp_neg.c

    r5828 r6103  
    10711071    pjmedia_sdp_media *answer; 
    10721072    const pjmedia_sdp_media *master, *slave; 
     1073    unsigned nclockrate = 0, clockrate[PJMEDIA_MAX_SDP_FMT]; 
    10731074 
    10741075    /* If offer has zero port, just clone the offer */ 
     
    11311132                    p = pj_strtoul(&slave->desc.fmt[j]); 
    11321133                    if (p == pt && pj_isdigit(*slave->desc.fmt[j].ptr)) { 
     1134                        unsigned k; 
     1135 
    11331136                        found_matching_codec = 1; 
    11341137                        pt_offer[pt_answer_count] = slave->desc.fmt[j]; 
    11351138                        pt_answer[pt_answer_count++] = slave->desc.fmt[j]; 
     1139 
     1140                        /* Take note of clock rate for tel-event. Note: for 
     1141                         * static PT, we assume the clock rate is 8000. 
     1142                         */ 
     1143                        for (k=0; k<nclockrate; ++k) 
     1144                            if (clockrate[k] == 8000) 
     1145                                break; 
     1146                        if (k == nclockrate) 
     1147                            clockrate[nclockrate++] = 8000; 
    11361148                        break; 
    11371149                    } 
     
    11451157                const pjmedia_sdp_attr *a; 
    11461158                pjmedia_sdp_rtpmap or_; 
    1147                 pj_bool_t is_codec; 
     1159                pj_bool_t is_codec = 0; 
    11481160 
    11491161                /* Get the rtpmap for the payload type in the master. */ 
     
    11561168                pjmedia_sdp_attr_get_rtpmap(a, &or_); 
    11571169 
    1158                 if (!pj_stricmp2(&or_.enc_name, "telephone-event")) { 
    1159                     if (found_matching_telephone_event) 
    1160                         continue; 
    1161                     is_codec = 0; 
    1162                 } else { 
     1170                if (pj_stricmp2(&or_.enc_name, "telephone-event")) { 
    11631171                    master_has_codec = 1; 
    11641172                    if (!answer_with_multiple_codecs && found_matching_codec) 
     
    11921200                                pjmedia_sdp_media *o_med, *a_med; 
    11931201                                unsigned o_fmt_idx, a_fmt_idx; 
     1202                                unsigned k; 
    11941203 
    11951204                                o_med = (pjmedia_sdp_media*)offer; 
     
    12081217                                } 
    12091218                                found_matching_codec = 1; 
     1219 
     1220                                /* Take note of clock rate for tel-event */ 
     1221                                for (k=0; k<nclockrate; ++k) 
     1222                                    if (clockrate[k] == or_.clock_rate) 
     1223                                        break; 
     1224                                if (k == nclockrate) 
     1225                                    clockrate[nclockrate++] = or_.clock_rate; 
    12101226                            } else { 
    12111227                                found_matching_telephone_event = 1; 
     
    12701286    } 
    12711287 
    1272     /* Seems like everything is in order. 
    1273      * Build the answer by cloning from preanswer, but rearrange the payload 
     1288    /* Seems like everything is in order. */ 
     1289 
     1290    /* Remove unwanted telephone-event formats. */ 
     1291    if (found_matching_telephone_event) { 
     1292        pj_str_t first_televent_offer = {0}; 
     1293        pj_str_t first_televent_answer = {0}; 
     1294        unsigned matched_cnt = 0; 
     1295 
     1296        for (i=0; i<pt_answer_count; ) { 
     1297            const pjmedia_sdp_attr *a; 
     1298            pjmedia_sdp_rtpmap r; 
     1299            unsigned j; 
     1300 
     1301            /* Skip static PT, as telephone-event uses dynamic PT */ 
     1302            if (!pj_isdigit(*pt_answer[i].ptr) || pj_strtol(&pt_answer[i])<96) 
     1303            { 
     1304                ++i; 
     1305                continue; 
     1306            } 
     1307 
     1308            /* Get the rtpmap for format. */ 
     1309            a = pjmedia_sdp_media_find_attr2(preanswer, "rtpmap", 
     1310                                             &pt_answer[i]); 
     1311            pj_assert(a); 
     1312            pjmedia_sdp_attr_get_rtpmap(a, &r); 
     1313 
     1314            /* Only care for telephone-event format */ 
     1315            if (pj_stricmp2(&r.enc_name, "telephone-event")) { 
     1316                ++i; 
     1317                continue; 
     1318            } 
     1319 
     1320            if (first_televent_offer.slen == 0) { 
     1321                first_televent_offer = pt_offer[i]; 
     1322                first_televent_answer = pt_answer[i]; 
     1323            } 
     1324 
     1325            for (j=0; j<nclockrate; ++j) { 
     1326                if (r.clock_rate==clockrate[j]) 
     1327                    break; 
     1328            } 
     1329 
     1330            /* This tel-event's clockrate is unwanted, remove the tel-event */ 
     1331            if (j==nclockrate) { 
     1332                pj_array_erase(pt_answer, sizeof(pt_answer[0]), 
     1333                               pt_answer_count, i); 
     1334                pj_array_erase(pt_offer, sizeof(pt_offer[0]), 
     1335                               pt_answer_count, i); 
     1336                pt_answer_count--; 
     1337            } else { 
     1338                ++matched_cnt; 
     1339                ++i; 
     1340            } 
     1341        } 
     1342 
     1343        /* Tel-event is wanted, but no matched clock rate (to the selected 
     1344         * audio codec), just put back any first matched tel-event formats. 
     1345         */ 
     1346        if (!matched_cnt) { 
     1347            pt_offer[pt_answer_count] = first_televent_offer; 
     1348            pt_answer[pt_answer_count++] = first_televent_answer; 
     1349        } 
     1350    } 
     1351 
     1352    /* Build the answer by cloning from preanswer, and reorder the payload 
    12741353     * to suit the offer. 
    12751354     */ 
Note: See TracChangeset for help on using the changeset viewer.