summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
authorUoti Urpala <uau@mplayer2.org>2012-08-25 21:22:39 +0300
committerwm4 <wm4@nowhere>2012-09-18 21:04:46 +0200
commit89a57148934ec7f150a6170ac1313f6f5c636596 (patch)
treeacff6dbda4ea8623ea4ce4d86834fe74f015653e /libmpcodecs
parent9bb03b7db40408b9dc4a0e1405a5bac754893e2b (diff)
downloadmpv-89a57148934ec7f150a6170ac1313f6f5c636596.tar.bz2
mpv-89a57148934ec7f150a6170ac1313f6f5c636596.tar.xz
subs: always use sub decoder framework for libass rendering
Remove subtitle selection code setting osd->ass_track directly and vf_ass/vf_vo code rendering the track directly with libass. Instead, do track selection and rendering with dec_sub.c functions. Before, mpctx->set_of_ass_tracks[] contained bare libass tracks generated from external subtitle files. For use with dec_sub.c, it now contains struct sh_sub instances with decoder already initialized. This commit breaks the sub_step command ('g' and 'y' keys) for libass-rendered subtitles. It could be fixed, but it's so useless - especially as with the existing implementation there's no practical way to get subtitle delay back to normal after using it - that I didn't bother. Conflicts: command.c mp_core.h mplayer.c
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/vf_ass.c26
-rw-r--r--libmpcodecs/vf_vo.c34
2 files changed, 25 insertions, 35 deletions
diff --git a/libmpcodecs/vf_ass.c b/libmpcodecs/vf_ass.c
index a346f658cf..ad4671fe57 100644
--- a/libmpcodecs/vf_ass.c
+++ b/libmpcodecs/vf_ass.c
@@ -352,19 +352,21 @@ static int render_frame(struct vf_instance *vf, mp_image_t *mpi,
static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
{
- struct osd_state *osd = vf->priv->osd;
+ struct vf_priv_s *priv = vf->priv;
+ struct MPOpts *opts = vf->opts;
+ struct osd_state *osd = priv->osd;
ASS_Image *images = 0;
- ASS_Renderer *renderer = osd->ass_renderer;
- bool vs = osd->vsfilter_aspect && vf->opts->ass_vsfilter_aspect_compat;
- if (sub_visibility && osd->ass_track && (pts != MP_NOPTS_VALUE)) {
- struct mp_eosd_res dim = { .w = vf->priv->outw, .h = vf->priv->outh,
- .mt = vf->opts->ass_top_margin,
- .mb = vf->opts->ass_bottom_margin };
- mp_ass_configure(renderer, vf->opts, &dim, 0);
- ass_set_aspect_ratio(renderer,
- vs ? 1. : vf->priv->aspect_correction, 1);
- images = ass_render_frame(renderer, osd->ass_track,
- (pts - osd->sub_offset + sub_delay) * 1000 + .5, NULL);
+ if (pts != MP_NOPTS_VALUE) {
+ osd->dim = (struct mp_eosd_res){ .w = vf->priv->outw,
+ .h = vf->priv->outh,
+ .mt = opts->ass_top_margin,
+ .mb = opts->ass_bottom_margin };
+ osd->normal_scale = vf->priv->aspect_correction;
+ osd->vsfilter_scale = 1;
+ osd->sub_pts = pts - osd->sub_offset;
+ struct sub_bitmaps b;
+ sub_get_bitmaps(osd, &b);
+ images = b.imgs;
}
prepare_image(vf, mpi);
diff --git a/libmpcodecs/vf_vo.c b/libmpcodecs/vf_vo.c
index 0db75b670e..076850c8c2 100644
--- a/libmpcodecs/vf_vo.c
+++ b/libmpcodecs/vf_vo.c
@@ -30,7 +30,6 @@
#include "libvo/video_out.h"
-#include "sub/ass_mp.h"
#include "sub/sub.h"
struct vf_priv_s {
@@ -122,40 +121,29 @@ static int control(struct vf_instance *vf, int request, void *data)
};
return vo_control(video_out, VOCTRL_GET_EQUALIZER, &param) == VO_TRUE;
}
-#ifdef CONFIG_ASS
case VFCTRL_INIT_EOSD: {
vf->priv->prev_visibility = false;
return CONTROL_TRUE;
}
case VFCTRL_DRAW_EOSD: {
- struct mp_eosd_res dim = { 0 };
+ struct osd_state *osd = data;
+ osd->dim = (struct mp_eosd_res){0};
if (!video_out->config_ok ||
- vo_control(video_out, VOCTRL_GET_EOSD_RES, &dim) != true) {
+ vo_control(video_out, VOCTRL_GET_EOSD_RES, &osd->dim) != true) {
vf->priv->prev_visibility = false;
return CONTROL_FALSE;
}
- struct osd_state *osd = data;
- mp_eosd_images_t images = { NULL, 2 };
- ASS_Renderer *renderer = osd->ass_renderer;
- double scale = 1;
- if (osd->vsfilter_aspect && vf->opts->ass_vsfilter_aspect_compat)
- scale = vf->priv->scale_ratio;
- if (sub_visibility && osd->ass_track && (osd->pts != MP_NOPTS_VALUE)) {
- mp_ass_configure(renderer, vf->opts, &dim,
- vf->default_caps & VFCAP_EOSD_UNSCALED);
- ass_set_aspect_ratio(renderer, scale, 1);
- images.imgs = ass_render_frame(renderer, osd->ass_track,
- (osd->pts + sub_delay) * 1000 + .5,
- &images.changed);
- if (!vf->priv->prev_visibility)
- images.changed = 2;
- vf->priv->prev_visibility = true;
- } else
- vf->priv->prev_visibility = false;
+ osd->normal_scale = 1;
+ osd->vsfilter_scale = vf->priv->scale_ratio;
+ osd->unscaled = vf->default_caps & VFCAP_EOSD_UNSCALED;
+ struct sub_bitmaps images;
+ sub_get_bitmaps(osd, &images);
+ if (!vf->priv->prev_visibility)
+ images.changed = 2;
+ vf->priv->prev_visibility = true;
return vo_control(video_out, VOCTRL_DRAW_EOSD, &images) == VO_TRUE;
}
-#endif
}
return CONTROL_UNKNOWN;
}