summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-10-04 00:24:17 +0200
committerwm4 <wm4@nowhere>2013-10-04 00:27:54 +0200
commit6a0408be68153fec89405ec568e62f4ce306ea9d (patch)
treebb06e8cf42cb3f724a19da9b40d7593d971f11af
parent76f32e3881183b2fd321bd4a3e209d4144e1d323 (diff)
downloadmpv-6a0408be68153fec89405ec568e62f4ce306ea9d.tar.bz2
mpv-6a0408be68153fec89405ec568e62f4ce306ea9d.tar.xz
mplayer: don't keep previous video frame with --force-window
When for example switching off the video stream, and --force-window is used, forcefully reconfigure the VO. This will reset the size, and will clear the window with black. Needed some effort, because you don't always want to clear the window on "discontinuity" points like going to a next file: this would introduce some flicker.
-rw-r--r--mpvcore/mplayer.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/mpvcore/mplayer.c b/mpvcore/mplayer.c
index 85deafb382..c621b93b10 100644
--- a/mpvcore/mplayer.c
+++ b/mpvcore/mplayer.c
@@ -201,6 +201,7 @@ static const char av_desync_help_text[] = _(
static void reset_subtitles(struct MPContext *mpctx);
static void reinit_subs(struct MPContext *mpctx);
+static void handle_force_window(struct MPContext *mpctx, bool reconfig);
static double get_relative_time(struct MPContext *mpctx)
{
@@ -2381,11 +2382,8 @@ int reinit_video_chain(struct MPContext *mpctx)
assert(!(mpctx->initialized_flags & INITIALIZED_VCODEC));
init_demux_stream(mpctx, STREAM_VIDEO);
sh_video_t *sh_video = mpctx->sh_video;
- if (!sh_video) {
- if (!opts->force_vo)
- uninit_player(mpctx, INITIALIZED_VO);
+ if (!sh_video)
goto no_video;
- }
mp_tmsg(MSGT_CPLAYER, MSGL_V, "[V] fourcc:0x%X "
"size:%dx%d fps:%5.3f\n",
@@ -2451,17 +2449,15 @@ int reinit_video_chain(struct MPContext *mpctx)
mpctx->delay = 0;
mpctx->vo_pts_history_seek_ts++;
+ vo_seek_reset(mpctx->video_out);
reset_subtitles(mpctx);
return 1;
err_out:
- if (!opts->force_vo)
- uninit_player(mpctx, INITIALIZED_VO);
- cleanup_demux_stream(mpctx, STREAM_VIDEO);
no_video:
- mpctx->current_track[STREAM_VIDEO] = NULL;
- mpctx->sync_audio_to_video = false;
+ uninit_player(mpctx, INITIALIZED_VCODEC | (opts->force_vo ? 0 : INITIALIZED_VO));
+ handle_force_window(mpctx, true);
mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "Video: no video\n");
return 0;
}
@@ -3557,7 +3553,7 @@ static void handle_keep_open(struct MPContext *mpctx)
// Execute a forceful refresh of the VO window, if it hasn't had a valid frame
// for a while. The problem is that a VO with no valid frame (vo->hasframe==0)
// doesn't redraw video and doesn't OSD interaction. So screw it, hard.
-static void handle_force_window(struct MPContext *mpctx)
+static void handle_force_window(struct MPContext *mpctx, bool reconfig)
{
// Don't interfere with real video playback
if (mpctx->sh_video)
@@ -3567,7 +3563,7 @@ static void handle_force_window(struct MPContext *mpctx)
if (!vo)
return;
- if (!vo->config_ok) {
+ if (!vo->config_ok || reconfig) {
MP_INFO(mpctx, "Creating non-video VO window.\n");
// Pick whatever works
int config_format = 0;
@@ -3676,12 +3672,11 @@ static void run_playloop(struct MPContext *mpctx)
if (!opts->force_vo)
uninit |= INITIALIZED_VO;
uninit_player(mpctx, uninit);
- cleanup_demux_stream(mpctx, STREAM_VIDEO);
mpctx->current_track[STREAM_VIDEO] = NULL;
if (!mpctx->current_track[STREAM_AUDIO])
mpctx->stop_play = PT_NEXT_ENTRY;
mpctx->error_playing = true;
- handle_force_window(mpctx);
+ handle_force_window(mpctx, true);
break;
}
video_left = frame_time >= 0;
@@ -3942,7 +3937,7 @@ static void run_playloop(struct MPContext *mpctx)
handle_keep_open(mpctx);
- handle_force_window(mpctx);
+ handle_force_window(mpctx, false);
execute_queued_seek(mpctx);
}
@@ -4280,14 +4275,18 @@ static void print_resolve_contents(struct mp_log *log,
static void idle_loop(struct MPContext *mpctx)
{
// ================= idle loop (STOP state) =========================
+ bool need_reinit = true;
while (mpctx->opts->player_idle_mode && !mpctx->playlist->current
&& mpctx->stop_play != PT_QUIT)
{
+ if (need_reinit)
+ handle_force_window(mpctx, true);
+ need_reinit = false;
int uninit = INITIALIZED_AO;
if (!mpctx->opts->force_vo)
uninit |= INITIALIZED_VO;
uninit_player(mpctx, uninit);
- handle_force_window(mpctx);
+ handle_force_window(mpctx, false);
if (mpctx->video_out)
vo_check_events(mpctx->video_out);
update_osd_msg(mpctx);