From 3cdc700e3e65feb0b78be2c5201c7d3f589cf72a Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Fri, 13 Nov 2015 12:35:59 -0500 Subject: [PATCH] v4l2: Track /dev/video* to triggered required probe If something in /dev/video* get added, removed or replaced, we need to probe the devices again in order to ensure the dynamic devices are up to date. https://bugzilla.gnome.org/show_bug.cgi?id=758085 --- configure.ac | 11 +++++++++++ sys/v4l2/gstv4l2.c | 17 +++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 79683a1..9acc41a 100644 --- a/configure.ac +++ b/configure.ac @@ -555,6 +555,17 @@ if test x$HAVE_GST_V4L2 = xyes; then fi fi +dnl Allow enabling v4l2 device probing +AC_ARG_ENABLE( + v4l2-probe, + AC_HELP_STRING( + [--enable-v4l2-probe], + [enable V4L2 plugin to probe devices @<:@default=no@:>@])) +if test "x$enable_v4l2_probe" = xyes; then + AC_DEFINE(GST_V4L2_ENABLE_PROBE, 1, + [Define if Video4Linux probe shall be run at plugin load]) +fi + dnl Check for X11 translit(dnm, m, l) AM_CONDITIONAL(USE_X, true) AG_GST_CHECK_FEATURE(X, [X libraries and plugins], diff --git a/sys/v4l2/gstv4l2.c b/sys/v4l2/gstv4l2.c index 8333eab..97d617b 100644 --- a/sys/v4l2/gstv4l2.c +++ b/sys/v4l2/gstv4l2.c @@ -54,6 +54,7 @@ GST_DEBUG_CATEGORY (v4l2_debug); #define GST_CAT_DEFAULT v4l2_debug +#ifdef GST_V4L2_ENABLE_PROBE /* This is a minimalist probe, for speed, we only enumerate formats */ static GstCaps * gst_v4l2_probe_template_caps (const gchar * device, gint video_fd, @@ -192,12 +193,21 @@ gst_v4l2_probe_and_register (GstPlugin * plugin) return ret; } +#endif static gboolean plugin_init (GstPlugin * plugin) { + const gchar *paths[] = { "/dev", "/dev/v4l2", NULL }; + const gchar *names[] = { "video", NULL }; + GST_DEBUG_CATEGORY_INIT (v4l2_debug, "v4l2", 0, "V4L2 API calls"); + /* Add some depedency, so the dynamic features get updated upon changes in + * /dev/video* */ + gst_plugin_add_dependency (plugin, + NULL, paths, names, GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX); + if (!gst_element_register (plugin, "v4l2src", GST_RANK_PRIMARY, GST_TYPE_V4L2SRC) || !gst_element_register (plugin, "v4l2sink", GST_RANK_NONE, @@ -205,9 +215,12 @@ plugin_init (GstPlugin * plugin) !gst_element_register (plugin, "v4l2radio", GST_RANK_NONE, GST_TYPE_V4L2RADIO) || !gst_device_provider_register (plugin, "v4l2deviceprovider", - GST_RANK_PRIMARY, GST_TYPE_V4L2_DEVICE_PROVIDER) || + GST_RANK_PRIMARY, GST_TYPE_V4L2_DEVICE_PROVIDER) /* etc. */ - !gst_v4l2_probe_and_register (plugin)) +#ifdef GST_V4L2_ENABLE_PROBE + || !gst_v4l2_probe_and_register (plugin) +#endif + ) return FALSE; #ifdef ENABLE_NLS -- 2.7.4