Ignore:
Timestamp:
Dec 7, 2011 10:43:28 AM (13 years ago)
Author:
nanang
Message:

Re #1234: Initial version of keyframe request/response via SIP INFO.

File:
1 edited

Legend:

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

    r3898 r3901  
    6969#endif 
    7070 
     71 
    7172/** 
    7273 * Media channel. 
     
    124125    pjmedia_event            fmt_event;     /**< Buffered fmt_changed event 
    125126                                                 to avoid deadlock          */ 
     127    pjmedia_event            miss_keyframe_event;  
     128                                            /**< Buffered missing keyframe 
     129                                                 event for delayed republish*/ 
    126130 
    127131    unsigned                 frame_size;    /**< Size of encoded base frame.*/ 
     
    131135    pjmedia_frame           *rx_frames;     /**< Temp. buffer for incoming 
    132136                                                 frame assembly.            */ 
     137 
     138    pj_bool_t                force_keyframe;/**< Forced to encode keyframe? */ 
    133139 
    134140#if defined(PJMEDIA_STREAM_ENABLE_KA) && PJMEDIA_STREAM_ENABLE_KA!=0 
     
    352358            pj_memcpy(&stream->fmt_event, event, sizeof(*event)); 
    353359            return PJ_SUCCESS; 
     360 
     361        case PJMEDIA_EVENT_KEYFRAME_MISSING: 
     362            /* Republish this event later from get_frame(). */ 
     363            pj_memcpy(&stream->miss_keyframe_event, event, sizeof(*event)); 
     364            return PJ_SUCCESS; 
     365 
    354366        default: 
    355367            break; 
     
    764776    pj_bool_t has_more_data = PJ_FALSE; 
    765777    pj_size_t total_sent = 0; 
    766  
     778    pjmedia_vid_encode_opt enc_opt; 
    767779 
    768780#if defined(PJMEDIA_STREAM_ENABLE_KA) && PJMEDIA_STREAM_ENABLE_KA != 0 
     
    797809    frame_out.size = 0; 
    798810 
     811    /* Init encoding option */ 
     812    pj_bzero(&enc_opt, sizeof(enc_opt)); 
     813    if (stream->force_keyframe) { 
     814        /* Force encoder to generate keyframe */ 
     815        enc_opt.force_keyframe = PJ_TRUE; 
     816        stream->force_keyframe = PJ_FALSE; 
     817        TRC_((channel->port.info.name.ptr, 
     818              "Forcing encoder to generate keyframe")); 
     819    } 
     820 
    799821    /* Encode! */ 
    800     status = pjmedia_vid_codec_encode_begin(stream->codec, frame, 
     822    status = pjmedia_vid_codec_encode_begin(stream->codec, &enc_opt, frame, 
    801823                                            channel->buf_size - 
    802824                                               sizeof(pjmedia_rtp_hdr), 
     
    10801102    } 
    10811103 
     1104    if (stream->miss_keyframe_event.type != PJMEDIA_EVENT_NONE) { 
     1105        pjmedia_event_publish(NULL, port, &stream->miss_keyframe_event, 
     1106                              PJMEDIA_EVENT_PUBLISH_POST_EVENT); 
     1107        stream->miss_keyframe_event.type = PJMEDIA_EVENT_NONE; 
     1108    } 
     1109 
    10821110    pj_mutex_lock( stream->jb_mutex ); 
    10831111 
     
    14251453 
    14261454    /* Set up jitter buffer */ 
    1427     pjmedia_jbuf_set_adaptive( stream->jb, jb_init, jb_min_pre, jb_max_pre); 
    1428     //pjmedia_jbuf_enable_discard(stream->jb, PJ_FALSE); 
     1455    pjmedia_jbuf_set_adaptive(stream->jb, jb_init, jb_min_pre, jb_max_pre); 
     1456    pjmedia_jbuf_set_discard(stream->jb, PJMEDIA_JB_DISCARD_NONE); 
    14291457 
    14301458    /* Init RTCP session: */ 
     
    20912119} 
    20922120 
     2121 
     2122/* 
     2123 * Force stream to send video keyframe. 
     2124 */ 
     2125PJ_DEF(pj_status_t) pjmedia_vid_stream_send_keyframe( 
     2126                                                pjmedia_vid_stream *stream) 
     2127{ 
     2128    PJ_ASSERT_RETURN(stream, PJ_EINVAL); 
     2129 
     2130    if (!pjmedia_vid_stream_is_running(stream, PJMEDIA_DIR_ENCODING)) 
     2131        return PJ_EINVALIDOP; 
     2132 
     2133    stream->force_keyframe = PJ_TRUE; 
     2134 
     2135    return PJ_SUCCESS; 
     2136} 
     2137 
     2138 
    20932139#endif /* PJMEDIA_HAS_VIDEO */ 
Note: See TracChangeset for help on using the changeset viewer.