[libcamera-devel] [PATCH v2 2/7] libcamera: pipeline: uvcvideo: Support the new AE controls

paul.elder at ideasonboard.com paul.elder at ideasonboard.com
Mon Oct 4 10:11:06 CEST 2021


Hi Jacopo,

On Fri, Oct 01, 2021 at 06:54:02PM +0200, Jacopo Mondi wrote:
> Hi Paul,
> 
> On Fri, Oct 01, 2021 at 07:33:20PM +0900, Paul Elder wrote:
> > Add support for the new AE controls in the uvcvideo pipeline handler.
> >
> > Bug: https://bugs.libcamera.org/show_bug.cgi?id=42
> > Bug: https://bugs.libcamera.org/show_bug.cgi?id=43
> > Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> >
> > ---
> > Changes in v2:
> > - fix the rebase error where some uvc stuff was in rasberrypi
> > ---
> >  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 36 +++++++++++++++++---
> >  1 file changed, 32 insertions(+), 4 deletions(-)
> >
> > diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp
> > index 264f5370..3a9c3b8d 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;
> 
> Shouldn't AnalogueGainMode map to V4L2_CID_AUTOGAIN ?

Oh probably. I'm not yet familiar with V4L2 controls.

> 
> >  	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);
> 
> Uh, I don't get this. We add V4L2_CID_EXPOSURE_AUTO to controls at the
> end of the function, don't we ?

Oh you're right. I think I thought I needed and exception and then
didn't and forgot to fix it back.

> > +
> > +		/* \todo Make this nicer. */
> 
> I don't get what happens down here, maybe a most explicative comment
> might help ?

Ah :D

I thought that V4L2_CID_EXPOSURE_AUTO was "the" AE control, as it had
both aperture priority and shutter priority.

The end goal of this complex block is to:
exposure |  gain  || value
---------+--------++------
auto     | auto   || auto
auto     | manual || aperture priority
auto     | none   || aperture priority
manual   | auto   || shutter priority
none     | auto   || shutter priority
manual   | manual || manual

(I'm pretty sure, this is so disgusting that even I lost track...)


Paul

> 
> > +		int32_t ivalue;
> > +		if (id == controls::ExposureTimeMode && exposureSet) {
> > +			int32_t exposureMode = controls->get(V4L2_CID_EXPOSURE_AUTO).get<int32_t>();
> > +			ivalue = value.get<int32_t>() == controls::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>() == controls::ExposureTimeModeAuto
> >  			       ? V4L2_EXPOSURE_APERTURE_PRIORITY
> >  			       : V4L2_EXPOSURE_MANUAL;
> > +		} else if (id == controls::AnalogueGainMode && exposureSet) {
> > +			int32_t exposureMode = controls->get(V4L2_CID_EXPOSURE_AUTO).get<int32_t>();
> > +			ivalue = value.get<int32_t>() == controls::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>() == controls::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,9 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
> >  		break;
> >
> >  	case V4L2_CID_EXPOSURE_AUTO:
> > -		info = ControlInfo{ false, true, true };
> > +		info = ControlInfo{ { controls::ExposureTimeModeAuto,
> > +				      controls::ExposureTimeModeDisabled },
> > +				    controls::ExposureTimeModeDisabled };
> 
> >  		break;
> >
> >  	case V4L2_CID_EXPOSURE_ABSOLUTE:
> > --
> > 2.27.0
> >


More information about the libcamera-devel mailing list