[libcamera-devel,v2,1/2] libcamera: camera: Add a mode sensitivity field
diff mbox series

Message ID 20210922132915.14881-2-david.plowman@raspberrypi.com
State Superseded
Headers show
Series
  • Application support for per-mode sensitivities
Related show

Commit Message

David Plowman Sept. 22, 2021, 1:29 p.m. UTC
The modeSensitivity field is a number that describes how sensitive the
selected sensor mode is compared to other readout modes of the same
sensor. For example, a binned mode might have twice the sensitivity of
the full resolution mode, meaning you would get double the signal
level for the same exposure and gains.

Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
---
 include/libcamera/camera.h |  2 ++
 src/libcamera/camera.cpp   | 16 +++++++++++++++-
 2 files changed, 17 insertions(+), 1 deletion(-)

Comments

Kieran Bingham Jan. 4, 2022, 10:58 a.m. UTC | #1
Quoting David Plowman (2021-09-22 14:29:14)
> The modeSensitivity field is a number that describes how sensitive the
> selected sensor mode is compared to other readout modes of the same
> sensor. For example, a binned mode might have twice the sensitivity of
> the full resolution mode, meaning you would get double the signal
> level for the same exposure and gains.

Is there a way to define which is the 'base' level?

Or does it not matter, as it's all relative (but relative to what I
guess is my question).

I.e. Does it matter, or is it necessary to know that Mode A is 'half' as
sensitive as Mode B?

In fact, I think that's already a given as whatever the pipeline handler
does will be relative. I.e. it would be about comparing the value
against other configurations not a standalone value.

> 
> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
> ---
>  include/libcamera/camera.h |  2 ++
>  src/libcamera/camera.cpp   | 16 +++++++++++++++-
>  2 files changed, 17 insertions(+), 1 deletion(-)
> 
> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
> index 601ee46e..3314c06b 100644
> --- a/include/libcamera/camera.h
> +++ b/include/libcamera/camera.h
> @@ -66,6 +66,8 @@ public:
>  
>         Transform transform;
>  
> +       float modeSensitivity;
> +
>  protected:
>         CameraConfiguration();
>  
> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> index 71809bcd..8d795dff 100644
> --- a/src/libcamera/camera.cpp
> +++ b/src/libcamera/camera.cpp
> @@ -156,7 +156,7 @@ LOG_DECLARE_CATEGORY(Camera)
>   * \brief Create an empty camera configuration
>   */
>  CameraConfiguration::CameraConfiguration()
> -       : transform(Transform::Identity), config_({})
> +       : transform(Transform::Identity), modeSensitivity(1.0), config_({})
>  {
>  }
>  
> @@ -327,6 +327,20 @@ std::size_t CameraConfiguration::size() const
>   * may adjust this field at its discretion if the selection is not supported.
>   */
>  
> +/**
> + * \var CameraConfiguration::modeSensitivity
> + * \brief The relative sensitivity of the chosen sensor mode
> + *
> + * Some sensors have readout modes with different sensitivities. For example,
> + * a binned camera mode might, with the same exposure and gains, produce
> + * twice the signal level of the full resolution readout. This would be
> + * signalled by the binned mode, when it is chosen, indicating a value here
> + * that is twice that of the full resolution mode.
> + *
> + * This value should only be read, and not set, by the user. It will be
> + * valid after the configure method has reteurned successfully.
> + */
> +

I bet we've discussed this in the past, but I can't recall. If there are
more of these properties, I would suspect they should be in a
ControlList somehow - but if there's not expected to be many, an
explicit field is fine to me, and I can see the importance of conveying
this information.


I was also going to say perhaps we need some testing on this in
lc-compliance, but given that the default is 1.0 for all camera
configurations - I think that's fine. It wouldn't be something we could
easily test anyway.

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>



