summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Dufresne <nicolas.dufresne@collabora.com>2020-02-25 13:45:48 -0500
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-03-07 01:57:45 +0200
commit2c93810ec1f155e7e517d3ebd88e131af310cdd2 (patch)
tree43f1983a8c7122968031b04bf0ceda3e4b5d5174
parent26c923a27c7f5993602ea6e8348eeff4b236b651 (diff)
gst: libcamerasrc: Add camera-name property
This property will be used to select by name the camera to use. Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/gstreamer/gstlibcamerasrc.cpp68
1 files changed, 67 insertions, 1 deletions
diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
index cba936cb..e0c1c4e5 100644
--- a/src/gstreamer/gstlibcamerasrc.cpp
+++ b/src/gstreamer/gstlibcamerasrc.cpp
@@ -9,10 +9,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);
@@ -30,6 +37,52 @@ GstStaticPadTemplate request_src_template = {
};
static void
+gst_libcamera_src_set_property(GObject *object, guint prop_id,
+ const GValue *value, GParamSpec *pspec)
+{
+ GLibLocker lock(GST_OBJECT(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)
+{
+ GLibLocker lock(GST_OBJECT(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)
{
GstPadTemplate *templ = gst_element_get_pad_template(GST_ELEMENT(self), "src");
@@ -41,7 +94,12 @@ gst_libcamera_src_init(GstLibcameraSrc *self)
static void
gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)
{
- GstElementClass *element_class = (GstElementClass *)klass;
+ GstElementClass *element_class = GST_ELEMENT_CLASS(klass);
+ GObjectClass *object_class = G_OBJECT_CLASS(klass);
+
+ 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",
@@ -53,4 +111,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);
+
+ GParamSpec *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);
}