display: egl: create VaapiDisplayEGL with native EGL display
authorHyunjun Ko <zzoon@igalia.com>
Tue, 24 Apr 2018 09:17:24 +0000 (18:17 +0900)
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Tue, 12 Jun 2018 10:35:04 +0000 (12:35 +0200)
gst_vaapi_display_egl_new_with_native_display() has been broken since
it wasn't used.

Currently it's needed to call this API to create a display providing
the EGL display, so it could avoid duplicated calls to the native
display (eg. eglTerminate).

Signed-off-by: Victor Jaquez <vjaquez@igalia.com>
https://bugzilla.gnome.org/show_bug.cgi?id=795391

gst-libs/gst/vaapi/gstvaapidisplay_egl.c
gst/vaapi/gstvaapipluginutil.c

index 884d009..e320906 100644 (file)
@@ -50,6 +50,7 @@ typedef struct
   gpointer display;
   guint display_type;
   guint gles_version;
+  gpointer gl_display;
 } InitParams;
 
 static gboolean
@@ -97,27 +98,36 @@ static gboolean
 gst_vaapi_display_egl_bind_display (GstVaapiDisplay * base_display,
     gpointer native_params)
 {
-  GstVaapiDisplay *native_display = NULL;
+  GstVaapiDisplay *native_vaapi_display;
   GstVaapiDisplayEGL *display = GST_VAAPI_DISPLAY_EGL (base_display);
   EglDisplay *egl_display;
+  EGLDisplay *native_egl_display;
   guint gl_platform = EGL_PLATFORM_UNKNOWN;
   const InitParams *params = (InitParams *) native_params;
 
-  if (params->display) {
-    native_display = params->display;
-  } else {
+  native_vaapi_display = params->display;
+  native_egl_display = params->gl_display;
+
+  if (!native_vaapi_display) {
 #if USE_X11
-    native_display = gst_vaapi_display_x11_new (NULL);
+    if (params->display_type == GST_VAAPI_DISPLAY_TYPE_ANY
+        || params->display_type == GST_VAAPI_DISPLAY_TYPE_X11
+        || params->display_type == GST_VAAPI_DISPLAY_TYPE_EGL)
+      native_vaapi_display = gst_vaapi_display_x11_new (NULL);
 #endif
 #if USE_WAYLAND
-    if (!native_display)
-      native_display = gst_vaapi_display_wayland_new (NULL);
+    if (!native_vaapi_display)
+      native_vaapi_display = gst_vaapi_display_wayland_new (NULL);
 #endif
+  } else {
+    /* thus it could be unrefed */
+    gst_object_ref (native_vaapi_display);
   }
-  if (!native_display)
+  if (!native_vaapi_display)
     return FALSE;
 
-  gst_vaapi_display_replace (&display->display, native_display);
+  gst_vaapi_display_replace (&display->display, native_vaapi_display);
+  gst_object_unref (native_vaapi_display);
 
   switch (GST_VAAPI_DISPLAY_GET_CLASS_TYPE (display->display)) {
     case GST_VAAPI_DISPLAY_TYPE_X11:
@@ -130,8 +140,12 @@ gst_vaapi_display_egl_bind_display (GstVaapiDisplay * base_display,
       break;
   }
 
-  egl_display = egl_display_new (GST_VAAPI_DISPLAY_NATIVE (display->display),
-      gl_platform);
+  if (native_egl_display) {
+    egl_display = egl_display_new_wrapped (native_egl_display);
+  } else {
+    egl_display = egl_display_new (GST_VAAPI_DISPLAY_NATIVE (display->display),
+        gl_platform);
+  }
   if (!egl_display)
     return FALSE;
 
@@ -385,13 +399,14 @@ GstVaapiDisplay *
 gst_vaapi_display_egl_new_with_native_display (gpointer native_display,
     GstVaapiDisplayType display_type, guint gles_version)
 {
-  InitParams params;
+  InitParams params = { NULL, };
 
   g_return_val_if_fail (native_display != NULL, NULL);
 
-  params.display = native_display;
   params.display_type = display_type;
   params.gles_version = gles_version;
+  params.gl_display = native_display;
+
   return gst_vaapi_display_new (g_object_new (GST_TYPE_VAAPI_DISPLAY_EGL, NULL),
       GST_VAAPI_DISPLAY_INIT_FROM_NATIVE_DISPLAY, &params);
 }
index 648c91b..1f3486d 100644 (file)
@@ -41,6 +41,9 @@
 #endif
 #if USE_GST_GL_HELPERS
 # include <gst/gl/gl.h>
+#if USE_EGL && GST_GL_HAVE_PLATFORM_EGL
+# include <gst/gl/egl/gstgldisplay_egl.h>
+#endif
 #endif
 #include "gstvaapipluginutil.h"
 #include "gstvaapipluginbase.h"
@@ -140,7 +143,7 @@ gst_vaapi_create_display_from_gl_context (GstObject * gl_context_object)
   gpointer native_display =
       GSIZE_TO_POINTER (gst_gl_display_get_handle (gl_display));
   GstGLPlatform platform = gst_gl_context_get_gl_platform (gl_context);
-  GstVaapiDisplay *display, *out_display;
+  GstVaapiDisplay *display, *out_display = NULL;
   GstVaapiDisplayType display_type;
 
   switch (gst_gl_display_get_handle_type (gl_display)) {
@@ -195,16 +198,25 @@ gst_vaapi_create_display_from_gl_context (GstObject * gl_context_object)
       display_type = GST_VAAPI_DISPLAY_TYPE_ANY;
       break;
   }
-  gst_object_unref (gl_display);
 
   display = gst_vaapi_create_display_from_handle (display_type, native_display);
   if (!display)
-    return NULL;
+    goto bail;
 
   switch (platform) {
 #if USE_EGL
     case GST_GL_PLATFORM_EGL:{
       guint gles_version;
+      guintptr egl_handle = 0;
+#if GST_GL_HAVE_PLATFORM_EGL
+      GstGLDisplayEGL *egl_display;
+
+      egl_display = gst_gl_display_egl_from_gl_display (gl_display);
+      if (egl_display) {
+        egl_handle = gst_gl_display_get_handle (GST_GL_DISPLAY (egl_display));
+        gst_object_unref (egl_display);
+      }
+#endif
 
       switch (gst_gl_context_get_gl_api (gl_context)) {
         case GST_GL_API_GLES1:
@@ -217,16 +229,21 @@ gst_vaapi_create_display_from_gl_context (GstObject * gl_context_object)
         case GST_GL_API_OPENGL3:
           gles_version = 0;
         create_egl_display:
-          out_display = gst_vaapi_display_egl_new (display, gles_version);
+          if (egl_handle != 0) {
+            out_display =
+                gst_vaapi_display_egl_new_with_native_display
+                (GSIZE_TO_POINTER (egl_handle), display_type, gles_version);
+          } else {
+            out_display = gst_vaapi_display_egl_new (display, gles_version);
+          }
           break;
         default:
           out_display = NULL;
           break;
       }
-      if (!out_display) {
-        gst_vaapi_display_unref (display);
-        return NULL;
-      }
+      if (!out_display)
+        goto bail;
+
       gst_vaapi_display_egl_set_gl_context (GST_VAAPI_DISPLAY_EGL (out_display),
           GSIZE_TO_POINTER (gst_gl_context_get_gl_context (gl_context)));
       break;
@@ -236,7 +253,13 @@ gst_vaapi_create_display_from_gl_context (GstObject * gl_context_object)
       out_display = gst_vaapi_display_ref (display);
       break;
   }
-  gst_vaapi_display_unref (display);
+
+bail:
+  if (display)
+    gst_vaapi_display_unref (display);
+
+  if (gl_display)
+    gst_object_unref (gl_display);
   return out_display;
 #endif
   GST_ERROR ("unsupported GStreamer version %s", GST_API_VERSION_S);