summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ipa/rkisp1/ipa_context.h5
-rw-r--r--src/ipa/rkisp1/rkisp1.cpp12
-rw-r--r--src/libcamera/pipeline/rkisp1/rkisp1.cpp16
3 files changed, 33 insertions, 0 deletions
diff --git a/src/ipa/rkisp1/ipa_context.h b/src/ipa/rkisp1/ipa_context.h
index b9b20653..1fac6af9 100644
--- a/src/ipa/rkisp1/ipa_context.h
+++ b/src/ipa/rkisp1/ipa_context.h
@@ -54,6 +54,11 @@ struct IPASessionConfiguration {
struct IPAActiveState {
struct {
+ uint32_t lensPosition;
+ bool applyLensCtrls;
+ } af;
+
+ struct {
struct {
uint32_t exposure;
double gain;
diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index 9e861fc0..297161b2 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -270,6 +270,10 @@ int IPARkISP1::configure(const IPAConfigInfo &ipaConfig,
return format.colourEncoding == PixelFormatInfo::ColourEncodingRAW;
});
+ /* Lens position is unknown at the startup, so initilize the variable
+ * that holds the current position to something out of the range. */
+ context_.activeState.af.lensPosition = std::numeric_limits<int32_t>::max();
+
for (auto const &a : algorithms()) {
Algorithm *algo = static_cast<Algorithm *>(a.get());
@@ -452,6 +456,14 @@ void IPARkISP1::setControls(unsigned int frame)
ctrls.set(V4L2_CID_ANALOGUE_GAIN, static_cast<int32_t>(gain));
setSensorControls.emit(frame, ctrls);
+
+ if (lensControls_ && context_.activeState.af.applyLensCtrls) {
+ context_.activeState.af.applyLensCtrls = false;
+ ControlList lensCtrls(*lensControls_);
+ lensCtrls.set(V4L2_CID_FOCUS_ABSOLUTE,
+ static_cast<int32_t>(context_.activeState.af.lensPosition));
+ setLensControls.emit(lensCtrls);
+ }
}
} /* namespace ipa::rkisp1 */
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index e13d249b..7e0964c4 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -114,6 +114,7 @@ private:
void paramFilled(unsigned int frame);
void setSensorControls(unsigned int frame,
const ControlList &sensorControls);
+ void setLensControls(const ControlList &lensControls);
void metadataReady(unsigned int frame, const ControlList &metadata);
};
@@ -342,6 +343,7 @@ int RkISP1CameraData::loadIPA(unsigned int hwRevision)
return -ENOENT;
ipa_->setSensorControls.connect(this, &RkISP1CameraData::setSensorControls);
+ ipa_->setLensControls.connect(this, &RkISP1CameraData::setLensControls);
ipa_->paramsBufferReady.connect(this, &RkISP1CameraData::paramFilled);
ipa_->metadataReady.connect(this, &RkISP1CameraData::metadataReady);
@@ -405,6 +407,20 @@ void RkISP1CameraData::setSensorControls([[maybe_unused]] unsigned int frame,
delayedCtrls_->push(sensorControls);
}
+void RkISP1CameraData::setLensControls(const ControlList &lensControls)
+{
+ CameraLens *focusLens = sensor_->focusLens();
+ if (!focusLens)
+ return;
+
+ if (!lensControls.contains(V4L2_CID_FOCUS_ABSOLUTE))
+ return;
+
+ const ControlValue &focusValue = lensControls.get(V4L2_CID_FOCUS_ABSOLUTE);
+
+ focusLens->setFocusPosition(focusValue.get<int32_t>());
+}
+
void RkISP1CameraData::metadataReady(unsigned int frame, const ControlList &metadata)
{
RkISP1FrameInfo *info = frameInfo_.find(frame);