Ignore:
Timestamp:
Nov 13, 2019 9:11:04 AM (5 years ago)
Author:
nanang
Message:

Close #1437: Video keyframe request/response using RTCP-FB PLI.

File:
1 edited

Legend:

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

    r6093 r6106  
    13361336        const pjmedia_sdp_media *m = sdp->media[i]; 
    13371337        const pjmedia_sdp_conn *c; 
    1338         static const pj_str_t ID_RTP_SAVP = { "RTP/SAVP", 8 }; 
     1338        pj_uint32_t proto; 
    13391339 
    13401340        /* Skip different media */ 
     
    13471347 
    13481348        /* Supported transports */ 
    1349         if (pj_stristr(&m->desc.transport, &ID_RTP_SAVP)) { 
     1349        proto = pjmedia_sdp_transport_get_proto(&m->desc.transport); 
     1350        if (PJMEDIA_TP_PROTO_HAS_FLAG(proto, PJMEDIA_TP_PROTO_RTP_SAVP)) 
     1351        { 
    13501352            switch (use_srtp) { 
    13511353            case PJMEDIA_SRTP_MANDATORY: 
     
    13581360                break; 
    13591361            } 
    1360         } else if (pj_stricmp2(&m->desc.transport, "RTP/AVP")==0) { 
     1362        } else if (PJMEDIA_TP_PROTO_HAS_FLAG(proto, PJMEDIA_TP_PROTO_RTP_AVP)) 
     1363        { 
    13611364            switch (use_srtp) { 
    13621365            case PJMEDIA_SRTP_MANDATORY: 
     
    14821485pj_status_t on_media_event(pjmedia_event *event, void *user_data) 
    14831486{ 
     1487    char ev_name[5]; 
    14841488    pj_status_t status = PJ_SUCCESS; 
    14851489 
    14861490    PJ_UNUSED_ARG(user_data); 
     1491 
     1492    pjmedia_fourcc_name(event->type, ev_name); 
     1493    PJ_LOG(4,(THIS_FILE, "Received media event type=%s, src=%p, epub=%p", 
     1494                         ev_name, event->src, event->epub)); 
    14871495 
    14881496    /* Forward the event */ 
     
    15001508    pjsua_call_media *call_med = (pjsua_call_media*)user_data; 
    15011509    pjsua_call *call = call_med? call_med->call : NULL; 
     1510    char ev_name[5]; 
    15021511    pj_status_t status = PJ_SUCCESS; 
    1503    
     1512 
     1513    pj_assert(call && call_med); 
     1514    pjmedia_fourcc_name(event->type, ev_name); 
     1515    PJ_LOG(5,(THIS_FILE, "Call %d: Media %d: Received media event, type=%s, " 
     1516                         "src=%p, epub=%p", 
     1517                         call->index, call_med->idx, ev_name, 
     1518                         event->src, event->epub)); 
     1519 
    15041520    switch(event->type) { 
    15051521        case PJMEDIA_EVENT_KEYFRAME_MISSING: 
     
    26752691        } 
    26762692 
    2677         /* Add RTCP-FB info in SDP if we are offerer */ 
    2678         if (rem_sdp == NULL && acc->cfg.rtcp_fb_cfg.cap_count) { 
     2693        /* Setup RTCP-FB */ 
     2694        { 
     2695            pjmedia_rtcp_fb_setting rtcp_cfg; 
     2696            pjmedia_rtcp_fb_setting_default(&rtcp_cfg); 
     2697 
     2698            /* Add RTCP-FB PLI if PJSUA_VID_REQ_KEYFRAME_RTCP_PLI is set */ 
     2699            if (call_med->type == PJMEDIA_TYPE_VIDEO && 
     2700                (call->opt.req_keyframe_method & 
     2701                 PJSUA_VID_REQ_KEYFRAME_RTCP_PLI)) 
     2702            { 
     2703                rtcp_cfg.cap_count = 1; 
     2704                pj_strset2(&rtcp_cfg.caps[0].codec_id, (char*)"*"); 
     2705                rtcp_cfg.caps[0].type = PJMEDIA_RTCP_FB_NACK; 
     2706                pj_strset2(&rtcp_cfg.caps[0].param, (char*)"pli"); 
     2707            } 
     2708 
     2709            /* Should we put "RTP/AVPF" in SDP?*/ 
     2710            if (rem_sdp) { 
     2711                /* For answer, match remote offer */ 
     2712                unsigned rem_proto = 0; 
     2713                rem_proto = pjmedia_sdp_transport_get_proto( 
     2714                                        &rem_sdp->media[mi]->desc.transport); 
     2715                rtcp_cfg.dont_use_avpf = 
     2716                        !PJMEDIA_TP_PROTO_HAS_FLAG(rem_proto,  
     2717                                                PJMEDIA_TP_PROFILE_RTCP_FB); 
     2718            } else { 
     2719                /* For offer, check account setting */ 
     2720                rtcp_cfg.dont_use_avpf = acc->cfg.rtcp_fb_cfg.dont_use_avpf || 
     2721                                         (acc->cfg.rtcp_fb_cfg.cap_count == 0 
     2722                                          && rtcp_cfg.cap_count == 0); 
     2723            } 
     2724 
    26792725            status = pjmedia_rtcp_fb_encode_sdp(pool, pjsua_var.med_endpt, 
    2680                                                 &acc->cfg.rtcp_fb_cfg, sdp, 
     2726                                                &rtcp_cfg, sdp, 
    26812727                                                mi, rem_sdp); 
    26822728            if (status != PJ_SUCCESS) { 
    26832729                PJ_PERROR(3,(THIS_FILE, status, 
    2684                              "Call %d media %d: Failed to encode RTCP-FB " 
     2730                             "Call %d media %d: Failed to encode RTCP-FB PLI " 
    26852731                             "setting to SDP", 
    26862732                             call_id, mi)); 
     2733            } 
     2734 
     2735            /* Add any other RTCP-FB setting configured in account setting */ 
     2736            if (acc->cfg.rtcp_fb_cfg.cap_count) { 
     2737                pj_bool_t tmp = rtcp_cfg.dont_use_avpf; 
     2738                rtcp_cfg = acc->cfg.rtcp_fb_cfg; 
     2739                rtcp_cfg.dont_use_avpf = tmp; 
     2740                status = pjmedia_rtcp_fb_encode_sdp(pool, pjsua_var.med_endpt, 
     2741                                                    &rtcp_cfg, sdp, 
     2742                                                    mi, rem_sdp); 
     2743                if (status != PJ_SUCCESS) { 
     2744                    PJ_PERROR(3,(THIS_FILE, status, 
     2745                                 "Call %d media %d: Failed to encode account " 
     2746                                 "RTCP-FB setting to SDP", 
     2747                                 call_id, mi)); 
     2748                } 
    26872749            } 
    26882750        } 
Note: See TracChangeset for help on using the changeset viewer.