From f5bf6c0fb33fb6ff11f3250de708eb6e658772c9 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 26 Sep 2013 16:05:46 +0200 Subject: vd: move aspect calculation to a function This function would probably be useful in other places too. I'm not sure why vd.c doesn't apply the aspect if it changes size by less than 4 pixels. Maybe it's supposed to avoid ugly results with bad scalers if the difference is too small to be noticed normally. --- video/decode/vd.c | 33 +++++++++------------------------ video/filter/vf.c | 15 +++++++++++++++ video/filter/vf.h | 1 + 3 files changed, 25 insertions(+), 24 deletions(-) (limited to 'video') diff --git a/video/decode/vd.c b/video/decode/vd.c index 9545226fb9..ad2af3a2cd 100644 --- a/video/decode/vd.c +++ b/video/decode/vd.c @@ -120,30 +120,16 @@ int mpcodecs_reconfig_vo(sh_video_t *sh, const struct mp_image_params *params) else if (sh->stream_aspect != 0.0) sh->aspect = sh->stream_aspect; - int d_w = p.w; - int d_h = p.h; - - if (sh->aspect > 0.01) { - int new_w = d_h * sh->aspect; - int new_h = d_h; - // we don't like horizontal downscale - if (new_w < d_w) { - new_w = d_w; - new_h = d_w / sh->aspect; - } - if (abs(d_w - new_w) >= 4 || abs(d_h - new_h) >= 4) { - d_w = new_w; - d_h = new_h; - mp_tmsg(MSGT_CPLAYER, MSGL_V, "Aspect ratio is %.2f:1 - " - "scaling to correct movie aspect.\n", sh->aspect); - } - + vf_set_dar(&p.d_w, &p.d_h, p.w, p.h, sh->aspect); + if (abs(p.d_w - p.w) >= 4 || abs(p.d_h - p.h) >= 4) { + mp_tmsg(MSGT_CPLAYER, MSGL_V, "Aspect ratio is %.2f:1 - " + "scaling to correct movie aspect.\n", sh->aspect); mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_ASPECT=%1.4f\n", sh->aspect); + } else { + p.d_w = p.w; + p.d_h = p.h; } - p.d_w = d_w; - p.d_h = d_h; - // Apply user overrides if (opts->requested_colorspace != MP_CSP_AUTO) p.colorspace = opts->requested_colorspace; @@ -158,9 +144,8 @@ int mpcodecs_reconfig_vo(sh_video_t *sh, const struct mp_image_params *params) vocfg_flags = (flip ? VOFLAG_FLIPPING : 0); // Time to config libvo! - mp_msg(MSGT_CPLAYER, MSGL_V, - "VO Config (%dx%d->%dx%d,flags=%d,0x%X)\n", sh->disp_w, - sh->disp_h, d_w, d_h, vocfg_flags, p.imgfmt); + mp_msg(MSGT_CPLAYER, MSGL_V, "VO Config (%dx%d->%dx%d,flags=%d,0x%X)\n", + p.w, p.h, p.d_w, p.d_h, vocfg_flags, p.imgfmt); if (vf_reconfig_wrapper(vf, &p, vocfg_flags) < 0) { mp_tmsg(MSGT_CPLAYER, MSGL_WARN, "FATAL: Cannot initialize video driver.\n"); diff --git a/video/filter/vf.c b/video/filter/vf.c index 216f3c42f4..1e27c043b5 100644 --- a/video/filter/vf.c +++ b/video/filter/vf.c @@ -587,6 +587,21 @@ void vf_rescale_dsize(int *d_width, int *d_height, int old_w, int old_h, *d_height = *d_height * new_h / old_h; } +// Set *d_width/*d_height to display aspect ratio with the givem source size +void vf_set_dar(int *d_w, int *d_h, int w, int h, double dar) +{ + *d_w = w; + *d_h = h; + if (dar > 0.01) { + *d_w = h * dar; + // we don't like horizontal downscale + if (*d_w < w) { + *d_w = w; + *d_h = w / dar; + } + } +} + void vf_detc_init_pts_buf(struct vf_detc_pts_buf *p) { p->inpts_prev = MP_NOPTS_VALUE; diff --git a/video/filter/vf.h b/video/filter/vf.h index ea1246da17..f61bb8be80 100644 --- a/video/filter/vf.h +++ b/video/filter/vf.h @@ -150,6 +150,7 @@ void vf_print_filter_chain(int msglevel, struct vf_instance *vf); void vf_rescale_dsize(int *d_width, int *d_height, int old_w, int old_h, int new_w, int new_h); +void vf_set_dar(int *d_width, int *d_height, int w, int h, double dar); static inline int norm_qscale(int qscale, int type) { -- cgit v1.2.3