0
0
mirror of https://github.com/mpv-player/mpv.git synced 2024-09-20 03:52:22 +02:00

osd: reset OSD change state even if VO doesn't draw OSD

Commit 168293e0ae 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.)
This commit is contained in:
wm4 2012-08-07 01:58:43 +02:00
parent 2287245136
commit 0268b1a445
3 changed files with 12 additions and 1 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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);