diff options
author | Víctor Manuel Jáquez Leal <victorx.jaquez@intel.com> | 2016-07-13 18:34:57 +0200 |
---|---|---|
committer | Víctor Manuel Jáquez Leal <victorx.jaquez@intel.com> | 2016-07-22 17:23:23 +0200 |
commit | 27429ce676e5759c77e8b55b30603161125c14d8 (patch) | |
tree | 5133004976b7857fcae0e8f5878d9c2403eb8d3f | |
parent | 5beccf5fa06bcab14da213d3f7187eb122fbb6e7 (diff) |
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
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapidisplay_egl.c | 272 |
1 files changed, 22 insertions, 250 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapidisplay_egl.c b/gst-libs/gst/vaapi/gstvaapidisplay_egl.c index 3d7ec20b..feab6408 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay_egl.c +++ b/gst-libs/gst/vaapi/gstvaapidisplay_egl.c @@ -29,230 +29,14 @@ #include "gstvaapiwindow_priv.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 - { "x11", - GST_VAAPI_DISPLAY_TYPE_X11, - "gst_vaapi_display_x11_new", - "gst_vaapi_display_x11_new_with_display", - }, +#include "gstvaapidisplay_x11.h" +#endif +#if USE_WAYLAND +#include "gstvaapidisplay_wayland.h" #endif - {NULL,} -}; -/* *INDENT-ON* */ - -static void -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; -} +GST_DEBUG_CATEGORY (gst_debug_vaapidisplay_egl); /* ------------------------------------------------------------------------- */ /* --- EGL backend implementation --- */ @@ -310,29 +94,28 @@ static gboolean gst_vaapi_display_egl_bind_display (GstVaapiDisplayEGL * display, const InitParams * params) { - GstVaapiDisplay *native_display; - GstVaapiDisplayLoader *loader; - const GstVaapiDisplayLoaderInfo *loader_info; + GstVaapiDisplay *native_display = NULL; EglDisplay *egl_display; - loader = gst_vaapi_display_loader_acquire_global (); if (params->display) { - loader_info = - gst_vaapi_display_loader_map_lookup_type (params->display_type); - if (!loader_info) - goto error_unsupported_display_type; - - loader = gst_vaapi_display_loader_new (); - if (!loader || !gst_vaapi_display_loader_try_load (loader, loader_info)) - goto error_init_loader; - - native_display = loader->create_display_from_native (params->display); +#if USE_X11 + if (params->display_type == GST_VAAPI_DISPLAY_TYPE_X11) + native_display = gst_vaapi_display_x11_new_with_display (params->display); +#endif +#if USE_WAYLAND + if (params->display_type == GST_VAAPI_DISPLAY_TYPE_WAYLAND) + native_display = + gst_vaapi_display_wayland_new_with_display (params->display); +#endif } else { - gst_vaapi_display_loader_ref (loader); - native_display = gst_vaapi_display_loader_try_load_any (loader); +#if USE_X11 + 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) return FALSE; @@ -347,23 +130,12 @@ gst_vaapi_display_egl_bind_display (GstVaapiDisplayEGL * display, egl_object_unref (egl_display); display->gles_version = params->gles_version; 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 gst_vaapi_display_egl_close_display (GstVaapiDisplayEGL * display) { gst_vaapi_display_replace (&display->display, NULL); - gst_vaapi_display_loader_replace (&display->loader, NULL); - gst_vaapi_display_loader_release_global (); } static void |