diff options
Diffstat (limited to 'sub')
-rw-r--r-- | sub/osd_dummy.c | 7 | ||||
-rw-r--r-- | sub/osd_libass.c | 42 | ||||
-rw-r--r-- | sub/sub.c | 11 | ||||
-rw-r--r-- | sub/sub.h | 10 |
4 files changed, 70 insertions, 0 deletions
diff --git a/sub/osd_dummy.c b/sub/osd_dummy.c index 782ce21942..a330c63982 100644 --- a/sub/osd_dummy.c +++ b/sub/osd_dummy.c @@ -23,3 +23,10 @@ void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj, { *out_imgs = (struct sub_bitmaps) {0}; } + +void osd_object_get_resolution(struct osd_state *osd, struct osd_object *obj, + int *out_w, int *out_h) +{ + *out_w = 0; + *out_h = 0; +} diff --git a/sub/osd_libass.c b/sub/osd_libass.c index 36e2a0ca0f..45edbc7cc8 100644 --- a/sub/osd_libass.c +++ b/sub/osd_libass.c @@ -347,6 +347,38 @@ static void update_progbar(struct osd_state *osd, struct osd_object *obj) ass_draw_reset(d); } +static void update_external(struct osd_state *osd, struct osd_object *obj) +{ + create_osd_ass_track(osd, obj); + clear_obj(obj); + + if (osd->external_res_x < 1 || osd->external_res_y < 1) + return; + + ASS_Track *track = obj->osd_track; + + if (track->PlayResX != osd->external_res_x || + track->PlayResY != osd->external_res_y) + { + track->PlayResX = osd->external_res_x; + track->PlayResY = osd->external_res_y; + // Force libass to clear its internal cache - it doesn't check for + // PlayRes changes itself. + ass_set_frame_size(osd->osd_render, 1, 1); + } + + bstr t = bstr0(osd->external); + while (t.len) { + bstr line; + bstr_split_tok(t, "\n", &line, &t); + if (line.len) { + char *tmp = bstrdup0(NULL, line); + add_osd_ass_event(obj->osd_track, tmp); + talloc_free(tmp); + } + } +} + static void update_sub(struct osd_state *osd, struct osd_object *obj) { struct MPOpts *opts = osd->opts; @@ -386,6 +418,9 @@ static void update_object(struct osd_state *osd, struct osd_object *obj) case OSDTYPE_PROGBAR: update_progbar(osd, obj); break; + case OSDTYPE_EXTERNAL: + update_external(osd, obj); + break; } } @@ -405,3 +440,10 @@ void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj, &obj->parts_cache, out_imgs); talloc_steal(obj, obj->parts_cache); } + +void osd_object_get_resolution(struct osd_state *osd, struct osd_object *obj, + int *out_w, int *out_h) +{ + *out_w = obj->osd_track ? obj->osd_track->PlayResX : 0; + *out_h = obj->osd_track ? obj->osd_track->PlayResY : 0; +} @@ -304,3 +304,14 @@ void osd_changed_all(struct osd_state *osd) for (int n = 0; n < MAX_OSD_PARTS; n++) osd_changed(osd, n); } + +// Scale factor to translate OSD coordinates to what the obj uses internally. +// osd_coordinates * (sh, sh) = obj_coordinates +void osd_object_get_scale_factor(struct osd_state *osd, struct osd_object *obj, + double *sw, double *sh) +{ + int nw, nh; + osd_object_get_resolution(osd, obj, &nw, &nh); + *sw = nw / (double)obj->vo_res.w; + *sh = nh / (double)obj->vo_res.h; +} @@ -90,6 +90,8 @@ enum mp_osdtype { OSDTYPE_PROGBAR, OSDTYPE_OSD, + OSDTYPE_EXTERNAL, + MAX_OSD_PARTS }; @@ -137,6 +139,9 @@ struct osd_state { float progbar_value; // range 0.0-1.0 float *progbar_stops; // used for chapter indicators (0.0-1.0 each) int progbar_num_stops; + // OSDTYPE_EXTERNAL + char *external; + int external_res_x, external_res_y; // OSDTYPE_SUB struct dec_sub *dec_sub; @@ -219,10 +224,15 @@ void osd_draw_on_image_p(struct osd_state *osd, struct mp_osd_res res, double video_pts, int draw_flags, struct mp_image_pool *pool, struct mp_image *dest); +void osd_object_get_scale_factor(struct osd_state *osd, struct osd_object *obj, + double *sw, double *sh); + // defined in osd_libass.c and osd_dummy.c void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj, struct sub_bitmaps *out_imgs); +void osd_object_get_resolution(struct osd_state *osd, struct osd_object *obj, + int *out_w, int *out_h); void osd_get_function_sym(char *buffer, size_t buffer_size, int osd_function); void osd_init_backend(struct osd_state *osd); void osd_destroy_backend(struct osd_state *osd); |