[PATCH 2/5] ipa: rkisp1: agc: Add digital gain
Paul Elder
paul.elder at ideasonboard.com
Fri Apr 5 16:47:26 CEST 2024
Add support to the rkisp1 AGC to set digital gain.
Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
---
src/ipa/rkisp1/algorithms/agc.cpp | 5 +++++
src/ipa/rkisp1/ipa_context.h | 3 +++
src/ipa/rkisp1/rkisp1.cpp | 2 ++
3 files changed, 10 insertions(+)
diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp
index fd47ba4e..7220f00a 100644
--- a/src/ipa/rkisp1/algorithms/agc.cpp
+++ b/src/ipa/rkisp1/algorithms/agc.cpp
@@ -10,6 +10,7 @@
#include <algorithm>
#include <chrono>
#include <cmath>
+#include <tuple>
#include <libcamera/base/log.h>
#include <libcamera/base/utils.h>
@@ -152,8 +153,10 @@ int Agc::configure(IPAContext &context, const IPACameraSensorInfo &configInfo)
context.activeState.agc.automatic.gain = context.configuration.sensor.minAnalogueGain;
context.activeState.agc.automatic.exposure =
10ms / context.configuration.sensor.lineDuration;
+ context.activeState.agc.automatic.dgain = 1;
context.activeState.agc.manual.gain = context.activeState.agc.automatic.gain;
context.activeState.agc.manual.exposure = context.activeState.agc.automatic.exposure;
+ context.activeState.agc.manual.dgain = 1;
context.activeState.agc.autoEnabled = !context.configuration.raw;
/*
@@ -237,6 +240,7 @@ void Agc::prepare(IPAContext &context, const uint32_t frame,
if (frameContext.agc.autoEnabled) {
frameContext.agc.exposure = context.activeState.agc.automatic.exposure;
frameContext.agc.gain = context.activeState.agc.automatic.gain;
+ frameContext.agc.dgain = context.activeState.agc.automatic.dgain;
}
/* \todo Remove this when we can set the below with controls */
@@ -380,6 +384,7 @@ void Agc::process(IPAContext &context, [[maybe_unused]] const uint32_t frame,
/* Update the estimated exposure and gain. */
activeState.agc.automatic.exposure = shutterTime / context.configuration.sensor.lineDuration;
activeState.agc.automatic.gain = aGain;
+ activeState.agc.automatic.dgain = dGain;
fillMetadata(context, frameContext, metadata);
}
diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h
index 256b75eb..a70c7eb3 100644
--- a/src/ipa/rkisp1/ipa_context.h
+++ b/src/ipa/rkisp1/ipa_context.h
@@ -61,10 +61,12 @@ struct IPAActiveState {
struct {
uint32_t exposure;
double gain;
+ double dgain;
} manual;
struct {
uint32_t exposure;
double gain;
+ double dgain;
} automatic;
bool autoEnabled;
@@ -110,6 +112,7 @@ struct IPAFrameContext : public FrameContext {
struct {
uint32_t exposure;
double gain;
+ double dgain;
bool autoEnabled;
} agc;
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index b0bbcd8c..d66dfdd7 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -446,10 +446,12 @@ void IPARkISP1::setControls(unsigned int frame)
IPAFrameContext &frameContext = context_.frameContexts.get(frame);
uint32_t exposure = frameContext.agc.exposure;
uint32_t gain = camHelper_->gainCode(frameContext.agc.gain);
+ uint32_t dgain = camHelper_->gainCode(frameContext.agc.dgain);
ControlList ctrls(sensorControls_);
ctrls.set(V4L2_CID_EXPOSURE, static_cast<int32_t>(exposure));
ctrls.set(V4L2_CID_ANALOGUE_GAIN, static_cast<int32_t>(gain));
+ ctrls.set(V4L2_CID_DIGITAL_GAIN, static_cast<int32_t>(dgain));
setSensorControls.emit(frame, ctrls);
}
--
2.39.2
More information about the libcamera-devel
mailing list