mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-23 16:45:07 +03:00
Frame contexts will become the core component of IPA modules, always available to functions of the algorithms. To indicate and prepare for this, turn the frame context pointer passed to Algorithm::process() into a reference. The RkISP1 IPA module doesn't use frame contexts yet, so pass a dummy context for now. While at it, drop an unneeded [[maybe_unused]] from Agc::process() and add a missing parameter documentation for the frameContext argument to Awb::process(). Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
90 lines
1.9 KiB
C++
90 lines
1.9 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2021, Ideas On Board
|
|
*
|
|
* awb.h - IPU3 AWB control algorithm
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <vector>
|
|
|
|
#include <linux/intel-ipu3.h>
|
|
|
|
#include <libcamera/geometry.h>
|
|
|
|
#include "algorithm.h"
|
|
|
|
namespace libcamera {
|
|
|
|
namespace ipa::ipu3::algorithms {
|
|
|
|
/* Region size for the statistics generation algorithm */
|
|
static constexpr uint32_t kAwbStatsSizeX = 16;
|
|
static constexpr uint32_t kAwbStatsSizeY = 12;
|
|
|
|
struct Accumulator {
|
|
unsigned int counted;
|
|
struct {
|
|
uint64_t red;
|
|
uint64_t green;
|
|
uint64_t blue;
|
|
} sum;
|
|
};
|
|
|
|
class Awb : public Algorithm
|
|
{
|
|
public:
|
|
Awb();
|
|
~Awb();
|
|
|
|
int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
|
|
void prepare(IPAContext &context, ipu3_uapi_params *params) override;
|
|
void process(IPAContext &context, IPAFrameContext &frameContext,
|
|
const ipu3_uapi_stats_3a *stats) override;
|
|
|
|
private:
|
|
/* \todo Make these structs available to all the ISPs ? */
|
|
struct RGB {
|
|
RGB(double _R = 0, double _G = 0, double _B = 0)
|
|
: R(_R), G(_G), B(_B)
|
|
{
|
|
}
|
|
double R, G, B;
|
|
RGB &operator+=(RGB const &other)
|
|
{
|
|
R += other.R, G += other.G, B += other.B;
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
struct AwbStatus {
|
|
double temperatureK;
|
|
double redGain;
|
|
double greenGain;
|
|
double blueGain;
|
|
};
|
|
|
|
private:
|
|
void calculateWBGains(const ipu3_uapi_stats_3a *stats);
|
|
void generateZones();
|
|
void generateAwbStats(const ipu3_uapi_stats_3a *stats);
|
|
void clearAwbStats();
|
|
void awbGreyWorld();
|
|
uint32_t estimateCCT(double red, double green, double blue);
|
|
static constexpr uint16_t threshold(float value);
|
|
static constexpr uint16_t gainValue(double gain);
|
|
|
|
std::vector<RGB> zones_;
|
|
Accumulator awbStats_[kAwbStatsSizeX * kAwbStatsSizeY];
|
|
AwbStatus asyncResults_;
|
|
|
|
uint32_t stride_;
|
|
uint32_t cellsPerZoneX_;
|
|
uint32_t cellsPerZoneY_;
|
|
uint32_t cellsPerZoneThreshold_;
|
|
};
|
|
|
|
} /* namespace ipa::ipu3::algorithms */
|
|
|
|
} /* namespace libcamera*/
|