[libcamera-devel] [PATCH v2 2/6] libcamera: uvcvideo: Register ExposureTimeMode control

Jacopo Mondi jacopo at jmondi.org
Thu Aug 11 17:02:15 CEST 2022


Port the UVC pipeline handler to use the new ExposureTimeMode control
when processing Camera controls in place of the AeEnable control.

The V4L2_CID_EXPOSURE_AUTO control allows 4 possible values, which
map to ExposureTimeModeAuto and ExposureTimeModeManual.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 54 ++++++++++++++++++--
 1 file changed, 49 insertions(+), 5 deletions(-)

diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
index fbe02cdcd520..08a37da0d90d 100644
--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
@@ -266,7 +266,7 @@ 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)
+	else if (id == controls::ExposureTimeMode)
 		cid = V4L2_CID_EXPOSURE_AUTO;
 	else if (id == controls::ExposureTime)
 		cid = V4L2_CID_EXPOSURE_ABSOLUTE;
@@ -580,7 +580,7 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
 		id = &controls::Saturation;
 		break;
 	case V4L2_CID_EXPOSURE_AUTO:
-		id = &controls::AeEnable;
+		id = &controls::ExposureTimeMode;
 		break;
 	case V4L2_CID_EXPOSURE_ABSOLUTE:
 		id = &controls::ExposureTime;
@@ -593,6 +593,7 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
 	}
 
 	/* Map the control info. */
+	const std::vector<ControlValue> &v4l2Values = v4l2Info.values();
 	int32_t min = v4l2Info.min().get<int32_t>();
 	int32_t max = v4l2Info.max().get<int32_t>();
 	int32_t def = v4l2Info.def().get<int32_t>();
@@ -630,10 +631,53 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
 		};
 		break;
 
-	case V4L2_CID_EXPOSURE_AUTO:
-		info = ControlInfo{ false, true, true };
+	case V4L2_CID_EXPOSURE_AUTO: {
+		/*
+		 * From the V4L2_CID_EXPOSURE_AUTO documentation:
+		 *
+		 * ------------------------------------------------------------
+		 * V4L2_EXPOSURE_AUTO:
+		 * Automatic exposure time, automatic iris aperture.
+		 *
+		 * V4L2_EXPOSURE_MANUAL:
+		 * Manual exposure time, manual iris.
+		 *
+		 * V4L2_EXPOSURE_SHUTTER_PRIORITY:
+		 * Manual exposure time, auto iris.
+		 *
+		 * V4L2_EXPOSURE_APERTURE_PRIORITY:
+		 * Auto exposure time, manual iris.
+		 *-------------------------------------------------------------
+		 *
+		 * ExposureTimeModeAuto = { V4L2_EXPOSURE_AUTO,
+		 * 			    V4L2_EXPOSURE_APERTURE_PRIORITY }
+		 *
+		 *
+		 * ExposureTimeModeManual = { V4L2_EXPOSURE_MANUAL,
+		 *			      V4L2_EXPOSURE_SHUTTER_PRIORITY }
+		 */
+		std::array<int32_t, 2> values{};
+
+		auto it = std::find_if(v4l2Values.begin(), v4l2Values.end(),
+			[&](const ControlValue &val) {
+				return (val.get<int32_t>() == V4L2_EXPOSURE_APERTURE_PRIORITY ||
+					val.get<int32_t>() == V4L2_EXPOSURE_AUTO) ? true : false;
+			});
+		if (it != v4l2Values.end())
+			values.back() = static_cast<int32_t>(controls::ExposureTimeModeAuto);
+
+		it = std::find_if(v4l2Values.begin(), v4l2Values.end(),
+			[&](const ControlValue &val) {
+				return (val.get<int32_t>() == V4L2_EXPOSURE_SHUTTER_PRIORITY ||
+					val.get<int32_t>() == V4L2_EXPOSURE_MANUAL) ? true : false;
+			});
+		if (it != v4l2Values.end())
+			values.back() = static_cast<int32_t>(controls::ExposureTimeModeManual);
+
+		int32_t *data = values.data();
+		info = ControlInfo{Span<int32_t>(data, 2), values[0]};
 		break;
-
+	}
 	case V4L2_CID_EXPOSURE_ABSOLUTE:
 		/*
 		 * ExposureTime is in units of 1 µs, and UVC expects
-- 
2.37.1



More information about the libcamera-devel mailing list