[libcamera-devel] [RFC PATCH v1] libcamera: isp: Add ISP class

Siyuan Fan siyuan.fan at foxmail.com
Wed Sep 1 15:59:08 CEST 2021


From: Fan Siyuan <siyuan.fan at foxmail.com>

The ISP class is a abstract base class of software ISP. It includes image
format configuration, ISP algorithm parameters parser, pixel processing
image export and thread configuration.

This new class will be used as the basic class for ISPCPU and ISPGPU.

Signed-off-by: Fan Siyuan <siyuan.fan at foxmail.com>
---

ISP Parameters Tuning is a important part, so I've designed a parameters
parser in order that users can call any algorithm combination by passing
any number of tuple. Each tuple format is including algorithm name string
and algorithm param, such as tuple<string, int> for black level correct. 
Currently this function is only a demo. I'm thus sending it as an RFC.

---
 include/libcamera/internal/isp.h | 67 ++++++++++++++++++++++++++++++++
 1 file changed, 67 insertions(+)
 create mode 100644 include/libcamera/internal/isp.h

diff --git a/include/libcamera/internal/isp.h b/include/libcamera/internal/isp.h
new file mode 100644
index 00000000..caab7050
--- /dev/null
+++ b/include/libcamera/internal/isp.h
@@ -0,0 +1,67 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2021, Siyuan Fan <siyuan.fan at foxmail.com>
+ *
+ * isp.h - The software ISP abstract base class
+ */
+#ifndef __LIBCAMERA_INTERNAL_ISP_H__
+#define __LIBCAMERA_INTERNAL_ISP_H__
+
+#include <vector>
+#include <memory>
+#include <tuple>
+
+#include <libcamera/formats.h>
+#include <libcamera/framebuffer.h>
+#include <libcamera/geometry.h>
+#include <libcamera/pixel_format.h>
+
+#include "libcamera/base/object.h"
+#include "libcamera/base/signal.h"
+
+namespace libcamera{
+
+class ISP : public Object
+{
+public:
+        ISP() {}
+
+        virtual ~ISP() {}
+
+        template<class F, class...Ts, std::size_t...Is>
+        void for_each_in_tuple(const std::tuple<Ts...> & tuple, F func, std::index_sequence<Is...>) {
+   
+                return (void(func(std::get<Is>(tuple))), ...);
+        }
+
+        template<class F, class...Ts>
+        void for_each_in_tuple(const std::tuple<Ts...> & tuple, F func) {
+                for_each_in_tuple(tuple, func, std::make_index_sequence<sizeof...(Ts)>());
+        }
+
+        template<typename T, typename... Args>
+        void parse(const T &head, const Args &... rest)
+        {
+                for_each_in_tuple(head, [&](const auto &x) {
+                        // parse parameters for diff algorithm
+                });
+        }
+
+        virtual int configure(PixelFormat inputFormat, PixelFormat outputFormat, Size inputSize, Size outputSize) = 0;
+
+        virtual void processing(FrameBuffer *srcBuffer, FrameBuffer *dstBuffer,
+                                int width, int height) = 0;
+
+        virtual int exportBuffers(std::vector<std::unique_ptr<FrameBuffer>> *buffers,
+                                  unsigned int count, int width, int height) = 0;
+
+        virtual void start() = 0;
+
+        virtual void stop() = 0;
+
+        Signal<FrameBuffer *, FrameBuffer *> ispCompleted;
+};
+
+} /* namespace libcamera */
+
+#endif /* __LIBCAMERA_INTERNAL_ISP_H__ */
-- 
2.20.1



More information about the libcamera-devel mailing list