[libcamera-devel,v2,01/27] Add GStreamer plugin and element skeleton

Message ID 20200227200407.490616-2-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 implements the GStreamer plugin interface and adds libcamerasrc
element feature to it. This is just enough to allow plugin
introspection.

gst-inspect-1.0 build/src/gstreamer/libgstlibcamera.so
Plugin Details:
  Name                     libcamera
  Description              libcamera capture plugin
  Filename                 build/src/gstreamer/libgstlibcamera.so
  Version                  0.0.0+1042-6c9f16d3-dirty
  License                  LGPL
  Source module            libcamera
  Binary package           libcamera
  Origin URL               https://libcamera.org

  libcamerasrc: libcamera Source

  1 features:

GST_PLUGIN_PATH=$(pwd)/build/src/gstreamer gst-inspect-1.0 libcamerasrc
Factory Details:
  Rank                     primary (256)
  Long-name                libcamera Source
  Klass                    Source/Video
  Description              Linux Camera source using libcamera
  Author                   Nicolas Dufresne <nicolas.dufresne@collabora.com

Plugin Details:
  Name                     libcamera
  Description              libcamera capture plugin
  Filename                 /home/nicolas/Sources/libcamera/build/src/gstreamer/libgstlibcamera.so
  Version                  0.0.0+1042-6c9f16d3-dirty
  License                  LGPL
  Source module            libcamera
  Binary package           libcamera
  Origin URL               https://libcamera.org

GObject
 +----GInitiallyUnowned
       +----GstObject
             +----GstElement
                   +----GstLibcameraSrc

Pad Templates:
  none

Element has no clocking capabilities.
Element has no URI handling capabilities.

Pads:
  none

Element Properties:
  name                : The name of the object
                        flags: accès en lecture, accès en écriture, 0x2000
                        String. Default: "libcamerasrc0"
  parent              : The parent of the object
                        flags: accès en lecture, accès en écriture, 0x2000
                        Object of type "GstObject"

Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
---
 meson_options.txt                 |  5 +++++
 src/gstreamer/gstlibcamera.c      | 21 +++++++++++++++++++++
 src/gstreamer/gstlibcamerasrc.cpp | 31 +++++++++++++++++++++++++++++++
 src/gstreamer/gstlibcamerasrc.h   | 22 ++++++++++++++++++++++
 src/gstreamer/meson.build         | 22 ++++++++++++++++++++++
 src/meson.build                   |  2 ++
 6 files changed, 103 insertions(+)
 create mode 100644 src/gstreamer/gstlibcamera.c
 create mode 100644 src/gstreamer/gstlibcamerasrc.cpp
 create mode 100644 src/gstreamer/gstlibcamerasrc.h
 create mode 100644 src/gstreamer/meson.build

Comments

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

Thank you for the patch.

On Thu, Feb 27, 2020 at 03:03:41PM -0500, Nicolas Dufresne wrote:
> This implements the GStreamer plugin interface and adds libcamerasrc
> element feature to it. This is just enough to allow plugin
> introspection.
> 
> gst-inspect-1.0 build/src/gstreamer/libgstlibcamera.so
> Plugin Details:
>   Name                     libcamera
>   Description              libcamera capture plugin
>   Filename                 build/src/gstreamer/libgstlibcamera.so
>   Version                  0.0.0+1042-6c9f16d3-dirty
>   License                  LGPL
>   Source module            libcamera
>   Binary package           libcamera
>   Origin URL               https://libcamera.org
> 
>   libcamerasrc: libcamera Source
> 
>   1 features:
> 
> GST_PLUGIN_PATH=$(pwd)/build/src/gstreamer gst-inspect-1.0 libcamerasrc
> Factory Details:
>   Rank                     primary (256)
>   Long-name                libcamera Source
>   Klass                    Source/Video
>   Description              Linux Camera source using libcamera
>   Author                   Nicolas Dufresne <nicolas.dufresne@collabora.com
> 
> Plugin Details:
>   Name                     libcamera
>   Description              libcamera capture plugin
>   Filename                 /home/nicolas/Sources/libcamera/build/src/gstreamer/libgstlibcamera.so
>   Version                  0.0.0+1042-6c9f16d3-dirty
>   License                  LGPL
>   Source module            libcamera
>   Binary package           libcamera
>   Origin URL               https://libcamera.org
> 
> GObject
>  +----GInitiallyUnowned
>        +----GstObject
>              +----GstElement
>                    +----GstLibcameraSrc
> 
> Pad Templates:
>   none
> 
> Element has no clocking capabilities.
> Element has no URI handling capabilities.
> 
> Pads:
>   none
> 
> Element Properties:
>   name                : The name of the object
>                         flags: accès en lecture, accès en écriture, 0x2000

