summaryrefslogtreecommitdiffstats
path: root/mplayer.c
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-06-03 20:39:41 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2010-06-03 20:39:41 +0000
commit9343d1cb2d6b01e5c08a6a82f5b2c43d251c868e (patch)
tree3d50a63e61ae6ba8d18371fb2ecdfa66772cf47d /mplayer.c
parentd6d87593a7bb372ad34b3c8f1901b95b86e38e1f (diff)
downloadmpv-9343d1cb2d6b01e5c08a6a82f5b2c43d251c868e.tar.bz2
mpv-9343d1cb2d6b01e5c08a6a82f5b2c43d251c868e.tar.xz
If an invalid pts value is detected, try to to make up some if it seems
reasonable. This avoids completely losing A-V sync e.g. when pts was not reordered correctly. This was tested with http://samples.mplayerhq.hu/V-codecs/h264/PAFF/tv_cut.mkv for this sample proper pts reordering is the correct solution, but more resilient handling of the error case is still useful. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@31311 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'mplayer.c')
-rw-r--r--mplayer.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/mplayer.c b/mplayer.c
index a0a4c19f20..97fa6aae91 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -2401,8 +2401,14 @@ static double update_video(int *blit_frame)
if (sh_video->last_pts == MP_NOPTS_VALUE)
sh_video->last_pts= sh_video->pts;
else if (sh_video->last_pts > sh_video->pts) {
- sh_video->last_pts = sh_video->pts;
- mp_msg(MSGT_CPLAYER, MSGL_INFO, "pts value < previous\n");
+ // make a guess whether this is some kind of discontinuity
+ // we should jump along with or some wron timestamps we
+ // should replace instead
+ if (sh_video->pts < sh_video->last_pts - 20 * sh_video->frametime)
+ sh_video->last_pts = sh_video->pts;
+ else
+ sh_video->pts = sh_video->last_pts + sh_video->frametime;
+ mp_msg(MSGT_CPLAYER, MSGL_V, "pts value < previous\n");
}
frame_time = sh_video->pts - sh_video->last_pts;
sh_video->last_pts = sh_video->pts;