summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sub/osd.c11
-rw-r--r--sub/osd.h12
-rw-r--r--sub/osd_state.h1
3 files changed, 23 insertions, 1 deletions
diff --git a/sub/osd.c b/sub/osd.c
index 86bd976803..15ad5d20d7 100644
--- a/sub/osd.c
+++ b/sub/osd.c
@@ -136,6 +136,7 @@ struct osd_state *osd_create(struct mpv_global *global)
.type = n,
.text = talloc_strdup(obj, ""),
.progbar_state = {.type = -1},
+ .vo_change_id = 1,
};
osd->objs[n] = obj;
}
@@ -293,6 +294,11 @@ static struct sub_bitmaps *render_object(struct osd_state *osd,
res = osd_object_get_bitmaps(osd, obj, format);
}
+ if (obj->vo_had_output != !!res) {
+ obj->vo_had_output = !!res;
+ obj->vo_change_id += 1;
+ }
+
if (res) {
obj->vo_change_id += res->change_id;
@@ -314,6 +320,9 @@ struct sub_bitmap_list *osd_render(struct osd_state *osd, struct mp_osd_res res,
pthread_mutex_lock(&osd->lock);
struct sub_bitmap_list *list = talloc_zero(NULL, struct sub_bitmap_list);
+ list->change_id = 1;
+ list->w = res.w;
+ list->h = res.h;
if (osd->force_video_pts != MP_NOPTS_VALUE)
video_pts = osd->force_video_pts;
@@ -352,6 +361,8 @@ struct sub_bitmap_list *osd_render(struct osd_state *osd, struct mp_osd_res res,
}
}
+ list->change_id += obj->vo_change_id;
+
talloc_free(imgs);
}
diff --git a/sub/osd.h b/sub/osd.h
index 207d789094..17e3ae0282 100644
--- a/sub/osd.h
+++ b/sub/osd.h
@@ -73,10 +73,20 @@ struct sub_bitmaps {
// box. (The origin of the box is at (0,0).)
int packed_w, packed_h;
- int change_id; // Incremented on each change
+ int change_id; // Incremented on each change (0 is never used)
};
struct sub_bitmap_list {
+ // Combined change_id - of any of the existing items change (even if they
+ // e.g. go away and are removed from items[]), this is incremented.
+ int64_t change_id;
+
+ // Bounding box for rendering. It's notable that SUBBITMAP_LIBASS images are
+ // always within these bounds, while SUBBITMAP_RGBA is not necessarily.
+ int w, h;
+
+ // Sorted by sub_bitmaps.render_index. Unused parts are not in the array,
+ // and you cannot index items[] with render_index.
struct sub_bitmaps **items;
int num_items;
};
diff --git a/sub/osd_state.h b/sub/osd_state.h
index 054a98775b..056e54b1a8 100644
--- a/sub/osd_state.h
+++ b/sub/osd_state.h
@@ -49,6 +49,7 @@ struct osd_object {
// VO cache state
int vo_change_id;
struct mp_osd_res vo_res;
+ bool vo_had_output;
// Internally used by osd_libass.c
bool changed;