summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-11-02 20:26:51 +0100
committerwm4 <wm4@nowhere>2014-11-02 20:53:56 +0100
commit4e2574f025b9f143140008cbed48f6ee9705f813 (patch)
tree0d3f18fa705a31cb278819324cb4e54533a704a6 /video
parent61b06f3756596d0e858db25f5293920eff29333c (diff)
downloadmpv-4e2574f025b9f143140008cbed48f6ee9705f813.tar.bz2
mpv-4e2574f025b9f143140008cbed48f6ee9705f813.tar.xz
command: make window-scale property observable
Add a generic mechanism to the VO to relay "extra" events from VO to player. Use it to notify the core of window resizes, which in turn will be used to mark all affected properties ("window-scale" in this case) as changed. (I refrained from hacking this as internal command into input_ctx, or to poll the state change, etc. - but in the end, maybe it would be best to actually pass the client API context directly to the places where events can happen.)
Diffstat (limited to 'video')
-rw-r--r--video/out/vo.c26
-rw-r--r--video/out/vo.h8
-rw-r--r--video/out/vo_direct3d.c2
-rw-r--r--video/out/vo_opengl.c1
-rw-r--r--video/out/vo_opengl_old.c1
-rw-r--r--video/out/vo_sdl.c1
-rw-r--r--video/out/vo_vaapi.c1
-rw-r--r--video/out/vo_vdpau.c1
-rw-r--r--video/out/vo_wayland.c2
-rw-r--r--video/out/vo_x11.c1
-rw-r--r--video/out/vo_xv.c1
11 files changed, 45 insertions, 0 deletions
diff --git a/video/out/vo.c b/video/out/vo.c
index 9f6021282f..f697002f92 100644
--- a/video/out/vo.c
+++ b/video/out/vo.c
@@ -129,6 +129,7 @@ struct vo_internal {
bool request_redraw; // redraw request from player to VO
bool want_redraw; // redraw request from VO to player
bool paused;
+ int queued_events;
int64_t flip_queue_offset; // queue flip events at most this much in advance
@@ -838,6 +839,31 @@ int64_t vo_get_vsync_interval(struct vo *vo)
return vo->in->vsync_interval;
}
+// Set specific event flags, and wakeup the playback core if needed.
+// vo_query_events() can retrieve the events again.
+void vo_event(struct vo *vo, int event)
+{
+ struct vo_internal *in = vo->in;
+ pthread_mutex_lock(&in->lock);
+ if ((in->queued_events & event & VO_EVENTS_USER) != (event & VO_EVENTS_USER))
+ mp_input_wakeup(vo->input_ctx);
+ in->queued_events |= event;
+ pthread_mutex_unlock(&in->lock);
+}
+
+// Check event flags set with vo_event(). Return the mask of events that was
+// set and included in the events parameter. If clear==true, clear these events.
+int vo_query_events(struct vo *vo, int events, bool clear)
+{
+ struct vo_internal *in = vo->in;
+ pthread_mutex_lock(&in->lock);
+ int r = in->queued_events & events;
+ if (clear)
+ in->queued_events &= ~(unsigned)r;
+ pthread_mutex_unlock(&in->lock);
+ return r;
+}
+
/**
* \brief lookup an integer in a table, table must have 0 as the last key
* \param key key to search for
diff --git a/video/out/vo.h b/video/out/vo.h
index feb2907c67..035b4dc1d6 100644
--- a/video/out/vo.h
+++ b/video/out/vo.h
@@ -30,10 +30,16 @@
#include "common/common.h"
#include "options/options.h"
+// VO needs to redraw
#define VO_EVENT_EXPOSE 1
+// VO needs to update state to a new window size
#define VO_EVENT_RESIZE 2
+// The ICC profile needs to be reloaded
#define VO_EVENT_ICC_PROFILE_PATH_CHANGED 4
+// Set of events the player core may be interested in.
+#define VO_EVENTS_USER (VO_EVENT_RESIZE)
+
enum mp_voctrl {
/* signal a device reset seek */
VOCTRL_RESET = 1,
@@ -298,6 +304,8 @@ void vo_destroy(struct vo *vo);
void vo_set_paused(struct vo *vo, bool paused);
int64_t vo_get_drop_count(struct vo *vo);
int vo_query_format(struct vo *vo, int format);
+void vo_event(struct vo *vo, int event);
+int vo_query_events(struct vo *vo, int events, bool clear);
void vo_set_flip_queue_offset(struct vo *vo, int64_t us);
int64_t vo_get_vsync_interval(struct vo *vo);
diff --git a/video/out/vo_direct3d.c b/video/out/vo_direct3d.c
index 4b81026e35..88575c4e7a 100644
--- a/video/out/vo_direct3d.c
+++ b/video/out/vo_direct3d.c
@@ -1267,6 +1267,8 @@ static int control(struct vo *vo, uint32_t request, void *data)
if (events & VO_EVENT_EXPOSE)
vo->want_redraw = true;
+ vo_event(vo, events);
+
return r;
}
diff --git a/video/out/vo_opengl.c b/video/out/vo_opengl.c
index 3b6e3a2e43..4e1b1a53ea 100644
--- a/video/out/vo_opengl.c
+++ b/video/out/vo_opengl.c
@@ -439,6 +439,7 @@ static int control(struct vo *vo, uint32_t request, void *data)
get_and_update_icc_profile(vo, p->icc_opts);
vo->want_redraw = true;
}
+ vo_event(vo, events);
mpgl_unlock(p->glctx);
return r;
diff --git a/video/out/vo_opengl_old.c b/video/out/vo_opengl_old.c
index 87ba48068a..91a14398d5 100644
--- a/video/out/vo_opengl_old.c
+++ b/video/out/vo_opengl_old.c
@@ -2161,6 +2161,7 @@ static int control(struct vo *vo, uint32_t request, void *data)
resize(vo, vo->dwidth, vo->dheight);
if (events & VO_EVENT_EXPOSE)
vo->want_redraw = true;
+ vo_event(vo, events);
return r;
}
diff --git a/video/out/vo_sdl.c b/video/out/vo_sdl.c
index c904793ca0..822b5009aa 100644
--- a/video/out/vo_sdl.c
+++ b/video/out/vo_sdl.c
@@ -561,6 +561,7 @@ static int wait_events(struct vo *vo, int64_t until_time_us)
break;
case SDL_WINDOWEVENT_SIZE_CHANGED:
check_resize(vo);
+ vo_event(vo, VO_EVENT_RESIZE);
break;
}
break;
diff --git a/video/out/vo_vaapi.c b/video/out/vo_vaapi.c
index fa23c931c6..89e22d8bbf 100644
--- a/video/out/vo_vaapi.c
+++ b/video/out/vo_vaapi.c
@@ -567,6 +567,7 @@ static int control(struct vo *vo, uint32_t request, void *data)
resize(p);
if (events & VO_EVENT_EXPOSE)
vo->want_redraw = true;
+ vo_event(vo, events);
return r;
}
diff --git a/video/out/vo_vdpau.c b/video/out/vo_vdpau.c
index c8836a8639..46190fd032 100644
--- a/video/out/vo_vdpau.c
+++ b/video/out/vo_vdpau.c
@@ -1114,6 +1114,7 @@ static int control(struct vo *vo, uint32_t request, void *data)
} else if (events & VO_EVENT_EXPOSE) {
vo->want_redraw = true;
}
+ vo_event(vo, events);
return r;
}
diff --git a/video/out/vo_wayland.c b/video/out/vo_wayland.c
index ac6c561526..87e38e45b3 100644
--- a/video/out/vo_wayland.c
+++ b/video/out/vo_wayland.c
@@ -705,6 +705,8 @@ static int control(struct vo *vo, uint32_t request, void *data)
if (events & VO_EVENT_RESIZE)
resize(p);
+ vo_event(vo, events);
+
return r;
}
diff --git a/video/out/vo_x11.c b/video/out/vo_x11.c
index 914522e6b8..38a60c1be8 100644
--- a/video/out/vo_x11.c
+++ b/video/out/vo_x11.c
@@ -631,6 +631,7 @@ static int control(struct vo *vo, uint32_t request, void *data)
int r = vo_x11_control(vo, &events, request, data);
if (events & (VO_EVENT_EXPOSE | VO_EVENT_RESIZE))
resize(vo);
+ vo_event(vo, events);
return r;
}
diff --git a/video/out/vo_xv.c b/video/out/vo_xv.c
index 1ea16558ac..07495fb89e 100644
--- a/video/out/vo_xv.c
+++ b/video/out/vo_xv.c
@@ -851,6 +851,7 @@ static int control(struct vo *vo, uint32_t request, void *data)
int r = vo_x11_control(vo, &events, request, data);
if (events & (VO_EVENT_EXPOSE | VO_EVENT_RESIZE))
resize(vo);
+ vo_event(vo, events);
return r;
}