va: Make libgudev dependency optional.

libgudev is a problematic dependency, particularly in sandboxed
environments, such as flatpak.

This patch implements a way to get the available VA devices using
brute-forced traverse of /dev/drm/renderD* directory. Thus usable in
those sandboxed environments.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1027>
This commit is contained in:
Víctor Manuel Jáquez Leal 2021-10-03 16:53:54 +02:00 committed by GStreamer Marge Bot
parent e699aaeb16
commit 2e6cd5c2e4
2 changed files with 30 additions and 1 deletions

View file

@ -24,7 +24,9 @@
#include "gstvadevice.h" #include "gstvadevice.h"
#if HAVE_GUDEV
#include <gudev/gudev.h> #include <gudev/gudev.h>
#endif
#define GST_CAT_DEFAULT gstva_debug #define GST_CAT_DEFAULT gstva_debug
GST_DEBUG_CATEGORY_EXTERN (gstva_debug); GST_DEBUG_CATEGORY_EXTERN (gstva_debug);
@ -62,6 +64,7 @@ compare_device_path (gconstpointer a, gconstpointer b, gpointer user_data)
return strcmp (pa->render_device_path, pb->render_device_path); return strcmp (pa->render_device_path, pb->render_device_path);
} }
#if HAVE_GUDEV
GList * GList *
gst_va_device_find_devices (void) gst_va_device_find_devices (void)
{ {
@ -96,6 +99,31 @@ gst_va_device_find_devices (void)
return devices.head; return devices.head;
} }
#else
GList *
gst_va_device_find_devices (void)
{
GstVaDisplay *dpy;
GQueue devices = G_QUEUE_INIT;
gchar path[64];
guint i;
for (i = 0; i < 8; i++) {
g_snprintf (path, sizeof (path), "/dev/dri/renderD%d", 128 + i);
if (!g_file_test (path, G_FILE_TEST_EXISTS))
continue;
if (!(dpy = gst_va_display_drm_new_from_path (path)))
continue;
GST_INFO ("Found VA-API device: %s", path);
g_queue_push_head (&devices, gst_va_device_new (dpy, path));
}
g_queue_sort (&devices, compare_device_path, NULL);
return devices.head;
}
#endif
void void
gst_va_device_list_free (GList * devices) gst_va_device_list_free (GList * devices)

View file

@ -26,7 +26,7 @@ if va_option.disabled() or host_system != 'linux'
subdir_done() subdir_done()
endif endif
libgudev_dep = dependency('gudev-1.0', required: va_option) libgudev_dep = dependency('gudev-1.0', required: false)
if not gstva_dep.found() or not libgudev_dep.found() if not gstva_dep.found() or not libgudev_dep.found()
if va_option.enabled() if va_option.enabled()
@ -39,6 +39,7 @@ if libva_dep.version().version_compare('>= 1.8')
va_sources += 'gstvaav1dec.c' va_sources += 'gstvaav1dec.c'
endif endif
cdata.set10('HAVE_GUDEV', libgudev_dep.found())
driverdir = libva_dep.get_variable(pkgconfig: 'driverdir', internal: 'driverdir', default_value: '') driverdir = libva_dep.get_variable(pkgconfig: 'driverdir', internal: 'driverdir', default_value: '')
if driverdir == '' if driverdir == ''