Ignore:
Timestamp:
Jul 17, 2018 8:11:17 AM (16 months ago)
Author:
nanang
Message:

Re #2126: Implemented incoming RTCP-FB handling, i.e: parse and notify application via PJMEDIA event framework.

File:
1 edited

Legend:

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

    r5820 r5825  
    249249 
    250250    /* RTCP Feedback */ 
    251     pj_bool_t                send_rtcp_fb_nack;/**< Should we send NACK?    */ 
    252     pjmedia_rtcp_fb_nack     rtcp_fb_nack;     /**< NACK state.             */ 
     251    pj_bool_t                send_rtcp_fb_nack;     /**< Send NACK?         */ 
     252    pjmedia_rtcp_fb_nack     rtcp_fb_nack;          /**< TX NACK state.     */ 
     253    int                      rtcp_fb_nack_cap_idx;  /**< RX NACK cap idx.   */ 
    253254 
    254255 
     
    17251726    const void *payload; 
    17261727    unsigned payloadlen; 
    1727     pjmedia_rtp_status seq_st = {0}; 
     1728    pjmedia_rtp_status seq_st; 
    17281729    pj_status_t status; 
    17291730    pj_bool_t pkt_discarded = PJ_FALSE; 
     
    17681769 
    17691770    /* Ignore the packet if decoder is paused */ 
     1771    pj_bzero(&seq_st, sizeof(seq_st)); 
    17701772    if (channel->paused) 
    17711773        goto on_return; 
     
    21932195 
    21942196/* 
     2197 * Handle events. 
     2198 */ 
     2199static pj_status_t stream_event_cb(pjmedia_event *event, 
     2200                                   void *user_data) 
     2201{ 
     2202    pjmedia_stream *stream = (pjmedia_stream*)user_data; 
     2203 
     2204    /* Set RTCP FB capability in the event */ 
     2205    if (event->type==PJMEDIA_EVENT_RX_RTCP_FB && 
     2206        event->epub==&stream->rtcp) 
     2207    { 
     2208        pjmedia_event_rx_rtcp_fb_data *data = (pjmedia_event_rx_rtcp_fb_data*) 
     2209                                              event->data.ptr; 
     2210 
     2211        /* Application not configured to listen to NACK, discard this event */ 
     2212        if (stream->rtcp_fb_nack_cap_idx < 0) 
     2213            return PJ_SUCCESS; 
     2214         
     2215        data->cap = stream->si.loc_rtcp_fb.caps[stream->rtcp_fb_nack_cap_idx]; 
     2216    } 
     2217 
     2218    /* Republish events */ 
     2219    return pjmedia_event_publish(NULL, stream, event, 0); 
     2220} 
     2221 
     2222 
     2223/* 
    21952224 * Create media stream. 
    21962225 */ 
     
    25692598            stream->rtcp.stat.rtp_tx_last_ts = info->rtp_ts; 
    25702599        } 
     2600 
     2601        /* Subscribe to RTCP events */ 
     2602        pjmedia_event_subscribe(NULL, &stream_event_cb, stream, 
     2603                                &stream->rtcp); 
    25712604    } 
    25722605 
     
    26652698#endif 
    26662699 
    2667     /* Check if RTCP-FB generic NACK is enabled for this codec */ 
     2700    /* Check if we should send RTCP-FB generic NACK for this codec */ 
    26682701    if (stream->si.rem_rtcp_fb.cap_count) { 
    26692702        pjmedia_rtcp_fb_info *rfi = &stream->si.rem_rtcp_fb; 
     
    26792712            { 
    26802713                stream->send_rtcp_fb_nack = PJ_TRUE; 
     2714                break; 
     2715            } 
     2716        } 
     2717    } 
     2718 
     2719    /* Check if we handle incoming RTCP-FB generic NACK for this codec */ 
     2720    stream->rtcp_fb_nack_cap_idx = -1; 
     2721    if (stream->si.loc_rtcp_fb.cap_count) { 
     2722        pjmedia_rtcp_fb_info *lfi = &stream->si.loc_rtcp_fb; 
     2723        char cid[32]; 
     2724        unsigned i; 
     2725 
     2726        pjmedia_codec_info_to_id(&stream->si.fmt, cid, sizeof(cid)); 
     2727 
     2728        for (i = 0; i < lfi->cap_count; ++i) { 
     2729            if (lfi->caps[i].type == PJMEDIA_RTCP_FB_NACK && 
     2730                (!pj_strcmp2( &lfi->caps[i].codec_id, "*") || 
     2731                 !pj_stricmp2(&lfi->caps[i].codec_id, cid))) 
     2732            { 
     2733                stream->rtcp_fb_nack_cap_idx = i; 
    26812734                break; 
    26822735            } 
     
    27962849        } 
    27972850    } 
     2851 
     2852    /* Unsubscribe from RTCP session events */ 
     2853    pjmedia_event_unsubscribe(NULL, &stream_event_cb, stream, 
     2854                              &stream->rtcp); 
    27982855 
    27992856    /* Detach from transport 
Note: See TracChangeset for help on using the changeset viewer.