summaryrefslogtreecommitdiffstats
path: root/sub
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2019-05-22 23:15:34 +0200
committerwm4 <wm4@nowhere>2019-09-19 20:37:04 +0200
commit27c5550de2693d27ed24d3838a4ae16a06a9dd5d (patch)
tree15d8955dac3d0515e3d2bae878738df4710afbf1 /sub
parentf06b3d7f887a9515dbad314f9d57351169e08a9b (diff)
downloadmpv-27c5550de2693d27ed24d3838a4ae16a06a9dd5d.tar.bz2
mpv-27c5550de2693d27ed24d3838a4ae16a06a9dd5d.tar.xz
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.
Diffstat (limited to 'sub')
-rw-r--r--sub/sd_lavc.c17
1 files changed, 17 insertions, 0 deletions
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);
}