>  /**
>   * \var CameraConfiguration::config_
>   * \brief The vector of stream configurations
> -- 
> 2.20.1
>
David Plowman Jan. 4, 2022, 1:30 p.m. UTC | #2
Hi Kieran

Thanks for the reply.

On Tue, 4 Jan 2022 at 10:58, Kieran Bingham
<kieran.bingham@ideasonboard.com> wrote:
>
> Quoting David Plowman (2021-09-22 14:29:14)
> > The modeSensitivity field is a number that describes how sensitive the
> > selected sensor mode is compared to other readout modes of the same
> > sensor. For example, a binned mode might have twice the sensitivity of
> > the full resolution mode, meaning you would get double the signal
> > level for the same exposure and gains.
>
> Is there a way to define which is the 'base' level?

I suppose the "base level" would correspond to the mode that gives you
the lowest signal. But as per the discussion below, it's all relative
so doesn't matter unless we want to ascribe a particular meaning.

>
> Or does it not matter, as it's all relative (but relative to what I
> guess is my question).
>
> I.e. Does it matter, or is it necessary to know that Mode A is 'half' as
> sensitive as Mode B?
>
> In fact, I think that's already a given as whatever the pipeline handler
> does will be relative. I.e. it would be about comparing the value
> against other configurations not a standalone value.
>
> >
> > Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
> > ---
> >  include/libcamera/camera.h |  2 ++
> >  src/libcamera/camera.cpp   | 16 +++++++++++++++-
> >  2 files changed, 17 insertions(+), 1 deletion(-)
> >
> > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
> > index 601ee46e..3314c06b 100644
> > --- a/include/libcamera/camera.h
> > +++ b/include/libcamera/camera.h
> > @@ -66,6 +66,8 @@ public:
> >
> >         Transform transform;
> >
> > +       float modeSensitivity;
> > +
> >  protected:
> >         CameraConfiguration();
> >
> > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> > index 71809bcd..8d795dff 100644
> > --- a/src/libcamera/camera.cpp
> > +++ b/src/libcamera/camera.cpp
> > @@ -156,7 +156,7 @@ LOG_DECLARE_CATEGORY(Camera)
> >   * \brief Create an empty camera configuration
> >   */
> >  CameraConfiguration::CameraConfiguration()
> > -       : transform(Transform::Identity), config_({})
> > +       : transform(Transform::Identity), modeSensitivity(1.0), config_({})
> >  {
> >  }
> >
> > @@ -327,6 +327,20 @@ std::size_t CameraConfiguration::size() const
> >   * may adjust this field at its discretion if the selection is not supported.
> >   */
> >
> > +/**
> > + * \var CameraConfiguration::modeSensitivity
> > + * \brief The relative sensitivity of the chosen sensor mode
> > + *
> > + * Some sensors have readout modes with different sensitivities. For example,
> > + * a binned camera mode might, with the same exposure and gains, produce
> > + * twice the signal level of the full resolution readout. This would be
> > + * signalled by the binned mode, when it is chosen, indicating a value here
> > + * that is twice that of the full resolution mode.
> > + *
> > + * This value should only be read, and not set, by the user. It will be
> > + * valid after the configure method has reteurned successfully.
> > + */
> > +
>
> I bet we've discussed this in the past, but I can't recall. If there are
> more of these properties, I would suspect they should be in a
> ControlList somehow - but if there's not expected to be many, an
> explicit field is fine to me, and I can see the importance of conveying
> this information.

Yes, that's a good thought. One thing to note is that we need this
value back during "configure", so you can calculate the right
exposure/gain before calling "start". Could the configure method
return a list of control values, I wonder?

>
>
> I was also going to say perhaps we need some testing on this in
> lc-compliance, but given that the default is 1.0 for all camera
> configurations - I think that's fine. It wouldn't be something we could
> easily test anyway.

I have a sensor I'm working on that requires this feature - hopefully
it won't be too long before others can try it!

Thanks
David

