summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2016-07-03 18:33:28 +0200
committerwm4 <wm4@nowhere>2016-07-03 19:31:56 +0200
commitf1105528981fc83c5dbf15f1c1d409fb8842a1ea (patch)
treead955c1e8a313032b2741b70d446a2fcbb41610a
parent315e2e3da8b5a0d5ff75e438c9c4bbbbc6d53b91 (diff)
downloadmpv-f1105528981fc83c5dbf15f1c1d409fb8842a1ea.tar.bz2
mpv-f1105528981fc83c5dbf15f1c1d409fb8842a1ea.tar.xz
sub: pass preferred OSD format to subtitle renderers
The intention is to let mp_ass_packer_pack() produce different output for the RGBA and LIBASS formats. VOs (or whatever generates the OSD) currently do not signal a preferred format, and this mechanism just exists to switch between RGBA and LIBASS formats correctly, preferring LIBASS if the VO supports it.
-rw-r--r--sub/dec_sub.c6
-rw-r--r--sub/dec_sub.h4
-rw-r--r--sub/osd.c8
-rw-r--r--sub/osd.h2
-rw-r--r--sub/osd_dummy.c2
-rw-r--r--sub/osd_libass.c4
-rw-r--r--sub/sd.h4
-rw-r--r--sub/sd_ass.c6
-rw-r--r--sub/sd_lavc.c4
9 files changed, 22 insertions, 18 deletions
diff --git a/sub/dec_sub.c b/sub/dec_sub.c
index 3b1e957038..22dc3328b8 100644
--- a/sub/dec_sub.c
+++ b/sub/dec_sub.c
@@ -255,8 +255,8 @@ bool sub_read_packets(struct dec_sub *sub, double video_pts)
// You must call sub_lock/sub_unlock if more than 1 thread access sub.
// The issue is that *res will contain decoder allocated data, which might
// be deallocated on the next decoder access.
-void sub_get_bitmaps(struct dec_sub *sub, struct mp_osd_res dim, double pts,
- struct sub_bitmaps *res)
+void sub_get_bitmaps(struct dec_sub *sub, struct mp_osd_res dim, int format,
+ double pts, struct sub_bitmaps *res)
{
struct MPOpts *opts = sub->opts;
@@ -267,7 +267,7 @@ void sub_get_bitmaps(struct dec_sub *sub, struct mp_osd_res dim, double pts,
return;
if (opts->sub_visibility && sub->sd->driver->get_bitmaps)
- sub->sd->driver->get_bitmaps(sub->sd, dim, pts, res);
+ sub->sd->driver->get_bitmaps(sub->sd, dim, format, pts, res);
}
// See sub_get_bitmaps() for locking requirements.
diff --git a/sub/dec_sub.h b/sub/dec_sub.h
index 63603e2174..1048bf0ca6 100644
--- a/sub/dec_sub.h
+++ b/sub/dec_sub.h
@@ -35,8 +35,8 @@ void sub_unlock(struct dec_sub *sub);
bool sub_can_preload(struct dec_sub *sub);
void sub_preload(struct dec_sub *sub);
bool sub_read_packets(struct dec_sub *sub, double video_pts);
-void sub_get_bitmaps(struct dec_sub *sub, struct mp_osd_res dim, double pts,
- struct sub_bitmaps *res);
+void sub_get_bitmaps(struct dec_sub *sub, struct mp_osd_res dim, int format,
+ double pts, struct sub_bitmaps *res);
char *sub_get_text(struct dec_sub *sub, double pts);
void sub_reset(struct dec_sub *sub);
void sub_select(struct dec_sub *sub, bool selected);
diff --git a/sub/osd.c b/sub/osd.c
index a0618aafd9..001666d088 100644
--- a/sub/osd.c
+++ b/sub/osd.c
@@ -247,6 +247,10 @@ static void render_object(struct osd_state *osd, struct osd_object *obj,
{
struct MPOpts *opts = osd->opts;
+ int format = SUBBITMAP_LIBASS;
+ if (!sub_formats[format] || opts->force_rgba_osd)
+ format = SUBBITMAP_RGBA;
+
bool formats[SUBBITMAP_COUNT];
memcpy(formats, sub_formats, sizeof(formats));
if (opts->force_rgba_osd)
@@ -261,7 +265,7 @@ static void render_object(struct osd_state *osd, struct osd_object *obj,
double sub_pts = video_pts;
if (sub_pts != MP_NOPTS_VALUE)
sub_pts -= opts->sub_delay;
- sub_get_bitmaps(obj->sub, obj->vo_res, sub_pts, out_imgs);
+ sub_get_bitmaps(obj->sub, obj->vo_res, format, sub_pts, out_imgs);
}
} else if (obj->type == OSDTYPE_EXTERNAL2) {
if (obj->external2 && obj->external2->format) {
@@ -269,7 +273,7 @@ static void render_object(struct osd_state *osd, struct osd_object *obj,
obj->external2->change_id = 0;
}
} else {
- osd_object_get_bitmaps(osd, obj, out_imgs);
+ osd_object_get_bitmaps(osd, obj, format, out_imgs);
}
if (obj->force_redraw)
diff --git a/sub/osd.h b/sub/osd.h
index ade546f4f4..9c5be1c56b 100644
--- a/sub/osd.h
+++ b/sub/osd.h
@@ -205,7 +205,7 @@ void osd_rescale_bitmaps(struct sub_bitmaps *imgs, int frame_w, int frame_h,
// internal use only
void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj,
- struct sub_bitmaps *out_imgs);
+ int format, struct sub_bitmaps *out_imgs);
void osd_init_backend(struct osd_state *osd);
void osd_destroy_backend(struct osd_state *osd);
diff --git a/sub/osd_dummy.c b/sub/osd_dummy.c
index d9c366e1ac..796d954c08 100644
--- a/sub/osd_dummy.c
+++ b/sub/osd_dummy.c
@@ -19,7 +19,7 @@ void osd_get_function_sym(char *buffer, size_t buffer_size, int osd_function)
}
void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj,
- struct sub_bitmaps *out_imgs)
+ int format, struct sub_bitmaps *out_imgs)
{
*out_imgs = (struct sub_bitmaps) {0};
}
diff --git a/sub/osd_libass.c b/sub/osd_libass.c
index f940b6117f..a9ab7eabd2 100644
--- a/sub/osd_libass.c
+++ b/sub/osd_libass.c
@@ -525,7 +525,7 @@ static void append_ass(struct ass_state *ass, struct mp_osd_res *res,
}
void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj,
- struct sub_bitmaps *out_imgs)
+ int format, struct sub_bitmaps *out_imgs)
{
if (obj->force_redraw && obj->type == OSDTYPE_OSD)
update_osd(osd, obj);
@@ -542,7 +542,7 @@ void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj,
}
mp_ass_packer_pack(obj->ass_packer, obj->ass_imgs, obj->num_externals + 1,
- obj->changed, SUBBITMAP_LIBASS, out_imgs);
+ obj->changed, format, out_imgs);
obj->changed = false;
}
diff --git a/sub/sd.h b/sub/sd.h
index fe64163b1b..c8056d379f 100644
--- a/sub/sd.h
+++ b/sub/sd.h
@@ -37,8 +37,8 @@ struct sd_functions {
bool (*accepts_packet)(struct sd *sd); // implicit default if NULL: true
int (*control)(struct sd *sd, enum sd_ctrl cmd, void *arg);
- void (*get_bitmaps)(struct sd *sd, struct mp_osd_res dim, double pts,
- struct sub_bitmaps *res);
+ void (*get_bitmaps)(struct sd *sd, struct mp_osd_res dim, int format,
+ double pts, struct sub_bitmaps *res);
char *(*get_text)(struct sd *sd, double pts);
};
diff --git a/sub/sd_ass.c b/sub/sd_ass.c
index 879d528fb7..7abeea9eeb 100644
--- a/sub/sd_ass.c
+++ b/sub/sd_ass.c
@@ -420,8 +420,8 @@ static long long find_timestamp(struct sd *sd, double pts)
#undef END
-static void get_bitmaps(struct sd *sd, struct mp_osd_res dim, double pts,
- struct sub_bitmaps *res)
+static void get_bitmaps(struct sd *sd, struct mp_osd_res dim, int format,
+ double pts, struct sub_bitmaps *res)
{
struct sd_ass_priv *ctx = sd->priv;
struct MPOpts *opts = sd->opts;
@@ -464,7 +464,7 @@ static void get_bitmaps(struct sd *sd, struct mp_osd_res dim, double pts,
int changed;
ASS_Image *imgs = ass_render_frame(renderer, track, ts, &changed);
- mp_ass_packer_pack(ctx->packer, &imgs, 1, changed, SUBBITMAP_LIBASS, res);
+ mp_ass_packer_pack(ctx->packer, &imgs, 1, changed, format, res);
if (!converted && res->num_parts > 0) {
// mangle_colors() modifies the color field, so copy the thing.
diff --git a/sub/sd_lavc.c b/sub/sd_lavc.c
index 7f68a2224e..fca437405c 100644
--- a/sub/sd_lavc.c
+++ b/sub/sd_lavc.c
@@ -422,8 +422,8 @@ static void decode(struct sd *sd, struct demux_packet *packet)
}
}
-static void get_bitmaps(struct sd *sd, struct mp_osd_res d, double pts,
- struct sub_bitmaps *res)
+static void get_bitmaps(struct sd *sd, struct mp_osd_res d, int format,
+ double pts, struct sub_bitmaps *res)
{
struct sd_lavc_priv *priv = sd->priv;
struct MPOpts *opts = sd->opts;