summaryrefslogtreecommitdiffstats
path: root/sub/osd_libass.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2016-06-30 21:38:50 +0200
committerwm4 <wm4@nowhere>2016-06-30 21:38:50 +0200
commitc57304a591d46df490e1584b1a3c9cda1ff91b44 (patch)
treed64734c8782bbd1b0a8be01b9c2b4a90df39899d /sub/osd_libass.c
parent2d6da37b6b4acfd31487e59e788e2d7b13172314 (diff)
downloadmpv-c57304a591d46df490e1584b1a3c9cda1ff91b44.tar.bz2
mpv-c57304a591d46df490e1584b1a3c9cda1ff91b44.tar.xz
sub: pack libass bitmaps directly in sd_ass.c and osd_libass.c
Change all producer of libass images to packing the bitmaps into a single larger bitmap directly when they're output. This is supposed to help working towards refcounted sub bitmaps. This will reduce performance for VOs like vo_xv, but not for vo_opengl. vo_opengl simply will pick up the pre-packed sub bitmaps, and skip packing them again. vo_xv will copy and pack the sub bitmaps unnecessarily - but if we want sub bitmap refcounting, they'd have to be copied anyway. The packing code cannot be removed yet from vo_opengl, because there are certain corner cases that still produce unpackad other sub bitmaps. Actual refcounting will also require more work.
Diffstat (limited to 'sub/osd_libass.c')
-rw-r--r--sub/osd_libass.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/sub/osd_libass.c b/sub/osd_libass.c
index 6a2efa6603..f940b6117f 100644
--- a/sub/osd_libass.c
+++ b/sub/osd_libass.c
@@ -90,7 +90,6 @@ void osd_destroy_backend(struct osd_state *osd)
for (int n = 0; n < MAX_OSD_PARTS; n++) {
struct osd_object *obj = osd->objs[n];
destroy_ass_renderer(&obj->ass);
- talloc_free(obj->parts_cache.parts);
for (int i = 0; i < obj->num_externals; i++)
destroy_external(&obj->externals[i]);
obj->num_externals = 0;
@@ -501,7 +500,7 @@ void osd_set_external(struct osd_state *osd, void *id, int res_x, int res_y,
entry->res_x = res_x;
entry->res_y = res_y;
update_external(osd, obj, entry);
- obj->parts_cache.change_id = 1;
+ obj->changed = true;
osd_changed_unlocked(osd, obj->type);
}
@@ -510,14 +509,19 @@ done:
}
static void append_ass(struct ass_state *ass, struct mp_osd_res *res,
- struct sub_bitmaps *imgs)
+ ASS_Image **img_list, bool *changed)
{
- if (!ass->render || !ass->track)
+ if (!ass->render || !ass->track) {
+ *img_list = NULL;
return;
+ }
ass_set_frame_size(ass->render, res->w, res->h);
ass_set_aspect_ratio(ass->render, res->display_par, 1.0);
- mp_ass_render_frame(ass->render, ass->track, 0, imgs);
+
+ int ass_changed;
+ *img_list = ass_render_frame(ass->render, ass->track, 0, &ass_changed);
+ *changed |= ass_changed;
}
void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj,
@@ -526,12 +530,19 @@ void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj,
if (obj->force_redraw && obj->type == OSDTYPE_OSD)
update_osd(osd, obj);
- append_ass(&obj->ass, &obj->vo_res, &obj->parts_cache);
- for (int n = 0; n < obj->num_externals; n++)
- append_ass(&obj->externals[n].ass, &obj->vo_res, &obj->parts_cache);
+ if (!obj->ass_packer)
+ obj->ass_packer = mp_ass_packer_alloc(obj);
+
+ MP_TARRAY_GROW(obj, obj->ass_imgs, obj->num_externals + 1);
+
+ append_ass(&obj->ass, &obj->vo_res, &obj->ass_imgs[0], &obj->changed);
+ for (int n = 0; n < obj->num_externals; n++) {
+ append_ass(&obj->externals[n].ass, &obj->vo_res, &obj->ass_imgs[n + 1],
+ &obj->changed);
+ }
- *out_imgs = obj->parts_cache;
+ mp_ass_packer_pack(obj->ass_packer, obj->ass_imgs, obj->num_externals + 1,
+ obj->changed, SUBBITMAP_LIBASS, out_imgs);
- obj->parts_cache.change_id = 0;
- obj->parts_cache.num_parts = 0;
+ obj->changed = false;
}