Ignore:
Timestamp:
May 2, 2008 3:01:10 PM (13 years ago)
Author:
nanang
Message:

More ticket #513:

  • Added RTCP XR features on stream: configurable RTCP XR sending interval, third-party destination for RTCP XR, and sending last RTCP XR packet when stream destroyed.
  • Updated end system delay of RTCP XR: sound device latency estimated based on sound device implementation.
File:
1 edited

Legend:

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

    r1943 r1945  
    158158#endif 
    159159 
     160#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) 
     161    pj_uint32_t              rtcp_xr_last_tx;  /**< RTCP XR tx time  
     162                                                    in timestamp.           */ 
     163    pj_uint32_t              rtcp_xr_interval; /**< Interval, in timestamp. */ 
     164    pj_sockaddr              rtcp_xr_dest;     /**< Additional remote RTCP XR  
     165                                                    dest. If sin_family is  
     166                                                    zero, it will be ignored*/ 
     167    unsigned                 rtcp_xr_dest_len; /**< Length of RTCP XR dest 
     168                                                    address                 */ 
     169#endif 
    160170}; 
    161171 
     
    468478        pjmedia_rtcp_build_rtcp(&stream->rtcp, &rtcp_pkt, &len); 
    469479 
    470         (*stream->transport->op->send_rtcp)(stream->transport,  
    471                                             rtcp_pkt, len); 
     480        pjmedia_transport_send_rtcp(stream->transport, rtcp_pkt, len); 
     481 
     482        stream->rtcp_last_tx = timestamp; 
     483    } 
    472484 
    473485#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) 
     486    if (stream->rtcp.xr_enabled) { 
     487 
     488        if (stream->rtcp_xr_last_tx == 0) { 
     489         
     490            stream->rtcp_xr_last_tx = timestamp; 
     491 
     492        } else if (timestamp - stream->rtcp_xr_last_tx >=  
     493                   stream->rtcp_xr_interval) 
    476494        { 
    477495            int i; 
    478496            pjmedia_jb_state jb_state; 
    479  
     497            void *rtcp_pkt; 
     498            int len; 
     499 
     500            /* Update RTCP XR with current JB states */ 
    480501            pjmedia_jbuf_get_state(stream->jb, &jb_state); 
    481              
     502             
    482503            i = jb_state.size * stream->codec_param.info.frm_ptime; 
    483504            pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,  
     
    490511                                        i); 
    491512 
     513            /* Build RTCP XR packet */ 
    492514            pjmedia_rtcp_build_rtcp_xr(&stream->rtcp.xr_session, 0,  
    493515                                       &rtcp_pkt, &len); 
    494516 
    495             (*stream->transport->op->send_rtcp)(stream->transport,  
    496                                                 rtcp_pkt, len); 
     517            /* Send the RTCP XR to remote address */ 
     518            pjmedia_transport_send_rtcp(stream->transport, rtcp_pkt, len); 
     519 
     520            /* Send the RTCP XR to third-party destination if specified */ 
     521            if (stream->rtcp_xr_dest_len) { 
     522                pjmedia_transport_send_rtcp2(stream->transport,  
     523                                             &stream->rtcp_xr_dest, 
     524                                             stream->rtcp_xr_dest_len,  
     525                                             rtcp_pkt, len); 
     526            } 
     527 
     528            /* Update last tx RTCP XR */ 
     529            stream->rtcp_xr_last_tx = timestamp; 
    497530        } 
     531    } 
    498532#endif 
    499  
    500         stream->rtcp_last_tx = timestamp; 
    501     } 
    502533} 
    503534 
     
    768799 
    769800    /* Send the RTP packet to the transport. */ 
    770     (*stream->transport->op->send_rtp)(stream->transport, 
    771                                        channel->out_pkt,  
    772                                        frame_out.size +  
    773                                             sizeof(pjmedia_rtp_hdr)); 
    774  
     801    pjmedia_transport_send_rtp(stream->transport, channel->out_pkt,  
     802                               frame_out.size + sizeof(pjmedia_rtp_hdr)); 
    775803 
    776804    /* Update stat */ 
     
    15651593        pjmedia_rtcp_enable_xr(&stream->rtcp, PJ_TRUE); 
    15661594 
     1595        /* Set RTCP XR TX interval */ 
     1596        if (info->rtcp_xr_interval != 0) 
     1597            stream->rtcp_xr_interval = info->rtcp_xr_interval; 
     1598        else 
     1599            stream->rtcp_xr_interval = (PJMEDIA_RTCP_INTERVAL +  
     1600                                       (pj_rand() % 8000)) *  
     1601                                       info->fmt.clock_rate / 1000; 
     1602 
     1603        /* Additional third-party RTCP XR destination */ 
     1604        if (info->rtcp_xr_dest.addr.sa_family != 0) { 
     1605            stream->rtcp_xr_dest_len = pj_sockaddr_get_len(&info->rtcp_xr_dest); 
     1606            pj_memcpy(&stream->rtcp_xr_dest, &info->rtcp_xr_dest, 
     1607                      stream->rtcp_xr_dest_len); 
     1608        } 
     1609 
    15671610        /* jitter buffer adaptive info */ 
    15681611        i = PJMEDIA_RTCP_XR_JB_ADAPTIVE; 
     
    16201663    PJ_ASSERT_RETURN(stream != NULL, PJ_EINVAL); 
    16211664 
     1665#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0) 
     1666    /* Send RTCP XR on stream destroy */ 
     1667    if (stream->rtcp.xr_enabled) { 
     1668        int i; 
     1669        pjmedia_jb_state jb_state; 
     1670        void *rtcp_pkt; 
     1671        int len; 
     1672 
     1673        /* Update RTCP XR with current JB states */ 
     1674        pjmedia_jbuf_get_state(stream->jb, &jb_state); 
     1675             
     1676        i = jb_state.size * stream->codec_param.info.frm_ptime; 
     1677        pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,  
     1678                                    PJMEDIA_RTCP_XR_INFO_JB_NOM, 
     1679                                    i); 
     1680 
     1681        i = jb_state.max_size* stream->codec_param.info.frm_ptime; 
     1682        pjmedia_rtcp_xr_update_info(&stream->rtcp.xr_session,  
     1683                                    PJMEDIA_RTCP_XR_INFO_JB_MAX, 
     1684                                    i); 
     1685 
     1686        /* Build RTCP XR packet */ 
     1687        pjmedia_rtcp_build_rtcp_xr(&stream->rtcp.xr_session, 0,  
     1688                                   &rtcp_pkt, &len); 
     1689 
     1690        /* Send the RTCP XR to remote address */ 
     1691        pjmedia_transport_send_rtcp(stream->transport, rtcp_pkt, len); 
     1692         
     1693        /* Send the RTCP XR to third-party destination if specified */ 
     1694        if (stream->rtcp_xr_dest_len) { 
     1695            pjmedia_transport_send_rtcp2(stream->transport,  
     1696                                         &stream->rtcp_xr_dest, 
     1697                                         stream->rtcp_xr_dest_len,  
     1698                                         rtcp_pkt, len); 
     1699        } 
     1700    } 
     1701#endif 
    16221702 
    16231703    /* Detach from transport  
Note: See TracChangeset for help on using the changeset viewer.