diff options
author | wm4 <wm4@nowhere> | 2012-10-21 14:58:46 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2012-10-24 21:56:34 +0200 |
commit | 0c49ddc818fee8059d764f7fbd25820584f335a3 (patch) | |
tree | 156cc35c4c38aabbc886baadd89fea8202d21381 /mplayer.c | |
parent | 796e5638ac6bd5e13e0f69e2b9557ba0af1718cd (diff) | |
download | mpv-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.c | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -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); |