[libcamera-devel] [PATCH v1 07/23] gst: libcamerasrc: Add camera-name property

Nicolas Dufresne nicolas at ndufresne.ca
Wed Jan 29 04:31:54 CET 2020


From: Nicolas Dufresne <nicolas.dufresne at collabora.com>

This property will be used to select by name the camera to use.

Signed-off-by: Nicolas Dufresne <nicolas.dufresne at collabora.com>
---
 src/gstreamer/gstlibcamerasrc.cpp | 68 +++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)

diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
index 50bba39..74e1d7e 100644
--- a/src/gstreamer/gstlibcamerasrc.cpp
+++ b/src/gstreamer/gstlibcamerasrc.cpp
@@ -8,10 +8,17 @@
 
 #include "gstlibcamerasrc.h"
 #include "gstlibcamerapad.h"
+#include "gstlibcamera-utils.h"
 
 struct _GstLibcameraSrc {
 	GstElement parent;
 	GstPad *srcpad;
+	gchar *camera_name;
+};
+
+enum {
+	PROP_0,
+	PROP_CAMERA_NAME
 };
 
 G_DEFINE_TYPE(GstLibcameraSrc, gst_libcamera_src, GST_TYPE_ELEMENT);
@@ -28,6 +35,53 @@ GstStaticPadTemplate request_src_template = {
 	"src_%s", GST_PAD_SRC, GST_PAD_REQUEST, TEMPLATE_CAPS
 };
 
+static void
+gst_libcamera_src_set_property(GObject *object, guint prop_id,
+			       const GValue *value, GParamSpec *pspec)
+{
+	GST_OBJECT_LOCKER(object);
+	GstLibcameraSrc *self = GST_LIBCAMERA_SRC(object);
+
+	switch (prop_id) {
+	case PROP_CAMERA_NAME:
+		g_free (self->camera_name);
+		self->camera_name = g_value_dup_string(value);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+gst_libcamera_src_get_property(GObject *object, guint prop_id, GValue *value,
+			       GParamSpec *pspec)
+{
+	GST_OBJECT_LOCKER(object);
+	GstLibcameraSrc *self = GST_LIBCAMERA_SRC(object);
+
+	switch (prop_id) {
+	case PROP_CAMERA_NAME:
+		g_value_set_string(value, self->camera_name);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+		break;
+	}
+
+}
+
+static void
+gst_libcamera_src_finalize(GObject *object)
+{
+	GObjectClass *klass = G_OBJECT_CLASS(gst_libcamera_src_parent_class);
+	GstLibcameraSrc *self = GST_LIBCAMERA_SRC(object);
+
+	g_free(self->camera_name);
+
+	return klass->finalize(object);
+}
+
 static void
 gst_libcamera_src_init(GstLibcameraSrc *self)
 {
@@ -41,6 +95,12 @@ static void
 gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)
 {
 	GstElementClass *element_class = (GstElementClass *)klass;
+	GObjectClass *object_class = (GObjectClass *)klass;
+	GParamSpec *spec;
+
+	object_class->set_property = gst_libcamera_src_set_property;
+	object_class->get_property = gst_libcamera_src_get_property;
+	object_class->finalize = gst_libcamera_src_finalize;
 
 	gst_element_class_set_metadata(element_class,
 				       "LibCamera Source", "Source/Video",
@@ -52,4 +112,12 @@ gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)
 	gst_element_class_add_static_pad_template_with_gtype(element_class,
 							     &request_src_template,
 							     GST_TYPE_LIBCAMERA_PAD);
+
+	spec = g_param_spec_string("camera-name", "Camera Name",
+				   "Select by name which camera to use.", nullptr,
+				   (GParamFlags)(GST_PARAM_MUTABLE_READY
+					   | G_PARAM_CONSTRUCT
+					   | G_PARAM_READWRITE
+					   | G_PARAM_STATIC_STRINGS));
+	g_object_class_install_property(object_class, PROP_CAMERA_NAME, spec);
 }
-- 
2.24.1



More information about the libcamera-devel mailing list