summaryrefslogtreecommitdiffstats
path: root/mplayer.c
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2011-03-03 12:54:36 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2011-03-03 12:54:36 +0200
commitafef26425d41f34079698891ea71f59212bdef2c (patch)
tree75e20adc9da5ec5c7e0192aca401663a8cd5aa5b /mplayer.c
parent9f6b8e30d2a844c171a2237b6f5f29595c06ff49 (diff)
downloadmpv-afef26425d41f34079698891ea71f59212bdef2c.tar.bz2
mpv-afef26425d41f34079698891ea71f59212bdef2c.tar.xz
core: hr-seek: fix soft hang with hrseek past EOF
When doing a precise seek video_out->frame_loaded was left to true while frames were being skipped. However vo_get_buffered_frame() always returns success if a frame is already loaded; due to this the EOF detection in update_video() never triggered, and a hr-seek past EOF could cause a soft hang (commands were still processed and it was possible to seek again to exit the loop). This could also happen with Matroska files using ordered chapters if an underlying file was actually shorter than the chapter that was supposed to come from it. Then seeking to a timestamp after the end of the file but before the end of the chapter would trigger the bug. Fix the problem by setting frame_loaded to false when we decide to skip the frame in question.
Diffstat (limited to 'mplayer.c')
-rw-r--r--mplayer.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/mplayer.c b/mplayer.c
index 743a364065..b9c7dcdac4 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -2800,8 +2800,10 @@ static double update_video(struct MPContext *mpctx)
if (pts == MP_NOPTS_VALUE)
pts = sh_video->last_pts;
}
- if (mpctx->hrseek_active && pts < mpctx->hrseek_pts - .005)
+ if (mpctx->hrseek_active && pts < mpctx->hrseek_pts - .005) {
+ vo_skip_frame(video_out);
return 0;
+ }
mpctx->hrseek_active = false;
sh_video->pts = pts;
if (sh_video->last_pts == MP_NOPTS_VALUE)
@@ -3364,7 +3366,6 @@ static void run_playloop(struct MPContext *mpctx)
if (!blit_frame || mpctx->hrseek_active) {
double frame_time = update_video(mpctx);
blit_frame = mpctx->video_out->frame_loaded;
- blit_frame &= !mpctx->hrseek_active;
mp_dbg(MSGT_AVSYNC, MSGL_DBG2, "*** ftime=%5.3f ***\n", frame_time);
if (mpctx->sh_video->vf_initialized < 0) {
mp_tmsg(MSGT_CPLAYER, MSGL_FATAL,