summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-10-31 20:19:40 +0100
committerwm4 <wm4@nowhere>2013-10-31 23:30:14 +0100
commit94542abf2e2ccb123cf3b0c9eef76a2290dd19b1 (patch)
tree309891190830d57508df39228bd9f230a65c50cf
parentb55d55782274d13eec434702c8f11cfb37a49230 (diff)
downloadmpv-94542abf2e2ccb123cf3b0c9eef76a2290dd19b1.tar.bz2
mpv-94542abf2e2ccb123cf3b0c9eef76a2290dd19b1.tar.xz
command: add property to scale window size
-rw-r--r--DOCS/man/en/input.rst1
-rw-r--r--mpvcore/player/command.c35
-rw-r--r--video/out/vo.h2
-rw-r--r--video/out/x11_common.c13
4 files changed, 51 insertions, 0 deletions
diff --git a/DOCS/man/en/input.rst b/DOCS/man/en/input.rst
index c2ba45a61c..67dbac07bf 100644
--- a/DOCS/man/en/input.rst
+++ b/DOCS/man/en/input.rst
@@ -533,6 +533,7 @@ Name W Comment
``fps`` container FPS (may contain bogus values)
``dwidth`` video width (after filters and aspect scaling)
``dheight`` video height
+``window-scale`` x window size multiplier (1 means video size)
``aspect`` x video aspect
``osd-width`` last known OSD width (can be 0)
``osd-height`` last known OSD height (can be 0)
diff --git a/mpvcore/player/command.c b/mpvcore/player/command.c
index 29352ee3f3..f393318fb6 100644
--- a/mpvcore/player/command.c
+++ b/mpvcore/player/command.c
@@ -1468,6 +1468,39 @@ static int mp_property_dheight(m_option_t *prop, int action, void *arg,
return property_vo_wh(prop, action, arg, mpctx, false);
}
+static int mp_property_window_scale(m_option_t *prop, int action, void *arg,
+ MPContext *mpctx)
+{
+ struct vo *vo = mpctx->video_out;
+ if (!vo || !vo->hasframe)
+ return M_PROPERTY_UNAVAILABLE;
+
+ int vid_w = vo->aspdat.prew;
+ int vid_h = vo->aspdat.preh;
+ if (vid_w < 1 || vid_h < 1)
+ return M_PROPERTY_UNAVAILABLE;
+
+ switch (action) {
+ case M_PROPERTY_SET: {
+ double scale = *(double *)arg;
+ int s[2] = {vid_w * scale, vid_h * scale};
+ if (s[0] > 0 && s[1] > 0 && vo_control(vo, VOCTRL_SET_WINDOW_SIZE, s) > 0)
+ return M_PROPERTY_OK;
+ return M_PROPERTY_UNAVAILABLE;
+ }
+ case M_PROPERTY_GET: {
+ int s[2];
+ if (vo_control(vo, VOCTRL_GET_WINDOW_SIZE, s) <= 0 || s[0] < 1 || s[1] < 1)
+ return M_PROPERTY_UNAVAILABLE;
+ double xs = (double)s[0] / vid_w;
+ double ys = (double)s[1] / vid_h;
+ *(double *)arg = (xs + ys) / 2;
+ return M_PROPERTY_OK;
+ }
+ }
+ return M_PROPERTY_NOT_IMPLEMENTED;
+}
+
static int mp_property_osd_w(m_option_t *prop, int action, void *arg,
MPContext *mpctx)
{
@@ -1901,6 +1934,8 @@ static const m_option_t mp_properties[] = {
0, 0, 0, NULL },
{ "dwidth", mp_property_dwidth, CONF_TYPE_INT },
{ "dheight", mp_property_dheight, CONF_TYPE_INT },
+ { "window-scale", mp_property_window_scale, CONF_TYPE_DOUBLE,
+ CONF_RANGE, 0.125, 8 },
{ "fps", mp_property_fps, CONF_TYPE_FLOAT,
0, 0, 0, NULL },
{ "aspect", mp_property_aspect, CONF_TYPE_FLOAT,
diff --git a/video/out/vo.h b/video/out/vo.h
index 1777245c96..d9058b96e9 100644
--- a/video/out/vo.h
+++ b/video/out/vo.h
@@ -71,6 +71,8 @@ enum mp_voctrl {
VOCTRL_UPDATE_SCREENINFO,
VOCTRL_WINDOW_TO_OSD_COORDS, // float[2] (x/y)
+ VOCTRL_GET_WINDOW_SIZE, // int[2] (w/h)
+ VOCTRL_SET_WINDOW_SIZE, // int[2] (w/h)
VOCTRL_SET_YUV_COLORSPACE, // struct mp_csp_details*
VOCTRL_GET_YUV_COLORSPACE, // struct mp_csp_details*
diff --git a/video/out/x11_common.c b/video/out/x11_common.c
index 185350591f..fff74c3b2c 100644
--- a/video/out/x11_common.c
+++ b/video/out/x11_common.c
@@ -1486,6 +1486,19 @@ int vo_x11_control(struct vo *vo, int *events, int request, void *arg)
case VOCTRL_UPDATE_SCREENINFO:
vo_x11_update_screeninfo(vo);
return VO_TRUE;
+ case VOCTRL_GET_WINDOW_SIZE: {
+ int *s = arg;
+ if (!x11->window)
+ return VO_FALSE;
+ s[0] = x11->win_width;
+ s[1] = x11->win_height;
+ return VO_TRUE;
+ }
+ case VOCTRL_SET_WINDOW_SIZE: {
+ int *s = arg;
+ vo_x11_highlevel_resize(vo, x11->win_x, x11->win_y, s[0], s[1]);
+ return VO_TRUE;
+ }
case VOCTRL_SET_CURSOR_VISIBILITY:
vo_set_cursor_hidden(vo, !(*(bool *)arg));
return VO_TRUE;