diff --git a/player/discnav.c b/player/discnav.c index ceb38bc3f4..5d477d6313 100644 --- a/player/discnav.c +++ b/player/discnav.c @@ -344,7 +344,7 @@ void mp_nav_get_highlight(void *priv, struct mp_osd_res res, if (out_imgs->num_parts) { out_imgs->parts = nav->outputs; out_imgs->format = SUBBITMAP_RGBA; - osd_rescale_bitmaps(out_imgs, sizes[0], sizes[1], res, -1); + osd_rescale_bitmaps(out_imgs, sizes[0], sizes[1], res, 0); } pthread_mutex_unlock(&nav->osd_lock); diff --git a/sub/osd.c b/sub/osd.c index 5b1c070051..995908222b 100644 --- a/sub/osd.c +++ b/sub/osd.c @@ -466,8 +466,9 @@ struct mp_osd_res osd_get_vo_res(struct osd_state *osd, int obj) // Position the subbitmaps in imgs on the screen. Basically, this fits the // subtitle canvas (of size frame_w x frame_h) onto the screen, such that it // fills the whole video area (especially if the video is magnified, e.g. on -// fullscreen). If compensate_par is given, adjust the way the subtitles are -// "stretched" on the screen, and letter-box the result. +// fullscreen). If compensate_par is >0, adjust the way the subtitles are +// "stretched" on the screen, and letter-box the result. If compensate_par +// is <0, strictly letter-box the subtitles. If it is 0, stretch them. void osd_rescale_bitmaps(struct sub_bitmaps *imgs, int frame_w, int frame_h, struct mp_osd_res res, double compensate_par) { @@ -475,6 +476,8 @@ void osd_rescale_bitmaps(struct sub_bitmaps *imgs, int frame_w, int frame_h, int vidh = res.h - res.mt - res.mb; double xscale = (double)vidw / frame_w; double yscale = (double)vidh / frame_h; + if (compensate_par < 0) + compensate_par = xscale / yscale / res.display_par; if (compensate_par > 0) { if (compensate_par > 1.0) { xscale /= compensate_par; diff --git a/sub/sd_lavc.c b/sub/sd_lavc.c index 206571e30b..5e0398d41c 100644 --- a/sub/sd_lavc.c +++ b/sub/sd_lavc.c @@ -292,7 +292,7 @@ static void get_bitmaps(struct sd *sd, struct mp_osd_res d, double pts, priv->displayed_id = current->id; res->format = SUBBITMAP_INDEXED; - double video_par = -1; + double video_par = 0; if (priv->avctx->codec_id == AV_CODEC_ID_DVD_SUBTITLE && opts->stretch_dvd_subs) { // For DVD subs, try to keep the subtitle PAR at display PAR. @@ -302,6 +302,8 @@ static void get_bitmaps(struct sd *sd, struct mp_osd_res d, double pts, if (isnormal(par)) video_par = par; } + if (priv->avctx->codec_id == AV_CODEC_ID_HDMV_PGS_SUBTITLE) + video_par = -1; int insize[2]; get_resolution(sd, insize); osd_rescale_bitmaps(res, insize[0], insize[1], d, video_par);