mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-13 07:19:45 +03:00
libcamera: software_isp: Get black level from the camera helper
The black level in software ISP is unconditionally guessed from the obtained frames. CameraSensorHelper optionally provides the black level from camera specifications now. Let's use the value if available. If the black level is not available from the given CameraSensorHelper instance, it's still determined on the fly. Signed-off-by: Milan Zamazal <mzamazal@redhat.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Tested-by: Robert Mader <robert.mader@collabora.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
41e3d61c74
commit
7bbe26bbc4
3 changed files with 19 additions and 1 deletions
|
@ -24,7 +24,8 @@ BlackLevel::BlackLevel()
|
|||
int BlackLevel::configure(IPAContext &context,
|
||||
[[maybe_unused]] const IPAConfigInfo &configInfo)
|
||||
{
|
||||
context.activeState.blc.level = 255;
|
||||
context.activeState.blc.level =
|
||||
context.configuration.black.level.value_or(255);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -34,6 +35,9 @@ void BlackLevel::process(IPAContext &context,
|
|||
const SwIspStats *stats,
|
||||
[[maybe_unused]] ControlList &metadata)
|
||||
{
|
||||
if (context.configuration.black.level.has_value())
|
||||
return;
|
||||
|
||||
if (frameContext.sensor.exposure == exposure_ &&
|
||||
frameContext.sensor.gain == gain_) {
|
||||
return;
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <optional>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <libipa/fc_queue.h>
|
||||
|
@ -22,6 +23,9 @@ struct IPASessionConfiguration {
|
|||
int32_t exposureMin, exposureMax;
|
||||
double againMin, againMax, againMinStep;
|
||||
} agc;
|
||||
struct {
|
||||
std::optional<uint8_t> level;
|
||||
} black;
|
||||
};
|
||||
|
||||
struct IPAActiveState {
|
||||
|
|
|
@ -206,6 +206,16 @@ int IPASoftSimple::configure(const IPAConfigInfo &configInfo)
|
|||
(context_.configuration.agc.againMax -
|
||||
context_.configuration.agc.againMin) /
|
||||
100.0;
|
||||
if (camHelper_->blackLevel().has_value()) {
|
||||
/*
|
||||
* The black level from camHelper_ is a 16 bit value, software ISP
|
||||
* works with 8 bit pixel values, both regardless of the actual
|
||||
* sensor pixel width. Hence we obtain the pixel-based black value
|
||||
* by dividing the value from the helper by 256.
|
||||
*/
|
||||
context_.configuration.black.level =
|
||||
camHelper_->blackLevel().value() / 256;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* The camera sensor gain (g) is usually not equal to the value written
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue