summaryrefslogtreecommitdiffstats
path: root/sub
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-10-19 19:25:18 +0200
committerwm4 <wm4@nowhere>2012-10-24 21:56:34 +0200
commit4d11f32162b08e3b48ae382e2ed0a151035f8aea (patch)
treec588341bf672fd935de45a05bef99e0d8f20892f /sub
parenta4f9077f6c1a897120616cc70c1ca37c6a247be2 (diff)
downloadmpv-4d11f32162b08e3b48ae382e2ed0a151035f8aea.tar.bz2
mpv-4d11f32162b08e3b48ae382e2ed0a151035f8aea.tar.xz
VO, sub: refactor
Remove VFCTRL_DRAW_OSD, VFCAP_EOSD_FILTER, VFCAP_EOSD_RGBA, VFCAP_EOSD, VOCTRL_DRAW_EOSD, VOCTRL_GET_EOSD_RES, VOCTRL_QUERY_EOSD_FORMAT. Remove draw_osd_with_eosd(), which rendered the OSD by calling VOCTRL_DRAW_EOSD. Change VOs to call osd_draw() directly, which takes a callback as argument. (This basically works like the old OSD API, except multiple OSD bitmap formats are supported and caching is possible.) Remove all mentions of "eosd". It's simply "osd" now. Make OSD size per-OSD-object, as they can be different when using vf_sub. Include display_par/video_par in resolution change detection. Fix the issue with margin borders in vo_corevideo.
Diffstat (limited to 'sub')
-rw-r--r--sub/ass_mp.c6
-rw-r--r--sub/ass_mp.h6
-rw-r--r--sub/dec_sub.c4
-rw-r--r--sub/dec_sub.h11
-rw-r--r--sub/osd_libass.c6
-rw-r--r--sub/sd.h7
-rw-r--r--sub/sd_ass.c12
-rw-r--r--sub/sd_lavc.c15
-rw-r--r--sub/spudec.c2
-rw-r--r--sub/spudec.h4
-rw-r--r--sub/sub.c96
-rw-r--r--sub/sub.h26
12 files changed, 70 insertions, 125 deletions
diff --git a/sub/ass_mp.c b/sub/ass_mp.c
index 65b34d0a18..c4c418d5ba 100644
--- a/sub/ass_mp.c
+++ b/sub/ass_mp.c
@@ -228,7 +228,7 @@ ASS_Track *mp_ass_read_stream(ASS_Library *library, const char *fname,
}
void mp_ass_configure(ASS_Renderer *priv, struct MPOpts *opts,
- struct mp_eosd_res *dim)
+ struct mp_osd_res *dim)
{
ass_set_frame_size(priv, dim->w, dim->h);
ass_set_margins(priv, dim->mt, dim->mb, dim->ml, dim->mr);
@@ -282,7 +282,7 @@ void mp_ass_render_frame(ASS_Renderer *renderer, ASS_Track *track, double time,
struct sub_bitmap **parts, struct sub_bitmaps *res)
{
int changed;
- res->imgs = ass_render_frame(renderer, track, time, &changed);
+ ASS_Image *imgs = ass_render_frame(renderer, track, time, &changed);
if (changed == 2)
res->bitmap_id = ++res->bitmap_pos_id;
else if (changed)
@@ -292,7 +292,7 @@ void mp_ass_render_frame(ASS_Renderer *renderer, ASS_Track *track, double time,
res->parts = *parts;
res->num_parts = 0;
int num_parts_alloc = MP_TALLOC_ELEMS(res->parts);
- for (struct ass_image *img = res->imgs; img; img = img->next) {
+ for (struct ass_image *img = imgs; img; img = img->next) {
if (img->w == 0 || img->h == 0)
continue;
if (res->num_parts >= num_parts_alloc) {
diff --git a/sub/ass_mp.h b/sub/ass_mp.h
index 4ca43dfb2e..c3dbc5e28f 100644
--- a/sub/ass_mp.h
+++ b/sub/ass_mp.h
@@ -32,7 +32,7 @@
#include <ass/ass_types.h>
struct MPOpts;
-struct mp_eosd_res;
+struct mp_osd_res;
ASS_Track *mp_ass_default_track(ASS_Library *library, struct MPOpts *opts);
ASS_Track *mp_ass_read_subdata(ASS_Library *library, struct MPOpts *opts,
@@ -42,7 +42,7 @@ ASS_Track *mp_ass_read_stream(ASS_Library *library, const char *fname,
struct MPOpts;
void mp_ass_configure(ASS_Renderer *priv, struct MPOpts *opts,
- struct mp_eosd_res *dim);
+ struct mp_osd_res *dim);
void mp_ass_configure_fonts(ASS_Renderer *priv);
ASS_Library *mp_ass_init(struct MPOpts *opts);
@@ -53,7 +53,7 @@ void mp_ass_render_frame(ASS_Renderer *renderer, ASS_Track *track, double time,
#else /* CONFIG_ASS */
-/* Needed for EOSD code using this type to compile */
+/* Needed for OSD code using this type to compile */
typedef struct ass_image {
int w, h;
diff --git a/sub/dec_sub.c b/sub/dec_sub.c
index 09d9989494..5ceb3b2422 100644
--- a/sub/dec_sub.c
+++ b/sub/dec_sub.c
@@ -58,7 +58,7 @@ void sub_decode(struct sh_sub *sh, struct osd_state *osd, void *data,
sh->sd_driver->decode(sh, osd, data, data_len, pts, duration);
}
-void sub_get_bitmaps(struct osd_state *osd, struct sub_render_params *params,
+void sub_get_bitmaps(struct osd_state *osd, struct mp_osd_res dim, double pts,
struct sub_bitmaps *res)
{
struct MPOpts *opts = osd->opts;
@@ -74,7 +74,7 @@ void sub_get_bitmaps(struct osd_state *osd, struct sub_render_params *params,
osd->switch_sub_id++;
} else {
if (osd->sh_sub->sd_driver->get_bitmaps)
- osd->sh_sub->sd_driver->get_bitmaps(osd->sh_sub, osd, params, res);
+ osd->sh_sub->sd_driver->get_bitmaps(osd->sh_sub, osd, dim, pts, res);
}
res->bitmap_id += osd->switch_sub_id;
diff --git a/sub/dec_sub.h b/sub/dec_sub.h
index 389851503e..f66f05c021 100644
--- a/sub/dec_sub.h
+++ b/sub/dec_sub.h
@@ -4,16 +4,11 @@
#include <stdbool.h>
#include <stdint.h>
-#include "sub.h"
+#include "sub/sub.h"
struct sh_sub;
struct ass_track;
-struct MPOpts *opts;
-
-struct sub_render_params {
- double pts;
- struct mp_eosd_res dim;
-};
+struct MPOpts;
static inline bool is_text_sub(int type)
{
@@ -22,7 +17,7 @@ static inline bool is_text_sub(int type)
void sub_decode(struct sh_sub *sh, struct osd_state *osd, void *data,
int data_len, double pts, double duration);
-void sub_get_bitmaps(struct osd_state *osd, struct sub_render_params *params,
+void sub_get_bitmaps(struct osd_state *osd, struct mp_osd_res dim, double pts,
struct sub_bitmaps *res);
void sub_init(struct sh_sub *sh, struct osd_state *osd);
void sub_reset(struct sh_sub *sh, struct osd_state *osd);
diff --git a/sub/osd_libass.c b/sub/osd_libass.c
index a182c6bdf2..4a6a0c88cb 100644
--- a/sub/osd_libass.c
+++ b/sub/osd_libass.c
@@ -191,7 +191,7 @@ static void update_progbar(struct osd_state *osd, struct osd_object *obj)
// Assume the OSD bar takes 2/3 of the OSD width at PlayResY=288 and
// FontSize=22 with an OSD aspect ratio of 16:9. Rescale as needed.
// xxx can fail when unknown fonts are involved
- double asp = (double)osd->res.w / osd->res.h;
+ double asp = (double)obj->vo_res.w / obj->vo_res.h;
double scale = (asp / 1.77777) * (obj->osd_track->PlayResY / 288.0);
style->ScaleX = style->ScaleY = scale;
style->FontSize = 22.0;
@@ -282,8 +282,8 @@ void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj,
if (!obj->osd_track)
return;
- ass_set_frame_size(osd->osd_render, osd->res.w, osd->res.h);
- ass_set_aspect_ratio(osd->osd_render, osd->res.display_par, 1.0);
+ ass_set_frame_size(osd->osd_render, obj->vo_res.w, obj->vo_res.h);
+ ass_set_aspect_ratio(osd->osd_render, obj->vo_res.display_par, 1.0);
mp_ass_render_frame(osd->osd_render, obj->osd_track, 0,
&obj->parts_cache, out_imgs);
talloc_steal(obj, obj->parts_cache);
diff --git a/sub/sd.h b/sub/sd.h
index b286d3691b..29f021ab5e 100644
--- a/sub/sd.h
+++ b/sub/sd.h
@@ -1,17 +1,14 @@
#ifndef MPLAYER_SD_H
#define MPLAYER_SD_H
-struct osd_state;
-struct sub_render_params;
-struct sh_sub;
-struct sub_bitmaps;
+#include "dec_sub.h"
struct sd_functions {
int (*init)(struct sh_sub *sh, struct osd_state *osd);
void (*decode)(struct sh_sub *sh, struct osd_state *osd,
void *data, int data_len, double pts, double duration);
void (*get_bitmaps)(struct sh_sub *sh, struct osd_state *osd,
- struct sub_render_params *params,
+ struct mp_osd_res dim, double pts,
struct sub_bitmaps *res);
void (*reset)(struct sh_sub *sh, struct osd_state *osd);
void (*switch_off)(struct sh_sub *sh, struct osd_state *osd);
diff --git a/sub/sd_ass.c b/sub/sd_ass.c
index 7926820ece..8c0719658b 100644
--- a/sub/sd_ass.c
+++ b/sub/sd_ass.c
@@ -128,24 +128,24 @@ static void decode(struct sh_sub *sh, struct osd_state *osd, void *data,
}
static void get_bitmaps(struct sh_sub *sh, struct osd_state *osd,
- struct sub_render_params *params,
+ struct mp_osd_res dim, double pts,
struct sub_bitmaps *res)
{
struct sd_ass_priv *ctx = sh->context;
struct MPOpts *opts = osd->opts;
- if (params->pts == MP_NOPTS_VALUE)
+ if (pts == MP_NOPTS_VALUE)
return;
- double scale = params->dim.display_par;
+ double scale = dim.display_par;
bool use_vs_aspect = opts->ass_style_override
? opts->ass_vsfilter_aspect_compat : 1;
if (ctx->vsfilter_aspect && use_vs_aspect)
- scale = scale * params->dim.video_par;
+ scale = scale * dim.video_par;
ASS_Renderer *renderer = osd->ass_renderer;
- mp_ass_configure(renderer, opts, &params->dim);
+ mp_ass_configure(renderer, opts, &dim);
ass_set_aspect_ratio(renderer, scale, 1);
- mp_ass_render_frame(renderer, ctx->ass_track, params->pts * 1000 + .5,
+ mp_ass_render_frame(renderer, ctx->ass_track, pts * 1000 + .5,
&ctx->parts, res);
talloc_steal(ctx, ctx->parts);
}
diff --git a/sub/sd_lavc.c b/sub/sd_lavc.c
index 4311db7dc5..bee224c506 100644
--- a/sub/sd_lavc.c
+++ b/sub/sd_lavc.c
@@ -176,13 +176,13 @@ static void decode(struct sh_sub *sh, struct osd_state *osd, void *data,
}
static void get_bitmaps(struct sh_sub *sh, struct osd_state *osd,
- struct sub_render_params *params,
+ struct mp_osd_res d, double pts,
struct sub_bitmaps *res)
{
struct sd_lavc_priv *priv = sh->context;
- if (priv->endpts != MP_NOPTS_VALUE && (params->pts >= priv->endpts ||
- params->pts < priv->endpts - 300))
+ if (priv->endpts != MP_NOPTS_VALUE && (pts >= priv->endpts ||
+ pts < priv->endpts - 300))
clear(priv);
if (priv->bitmaps_changed && priv->count > 0)
priv->outbitmaps = talloc_memdup(priv, priv->inbitmaps,
@@ -190,14 +190,13 @@ static void get_bitmaps(struct sh_sub *sh, struct osd_state *osd,
int inw = priv->avctx->width;
int inh = priv->avctx->height;
guess_resolution(sh->type, &inw, &inh);
- struct mp_eosd_res *d = &params->dim;
- double xscale = (double) (d->w - d->ml - d->mr) / inw;
- double yscale = (double) (d->h - d->mt - d->mb) / inh;
+ double xscale = (double) (d.w - d.ml - d.mr) / inw;
+ double yscale = (double) (d.h - d.mt - d.mb) / inh;
for (int i = 0; i < priv->count; i++) {
struct sub_bitmap *bi = &priv->inbitmaps[i];
struct sub_bitmap *bo = &priv->outbitmaps[i];
- bo->x = bi->x * xscale + d->ml;
- bo->y = bi->y * yscale + d->mt;
+ bo->x = bi->x * xscale + d.ml;
+ bo->y = bi->y * yscale + d.mt;
bo->dw = bi->w * xscale;
bo->dh = bi->h * yscale;
}
diff --git a/sub/spudec.c b/sub/spudec.c
index 353f72de7a..d51f62c0fc 100644
--- a/sub/spudec.c
+++ b/sub/spudec.c
@@ -634,7 +634,7 @@ void spudec_set_forced_subs_only(void * const this, const unsigned int flag)
}
}
-void spudec_get_indexed(void *this, struct mp_eosd_res *dim,
+void spudec_get_indexed(void *this, struct mp_osd_res *dim,
struct sub_bitmaps *res)
{
spudec_handle_t *spu = this;
diff --git a/sub/spudec.h b/sub/spudec.h
index 6611a28327..84a05cbee0 100644
--- a/sub/spudec.h
+++ b/sub/spudec.h
@@ -22,11 +22,11 @@
#include <stdint.h>
struct sub_bitmaps;
-struct mp_eosd_res;
+struct mp_osd_res;
void spudec_heartbeat(void *this, unsigned int pts100);
void spudec_assemble(void *this, unsigned char *packet, unsigned int len, int pts100);
-void spudec_get_indexed(void *this, struct mp_eosd_res *dim, struct sub_bitmaps *res);
+void spudec_get_indexed(void *this, struct mp_osd_res *dim, struct sub_bitmaps *res);
void *spudec_new_scaled(unsigned int *palette, unsigned int frame_width, unsigned int frame_height, uint8_t *extradata, int extradata_len);
void *spudec_new(unsigned int *palette);
void spudec_free(void *this);
diff --git a/sub/sub.c b/sub/sub.c
index 6c0f740766..5a39fbdf60 100644
--- a/sub/sub.c
+++ b/sub/sub.c
@@ -91,21 +91,12 @@ void *vo_vobsub=NULL;
static struct osd_state *global_osd;
-static void osd_update_ext(struct osd_state *osd, struct mp_eosd_res res)
+static bool osd_res_equals(struct mp_osd_res a, struct mp_osd_res b)
{
- struct mp_eosd_res old = osd->res;
- if (old.w != res.w || old.h != res.h || old.ml != res.ml || old.mt != res.mt
- || old.mr != res.mr || old.mb != res.mb)
- {
- osd->res = res;
- for (int n = 0; n < MAX_OSD_PARTS; n++)
- osd->objs[n]->force_redraw = true;
- }
-}
-
-void osd_update(struct osd_state *osd, int w, int h)
-{
- osd_update_ext(osd, (struct mp_eosd_res) {.w = w, .h = h});
+ return a.w == b.w && a.h == b.h && a.ml == b.ml && a.mt == b.mt
+ && a.mr == b.mr && a.mb == b.mb
+ && a.display_par == b.display_par
+ && a.video_par == b.video_par;
}
struct osd_state *osd_create(struct MPOpts *opts, struct ass_library *asslib)
@@ -163,22 +154,24 @@ static bool spu_visible(struct osd_state *osd, struct osd_object *obj)
}
static void render_object(struct osd_state *osd, struct osd_object *obj,
- struct sub_bitmaps *out_imgs,
- struct sub_render_params *sub_params,
- const bool formats[SUBBITMAP_COUNT])
+ struct mp_osd_res res, double video_pts,
+ const bool formats[SUBBITMAP_COUNT],
+ struct sub_bitmaps *out_imgs)
{
*out_imgs = (struct sub_bitmaps) {0};
+ if (!osd_res_equals(res, obj->vo_res))
+ obj->force_redraw = true;
+ obj->vo_res = res;
+
if (obj->type == OSDTYPE_SPU) {
- if (spu_visible(osd, obj)) {
- //spudec_get_bitmap(vo_spudec, osd->res.w, osd->res.h, out_imgs);
- spudec_get_indexed(vo_spudec, &osd->res, out_imgs);
- }
+ if (spu_visible(osd, obj))
+ spudec_get_indexed(vo_spudec, &obj->vo_res, out_imgs);
} else if (obj->type == OSDTYPE_SUB) {
- struct sub_render_params p = *sub_params;
- if (p.pts != MP_NOPTS_VALUE)
- p.pts += sub_delay - osd->sub_offset;
- sub_get_bitmaps(osd, &p, out_imgs);
+ double sub_pts = video_pts;
+ if (sub_pts != MP_NOPTS_VALUE)
+ sub_pts += sub_delay - osd->sub_offset;
+ sub_get_bitmaps(osd, obj->vo_res, sub_pts, out_imgs);
} else {
osd_object_get_bitmaps(osd, obj, out_imgs);
}
@@ -212,24 +205,22 @@ static void render_object(struct osd_state *osd, struct osd_object *obj,
bool cached = false; // do we have a copy of all the image data?
- if (formats[SUBBITMAP_RGBA] && out_imgs->format == SUBBITMAP_INDEXED) {
+ if (formats[SUBBITMAP_RGBA] && out_imgs->format == SUBBITMAP_INDEXED)
cached |= osd_conv_idx_to_rgba(obj->cache[0], out_imgs);
- }
if (cached)
obj->cached = *out_imgs;
}
// draw_flags is a bit field of OSD_DRAW_* constants
-void osd_draw(struct osd_state *osd, struct sub_render_params *params,
- int draw_flags, const bool formats[SUBBITMAP_COUNT],
+void osd_draw(struct osd_state *osd, struct mp_osd_res res,
+ double video_pts, int draw_flags,
+ const bool formats[SUBBITMAP_COUNT],
void (*cb)(void *ctx, struct sub_bitmaps *imgs), void *cb_ctx)
{
if (draw_flags & OSD_DRAW_SUB_FILTER)
draw_flags |= OSD_DRAW_SUB_ONLY;
- osd_update_ext(osd, params->dim);
-
for (int n = 0; n < MAX_OSD_PARTS; n++) {
struct osd_object *obj = osd->objs[n];
@@ -241,7 +232,7 @@ void osd_draw(struct osd_state *osd, struct sub_render_params *params,
continue;
struct sub_bitmaps imgs;
- render_object(osd, obj, &imgs, params, formats);
+ render_object(osd, obj, res, video_pts, formats, &imgs);
if (imgs.num_parts > 0) {
if (formats[imgs.format]) {
cb(cb_ctx, &imgs);
@@ -254,35 +245,6 @@ void osd_draw(struct osd_state *osd, struct sub_render_params *params,
}
}
-static void vo_draw_eosd(void *ctx, struct sub_bitmaps *imgs)
-{
- struct vo *vo = ctx;
- vo_control(vo, VOCTRL_DRAW_EOSD, imgs);
-}
-
-void draw_osd_with_eosd(struct vo *vo, struct osd_state *osd)
-{
- struct mp_eosd_res dim = {0};
- if (vo_control(vo, VOCTRL_GET_EOSD_RES, &dim) != VO_TRUE)
- return;
-
- bool formats[SUBBITMAP_COUNT];
- for (int n = 0; n < SUBBITMAP_COUNT; n++) {
- int data = n;
- formats[n] = vo_control(vo, VOCTRL_QUERY_EOSD_FORMAT, &data) == VO_TRUE;
- }
-
- dim.display_par = vo->monitor_par;
- dim.video_par = vo->aspdat.par;
-
- struct sub_render_params subparams = {
- .pts = osd->vo_sub_pts,
- .dim = dim,
- };
-
- osd_draw(osd, &subparams, 0, formats, &vo_draw_eosd, vo);
-}
-
struct draw_on_image_closure {
struct osd_state *osd;
struct mp_image *dest;
@@ -301,12 +263,12 @@ static void draw_on_image(void *ctx, struct sub_bitmaps *imgs)
}
// Returns whether anything was drawn.
-bool osd_draw_on_image(struct osd_state *osd, struct sub_render_params *params,
- int draw_flags, struct mp_image *dest,
+bool osd_draw_on_image(struct osd_state *osd, struct mp_osd_res res,
+ double video_pts, int draw_flags, struct mp_image *dest,
struct mp_csp_details *dest_csp)
{
struct draw_on_image_closure closure = {osd, dest, dest_csp};
- osd_draw(osd, params, draw_flags, mp_draw_sub_formats,
+ osd_draw(osd, res, video_pts, draw_flags, mp_draw_sub_formats,
&draw_on_image, &closure);
return closure.changed;
}
@@ -320,7 +282,7 @@ void vo_osd_changed(int new_value)
}
}
-bool vo_osd_has_changed(struct osd_state *osd)
+bool osd_has_changed(struct osd_state *osd)
{
for (int n = 0; n < MAX_OSD_PARTS; n++) {
if (osd->objs[n]->force_redraw)
@@ -329,10 +291,8 @@ bool vo_osd_has_changed(struct osd_state *osd)
return false;
}
-// Needed for VOs using the old OSD API (osd_draw_text_[ext]).
-void vo_osd_reset_changed(void)
+void osd_reset_changed(struct osd_state *osd)
{
- struct osd_state *osd = global_osd;
for (int n = 0; n < MAX_OSD_PARTS; n++)
osd->objs[n]->force_redraw = false;
}
diff --git a/sub/sub.h b/sub/sub.h
index 494b84379b..3ac160a323 100644
--- a/sub/sub.h
+++ b/sub/sub.h
@@ -72,14 +72,11 @@ struct sub_bitmaps {
struct sub_bitmap *parts;
int num_parts;
- // Provided for VOs with old code
- struct ass_image *imgs;
-
// Incremented on each change
int bitmap_id, bitmap_pos_id;
};
-struct mp_eosd_res {
+struct mp_osd_res {
int w, h; // screen dimensions, including black borders
int mt, mb, ml, mr; // borders (top, bottom, left, right)
double display_par;
@@ -111,6 +108,7 @@ struct osd_object {
// VO cache state
int vo_bitmap_id;
int vo_bitmap_pos_id;
+ struct mp_osd_res vo_res;
// Internally used by osd_libass.c
struct ass_track *osd_track;
@@ -124,12 +122,10 @@ struct osd_state {
struct ass_renderer *ass_renderer;
struct sh_sub *sh_sub;
double sub_offset;
- double vo_sub_pts;
+ double vo_pts;
bool render_subs_in_filter;
- struct mp_eosd_res res;
-
char *osd_text; // OSDTYPE_OSD
int progbar_type, progbar_value; // OSDTYPE_PROGBAR
@@ -204,14 +200,11 @@ extern float sub_fps;
extern int sub_justify;
-void draw_osd_with_eosd(struct vo *vo, struct osd_state *osd);
-
struct osd_state *osd_create(struct MPOpts *opts, struct ass_library *asslib);
void osd_set_text(struct osd_state *osd, const char *text);
-void osd_update(struct osd_state *osd, int dxs, int dys);
void vo_osd_changed(int new_value);
-void vo_osd_reset_changed(void);
-bool vo_osd_has_changed(struct osd_state *osd);
+void osd_reset_changed(struct osd_state *osd);
+bool osd_has_changed(struct osd_state *osd);
void osd_free(struct osd_state *osd);
enum mp_osd_draw_flags {
@@ -219,14 +212,15 @@ enum mp_osd_draw_flags {
OSD_DRAW_SUB_ONLY = (1 << 1),
};
-void osd_draw(struct osd_state *osd, struct sub_render_params *params,
- int draw_flags, const bool formats[SUBBITMAP_COUNT],
+void osd_draw(struct osd_state *osd, struct mp_osd_res res,
+ double video_pts, int draw_flags,
+ const bool formats[SUBBITMAP_COUNT],
void (*cb)(void *ctx, struct sub_bitmaps *imgs), void *cb_ctx);
struct mp_image;
struct mp_csp_details;
-bool osd_draw_on_image(struct osd_state *osd, struct sub_render_params *params,
- int draw_flags, struct mp_image *dest,
+bool osd_draw_on_image(struct osd_state *osd, struct mp_osd_res res,
+ double video_pts, int draw_flags, struct mp_image *dest,
struct mp_csp_details *dest_csp);
bool sub_bitmaps_bb(struct sub_bitmaps *imgs, int *x1, int *y1,