summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBarnabás Pőcze <barnabas.pocze@ideasonboard.com>2025-02-14 18:08:03 +0100
committerBarnabás Pőcze <barnabas.pocze@ideasonboard.com>2025-04-01 16:13:00 +0200
commit8b2533d0ac6ff5943794a119a76037d4a2592b56 (patch)
tree2f31e371d063d0667de679320c578cea3b1c785a /src
parent799982b6465a9389bf525b91dbb100e6dd1913c9 (diff)
libcamera: pipeline: uvcvideo: Fix `ExposureTimeMode` control setting
The mapping in `UVCCameraData::processControl()` is not entirely correct because the control value is retrieved as a `bool` instead of `int32_t`. Additionally, the available modes are not taken into account. Retrieve the control value with the right type, `int32_t`, check if the requested mode is available, and if so, set the appropriate V4L2 control value selected by `addControl()` earlier. Fixes: bad8d591f8acfa ("libcamera: uvcvideo: Register ExposureTimeMode control") Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/pipeline/uvcvideo/uvcvideo.cpp29
1 files changed, 20 insertions, 9 deletions
diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
index 3a2a64cf..5adc89fd 100644
--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
@@ -98,8 +98,8 @@ public:
bool match(DeviceEnumerator *enumerator) override;
private:
- int processControl(ControlList *controls, unsigned int id,
- const ControlValue &value);
+ int processControl(const UVCCameraData *data, ControlList *controls,
+ unsigned int id, const ControlValue &value);
int processControls(UVCCameraData *data, Request *request);
bool acquireDevice(Camera *camera) override;
@@ -312,8 +312,8 @@ void PipelineHandlerUVC::stopDevice(Camera *camera)
data->video_->releaseBuffers();
}
-int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id,
- const ControlValue &value)
+int PipelineHandlerUVC::processControl(const UVCCameraData *data, ControlList *controls,
+ unsigned int id, const ControlValue &value)
{
uint32_t cid;
@@ -357,10 +357,21 @@ int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id,
}
case V4L2_CID_EXPOSURE_AUTO: {
- int32_t ivalue = value.get<bool>()
- ? V4L2_EXPOSURE_APERTURE_PRIORITY
- : V4L2_EXPOSURE_MANUAL;
- controls->set(V4L2_CID_EXPOSURE_AUTO, ivalue);
+ std::optional<v4l2_exposure_auto_type> mode;
+
+ switch (value.get<int32_t>()) {
+ case controls::ExposureTimeModeAuto:
+ mode = data->autoExposureMode_;
+ break;
+ case controls::ExposureTimeModeManual:
+ mode = data->manualExposureMode_;
+ break;
+ }
+
+ if (!mode)
+ return -EINVAL;
+
+ controls->set(V4L2_CID_EXPOSURE_AUTO, static_cast<int32_t>(*mode));
break;
}
@@ -398,7 +409,7 @@ int PipelineHandlerUVC::processControls(UVCCameraData *data, Request *request)
ControlList controls(data->video_->controls());
for (const auto &[id, value] : request->controls())
- processControl(&controls, id, value);
+ processControl(data, &controls, id, value);
for (const auto &ctrl : controls)
LOG(UVC, Debug)