summaryrefslogtreecommitdiffstats
path: root/sub/sd_ass.c
diff options
context:
space:
mode:
Diffstat (limited to 'sub/sd_ass.c')
-rw-r--r--sub/sd_ass.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/sub/sd_ass.c b/sub/sd_ass.c
index 2189f0cebe..e4e5652875 100644
--- a/sub/sd_ass.c
+++ b/sub/sd_ass.c
@@ -450,6 +450,34 @@ static void configure_ass(struct sd *sd, struct mp_osd_res *dim,
if (converted)
ass_track_set_feature(track, ASS_FEATURE_WRAP_UNICODE, 1);
#endif
+ if (converted) {
+ bool override_playres = true;
+ char **ass_force_style_list = opts->ass_force_style_list;
+ for (int i = 0; ass_force_style_list && ass_force_style_list[i]; i++) {
+ if (bstr_find0(bstr0(ass_force_style_list[i]), "PlayResX") >= 0)
+ override_playres = false;
+ }
+
+ // srt to ass conversion from ffmpeg has fixed PlayResX of 384 with an
+ // aspect of 4:3. Starting with libass f08f8ea5 (pre 0.17) PlayResX
+ // affects shadow and border widths, among others, so to render borders
+ // and shadows correctly, we adjust PlayResX according to the DAR.
+ // But PlayResX also affects margins, so we adjust those too.
+ // This should ensure basic srt-to-ass ffmpeg conversion has correct
+ // borders, but there could be other issues with some srt extensions
+ // and/or different source formats which would be exposed over time.
+ // Make these adjustments only if the user didn't set PlayResX.
+ if (override_playres) {
+ int vidw = dim->w - (dim->ml + dim->mr);
+ int vidh = dim->h - (dim->mt + dim->mb);
+ track->PlayResX = track->PlayResY * (double)vidw / MPMAX(vidh, 1);
+ // ffmpeg and mpv use a default PlayResX of 384 when it is not known,
+ // this comes from VSFilter.
+ double fix_margins = track->PlayResX / 384.0;
+ track->styles->MarginL = round(track->styles->MarginL * fix_margins);
+ track->styles->MarginR = round(track->styles->MarginR * fix_margins);
+ }
+ }
}
static bool has_overrides(char *s)