v4l2src: Add GstURIHandler interface. Fixes #601143
authorEdward Hervey <bilboed@bilboed.com>
Sun, 8 Nov 2009 10:49:14 +0000 (11:49 +0100)
committerEdward Hervey <bilboed@bilboed.com>
Mon, 21 Dec 2009 12:54:40 +0000 (13:54 +0100)
This allows using v4l2://[<device>]

sys/v4l2/gstv4l2src.c

index 581ef5ca3b37d6e8719d7575ef36268b65a67069..ed946269141e64ffda006a44c0ae5e17ccad3b77 100644 (file)
@@ -89,6 +89,9 @@ GST_IMPLEMENT_V4L2_XOVERLAY_METHODS (GstV4l2Src, gst_v4l2src);
 #endif
 GST_IMPLEMENT_V4L2_VIDORIENT_METHODS (GstV4l2Src, gst_v4l2src);
 
+static void gst_v4l2src_uri_handler_init (gpointer g_iface,
+    gpointer iface_data);
+
 static gboolean
 gst_v4l2src_iface_supported (GstImplementsInterface * iface, GType iface_type)
 {
@@ -128,6 +131,12 @@ gst_v4l2src_interface_init (GstImplementsInterfaceClass * klass)
 void
 gst_v4l2src_init_interfaces (GType type)
 {
+  static const GInterfaceInfo urihandler_info = {
+    gst_v4l2src_uri_handler_init,
+    NULL,
+    NULL
+  };
+
   static const GInterfaceInfo v4l2iface_info = {
     (GInterfaceInitFunc) gst_v4l2src_interface_init,
     NULL,
@@ -161,6 +170,7 @@ gst_v4l2src_init_interfaces (GType type)
     NULL,
   };
 
+  g_type_add_interface_static (type, GST_TYPE_URI_HANDLER, &urihandler_info);
   g_type_add_interface_static (type,
       GST_TYPE_IMPLEMENTS_INTERFACE, &v4l2iface_info);
   g_type_add_interface_static (type, GST_TYPE_TUNER, &v4l2_tuner_info);
@@ -950,3 +960,55 @@ gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf)
   }
   return ret;
 }
+
+
+/* GstURIHandler interface */
+static GstURIType
+gst_v4l2src_uri_get_type (void)
+{
+  return GST_URI_SRC;
+}
+
+static gchar **
+gst_v4l2src_uri_get_protocols (void)
+{
+  static gchar *protocols[] = { "v4l2", NULL };
+
+  return protocols;
+}
+
+static const gchar *
+gst_v4l2src_uri_get_uri (GstURIHandler * handler)
+{
+  GstV4l2Src *v4l2src = GST_V4L2SRC (handler);
+
+  if (v4l2src->v4l2object->videodev)
+    return g_strdup_printf ("v4l2://%s", v4l2src->v4l2object->videodev);
+  return "v4l2://";
+}
+
+static gboolean
+gst_v4l2src_uri_set_uri (GstURIHandler * handler, const gchar * uri)
+{
+  GstV4l2Src *v4l2src = GST_V4L2SRC (handler);
+  const gchar *device = DEFAULT_PROP_DEVICE;
+
+  if (strcmp (uri, "v4l2://") != 0) {
+    device = uri + 7;
+  }
+  g_object_set (v4l2src, "device", device, NULL);
+
+  return TRUE;
+}
+
+
+static void
+gst_v4l2src_uri_handler_init (gpointer g_iface, gpointer iface_data)
+{
+  GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
+
+  iface->get_type = gst_v4l2src_uri_get_type;
+  iface->get_protocols = gst_v4l2src_uri_get_protocols;
+  iface->get_uri = gst_v4l2src_uri_get_uri;
+  iface->set_uri = gst_v4l2src_uri_set_uri;
+}