diff options
Diffstat (limited to 'users/flokli/ipu6-softisp/libcamera/0007-libcamera-software_isp-Add-SwStats-base-class.patch')
-rw-r--r-- | users/flokli/ipu6-softisp/libcamera/0007-libcamera-software_isp-Add-SwStats-base-class.patch | 382 |
1 files changed, 0 insertions, 382 deletions
diff --git a/users/flokli/ipu6-softisp/libcamera/0007-libcamera-software_isp-Add-SwStats-base-class.patch b/users/flokli/ipu6-softisp/libcamera/0007-libcamera-software_isp-Add-SwStats-base-class.patch deleted file mode 100644 index 9d6f2ac07fd8..000000000000 --- a/users/flokli/ipu6-softisp/libcamera/0007-libcamera-software_isp-Add-SwStats-base-class.patch +++ /dev/null @@ -1,382 +0,0 @@ -From ca3bb6ddf5307537aa05e43d3ec1ff7ffdc0efed Mon Sep 17 00:00:00 2001 -From: Hans de Goede <hdegoede@redhat.com> -Date: Thu, 7 Dec 2023 13:30:27 +0100 -Subject: [PATCH 07/25] libcamera: software_isp: Add SwStats base class - -Add a virtual base class for CPU based software statistics gathering -implementations. - -The idea is for the implementations to offer a configure function + -functions to gather statistics on a line by line basis. This allows -CPU based software debayering to call into interlace debayering and -statistics gathering on a line by line bases while the input data -is still hot in the cache. - -This base class also allows the user of an implementation to specify -a window over which to gather statistics instead of processing the -whole frame; and it allows the implementation to choose to only -process 1/2, 1/4th, etc. of the lines instead of processing all -lines (in the window) by setting y_skip_mask_ from configure(). -Skipping columns is left up the line-processing functions provided -by the implementation. - -Doxygen documentation by Dennis Bonke. - -Co-authored-by: Dennis Bonke <admin@dennisbonke.com> -Signed-off-by: Dennis Bonke <admin@dennisbonke.com> -Co-authored-by: Andrey Konovalov <andrey.konovalov@linaro.org> -Signed-off-by: Andrey Konovalov <andrey.konovalov@linaro.org> -Signed-off-by: Hans de Goede <hdegoede@redhat.com> -Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> # sc8280xp Lenovo x13s -Tested-by: Pavel Machek <pavel@ucw.cz> ---- - include/libcamera/internal/meson.build | 1 + - .../internal/software_isp/meson.build | 6 + - .../internal/software_isp/swisp_stats.h | 34 +++ - .../libcamera/internal/software_isp/swstats.h | 215 ++++++++++++++++++ - src/libcamera/meson.build | 1 + - src/libcamera/software_isp/meson.build | 5 + - src/libcamera/software_isp/swstats.cpp | 22 ++ - 7 files changed, 284 insertions(+) - create mode 100644 include/libcamera/internal/software_isp/meson.build - create mode 100644 include/libcamera/internal/software_isp/swisp_stats.h - create mode 100644 include/libcamera/internal/software_isp/swstats.h - create mode 100644 src/libcamera/software_isp/meson.build - create mode 100644 src/libcamera/software_isp/swstats.cpp - -diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build -index 1325941d..caa533c4 100644 ---- a/include/libcamera/internal/meson.build -+++ b/include/libcamera/internal/meson.build -@@ -51,3 +51,4 @@ libcamera_internal_headers = files([ - ]) - - subdir('converter') -+subdir('software_isp') -diff --git a/include/libcamera/internal/software_isp/meson.build b/include/libcamera/internal/software_isp/meson.build -new file mode 100644 -index 00000000..1c43acc4 ---- /dev/null -+++ b/include/libcamera/internal/software_isp/meson.build -@@ -0,0 +1,6 @@ -+# SPDX-License-Identifier: CC0-1.0 -+ -+libcamera_internal_headers += files([ -+ 'swisp_stats.h', -+ 'swstats.h', -+]) -diff --git a/include/libcamera/internal/software_isp/swisp_stats.h b/include/libcamera/internal/software_isp/swisp_stats.h -new file mode 100644 -index 00000000..07ba7d6a ---- /dev/null -+++ b/include/libcamera/internal/software_isp/swisp_stats.h -@@ -0,0 +1,34 @@ -+/* SPDX-License-Identifier: LGPL-2.1-or-later */ -+/* -+ * Copyright (C) 2023, Linaro Ltd -+ * -+ * swisp_stats.h - Statistics data format used by the software ISP and software IPA -+ */ -+ -+#pragma once -+ -+namespace libcamera { -+ -+/** -+ * \brief Struct that holds the statistics for the Software ISP. -+ */ -+struct SwIspStats { -+ /** -+ * \brief Holds the sum of all sampled red pixels. -+ */ -+ unsigned long sumR_; -+ /** -+ * \brief Holds the sum of all sampled green pixels. -+ */ -+ unsigned long sumG_; -+ /** -+ * \brief Holds the sum of all sampled blue pixels. -+ */ -+ unsigned long sumB_; -+ /** -+ * \brief A histogram of luminance values. -+ */ -+ unsigned int y_histogram[16]; -+}; -+ -+} /* namespace libcamera */ -diff --git a/include/libcamera/internal/software_isp/swstats.h b/include/libcamera/internal/software_isp/swstats.h -new file mode 100644 -index 00000000..dcac7064 ---- /dev/null -+++ b/include/libcamera/internal/software_isp/swstats.h -@@ -0,0 +1,215 @@ -+/* SPDX-License-Identifier: LGPL-2.1-or-later */ -+/* -+ * Copyright (C) 2023, Linaro Ltd -+ * Copyright (C) 2023, Red Hat Inc. -+ * -+ * Authors: -+ * Hans de Goede <hdegoede@redhat.com> -+ * -+ * swstats.h - software statistics base class -+ */ -+ -+#pragma once -+ -+#include <stdint.h> -+ -+#include <libcamera/base/log.h> -+#include <libcamera/base/signal.h> -+ -+#include <libcamera/geometry.h> -+ -+namespace libcamera { -+ -+class PixelFormat; -+struct SharedFD; -+struct StreamConfiguration; -+ -+LOG_DECLARE_CATEGORY(SwStats) -+ -+/** -+ * \class SwStats -+ * \brief Base class for the software ISP statistics. -+ * -+ * Base class for the software ISP statistics. -+ */ -+class SwStats -+{ -+public: -+ virtual ~SwStats() = 0; -+ -+ /** -+ * \brief Gets wether the statistics object is valid. -+ * -+ * \return true if it's valid, false otherwise. -+ */ -+ virtual bool isValid() const = 0; -+ -+ /** -+ * \brief Configure the statistics object for the passed in input format. -+ * \param[in] inputCfg The input format -+ * -+ * \return 0 on success, a negative errno value on failure. -+ */ -+ virtual int configure(const StreamConfiguration &inputCfg) = 0; -+ -+ /** -+ * \brief Get the file descriptor for the statistics. -+ * -+ * \return the file descriptor -+ */ -+ virtual const SharedFD &getStatsFD() = 0; -+ -+protected: -+ /** -+ * \brief Called when there is data to get statistics from. -+ * \param[in] src The input data -+ */ -+ typedef void (SwStats::*statsProcessFn)(const uint8_t *src[]); -+ /** -+ * \brief Called when the statistics gathering is done or when a new frame starts. -+ */ -+ typedef void (SwStats::*statsVoidFn)(); -+ -+ /* Variables set by configure(), used every line */ -+ /** -+ * \brief The function called when a line is ready for statistics processing. -+ * -+ * Used for line 0 and 1, repeating if there isn't a 3rd and a 4th line in the bayer order. -+ */ -+ statsProcessFn stats0_; -+ /** -+ * \brief The function called when a line is ready for statistics processing. -+ * -+ * Used for line 3 and 4, only needed if the bayer order has 4 different lines. -+ */ -+ statsProcessFn stats2_; -+ -+ /** -+ * \brief The memory used per pixel in bits. -+ */ -+ unsigned int bpp_; -+ /** -+ * \brief Skip lines where this bitmask is set in y. -+ */ -+ unsigned int y_skip_mask_; -+ -+ /** -+ * \brief Statistics window, set by setWindow(), used ever line. -+ */ -+ Rectangle window_; -+ -+ /** -+ * \brief The function called at the start of a frame. -+ */ -+ statsVoidFn startFrame_; -+ /** -+ * \brief The function called at the end of a frame. -+ */ -+ statsVoidFn finishFrame_; -+ /** -+ * \brief The size of the bayer pattern. -+ */ -+ Size patternSize_; -+ /** -+ * \brief The offset of x, applied to window_.x for bayer variants. -+ * -+ * This can either be 0 or 1. -+ */ -+ unsigned int x_shift_; -+ -+public: -+ /** -+ * \brief Get the pattern size. -+ * -+ * For some input-formats, e.g. Bayer data, processing is done multiple lines -+ * and/or columns at a time. Get width and height at which the (bayer) pattern -+ * repeats. Window values are rounded down to a multiple of this and the height -+ * also indicates if processLine2() should be called or not. -+ * This may only be called after a successful configure() call. -+ * -+ * \return the pattern size. -+ */ -+ const Size &patternSize() { return patternSize_; } -+ -+ /** -+ * \brief Specify window coordinates over which to gather statistics. -+ * \param[in] window The window object. -+ */ -+ void setWindow(Rectangle window) -+ { -+ window_ = window; -+ -+ window_.x &= ~(patternSize_.width - 1); -+ window_.x += x_shift_; -+ window_.y &= ~(patternSize_.height - 1); -+ -+ /* width_ - x_shift_ to make sure the window fits */ -+ window_.width -= x_shift_; -+ window_.width &= ~(patternSize_.width - 1); -+ window_.height &= ~(patternSize_.height - 1); -+ } -+ -+ /** -+ * \brief Reset state to start statistics gathering for a new frame. -+ * -+ * This may only be called after a successful setWindow() call. -+ */ -+ void startFrame() -+ { -+ (this->*startFrame_)(); -+ } -+ -+ /** -+ * \brief Process line 0. -+ * \param[in] y The y coordinate. -+ * \param[in] src The input data. -+ * -+ * This function processes line 0 for input formats with patternSize height == 1. -+ * It'll process line 0 and 1 for input formats with patternSize height >= 2. -+ * This function may only be called after a successful setWindow() call. -+ */ -+ void processLine0(unsigned int y, const uint8_t *src[]) -+ { -+ if ((y & y_skip_mask_) || y < (unsigned int)window_.y || -+ y >= (window_.y + window_.height)) -+ return; -+ -+ (this->*stats0_)(src); -+ } -+ -+ /** -+ * \brief Process line 2 and 3. -+ * \param[in] y The y coordinate. -+ * \param[in] src The input data. -+ * -+ * This function processes line 2 and 3 for input formats with patternSize height == 4. -+ * This function may only be called after a successful setWindow() call. -+ */ -+ void processLine2(unsigned int y, const uint8_t *src[]) -+ { -+ if ((y & y_skip_mask_) || y < (unsigned int)window_.y || -+ y >= (window_.y + window_.height)) -+ return; -+ -+ (this->*stats2_)(src); -+ } -+ -+ /** -+ * \brief Finish statistics calculation for the current frame. -+ * -+ * This may only be called after a successful setWindow() call. -+ */ -+ void finishFrame() -+ { -+ (this->*finishFrame_)(); -+ } -+ -+ /** -+ * \brief Signals that the statistics are ready. -+ * -+ * The int parameter isn't actually used. -+ */ -+ Signal<int> statsReady; -+}; -+ -+} /* namespace libcamera */ -diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build -index 86494663..3d63e8a2 100644 ---- a/src/libcamera/meson.build -+++ b/src/libcamera/meson.build -@@ -71,6 +71,7 @@ subdir('converter') - subdir('ipa') - subdir('pipeline') - subdir('proxy') -+subdir('software_isp') - - null_dep = dependency('', required : false) - -diff --git a/src/libcamera/software_isp/meson.build b/src/libcamera/software_isp/meson.build -new file mode 100644 -index 00000000..9359075d ---- /dev/null -+++ b/src/libcamera/software_isp/meson.build -@@ -0,0 +1,5 @@ -+# SPDX-License-Identifier: CC0-1.0 -+ -+libcamera_sources += files([ -+ 'swstats.cpp', -+]) -diff --git a/src/libcamera/software_isp/swstats.cpp b/src/libcamera/software_isp/swstats.cpp -new file mode 100644 -index 00000000..e65a7ada ---- /dev/null -+++ b/src/libcamera/software_isp/swstats.cpp -@@ -0,0 +1,22 @@ -+/* SPDX-License-Identifier: LGPL-2.1-or-later */ -+/* -+ * Copyright (C) 2023, Linaro Ltd -+ * Copyright (C) 2023, Red Hat Inc. -+ * -+ * Authors: -+ * Hans de Goede <hdegoede@redhat.com> -+ * -+ * swstats.cpp - software statistics base class -+ */ -+ -+#include "libcamera/internal/software_isp/swstats.h" -+ -+namespace libcamera { -+ -+LOG_DEFINE_CATEGORY(SwStats) -+ -+SwStats::~SwStats() -+{ -+} -+ -+} /* namespace libcamera */ --- -2.43.0 - |