[libcamera-devel,v2,07/27] gst: libcamerasrc: Add camera-name property

Message ID 20200227200407.490616-8-nicolas.dufresne@collabora.com
State Accepted
Headers show
Series
  • GStreamer Element for libcamera
Related show

Commit Message

Nicolas Dufresne Feb. 27, 2020, 8:03 p.m. UTC
This property will be used to select by name the camera to use.

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

Comments

Laurent Pinchart Feb. 29, 2020, 1:38 p.m. UTC | #1
Hi Nicolas,

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

On Thu, Feb 27, 2020 at 03:03:47PM -0500, Nicolas Dufresne wrote:
> This property will be used to select by name the camera to use.
> 
> Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> ---
>  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 fb403cf..55ed174 100644
> --- a/src/gstreamer/gstlibcamerasrc.cpp
> +++ b/src/gstreamer/gstlibcamerasrc.cpp
> @@ -6,12 +6,19 @@
>   * gstlibcamerasrc.cpp - GStreamer Capture Element
>   */
>  
> +#include "gstlibcamera-utils.h"
>  #include "gstlibcamerapad.h"
>  #include "gstlibcamerasrc.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,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)
>  {
> @@ -40,7 +93,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",
> @@ -52,4 +110,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,

Just one more space of indentation here and below and it's perfect :-)

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> +					      (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);
>  }
Nicolas Dufresne March 6, 2020, 4:48 p.m. UTC | #2
Le samedi 29 février 2020 à 15:38 +0200, Laurent Pinchart a écrit :
> Hi Nicolas,
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Careful, I nearly missed your comment below ;-P

> 
> On Thu, Feb 27, 2020 at 03:03:47PM -0500, Nicolas Dufresne wrote:
> > This property will be used to select by name the camera to use.
> > 
> > Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> > ---
> >  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 fb403cf..55ed174 100644
> > --- a/src/gstreamer/gstlibcamerasrc.cpp
> > +++ b/src/gstreamer/gstlibcamerasrc.cpp
> > @@ -6,12 +6,19 @@
> >   * gstlibcamerasrc.cpp - GStreamer Capture Element
> >   */
> >  
> > +#include "gstlibcamera-utils.h"
> >  #include "gstlibcamerapad.h"
> >  #include "gstlibcamerasrc.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,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)
> >  {
> > @@ -40,7 +93,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",
> > @@ -52,4 +110,12 @@ gst_libcamera_src_class_init(GstLibcameraSrcClass
> > *klass)
> >  	gst_element_class_add_static_pad_template_with_gtype(element_class,
> >  							     &request_src_templa
> > te,
> >  							     GST_TYPE_LIBCAMERA_
> > PAD);
> > +
> > +	GParamSpec *spec = g_param_spec_string("camera-name", "Camera Name",
> > +					      "Select by name which camera to
> > use.", nullptr,
> 
> Just one more space of indentation here and below and it's perfect :-)

Will fix, thanks for the catch.

> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
> > +					      (GParamFlags)(GST_PARAM_MUTABLE_RE
> > ADY
> > +							    | G_PARAM_CONSTRUCT
> > +							    | G_PARAM_READWRITE
> > +							    |
> > G_PARAM_STATIC_STRINGS));
> > +	g_object_class_install_property(object_class, PROP_CAMERA_NAME, spec);
> >  }

Patch

diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
index fb403cf..55ed174 100644
--- a/src/gstreamer/gstlibcamerasrc.cpp
+++ b/src/gstreamer/gstlibcamerasrc.cpp
@@ -6,12 +6,19 @@ 
  * gstlibcamerasrc.cpp - GStreamer Capture Element
  */
 
+#include "gstlibcamera-utils.h"
 #include "gstlibcamerapad.h"
 #include "gstlibcamerasrc.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,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)
 {
@@ -40,7 +93,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",
@@ -52,4 +110,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);
 }