diff options
author | wm4 <wm4@nowhere> | 2013-10-04 00:24:17 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2013-10-04 00:27:54 +0200 |
commit | 6a0408be68153fec89405ec568e62f4ce306ea9d (patch) | |
tree | bb06e8cf42cb3f724a19da9b40d7593d971f11af /mpvcore | |
parent | 76f32e3881183b2fd321bd4a3e209d4144e1d323 (diff) | |
download | mpv-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.
Diffstat (limited to 'mpvcore')
-rw-r--r-- | mpvcore/mplayer.c | 29 |
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); |