Ignore:
Timestamp:
Dec 28, 2016 3:40:07 AM (7 years ago)
Author:
nanang
Message:

Re #1900: More merged from trunk (r5512 mistakenly contains merged changes in third-party dir only).

Location:
pjproject/branches/projects/uwp
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/uwp

  • pjproject/branches/projects/uwp/pjmedia/src/pjmedia/vid_stream.c

    r5101 r5513  
    2323#include <pjmedia/rtcp.h> 
    2424#include <pjmedia/jbuf.h> 
    25 #include <pjmedia/stream_common.h> 
    2625#include <pj/array.h> 
    2726#include <pj/assert.h> 
     
    153152    pjmedia_frame           *rx_frames;     /**< Temp. buffer for incoming 
    154153                                                 frame assembly.            */ 
    155  
    156154    pj_bool_t                force_keyframe;/**< Forced to encode keyframe? */ 
     155    unsigned                 num_keyframe;  /**< The number of keyframe needed  
     156                                                 to be sent, after the stream 
     157                                                 is created. */ 
     158    pj_timestamp             last_keyframe_tx;   
     159                                            /**< Timestamp of the last  
     160                                                 keyframe. */ 
     161 
    157162 
    158163#if defined(PJMEDIA_STREAM_ENABLE_KA) && PJMEDIA_STREAM_ENABLE_KA!=0 
     
    439444    send_rtcp(stream, PJ_TRUE, PJ_FALSE); 
    440445 
     446    /* Update stats in case the stream is paused */ 
     447    stream->rtcp.stat.rtp_tx_last_seq = pj_ntohs(stream->enc->rtp.out_hdr.seq); 
     448 
    441449#elif PJMEDIA_STREAM_ENABLE_KA == PJMEDIA_STREAM_KA_USER 
    442450 
     
    608616    if (bytes_read < 0) { 
    609617        status = (pj_status_t)-bytes_read; 
     618        if (status == PJ_STATUS_FROM_OS(OSERR_EWOULDBLOCK)) { 
     619            return; 
     620        } 
    610621        if (stream->rtp_rx_last_err != status) { 
    611622            char errmsg[PJ_ERR_MSG_SIZE]; 
     
    787798    /* Check for errors */ 
    788799    if (bytes_read < 0) { 
    789         LOGERR_((stream->cname.ptr, "RTCP recv() error",  
    790                  (pj_status_t)-bytes_read)); 
     800        if (bytes_read != -PJ_STATUS_FROM_OS(OSERR_EWOULDBLOCK)) { 
     801            LOGERR_((stream->cname.ptr, "RTCP recv() error", 
     802                    (pj_status_t)-bytes_read)); 
     803        } 
    791804        return; 
    792805    } 
     
    810823    unsigned pkt_cnt = 0; 
    811824    pj_timestamp initial_time; 
     825    pj_timestamp null_ts ={0}; 
    812826 
    813827#if defined(PJMEDIA_STREAM_ENABLE_KA) && PJMEDIA_STREAM_ENABLE_KA != 0 
     
    846860    frame_out.size = 0; 
    847861 
     862    /* Check if need to send keyframe. */ 
     863    if (stream->num_keyframe &&  
     864        (pj_cmp_timestamp(&null_ts, &stream->last_keyframe_tx) != 0))  
     865    {    
     866        unsigned elapse_time; 
     867        pj_timestamp now; 
     868 
     869        pj_get_timestamp(&now); 
     870 
     871        elapse_time = pj_elapsed_msec(&stream->last_keyframe_tx, &now); 
     872 
     873        if (elapse_time > stream->info.sk_cfg.interval) 
     874        { 
     875            stream->force_keyframe = PJ_TRUE; 
     876            --stream->num_keyframe;              
     877        } 
     878    } 
     879 
    848880    /* Init encoding option */ 
    849881    pj_bzero(&enc_opt, sizeof(enc_opt)); 
     
    874906     
    875907    pj_get_timestamp(&initial_time); 
     908 
     909    if ((stream->num_keyframe) &&  
     910        ((frame_out.bit_info & PJMEDIA_VID_FRM_KEYFRAME)  
     911                                                  == PJMEDIA_VID_FRM_KEYFRAME))  
     912    { 
     913        stream->last_keyframe_tx = initial_time; 
     914    } 
    876915 
    877916    /* Loop while we have frame to send */ 
     
    13851424    char *p; 
    13861425    pj_status_t status; 
     1426    pjmedia_transport_attach_param att_param; 
    13871427 
    13881428    if (!pool) { 
     
    14551495    stream->use_ka = info->use_ka; 
    14561496#endif 
     1497    stream->num_keyframe = info->sk_cfg.count; 
    14571498 
    14581499    /* Build random RTCP CNAME. CNAME has user@host format */ 
     
    16251666 
    16261667    stream->out_rtcp_pkt = pj_pool_alloc(pool, stream->out_rtcp_pkt_size); 
     1668    att_param.stream = stream; 
     1669    att_param.media_type = PJMEDIA_TYPE_VIDEO; 
     1670    att_param.user_data = stream; 
     1671    pj_sockaddr_cp(&att_param.rem_addr, &info->rem_addr); 
     1672    pj_sockaddr_cp(&att_param.rem_rtcp, &info->rem_rtcp); 
     1673    att_param.addr_len = pj_sockaddr_get_len(&info->rem_addr); 
     1674    att_param.rtp_cb = &on_rx_rtp; 
     1675    att_param.rtcp_cb = &on_rx_rtcp; 
    16271676 
    16281677    /* Only attach transport when stream is ready. */ 
    1629     status = pjmedia_transport_attach(tp, stream, &info->rem_addr,  
    1630                                       &info->rem_rtcp,  
    1631                                       pj_sockaddr_get_len(&info->rem_addr),  
    1632                                       &on_rx_rtp, &on_rx_rtcp); 
     1678    status = pjmedia_transport_attach2(tp, &att_param); 
    16331679    if (status != PJ_SUCCESS) 
    16341680        return status; 
     
    20052051 
    20062052 
     2053/* 
     2054 * Initialize the video stream send keyframe with default settings. 
     2055 */ 
     2056PJ_DEF(void) 
     2057pjmedia_vid_stream_sk_config_default(pjmedia_vid_stream_sk_config *cfg) 
     2058{ 
     2059    pj_bzero(cfg, sizeof(*cfg)); 
     2060    cfg->count = PJMEDIA_VID_STREAM_START_KEYFRAME_CNT; 
     2061    cfg->interval = PJMEDIA_VID_STREAM_START_KEYFRAME_INTERVAL_MSEC; 
     2062} 
     2063 
     2064 
     2065/** 
     2066 * Get RTP session information from video stream. 
     2067 */ 
     2068PJ_DEF(pj_status_t) 
     2069pjmedia_vid_stream_get_rtp_session_info(pjmedia_vid_stream *stream, 
     2070                                    pjmedia_stream_rtp_sess_info *session_info) 
     2071{ 
     2072    session_info->rx_rtp = &stream->dec->rtp; 
     2073    session_info->tx_rtp = &stream->enc->rtp; 
     2074    session_info->rtcp = &stream->rtcp; 
     2075    return PJ_SUCCESS; 
     2076} 
     2077 
     2078 
    20072079#endif /* PJMEDIA_HAS_VIDEO */ 
Note: See TracChangeset for help on using the changeset viewer.