[vlc-devel] [PATCH 3/7] egl_pbuffer: use a default EGL display module

Romain Vimont rom1v at videolabs.io
Wed Mar 3 17:36:36 UTC 2021


Add a default EGL display module which just calls
eglGetDisplay(EGL_DEFAULT_DISPLAY).
---
 modules/video_filter/egl_pbuffer.c            | 13 ++++-
 modules/video_output/opengl/Makefile.am       | 10 +++-
 .../video_output/opengl/egl_display_generic.c | 50 +++++++++++++++++++
 3 files changed, 70 insertions(+), 3 deletions(-)
 create mode 100644 modules/video_output/opengl/egl_display_generic.c

diff --git a/modules/video_filter/egl_pbuffer.c b/modules/video_filter/egl_pbuffer.c
index 0ecc2562d0..5ede974602 100644
--- a/modules/video_filter/egl_pbuffer.c
+++ b/modules/video_filter/egl_pbuffer.c
@@ -34,6 +34,7 @@
 #include "../video_output/opengl/gl_api.h"
 #include "../video_output/opengl/gl_common.h"
 #include "../video_output/opengl/interop.h"
+#include "../video_output/opengl/egl_display.h"
 #include <EGL/egl.h>
 #include <EGL/eglext.h>
 
@@ -64,6 +65,8 @@ struct vlc_gl_pbuffer
     GLuint                  textures[BUFFER_COUNT];
     struct pbo_picture_context     picture_contexts[BUFFER_COUNT];
 
+    struct vlc_egl_display *vlc_display;
+
     EGLDisplay display;
     EGLSurface surface;
     EGLContext context;
@@ -131,10 +134,13 @@ static int InitEGL(vlc_gl_t *gl, unsigned width, unsigned height)
 {
     struct vlc_gl_pbuffer *sys = gl->sys;
 
-    sys->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-    if (sys->display == EGL_NO_DISPLAY)
+    sys->vlc_display = vlc_egl_display_New(VLC_OBJECT(gl), NULL);
+    if (!sys->vlc_display)
         return VLC_EGENERIC;
 
+    sys->display = sys->vlc_display->display;
+    assert(sys->display != EGL_NO_DISPLAY);
+
     /* Initialize EGL display */
     EGLint major, minor;
     if (eglInitialize(sys->display, &major, &minor) != EGL_TRUE)
@@ -223,6 +229,7 @@ static int InitEGL(vlc_gl_t *gl, unsigned width, unsigned height)
 
     return VLC_SUCCESS;
 error:
+    vlc_egl_display_Delete(sys->display);
     return VLC_EGENERIC;
 }
 
@@ -352,6 +359,8 @@ static void Close( vlc_gl_t *gl )
     vt->DeleteFramebuffers(BUFFER_COUNT, sys->framebuffers);
     vt->DeleteTextures(BUFFER_COUNT, sys->textures);
     vlc_gl_ReleaseCurrent(sys->gl);
+
+    vlc_egl_display_Delete(sys->vlc_display);
 }
 
 static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
diff --git a/modules/video_output/opengl/Makefile.am b/modules/video_output/opengl/Makefile.am
index 4235607abc..364acbe87c 100644
--- a/modules/video_output/opengl/Makefile.am
+++ b/modules/video_output/opengl/Makefile.am
@@ -89,7 +89,15 @@ if HAVE_GL
 vout_LTLIBRARIES += libgl_plugin.la
 endif # HAVE_GL
 
-libegl_pbuffer_filter_plugin_la_SOURCES = video_filter/egl_pbuffer.c
+libegl_display_generic_plugin_la_SOURCES = video_output/opengl/egl_display_generic.c
+libegl_display_generic_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) $(EGL_FLAGS)
+libegl_display_generic_plugin_la_LIBADD = $(EGL_LIBS)
+if HAVE_ANDROID
+vout_LTLIBRARIES += libegl_display_generic_plugin.la
+endif
+
+libegl_pbuffer_filter_plugin_la_SOURCES = video_filter/egl_pbuffer.c \
+    video_output/opengl/egl_display.c
 libegl_pbuffer_filter_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) $(EGL_FLAGS)
 libegl_pbuffer_filter_plugin_la_LIBADD = $(EGL_LIBS)
 
diff --git a/modules/video_output/opengl/egl_display_generic.c b/modules/video_output/opengl/egl_display_generic.c
new file mode 100644
index 0000000000..dfa68125c4
--- /dev/null
+++ b/modules/video_output/opengl/egl_display_generic.c
@@ -0,0 +1,50 @@
+/*****************************************************************************
+ * egl_display_generic.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 <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_opengl.h>
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#include "egl_display.h"
+
+static vlc_egl_display_open_fn Open;
+static int
+Open(struct vlc_egl_display *display)
+{
+    display->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+    if (display->display == EGL_NO_DISPLAY)
+        return VLC_EGENERIC;
+
+    return VLC_SUCCESS;
+}
+
+vlc_module_begin()
+    set_description("EGL generic display")
+    set_capability("egl display", 1)
+    set_callback(Open)
+    add_shortcut("egl_display_generic")
+vlc_module_end()
-- 
2.30.1



More information about the vlc-devel mailing list