From patchwork Fri Mar 6 20:26:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolas Dufresne X-Patchwork-Id: 3013 Return-Path: Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 84DF560424 for ; Fri, 6 Mar 2020 21:27:03 +0100 (CET) Received: from nicolas-tpx395.localdomain (unknown [IPv6:2610:98:8005::527]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: nicolas) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id C15A42970E7; Fri, 6 Mar 2020 20:27:02 +0000 (GMT) From: Nicolas Dufresne To: libcamera-devel@lists.libcamera.org Cc: Nicolas Dufresne , Laurent Pinchart Date: Fri, 6 Mar 2020 15:26:17 -0500 Message-Id: <20200306202637.525587-8-nicolas@ndufresne.ca> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200306202637.525587-1-nicolas@ndufresne.ca> References: <20200306202637.525587-1-nicolas@ndufresne.ca> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 07/27] gst: libcamerasrc: Add camera-name property X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 Mar 2020 20:27:03 -0000 From: Nicolas Dufresne This property will be used to select by name the camera to use. Signed-off-by: Nicolas Dufresne Reviewed-by: Laurent Pinchart --- src/gstreamer/gstlibcamerasrc.cpp | 68 ++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp index cba936c..e0c1c4e 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); @@ -29,6 +36,52 @@ 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) +{ + 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) { @@ -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); }