/* 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 */
