libcamera: software_isp: Move black level to an algorithm module
The black level determination, already present as a separate class, can be moved to the prepared Algorithm processing structure. It is the first of the current software ISP algorithms that is called in the stats processing sequence, which means it is also the first one that should be moved to the new structure. Stats processing starts with calling Algorithm-based processing so the call order of the algorithms is retained. Movement of this algorithm is relatively straightforward because all it does is processing stats. The comment about getting black level from the tuning files is dropped. The black level will be taken from CameraSensorHelper if available and that will be implemented in one of the followup patches. Black level is now recomputed on each stats processing. In a future patch, after DelayedControls are used, this will be changed to recompute the black level only after exposure/gain changes. The black level depends on the sensor used, the computed value can be reused in a followup capture sessions with the same sensor. Thus it is sufficient to (re)set the initial value in BlackLevel::init. Signed-off-by: Milan Zamazal <mzamazal@redhat.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
committed by
Kieran Bingham
parent
9e7437d5c3
commit
079d5f30ef
@@ -0,0 +1,71 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
/*
|
||||
* Copyright (C) 2024, Red Hat Inc.
|
||||
*
|
||||
* Black level handling
|
||||
*/
|
||||
|
||||
#include "blc.h"
|
||||
|
||||
#include <numeric>
|
||||
|
||||
#include <libcamera/base/log.h>
|
||||
|
||||
namespace libcamera {
|
||||
|
||||
namespace ipa::soft::algorithms {
|
||||
|
||||
LOG_DEFINE_CATEGORY(IPASoftBL)
|
||||
|
||||
BlackLevel::BlackLevel()
|
||||
{
|
||||
}
|
||||
|
||||
int BlackLevel::configure(IPAContext &context,
|
||||
[[maybe_unused]] const IPAConfigInfo &configInfo)
|
||||
{
|
||||
context.activeState.blc.level = 255;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void BlackLevel::process(IPAContext &context,
|
||||
[[maybe_unused]] const uint32_t frame,
|
||||
[[maybe_unused]] IPAFrameContext &frameContext,
|
||||
const SwIspStats *stats,
|
||||
[[maybe_unused]] ControlList &metadata)
|
||||
{
|
||||
const SwIspStats::Histogram &histogram = stats->yHistogram;
|
||||
|
||||
/*
|
||||
* The constant is selected to be "good enough", not overly
|
||||
* conservative or aggressive. There is no magic about the given value.
|
||||
*/
|
||||
constexpr float ignoredPercentage = 0.02;
|
||||
const unsigned int total =
|
||||
std::accumulate(begin(histogram), end(histogram), 0);
|
||||
const unsigned int pixelThreshold = ignoredPercentage * total;
|
||||
const unsigned int histogramRatio = 256 / SwIspStats::kYHistogramSize;
|
||||
const unsigned int currentBlackIdx =
|
||||
context.activeState.blc.level / histogramRatio;
|
||||
|
||||
for (unsigned int i = 0, seen = 0;
|
||||
i < currentBlackIdx && i < SwIspStats::kYHistogramSize;
|
||||
i++) {
|
||||
seen += histogram[i];
|
||||
if (seen >= pixelThreshold) {
|
||||
context.activeState.blc.level = i * histogramRatio;
|
||||
LOG(IPASoftBL, Debug)
|
||||
<< "Auto-set black level: "
|
||||
<< i << "/" << SwIspStats::kYHistogramSize
|
||||
<< " (" << 100 * (seen - histogram[i]) / total << "% below, "
|
||||
<< 100 * seen / total << "% at or below)";
|
||||
break;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
REGISTER_IPA_ALGORITHM(BlackLevel, "BlackLevel")
|
||||
|
||||
} /* namespace ipa::soft::algorithms */
|
||||
|
||||
} /* namespace libcamera */
|
||||
@@ -0,0 +1,31 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
/*
|
||||
* Copyright (C) 2024, Red Hat Inc.
|
||||
*
|
||||
* Black level handling
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "algorithm.h"
|
||||
|
||||
namespace libcamera {
|
||||
|
||||
namespace ipa::soft::algorithms {
|
||||
|
||||
class BlackLevel : public Algorithm
|
||||
{
|
||||
public:
|
||||
BlackLevel();
|
||||
~BlackLevel() = default;
|
||||
|
||||
int configure(IPAContext &context, const IPAConfigInfo &configInfo) override;
|
||||
void process(IPAContext &context, const uint32_t frame,
|
||||
IPAFrameContext &frameContext,
|
||||
const SwIspStats *stats,
|
||||
ControlList &metadata) override;
|
||||
};
|
||||
|
||||
} /* namespace ipa::soft::algorithms */
|
||||
|
||||
} /* namespace libcamera */
|
||||
@@ -1,4 +1,5 @@
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
soft_simple_ipa_algorithms = files([
|
||||
'blc.cpp',
|
||||
])
|
||||
|
||||
Reference in New Issue
Block a user