double synchronizeVideo(double videoPts) { // assume delay to next frame equals delay between previous frames double delay = videoPts - previousVideoPts; if (delay <= 0 || delay >= 1.0) { // if incorrect delay, use previous one delay = previousVideoDelay; } previousVideoPts = videoPts; previousVideoDelay = delay; if (videoDecoder.HasAudio && syncMode == SyncMode.VIDEO_SYNCS_TO_AUDIO) { // synchronize video to audio double diff = getVideoClock() - audioPlayer.getAudioClock(); // Skip or repeat the frame. Take delay into account // FFPlay still doesn't "know if this is the best guess." double sync_threshold = (delay > AV_SYNC_THRESHOLD) ? delay : AV_SYNC_THRESHOLD; if (Math.Abs(diff) < AV_NOSYNC_THRESHOLD) { if (diff <= -sync_threshold) { delay = 0; } else if (diff >= sync_threshold) { delay = 2 * delay; } } } // adjust delay based on the actual current time videoFrameTimer += delay; double actualDelay = videoFrameTimer - HRTimer.getTimestamp(); videoDebug.VideoDelay = delay; videoDebug.ActualVideoDelay = actualDelay; videoDebug.VideoSync = getVideoClock(); videoDebug.AudioSync = audioPlayer.getAudioClock(); videoDebug.VideoQueueSize = videoDecoder.FrameQueue.VideoPacketsInQueue; videoDebug.AudioQueueSize = videoDecoder.FrameQueue.AudioPacketsInQueue; return(actualDelay); }