# HG changeset patch # User reimar # Date 1275597581 0 # Node ID a3adde0a5b835ee2516889dae543082675736f8e # Parent 952d773404f5eb37385ea8af5a7480c208d63bb0 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. diff -r 952d773404f5 -r a3adde0a5b83 mplayer.c --- a/mplayer.c Thu Jun 03 17:37:58 2010 +0000 +++ b/mplayer.c Thu Jun 03 20:39:41 2010 +0000 @@ -2401,8 +2401,14 @@ 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;