static void EsOutDecodersStopBuffering( es_out_t *out, bool b_forced ) {
es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out); es_out_id_t *p_es; vlc_tick_t i_stream_start; vlc_tick_t i_system_start; vlc_tick_t i_stream_duration; vlc_tick_t i_system_duration; //通过clock中stream的第一帧和最后一帧数据的pts计算i_stream_duration,即缓存的数据量 if (input_clock_GetState( p_sys->p_pgrm->p_input_clock, &i_stream_start, &i_system_start, &i_stream_duration, &i_system_duration )) return ; vlc_tick_t i_preroll_duration = 0 ; if ( p_sys->i_preroll_end >= 0 ) i_preroll_duration = __MAX( p_sys->i_preroll_end - i_stream_start, 0 ); //这里i_buffering_duration其实主要是由i_pts_delay决定 const vlc_tick_t i_buffering_duration = p_sys->i_pts_delay + p_sys->i_pts_jitter + p_sys->i_tracks_pts_delay + i_preroll_duration + p_sys->i_buffering_extra_stream - p_sys->i_buffering_extra_initial; //如果缓存的数据不够就直接返回;如果参数b_forced置为true,强制结束缓存 if ( i_stream_duration <= i_buffering_duration && !b_forced ) {
double f_level; if (i_buffering_duration == 0 ) f_level = 0 ; else f_level = __MAX( ( double )i_stream_duration / i_buffering_duration, 0 ); input_SendEventCache( p_sys->p_input, f_level ); int i_level = ( int )( 100 * f_level); if ( p_sys->i_prev_stream_level != i_level ) {
msg_Dbg( p_sys->p_input, "Buffering %d%%" , i
|