[libcamera-devel,RFC,1/4] libcamera: pipeline: uvcvideo: Support the new AE controls
diff mbox series

Message ID 20210928074959.3489544-2-paul.elder@ideasonboard.com
State Superseded
Headers show
Series
  • Fix pipelines for the new AE-related controls
Related show

Commit Message

Paul Elder Sept. 28, 2021, 7:49 a.m. UTC
Add support for the new AE controls in the uvcvideo pipeline handler.

Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
---
 src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 35 +++++++++++++++++---
 1 file changed, 31 insertions(+), 4 deletions(-)

Patch
diff mbox series

diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
index 264f5370..c227d885 100644
--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
@@ -268,7 +268,9 @@  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::AnalogueGainMode)
 		cid = V4L2_CID_EXPOSURE_AUTO;
 	else if (id == controls::ExposureTime)
 		cid = V4L2_CID_EXPOSURE_ABSOLUTE;
@@ -302,9 +304,33 @@  int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id,
 	}
 
 	case V4L2_CID_EXPOSURE_AUTO: {
-		int32_t ivalue = value.get<bool>()
+		bool exposureSet = controls->contains(V4L2_CID_EXPOSURE_AUTO);
+
+		/* \todo Make this nicer. */
+		int32_t ivalue;
+		if (id == controls::ExposureTimeMode && exposureSet) {
+			int32_t exposureMode = controls->get(V4L2_CID_EXPOSURE_AUTO);
+			ivalue = value.get<int32_t>() == ExposureTimeModeAuto
+			       ? (exposureMode == V4L2_EXPOSURE_SHUTTER_PRIORITY
+				  ? V4L2_EXPOSURE_AUTO
+				  : V4L2_EXPOSURE_APERTURE_PRIORITY)
+			       : V4L2_EXPOSURE_MANUAL;
+		} else if (id == controls::ExposureTimeMode && !exposureSet) {
+			ivalue = value.get<int32_t>() == ExposureTimeModeAuto
 			       ? V4L2_EXPOSURE_APERTURE_PRIORITY
 			       : V4L2_EXPOSURE_MANUAL;
+		} else if (id == controls::AnalogueGainMode && exposureSet) {
+			int32_t exposureMode = controls->get(V4L2_CID_EXPOSURE_AUTO);
+			ivalue = value.get<int32_t>() == AnalogueGainModeAuto
+			       ? (exposureMode == V4L2_EXPOSURE_APERTURE_PRIORITY
+				  ? V4L2_EXPOSURE_AUTO
+				  : V4L2_EXPOSURE_SHUTTER_PRIORITY)
+			       : V4L2_EXPOSURE_MANUAL;
+		} else if (id == controls::AnalogueGainMode && !exposureSet) {
+			ivalue = value.get<int32_t>() == AnalogueGainModeAuto
+			       ? V4L2_EXPOSURE_SHUTTER_PRIORITY
+			       : V4L2_EXPOSURE_MANUAL;
+		}
 		controls->set(V4L2_CID_EXPOSURE_AUTO, ivalue);
 		break;
 	}
@@ -559,7 +585,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;
@@ -610,7 +636,8 @@  void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
 		break;
 
 	case V4L2_CID_EXPOSURE_AUTO:
-		info = ControlInfo{ false, true, true };
+		info = ControlInfo{ { ExposureTimeModeAuto, ExposureTimeModeDisabled },
+				    ExposureTimeModeDisabled };
 		break;
 
 	case V4L2_CID_EXPOSURE_ABSOLUTE: