summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-08-07 01:58:43 +0200
committerwm4 <wm4@nowhere>2012-08-07 01:58:43 +0200
commit0268b1a44562ea5310491fbcbb987d5462f42ca5 (patch)
treeb96a42861bdb8733b73615da8fdc88a3f9807f03
parent22872451369fe219990c6280fc0d1c0c0c344b55 (diff)
downloadmpv-0268b1a44562ea5310491fbcbb987d5462f42ca5.tar.bz2
mpv-0268b1a44562ea5310491fbcbb987d5462f42ca5.tar.xz
osd: reset OSD change state even if VO doesn't draw OSD
Commit 168293e0ae6f08 assumed the OSD drawing routines (which have the functions osd_draw_text/_ext as entrypoint) would always be called, and relied on that to reset the change flag. Some VOs, such as vo_null, didn't do this. Pausing could turn into endless framestepping in some cases. Restore the part of the OSD drawing logic that dealt with this. (Alternatively, the VOs could be obliged to always call the OSD drawing routines, even if the VO doesn't actually draw the OSD. But it seems even more messy to rely on that.)
-rw-r--r--mplayer.c3
-rw-r--r--sub/sub.c9
-rw-r--r--sub/sub.h1
3 files changed, 12 insertions, 1 deletions
diff --git a/mplayer.c b/mplayer.c
index 25fafa1b72..f99b645494 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -2584,6 +2584,7 @@ static int redraw_osd(struct MPContext *mpctx)
if (!(sh_video->output_flags & VFCAP_EOSD_FILTER))
vf->control(vf, VFCTRL_DRAW_EOSD, mpctx->osd);
vf->control(vf, VFCTRL_DRAW_OSD, mpctx->osd);
+ vo_osd_reset_changed();
vo_flip_page(mpctx->video_out, 0, -1);
return 0;
}
@@ -3131,7 +3132,7 @@ static void run_playloop(struct MPContext *mpctx)
mpctx->osd->pts = mpctx->video_pts - mpctx->osd->sub_offset;
vf->control(vf, VFCTRL_DRAW_EOSD, mpctx->osd);
vf->control(vf, VFCTRL_DRAW_OSD, mpctx->osd);
- vo_osd_changed(0);
+ vo_osd_reset_changed();
mpctx->time_frame -= get_relative_time(mpctx);
mpctx->time_frame -= vo->flip_queue_offset;
diff --git a/sub/sub.c b/sub/sub.c
index 731bec3565..f88e9869ee 100644
--- a/sub/sub.c
+++ b/sub/sub.c
@@ -393,6 +393,15 @@ void vo_osd_changed(int new_value)
}
}
+void vo_osd_reset_changed(void)
+{
+ mp_osd_obj_t* obj = vo_osd_list;
+ while (obj) {
+ obj->flags = obj->flags & ~OSDFLAG_FORCE_UPDATE;
+ obj = obj->next;
+ }
+}
+
bool vo_osd_has_changed(struct osd_state *osd)
{
mp_osd_obj_t* obj = vo_osd_list;
diff --git a/sub/sub.h b/sub/sub.h
index de8fbc6487..eabf6561d1 100644
--- a/sub/sub.h
+++ b/sub/sub.h
@@ -165,6 +165,7 @@ struct osd_state *osd_create(struct MPOpts *opts, struct ass_library *asslib);
void osd_set_text(struct osd_state *osd, const char *text);
int osd_update(struct osd_state *osd, int dxs, int dys);
void vo_osd_changed(int new_value);
+void vo_osd_reset_changed(void);
bool vo_osd_has_changed(struct osd_state *osd);
void vo_osd_resized(void);
int vo_osd_check_range_update(int,int,int,int);