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 <paul.elder@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Paul Elder 2024-02-29 12:22:07 +09:00
parent 626172a16b
commit 1dc01bc9e6
2 changed files with 24 additions and 6 deletions

View file

@ -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<const uint32_t> 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

View file

@ -10,10 +10,11 @@
#include <assert.h>
#include <limits.h>
#include <stdint.h>
#include <type_traits>
#include <vector>
#include <libcamera/base/span.h>
#include <libcamera/base/utils.h>
namespace libcamera {
@ -24,6 +25,17 @@ class Histogram
public:
Histogram() { cumulative_.push_back(0); }
Histogram(Span<const uint32_t> data);
template<typename Transform,
std::enable_if_t<std::is_invocable_v<Transform, uint32_t>> * = nullptr>
Histogram(Span<const uint32_t> 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;