summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libvo/vo_corevideo.m4
-rw-r--r--libvo/vo_direct3d.c2
-rw-r--r--libvo/vo_gl.c2
-rw-r--r--libvo/vo_gl3.c2
-rw-r--r--mplayer.c18
-rw-r--r--sub/sub.c28
-rw-r--r--sub/sub.h3
7 files changed, 30 insertions, 29 deletions
diff --git a/libvo/vo_corevideo.m b/libvo/vo_corevideo.m
index 5f5f3a0705..6e7699ef82 100644
--- a/libvo/vo_corevideo.m
+++ b/libvo/vo_corevideo.m
@@ -99,7 +99,7 @@ static void resize(struct vo *vo, int width, int height)
gl->MatrixMode(GL_MODELVIEW);
gl->LoadIdentity();
- vo_osd_changed(OSDTYPE_OSD);
+ vo_osd_resized();
gl->Clear(GL_COLOR_BUFFER_BIT);
vo->want_redraw = true;
@@ -232,7 +232,7 @@ static void draw_osd(struct vo *vo, struct osd_state *osd_s)
struct osd_p *osd = p->osd;
GL *gl = p->mpglctx->gl;
- if (vo_osd_changed(0)) {
+ if (vo_osd_has_changed()) {
clearOSD(vo);
osd_draw_text_ext(osd_s, vo->dwidth, vo->dheight, 0, 0, 0, 0,
p->image_width, p->image_height, create_osd_texture,
diff --git a/libvo/vo_direct3d.c b/libvo/vo_direct3d.c
index 872fdd376d..9a4f6e1e04 100644
--- a/libvo/vo_direct3d.c
+++ b/libvo/vo_direct3d.c
@@ -1991,7 +1991,7 @@ static void draw_osd(struct vo *vo, struct osd_state *osd)
if (!priv->d3d_device)
return;
- if (vo_osd_changed(0)) {
+ if (vo_osd_has_changed()) {
struct draw_osd_closure ctx = { priv };
/* clear the OSD */
diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c
index 4d98856ea9..d9c0a2dda5 100644
--- a/libvo/vo_gl.c
+++ b/libvo/vo_gl.c
@@ -785,7 +785,7 @@ static void draw_osd(struct vo *vo, struct osd_state *osd)
if (!p->use_osd)
return;
- if (vo_osd_changed(0)) {
+ if (vo_osd_has_changed(osd)) {
int osd_h, osd_w;
clearOSD(vo);
osd_w = p->scaled_osd ? p->image_width : vo->dwidth;
diff --git a/libvo/vo_gl3.c b/libvo/vo_gl3.c
index b61c7847ad..c3b09db695 100644
--- a/libvo/vo_gl3.c
+++ b/libvo/vo_gl3.c
@@ -1439,7 +1439,7 @@ static void draw_osd(struct vo *vo, struct osd_state *osd)
struct gl_priv *p = vo->priv;
GL *gl = p->gl;
- if (vo_osd_changed(0)) {
+ if (vo_osd_has_changed(osd)) {
clear_osd(p);
osd_draw_text_ext(osd, vo->dwidth, vo->dheight, p->border_x,
p->border_y, p->border_x,
diff --git a/mplayer.c b/mplayer.c
index 43ebe3cc88..52f90768e7 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -1457,10 +1457,7 @@ static void update_osd_msg(struct MPContext *mpctx)
// Look if we have a msg
if ((msg = get_osd_msg(mpctx))) {
if (mpctx->sh_video && opts->term_osd != 1) {
- if (strcmp(osd->osd_text, msg->msg)) {
- osd_set_text(osd, msg->msg);
- vo_osd_changed(OSDTYPE_OSD);
- }
+ osd_set_text(osd, msg->msg);
} else if (opts->term_osd) {
if (strcmp(mpctx->terminal_osd_text, msg->msg)) {
talloc_free(mpctx->terminal_osd_text);
@@ -1480,10 +1477,7 @@ static void update_osd_msg(struct MPContext *mpctx)
if (opts->osd_level >= 2)
sadd_osd_status(text, len, mpctx, opts->osd_level == 3);
- if (strcmp(osd->osd_text, text)) {
- osd_set_text(osd, text);
- vo_osd_changed(OSDTYPE_OSD);
- }
+ osd_set_text(osd, text);
return;
}
@@ -3349,16 +3343,14 @@ static void run_playloop(struct MPContext *mpctx)
if (sleeptime > 0) {
if (!mpctx->sh_video)
goto novideo;
- int hack = vo_osd_changed(0);
- vo_osd_changed(hack);
- if (hack || mpctx->video_out->want_redraw) {
+ if (vo_osd_has_changed(mpctx->osd) || mpctx->video_out->want_redraw)
+ {
if (redraw_osd(mpctx) < 0) {
if (mpctx->paused && video_left)
add_step_frame(mpctx);
else
goto novideo;
- } else
- vo_osd_changed(0);
+ }
} else {
novideo:
mp_input_get_cmd(mpctx->input, sleeptime * 1000, true);
diff --git a/sub/sub.c b/sub/sub.c
index 933a53e37d..492c59f7d8 100644
--- a/sub/sub.c
+++ b/sub/sub.c
@@ -332,17 +332,20 @@ struct osd_state *osd_create(struct MPOpts *opts, struct ass_library *asslib)
#endif
new_osd_obj(OSDTYPE_TELETEXT);
osd_font_invalidate();
- osd_set_text(osd, NULL);
+ osd->osd_text = talloc_strdup(osd, "");
osd_init_backend(osd);
return osd;
}
-void osd_set_text(struct osd_state *osd, const char *text) {
- talloc_free(osd->osd_text);
- //osd->text must never be NULL
+void osd_set_text(struct osd_state *osd, const char *text)
+{
if (!text)
text = "";
+ if (strcmp(osd->osd_text, text) == 0)
+ return;
+ talloc_free(osd->osd_text);
osd->osd_text = talloc_strdup(osd, text);
+ vo_osd_changed(OSDTYPE_OSD);
}
void osd_draw_text_ext(struct osd_state *osd, int dxs, int dys,
@@ -390,20 +393,25 @@ void osd_draw_text(struct osd_state *osd, int dxs, int dys,
osd_draw_text_ext(osd, dxs, dys, 0, 0, 0, 0, dxs, dys, draw_alpha, ctx);
}
-static int vo_osd_changed_status = 0;
-
-int vo_osd_changed(int new_value)
+void vo_osd_changed(int new_value)
{
mp_osd_obj_t* obj=vo_osd_list;
- int ret = vo_osd_changed_status;
- vo_osd_changed_status = new_value;
while(obj){
if(obj->type==new_value) obj->flags|=OSDFLAG_FORCE_UPDATE;
obj=obj->next;
}
+}
- return ret;
+bool vo_osd_has_changed(struct osd_state *osd)
+{
+ mp_osd_obj_t* obj = vo_osd_list;
+ while (obj) {
+ if (obj->flags & OSDFLAG_FORCE_UPDATE)
+ return true;
+ obj = obj->next;
+ }
+ return false;
}
void vo_osd_resized()
diff --git a/sub/sub.h b/sub/sub.h
index 41b3b0ccff..33b5ccf747 100644
--- a/sub/sub.h
+++ b/sub/sub.h
@@ -170,7 +170,8 @@ void osd_draw_text_ext(struct osd_state *osd, int dxs, int dys,
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);
-int vo_osd_changed(int new_value);
+void vo_osd_changed(int new_value);
+bool vo_osd_has_changed(struct osd_state *osd);
void vo_osd_resized(void);
int vo_osd_check_range_update(int,int,int,int);
void osd_free(struct osd_state *osd);