v4l2: Track /dev/video* to triggered required probe
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Fri, 13 Nov 2015 17:35:59 +0000 (12:35 -0500)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Wed, 25 Nov 2015 19:31:29 +0000 (14:31 -0500)
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
sys/v4l2/gstv4l2.c

index 79683a1..9acc41a 100644 (file)
@@ -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],
index 8333eab..97d617b 100644 (file)
@@ -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