Ignore:
Timestamp:
Jul 12, 2018 8:22:31 AM (8 months ago)
Author:
nanang
Message:

Close #2126: Initial implementation of RTCP Feedback.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c

    r5788 r5820  
    22582258    pj_sockaddr origin; 
    22592259    pjsua_call *call = &pjsua_var.calls[call_id]; 
     2260    pjsua_acc *acc = &pjsua_var.acc[call->acc_id]; 
    22602261    pjmedia_sdp_neg_state sdp_neg_state = PJMEDIA_SDP_NEG_STATE_NULL; 
    22612262    unsigned mi; 
     
    24842485            } 
    24852486        } 
     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        } 
    24862500    } 
    24872501 
     
    25292543        sdp->bandw[sdp->bandw_count++] = b; 
    25302544    } 
    2531  
    25322545 
    25332546#if DISABLED_FOR_TICKET_1185 && defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0) 
     
    29612974#endif 
    29622975 
    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) 
    29662980     */ 
    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))) 
    29682984    { 
    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; 
    29902989        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        } 
    29913030    } 
    29923031 
     
    33893428              sizeof(call->media_prov[0]) * call->med_prov_cnt); 
    33903429 
    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. */ 
    33943431    if (got_media && need_renego_sdp) { 
    33953432        pjmedia_sdp_neg *neg = call->inv->neg; 
    33963433 
    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          
    34013434        status = pjmedia_sdp_neg_set_remote_offer(tmp_pool, neg, remote_sdp); 
    34023435        if (status != PJ_SUCCESS) 
Note: See TracChangeset for help on using the changeset viewer.