libs: egl: remove dynamic library loading code

Since the upstream of gstreamer-vaapi, the library is not a public shared
object anymore. But the EGL support depended on this dynamic library, so the
EGL support was broken.

This patch removes the dynamic library loading code and instantiates the
EGL display using either X11 or Wayland if available.

https://bugzilla.gnome.org/show_bug.cgi?id=767203
This commit is contained in:
Víctor Manuel Jáquez Leal 2016-07-13 18:34:57 +02:00
parent 5beccf5fa0
commit 27429ce676

View file

@ -29,230 +29,14 @@
#include "gstvaapiwindow_priv.h" #include "gstvaapiwindow_priv.h"
#include "gstvaapitexture_egl.h" #include "gstvaapitexture_egl.h"
GST_DEBUG_CATEGORY (gst_debug_vaapidisplay_egl);
/* ------------------------------------------------------------------------- */
/* --- Display backend loader --- */
/* ------------------------------------------------------------------------- */
typedef struct _GstVaapiDisplayLoader GstVaapiDisplayLoader;
typedef struct _GstVaapiDisplayLoaderInfo GstVaapiDisplayLoaderInfo;
typedef GstVaapiDisplay *(*GstVaapiDisplayCreateFunc) (const gchar * name);
typedef GstVaapiDisplay *(*GstVaapiDisplayCreateFromNativeFunc) (gpointer dpy);
struct _GstVaapiDisplayLoader
{
GstVaapiMiniObject parent_instance;
GModule *module;
GPtrArray *module_names;
GstVaapiDisplayCreateFunc create_display;
GstVaapiDisplayCreateFromNativeFunc create_display_from_native;
};
struct _GstVaapiDisplayLoaderInfo
{
const gchar *name;
GstVaapiDisplayType type;
const gchar *create_display;
const gchar *create_display_from_native;
};
static GMutex g_loader_lock;
static GstVaapiDisplayLoader *g_loader;
/* *INDENT-OFF* */
static const GstVaapiDisplayLoaderInfo g_loader_info[] = {
#if USE_WAYLAND
{ "wayland",
GST_VAAPI_DISPLAY_TYPE_WAYLAND,
"gst_vaapi_display_wayland_new",
"gst_vaapi_display_wayland_new_with_display",
},
#endif
#if USE_X11 #if USE_X11
{ "x11", #include "gstvaapidisplay_x11.h"
GST_VAAPI_DISPLAY_TYPE_X11, #endif
"gst_vaapi_display_x11_new", #if USE_WAYLAND
"gst_vaapi_display_x11_new_with_display", #include "gstvaapidisplay_wayland.h"
},
#endif #endif
{NULL,}
};
/* *INDENT-ON* */
static void GST_DEBUG_CATEGORY (gst_debug_vaapidisplay_egl);
gst_vaapi_display_loader_finalize (GstVaapiDisplayLoader * loader)
{
if (!loader)
return;
if (loader->module) {
g_module_close (loader->module);
loader->module = NULL;
}
if (loader->module_names) {
g_ptr_array_unref (loader->module_names);
loader->module_names = NULL;
}
}
static inline const GstVaapiMiniObjectClass *
gst_vaapi_display_loader_class (void)
{
static const GstVaapiMiniObjectClass g_class = {
.size = sizeof (GstVaapiDisplayLoader),
.finalize = (GDestroyNotify) gst_vaapi_display_loader_finalize,
};
return &g_class;
}
static inline GstVaapiDisplayLoader *
gst_vaapi_display_loader_new (void)
{
return (GstVaapiDisplayLoader *)
gst_vaapi_mini_object_new0 (gst_vaapi_display_loader_class ());
}
static gboolean
gst_vaapi_display_loader_reset_module_names (GstVaapiDisplayLoader * loader,
const GstVaapiDisplayLoaderInfo * loader_info)
{
gchar *module_name;
if (loader->module_names)
g_ptr_array_unref (loader->module_names);
loader->module_names = g_ptr_array_new_full (3, (GDestroyNotify) g_free);
if (!loader->module_names)
return FALSE;
module_name =
g_strdup_printf ("libgstvaapi-%s-%s.la", loader_info->name,
GST_API_VERSION_S);
if (module_name)
g_ptr_array_add (loader->module_names, module_name);
module_name =
g_strdup_printf ("libgstvaapi-%s-%s.so", loader_info->name,
GST_API_VERSION_S);
if (module_name)
g_ptr_array_add (loader->module_names, module_name);
module_name =
g_strdup_printf ("libgstvaapi-%s-%s.so.%s", loader_info->name,
GST_API_VERSION_S, GST_VAAPI_MAJOR_VERSION_S);
if (module_name)
g_ptr_array_add (loader->module_names, module_name);
return loader->module_names->len > 0;
}
static gboolean
gst_vaapi_display_loader_try_load_module (GstVaapiDisplayLoader * loader,
const GstVaapiDisplayLoaderInfo * loader_info)
{
guint i;
if (!gst_vaapi_display_loader_reset_module_names (loader, loader_info))
return FALSE;
if (loader->module) {
g_module_close (loader->module);
loader->module = NULL;
}
for (i = 0; i < loader->module_names->len; i++) {
const gchar *const module_name =
g_ptr_array_index (loader->module_names, i);
loader->module = g_module_open (module_name,
G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
if (loader->module)
return TRUE;
}
return FALSE;
}
static gboolean
gst_vaapi_display_loader_try_load (GstVaapiDisplayLoader * loader,
const GstVaapiDisplayLoaderInfo * loader_info)
{
guint has_errors = 0;
if (!gst_vaapi_display_loader_try_load_module (loader, loader_info))
return FALSE;
GST_DEBUG ("loaded backend: %s", g_module_name (loader->module));
has_errors |= !g_module_symbol (loader->module,
loader_info->create_display, (gpointer *) & loader->create_display);
has_errors |= !g_module_symbol (loader->module,
loader_info->create_display_from_native,
(gpointer *) & loader->create_display_from_native);
return has_errors == 0;
}
static GstVaapiDisplay *
gst_vaapi_display_loader_try_load_any (GstVaapiDisplayLoader * loader)
{
GstVaapiDisplay *display;
const GstVaapiDisplayLoaderInfo *loader_info;
for (loader_info = g_loader_info; loader_info->name != NULL; loader_info++) {
if (!gst_vaapi_display_loader_try_load (loader, loader_info))
continue;
display = loader->create_display (NULL);
if (display) {
GST_INFO ("selected backend: %s", loader_info->name);
return display;
}
}
return NULL;
}
#define gst_vaapi_display_loader_ref(loader) \
((GstVaapiDisplayLoader *) gst_vaapi_mini_object_ref (GST_VAAPI_MINI_OBJECT (loader)))
#define gst_vaapi_display_loader_unref(loader) \
gst_vaapi_mini_object_unref (GST_VAAPI_MINI_OBJECT (loader))
#define gst_vaapi_display_loader_replace(old_loader_ptr, new_loader) \
gst_vaapi_mini_object_replace ((GstVaapiMiniObject **)(old_loader_ptr), \
GST_VAAPI_MINI_OBJECT (new_loader))
static GstVaapiDisplayLoader *
gst_vaapi_display_loader_acquire_global (void)
{
GstVaapiDisplayLoader *loader;
g_mutex_lock (&g_loader_lock);
loader = g_loader ? gst_vaapi_display_loader_ref (g_loader) :
gst_vaapi_display_loader_new ();
g_loader = loader;
g_mutex_unlock (&g_loader_lock);
return loader;
}
static void
gst_vaapi_display_loader_release_global (void)
{
g_mutex_lock (&g_loader_lock);
gst_vaapi_display_loader_replace (&g_loader, NULL);
g_mutex_unlock (&g_loader_lock);
}
static const GstVaapiDisplayLoaderInfo *
gst_vaapi_display_loader_map_lookup_type (GstVaapiDisplayType type)
{
const GstVaapiDisplayLoaderInfo *loader_info;
for (loader_info = g_loader_info; loader_info->name != NULL; loader_info++) {
if (loader_info->type == type)
return loader_info;
}
return NULL;
}
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/* --- EGL backend implementation --- */ /* --- EGL backend implementation --- */
@ -310,29 +94,28 @@ static gboolean
gst_vaapi_display_egl_bind_display (GstVaapiDisplayEGL * display, gst_vaapi_display_egl_bind_display (GstVaapiDisplayEGL * display,
const InitParams * params) const InitParams * params)
{ {
GstVaapiDisplay *native_display; GstVaapiDisplay *native_display = NULL;
GstVaapiDisplayLoader *loader;
const GstVaapiDisplayLoaderInfo *loader_info;
EglDisplay *egl_display; EglDisplay *egl_display;
loader = gst_vaapi_display_loader_acquire_global ();
if (params->display) { if (params->display) {
loader_info = #if USE_X11
gst_vaapi_display_loader_map_lookup_type (params->display_type); if (params->display_type == GST_VAAPI_DISPLAY_TYPE_X11)
if (!loader_info) native_display = gst_vaapi_display_x11_new_with_display (params->display);
goto error_unsupported_display_type; #endif
#if USE_WAYLAND
loader = gst_vaapi_display_loader_new (); if (params->display_type == GST_VAAPI_DISPLAY_TYPE_WAYLAND)
if (!loader || !gst_vaapi_display_loader_try_load (loader, loader_info)) native_display =
goto error_init_loader; gst_vaapi_display_wayland_new_with_display (params->display);
#endif
native_display = loader->create_display_from_native (params->display);
} else { } else {
gst_vaapi_display_loader_ref (loader); #if USE_X11
native_display = gst_vaapi_display_loader_try_load_any (loader); native_display = gst_vaapi_display_x11_new (NULL);
#endif
#if USE_WAYLAND
if (!native_display)
native_display = gst_vaapi_display_wayland_new (NULL);
#endif
} }
gst_vaapi_display_loader_replace (&display->loader, loader);
gst_vaapi_display_loader_unref (loader);
if (!native_display) if (!native_display)
return FALSE; return FALSE;
@ -347,23 +130,12 @@ gst_vaapi_display_egl_bind_display (GstVaapiDisplayEGL * display,
egl_object_unref (egl_display); egl_object_unref (egl_display);
display->gles_version = params->gles_version; display->gles_version = params->gles_version;
return TRUE; return TRUE;
/* ERRORS */
error_unsupported_display_type:
GST_ERROR ("unsupported display type (%d)", params->display_type);
return FALSE;
error_init_loader:
GST_ERROR ("failed to initialize display backend loader");
gst_vaapi_display_loader_replace (&loader, NULL);
return FALSE;
} }
static void static void
gst_vaapi_display_egl_close_display (GstVaapiDisplayEGL * display) gst_vaapi_display_egl_close_display (GstVaapiDisplayEGL * display)
{ {
gst_vaapi_display_replace (&display->display, NULL); gst_vaapi_display_replace (&display->display, NULL);
gst_vaapi_display_loader_replace (&display->loader, NULL);
gst_vaapi_display_loader_release_global ();
} }
static void static void