summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberto Fanjul <albertofanjul@gmail.com>2020-09-10 12:19:43 +0200
committerAlberto Fanjul <albertofanjul@gmail.com>2020-09-29 10:06:49 +0200
commit9d50a8e08956cb8613815d0bee2d1db02c408f64 (patch)
treeef37625317eed924b1c6d0bcaddc1c4c0e66fa41
parentc5cf9af92aeff68152f6c298458b2908b5079c7f (diff)
downloadcheese-wip/albfan/device-from-path.tar.gz
Allow device parameter to understand api.v4l2.pathwip/albfan/device-from-path
-rw-r--r--libcheese/cheese-camera-device.c43
-rw-r--r--libcheese/cheese-camera-device.h1
-rw-r--r--libcheese/cheese-camera.c5
-rw-r--r--src/vapi/cheese-common.vapi3
4 files changed, 50 insertions, 2 deletions
diff --git a/libcheese/cheese-camera-device.c b/libcheese/cheese-camera-device.c
index 6d91bd9e..f11dd828 100644
--- a/libcheese/cheese-camera-device.c
+++ b/libcheese/cheese-camera-device.c
@@ -87,6 +87,7 @@ enum
{
PROP_0,
PROP_NAME,
+ PROP_PATH,
PROP_DEVICE,
PROP_LAST
};
@@ -99,6 +100,7 @@ typedef struct
gchar *name;
GstCaps *caps;
GList *formats; /* list members are CheeseVideoFormatFull structs. */
+ gchar *path;
GError *construct_error;
} CheeseCameraDevicePrivate;
@@ -602,6 +604,9 @@ cheese_camera_device_get_property (GObject *object, guint prop_id, GValue *value
case PROP_DEVICE:
g_value_set_object (value, priv->device);
break;
+ case PROP_PATH:
+ g_value_set_string (value, priv->path);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -626,6 +631,12 @@ cheese_camera_device_set_property (GObject *object, guint prop_id, const GValue
priv->device = g_value_dup_object (value);
g_free (priv->name);
priv->name = gst_device_get_display_name (priv->device);
+ g_free (priv->path);
+ priv->path = g_value_dup_string (gst_structure_get_value (gst_device_get_properties (priv->device), "api.v4l2.path"));
+ break;
+ case PROP_PATH:
+ g_free (priv->path);
+ priv->path = g_value_dup_string (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -641,6 +652,7 @@ cheese_camera_device_finalize (GObject *object)
g_object_unref (priv->device);
g_free (priv->name);
+ g_free (priv->path);
gst_caps_unref (priv->caps);
free_format_list (device);
@@ -679,6 +691,18 @@ cheese_camera_device_class_init (CheeseCameraDeviceClass *klass)
G_PARAM_STATIC_STRINGS);
/**
+ * CheeseCameraDevice:path:
+ *
+ * Path of the video capture device.
+ */
+ properties[PROP_PATH] = g_param_spec_string ("path",
+ "Device path",
+ "Path of the video capture device",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+ /**
* CheeseCameraDevice:device:
*
* GStreamer device object of the video capture device.
@@ -782,6 +806,25 @@ cheese_camera_device_get_format_list (CheeseCameraDevice *device)
}
/**
+ * cheese_camera_device_get_path:
+ * @device: a #CheeseCameraDevice
+ *
+ * Get path for the device, as reported by udev.
+ *
+ * Returns: (transfer none): the path of the video capture device
+ */
+const gchar *
+cheese_camera_device_get_path (CheeseCameraDevice *device)
+{
+ CheeseCameraDevicePrivate *priv;
+
+ g_return_val_if_fail (CHEESE_IS_CAMERA_DEVICE (device), NULL);
+
+ priv = cheese_camera_device_get_instance_private (device);
+
+ return priv->path;
+}
+/**
* cheese_camera_device_get_name:
* @device: a #CheeseCameraDevice
*
diff --git a/libcheese/cheese-camera-device.h b/libcheese/cheese-camera-device.h
index 5e6b3ca5..860757d7 100644
--- a/libcheese/cheese-camera-device.h
+++ b/libcheese/cheese-camera-device.h
@@ -73,6 +73,7 @@ CheeseVideoFormat *cheese_camera_device_get_best_format (CheeseCameraDevice *dev
GList * cheese_camera_device_get_format_list (CheeseCameraDevice *device);
const gchar *cheese_camera_device_get_name (CheeseCameraDevice *device);
+const gchar *cheese_camera_device_get_path (CheeseCameraDevice *device);
GstElement * cheese_camera_device_get_src (CheeseCameraDevice *device);
GstCaps * cheese_camera_device_supported_format_caps (void);
diff --git a/libcheese/cheese-camera.c b/libcheese/cheese-camera.c
index c6cb44a2..5d23e725 100644
--- a/libcheese/cheese-camera.c
+++ b/libcheese/cheese-camera.c
@@ -1594,8 +1594,9 @@ cheese_camera_setup (CheeseCamera *camera, CheeseCameraDevice *device, GError **
{
device = g_ptr_array_index (priv->camera_devices, i);
- if (g_strcmp0 (cheese_camera_device_get_name (device),
- priv->initial_name) == 0)
+ if (g_strcmp0 (cheese_camera_device_get_name (device), priv->initial_name) == 0 ||
+ g_strcmp0 (cheese_camera_device_get_path (device), priv->initial_name) == 0
+ )
{
cheese_camera_set_device (camera, device);
break;
diff --git a/src/vapi/cheese-common.vapi b/src/vapi/cheese-common.vapi
index 2ee13f18..6517cdfc 100644
--- a/src/vapi/cheese-common.vapi
+++ b/src/vapi/cheese-common.vapi
@@ -78,11 +78,14 @@ namespace Cheese
public Gst.Caps get_caps_for_format (Cheese.VideoFormat format);
public GLib.List<unowned Cheese.VideoFormat> get_format_list ();
public unowned string get_name ();
+ public unowned string get_path ();
public Gst.Element get_src ();
[NoAccessorMethod]
public Gst.Device device {get; construct;}
[NoAccessorMethod]
public string name {get;}
+ [NoAccessorMethod]
+ public string path {get;}
}
[CCode (cheader_filename = "cheese-camera-device-monitor.h")]