summaryrefslogtreecommitdiff
path: root/src/ipa/ipu3/ipu3_agc.h
blob: 3deca3ae6933b353a6b760f0eae20a3d09986e86 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2021, Ideas On Board
 *
 * ipu3_agc.h - IPU3 AGC/AEC control algorithm
 */
#ifndef __LIBCAMERA_IPU3_AGC_H__
#define __LIBCAMERA_IPU3_AGC_H__

#include <array>
#include <unordered_map>

#include <linux/intel-ipu3.h>

#include <libcamera/base/utils.h>

#include <libcamera/geometry.h>

#include "libipa/algorithm.h"

namespace libcamera {

struct IPACameraSensorInfo;

namespace ipa::ipu3 {

using utils::Duration;

class IPU3Agc : public Algorithm
{
public:
	IPU3Agc();
	~IPU3Agc() = default;

	void initialise(struct ipu3_uapi_grid_config &bdsGrid, const IPACameraSensorInfo &sensorInfo);
	void process(const ipu3_uapi_stats_3a *stats, uint32_t &exposure, double &gain);
	bool converged() { return converged_; }
	bool updateControls() { return updateControls_; }
	/* \todo Use a metadata exchange between IPAs */
	double gamma() { return gamma_; }

private:
	void processBrightness(const ipu3_uapi_stats_3a *stats);
	void filterExposure();
	void lockExposureGain(uint32_t &exposure, double &gain);

	struct ipu3_uapi_grid_config aeGrid_;

	uint64_t frameCount_;
	uint64_t lastFrame_;

	bool converged_;
	bool updateControls_;

	double iqMean_;
	double gamma_;

	Duration lineDuration_;
	Duration maxExposureTime_;

	Duration prevExposure_;
	Duration prevExposureNoDg_;
	Duration currentExposure_;
	Duration currentExposureNoDg_;
};

} /* namespace ipa::ipu3 */

} /* namespace libcamera */

#endif /* __LIBCAMERA_IPU3_AGC_H__ */
span> #include "libcamera/internal/yaml_parser.h" #include "matrix.h" namespace libcamera { LOG_DECLARE_CATEGORY(Vector) namespace ipa { #ifndef __DOXYGEN__ template<typename T, unsigned int Rows, std::enable_if_t<std::is_arithmetic_v<T>> * = nullptr> #else template<typename T, unsigned int Rows> #endif /* __DOXYGEN__ */ class Vector { public: constexpr Vector() = default; constexpr Vector(const std::array<T, Rows> &data) { for (unsigned int i = 0; i < Rows; i++) data_[i] = data[i]; } const T &operator[](size_t i) const { ASSERT(i < data_.size()); return data_[i]; } T &operator[](size_t i) { ASSERT(i < data_.size()); return data_[i]; } #ifndef __DOXYGEN__ template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 1>> #endif /* __DOXYGEN__ */ constexpr T x() const { return data_[0]; } #ifndef __DOXYGEN__ template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 2>> #endif /* __DOXYGEN__ */ constexpr T y() const { return data_[1]; } #ifndef __DOXYGEN__ template<bool Dependent = false, typename = std::enable_if_t<Dependent || Rows >= 3>> #endif /* __DOXYGEN__ */ constexpr T z() const { return data_[2]; } constexpr Vector<T, Rows> operator-() const { Vector<T, Rows> ret; for (unsigned int i = 0; i < Rows; i++) ret[i] = -data_[i]; return ret; } constexpr Vector<T, Rows> operator-(const Vector<T, Rows> &other) const { Vector<T, Rows> ret; for (unsigned int i = 0; i < Rows; i++) ret[i] = data_[i] - other[i]; return ret; } constexpr Vector<T, Rows> operator+(const Vector<T, Rows> &other) const { Vector<T, Rows> ret; for (unsigned int i = 0; i < Rows; i++)