@@ -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:
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(-)