Changeset 5820 for pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c
- Timestamp:
- Jul 12, 2018 8:22:31 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c
r5788 r5820 2258 2258 pj_sockaddr origin; 2259 2259 pjsua_call *call = &pjsua_var.calls[call_id]; 2260 pjsua_acc *acc = &pjsua_var.acc[call->acc_id]; 2260 2261 pjmedia_sdp_neg_state sdp_neg_state = PJMEDIA_SDP_NEG_STATE_NULL; 2261 2262 unsigned mi; … … 2484 2485 } 2485 2486 } 2487 2488 /* Add RTCP-FB info in SDP if we are offerer */ 2489 if (rem_sdp == NULL && acc->cfg.rtcp_fb_cfg.cap_count) { 2490 status = pjmedia_rtcp_fb_encode_sdp(pool, pjsua_var.med_endpt, 2491 &acc->cfg.rtcp_fb_cfg, sdp, 2492 mi, rem_sdp); 2493 if (status != PJ_SUCCESS) { 2494 PJ_PERROR(3,(THIS_FILE, status, 2495 "Call %d media %d: Failed to encode RTCP-FB " 2496 "setting to SDP", 2497 call_id, mi)); 2498 } 2499 } 2486 2500 } 2487 2501 … … 2529 2543 sdp->bandw[sdp->bandw_count++] = b; 2530 2544 } 2531 2532 2545 2533 2546 #if DISABLED_FOR_TICKET_1185 && defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0) … … 2961 2974 #endif 2962 2975 2963 /* Applying media count limitation. Note that in generating SDP answer, 2964 * no media count limitation applied, as we didn't know yet which media 2965 * would pass the SDP negotiation. 2976 /* We need to re-nego SDP or modify our answer when: 2977 * - media count exceeds the configured limit, 2978 * - RTCP-FB is enabled (so a=rtcp-fb will only be printed for negotiated 2979 * codecs) 2966 2980 */ 2967 if (maudcnt > call->opt.aud_cnt || mvidcnt > call->opt.vid_cnt) 2981 if (!pjmedia_sdp_neg_was_answer_remote(call->inv->neg) && 2982 ((maudcnt > call->opt.aud_cnt || mvidcnt > call->opt.vid_cnt) || 2983 (acc->cfg.rtcp_fb_cfg.cap_count))) 2968 2984 { 2969 pjmedia_sdp_session *local_sdp2; 2970 2971 maudcnt = PJ_MIN(maudcnt, call->opt.aud_cnt); 2972 mvidcnt = PJ_MIN(mvidcnt, call->opt.vid_cnt); 2973 local_sdp2 = pjmedia_sdp_session_clone(tmp_pool, local_sdp); 2974 2975 for (mi=0; mi < local_sdp2->media_count; ++mi) { 2976 pjmedia_sdp_media *m = local_sdp2->media[mi]; 2977 2978 if (m->desc.port == 0 || 2979 pj_memchr(maudidx, mi, maudcnt*sizeof(maudidx[0])) || 2980 pj_memchr(mvididx, mi, mvidcnt*sizeof(mvididx[0]))) 2981 { 2982 continue; 2983 } 2984 2985 /* Deactivate this media */ 2986 pjmedia_sdp_media_deactivate(tmp_pool, m); 2987 } 2988 2989 local_sdp = local_sdp2; 2985 pjmedia_sdp_session *local_sdp_renego = NULL; 2986 2987 local_sdp_renego = pjmedia_sdp_session_clone(tmp_pool, local_sdp); 2988 local_sdp = local_sdp_renego; 2990 2989 need_renego_sdp = PJ_TRUE; 2990 2991 /* Add RTCP-FB info into local SDP answer */ 2992 if (acc->cfg.rtcp_fb_cfg.cap_count) { 2993 for (mi=0; mi < local_sdp_renego->media_count; ++mi) { 2994 status = pjmedia_rtcp_fb_encode_sdp( 2995 tmp_pool, pjsua_var.med_endpt, 2996 &acc->cfg.rtcp_fb_cfg, 2997 local_sdp_renego, mi, remote_sdp); 2998 if (status != PJ_SUCCESS) { 2999 PJ_PERROR(3,(THIS_FILE, status, 3000 "Call %d media %d: Failed to encode RTCP-FB " 3001 "setting to SDP", 3002 call_id, mi)); 3003 } 3004 } 3005 } 3006 3007 /* Applying media count limitation. Note that in generating SDP 3008 * answer, no media count limitation applied as we didn't know yet 3009 * which media would pass the SDP negotiation. 3010 */ 3011 if (maudcnt > call->opt.aud_cnt || mvidcnt > call->opt.vid_cnt) 3012 { 3013 maudcnt = PJ_MIN(maudcnt, call->opt.aud_cnt); 3014 mvidcnt = PJ_MIN(mvidcnt, call->opt.vid_cnt); 3015 3016 for (mi=0; mi < local_sdp_renego->media_count; ++mi) { 3017 pjmedia_sdp_media *m = local_sdp_renego->media[mi]; 3018 3019 if (m->desc.port == 0 || 3020 pj_memchr(maudidx, mi, maudcnt*sizeof(maudidx[0])) || 3021 pj_memchr(mvididx, mi, mvidcnt*sizeof(mvididx[0]))) 3022 { 3023 continue; 3024 } 3025 3026 /* Deactivate this excess media */ 3027 pjmedia_sdp_media_deactivate(tmp_pool, m); 3028 } 3029 } 2991 3030 } 2992 3031 … … 3389 3428 sizeof(call->media_prov[0]) * call->med_prov_cnt); 3390 3429 3391 /* Perform SDP re-negotiation if some media have just got disabled 3392 * in this function due to media count limit settings. 3393 */ 3430 /* Perform SDP re-negotiation. */ 3394 3431 if (got_media && need_renego_sdp) { 3395 3432 pjmedia_sdp_neg *neg = call->inv->neg; 3396 3433 3397 /* This should only happen when we are the answerer. */3398 PJ_ASSERT_RETURN(neg && !pjmedia_sdp_neg_was_answer_remote(neg),3399 PJMEDIA_SDPNEG_EINSTATE);3400 3401 3434 status = pjmedia_sdp_neg_set_remote_offer(tmp_pool, neg, remote_sdp); 3402 3435 if (status != PJ_SUCCESS)
Note: See TracChangeset
for help on using the changeset viewer.