[libcamera-devel] [PATCH v5 2/7] libcamera: pipeline: uvcvideo: Add support for AeEnable
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sat Apr 25 02:45:28 CEST 2020
UVC devices support auto-exposure, expose the feature through the
AeEnable control.
Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 42 +++++++++++++++-----
1 file changed, 33 insertions(+), 9 deletions(-)
diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
index 92777b9f5fe4..b040f2460b1c 100644
--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
@@ -244,9 +244,6 @@ void PipelineHandlerUVC::stop(Camera *camera)
int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id,
const ControlValue &value)
{
- if (value.type() != ControlTypeInteger32)
- return -EINVAL;
-
uint32_t cid;
if (id == controls::Brightness)
@@ -255,6 +252,8 @@ int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id,
cid = V4L2_CID_CONTRAST;
else if (id == controls::Saturation)
cid = V4L2_CID_SATURATION;
+ else if (id == controls::AeEnable)
+ cid = V4L2_CID_EXPOSURE_AUTO;
else if (id == controls::ManualExposure)
cid = V4L2_CID_EXPOSURE_ABSOLUTE;
else if (id == controls::ManualGain)
@@ -262,12 +261,21 @@ int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id,
else
return -EINVAL;
- int32_t ivalue = value.get<int32_t>();
+ switch (cid) {
+ 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);
+ break;
+ }
- if (cid == V4L2_CID_EXPOSURE_ABSOLUTE)
- controls->set(V4L2_CID_EXPOSURE_AUTO, static_cast<int32_t>(1));
-
- controls->set(cid, ivalue);
+ default: {
+ int32_t ivalue = value.get<int32_t>();
+ controls->set(cid, ivalue);
+ break;
+ }
+ }
return 0;
}
@@ -388,7 +396,9 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
ControlInfoMap::Map *ctrls)
{
const ControlId *id;
+ ControlInfo info;
+ /* Map the control ID. */
switch (cid) {
case V4L2_CID_BRIGHTNESS:
id = &controls::Brightness;
@@ -399,6 +409,9 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
case V4L2_CID_SATURATION:
id = &controls::Saturation;
break;
+ case V4L2_CID_EXPOSURE_AUTO:
+ id = &controls::AeEnable;
+ break;
case V4L2_CID_EXPOSURE_ABSOLUTE:
id = &controls::ManualExposure;
break;
@@ -409,7 +422,18 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
return;
}
- ctrls->emplace(id, v4l2Info);
+ /* Map the control info. */
+ switch (cid) {
+ case V4L2_CID_EXPOSURE_AUTO:
+ info = ControlInfo{ false, true, true };
+ break;
+
+ default:
+ info = v4l2Info;
+ break;
+ }
+
+ ctrls->emplace(id, info);
}
void UVCCameraData::bufferReady(FrameBuffer *buffer)
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list