summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2016-10-26 20:43:03 +0200
committerwm4 <wm4@nowhere>2016-10-26 20:44:05 +0200
commit90b968a67a73473d615e2ee6135756573d0da6f2 (patch)
treeb587fa97140e35d27f08f35fb0f5c53f21b28b0a /player
parentfc4318d23e07cb1e3b212dfe21e5988ef23f6749 (diff)
downloadmpv-90b968a67a73473d615e2ee6135756573d0da6f2.tar.bz2
mpv-90b968a67a73473d615e2ee6135756573d0da6f2.tar.xz
player: show subtitles on VO if --force-window is used
If a VO is created, but no video is playing (i.e. --force-window is used), then until now no subtitles were shown. This is because VO subtitle display normally depends on video frame timing. If there are no video frames, there can be no subtitles. Change this and add some code to handle this situation specifically. Set a subtitle PTS manually and request VO redrawing manually, which gets the subtitles rendered somehow. This is kind of shaky. The subtitles are essentially sampled at arbitrary times (such as when new audio data is decoded and pushed to the AO, or on user interaction). To make a it slightly more consistent, force a completely arbitrary minimum FPS of 10. Other solutions (such as creating fake video) would be more intrusive or would require VO-level API changes. Fixes #3684.
Diffstat (limited to 'player')
-rw-r--r--player/playloop.c2
-rw-r--r--player/sub.c13
-rw-r--r--player/video.c3
3 files changed, 17 insertions, 1 deletions
diff --git a/player/playloop.c b/player/playloop.c
index aa3eb637ee..2a4509ab95 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -1095,7 +1095,7 @@ void run_playloop(struct MPContext *mpctx)
handle_dummy_ticks(mpctx);
update_osd_msg(mpctx);
- if (!mpctx->video_out)
+ if (!mpctx->vo_chain)
update_subtitles(mpctx, mpctx->playback_pts);
handle_eof(mpctx);
diff --git a/player/sub.c b/player/sub.c
index c4a24fe011..04af1e1e15 100644
--- a/player/sub.c
+++ b/player/sub.c
@@ -112,6 +112,19 @@ static bool update_subtitle(struct MPContext *mpctx, double video_pts,
if (mpctx->current_track[0][STREAM_SUB] == track && !mpctx->video_out)
term_osd_set_subs(mpctx, sub_get_text(dec_sub, video_pts));
+ // Handle displaying subtitles on VO with no video being played. This is
+ // quite differently, because normally subtitles are redrawn on new video
+ // frames, using the video frames' timestamps.
+ if (mpctx->video_out && !mpctx->vo_chain) {
+ if (osd_get_force_video_pts(mpctx->osd) != video_pts) {
+ osd_set_force_video_pts(mpctx->osd, video_pts);
+ osd_query_and_reset_want_redraw(mpctx->osd);
+ vo_redraw(mpctx->video_out);
+ }
+ // Force an arbitrary minimum FPS
+ mp_set_timeout(mpctx, 0.1);
+ }
+
return true;
}
diff --git a/player/video.c b/player/video.c
index 21babe016e..7a76f4dc8e 100644
--- a/player/video.c
+++ b/player/video.c
@@ -482,6 +482,9 @@ int reinit_video_chain_src(struct MPContext *mpctx, struct lavfi_pad *src)
update_window_title(mpctx, true);
+ // Undo what the subtitle path does if mpctx->vo_chain is unset.
+ osd_set_force_video_pts(mpctx->osd, MP_NOPTS_VALUE);
+
struct vo_chain *vo_c = talloc_zero(NULL, struct vo_chain);
mpctx->vo_chain = vo_c;
vo_c->log = mpctx->log;