Localised content, sweet :-)

>                         String. Default: "libcamerasrc0"
>   parent              : The parent of the object
>                         flags: accès en lecture, accès en écriture, 0x2000
>                         Object of type "GstObject"
> 
> Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>

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

> ---
>  meson_options.txt                 |  5 +++++
>  src/gstreamer/gstlibcamera.c      | 21 +++++++++++++++++++++
>  src/gstreamer/gstlibcamerasrc.cpp | 31 +++++++++++++++++++++++++++++++
>  src/gstreamer/gstlibcamerasrc.h   | 22 ++++++++++++++++++++++
>  src/gstreamer/meson.build         | 22 ++++++++++++++++++++++
>  src/meson.build                   |  2 ++
>  6 files changed, 103 insertions(+)
>  create mode 100644 src/gstreamer/gstlibcamera.c
>  create mode 100644 src/gstreamer/gstlibcamerasrc.cpp
>  create mode 100644 src/gstreamer/gstlibcamerasrc.h
>  create mode 100644 src/gstreamer/meson.build
> 
> diff --git a/meson_options.txt b/meson_options.txt
> index 79ee4de..b17b6de 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -7,6 +7,11 @@ option('documentation',
>          type : 'boolean',
>          description : 'Generate the project documentation')
>  
> +option('gstreamer',
> +        type : 'feature',
> +        value : 'auto',
> +        description : 'Compile libcamera GStreamer plugin')
> +
>  option('test',
>          type : 'boolean',
>          description: 'Compile and include the tests')
> diff --git a/src/gstreamer/gstlibcamera.c b/src/gstreamer/gstlibcamera.c
> new file mode 100644
> index 0000000..7dd94ca
> --- /dev/null
> +++ b/src/gstreamer/gstlibcamera.c
> @@ -0,0 +1,21 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2019, Collabora Ltd.
> + *     Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> + *
> + * gstlibcamera.c - GStreamer plugin
> + */
> +
> +#include "gstlibcamerasrc.h"
> +
> +static gboolean
> +plugin_init(GstPlugin *plugin)
> +{
> +	return gst_element_register(plugin, "libcamerasrc", GST_RANK_PRIMARY,
> +				    GST_TYPE_LIBCAMERA_SRC);
> +	return TRUE;
> +}
> +
> +GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR,
> +		  libcamera, "libcamera capture plugin",
> +		  plugin_init, VERSION, "LGPL", PACKAGE, "https://libcamera.org");
> diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
> new file mode 100644
> index 0000000..3807503
> --- /dev/null
> +++ b/src/gstreamer/gstlibcamerasrc.cpp
> @@ -0,0 +1,31 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2019, Collabora Ltd.
> + *     Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> + *
> + * gstlibcamerasrc.cpp - GStreamer Capture Element
> + */
> +
> +#include "gstlibcamerasrc.h"
> +
> +struct _GstLibcameraSrc {
> +	GstElement parent;
> +};
> +
> +G_DEFINE_TYPE(GstLibcameraSrc, gst_libcamera_src, GST_TYPE_ELEMENT);
> +
> +static void
> +gst_libcamera_src_init(GstLibcameraSrc *self)
> +{
> +}
> +
> +static void
> +gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)
> +{
> +	GstElementClass *element_class = (GstElementClass *)klass;
> +
> +	gst_element_class_set_metadata(element_class,
> +				       "libcamera Source", "Source/Video",
> +				       "Linux Camera source using libcamera",
> +				       "Nicolas Dufresne <nicolas.dufresne@collabora.com");
> +}
> diff --git a/src/gstreamer/gstlibcamerasrc.h b/src/gstreamer/gstlibcamerasrc.h
> new file mode 100644
> index 0000000..0144cbc
> --- /dev/null
> +++ b/src/gstreamer/gstlibcamerasrc.h
> @@ -0,0 +1,22 @@
> +/* SPDX-License-Identifier: LGPL-2.1-or-later */
> +/*
> + * Copyright (C) 2019, Collabora Ltd.
> + *     Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
> + *
> + * gstlibcamerasrc.h - GStreamer Capture Element
> + */
> +
> +#ifndef __GST_LIBCAMERA_SRC_H__
> +#define __GST_LIBCAMERA_SRC_H__
> +
> +#include <gst/gst.h>
> +
> +G_BEGIN_DECLS
> +
> +#define GST_TYPE_LIBCAMERA_SRC gst_libcamera_src_get_type()
> +G_DECLARE_FINAL_TYPE(GstLibcameraSrc, gst_libcamera_src,
> +		     GST_LIBCAMERA, SRC, GstElement)
> +
> +G_END_DECLS
> +
> +#endif /* __GST_LIBCAMERA_SRC_H__ */
> diff --git a/src/gstreamer/meson.build b/src/gstreamer/meson.build
> new file mode 100644
> index 0000000..832b8a5
> --- /dev/null
> +++ b/src/gstreamer/meson.build
> @@ -0,0 +1,22 @@
> +libcamera_gst_sources = [
> +    'gstlibcamera.c',
> +    'gstlibcamerasrc.cpp',
> +]
> +
> +libcamera_gst_c_args = [
> +    '-DVERSION="@0@"'.format(libcamera_git_version),
> +    '-DPACKAGE="@0@"'.format(meson.project_name()),
> +]
> +
> +gst_dep = dependency('gstreamer-video-1.0', version : '>=1.16.1',
> +                     required : get_option('gstreamer'))
> +
> +if gst_dep.found()
> +    libcamera_gst = shared_library('gstlibcamera',
> +        libcamera_gst_sources,
> +        c_args : libcamera_gst_c_args,
> +        dependencies : [libcamera_dep, gst_dep],
> +        install: true,
> +        install_dir : '@0@/gstreamer-1.0'.format(get_option('libdir')),
> +    )
> +endif
> diff --git a/src/meson.build b/src/meson.build
> index 5adcd61..d818d8b 100644
> --- a/src/meson.build
> +++ b/src/meson.build
> @@ -10,3 +10,5 @@ subdir('qcam')
>  if get_option('v4l2')
>      subdir('v4l2')
>  endif
> +
> +subdir('gstreamer')

