summaryrefslogtreecommitdiffstats
path: root/mplayer.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-10-21 14:58:46 +0200
committerwm4 <wm4@nowhere>2012-10-24 21:56:34 +0200
commit0c49ddc818fee8059d764f7fbd25820584f335a3 (patch)
tree156cc35c4c38aabbc886baadd89fea8202d21381 /mplayer.c
parent796e5638ac6bd5e13e0f69e2b9557ba0af1718cd (diff)
downloadmpv-0c49ddc818fee8059d764f7fbd25820584f335a3.tar.bz2
mpv-0c49ddc818fee8059d764f7fbd25820584f335a3.tar.xz
sub: simplify OSD redrawing logic
Normally, we can redraw the OSD any time. But some drivers don't support OSD redrawing (vo_null etc.), or only "sometimes" (vo_xv). For that, some additional logic is needed. Simplify that logic. This might also fix subtle bugs with the OSD not updating or endless frame stepping in unforseen corner cases. Do this by adding a new flag, which tells whether the OSD should be redrawn. Remove some minor code duplication.
Diffstat (limited to 'mplayer.c')
-rw-r--r--mplayer.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/mplayer.c b/mplayer.c
index 0edd8bfc1c..f9b6f687c1 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -2544,15 +2544,22 @@ void unpause_player(struct MPContext *mpctx)
(void)get_relative_time(mpctx); // ignore time that passed during pause
}
+static void draw_osd(struct MPContext *mpctx)
+{
+ struct vo *vo = mpctx->video_out;
+
+ mpctx->osd->vo_pts = mpctx->video_pts;
+ vo_draw_osd(vo, mpctx->osd);
+ mpctx->osd->want_redraw = false;
+}
+
static int redraw_osd(struct MPContext *mpctx)
{
struct vo *vo = mpctx->video_out;
if (vo_redraw_frame(vo) < 0)
return -1;
- mpctx->osd->vo_pts = mpctx->video_pts;
- vo_draw_osd(vo, mpctx->osd);
- osd_reset_changed(mpctx->osd);
+ draw_osd(mpctx);
vo_flip_page(vo, 0, -1);
return 0;
@@ -3158,10 +3165,7 @@ static void run_playloop(struct MPContext *mpctx)
mpctx->video_pts = sh_video->pts;
update_subtitles(mpctx, sh_video->pts);
update_osd_msg(mpctx);
-
- mpctx->osd->vo_pts = mpctx->video_pts;
- vo_draw_osd(vo, mpctx->osd);
- osd_reset_changed(mpctx->osd);
+ draw_osd(mpctx);
mpctx->time_frame -= get_relative_time(mpctx);
mpctx->time_frame -= vo->flip_queue_offset;
@@ -3303,7 +3307,8 @@ static void run_playloop(struct MPContext *mpctx)
if (sleeptime > 0) {
if (!mpctx->sh_video)
goto novideo;
- if (osd_has_changed(mpctx->osd) || mpctx->video_out->want_redraw) {
+ if (mpctx->osd->want_redraw || mpctx->video_out->want_redraw) {
+ mpctx->osd->want_redraw = false;
if (redraw_osd(mpctx) < 0) {
if (mpctx->paused && video_left)
add_step_frame(mpctx);