pipeline: ipa: raspberrypi: Refactor and move the Raspberry Pi code

Split the Raspberry Pi pipeline handler and IPA source code into common
and VC4/BCM2835 specific file structures.

For the pipeline handler, the common code files now live in
src/libcamera/pipeline/rpi/common/
and the VC4-specific files in src/libcamera/pipeline/rpi/vc4/.

For the IPA, the common code files now live in
src/ipa/rpi/{cam_helper,controller}/
and the vc4 specific files in src/ipa/rpi/vc4/. With this change, the
camera tuning files are now installed under share/libcamera/ipa/rpi/vc4/.

To build the pipeline and IPA, the meson configuration options have now
changed from "raspberrypi" to "rpi/vc4":

meson setup build -Dipas=rpi/vc4 -Dpipelines=rpi/vc4

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Naushir Patuck
2023-05-03 13:20:27 +01:00
committed by Laurent Pinchart
parent 46aefed208
commit 726e9274ea
121 changed files with 172 additions and 109 deletions

View File

@@ -0,0 +1,64 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2019, Raspberry Pi Ltd
*
* histogram.cpp - histogram calculations
*/
#include <math.h>
#include <stdio.h>
#include "histogram.h"
using namespace RPiController;
uint64_t Histogram::cumulativeFreq(double bin) const
{
if (bin <= 0)
return 0;
else if (bin >= bins())
return total();
int b = (int)bin;
return cumulative_[b] +
(bin - b) * (cumulative_[b + 1] - cumulative_[b]);
}
double Histogram::quantile(double q, int first, int last) const
{
if (first == -1)
first = 0;
if (last == -1)
last = cumulative_.size() - 2;
assert(first <= last);
uint64_t items = q * total();
while (first < last) /* binary search to find the right bin */
{
int middle = (first + last) / 2;
if (cumulative_[middle + 1] > items)
last = middle; /* between first and middle */
else
first = middle + 1; /* after middle */
}
assert(items >= cumulative_[first] && items <= cumulative_[last + 1]);
double frac = cumulative_[first + 1] == cumulative_[first] ? 0
: (double)(items - cumulative_[first]) /
(cumulative_[first + 1] - cumulative_[first]);
return first + frac;
}
double Histogram::interQuantileMean(double qLo, double qHi) const
{
assert(qHi > qLo);
double pLo = quantile(qLo);
double pHi = quantile(qHi, (int)pLo);
double sumBinFreq = 0, cumulFreq = 0;
for (double pNext = floor(pLo) + 1.0; pNext <= ceil(pHi);
pLo = pNext, pNext += 1.0) {
int bin = floor(pLo);
double freq = (cumulative_[bin + 1] - cumulative_[bin]) *
(std::min(pNext, pHi) - pLo);
sumBinFreq += bin * freq;
cumulFreq += freq;
}
/* add 0.5 to give an average for bin mid-points */
return sumBinFreq / cumulFreq + 0.5;
}