gl: Use GstGLDisplayEGL directly instead of creating a GstGLDisplayVIVFb subclass

This simplifies the code a lot without any functional changes apart from
not closing the display connection. Closing the display connection is
not safe to do as it is shared between all other code in the same
process and no reference counting or anything happens at the platform
layer.
This commit is contained in:
Cassandra Rommel 2017-10-02 12:35:48 -07:00 committed by Tim-Philipp Müller
parent 5b35e2339a
commit 2ed379c732
3 changed files with 9 additions and 95 deletions

View file

@ -29,75 +29,26 @@
GST_DEBUG_CATEGORY_STATIC (gst_gl_display_debug); GST_DEBUG_CATEGORY_STATIC (gst_gl_display_debug);
#define GST_CAT_DEFAULT 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: * gst_gl_display_viv_fb_new:
* @disp_idx: a display index * @disp_idx: a display index
* *
* Create a new #GstGLDisplayVivFB from the FB display index. * Create a new #GstGLDisplay from the FB display index.
* *
* Returns: (transfer full): a new #GstGLDisplayVivFB or %NULL * Returns: (transfer full): a new #GstGLDisplayVivFB or %NULL
*/ */
GstGLDisplayVivFB * GstGLDisplayEGL *
gst_gl_display_viv_fb_new (gint disp_idx) gst_gl_display_viv_fb_new (gint disp_idx)
{ {
GstGLDisplayVivFB *display; EGLDisplay display;
GST_DEBUG_CATEGORY_GET (gst_gl_display_debug, "gldisplay"); GST_DEBUG_CATEGORY_GET (gst_gl_display_debug, "gldisplay");
GST_DEBUG ("creating Vivante FB EGL display %d", disp_idx); GST_DEBUG ("creating Vivante FB EGL display %d", disp_idx);
display = g_object_new (GST_TYPE_GL_DISPLAY_VIV_FB, NULL); display = fbGetDisplayByIndex (disp_idx);
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); GST_DEBUG ("Created Vivante FB EGL display %p", (gpointer) display->display);
return
return display; gst_gl_display_egl_new_with_egl_display (eglGetDisplay (
} (EGLNativeDisplayType) display));
static guintptr
gst_gl_display_viv_fb_get_handle (GstGLDisplay * display)
{
return (guintptr) GST_GL_DISPLAY_VIV_FB (display)->display;
} }

View file

@ -23,44 +23,12 @@
#define __GST_GL_DISPLAY_VIV_FB_H__ #define __GST_GL_DISPLAY_VIV_FB_H__
#include <gst/gst.h> #include <gst/gst.h>
#include <gst/gl/gstgldisplay.h> #include <gst/gl/egl/gstgldisplay_egl.h>
#include <gst/gl/egl/gstegl.h> #include <gst/gl/egl/gstegl.h>
G_BEGIN_DECLS G_BEGIN_DECLS
GType gst_gl_display_viv_fb_get_type (void); GstGLDisplayEGL *gst_gl_display_viv_fb_new (gint disp_idx);
#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 G_END_DECLS

View file

@ -75,11 +75,6 @@ gst_gl_window_viv_fb_egl_new (GstGLDisplay * display)
{ {
GstGLWindowVivFBEGL *window; 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); window = g_object_new (GST_TYPE_GL_WINDOW_VIV_FB_EGL, NULL);
gst_object_ref_sink (window); gst_object_ref_sink (window);