summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-09-26 16:05:46 +0200
committerwm4 <wm4@nowhere>2013-09-26 16:09:08 +0200
commitf5bf6c0fb33fb6ff11f3250de708eb6e658772c9 (patch)
tree45b1cd109f782182b058dc2f45b2b5b406512a5c /video
parent7eb13c4028f2eb9174f2f65d1cfc15e5186bfbbc (diff)
downloadmpv-f5bf6c0fb33fb6ff11f3250de708eb6e658772c9.tar.bz2
mpv-f5bf6c0fb33fb6ff11f3250de708eb6e658772c9.tar.xz
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.
Diffstat (limited to 'video')
-rw-r--r--video/decode/vd.c33
-rw-r--r--video/filter/vf.c15
-rw-r--r--video/filter/vf.h1
3 files changed, 25 insertions, 24 deletions
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)
{