mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-12 23:09:45 +03:00
libcamera: uvcvideo: Register ExposureTimeMode control
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@jmondi.org> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
128220a139
commit
bad8d591f8
1 changed files with 48 additions and 5 deletions
|
@ -298,7 +298,7 @@ int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id,
|
||||||
cid = V4L2_CID_CONTRAST;
|
cid = V4L2_CID_CONTRAST;
|
||||||
else if (id == controls::Saturation)
|
else if (id == controls::Saturation)
|
||||||
cid = V4L2_CID_SATURATION;
|
cid = V4L2_CID_SATURATION;
|
||||||
else if (id == controls::AeEnable)
|
else if (id == controls::ExposureTimeMode)
|
||||||
cid = V4L2_CID_EXPOSURE_AUTO;
|
cid = V4L2_CID_EXPOSURE_AUTO;
|
||||||
else if (id == controls::ExposureTime)
|
else if (id == controls::ExposureTime)
|
||||||
cid = V4L2_CID_EXPOSURE_ABSOLUTE;
|
cid = V4L2_CID_EXPOSURE_ABSOLUTE;
|
||||||
|
@ -647,7 +647,7 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
|
||||||
id = &controls::Saturation;
|
id = &controls::Saturation;
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_EXPOSURE_AUTO:
|
case V4L2_CID_EXPOSURE_AUTO:
|
||||||
id = &controls::AeEnable;
|
id = &controls::ExposureTimeMode;
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_EXPOSURE_ABSOLUTE:
|
case V4L2_CID_EXPOSURE_ABSOLUTE:
|
||||||
id = &controls::ExposureTime;
|
id = &controls::ExposureTime;
|
||||||
|
@ -660,6 +660,7 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Map the control info. */
|
/* Map the control info. */
|
||||||
|
const std::vector<ControlValue> &v4l2Values = v4l2Info.values();
|
||||||
int32_t min = v4l2Info.min().get<int32_t>();
|
int32_t min = v4l2Info.min().get<int32_t>();
|
||||||
int32_t max = v4l2Info.max().get<int32_t>();
|
int32_t max = v4l2Info.max().get<int32_t>();
|
||||||
int32_t def = v4l2Info.def().get<int32_t>();
|
int32_t def = v4l2Info.def().get<int32_t>();
|
||||||
|
@ -697,10 +698,52 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case V4L2_CID_EXPOSURE_AUTO:
|
case V4L2_CID_EXPOSURE_AUTO: {
|
||||||
info = ControlInfo{ false, true, true };
|
/*
|
||||||
break;
|
* 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);
|
||||||
|
|
||||||
|
info = ControlInfo{Span<int32_t>{values}, values[0]};
|
||||||
|
break;
|
||||||
|
}
|
||||||
case V4L2_CID_EXPOSURE_ABSOLUTE:
|
case V4L2_CID_EXPOSURE_ABSOLUTE:
|
||||||
/*
|
/*
|
||||||
* ExposureTime is in units of 1 µs, and UVC expects
|
* ExposureTime is in units of 1 µs, and UVC expects
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue