summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gst-libs/gst/vaapi/gstvaapidisplay_egl.c272
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