1
0
mirror of https://github.com/mpv-player/mpv synced 2025-02-26 18:32:08 +00:00

osd: delay libass initialization as far as possible

Until now, most OSD objects created the associated ASS_Renderer instance
as soon as possible, even if nothing was going to be rendered. Maybe
this was even intentional.

Change this for the sake of lowering resource usage, and strictly
initialize ASS_Renderer only when it's really needed.

For the OSC, initialization has to be forced, because of the insane
mechanism for translating mouse coordinates to OSD coordinates.
This commit is contained in:
wm4 2015-09-07 14:26:01 +02:00
parent 392ae68e5f
commit 7c73f70b89
2 changed files with 11 additions and 5 deletions

View File

@ -967,6 +967,8 @@ static int script_set_osd_ass(lua_State *L)
int res_x = luaL_checkinteger(L, 1);
int res_y = luaL_checkinteger(L, 2);
const char *text = luaL_checkstring(L, 3);
if (!text[0])
text = " "; // force external OSD initialization
osd_set_external(mpctx->osd, res_x, res_y, (char *)text);
mp_input_wakeup(mpctx->input);
return 0;

View File

@ -201,11 +201,12 @@ static void update_osd(struct osd_state *osd, struct osd_object *obj)
{
struct MPOpts *opts = osd->opts;
create_ass_track(osd, obj, 0, 0);
clear_obj(obj);
if (!obj->text[0])
return;
create_ass_track(osd, obj, 0, 0);
struct osd_style_opts font = *opts->osd_style;
font.font_size *= opts->osd_scale;
@ -326,14 +327,14 @@ static void get_osd_bar_box(struct osd_state *osd, struct osd_object *obj,
static void update_progbar(struct osd_state *osd, struct osd_object *obj)
{
float px, py, width, height, border;
get_osd_bar_box(osd, obj, &px, &py, &width, &height, &border);
clear_obj(obj);
if (obj->progbar_state.type < 0)
return;
float px, py, width, height, border;
get_osd_bar_box(osd, obj, &px, &py, &width, &height, &border);
float sx = px - border * 2 - height / 4; // includes additional spacing
float sy = py + height / 2;
@ -404,10 +405,13 @@ static void update_progbar(struct osd_state *osd, struct osd_object *obj)
static void update_external(struct osd_state *osd, struct osd_object *obj)
{
create_ass_track(osd, obj, obj->external_res_x, obj->external_res_y);
clear_obj(obj);
bstr t = bstr0(obj->text);
if (!t.len)
return;
create_ass_track(osd, obj, obj->external_res_x, obj->external_res_y);
while (t.len) {
bstr line;
bstr_split_tok(t, "\n", &line, &t);