Revert "gl: Use GstGLDisplayEGL directly instead of creating a GstGLDisplayVIVFb...
authorJan Schmidt <jan@centricular.com>
Thu, 23 Nov 2017 11:58:40 +0000 (22:58 +1100)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:32:31 +0000 (19:32 +0000)
This reverts commit 47fd4d391e775c11f529705bb0f457a9d25ba5e7.

This patch is incorrect. It doesn't actually compile, and causes a crash
because the viv-fb window implementation needs a native EGL handle
to pass to fbCreateWindow, but the GstGLDisplayEGL handleis actually
an EGLDisplay now (and gets cast to the wrong type)

gst-libs/gst/gl/viv-fb/gstgldisplay_viv_fb.c
gst-libs/gst/gl/viv-fb/gstgldisplay_viv_fb.h
gst-libs/gst/gl/viv-fb/gstglwindow_viv_fb_egl.c

index 90202c7..48815e5 100644 (file)
 GST_DEBUG_CATEGORY_STATIC (gst_gl_display_debug);
 #define GST_CAT_DEFAULT gst_gl_display_debug
 
+G_DEFINE_TYPE (GstGLDisplayVivFB, gst_gl_display_viv_fb, GST_TYPE_GL_DISPLAY);
+
+static void gst_gl_display_viv_fb_finalize (GObject * object);
+static guintptr gst_gl_display_viv_fb_get_handle (GstGLDisplay * display);
+
+static void
+gst_gl_display_viv_fb_class_init (GstGLDisplayVivFBClass * klass)
+{
+  GST_GL_DISPLAY_CLASS (klass)->get_handle =
+      GST_DEBUG_FUNCPTR (gst_gl_display_viv_fb_get_handle);
+
+  G_OBJECT_CLASS (klass)->finalize = gst_gl_display_viv_fb_finalize;
+}
+
+static void
+gst_gl_display_viv_fb_init (GstGLDisplayVivFB * display_viv_fb)
+{
+  GstGLDisplay *display = (GstGLDisplay *) display_viv_fb;
+
+  display->type = GST_GL_DISPLAY_TYPE_VIV_FB;
+
+  display_viv_fb->disp_idx = 0;
+  display_viv_fb->display = NULL;
+}
+
+static void
+gst_gl_display_viv_fb_finalize (GObject * object)
+{
+  GstGLDisplayVivFB *display_viv_fb = GST_GL_DISPLAY_VIV_FB (object);
+
+  if (display_viv_fb->display)
+    fbDestroyDisplay (display_viv_fb->display);
+
+  G_OBJECT_CLASS (gst_gl_display_viv_fb_parent_class)->finalize (object);
+}
+
 /**
  * gst_gl_display_viv_fb_new:
  * @disp_idx: a display index
  *
- * Create a new #GstGLDisplay from the FB display index.
+ * Create a new #GstGLDisplayVivFB from the FB display index.
  *
  * Returns: (transfer full): a new #GstGLDisplayVivFB or %NULL
  */
-GstGLDisplayEGL *
+GstGLDisplayVivFB *
 gst_gl_display_viv_fb_new (gint disp_idx)
 {
-  EGLDisplay display;
+  GstGLDisplayVivFB *display;
 
   GST_DEBUG_CATEGORY_GET (gst_gl_display_debug, "gldisplay");
 
   GST_DEBUG ("creating Vivante FB EGL display %d", disp_idx);
 
-  display = fbGetDisplayByIndex (disp_idx);
+  display = g_object_new (GST_TYPE_GL_DISPLAY_VIV_FB, NULL);
+  gst_object_ref_sink (display);
+  display->disp_idx = disp_idx;
+  display->display = fbGetDisplayByIndex (display->disp_idx);
+  if (!display->display) {
+    GST_ERROR ("Failed to open Vivante FB display %d", disp_idx);
+    return NULL;
+  }
+
   GST_DEBUG ("Created Vivante FB EGL display %p", (gpointer) display->display);
-  return
-      gst_gl_display_egl_new_with_egl_display (eglGetDisplay (
-          (EGLNativeDisplayType) display));
+
+  return display;
+}
+
+static guintptr
+gst_gl_display_viv_fb_get_handle (GstGLDisplay * display)
+{
+  return (guintptr) GST_GL_DISPLAY_VIV_FB (display)->display;
 }
index 6d19c37..9ce1dce 100644 (file)
 #define __GST_GL_DISPLAY_VIV_FB_H__
 
 #include <gst/gst.h>
-#include <gst/gl/egl/gstgldisplay_egl.h>
+#include <gst/gl/gstgldisplay.h>
 #include <gst/gl/egl/gstegl.h>
 
 G_BEGIN_DECLS
 
-GstGLDisplayEGL *gst_gl_display_viv_fb_new (gint disp_idx);
+GType gst_gl_display_viv_fb_get_type (void);
+
+#define GST_TYPE_GL_DISPLAY_VIV_FB             (gst_gl_display_viv_fb_get_type())
+#define GST_GL_DISPLAY_VIV_FB(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GL_DISPLAY_VIV_FB,GstGLDisplayVivFB))
+#define GST_GL_DISPLAY_VIV_FB_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_GL_DISPLAY_VIV_FB,GstGLDisplayVivFBClass))
+#define GST_IS_GL_DISPLAY_VIV_FB(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_DISPLAY_VIV_FB))
+#define GST_IS_GL_DISPLAY_VIV_FB_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_GL_DISPLAY_VIV_FB))
+#define GST_GL_DISPLAY_VIV_FB_CAST(obj)        ((GstGLDisplayVivFB*)(obj))
+
+typedef struct _GstGLDisplayVivFB GstGLDisplayVivFB;
+typedef struct _GstGLDisplayVivFBClass GstGLDisplayVivFBClass;
+
+/**
+ * GstGLDisplayVivFB:
+ *
+ * the contents of a #GstGLDisplayVivFB are private and should only be accessed
+ * through the provided API
+ */
+struct _GstGLDisplayVivFB
+{
+  GstGLDisplay          parent;
+
+  /* <private> */
+  gint disp_idx;
+  EGLNativeDisplayType display;
+};
+
+struct _GstGLDisplayVivFBClass
+{
+  GstGLDisplayClass object_class;
+};
+
+GstGLDisplayVivFB *gst_gl_display_viv_fb_new (gint disp_idx);
 
 G_END_DECLS
 
index e6a6250..8515dc8 100644 (file)
@@ -75,6 +75,11 @@ gst_gl_window_viv_fb_egl_new (GstGLDisplay * display)
 {
   GstGLWindowVivFBEGL *window;
 
+  if ((gst_gl_display_get_handle_type (display) & GST_GL_DISPLAY_TYPE_VIV_FB) ==
+      0)
+    /* we require a Vivante FB display to create windows */
+    return NULL;
+
   window = g_object_new (GST_TYPE_GL_WINDOW_VIV_FB_EGL, NULL);
   gst_object_ref_sink (window);