From c57304a591d46df490e1584b1a3c9cda1ff91b44 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 30 Jun 2016 21:38:50 +0200 Subject: 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. --- sub/osd_libass.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) (limited to 'sub/osd_libass.c') 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; } -- cgit v1.2.3