From 9a55c4e70cebe6da6b7c7796119f84c4c9ad2a60 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 26 Sep 2013 16:53:17 +0200 Subject: video: let sh_video->aspect always be container aspect ratio Now writing -1 to the 'aspect' property resets the video to the auto aspect ratio. Returning the aspect from the property becomes a bit more complicated, because we still try to return the container aspect ratio if no frame has been decoded yet. --- mpvcore/command.c | 22 +++++++++++++++------- mpvcore/options.c | 6 ++++-- 2 files changed, 19 insertions(+), 9 deletions(-) (limited to 'mpvcore') diff --git a/mpvcore/command.c b/mpvcore/command.c index 35e72cb3ad..bce0300bc5 100644 --- a/mpvcore/command.c +++ b/mpvcore/command.c @@ -1478,22 +1478,30 @@ static int mp_property_fps(m_option_t *prop, int action, void *arg, static int mp_property_aspect(m_option_t *prop, int action, void *arg, MPContext *mpctx) { + struct sh_video *sh_video = mpctx->sh_video; if (!mpctx->sh_video) return M_PROPERTY_UNAVAILABLE; switch (action) { case M_PROPERTY_SET: { - float f = *(float *)arg; - if (f < 0.1) - f = (float)mpctx->sh_video->disp_w / mpctx->sh_video->disp_h; - mpctx->opts->movie_aspect = f; + mpctx->opts->movie_aspect = *(float *)arg; reinit_video_filters(mpctx); mp_force_video_refresh(mpctx); return M_PROPERTY_OK; } - case M_PROPERTY_GET: - *(float *)arg = mpctx->sh_video->aspect; + case M_PROPERTY_GET: { + float aspect = -1; + struct mp_image_params *params = sh_video->vf_input; + if (params && params->d_w && params->d_h) { + aspect = (float)params->d_w / params->d_h; + } else if (sh_video->disp_w && sh_video->disp_h) { + aspect = (float)sh_video->disp_w / sh_video->disp_h; + } + if (aspect <= 0) + return M_PROPERTY_UNAVAILABLE; + *(float *)arg = aspect; return M_PROPERTY_OK; } + } return M_PROPERTY_NOT_IMPLEMENTED; } @@ -1874,7 +1882,7 @@ static const m_option_t mp_properties[] = { { "fps", mp_property_fps, CONF_TYPE_FLOAT, 0, 0, 0, NULL }, { "aspect", mp_property_aspect, CONF_TYPE_FLOAT, - CONF_RANGE, 0, 10, NULL }, + CONF_RANGE, -1, 10, NULL }, M_OPTION_PROPERTY_CUSTOM("vid", mp_property_video), { "program", mp_property_program, CONF_TYPE_INT, CONF_RANGE, -1, 65535, NULL }, diff --git a/mpvcore/options.c b/mpvcore/options.c index d73faa1cbe..9cffb07284 100644 --- a/mpvcore/options.c +++ b/mpvcore/options.c @@ -497,8 +497,10 @@ const m_option_t mp_opts[] = { // scaling: {"sws", &sws_flags, CONF_TYPE_INT, 0, 0, 2, NULL}, {"ssf", (void *) scaler_filter_conf, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL}, - OPT_FLOATRANGE("aspect", movie_aspect, 0, 0.1, 10.0), - OPT_FLOAT_STORE("no-aspect", movie_aspect, 0, 0), + // -1 means auto aspect (prefer container size until aspect change) + // 0 means square pixels + OPT_FLOATRANGE("aspect", movie_aspect, 0, -1.0, 10.0), + OPT_FLOAT_STORE("no-aspect", movie_aspect, 0, 0.0), OPT_FLAG_CONSTANTS("flip", flip, 0, 0, 1), -- cgit v1.2.3