summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-05-19 01:54:53 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-08-05 16:23:10 +0300
commitf929a2890ccc3d2cf9be0a73fadcc4c9c40ece79 (patch)
tree08e55c6d0b52e21d0fa40dfadd6cceaad3d40b97
parentcb45af8a9eba68a0da2fa9435a4ce82bbdf80f50 (diff)
cam: Add FrameSink base class
The FrameSink class serves as a base to implement components that consume frames. This allows handling frame sinks in a generic way, independent of their nature. The BufferWrite class will be ported to FrameSink in a second step. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
-rw-r--r--src/cam/frame_sink.cpp67
-rw-r--r--src/cam/frame_sink.h34
-rw-r--r--src/cam/meson.build1
3 files changed, 102 insertions, 0 deletions
diff --git a/src/cam/frame_sink.cpp b/src/cam/frame_sink.cpp
new file mode 100644
index 00000000..af21d575
--- /dev/null
+++ b/src/cam/frame_sink.cpp
@@ -0,0 +1,67 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2021, Ideas on Board Oy
+ *
+ * frame_sink.cpp - Base Frame Sink Class
+ */
+
+#include "frame_sink.h"
+
+/**
+ * \class FrameSink
+ * \brief Abstract class to model a consumer of frames
+ *
+ * The FrameSink class models the consumer that processes frames after a request
+ * completes. It receives requests through processRequest(), and processes them
+ * synchronously or asynchronously. This allows frame sinks to hold onto frames
+ * for an extended period of time, for instance to display them until a new
+ * frame arrives.
+ *
+ * A frame sink processes whole requests, and is solely responsible for deciding
+ * how to handle different frame buffers in case multiple streams are captured.
+ */
+
+FrameSink::~FrameSink()
+{
+}
+
+int FrameSink::configure([[maybe_unused]] const libcamera::CameraConfiguration &config)
+{
+ return 0;
+}
+
+void FrameSink::mapBuffer([[maybe_unused]] libcamera::FrameBuffer *buffer)
+{
+}
+
+int FrameSink::start()
+{
+ return 0;
+}
+
+int FrameSink::stop()
+{
+ return 0;
+}
+
+/**
+ * \fn FrameSink::processRequest()
+ * \param[in] request The request
+ *
+ * This function is called to instruct the sink to process a request. The sink
+ * may process the request synchronously or queue it for asynchronous
+ * processing.
+ *
+ * When the request is processed synchronously, this function shall return true.
+ * The \a request shall not be accessed by the FrameSink after the function
+ * returns.
+ *
+ * When the request is processed asynchronously, the FrameSink temporarily takes
+ * ownership of the \a request. The function shall return false, and the
+ * FrameSink shall emit the requestProcessed signal when the request processing
+ * completes. If the stop() function is called before the request processing
+ * completes, it shall release the request synchronously.
+ *
+ * \return True if the request has been processed synchronously, false if
+ * processing has been queued
+ */
diff --git a/src/cam/frame_sink.h b/src/cam/frame_sink.h
new file mode 100644
index 00000000..76e1fc30
--- /dev/null
+++ b/src/cam/frame_sink.h
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2021, Ideas on Board Oy
+ *
+ * frame_sink.h - Base Frame Sink Class
+ */
+#ifndef __CAM_FRAME_SINK_H__
+#define __CAM_FRAME_SINK_H__
+
+#include <libcamera/base/signal.h>
+
+namespace libcamera {
+class CameraConfiguration;
+class FrameBuffer;
+class Request;
+} /* namespace libcamera */
+
+class FrameSink
+{
+public:
+ virtual ~FrameSink();
+
+ virtual int configure(const libcamera::CameraConfiguration &config);
+
+ virtual void mapBuffer(libcamera::FrameBuffer *buffer);
+
+ virtual int start();
+ virtual int stop();
+
+ virtual bool processRequest(libcamera::Request *request) = 0;
+ libcamera::Signal<libcamera::Request *> requestProcessed;
+};
+
+#endif /* __CAM_FRAME_SINK_H__ */
diff --git a/src/cam/meson.build b/src/cam/meson.build
index 1e90ee52..649cc990 100644
--- a/src/cam/meson.build
+++ b/src/cam/meson.build
@@ -13,6 +13,7 @@ cam_sources = files([
'buffer_writer.cpp',
'camera_session.cpp',
'event_loop.cpp',
+ 'frame_sink.cpp',
'main.cpp',
'options.cpp',
'stream_options.cpp',