From 1dc01bc9e6c32a8fb776f31cb957a251305de7e5 Mon Sep 17 00:00:00 2001 From: Paul Elder Date: Thu, 29 Feb 2024 12:22:07 +0900 Subject: ipa: libipa: histogram: Add transform parameter to constructor Add a parameter to the histogram constructor that takes a transformation function to apply to all the bins upon construction. This is necessary notably for the rkisp1, as the values reported from the hardware are 20 bits where the upper 16-bits are meaningful integer values and the lower 4 bits are fractional and meant to be discarded. As adding a right-shift parameter is probably too specialized, a generic function is added as a parameter instead. While at it, optimize the existing constructor to avoid push_back() into a vector with a known final size. Signed-off-by: Paul Elder Reviewed-by: Kieran Bingham Reviewed-by: Daniel Scally Reviewed-by: Laurent Pinchart --- src/ipa/libipa/histogram.cpp | 16 +++++++++++----- src/ipa/libipa/histogram.h | 14 +++++++++++++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/ipa/libipa/histogram.cpp b/src/ipa/libipa/histogram.cpp index e7b80900..633dbd05 100644 --- a/src/ipa/libipa/histogram.cpp +++ b/src/ipa/libipa/histogram.cpp @@ -39,16 +39,22 @@ namespace ipa { /** * \brief Create a cumulative histogram - * \param[in] data A pre-sorted histogram to be passed + * \param[in] data A (non-cumulative) histogram */ Histogram::Histogram(Span data) { - cumulative_.reserve(data.size()); - cumulative_.push_back(0); - for (const uint32_t &value : data) - cumulative_.push_back(cumulative_.back() + value); + cumulative_.resize(data.size() + 1); + cumulative_[0] = 0; + for (const auto &[i, value] : utils::enumerate(data)) + cumulative_[i + 1] = cumulative_[i] + value; } +/** + * \brief Create a cumulative histogram + * \param[in] data A (non-cumulative) histogram + * \param[in] transform The transformation function to apply to every bin + */ + /** * \fn Histogram::bins() * \brief Retrieve the number of bins currently used by the Histogram diff --git a/src/ipa/libipa/histogram.h b/src/ipa/libipa/histogram.h index 0379ab53..032adca0 100644 --- a/src/ipa/libipa/histogram.h +++ b/src/ipa/libipa/histogram.h @@ -10,10 +10,11 @@ #include #include #include - +#include #include #include +#include namespace libcamera { @@ -24,6 +25,17 @@ class Histogram public: Histogram() { cumulative_.push_back(0); } Histogram(Span data); + + template> * = nullptr> + Histogram(Span data, Transform transform) + { + cumulative_.resize(data.size() + 1); + cumulative_[0] = 0; + for (const auto &[i, value] : utils::enumerate(data)) + cumulative_[i + 1] = cumulative_[i] + transform(value); + } + size_t bins() const { return cumulative_.size() - 1; } uint64_t total() const { return cumulative_[cumulative_.size() - 1]; } uint64_t cumulativeFrequency(double bin) const; -- cgit v1.2.1