Ignore:
Timestamp:
Apr 28, 2008 6:05:49 PM (16 years ago)
Author:
bennylp
Message:

Ticket #513: Support for RTCP XR (initial patch)

File:
1 edited

Legend:

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

    r1887 r1942  
    471471                                            rtcp_pkt, len); 
    472472 
     473#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) 
     474        /* Temporarily always send RTCP XR after RTCP */ 
     475        if (stream->rtcp.xr_enabled) 
     476        { 
     477            int i; 
     478            pjmedia_jb_state jb_state; 
     479 
     480            pjmedia_jbuf_get_state(stream->jb, &jb_state); 
     481             
     482            i = jb_state.size * stream->codec_param.info.frm_ptime; 
     483            pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,  
     484                                        PJMEDIA_RTCP_XR_INFO_JB_NOM, 
     485                                        i); 
     486 
     487            i = jb_state.max_size* stream->codec_param.info.frm_ptime; 
     488            pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,  
     489                                        PJMEDIA_RTCP_XR_INFO_JB_MAX, 
     490                                        i); 
     491 
     492            pjmedia_rtcp_build_rtcp_xr(&stream->rtcp.xr_session, 0,  
     493                                       &rtcp_pkt, &len); 
     494 
     495            (*stream->transport->op->send_rtcp)(stream->transport,  
     496                                                rtcp_pkt, len); 
     497        } 
     498#endif 
     499 
    473500        stream->rtcp_last_tx = timestamp; 
    474501    } 
    475  
    476502} 
    477503 
     
    9751001    pjmedia_rtp_status seq_st; 
    9761002    pj_status_t status; 
    977  
     1003    pj_bool_t pkt_discarded = PJ_FALSE; 
    9781004 
    9791005    /* Check for errors */ 
     
    9961022    } 
    9971023 
    998  
    999     /* Inform RTCP session */ 
    1000     pjmedia_rtcp_rx_rtp(&stream->rtcp, pj_ntohs(hdr->seq), 
    1001                         pj_ntohl(hdr->ts), payloadlen); 
    1002  
    10031024    /* Ignore the packet if decoder is paused */ 
    10041025    if (channel->paused) 
    1005         return; 
     1026        goto on_return; 
    10061027 
    10071028    /* Update RTP session (also checks if RTP session can accept 
     
    10261047                      hdr->pt, channel->rtp.out_pt)); 
    10271048        } 
     1049 
     1050        if (seq_st.status.flag.badssrc) { 
     1051            PJ_LOG(4,(stream->port.info.name.ptr, 
     1052                      "Changed RTP peer SSRC %d (previously %d)", 
     1053                      channel->rtp.peer_ssrc, stream->rtcp.peer_ssrc)); 
     1054            stream->rtcp.peer_ssrc = channel->rtp.peer_ssrc; 
     1055        } 
     1056 
     1057 
    10281058    } 
    10291059 
    10301060    /* Skip bad RTP packet */ 
    1031     if (seq_st.status.flag.bad) 
    1032         return; 
     1061    if (seq_st.status.flag.bad) { 
     1062        pkt_discarded = PJ_TRUE; 
     1063        goto on_return; 
     1064    } 
    10331065 
    10341066    /* Ignore if payloadlen is zero */ 
    1035     if (payloadlen == 0) 
    1036         return; 
     1067    if (payloadlen == 0) { 
     1068        pkt_discarded = PJ_TRUE; 
     1069        goto on_return; 
     1070    } 
    10371071 
    10381072    /* Handle incoming DTMF. */ 
     
    10421076         */ 
    10431077        if (seq_st.status.flag.outorder || seq_st.status.flag.dup) { 
    1044             return; 
     1078            goto on_return; 
    10451079        } 
    10461080 
    10471081        handle_incoming_dtmf(stream, payload, payloadlen); 
    1048         return; 
     1082        goto on_return; 
    10491083    } 
    10501084 
     
    11521186        for (i=0; i<count; ++i) { 
    11531187            unsigned ext_seq; 
     1188            pj_bool_t discarded; 
    11541189 
    11551190            ext_seq = (unsigned)(frames[i].timestamp.u64 / ts_span); 
    1156             pjmedia_jbuf_put_frame(stream->jb, frames[i].buf,  
    1157                                    frames[i].size, ext_seq); 
    1158  
     1191            pjmedia_jbuf_put_frame2(stream->jb, frames[i].buf, frames[i].size, 
     1192                                    ext_seq, &discarded); 
     1193            if (discarded) 
     1194                pkt_discarded = PJ_TRUE; 
    11591195        } 
    11601196    } 
     
    11731209        LOGERR_((stream->port.info.name.ptr, "Jitter buffer put() error",  
    11741210                status)); 
    1175         return; 
    1176     } 
     1211        pkt_discarded = PJ_TRUE; 
     1212        goto on_return; 
     1213    } 
     1214 
     1215on_return: 
     1216    /* Update RTCP session */ 
     1217    if (stream->rtcp.peer_ssrc == 0) 
     1218        stream->rtcp.peer_ssrc = channel->rtp.peer_ssrc; 
     1219 
     1220    pjmedia_rtcp_rx_rtp2(&stream->rtcp, pj_ntohs(hdr->seq), 
     1221                         pj_ntohl(hdr->ts), payloadlen, pkt_discarded); 
    11771222} 
    11781223 
     
    15131558    stream->transport = tp; 
    15141559 
     1560#if PJMEDIA_HAS_RTCP_XR && PJMEDIA_STREAM_ENABLE_XR 
     1561    /* Enable RTCP XR and update some settings */ 
     1562    { 
     1563        int i; 
     1564        pjmedia_rtcp_enable_xr(&stream->rtcp, PJ_TRUE); 
     1565 
     1566        /* jitter buffer adaptive info */ 
     1567        i = PJMEDIA_RTCP_XR_JB_ADAPTIVE; 
     1568        pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,  
     1569                                    PJMEDIA_RTCP_XR_INFO_CONF_JBA, 
     1570                                    i); 
     1571 
     1572        /* Jitter buffer aggressiveness info (estimated) */ 
     1573        i = 7; 
     1574        pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,  
     1575                                    PJMEDIA_RTCP_XR_INFO_CONF_JBR, 
     1576                                    i); 
     1577 
     1578        /* Jitter buffer absolute maximum delay */ 
     1579        i = jb_max * stream->codec_param.info.frm_ptime; 
     1580        pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,  
     1581                                    PJMEDIA_RTCP_XR_INFO_JB_ABS_MAX, 
     1582                                    i); 
     1583 
     1584        /* PLC info */ 
     1585        if (stream->codec_param.setting.plc == 0) 
     1586            i = PJMEDIA_RTCP_XR_PLC_DIS; 
     1587        else 
     1588#if PJMEDIA_WSOLA_IMP==PJMEDIA_WSOLA_IMP_WSOLA 
     1589            i = PJMEDIA_RTCP_XR_PLC_ENH; 
     1590#else 
     1591            i = PJMEDIA_RTCP_XR_PLC_DIS; 
     1592#endif 
     1593        pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,  
     1594                                    PJMEDIA_RTCP_XR_INFO_CONF_PLC, 
     1595                                    i); 
     1596    } 
     1597#endif 
    15151598 
    15161599    /* Success! */ 
     
    15181601 
    15191602    PJ_LOG(5,(THIS_FILE, "Stream %s created", stream->port.info.name.ptr)); 
     1603 
    15201604    return PJ_SUCCESS; 
    15211605 
Note: See TracChangeset for help on using the changeset viewer.