From da8c1995056dd6dfb982d612dcd238ae925bd90c Mon Sep 17 00:00:00 2001 From: Uoti Urpala Date: Fri, 28 Jan 2011 20:15:22 +0200 Subject: core: timing: fix overflow with extreme playback speed With extreme playback speed changes it was possible to trigger an overflow in code calculating frame timing. This could break the VDPAU frame scheduling mechanism and lead to the shown picture not changing until reset by events such as seeking. Add an extra check to prevent the overflow. --- mplayer.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mplayer.c b/mplayer.c index fd7dbc6fab..03067ad9b0 100644 --- a/mplayer.c +++ b/mplayer.c @@ -3422,7 +3422,11 @@ static void run_playloop(struct MPContext *mpctx) mpctx->time_frame += mpctx->video_out->flip_queue_offset; unsigned int t2 = GetTimer(); - unsigned int pts_us = mpctx->last_time + mpctx->time_frame * 1e6; + /* Playing with playback speed it's possible to get pathological + * cases with mpctx->time_frame negative enough to cause an + * overflow in pts_us calculation, thus the FFMAX. */ + double time_frame = FFMAX(mpctx->time_frame, -1); + unsigned int pts_us = mpctx->last_time + time_frame * 1e6; int duration = -1; double pts2 = mpctx->video_out->next_pts2; if (pts2 != MP_NOPTS_VALUE && opts->correct_pts -- cgit v1.2.3