summaryrefslogtreecommitdiff
path: root/src/ipa/rpi/controller/statistics.h
blob: 015d4efc645495802eb1d7a13097ef5a3cbb83a8 (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
72
73
74
75
76
77
78
/* SPDX-License-Identifier: BSD-2-Clause */
/*
 * Copyright (C) 2022, Raspberry Pi Ltd
 *
 * statistics.h - Raspberry Pi generic statistics structure
 */
#pragma once

#include <memory>
#include <stdint.h>
#include <vector>

#include "histogram.h"
#include "region_stats.h"

namespace RPiController {

struct RgbySums {
	RgbySums(uint64_t _rSum = 0, uint64_t _gSum = 0, uint64_t _bSum = 0, uint64_t _ySum = 0)
		: rSum(_rSum), gSum(_gSum), bSum(_bSum), ySum(_ySum)
	{
	}
	uint64_t rSum;
	uint64_t gSum;
	uint64_t bSum;
	uint64_t ySum;
};

using RgbyRegions = RegionStats<RgbySums>;
using FocusRegions = RegionStats<uint64_t>;

struct Statistics {
	/*
	 * All region based statistics are normalised to 16-bits, giving a
	 * maximum value of (1 << NormalisationFactorPow2) - 1.
	 */
	static constexpr unsigned int NormalisationFactorPow2 = 16;

	/*
	 * Positioning of the AGC statistics gathering in the pipeline:
	 * Pre-WB correction or post-WB correction.
	 * Assume this is post-LSC.
	 */
	enum class AgcStatsPos { PreWb, PostWb };
	const AgcStatsPos agcStatsPos;

	/*
	 * Positioning of the AWB/ALSC statistics gathering in the pipeline:
	 * Pre-LSC or post-LSC.
	 */
	enum class ColourStatsPos { PreLsc, PostLsc };
	const ColourStatsPos colourStatsPos;

	Statistics(AgcStatsPos a, ColourStatsPos c)
		: agcStatsPos(a), colourStatsPos(c)
	{
	}

	/* Histogram statistics. Not all histograms may be populated! */
	Histogram rHist;
	Histogram gHist;
	Histogram bHist;
	Histogram yHist;

	/* Row sums for flicker avoidance. */
	std::vector<RgbySums> rowSums;

	/* Region based colour sums. */
	RgbyRegions agcRegions;
	RgbyRegions awbRegions;

	/* Region based focus FoM. */
	FocusRegions focusRegions;
};

using StatisticsPtr = std::shared_ptr<Statistics>;

} /* namespace RPiController */