static double compute_target_delay(double delay, VideoState *is){
diff = get_clock(&is->vidclk) - get_master_clock(is);
if (diff <= -sync_threshold)
delay减小
else if (diff >= sync_threshold)
delay增大
return delay;
}
static void video_refresh(void *opaque, double *remaining_time)
{
time= av_gettime_relative()/1000000.0;
if (time < is->frame_timer + delay) {
goto display; //显示上一帧?
}
is->frame_timer += delay;
...
duration = vp_duration(is, vp, nextvp);
if(其它的条件
&& time > is->frame_timer + duration) {
frame_queue_next(&is->pictq);
goto retry;//继续读数据
}
}
当前系统时间 < 上一帧的显示时间+delay,显示上一帧。
当前系统时间 > 这一帧的显示时间+(下一帧-当前帧差值),丢帧。