summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2018-04-15 12:31:07 +0200
committerJan Ekström <jeebjp@gmail.com>2018-04-16 01:21:59 +0300
commitf9bcb5c42c9a3adb54179ef154300734911ea2b5 (patch)
treed3a0701ed4ea3e43cf5364e5e3ee6934ba4a0c02
parent7bfb240309225fa6fb4e51a0deda8fd8e34953e0 (diff)
downloadmpv-f9bcb5c42c9a3adb54179ef154300734911ea2b5.tar.bz2
mpv-f9bcb5c42c9a3adb54179ef154300734911ea2b5.tar.xz
client API: clarify that Display pointers etc. need to stay valid
Normally, MPV_RENDER_PARAM* arguments are copied, unless documented otherwise. Of course we can't copy X11 Display or Wayland wl_display types, but for arguments that are "summarized" in a struct (like MPV_RENDER_PARAM_OPENGL_FBO), a copy is expected. Also add some unused infrastructure to make this explicit, and to make it easier to add parameter types that require a copy. Untested.
-rw-r--r--libmpv/render.h6
-rw-r--r--video/out/gpu/libmpv_gpu.c27
2 files changed, 25 insertions, 8 deletions
diff --git a/libmpv/render.h b/libmpv/render.h
index cefe922b34..68a6b6bf52 100644
--- a/libmpv/render.h
+++ b/libmpv/render.h
@@ -154,13 +154,15 @@ typedef enum mpv_render_param_type {
MPV_RENDER_PARAM_AMBIENT_LIGHT = 7,
/**
* X11 Display, sometimes used for hwdec. Valid for
- * mpv_render_context_create().
+ * mpv_render_context_create(). The Display must stay valid for the lifetime
+ * of the mpv_render_context.
* Type: Display*
*/
MPV_RENDER_PARAM_X11_DISPLAY = 8,
/**
* Wayland display, sometimes used for hwdec. Valid for
- * mpv_render_context_create().
+ * mpv_render_context_create(). The wl_display must stay valid for the
+ * lifetime of the mpv_render_context.
* Type: struct wl_display*
*/
MPV_RENDER_PARAM_WL_DISPLAY = 9,
diff --git a/video/out/gpu/libmpv_gpu.c b/video/out/gpu/libmpv_gpu.c
index cc0ff85376..d08b3a56b9 100644
--- a/video/out/gpu/libmpv_gpu.c
+++ b/video/out/gpu/libmpv_gpu.c
@@ -17,9 +17,20 @@ struct priv {
struct gl_video *renderer;
};
-static const char *const native_resource_map[] = {
- [MPV_RENDER_PARAM_X11_DISPLAY] = "x11",
- [MPV_RENDER_PARAM_WL_DISPLAY] = "wl",
+struct native_resource_entry {
+ const char *name; // ra_add_native_resource() internal name argument
+ size_t size; // size of struct pointed to (0 for no copy)
+};
+
+static const struct native_resource_entry native_resource_map[] = {
+ [MPV_RENDER_PARAM_X11_DISPLAY] = {
+ .name = "x11",
+ .size = 0,
+ },
+ [MPV_RENDER_PARAM_WL_DISPLAY] = {
+ .name = "wl",
+ .size = 0,
+ },
};
static int init(struct render_backend *ctx, mpv_render_param *params)
@@ -54,10 +65,14 @@ static int init(struct render_backend *ctx, mpv_render_param *params)
for (int n = 0; params && params[n].type; n++) {
if (params[n].type > 0 &&
params[n].type < MP_ARRAY_SIZE(native_resource_map) &&
- native_resource_map[params[n].type])
+ native_resource_map[params[n].type].name)
{
- ra_add_native_resource(p->context->ra,
- native_resource_map[params[n].type], params[n].data);
+ const struct native_resource_entry *entry =
+ &native_resource_map[params[n].type];
+ void *data = params[n].data;
+ if (entry->size)
+ data = talloc_memdup(p, data, entry->size);
+ ra_add_native_resource(p->context->ra, entry->name, data);
}
}