Patch

diff --git a/meson_options.txt b/meson_options.txt
index 79ee4de..b17b6de 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -7,6 +7,11 @@  option('documentation',
         type : 'boolean',
         description : 'Generate the project documentation')
 
+option('gstreamer',
+        type : 'feature',
+        value : 'auto',
+        description : 'Compile libcamera GStreamer plugin')
+
 option('test',
         type : 'boolean',
         description: 'Compile and include the tests')
diff --git a/src/gstreamer/gstlibcamera.c b/src/gstreamer/gstlibcamera.c
new file mode 100644
index 0000000..7dd94ca
--- /dev/null
+++ b/src/gstreamer/gstlibcamera.c
@@ -0,0 +1,21 @@ 
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Collabora Ltd.
+ *     Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
+ *
+ * gstlibcamera.c - GStreamer plugin
+ */
+
+#include "gstlibcamerasrc.h"
+
+static gboolean
+plugin_init(GstPlugin *plugin)
+{
+	return gst_element_register(plugin, "libcamerasrc", GST_RANK_PRIMARY,
+				    GST_TYPE_LIBCAMERA_SRC);
+	return TRUE;
+}
+
+GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR,
+		  libcamera, "libcamera capture plugin",
+		  plugin_init, VERSION, "LGPL", PACKAGE, "https://libcamera.org");
diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
new file mode 100644
index 0000000..3807503
--- /dev/null
+++ b/src/gstreamer/gstlibcamerasrc.cpp
@@ -0,0 +1,31 @@ 
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Collabora Ltd.
+ *     Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
+ *
+ * gstlibcamerasrc.cpp - GStreamer Capture Element
+ */
+
+#include "gstlibcamerasrc.h"
+
+struct _GstLibcameraSrc {
+	GstElement parent;
+};
+
+G_DEFINE_TYPE(GstLibcameraSrc, gst_libcamera_src, GST_TYPE_ELEMENT);
+
+static void
+gst_libcamera_src_init(GstLibcameraSrc *self)
+{
+}
+
+static void
+gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)
+{
+	GstElementClass *element_class = (GstElementClass *)klass;
+
+	gst_element_class_set_metadata(element_class,
+				       "libcamera Source", "Source/Video",
+				       "Linux Camera source using libcamera",
+				       "Nicolas Dufresne <nicolas.dufresne@collabora.com");
+}
diff --git a/src/gstreamer/gstlibcamerasrc.h b/src/gstreamer/gstlibcamerasrc.h
new file mode 100644
index 0000000..0144cbc
--- /dev/null
+++ b/src/gstreamer/gstlibcamerasrc.h
@@ -0,0 +1,22 @@ 
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Collabora Ltd.
+ *     Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
+ *
+ * gstlibcamerasrc.h - GStreamer Capture Element
+ */
+
+#ifndef __GST_LIBCAMERA_SRC_H__
+#define __GST_LIBCAMERA_SRC_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_LIBCAMERA_SRC gst_libcamera_src_get_type()
+G_DECLARE_FINAL_TYPE(GstLibcameraSrc, gst_libcamera_src,
+		     GST_LIBCAMERA, SRC, GstElement)
+
+G_END_DECLS
+
+#endif /* __GST_LIBCAMERA_SRC_H__ */
diff --git a/src/gstreamer/meson.build b/src/gstreamer/meson.build
new file mode 100644
index 0000000..832b8a5
--- /dev/null
+++ b/src/gstreamer/meson.build
@@ -0,0 +1,22 @@ 
+libcamera_gst_sources = [
+    'gstlibcamera.c',
+    'gstlibcamerasrc.cpp',
+]
+
+libcamera_gst_c_args = [
+    '-DVERSION="@0@"'.format(libcamera_git_version),
+    '-DPACKAGE="@0@"'.format(meson.project_name()),
+]
+
+gst_dep = dependency('gstreamer-video-1.0', version : '>=1.16.1',
+                     required : get_option('gstreamer'))
+
+if gst_dep.found()
+    libcamera_gst = shared_library('gstlibcamera',
+        libcamera_gst_sources,
+        c_args : libcamera_gst_c_args,
+        dependencies : [libcamera_dep, gst_dep],
+        install: true,
+        install_dir : '@0@/gstreamer-1.0'.format(get_option('libdir')),
+    )
+endif
diff --git a/src/meson.build b/src/meson.build
index 5adcd61..d818d8b 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -10,3 +10,5 @@  subdir('qcam')
 if get_option('v4l2')
     subdir('v4l2')
 endif
+
+subdir('gstreamer')