From 27c5550de2693d27ed24d3838a4ae16a06a9dd5d Mon Sep 17 00:00:00 2001 From: wm4 Date: Wed, 22 May 2019 23:15:34 +0200 Subject: sd_lavc: implement --sub-pos for bitmap subtitles Simple enough to do. May have mixed results. Typically, bitmap subtitles will have a tight bounding box around the rendered text. But if for example there is text on the top and bottom, it may be a single big bitmap with a large transparent area between top and bottom. In particular, DVD subtitles are really just a single screen-sized RLE-encoded bitmap, though libavcodec will crop off transparent areas. Like with sd_ass, you can't move subtitles _down_ if they are already in their origin position. This could probably be improved, but I don't want to deal with that right now. --- DOCS/man/options.rst | 3 +++ sub/sd_lavc.c | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index e24267a4da..9cfc5b0624 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -1990,6 +1990,9 @@ Subtitles :strip: Radically strip all ASS tags and styles from the subtitle. This is equivalent to the old ``--no-ass`` / ``--no-sub-ass`` options. + This also controls some bitmap subtitle overrides, as well as HTML tags in + formats like SRT, despite the name of the option. + ``--sub-ass-force-margins`` Enables placing toptitles and subtitles in black borders when they are available, if the subtitles are in the ASS format. diff --git a/sub/sd_lavc.c b/sub/sd_lavc.c index 11f7711b7e..ef46521f0b 100644 --- a/sub/sd_lavc.c +++ b/sub/sd_lavc.c @@ -447,6 +447,23 @@ static void get_bitmaps(struct sd *sd, struct mp_osd_res d, int format, w = priv->video_params.w; h = priv->video_params.h; } + + if (opts->sub_pos != 100 && opts->ass_style_override) { + int offset = (100 - opts->sub_pos) / 100.0 * h; + + for (int n = 0; n < res->num_parts; n++) { + struct sub_bitmap *sub = &res->parts[n]; + + // Decide by heuristic whether this is a sub-title or something + // else (top-title, covering whole screen). + if (sub->y < h / 2) + continue; + + // Allow moving up the subtitle, but only until it clips. + sub->y = MPMAX(sub->y - offset, 0); + } + } + osd_rescale_bitmaps(res, w, h, d, video_par); } -- cgit v1.2.3