diff options
author | Uoti Urpala <uau@mplayer2.org> | 2012-08-25 21:22:39 +0300 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2012-09-18 21:04:46 +0200 |
commit | 89a57148934ec7f150a6170ac1313f6f5c636596 (patch) | |
tree | acff6dbda4ea8623ea4ce4d86834fe74f015653e /libmpcodecs | |
parent | 9bb03b7db40408b9dc4a0e1405a5bac754893e2b (diff) | |
download | mpv-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.c | 26 | ||||
-rw-r--r-- | libmpcodecs/vf_vo.c | 34 |
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, ¶m) == 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; } |