From 17f5019b468d5269408b7dae53a24e17426de7d5 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 4 Oct 2012 17:16:32 +0200 Subject: sub: always go through sub.c for OSD rendering Before this commit, vf_vo.c and vf_ass.c were manually calling the subtitle decoder to retrieve images to render. In particular, this circumvented the sub-bitmap conversion & caching layer in sub.c. Change this so that subtitle decoding isn't special anymore, and draws all subtitles with the normal OSD drawing API. This is also a step towards removing the need for vf_ass auto-insertion. In fact, if auto-insertion would be disabled now, VOs with "old" OSD rendering could still render ASS subtitles in monochrome, because there is still ASS -> old-OSD bitmap conversion in the sub.c mechanism. The code is written with the assumption that the subtitle rendering filter (vf_ass) can render all subtitle formats. Since vf_ass knows the ASS format only, rendering image subs (i.e. RGBA subs) with it simply fails. This means that with vo_xv (vf_ass auto-inserted), image subs wouldn't be rendered. Use a dumb hack to disable rendering subs with a filter, if we detect that the subs are not in ASS format. (Trying to render the subs first would probably result in purging the conversion cache on every frame.) --- libmpcodecs/vf.h | 3 +-- libmpcodecs/vf_ass.c | 30 ++++++++++++++---------------- libmpcodecs/vf_vo.c | 16 ---------------- 3 files changed, 15 insertions(+), 34 deletions(-) (limited to 'libmpcodecs') diff --git a/libmpcodecs/vf.h b/libmpcodecs/vf.h index ec8144b22f..8b18470e62 100644 --- a/libmpcodecs/vf.h +++ b/libmpcodecs/vf.h @@ -104,8 +104,7 @@ struct vf_ctrl_screenshot { #define VFCTRL_SKIP_NEXT_FRAME 12 // For encoding - drop the next frame that passes thru #define VFCTRL_FLUSH_FRAMES 13 // For encoding - flush delayed frames #define VFCTRL_SCREENSHOT 14 // Take screenshot, arg is vf_ctrl_screenshot -#define VFCTRL_INIT_EOSD 15 // Select EOSD renderer -#define VFCTRL_DRAW_EOSD 16 // Render EOSD */ +#define VFCTRL_INIT_OSD 15 // Filter OSD renderer present? #define VFCTRL_SET_DEINTERLACE 18 // Set deinterlacing status #define VFCTRL_GET_DEINTERLACE 19 // Get deinterlacing status /* Hack to make the OSD state object available to vf_expand and vf_ass which diff --git a/libmpcodecs/vf_ass.c b/libmpcodecs/vf_ass.c index f0b2e6ab77..937912313b 100644 --- a/libmpcodecs/vf_ass.c +++ b/libmpcodecs/vf_ass.c @@ -355,23 +355,23 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) struct vf_priv_s *priv = vf->priv; struct MPOpts *opts = vf->opts; struct osd_state *osd = priv->osd; - ASS_Image *images = 0; + struct sub_bitmaps imgs = (struct sub_bitmaps) {0}; 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; - osd->support_rgba = false; - struct sub_bitmaps b; - sub_get_bitmaps(osd, &b); - images = b.imgs; + struct sub_render_params subparams = { + .pts = pts, + .dim = { .w = vf->priv->outw, + .h = vf->priv->outh, + .mt = opts->ass_top_margin, + .mb = opts->ass_bottom_margin }, + .normal_scale = vf->priv->aspect_correction, + .vsfilter_scale = 1, + }; + bool formats[SUBBITMAP_COUNT] = {[SUBBITMAP_LIBASS] = true}; + osd_draw_sub(osd, &imgs, &subparams, formats); } prepare_image(vf, mpi); - render_frame(vf, mpi, images); + render_frame(vf, mpi, imgs.imgs); return vf_next_put_image(vf, vf->dmpi, pts); } @@ -393,9 +393,7 @@ static int control(vf_instance_t *vf, int request, void *data) case VFCTRL_SET_OSD_OBJ: vf->priv->osd = data; break; - case VFCTRL_INIT_EOSD: - return CONTROL_TRUE; - case VFCTRL_DRAW_EOSD: + case VFCTRL_INIT_OSD: return CONTROL_TRUE; } return vf_next_control(vf, request, data); diff --git a/libmpcodecs/vf_vo.c b/libmpcodecs/vf_vo.c index 49668d4640..998b4b6dfa 100644 --- a/libmpcodecs/vf_vo.c +++ b/libmpcodecs/vf_vo.c @@ -34,7 +34,6 @@ struct vf_priv_s { struct vo *vo; - double scale_ratio; }; #define video_out (vf->priv->vo) @@ -74,8 +73,6 @@ static int config(struct vf_instance *vf, if (vo_config(video_out, width, height, d_width, d_height, flags, outfmt)) return 0; - vf->priv->scale_ratio = (double) d_width / d_height * height / width; - return 1; } @@ -117,19 +114,6 @@ static int control(struct vf_instance *vf, int request, void *data) }; return vo_control(video_out, VOCTRL_GET_EQUALIZER, ¶m) == VO_TRUE; } - case VFCTRL_DRAW_EOSD: { - struct osd_state *osd = data; - osd->support_rgba = vf->default_caps & VFCAP_EOSD_RGBA; - osd->dim = (struct mp_eosd_res){0}; - if (!video_out->config_ok || - vo_control(video_out, VOCTRL_GET_EOSD_RES, &osd->dim) != true) - return CONTROL_FALSE; - osd->normal_scale = 1; - osd->vsfilter_scale = vf->priv->scale_ratio; - struct sub_bitmaps images; - sub_get_bitmaps(osd, &images); - return vo_control(video_out, VOCTRL_DRAW_EOSD, &images) == VO_TRUE; - } } return CONTROL_UNKNOWN; } -- cgit v1.2.3