summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Dufresne <nicolas.dufresne@collabora.com>2019-11-23 17:00:53 -0500
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-03-07 01:57:42 +0200
commit17cccc68a88ffaaeb06fb2383ad27b5ccb627c24 (patch)
tree1589dc8790990b55abe3b268956b658234e2eb65
parent2cc90af8c7b6ac90b62ed9794d6176562b788292 (diff)
Add GStreamer plugin and element skeleton
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> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> [Silence -Wunused-function warning for older GLib versions] Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--meson_options.txt5
-rw-r--r--src/gstreamer/gstlibcamera.c21
-rw-r--r--src/gstreamer/gstlibcamerasrc.cpp31
-rw-r--r--src/gstreamer/gstlibcamerasrc.h22
-rw-r--r--src/gstreamer/meson.build32
-rw-r--r--src/meson.build2
6 files changed, 113 insertions, 0 deletions
diff --git a/meson_options.txt b/meson_options.txt
index 79ee4de6..b17b6de6 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 00000000..7dd94ca0
--- /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 00000000..38075032
--- /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 00000000..0144cbc4
--- /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 00000000..490e030e
--- /dev/null
+++ b/src/gstreamer/meson.build
@@ -0,0 +1,32 @@
+libcamera_gst_sources = [
+ 'gstlibcamera.c',
+ 'gstlibcamerasrc.cpp',
+]
+
+libcamera_gst_c_args = [
+ '-DVERSION="@0@"'.format(libcamera_git_version),
+ '-DPACKAGE="@0@"'.format(meson.project_name()),
+]
+
+glib_dep = dependency('glib', required : get_option('gstreamer'))
+
+gst_dep = dependency('gstreamer-video-1.0', version : '>=1.14.0',
+ required : get_option('gstreamer'))
+
+if glib_dep.found() and gst_dep.found()
+ # The G_DECLARE_FINAL_TYPE macro creates static inline functions that were
+ # not marked as possibly unused prior to GLib v2.63.0. This causes clang to
+ # complain about the ones we are not using. Silence the -Wunused-function
+ # warning in that case.
+ if cc.get_id() == 'clang' and glib_dep.version().version_compare('<2.63.0')
+ libcamera_gst_c_args += [ '-Wno-unused-function' ]
+ endif
+
+ 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 5adcd61f..d818d8b8 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -10,3 +10,5 @@ subdir('qcam')
if get_option('v4l2')
subdir('v4l2')
endif
+
+subdir('gstreamer')