>
> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
>
>
>
> >  /**
> >   * \var CameraConfiguration::config_
> >   * \brief The vector of stream configurations
> > --
> > 2.20.1
> >
Kieran Bingham Feb. 9, 2022, 12:12 p.m. UTC | #3
Hi David,

Quoting David Plowman (2022-01-04 13:30:03)
> Hi Kieran
> 
> Thanks for the reply.
> 
> On Tue, 4 Jan 2022 at 10:58, Kieran Bingham
> <kieran.bingham@ideasonboard.com> wrote:
> >
> > Quoting David Plowman (2021-09-22 14:29:14)
> > > The modeSensitivity field is a number that describes how sensitive the
> > > selected sensor mode is compared to other readout modes of the same
> > > sensor. For example, a binned mode might have twice the sensitivity of
> > > the full resolution mode, meaning you would get double the signal
> > > level for the same exposure and gains.
> >
> > Is there a way to define which is the 'base' level?
> 
> I suppose the "base level" would correspond to the mode that gives you
> the lowest signal. But as per the discussion below, it's all relative
> so doesn't matter unless we want to ascribe a particular meaning.
> 
> >
> > Or does it not matter, as it's all relative (but relative to what I
> > guess is my question).
> >
> > I.e. Does it matter, or is it necessary to know that Mode A is 'half' as
> > sensitive as Mode B?
> >
> > In fact, I think that's already a given as whatever the pipeline handler
> > does will be relative. I.e. it would be about comparing the value
> > against other configurations not a standalone value.
> >
> > >
> > > Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
> > > ---
> > >  include/libcamera/camera.h |  2 ++
> > >  src/libcamera/camera.cpp   | 16 +++++++++++++++-
> > >  2 files changed, 17 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
> > > index 601ee46e..3314c06b 100644
> > > --- a/include/libcamera/camera.h
> > > +++ b/include/libcamera/camera.h
> > > @@ -66,6 +66,8 @@ public:
> > >
> > >         Transform transform;
> > >
> > > +       float modeSensitivity;
> > > +
> > >  protected:
> > >         CameraConfiguration();
> > >
> > > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> > > index 71809bcd..8d795dff 100644
> > > --- a/src/libcamera/camera.cpp
> > > +++ b/src/libcamera/camera.cpp
> > > @@ -156,7 +156,7 @@ LOG_DECLARE_CATEGORY(Camera)
> > >   * \brief Create an empty camera configuration
> > >   */
> > >  CameraConfiguration::CameraConfiguration()
> > > -       : transform(Transform::Identity), config_({})
> > > +       : transform(Transform::Identity), modeSensitivity(1.0), config_({})
> > >  {
> > >  }
> > >
> > > @@ -327,6 +327,20 @@ std::size_t CameraConfiguration::size() const
> > >   * may adjust this field at its discretion if the selection is not supported.
> > >   */
> > >
> > > +/**
> > > + * \var CameraConfiguration::modeSensitivity
> > > + * \brief The relative sensitivity of the chosen sensor mode
> > > + *
> > > + * Some sensors have readout modes with different sensitivities. For example,
> > > + * a binned camera mode might, with the same exposure and gains, produce
> > > + * twice the signal level of the full resolution readout. This would be
> > > + * signalled by the binned mode, when it is chosen, indicating a value here
> > > + * that is twice that of the full resolution mode.
> > > + *
> > > + * This value should only be read, and not set, by the user. It will be
> > > + * valid after the configure method has reteurned successfully.

s/reteurned/returned/

> > > + */
> > > +
> >
> > I bet we've discussed this in the past, but I can't recall. If there are
> > more of these properties, I would suspect they should be in a
> > ControlList somehow - but if there's not expected to be many, an
> > explicit field is fine to me, and I can see the importance of conveying
> > this information.
> 
> Yes, that's a good thought. One thing to note is that we need this
> value back during "configure", so you can calculate the right
> exposure/gain before calling "start". Could the configure method
> return a list of control values, I wonder?

I'm sure a ControlList could be returned somewhere, or it could be a
part of the CameraConfiguration structure itself.

The difficulty is that if we extend the structure here, it's an ABI
break / change, but if we have a ControlList to return these properties
- it can be updated/added to without breaking API/ABI compatibility.

Looking at CameraConfiguration now, I see we have:

 Transform transform;

Which could be considered a configuration property to put in a
ControlList too. And ... maybe there might be some ColourSpace property
to declare on the whole camera, rather than per stream? (Only because I
see a flag ColorSpaceFlag about whether ColorSpaces are per-stream or not)

Would you consider a Transform and a ModeSensitivity to be something
that could be grouped together as CameraConfiguration::properties() ?

Or does that become more complicated?

