最近在修正一個hls的問題, Audio 跟 Video 會卡頓
先講引發點, 在講修正原因, 以及修正的瑕疵
引發點:frame pts與實際的播放時間有落差, 然後vlc把frame 給丟掉, 因此引起卡頓
程式碼追蹤有點長, 直接貼最後的追蹤位置:./vlc/src/input/decoder.c
Video
if( unlikely(prerolled) )
{
msg_Dbg( p_dec, "end of video preroll" );
f( p_vout )
vout_Flush( p_vout, VLC_TS_INVALID+1 );
}
Audio
if( unlikely(prerolled) )
{
msg_Dbg( p_dec, "end of audio preroll" );
if( p_owner->p_aout )
aout_DecFlush( p_owner->p_aout, false );
}
修正地方:移除 p_owner->i_preroll_end 的設定資料程式, 也就是不成立設定, 永久不 Lost Frame
DecoderUpdatePreroll(..) 裡面的程式碼都註解掉, 如下所示
static inline void DecoderUpdatePreroll( decoder_t *p_dec, int64_t *pi_preroll, const block_t *p )
{
// if( p->i_flags & (BLOCK_FLAG_PREROLL|BLOCK_FLAG_DISCONTINUITY) )
//if( p->i_flags & (BLOCK_FLAG_PREROLL|BLOCK_FLAG_DISCONTINUITY) ){
// msg_Dbg(p_dec, "[Jerome] p->i_flags & (BLOCK_FLAG_PREROLL|BLOCK_FLAG_DISCONTINUITY " );
// *pi_preroll = INT64_MAX;
//}
//else if( p->i_dts > VLC_TS_INVALID ) {
// msg_Dbg(p_dec, "[Jerome] p->i_dts > VLC_TS_INVALID " );
// *pi_preroll = __MIN( *pi_preroll, p->i_dts );
//}
//else if( p->i_pts > VLC_TS_INVALID ) {
// msg_Dbg(p_dec, "[Jerome] p->i_pts > VLC_TS_INVALID " );
// *pi_preroll = __MIN( *pi_preroll, p->i_pts );
//}
}