From f1175cd905f5e89427ee7bfa14439ecdbffdfb11 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 13 Nov 2012 00:56:20 +0100 Subject: core: add --keep-open, which doesn't close the file on EOF The --keep-open option causes mpv not to close the current file. Instead, it will pause, and allow the user to seek around. When seeking beyond the end of the file, mpv does a precise seek back to the previous last known position that produced video output. In some corner cases, mpv might not be able to produce video output at all, despite having created a VO. (Possibly when only 1 frame could be decoded, but the video filter chain queues frames. Then a VO would be created, without sending an actual video frame to the VO.) In these cases, the VO window will not redraw, not even OSD. Based on a patch by coax [1]. [1] http://devel.mplayer2.org/ticket/210#comment:4 --- core/mplayer.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'core/mplayer.c') diff --git a/core/mplayer.c b/core/mplayer.c index 39d5c37543..1946fd6e60 100644 --- a/core/mplayer.c +++ b/core/mplayer.c @@ -3183,6 +3183,7 @@ static void run_playloop(struct MPContext *mpctx) vo_new_frame_imminent(vo); struct sh_video *sh_video = mpctx->sh_video; mpctx->video_pts = sh_video->pts; + mpctx->last_vo_pts = mpctx->video_pts; update_subtitles(mpctx, sh_video->pts); update_osd_msg(mpctx); draw_osd(mpctx); @@ -3369,6 +3370,18 @@ static void run_playloop(struct MPContext *mpctx) queue_seek(mpctx, MPSEEK_RELATIVE, step_sec, 0); } + if (opts->keep_open && mpctx->stop_play == AT_END_OF_FILE) { + mpctx->stop_play = KEEP_PLAYING; + pause_player(mpctx); + if (mpctx->video_out && !mpctx->video_out->hasframe) { + // Force screen refresh to make OSD usable + double seek_to = mpctx->last_vo_pts; + if (seek_to == MP_NOPTS_VALUE) + seek_to = 0; // arbitrary default + queue_seek(mpctx, MPSEEK_ABSOLUTE, seek_to, 1); + } + } + /* Looping. */ if (opts->loop_times >= 0 && (mpctx->stop_play == AT_END_OF_FILE || mpctx->stop_play == PT_NEXT_ENTRY)) { @@ -4019,6 +4032,7 @@ goto_enable_cache: mpctx->drop_message_shown = 0; mpctx->restart_playback = true; mpctx->video_pts = 0; + mpctx->last_vo_pts = MP_NOPTS_VALUE; mpctx->last_seek_pts = 0; mpctx->hrseek_active = false; mpctx->hrseek_framedrop = false; -- cgit v1.2.3