> > I was also going to say perhaps we need some testing on this in
> > lc-compliance, but given that the default is 1.0 for all camera
> > configurations - I think that's fine. It wouldn't be something we could
> > easily test anyway.
> 
> I have a sensor I'm working on that requires this feature - hopefully
> it won't be too long before others can try it!
> 
> Thanks
> David
> 
> >
> > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> >
> >
> >
> > >  /**
> > >   * \var CameraConfiguration::config_
> > >   * \brief The vector of stream configurations
> > > --
> > > 2.20.1
> > >
David Plowman Feb. 9, 2022, 12:59 p.m. UTC | #4
Hi Kieran


On Wed, 9 Feb 2022 at 12:12, Kieran Bingham
<kieran.bingham@ideasonboard.com> wrote:
>
> Hi David,
>
> Quoting David Plowman (2022-01-04 13:30:03)
> > Hi Kieran
> >
> > Thanks for the reply.
> >
> > On Tue, 4 Jan 2022 at 10:58, Kieran Bingham
> > <kieran.bingham@ideasonboard.com> wrote:
> > >
> > > Quoting David Plowman (2021-09-22 14:29:14)
> > > > The modeSensitivity field is a number that describes how sensitive the
> > > > selected sensor mode is compared to other readout modes of the same
> > > > sensor. For example, a binned mode might have twice the sensitivity of
> > > > the full resolution mode, meaning you would get double the signal
> > > > level for the same exposure and gains.
> > >
> > > Is there a way to define which is the 'base' level?
> >
> > I suppose the "base level" would correspond to the mode that gives you
> > the lowest signal. But as per the discussion below, it's all relative
> > so doesn't matter unless we want to ascribe a particular meaning.
> >
> > >
> > > Or does it not matter, as it's all relative (but relative to what I
> > > guess is my question).
> > >
> > > I.e. Does it matter, or is it necessary to know that Mode A is 'half' as
> > > sensitive as Mode B?
> > >
> > > In fact, I think that's already a given as whatever the pipeline handler
> > > does will be relative. I.e. it would be about comparing the value
> > > against other configurations not a standalone value.
> > >
> > > >
> > > > Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
> > > > ---
> > > >  include/libcamera/camera.h |  2 ++
> > > >  src/libcamera/camera.cpp   | 16 +++++++++++++++-
> > > >  2 files changed, 17 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
> > > > index 601ee46e..3314c06b 100644
> > > > --- a/include/libcamera/camera.h
> > > > +++ b/include/libcamera/camera.h
> > > > @@ -66,6 +66,8 @@ public:
> > > >
> > > >         Transform transform;
> > > >
> > > > +       float modeSensitivity;
> > > > +
> > > >  protected:
> > > >         CameraConfiguration();
> > > >
> > > > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> > > > index 71809bcd..8d795dff 100644
> > > > --- a/src/libcamera/camera.cpp
> > > > +++ b/src/libcamera/camera.cpp
> > > > @@ -156,7 +156,7 @@ LOG_DECLARE_CATEGORY(Camera)
> > > >   * \brief Create an empty camera configuration
> > > >   */
> > > >  CameraConfiguration::CameraConfiguration()
> > > > -       : transform(Transform::Identity), config_({})
> > > > +       : transform(Transform::Identity), modeSensitivity(1.0), config_({})
> > > >  {
> > > >  }
> > > >
> > > > @@ -327,6 +327,20 @@ std::size_t CameraConfiguration::size() const
> > > >   * may adjust this field at its discretion if the selection is not supported.
> > > >   */
> > > >
> > > > +/**
> > > > + * \var CameraConfiguration::modeSensitivity
> > > > + * \brief The relative sensitivity of the chosen sensor mode
> > > > + *
> > > > + * Some sensors have readout modes with different sensitivities. For example,
> > > > + * a binned camera mode might, with the same exposure and gains, produce
> > > > + * twice the signal level of the full resolution readout. This would be
> > > > + * signalled by the binned mode, when it is chosen, indicating a value here
> > > > + * that is twice that of the full resolution mode.
> > > > + *
> > > > + * This value should only be read, and not set, by the user. It will be
> > > > + * valid after the configure method has reteurned successfully.
>
> s/reteurned/returned/
>
> > > > + */
> > > > +
> > >
> > > I bet we've discussed this in the past, but I can't recall. If there are
> > > more of these properties, I would suspect they should be in a
> > > ControlList somehow - but if there's not expected to be many, an
> > > explicit field is fine to me, and I can see the importance of conveying
> > > this information.
> >
> > Yes, that's a good thought. One thing to note is that we need this
> > value back during "configure", so you can calculate the right
> > exposure/gain before calling "start". Could the configure method
> > return a list of control values, I wonder?
>
> I'm sure a ControlList could be returned somewhere, or it could be a
> part of the CameraConfiguration structure itself.
>
> The difficulty is that if we extend the structure here, it's an ABI
> break / change, but if we have a ControlList to return these properties
> - it can be updated/added to without breaking API/ABI compatibility.
>
> Looking at CameraConfiguration now, I see we have:
>
>  Transform transform;
>
> Which could be considered a configuration property to put in a
> ControlList too. And ... maybe there might be some ColourSpace property
> to declare on the whole camera, rather than per stream? (Only because I
> see a flag ColorSpaceFlag about whether ColorSpaces are per-stream or not)
>
> Would you consider a Transform and a ModeSensitivity to be something
> that could be grouped together as CameraConfiguration::properties() ?
>
> Or does that become more complicated?

Don't really mind, something like this could be in the properties so
long as it gets updated correctly once you've set the camera mode. As
long as the application can find out the magic number before calling
start().

David

