[libcamera-devel,v5,08/10] ipa: rkisp1: Add AF controls to the RkISP1 IPA
diff mbox series

Message ID 20230324142908.64224-9-dse@thaumatec.com
State Superseded
Headers show
Series
  • ipa: rkisp1: Add autofocus algorithm
Related show

Commit Message

Daniel Semkowicz March 24, 2023, 2:29 p.m. UTC
Add controls supported by the AF algorithm to the list of controls
supported by the RkISP1 IPA. This exposes the AF controls to the user
and allows controlling the AF algorithm using the top level API.

Signed-off-by: Daniel Semkowicz <dse@thaumatec.com>
---
 src/ipa/rkisp1/rkisp1.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Jacopo Mondi March 24, 2023, 3:42 p.m. UTC | #1
Hi daniel

On Fri, Mar 24, 2023 at 03:29:06PM +0100, Daniel Semkowicz via libcamera-devel wrote:
> Add controls supported by the AF algorithm to the list of controls
> supported by the RkISP1 IPA. This exposes the AF controls to the user
> and allows controlling the AF algorithm using the top level API.
>
> Signed-off-by: Daniel Semkowicz <dse@thaumatec.com>
> ---
>  src/ipa/rkisp1/rkisp1.cpp | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> index cd1fbae3..4b30844f 100644
> --- a/src/ipa/rkisp1/rkisp1.cpp
> +++ b/src/ipa/rkisp1/rkisp1.cpp
> @@ -101,10 +101,16 @@ namespace {
>  /* List of controls handled by the RkISP1 IPA */
>  const ControlInfoMap::Map rkisp1Controls{
>  	{ &controls::AeEnable, ControlInfo(false, true) },
> +	{ &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },
> +	{ &controls::AfMode, ControlInfo(controls::AfModeValues) },

AfPauseDeferred is not supported

Otherwise
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>

> +	{ &controls::AfPause, ControlInfo(controls::AfPauseValues) },
> +	{ &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },
> +	{ &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },

We should -really- move to instantiate control limits directly based
on the sensor configuration...

>  	{ &controls::AwbEnable, ControlInfo(false, true) },
>  	{ &controls::ColourGains, ControlInfo(0.0f, 3.996f, 1.0f) },
>  	{ &controls::Brightness, ControlInfo(-1.0f, 0.993f, 0.0f) },
>  	{ &controls::Contrast, ControlInfo(0.0f, 1.993f, 1.0f) },
> +	{ &controls::LensPosition, ControlInfo(0.0f, 2147483647.0f) },
>  	{ &controls::Saturation, ControlInfo(0.0f, 1.993f, 1.0f) },
>  	{ &controls::Sharpness, ControlInfo(0.0f, 10.0f, 1.0f) },
>  	{ &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
> --
> 2.39.2
>
Kieran Bingham March 24, 2023, 3:47 p.m. UTC | #2
On 24/03/2023 15:42, Jacopo Mondi via libcamera-devel wrote:
> Hi daniel
> 
> On Fri, Mar 24, 2023 at 03:29:06PM +0100, Daniel Semkowicz via libcamera-devel wrote:
>> Add controls supported by the AF algorithm to the list of controls
>> supported by the RkISP1 IPA. This exposes the AF controls to the user
>> and allows controlling the AF algorithm using the top level API.
>>
>> Signed-off-by: Daniel Semkowicz <dse@thaumatec.com>
>> ---
>>   src/ipa/rkisp1/rkisp1.cpp | 6 ++++++
>>   1 file changed, 6 insertions(+)
>>
>> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
>> index cd1fbae3..4b30844f 100644
>> --- a/src/ipa/rkisp1/rkisp1.cpp
>> +++ b/src/ipa/rkisp1/rkisp1.cpp
>> @@ -101,10 +101,16 @@ namespace {
>>   /* List of controls handled by the RkISP1 IPA */
>>   const ControlInfoMap::Map rkisp1Controls{
>>   	{ &controls::AeEnable, ControlInfo(false, true) },
>> +	{ &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },
>> +	{ &controls::AfMode, ControlInfo(controls::AfModeValues) },
> 
> AfPauseDeferred is not supported
> 

What happens if there's no VCM though - Should we only expose the 
controls if a VCM is identified? (Though that requires reworking the 
creation of this rkisp1Controls list to be handled by the algorithms)

--
Kieran


> Otherwise
> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> 
>> +	{ &controls::AfPause, ControlInfo(controls::AfPauseValues) },
>> +	{ &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },
>> +	{ &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
> 
> We should -really- move to instantiate control limits directly based
> on the sensor configuration...
> 
>>   	{ &controls::AwbEnable, ControlInfo(false, true) },
>>   	{ &controls::ColourGains, ControlInfo(0.0f, 3.996f, 1.0f) },
>>   	{ &controls::Brightness, ControlInfo(-1.0f, 0.993f, 0.0f) },
>>   	{ &controls::Contrast, ControlInfo(0.0f, 1.993f, 1.0f) },
>> +	{ &controls::LensPosition, ControlInfo(0.0f, 2147483647.0f) },
>>   	{ &controls::Saturation, ControlInfo(0.0f, 1.993f, 1.0f) },
>>   	{ &controls::Sharpness, ControlInfo(0.0f, 10.0f, 1.0f) },
>>   	{ &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
>> --
>> 2.39.2
>>
Jacopo Mondi March 25, 2023, 9:27 a.m. UTC | #3
Hi Kieran

On Fri, Mar 24, 2023 at 03:47:53PM +0000, Kieran Bingham wrote:
>
>
> On 24/03/2023 15:42, Jacopo Mondi via libcamera-devel wrote:
> > Hi daniel
> >
> > On Fri, Mar 24, 2023 at 03:29:06PM +0100, Daniel Semkowicz via libcamera-devel wrote:
> > > Add controls supported by the AF algorithm to the list of controls
> > > supported by the RkISP1 IPA. This exposes the AF controls to the user
> > > and allows controlling the AF algorithm using the top level API.
> > >
> > > Signed-off-by: Daniel Semkowicz <dse@thaumatec.com>
> > > ---
> > >   src/ipa/rkisp1/rkisp1.cpp | 6 ++++++
> > >   1 file changed, 6 insertions(+)
> > >
> > > diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> > > index cd1fbae3..4b30844f 100644
> > > --- a/src/ipa/rkisp1/rkisp1.cpp
> > > +++ b/src/ipa/rkisp1/rkisp1.cpp
> > > @@ -101,10 +101,16 @@ namespace {
> > >   /* List of controls handled by the RkISP1 IPA */
> > >   const ControlInfoMap::Map rkisp1Controls{
> > >   	{ &controls::AeEnable, ControlInfo(false, true) },
> > > +	{ &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },
> > > +	{ &controls::AfMode, ControlInfo(controls::AfModeValues) },
> >
> > AfPauseDeferred is not supported
> >
>
> What happens if there's no VCM though - Should we only expose the controls

You're very right, I overlooked that.

> if a VCM is identified? (Though that requires reworking the creation of this
> rkisp1Controls list to be handled by the algorithms)

I'm not sure it needs to be done by algorithms, but the IPA should
certainly be made aware of the lens presence at init() time.

To be honest I would be fine with what RPi does in this regard. have a
look at the usage of lensPresent_ in their IPA module init() function.
This looks like the less invasive change.

I presume this could even be made better by passing the lens controls'
from the PH to the IPA at init() time so that the AF ControlInfo
elements could be initialized with the proper limits and not with
default values as it happens here and on RPi.

>
> --
> Kieran
>
>
> > Otherwise
> > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> >
> > > +	{ &controls::AfPause, ControlInfo(controls::AfPauseValues) },
> > > +	{ &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },
> > > +	{ &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
> >
> > We should -really- move to instantiate control limits directly based
> > on the sensor configuration...
> >
> > >   	{ &controls::AwbEnable, ControlInfo(false, true) },
> > >   	{ &controls::ColourGains, ControlInfo(0.0f, 3.996f, 1.0f) },
> > >   	{ &controls::Brightness, ControlInfo(-1.0f, 0.993f, 0.0f) },
> > >   	{ &controls::Contrast, ControlInfo(0.0f, 1.993f, 1.0f) },
> > > +	{ &controls::LensPosition, ControlInfo(0.0f, 2147483647.0f) },
> > >   	{ &controls::Saturation, ControlInfo(0.0f, 1.993f, 1.0f) },
> > >   	{ &controls::Sharpness, ControlInfo(0.0f, 10.0f, 1.0f) },
> > >   	{ &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
> > > --
> > > 2.39.2
> > >
Daniel Semkowicz March 27, 2023, 10:13 a.m. UTC | #4
Hi Jacopo, Hi Kieran,

On Sat, Mar 25, 2023 at 10:27 AM Jacopo Mondi
<jacopo.mondi@ideasonboard.com> wrote:
>
> Hi Kieran
>
> On Fri, Mar 24, 2023 at 03:47:53PM +0000, Kieran Bingham wrote:
> >
> >
> > On 24/03/2023 15:42, Jacopo Mondi via libcamera-devel wrote:
> > > Hi daniel
> > >
> > > On Fri, Mar 24, 2023 at 03:29:06PM +0100, Daniel Semkowicz via libcamera-devel wrote:
> > > > Add controls supported by the AF algorithm to the list of controls
> > > > supported by the RkISP1 IPA. This exposes the AF controls to the user
> > > > and allows controlling the AF algorithm using the top level API.
> > > >
> > > > Signed-off-by: Daniel Semkowicz <dse@thaumatec.com>
> > > > ---
> > > >   src/ipa/rkisp1/rkisp1.cpp | 6 ++++++
> > > >   1 file changed, 6 insertions(+)
> > > >
> > > > diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> > > > index cd1fbae3..4b30844f 100644
> > > > --- a/src/ipa/rkisp1/rkisp1.cpp
> > > > +++ b/src/ipa/rkisp1/rkisp1.cpp
> > > > @@ -101,10 +101,16 @@ namespace {
> > > >   /* List of controls handled by the RkISP1 IPA */
> > > >   const ControlInfoMap::Map rkisp1Controls{
> > > >           { &controls::AeEnable, ControlInfo(false, true) },
> > > > + { &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },
> > > > + { &controls::AfMode, ControlInfo(controls::AfModeValues) },
> > >
> > > AfPauseDeferred is not supported
> > >
> >
> > What happens if there's no VCM though - Should we only expose the controls
>
> You're very right, I overlooked that.
>
> > if a VCM is identified? (Though that requires reworking the creation of this
> > rkisp1Controls list to be handled by the algorithms)
>
> I'm not sure it needs to be done by algorithms, but the IPA should
> certainly be made aware of the lens presence at init() time.

This is indeed something that is needed, especially that number
of algorithm implementations is increasing. The most appropriate
solution seems for the algorithms to expose the supported control list
or to populate the list. This would also fix the problem of checking
outside the algorithm, if certain configuration is available, like
lens.

I see at least two problems with the current approach:
1. controls are exposed by the IPA, even if the algorithm is not
   enabled in the tuning file. This is confusing.
2. What if there are, for example, two AF algorithm implementations,
   with different supported controls? Which controls should be added
   to the control list?

>
> To be honest I would be fine with what RPi does in this regard. have a
> look at the usage of lensPresent_ in their IPA module init() function.
> This looks like the less invasive change.
>
> I presume this could even be made better by passing the lens controls'
> from the PH to the IPA at init() time so that the AF ControlInfo
> elements could be initialized with the proper limits and not with
> default values as it happens here and on RPi.

For me, moving it to init() is also a better solution. I would like to
avoid intermediate steps and initialize IPA lens config in one place
for clarity. This means the whole lens configuration that's currently
done in the configure(), will need to be moved to init().
However, I see one problem. context_.configuration struct is reset
in configure() for some reason. Even that
context_.configuration.sensor.lineDuration is set in init().  It is
reset and set again.

What about making the IPASessionConfiguration::lens structure
std::optional, so it will be explicitly stated in the session config
if the lens is available? Then, AF can fail in init() if lens
are not available.

This will work for lens, but I am afraid We will not be able to
evaluate all AF ControlInfo elements in the init() phase.
For example, AF window size limits depend on the sensor output size,
which is only available in the configure().

Best regards
Daniel

>
> >
> > --
> > Kieran
> >
> >
> > > Otherwise
> > > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> > >
> > > > + { &controls::AfPause, ControlInfo(controls::AfPauseValues) },
> > > > + { &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },
> > > > + { &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
> > >
> > > We should -really- move to instantiate control limits directly based
> > > on the sensor configuration...
> > >
> > > >           { &controls::AwbEnable, ControlInfo(false, true) },
> > > >           { &controls::ColourGains, ControlInfo(0.0f, 3.996f, 1.0f) },
> > > >           { &controls::Brightness, ControlInfo(-1.0f, 0.993f, 0.0f) },
> > > >           { &controls::Contrast, ControlInfo(0.0f, 1.993f, 1.0f) },
> > > > + { &controls::LensPosition, ControlInfo(0.0f, 2147483647.0f) },
> > > >           { &controls::Saturation, ControlInfo(0.0f, 1.993f, 1.0f) },
> > > >           { &controls::Sharpness, ControlInfo(0.0f, 10.0f, 1.0f) },
> > > >           { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
> > > > --
> > > > 2.39.2
> > > >
Jacopo Mondi March 27, 2023, 11:07 a.m. UTC | #5
Hi Daniel

On Mon, Mar 27, 2023 at 12:13:51PM +0200, Daniel Semkowicz via libcamera-devel wrote:
> Hi Jacopo, Hi Kieran,
>
> On Sat, Mar 25, 2023 at 10:27 AM Jacopo Mondi
> <jacopo.mondi@ideasonboard.com> wrote:
> >
> > Hi Kieran
> >
> > On Fri, Mar 24, 2023 at 03:47:53PM +0000, Kieran Bingham wrote:
> > >
> > >
> > > On 24/03/2023 15:42, Jacopo Mondi via libcamera-devel wrote:
> > > > Hi daniel
> > > >
> > > > On Fri, Mar 24, 2023 at 03:29:06PM +0100, Daniel Semkowicz via libcamera-devel wrote:
> > > > > Add controls supported by the AF algorithm to the list of controls
> > > > > supported by the RkISP1 IPA. This exposes the AF controls to the user
> > > > > and allows controlling the AF algorithm using the top level API.
> > > > >
> > > > > Signed-off-by: Daniel Semkowicz <dse@thaumatec.com>
> > > > > ---
> > > > >   src/ipa/rkisp1/rkisp1.cpp | 6 ++++++
> > > > >   1 file changed, 6 insertions(+)
> > > > >
> > > > > diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> > > > > index cd1fbae3..4b30844f 100644
> > > > > --- a/src/ipa/rkisp1/rkisp1.cpp
> > > > > +++ b/src/ipa/rkisp1/rkisp1.cpp
> > > > > @@ -101,10 +101,16 @@ namespace {
> > > > >   /* List of controls handled by the RkISP1 IPA */
> > > > >   const ControlInfoMap::Map rkisp1Controls{
> > > > >           { &controls::AeEnable, ControlInfo(false, true) },
> > > > > + { &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },
> > > > > + { &controls::AfMode, ControlInfo(controls::AfModeValues) },
> > > >
> > > > AfPauseDeferred is not supported
> > > >
> > >
> > > What happens if there's no VCM though - Should we only expose the controls
> >
> > You're very right, I overlooked that.
> >
> > > if a VCM is identified? (Though that requires reworking the creation of this
> > > rkisp1Controls list to be handled by the algorithms)
> >
> > I'm not sure it needs to be done by algorithms, but the IPA should
> > certainly be made aware of the lens presence at init() time.
>
> This is indeed something that is needed, especially that number
> of algorithm implementations is increasing. The most appropriate
> solution seems for the algorithms to expose the supported control list
> or to populate the list. This would also fix the problem of checking
> outside the algorithm, if certain configuration is available, like
> lens.
>
> I see at least two problems with the current approach:
> 1. controls are exposed by the IPA, even if the algorithm is not
>    enabled in the tuning file. This is confusing.

Agreed

> 2. What if there are, for example, two AF algorithm implementations,
>    with different supported controls? Which controls should be added
>    to the control list?

Handling multiple algos for the same functions is not something I
think there's a design for at the moment.

If we defer registering ControlInfo to the single algorithms I guess
the problem then reduces on how to run-time select which algorithm
implementation to use.

>
> >
> > To be honest I would be fine with what RPi does in this regard. have a
> > look at the usage of lensPresent_ in their IPA module init() function.
> > This looks like the less invasive change.
> >
> > I presume this could even be made better by passing the lens controls'
> > from the PH to the IPA at init() time so that the AF ControlInfo
> > elements could be initialized with the proper limits and not with
> > default values as it happens here and on RPi.
>
> For me, moving it to init() is also a better solution. I would like to
> avoid intermediate steps and initialize IPA lens config in one place
> for clarity. This means the whole lens configuration that's currently
> done in the configure(), will need to be moved to init().

The part about the lens in configure() intializes

        lensConfig.minFocusPosition = focusAbsolute.min().get<int32_t>();
        lensConfig.maxFocusPosition = focusAbsolute.max().get<int32_t>();

As you said, the lens min/max position -shouldn't- change between
configurations so this part could be moved at init() time

> However, I see one problem. context_.configuration struct is reset
> in configure() for some reason. Even that
> context_.configuration.sensor.lineDuration is set in init().  It is
> reset and set again.

The other parameters (such as the gains and shutter speed) change
depending on the currently configured sensor's mode, that's why
they're re-calculated at each configure() call.

>
> What about making the IPASessionConfiguration::lens structure
> std::optional, so it will be explicitly stated in the session config
> if the lens is available? Then, AF can fail in init() if lens
> are not available.
>

Let's take a step back for a second.

We have an updateControls() function, that starting for the static map
rkisp1Controls augments it with controls whose values are computed by
inspecting the sensorControls.

Can't we do the same for the lens controls ? Add them only
conditionally to the validity of lensControls ? Then if we deem it
better we can pass to each algorithm the sensor's and lens
configuration and have them populate the list of controls they handle.


> This will work for lens, but I am afraid We will not be able to
> evaluate all AF ControlInfo elements in the init() phase.
> For example, AF window size limits depend on the sensor output size,
> which is only available in the configure().

updateControls() has access to sensorInfo which contains the sensor's
output size

>
> Best regards
> Daniel
>
> >
> > >
> > > --
> > > Kieran
> > >
> > >
> > > > Otherwise
> > > > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> > > >
> > > > > + { &controls::AfPause, ControlInfo(controls::AfPauseValues) },
> > > > > + { &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },
> > > > > + { &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
> > > >
> > > > We should -really- move to instantiate control limits directly based
> > > > on the sensor configuration...
> > > >
> > > > >           { &controls::AwbEnable, ControlInfo(false, true) },
> > > > >           { &controls::ColourGains, ControlInfo(0.0f, 3.996f, 1.0f) },
> > > > >           { &controls::Brightness, ControlInfo(-1.0f, 0.993f, 0.0f) },
> > > > >           { &controls::Contrast, ControlInfo(0.0f, 1.993f, 1.0f) },
> > > > > + { &controls::LensPosition, ControlInfo(0.0f, 2147483647.0f) },
> > > > >           { &controls::Saturation, ControlInfo(0.0f, 1.993f, 1.0f) },
> > > > >           { &controls::Sharpness, ControlInfo(0.0f, 10.0f, 1.0f) },
> > > > >           { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
> > > > > --
> > > > > 2.39.2
> > > > >
Daniel Semkowicz March 27, 2023, 11:48 a.m. UTC | #6
On Mon, Mar 27, 2023 at 1:07 PM Jacopo Mondi
<jacopo.mondi@ideasonboard.com> wrote:
>
> Hi Daniel
>
> On Mon, Mar 27, 2023 at 12:13:51PM +0200, Daniel Semkowicz via libcamera-devel wrote:
> > Hi Jacopo, Hi Kieran,
> >
> > On Sat, Mar 25, 2023 at 10:27 AM Jacopo Mondi
> > <jacopo.mondi@ideasonboard.com> wrote:
> > >
> > > Hi Kieran
> > >
> > > On Fri, Mar 24, 2023 at 03:47:53PM +0000, Kieran Bingham wrote:
> > > >
> > > >
> > > > On 24/03/2023 15:42, Jacopo Mondi via libcamera-devel wrote:
> > > > > Hi daniel
> > > > >
> > > > > On Fri, Mar 24, 2023 at 03:29:06PM +0100, Daniel Semkowicz via libcamera-devel wrote:
> > > > > > Add controls supported by the AF algorithm to the list of controls
> > > > > > supported by the RkISP1 IPA. This exposes the AF controls to the user
> > > > > > and allows controlling the AF algorithm using the top level API.
> > > > > >
> > > > > > Signed-off-by: Daniel Semkowicz <dse@thaumatec.com>
> > > > > > ---
> > > > > >   src/ipa/rkisp1/rkisp1.cpp | 6 ++++++
> > > > > >   1 file changed, 6 insertions(+)
> > > > > >
> > > > > > diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> > > > > > index cd1fbae3..4b30844f 100644
> > > > > > --- a/src/ipa/rkisp1/rkisp1.cpp
> > > > > > +++ b/src/ipa/rkisp1/rkisp1.cpp
> > > > > > @@ -101,10 +101,16 @@ namespace {
> > > > > >   /* List of controls handled by the RkISP1 IPA */
> > > > > >   const ControlInfoMap::Map rkisp1Controls{
> > > > > >           { &controls::AeEnable, ControlInfo(false, true) },
> > > > > > + { &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },
> > > > > > + { &controls::AfMode, ControlInfo(controls::AfModeValues) },
> > > > >
> > > > > AfPauseDeferred is not supported
> > > > >
> > > >
> > > > What happens if there's no VCM though - Should we only expose the controls
> > >
> > > You're very right, I overlooked that.
> > >
> > > > if a VCM is identified? (Though that requires reworking the creation of this
> > > > rkisp1Controls list to be handled by the algorithms)
> > >
> > > I'm not sure it needs to be done by algorithms, but the IPA should
> > > certainly be made aware of the lens presence at init() time.
> >
> > This is indeed something that is needed, especially that number
> > of algorithm implementations is increasing. The most appropriate
> > solution seems for the algorithms to expose the supported control list
> > or to populate the list. This would also fix the problem of checking
> > outside the algorithm, if certain configuration is available, like
> > lens.
> >
> > I see at least two problems with the current approach:
> > 1. controls are exposed by the IPA, even if the algorithm is not
> >    enabled in the tuning file. This is confusing.
>
> Agreed
>
> > 2. What if there are, for example, two AF algorithm implementations,
> >    with different supported controls? Which controls should be added
> >    to the control list?
>
> Handling multiple algos for the same functions is not something I
> think there's a design for at the moment.
>
> If we defer registering ControlInfo to the single algorithms I guess
> the problem then reduces on how to run-time select which algorithm
> implementation to use.

I meant the current situation with ControlInfo map populated
in the IPA instead in algorithms itself. As you said, this should not
be a problem with the controls handled in the algorithms.

>
> >
> > >
> > > To be honest I would be fine with what RPi does in this regard. have a
> > > look at the usage of lensPresent_ in their IPA module init() function.
> > > This looks like the less invasive change.
> > >
> > > I presume this could even be made better by passing the lens controls'
> > > from the PH to the IPA at init() time so that the AF ControlInfo
> > > elements could be initialized with the proper limits and not with
> > > default values as it happens here and on RPi.
> >
> > For me, moving it to init() is also a better solution. I would like to
> > avoid intermediate steps and initialize IPA lens config in one place
> > for clarity. This means the whole lens configuration that's currently
> > done in the configure(), will need to be moved to init().
>
> The part about the lens in configure() intializes
>
>         lensConfig.minFocusPosition = focusAbsolute.min().get<int32_t>();
>         lensConfig.maxFocusPosition = focusAbsolute.max().get<int32_t>();
>
> As you said, the lens min/max position -shouldn't- change between
> configurations so this part could be moved at init() time
>
> > However, I see one problem. context_.configuration struct is reset
> > in configure() for some reason. Even that
> > context_.configuration.sensor.lineDuration is set in init().  It is
> > reset and set again.
>
> The other parameters (such as the gains and shutter speed) change
> depending on the currently configured sensor's mode, that's why
> they're re-calculated at each configure() call.
>
> >
> > What about making the IPASessionConfiguration::lens structure
> > std::optional, so it will be explicitly stated in the session config
> > if the lens is available? Then, AF can fail in init() if lens
> > are not available.
> >
>
> Let's take a step back for a second.
>
> We have an updateControls() function, that starting for the static map
> rkisp1Controls augments it with controls whose values are computed by
> inspecting the sensorControls.
>
> Can't we do the same for the lens controls ? Add them only
> conditionally to the validity of lensControls ? Then if we deem it
> better we can pass to each algorithm the sensor's and lens
> configuration and have them populate the list of controls they handle.
>

Right, this makes sense. I can rework the code like this.
Also, don't you think it is worth to fail the AF init if it was
enabled on camera without moveable lens?

>
> > This will work for lens, but I am afraid We will not be able to
> > evaluate all AF ControlInfo elements in the init() phase.
> > For example, AF window size limits depend on the sensor output size,
> > which is only available in the configure().
>
> updateControls() has access to sensorInfo which contains the sensor's
> output size

Ah, I didn't notice that... In such case this is not a problem :)

>
> >
> > Best regards
> > Daniel
> >
> > >
> > > >
> > > > --
> > > > Kieran
> > > >
> > > >
> > > > > Otherwise
> > > > > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> > > > >
> > > > > > + { &controls::AfPause, ControlInfo(controls::AfPauseValues) },
> > > > > > + { &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },
> > > > > > + { &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
> > > > >
> > > > > We should -really- move to instantiate control limits directly based
> > > > > on the sensor configuration...
> > > > >
> > > > > >           { &controls::AwbEnable, ControlInfo(false, true) },
> > > > > >           { &controls::ColourGains, ControlInfo(0.0f, 3.996f, 1.0f) },
> > > > > >           { &controls::Brightness, ControlInfo(-1.0f, 0.993f, 0.0f) },
> > > > > >           { &controls::Contrast, ControlInfo(0.0f, 1.993f, 1.0f) },
> > > > > > + { &controls::LensPosition, ControlInfo(0.0f, 2147483647.0f) },
> > > > > >           { &controls::Saturation, ControlInfo(0.0f, 1.993f, 1.0f) },
> > > > > >           { &controls::Sharpness, ControlInfo(0.0f, 10.0f, 1.0f) },
> > > > > >           { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
> > > > > > --
> > > > > > 2.39.2
> > > > > >
Jacopo Mondi March 27, 2023, 12:36 p.m. UTC | #7
Hi Daniel

On Mon, Mar 27, 2023 at 01:48:28PM +0200, Daniel Semkowicz wrote:
> On Mon, Mar 27, 2023 at 1:07 PM Jacopo Mondi
> <jacopo.mondi@ideasonboard.com> wrote:
> >
> > Hi Daniel
> >
> > On Mon, Mar 27, 2023 at 12:13:51PM +0200, Daniel Semkowicz via libcamera-devel wrote:
> > > Hi Jacopo, Hi Kieran,
> > >
> > > On Sat, Mar 25, 2023 at 10:27 AM Jacopo Mondi
> > > <jacopo.mondi@ideasonboard.com> wrote:
> > > >
> > > > Hi Kieran
> > > >
> > > > On Fri, Mar 24, 2023 at 03:47:53PM +0000, Kieran Bingham wrote:
> > > > >
> > > > >
> > > > > On 24/03/2023 15:42, Jacopo Mondi via libcamera-devel wrote:
> > > > > > Hi daniel
> > > > > >
> > > > > > On Fri, Mar 24, 2023 at 03:29:06PM +0100, Daniel Semkowicz via libcamera-devel wrote:
> > > > > > > Add controls supported by the AF algorithm to the list of controls
> > > > > > > supported by the RkISP1 IPA. This exposes the AF controls to the user
> > > > > > > and allows controlling the AF algorithm using the top level API.
> > > > > > >
> > > > > > > Signed-off-by: Daniel Semkowicz <dse@thaumatec.com>
> > > > > > > ---
> > > > > > >   src/ipa/rkisp1/rkisp1.cpp | 6 ++++++
> > > > > > >   1 file changed, 6 insertions(+)
> > > > > > >
> > > > > > > diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> > > > > > > index cd1fbae3..4b30844f 100644
> > > > > > > --- a/src/ipa/rkisp1/rkisp1.cpp
> > > > > > > +++ b/src/ipa/rkisp1/rkisp1.cpp
> > > > > > > @@ -101,10 +101,16 @@ namespace {
> > > > > > >   /* List of controls handled by the RkISP1 IPA */
> > > > > > >   const ControlInfoMap::Map rkisp1Controls{
> > > > > > >           { &controls::AeEnable, ControlInfo(false, true) },
> > > > > > > + { &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },
> > > > > > > + { &controls::AfMode, ControlInfo(controls::AfModeValues) },
> > > > > >
> > > > > > AfPauseDeferred is not supported
> > > > > >
> > > > >
> > > > > What happens if there's no VCM though - Should we only expose the controls
> > > >
> > > > You're very right, I overlooked that.
> > > >
> > > > > if a VCM is identified? (Though that requires reworking the creation of this
> > > > > rkisp1Controls list to be handled by the algorithms)
> > > >
> > > > I'm not sure it needs to be done by algorithms, but the IPA should
> > > > certainly be made aware of the lens presence at init() time.
> > >
> > > This is indeed something that is needed, especially that number
> > > of algorithm implementations is increasing. The most appropriate
> > > solution seems for the algorithms to expose the supported control list
> > > or to populate the list. This would also fix the problem of checking
> > > outside the algorithm, if certain configuration is available, like
> > > lens.
> > >
> > > I see at least two problems with the current approach:
> > > 1. controls are exposed by the IPA, even if the algorithm is not
> > >    enabled in the tuning file. This is confusing.
> >
> > Agreed
> >
> > > 2. What if there are, for example, two AF algorithm implementations,
> > >    with different supported controls? Which controls should be added
> > >    to the control list?
> >
> > Handling multiple algos for the same functions is not something I
> > think there's a design for at the moment.
> >
> > If we defer registering ControlInfo to the single algorithms I guess
> > the problem then reduces on how to run-time select which algorithm
> > implementation to use.
>
> I meant the current situation with ControlInfo map populated
> in the IPA instead in algorithms itself. As you said, this should not
> be a problem with the controls handled in the algorithms.
>
> >
> > >
> > > >
> > > > To be honest I would be fine with what RPi does in this regard. have a
> > > > look at the usage of lensPresent_ in their IPA module init() function.
> > > > This looks like the less invasive change.
> > > >
> > > > I presume this could even be made better by passing the lens controls'
> > > > from the PH to the IPA at init() time so that the AF ControlInfo
> > > > elements could be initialized with the proper limits and not with
> > > > default values as it happens here and on RPi.
> > >
> > > For me, moving it to init() is also a better solution. I would like to
> > > avoid intermediate steps and initialize IPA lens config in one place
> > > for clarity. This means the whole lens configuration that's currently
> > > done in the configure(), will need to be moved to init().
> >
> > The part about the lens in configure() intializes
> >
> >         lensConfig.minFocusPosition = focusAbsolute.min().get<int32_t>();
> >         lensConfig.maxFocusPosition = focusAbsolute.max().get<int32_t>();
> >
> > As you said, the lens min/max position -shouldn't- change between
> > configurations so this part could be moved at init() time
> >
> > > However, I see one problem. context_.configuration struct is reset
> > > in configure() for some reason. Even that
> > > context_.configuration.sensor.lineDuration is set in init().  It is
> > > reset and set again.
> >
> > The other parameters (such as the gains and shutter speed) change
> > depending on the currently configured sensor's mode, that's why
> > they're re-calculated at each configure() call.
> >
> > >
> > > What about making the IPASessionConfiguration::lens structure
> > > std::optional, so it will be explicitly stated in the session config
> > > if the lens is available? Then, AF can fail in init() if lens
> > > are not available.
> > >
> >
> > Let's take a step back for a second.
> >
> > We have an updateControls() function, that starting for the static map
> > rkisp1Controls augments it with controls whose values are computed by
> > inspecting the sensorControls.
> >
> > Can't we do the same for the lens controls ? Add them only
> > conditionally to the validity of lensControls ? Then if we deem it
> > better we can pass to each algorithm the sensor's and lens
> > configuration and have them populate the list of controls they handle.
> >
>
> Right, this makes sense. I can rework the code like this.
> Also, don't you think it is worth to fail the AF init if it was
> enabled on camera without moveable lens?
>

mmm, that would make the whole IPA initialization fail if I'm not
mistaken. The algorithm is enabled by the sensor configuration file,
which indeed shouldn't include it if the device doesn't have a lens.

It also seems to me that if we don't fail, the AF algorithm
implementation would need to protect agains a missing lens with

        if (!context.configuration.lens)
                return 0;

in all its methods, as it will be part of the list of active
algorithms, and I'm not sure it's worth it.

If you agree with the above, then yes, I guess we should fail in
init() if no lens is available.


> >
> > > This will work for lens, but I am afraid We will not be able to
> > > evaluate all AF ControlInfo elements in the init() phase.
> > > For example, AF window size limits depend on the sensor output size,
> > > which is only available in the configure().
> >
> > updateControls() has access to sensorInfo which contains the sensor's
> > output size
>
> Ah, I didn't notice that... In such case this is not a problem :)
>
> >
> > >
> > > Best regards
> > > Daniel
> > >
> > > >
> > > > >
> > > > > --
> > > > > Kieran
> > > > >
> > > > >
> > > > > > Otherwise
> > > > > > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> > > > > >
> > > > > > > + { &controls::AfPause, ControlInfo(controls::AfPauseValues) },
> > > > > > > + { &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },
> > > > > > > + { &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
> > > > > >
> > > > > > We should -really- move to instantiate control limits directly based
> > > > > > on the sensor configuration...
> > > > > >
> > > > > > >           { &controls::AwbEnable, ControlInfo(false, true) },
> > > > > > >           { &controls::ColourGains, ControlInfo(0.0f, 3.996f, 1.0f) },
> > > > > > >           { &controls::Brightness, ControlInfo(-1.0f, 0.993f, 0.0f) },
> > > > > > >           { &controls::Contrast, ControlInfo(0.0f, 1.993f, 1.0f) },
> > > > > > > + { &controls::LensPosition, ControlInfo(0.0f, 2147483647.0f) },
> > > > > > >           { &controls::Saturation, ControlInfo(0.0f, 1.993f, 1.0f) },
> > > > > > >           { &controls::Sharpness, ControlInfo(0.0f, 10.0f, 1.0f) },
> > > > > > >           { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
> > > > > > > --
> > > > > > > 2.39.2
> > > > > > >
Daniel Semkowicz March 27, 2023, 12:59 p.m. UTC | #8
On Mon, Mar 27, 2023 at 2:37 PM Jacopo Mondi
<jacopo.mondi@ideasonboard.com> wrote:
>
> Hi Daniel
>
> On Mon, Mar 27, 2023 at 01:48:28PM +0200, Daniel Semkowicz wrote:
> > On Mon, Mar 27, 2023 at 1:07 PM Jacopo Mondi
> > <jacopo.mondi@ideasonboard.com> wrote:
> > >
> > > Hi Daniel
> > >
> > > On Mon, Mar 27, 2023 at 12:13:51PM +0200, Daniel Semkowicz via libcamera-devel wrote:
> > > > Hi Jacopo, Hi Kieran,
> > > >
> > > > On Sat, Mar 25, 2023 at 10:27 AM Jacopo Mondi
> > > > <jacopo.mondi@ideasonboard.com> wrote:
> > > > >
> > > > > Hi Kieran
> > > > >
> > > > > On Fri, Mar 24, 2023 at 03:47:53PM +0000, Kieran Bingham wrote:
> > > > > >
> > > > > >
> > > > > > On 24/03/2023 15:42, Jacopo Mondi via libcamera-devel wrote:
> > > > > > > Hi daniel
> > > > > > >
> > > > > > > On Fri, Mar 24, 2023 at 03:29:06PM +0100, Daniel Semkowicz via libcamera-devel wrote:
> > > > > > > > Add controls supported by the AF algorithm to the list of controls
> > > > > > > > supported by the RkISP1 IPA. This exposes the AF controls to the user
> > > > > > > > and allows controlling the AF algorithm using the top level API.
> > > > > > > >
> > > > > > > > Signed-off-by: Daniel Semkowicz <dse@thaumatec.com>
> > > > > > > > ---
> > > > > > > >   src/ipa/rkisp1/rkisp1.cpp | 6 ++++++
> > > > > > > >   1 file changed, 6 insertions(+)
> > > > > > > >
> > > > > > > > diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> > > > > > > > index cd1fbae3..4b30844f 100644
> > > > > > > > --- a/src/ipa/rkisp1/rkisp1.cpp
> > > > > > > > +++ b/src/ipa/rkisp1/rkisp1.cpp
> > > > > > > > @@ -101,10 +101,16 @@ namespace {
> > > > > > > >   /* List of controls handled by the RkISP1 IPA */
> > > > > > > >   const ControlInfoMap::Map rkisp1Controls{
> > > > > > > >           { &controls::AeEnable, ControlInfo(false, true) },
> > > > > > > > + { &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },
> > > > > > > > + { &controls::AfMode, ControlInfo(controls::AfModeValues) },
> > > > > > >
> > > > > > > AfPauseDeferred is not supported
> > > > > > >
> > > > > >
> > > > > > What happens if there's no VCM though - Should we only expose the controls
> > > > >
> > > > > You're very right, I overlooked that.
> > > > >
> > > > > > if a VCM is identified? (Though that requires reworking the creation of this
> > > > > > rkisp1Controls list to be handled by the algorithms)
> > > > >
> > > > > I'm not sure it needs to be done by algorithms, but the IPA should
> > > > > certainly be made aware of the lens presence at init() time.
> > > >
> > > > This is indeed something that is needed, especially that number
> > > > of algorithm implementations is increasing. The most appropriate
> > > > solution seems for the algorithms to expose the supported control list
> > > > or to populate the list. This would also fix the problem of checking
> > > > outside the algorithm, if certain configuration is available, like
> > > > lens.
> > > >
> > > > I see at least two problems with the current approach:
> > > > 1. controls are exposed by the IPA, even if the algorithm is not
> > > >    enabled in the tuning file. This is confusing.
> > >
> > > Agreed
> > >
> > > > 2. What if there are, for example, two AF algorithm implementations,
> > > >    with different supported controls? Which controls should be added
> > > >    to the control list?
> > >
> > > Handling multiple algos for the same functions is not something I
> > > think there's a design for at the moment.
> > >
> > > If we defer registering ControlInfo to the single algorithms I guess
> > > the problem then reduces on how to run-time select which algorithm
> > > implementation to use.
> >
> > I meant the current situation with ControlInfo map populated
> > in the IPA instead in algorithms itself. As you said, this should not
> > be a problem with the controls handled in the algorithms.
> >
> > >
> > > >
> > > > >
> > > > > To be honest I would be fine with what RPi does in this regard. have a
> > > > > look at the usage of lensPresent_ in their IPA module init() function.
> > > > > This looks like the less invasive change.
> > > > >
> > > > > I presume this could even be made better by passing the lens controls'
> > > > > from the PH to the IPA at init() time so that the AF ControlInfo
> > > > > elements could be initialized with the proper limits and not with
> > > > > default values as it happens here and on RPi.
> > > >
> > > > For me, moving it to init() is also a better solution. I would like to
> > > > avoid intermediate steps and initialize IPA lens config in one place
> > > > for clarity. This means the whole lens configuration that's currently
> > > > done in the configure(), will need to be moved to init().
> > >
> > > The part about the lens in configure() intializes
> > >
> > >         lensConfig.minFocusPosition = focusAbsolute.min().get<int32_t>();
> > >         lensConfig.maxFocusPosition = focusAbsolute.max().get<int32_t>();
> > >
> > > As you said, the lens min/max position -shouldn't- change between
> > > configurations so this part could be moved at init() time
> > >
> > > > However, I see one problem. context_.configuration struct is reset
> > > > in configure() for some reason. Even that
> > > > context_.configuration.sensor.lineDuration is set in init().  It is
> > > > reset and set again.
> > >
> > > The other parameters (such as the gains and shutter speed) change
> > > depending on the currently configured sensor's mode, that's why
> > > they're re-calculated at each configure() call.
> > >
> > > >
> > > > What about making the IPASessionConfiguration::lens structure
> > > > std::optional, so it will be explicitly stated in the session config
> > > > if the lens is available? Then, AF can fail in init() if lens
> > > > are not available.
> > > >
> > >
> > > Let's take a step back for a second.
> > >
> > > We have an updateControls() function, that starting for the static map
> > > rkisp1Controls augments it with controls whose values are computed by
> > > inspecting the sensorControls.
> > >
> > > Can't we do the same for the lens controls ? Add them only
> > > conditionally to the validity of lensControls ? Then if we deem it
> > > better we can pass to each algorithm the sensor's and lens
> > > configuration and have them populate the list of controls they handle.
> > >
> >
> > Right, this makes sense. I can rework the code like this.
> > Also, don't you think it is worth to fail the AF init if it was
> > enabled on camera without moveable lens?
> >
>
> mmm, that would make the whole IPA initialization fail if I'm not
> mistaken. The algorithm is enabled by the sensor configuration file,
> which indeed shouldn't include it if the device doesn't have a lens.

Yes, but I think it is better to fail early on startup, than trying
to make sure there will be no side effects when someone will try to
use the AF with wrong configuration.


>
> It also seems to me that if we don't fail, the AF algorithm
> implementation would need to protect agains a missing lens with
>
>         if (!context.configuration.lens)
>                 return 0;
>
> in all its methods, as it will be part of the list of active
> algorithms, and I'm not sure it's worth it.
>
> If you agree with the above, then yes, I guess we should fail in
> init() if no lens is available.


Yes, I agree and it is simpler to do one check in the Af::init()

>
>
> > >
> > > > This will work for lens, but I am afraid We will not be able to
> > > > evaluate all AF ControlInfo elements in the init() phase.
> > > > For example, AF window size limits depend on the sensor output size,
> > > > which is only available in the configure().
> > >
> > > updateControls() has access to sensorInfo which contains the sensor's
> > > output size
> >
> > Ah, I didn't notice that... In such case this is not a problem :)
> >
> > >
> > > >
> > > > Best regards
> > > > Daniel
> > > >
> > > > >
> > > > > >
> > > > > > --
> > > > > > Kieran
> > > > > >
> > > > > >
> > > > > > > Otherwise
> > > > > > > Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
> > > > > > >
> > > > > > > > + { &controls::AfPause, ControlInfo(controls::AfPauseValues) },
> > > > > > > > + { &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },
> > > > > > > > + { &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
> > > > > > >
> > > > > > > We should -really- move to instantiate control limits directly based
> > > > > > > on the sensor configuration...
> > > > > > >
> > > > > > > >           { &controls::AwbEnable, ControlInfo(false, true) },
> > > > > > > >           { &controls::ColourGains, ControlInfo(0.0f, 3.996f, 1.0f) },
> > > > > > > >           { &controls::Brightness, ControlInfo(-1.0f, 0.993f, 0.0f) },
> > > > > > > >           { &controls::Contrast, ControlInfo(0.0f, 1.993f, 1.0f) },
> > > > > > > > + { &controls::LensPosition, ControlInfo(0.0f, 2147483647.0f) },
> > > > > > > >           { &controls::Saturation, ControlInfo(0.0f, 1.993f, 1.0f) },
> > > > > > > >           { &controls::Sharpness, ControlInfo(0.0f, 10.0f, 1.0f) },
> > > > > > > >           { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },
> > > > > > > > --
> > > > > > > > 2.39.2
> > > > > > > >

Patch
diff mbox series

diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index cd1fbae3..4b30844f 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -101,10 +101,16 @@  namespace {
 /* List of controls handled by the RkISP1 IPA */
 const ControlInfoMap::Map rkisp1Controls{
 	{ &controls::AeEnable, ControlInfo(false, true) },
+	{ &controls::AfMetering, ControlInfo(controls::AfMeteringValues) },
+	{ &controls::AfMode, ControlInfo(controls::AfModeValues) },
+	{ &controls::AfPause, ControlInfo(controls::AfPauseValues) },
+	{ &controls::AfTrigger, ControlInfo(controls::AfTriggerValues) },
+	{ &controls::AfWindows, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) },
 	{ &controls::AwbEnable, ControlInfo(false, true) },
 	{ &controls::ColourGains, ControlInfo(0.0f, 3.996f, 1.0f) },
 	{ &controls::Brightness, ControlInfo(-1.0f, 0.993f, 0.0f) },
 	{ &controls::Contrast, ControlInfo(0.0f, 1.993f, 1.0f) },
+	{ &controls::LensPosition, ControlInfo(0.0f, 2147483647.0f) },
 	{ &controls::Saturation, ControlInfo(0.0f, 1.993f, 1.0f) },
 	{ &controls::Sharpness, ControlInfo(0.0f, 10.0f, 1.0f) },
 	{ &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) },