[vlc-devel] [PATCH 2/7] opengl: introduce EGL display module
Romain Vimont
rom1v at videolabs.io
Wed Mar 3 17:36:35 UTC 2021
Add a new module type "egl display" to open an EGL display.
---
modules/video_output/opengl/egl_display.c | 71 +++++++++++++++++++++++
modules/video_output/opengl/egl_display.h | 53 +++++++++++++++++
2 files changed, 124 insertions(+)
create mode 100644 modules/video_output/opengl/egl_display.c
create mode 100644 modules/video_output/opengl/egl_display.h
diff --git a/modules/video_output/opengl/egl_display.c b/modules/video_output/opengl/egl_display.c
new file mode 100644
index 0000000000..c909b4b006
--- /dev/null
+++ b/modules/video_output/opengl/egl_display.c
@@ -0,0 +1,71 @@
+/*****************************************************************************
+ * egl_display.c
+ *****************************************************************************
+ * Copyright (C) 2021 Videolabs
+ *
+ * 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_modules.h>
+
+#include "egl_display.h"
+
+struct vlc_egl_display *
+vlc_egl_display_New(vlc_object_t *parent, const char *name)
+{
+ struct vlc_egl_display *display =
+ vlc_object_create(parent, sizeof(*display));
+ if (!display)
+ return NULL;
+
+ display->ops = NULL;
+ display->display = EGL_NO_DISPLAY;
+
+ if (!name || !*name)
+ name = "any";
+
+ module_t **mods;
+ ssize_t total = vlc_module_match("egl display", name, true, &mods, NULL);
+ for (ssize_t i = 0; i < total; ++i)
+ {
+ vlc_egl_display_open_fn *open = vlc_module_map(parent->logger, mods[i]);
+
+ if (open && open(display) == VLC_SUCCESS)
+ {
+ assert(display->display != EGL_NO_DISPLAY);
+ free(mods);
+ return display;
+ }
+ }
+
+ free(mods);
+ vlc_object_delete(display);
+ return NULL;
+}
+
+void vlc_egl_display_Delete(struct vlc_egl_display *display)
+{
+ if (display->ops && display->ops->close) {
+ display->ops->close(display);
+ }
+
+ vlc_object_delete(display);
+}
diff --git a/modules/video_output/opengl/egl_display.h b/modules/video_output/opengl/egl_display.h
new file mode 100644
index 0000000000..dc0fb37f3b
--- /dev/null
+++ b/modules/video_output/opengl/egl_display.h
@@ -0,0 +1,53 @@
+/*****************************************************************************
+ * egl_display.h
+ *****************************************************************************
+ * Copyright (C) 2021 Videolabs
+ *
+ * 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.
+ *****************************************************************************/
+
+#ifndef VLC_EGL_REFDISPLAY_H
+#define VLC_EGL_REFDISPLAY_H
+
+#include <vlc_common.h>
+#include <EGL/egl.h>
+
+/**
+ * Structure for module "egl display", to open an EGL display guaranteed to
+ * be internally refcounted.
+ */
+struct vlc_egl_display
+{
+ struct vlc_object_t obj;
+
+ EGLDisplay display;
+
+ const struct vlc_egl_display_ops *ops;
+ void *sys;
+};
+
+struct vlc_egl_display_ops {
+ void (*close)(struct vlc_egl_display *display);
+};
+
+typedef int
+vlc_egl_display_open_fn(struct vlc_egl_display *display);
+
+struct vlc_egl_display *
+vlc_egl_display_New(vlc_object_t *parent, const char *name);
+
+void vlc_egl_display_Delete(struct vlc_egl_display *display);
+
+#endif
--
2.30.1
More information about the vlc-devel
mailing list