>
> > > I was also going to say perhaps we need some testing on this in
> > > lc-compliance, but given that the default is 1.0 for all camera
> > > configurations - I think that's fine. It wouldn't be something we could
> > > easily test anyway.
> >
> > I have a sensor I'm working on that requires this feature - hopefully
> > it won't be too long before others can try it!
> >
> > Thanks
> > David
> >
> > >
> > > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
> > >
> > >
> > >
> > > >  /**
> > > >   * \var CameraConfiguration::config_
> > > >   * \brief The vector of stream configurations
> > > > --
> > > > 2.20.1
> > > >
Naushir Patuck April 13, 2022, 9:10 a.m. UTC | #5
Hi David,

Thank you for your work.

On Wed, 22 Sept 2021 at 14:29, David Plowman <david.plowman@raspberrypi.com>
wrote:

> The modeSensitivity field is a number that describes how sensitive the
> selected sensor mode is compared to other readout modes of the same
> sensor. For example, a binned mode might have twice the sensitivity of
> the full resolution mode, meaning you would get double the signal
> level for the same exposure and gains.
>
> Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
> ---
>  include/libcamera/camera.h |  2 ++
>  src/libcamera/camera.cpp   | 16 +++++++++++++++-
>  2 files changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
> index 601ee46e..3314c06b 100644
> --- a/include/libcamera/camera.h
> +++ b/include/libcamera/camera.h
> @@ -66,6 +66,8 @@ public:
>
>         Transform transform;
>
> +       float modeSensitivity;
> +
>  protected:
>         CameraConfiguration();
>
> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
> index 71809bcd..8d795dff 100644
> --- a/src/libcamera/camera.cpp
> +++ b/src/libcamera/camera.cpp
> @@ -156,7 +156,7 @@ LOG_DECLARE_CATEGORY(Camera)
>   * \brief Create an empty camera configuration
>   */
>  CameraConfiguration::CameraConfiguration()
> -       : transform(Transform::Identity), config_({})
> +       : transform(Transform::Identity), modeSensitivity(1.0), config_({})
>  {
>  }
>
> @@ -327,6 +327,20 @@ std::size_t CameraConfiguration::size() const
>   * may adjust this field at its discretion if the selection is not
> supported.
>   */
>
> +/**
> + * \var CameraConfiguration::modeSensitivity
> + * \brief The relative sensitivity of the chosen sensor mode
> + *
> + * Some sensors have readout modes with different sensitivities. For
> example,
> + * a binned camera mode might, with the same exposure and gains, produce
> + * twice the signal level of the full resolution readout. This would be
> + * signalled by the binned mode, when it is chosen, indicating a value
> here
> + * that is twice that of the full resolution mode.
> + *
> + * This value should only be read, and not set, by the user. It will be
> + * valid after the configure method has reteurned successfully.
>

s/reteurned/returned/

Aparat from that:

Reviewed-by: Naushir Patuck <naush@raspberrypi.com>


> + */
> +
>  /**
>   * \var CameraConfiguration::config_
>   * \brief The vector of stream configurations
> --
> 2.20.1
>
>

Patch
diff mbox series

diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
index 601ee46e..3314c06b 100644
--- a/include/libcamera/camera.h
+++ b/include/libcamera/camera.h
@@ -66,6 +66,8 @@  public:
 
 	Transform transform;
 
+	float modeSensitivity;
+
 protected:
 	CameraConfiguration();
 
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index 71809bcd..8d795dff 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -156,7 +156,7 @@  LOG_DECLARE_CATEGORY(Camera)
  * \brief Create an empty camera configuration
  */
 CameraConfiguration::CameraConfiguration()
-	: transform(Transform::Identity), config_({})
+	: transform(Transform::Identity), modeSensitivity(1.0), config_({})
 {
 }
 
@@ -327,6 +327,20 @@  std::size_t CameraConfiguration::size() const
  * may adjust this field at its discretion if the selection is not supported.
  */
 
+/**
+ * \var CameraConfiguration::modeSensitivity
+ * \brief The relative sensitivity of the chosen sensor mode
+ *
+ * Some sensors have readout modes with different sensitivities. For example,
+ * a binned camera mode might, with the same exposure and gains, produce
+ * twice the signal level of the full resolution readout. This would be
+ * signalled by the binned mode, when it is chosen, indicating a value here
+ * that is twice that of the full resolution mode.
+ *
+ * This value should only be read, and not set, by the user. It will be
+ * valid after the configure method has reteurned successfully.
+ */
+
 /**
  * \var CameraConfiguration::config_
  * \brief The vector of stream configurations