[PATCH 1/1] libcamera: camera: Fix up the AeEnable control during Camera::start()
David Plowman
david.plowman at raspberrypi.com
Wed May 21 14:53:27 CEST 2025
In Camera::queueRequest() the control list is updated transparently by
converting AeEnable into ExposureTimeMode and AnalogueGainMode
controls.
However, this was not happening during Camera::start(), meaning that
setting AeEnable there was having no effect. It should behave the same
here too.
Fixes: 7abd4139051c ("libcamera: camera: Pre-process AeEnable control")
Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
---
include/libcamera/camera.h | 2 ++
src/libcamera/camera.cpp | 57 +++++++++++++++++++++++++-------------
2 files changed, 40 insertions(+), 19 deletions(-)
diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
index 94cee7bd..b24a2974 100644
--- a/include/libcamera/camera.h
+++ b/include/libcamera/camera.h
@@ -165,6 +165,8 @@ private:
friend class FrameBufferAllocator;
int exportFrameBuffers(Stream *stream,
std::vector<std::unique_ptr<FrameBuffer>> *buffers);
+
+ void patchControlList(ControlList &controls);
};
} /* namespace libcamera */
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index c180a5fd..23b9207a 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -1266,6 +1266,33 @@ std::unique_ptr<Request> Camera::createRequest(uint64_t cookie)
return request;
}
+/**
+ * \brief Patch a control list that contains the AeEnable control
+ * \param[inout] controls The control list to be patched
+ *
+ * The control list is patched in place, turning the AeEnable control into
+ * the equivalent ExposureTimeMode/AnalogueGainMode controls.
+ */
+void Camera::patchControlList(ControlList &controls)
+{
+ const auto &aeEnable = controls.get(controls::AeEnable);
+ if (aeEnable) {
+ if (_d()->controlInfo_.count(controls::AnalogueGainMode.id()) &&
+ !controls.contains(controls::AnalogueGainMode.id())) {
+ controls.set(controls::AnalogueGainMode,
+ *aeEnable ? controls::AnalogueGainModeAuto
+ : controls::AnalogueGainModeManual);
+ }
+
+ if (_d()->controlInfo_.count(controls::ExposureTimeMode.id()) &&
+ !controls.contains(controls::ExposureTimeMode.id())) {
+ controls.set(controls::ExposureTimeMode,
+ *aeEnable ? controls::ExposureTimeModeAuto
+ : controls::ExposureTimeModeManual);
+ }
+ }
+}
+
/**
* \brief Queue a request to the camera
* \param[in] request The request to queue to the camera
@@ -1329,23 +1356,7 @@ int Camera::queueRequest(Request *request)
}
/* Pre-process AeEnable. */
- ControlList &controls = request->controls();
- const auto &aeEnable = controls.get(controls::AeEnable);
- if (aeEnable) {
- if (_d()->controlInfo_.count(controls::AnalogueGainMode.id()) &&
- !controls.contains(controls::AnalogueGainMode.id())) {
- controls.set(controls::AnalogueGainMode,
- *aeEnable ? controls::AnalogueGainModeAuto
- : controls::AnalogueGainModeManual);
- }
-
- if (_d()->controlInfo_.count(controls::ExposureTimeMode.id()) &&
- !controls.contains(controls::ExposureTimeMode.id())) {
- controls.set(controls::ExposureTimeMode,
- *aeEnable ? controls::ExposureTimeModeAuto
- : controls::ExposureTimeModeManual);
- }
- }
+ patchControlList(request->controls());
d->pipe_->invokeMethod(&PipelineHandler::queueRequest,
ConnectionTypeQueued, request);
@@ -1383,8 +1394,16 @@ int Camera::start(const ControlList *controls)
ASSERT(d->requestSequence_ == 0);
- ret = d->pipe_->invokeMethod(&PipelineHandler::start,
- ConnectionTypeBlocking, this, controls);
+ if (controls) {
+ ControlList copy(*controls);
+ patchControlList(copy);
+ ret = d->pipe_->invokeMethod(&PipelineHandler::start,
+ ConnectionTypeBlocking, this, ©);
+ }
+ else
+ ret = d->pipe_->invokeMethod(&PipelineHandler::start,
+ ConnectionTypeBlocking, this, nullptr);
+
if (ret)
return ret;
--
2.39.5
More information about the libcamera-devel
mailing list