Message ID | 20220811150219.62066-3-jacopo@jmondi.org |
---|---|
State | Accepted |
Delegated to: | Jacopo Mondi |
Headers | show |
Series |
|
Related | show |
Hi Jacopo, On Thu, Aug 11, 2022 at 05:02:15PM +0200, Jacopo Mondi via libcamera-devel wrote: > 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> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> > --- > 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 >
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
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> --- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 54 ++++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-)