[vlc-devel] [RFC PATCH] vout: add the window provider module
Thomas Guillem
thomas at gllm.fr
Wed Apr 3 17:56:18 CEST 2019
I didn't include is_decorated in this API, I don't really know the usecase.
TODO:
- Add vlc_player_SetWindowProvider(vlc_player_t, void *data, <callback_list>);
- Document every callback inside vlc_player.h
- Use it from QT and remove the old QT "vout window" plugin.
- And later: plug it into libvlc, without breaking legacy window functions
---
modules/video_output/Makefile.am | 2 +
modules/video_output/wprovider.c | 193 +++++++++++++++++++++++++++++++
2 files changed, 195 insertions(+)
create mode 100644 modules/video_output/wprovider.c
diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am
index 3081e9c14e..0d8e0f834c 100644
--- a/modules/video_output/Makefile.am
+++ b/modules/video_output/Makefile.am
@@ -473,6 +473,7 @@ libvdummy_plugin_la_SOURCES = video_output/vdummy.c
libvideo_splitter_plugin_la_SOURCES = video_output/splitter.c
libvmem_plugin_la_SOURCES = video_output/vmem.c
libwdummy_plugin_la_SOURCES = video_output/wdummy.c
+libwprovider_plugin_la_SOURCES = video_output/wprovider.c
libyuv_plugin_la_SOURCES = video_output/yuv.c
libvgl_plugin_la_SOURCES = video_output/vgl.c
@@ -482,5 +483,6 @@ vout_LTLIBRARIES += \
libvideo_splitter_plugin.la \
libvmem_plugin.la \
libwdummy_plugin.la \
+ libwprovider_plugin.la \
libvgl_plugin.la \
libyuv_plugin.la
diff --git a/modules/video_output/wprovider.c b/modules/video_output/wprovider.c
new file mode 100644
index 0000000000..d087fe742b
--- /dev/null
+++ b/modules/video_output/wprovider.c
@@ -0,0 +1,193 @@
+/*****************************************************************************
+ * wprovider.c: window provider
+ *****************************************************************************
+ *****************************************************************************
+ * Copyright (C) 2019 VLC authors and VideoLAN
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_vout_window.h>
+
+struct context
+{
+ void *opaque;
+ int (*enable)(void *opaque, bool is_fullscreen,
+ unsigned width, unsigned height, unsigned *type,
+ void **handle);
+ void (*disable)(void *opaque);
+ void (*resize)(void *opaque, unsigned width, unsigned height);
+ void (*destroy)(void *opaque);
+ void (*set_state)(void *opaque, unsigned state);
+ void (*unset_fullscreen)(void *opaque);
+ void (*set_fullscreen)(void *opaque, const char *id);
+ void (*set_title)(void *opaque, const char *id);
+};
+
+static int
+Enable(struct vout_window_t *wnd, const vout_window_cfg_t *cfg)
+{
+ struct context *ctx = wnd->sys;
+ assert(ctx->enable);
+
+ unsigned type; void *handle;
+ int ret = ctx->enable(ctx->opaque, cfg->is_fullscreen,
+ cfg->width, cfg->height, &type, &handle);
+ if (ret == 0)
+ {
+ wnd->type = type;
+ switch (type)
+ {
+ case VOUT_WINDOW_TYPE_XID:
+ wnd->handle.xid = (uintptr_t) handle;
+ break;
+ case VOUT_WINDOW_TYPE_HWND:
+ wnd->handle.hwnd = handle;
+ break;
+ case VOUT_WINDOW_TYPE_NSOBJECT:
+ wnd->handle.nsobject = handle;
+ break;
+ case VOUT_WINDOW_TYPE_ANDROID_NATIVE:
+ wnd->handle.anativewindow = handle;
+ break;
+ case VOUT_WINDOW_TYPE_WAYLAND:
+ wnd->handle.wl = handle;
+ break;
+ default:
+ break;
+ }
+ }
+ return ret;
+}
+
+static void
+Disable(struct vout_window_t *wnd)
+{
+ struct context *ctx = wnd->sys;
+
+ if (ctx->disable)
+ ctx->disable(ctx->opaque);
+}
+
+static void
+Resize(struct vout_window_t *wnd, unsigned width, unsigned height)
+{
+ struct context *ctx = wnd->sys;
+
+ if (ctx->resize)
+ ctx->resize(ctx->opaque, width, height);
+}
+
+static void
+Destroy(struct vout_window_t *wnd)
+{
+ struct context *ctx = wnd->sys;
+ if (ctx->destroy)
+ ctx->destroy(ctx->opaque);
+ free(ctx);
+}
+
+static void
+SetState(struct vout_window_t *wnd, unsigned state)
+{
+ struct context *ctx = wnd->sys;
+
+ if (ctx->set_state)
+ ctx->set_state(ctx->opaque, state);
+}
+
+static void
+UnsetFullscreen(struct vout_window_t *wnd)
+{
+ struct context *ctx = wnd->sys;
+
+ if (ctx->unset_fullscreen)
+ ctx->unset_fullscreen(ctx->opaque);
+}
+
+static void
+SetFullscreen(struct vout_window_t *wnd, const char *id)
+{
+ struct context *ctx = wnd->sys;
+
+ if (ctx->set_fullscreen)
+ ctx->set_fullscreen(ctx->opaque, id);
+}
+
+static void
+SetTitle(struct vout_window_t *wnd, const char *id)
+{
+ struct context *ctx = wnd->sys;
+
+ if (ctx->set_title)
+ ctx->set_title(ctx->opaque, id);
+}
+
+static int Open(vout_window_t *wnd)
+{
+ static const struct vout_window_operations ops = {
+ .enable = Enable,
+ .disable = Disable,
+ .resize = Resize,
+ .destroy = Destroy,
+ .set_state = SetState,
+ .unset_fullscreen = UnsetFullscreen,
+ .set_fullscreen = SetFullscreen,
+ .set_title = SetTitle
+ };
+
+ struct context *ctx = malloc(sizeof(*ctx));
+ if (!ctx)
+ return VLC_ENOMEM;
+
+ ctx->enable = var_InheritAddress(wnd, "wprovider-enable");
+ if (!ctx->enable)
+ {
+ free(ctx);
+ return VLC_EGENERIC;
+ }
+
+ ctx->opaque = var_InheritAddress(wnd, "wprovider-data");
+ ctx->disable = var_InheritAddress(wnd, "wprovider-disable-cb");
+ ctx->resize = var_InheritAddress(wnd, "wprovider-resize-cb");
+ ctx->destroy = var_InheritAddress(wnd, "wprovider-destroy-cb");
+ ctx->set_state = var_InheritAddress(wnd, "wprovider-set-state-cb");
+ ctx->unset_fullscreen = var_InheritAddress(wnd, "wprovider-unset-fullscreen-cb");
+ ctx->set_fullscreen = var_InheritAddress(wnd, "wprovider-set-fullscreen-cb");
+ ctx->set_title = var_InheritAddress(wnd, "wprovider-set-title-cb");
+
+ wnd->type = VOUT_WINDOW_TYPE_DUMMY;
+ wnd->ops = &ops;
+ wnd->sys = ctx;
+ wnd->info.has_double_click = var_InheritBool(wnd, "wprovider-has-double-click");
+ return VLC_SUCCESS;
+}
+
+vlc_module_begin()
+ set_shortname(N_("Window provider"))
+ set_category(CAT_VIDEO)
+ set_subcategory(SUBCAT_VIDEO_VOUT)
+ set_capability("vout window", 0)
+ set_callbacks(Open, NULL)
+ add_shortcut("provider", "callbacks")
+vlc_module_end()
--
2.20.1
More information about the vlc-devel
mailing list