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/rtcp.c

    r1528 r1942  
    2929#define RTCP_SR   200 
    3030#define RTCP_RR   201 
    31  
     31#define RTCP_XR   207 
    3232 
    3333#if PJ_HAS_HIGH_RES_TIMER==0 
     
    173173PJ_DEF(void) pjmedia_rtcp_fini(pjmedia_rtcp_session *sess) 
    174174{ 
     175#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) 
     176    pjmedia_rtcp_xr_fini(&sess->xr_session); 
     177#else 
    175178    /* Nothing to do. */ 
    176179    PJ_UNUSED_ARG(sess); 
     180#endif 
    177181} 
    178182 
     
    186190} 
    187191 
    188 PJ_DEF(void) pjmedia_rtcp_rx_rtp(pjmedia_rtcp_session *sess,  
    189                                  unsigned seq,  
    190                                  unsigned rtp_ts, 
    191                                  unsigned payload) 
     192PJ_DEF(void) pjmedia_rtcp_rx_rtp( pjmedia_rtcp_session *sess,  
     193                                  unsigned seq,  
     194                                  unsigned rtp_ts, 
     195                                  unsigned payload) 
     196{ 
     197    pjmedia_rtcp_rx_rtp2(sess, seq, rtp_ts, payload, PJ_FALSE); 
     198} 
     199 
     200PJ_DEF(void) pjmedia_rtcp_rx_rtp2(pjmedia_rtcp_session *sess,  
     201                                  unsigned seq,  
     202                                  unsigned rtp_ts, 
     203                                  unsigned payload, 
     204                                  pj_bool_t discarded) 
    192205{    
    193206    pj_timestamp ts; 
     
    197210    unsigned last_seq; 
    198211 
     212#if !defined(PJMEDIA_HAS_RTCP_XR) || (PJMEDIA_HAS_RTCP_XR == 0) 
     213    PJ_UNUSED_ARG(discarded); 
     214#endif 
     215 
    199216    if (sess->stat.rx.pkt == 0) { 
    200217        /* Init sequence for the first time. */ 
     
    225242    if (seq_st.status.flag.bad) { 
    226243        sess->stat.rx.discard++; 
     244 
     245#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) 
     246        pjmedia_rtcp_xr_rx_rtp(&sess->xr_session, seq,  
     247                               -1,                               /* lost    */ 
     248                               (seq_st.status.flag.dup? 1:0),    /* dup     */ 
     249                               (!seq_st.status.flag.dup? 1:-1),  /* discard */ 
     250                               -1,                               /* jitter  */ 
     251                               -1, 0);                           /* toh     */ 
     252#endif 
     253 
    227254        TRACE_((sess->name, "Bad packet discarded")); 
    228255        return; 
     
    317344 
    318345            sess->stat.rx.jitter.last = jitter; 
     346 
     347#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) 
     348            pjmedia_rtcp_xr_rx_rtp(&sess->xr_session, seq,  
     349                                   0,                       /* lost    */ 
     350                                   0,                       /* dup     */ 
     351                                   discarded,               /* discard */ 
     352                                   (sess->jitter >> 4),     /* jitter  */ 
     353                                   -1, 0);                  /* toh     */ 
     354#endif 
    319355        } 
     356#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) 
     357    } else if (seq_st.diff > 1) { 
     358        int i; 
     359 
     360        /* Report RTCP XR about packet losses */ 
     361        for (i=seq_st.diff-1; i>0; --i) { 
     362            pjmedia_rtcp_xr_rx_rtp(&sess->xr_session, seq - i,  
     363                                   1,                       /* lost    */ 
     364                                   0,                       /* dup     */ 
     365                                   0,                       /* discard */ 
     366                                   -1,                      /* jitter  */ 
     367                                   -1, 0);                  /* toh     */ 
     368        } 
     369 
     370        /* Report RTCP XR this packet */ 
     371        pjmedia_rtcp_xr_rx_rtp(&sess->xr_session, seq,  
     372                               0,                           /* lost    */ 
     373                               0,                           /* dup     */ 
     374                               discarded,                   /* discard */ 
     375                               -1,                          /* jitter  */ 
     376                               -1, 0);                      /* toh     */ 
     377#endif 
    320378    } 
    321379 
     
    349407                                    + sizeof(pjmedia_rtcp_sr))); 
    350408        } 
    351     } else if (common->pt == RTCP_RR && common->count > 0) 
     409    } else if (common->pt == RTCP_RR && common->count > 0) { 
    352410        rr = (pjmedia_rtcp_rr*)(((char*)pkt) + sizeof(pjmedia_rtcp_common)); 
     411#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) 
     412    } else if (common->pt == RTCP_XR) { 
     413        if (sess->xr_enabled) 
     414            pjmedia_rtcp_xr_rx_rtcp_xr(&sess->xr_session, pkt, size); 
     415 
     416        return; 
     417#endif 
     418    } 
    353419 
    354420 
     
    675741} 
    676742 
    677   
     743PJ_DEF(pj_status_t) pjmedia_rtcp_enable_xr( pjmedia_rtcp_session *sess,  
     744                                            pj_bool_t enable) 
     745{ 
     746#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) 
     747 
     748    /* Check if request won't change anything */ 
     749    if (!(enable ^ sess->xr_enabled)) 
     750        return PJ_SUCCESS; 
     751 
     752    if (!enable) { 
     753        sess->xr_enabled = PJ_FALSE; 
     754        return PJ_SUCCESS; 
     755    } 
     756 
     757    pjmedia_rtcp_xr_init(&sess->xr_session, sess, 0, 1); 
     758    sess->xr_enabled = PJ_TRUE; 
     759 
     760    return PJ_SUCCESS; 
     761 
     762#else 
     763 
     764    PJ_UNUSED_ARG(sess); 
     765    PJ_UNUSED_ARG(enable); 
     766    return PJ_ENOTSUP; 
     767 
     768#endif 
     769} 
Note: See TracChangeset for help on using the changeset viewer.