diff options
Diffstat (limited to 'sub/sd_spu.c')
-rw-r--r-- | sub/sd_spu.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/sub/sd_spu.c b/sub/sd_spu.c index 52e2b728ed..717e4652b9 100644 --- a/sub/sd_spu.c +++ b/sub/sd_spu.c @@ -21,12 +21,14 @@ #include "talloc.h" #include "mpvcore/options.h" #include "demux/stheader.h" +#include "video/mp_image.h" #include "sd.h" #include "sub.h" #include "spudec.h" struct sd_spu_priv { void *spudec; + struct mp_image_params video_params; }; static bool is_dvd_sub(const char *t) @@ -72,8 +74,22 @@ static void get_bitmaps(struct sd *sd, struct mp_osd_res d, double pts, spudec_set_forced_subs_only(priv->spudec, opts->forced_subs_only); spudec_heartbeat(priv->spudec, pts * 90000); - if (spudec_visible(priv->spudec)) - spudec_get_indexed(priv->spudec, &d, res); + if (spudec_visible(priv->spudec)) { + double xscale = 1; + double yscale = 1; + if (opts->stretch_dvd_subs) { + // For DVD subs, try to keep the subtitle PAR at display PAR. + double video_par = + (priv->video_params.d_w / (double)priv->video_params.d_h) + / (priv->video_params.w / (double)priv->video_params.h); + if (video_par > 1.0) { + xscale /= video_par; + } else { + yscale *= video_par; + } + } + spudec_get_indexed(priv->spudec, &d, xscale, yscale, res); + } } static void reset(struct sd *sd) @@ -91,12 +107,25 @@ static void uninit(struct sd *sd) talloc_free(priv); } +static int control(struct sd *sd, enum sd_ctrl cmd, void *arg) +{ + struct sd_spu_priv *priv = sd->priv; + switch (cmd) { + case SD_CTRL_SET_VIDEO_PARAMS: + priv->video_params = *(struct mp_image_params *)arg; + return CONTROL_OK; + default: + return CONTROL_UNKNOWN; + } +} + const struct sd_functions sd_spu = { .name = "spu", .supports_format = supports_format, .init = init, .decode = decode, .get_bitmaps = get_bitmaps, + .control = control, .reset = reset, .uninit = uninit, }; |