[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