[libcamera-devel] [PATCH v1 01/23] Add GStreamer plugin and element skeleton

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


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

Signed-off-by: Nicolas Dufresne <nicolas.dufresne at 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         | 23 +++++++++++++++++++++++
 src/meson.build                   |  2 ++
 6 files changed, 104 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..1b78ed8 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -15,3 +15,8 @@ option('v4l2',
         type : 'boolean',
         value : false,
         description : 'Compile the V4L2 compatibility layer')
+
+option('gstreamer',
+        type : 'feature',
+        value : 'auto',
+        description : 'Compile libcamera GStreamer plugin')
diff --git a/src/gstreamer/gstlibcamera.c b/src/gstreamer/gstlibcamera.c
new file mode 100644
index 0000000..953fb29
--- /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 at 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..39a06a4
--- /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 at 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 at collabora.com");
+}
diff --git a/src/gstreamer/gstlibcamerasrc.h b/src/gstreamer/gstlibcamerasrc.h
new file mode 100644
index 0000000..6d2f794
--- /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 at collabora.com>
+ *
+ * gstlibcamerasrc.h - GStreamer Capture Element
+ */
+
+#include <gst/gst.h>
+
+#ifndef __GST_LIBCAMERA_SRC_H__
+#define __GST_LIBCAMERA_SRC_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..32d4233
--- /dev/null
+++ b/src/gstreamer/meson.build
@@ -0,0 +1,23 @@
+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,
+      include_directories : [],
+      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')
-- 
2.24.1



More information about the libcamera-devel mailing list