[libcamera-devel] [PATCH v5 2/7] libcamera: pipeline: uvcvideo: Add support for AeEnable
Jacopo Mondi
jacopo at jmondi.org
Sun Apr 26 21:36:22 CEST 2020
Hi Laurent,
On Sun, Apr 26, 2020 at 08:04:27PM +0300, Laurent Pinchart wrote:
> Hi Jacopo,
>
> On Sun, Apr 26, 2020 at 03:02:17PM +0200, Jacopo Mondi wrote:
> > On Sat, Apr 25, 2020 at 03:45:28AM +0300, Laurent Pinchart wrote:
> > > UVC devices support auto-exposure, expose the feature through the
> > > AeEnable control.
> > >
> > > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > > ---
> > > src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 42 +++++++++++++++-----
> > > 1 file changed, 33 insertions(+), 9 deletions(-)
> > >
> > > diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> > > index 92777b9f5fe4..b040f2460b1c 100644
> > > --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> > > +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> > > @@ -244,9 +244,6 @@ void PipelineHandlerUVC::stop(Camera *camera)
> > > int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id,
> > > const ControlValue &value)
> > > {
> > > - if (value.type() != ControlTypeInteger32)
> > > - return -EINVAL;
> > > -
> > > uint32_t cid;
> > >
> > > if (id == controls::Brightness)
> > > @@ -255,6 +252,8 @@ 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)
> > > + cid = V4L2_CID_EXPOSURE_AUTO;
> > > else if (id == controls::ManualExposure)
> > > cid = V4L2_CID_EXPOSURE_ABSOLUTE;
> > > else if (id == controls::ManualGain)
> > > @@ -262,12 +261,21 @@ int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id,
> > > else
> > > return -EINVAL;
> > >
> > > - int32_t ivalue = value.get<int32_t>();
> > > + switch (cid) {
> > > + case V4L2_CID_EXPOSURE_AUTO: {
> > > + int32_t ivalue = value.get<bool>()
> > > + ? V4L2_EXPOSURE_APERTURE_PRIORITY
> > > + : V4L2_EXPOSURE_MANUAL;
> > > + controls->set(V4L2_CID_EXPOSURE_AUTO, ivalue);
> > > + break;
> > > + }
> > >
> > > - if (cid == V4L2_CID_EXPOSURE_ABSOLUTE)
> > > - controls->set(V4L2_CID_EXPOSURE_AUTO, static_cast<int32_t>(1));
> >
> > Which one between AeEnable and ManualExposure has priority ? Here it
> > seems to me the last processed one overwrites the other...
>
> The V4L2_CID_EXPOSURE_ABSOLUTE control is ignored by the device when
> V4L2_CID_EXPOSURE_AUTO is set to automatic, which is what we want. We
> could make it explicit in the code here by skipping the
> V4L2_CID_EXPOSURE_ABSOLUTE control when auto-exposure is enabled, but I
> think that's a bit overkill as the hardware ignores it anyway.
>
> > Anyway, am I wrong or if you receive ManualExposure, AeEnable is not
> > disabled anymore? And, this comment applies to patch #1 but I'm just
> > noticing it now, if cid == V4L2_CID_EXPOSURE_ABSOLUTE, it means we have
> > received ManualExposure, shouldn't then EXPOSURE_AUTO be set to 0 ?
>
> AeEnable controls whether the auto-exposure algorithm is enabled or not.
> When enabled, manual changes to the exposure time shall be ignored by
> the pipeline handler. In this specific case the pipeline handler
> implementation relies on the device ignoring the manual exposure time.
>
Oh, I had no idea, this is fine then.
> > > -
> > > - controls->set(cid, ivalue);
> > > + default: {
> > > + int32_t ivalue = value.get<int32_t>();
> > > + controls->set(cid, ivalue);
> > > + break;
> > > + }
> > > + }
> > >
> > > return 0;
> > > }
> > > @@ -388,7 +396,9 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
> > > ControlInfoMap::Map *ctrls)
> > > {
> > > const ControlId *id;
> > > + ControlInfo info;
> > >
> > > + /* Map the control ID. */
> >
> > it's fine here, but could have gone in #1. Nitpicking...
> >
> > > switch (cid) {
> > > case V4L2_CID_BRIGHTNESS:
> > > id = &controls::Brightness;
> > > @@ -399,6 +409,9 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
> > > case V4L2_CID_SATURATION:
> > > id = &controls::Saturation;
> > > break;
> > > + case V4L2_CID_EXPOSURE_AUTO:
> > > + id = &controls::AeEnable;
> > > + break;
> > > case V4L2_CID_EXPOSURE_ABSOLUTE:
> > > id = &controls::ManualExposure;
> > > break;
> > > @@ -409,7 +422,18 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
> > > return;
> > > }
> > >
> > > - ctrls->emplace(id, v4l2Info);
> > > + /* Map the control info. */
> > > + switch (cid) {
> > > + case V4L2_CID_EXPOSURE_AUTO:
> > > + info = ControlInfo{ false, true, true };
> >
> > Why can't we use the v4l2Info here ? what will it report that needs to
> > be manually contructed ?
>
> V4L2_CID_EXPOSURE_AUTO is a menu control, so v4l2Info contains int32_t
> values, while controls::AeEnable is a boolean control.
>
Ack.
With these questions clarified
Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
Thanks
j
> > > + break;
> > > +
> > > + default:
> > > + info = v4l2Info;
> > > + break;
> > > + }
> > > +
> > > + ctrls->emplace(id, info);
> > > }
> > >
> > > void UVCCameraData::bufferReady(FrameBuffer *buffer)
>
> --
> Regards,
>
> Laurent Pinchart
More information about the libcamera-devel
mailing list