[libcamera-devel] [PATCH 6/9] libcamera: camera_sensor: Expose a DelayedControls interface

Naushir Patuck naush at raspberrypi.com
Wed Oct 28 12:51:13 CET 2020


Hi Niklas,

Thank you for the changes.  I will go through all the patches with review
comment in due course, but wanted to raise a critical point below:

On Wed, 28 Oct 2020 at 01:01, Niklas Söderlund <
niklas.soderlund at ragnatech.se> wrote:

> Expose the optional DelayedControls interface to pipeline handlers. If
> used by a pipeline generic delays are used. In the future the delay
> values should be fetched to match the specific sensor module, either
> from a new kernel interface or worst case a sensors database.
>
> Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
>  include/libcamera/internal/camera_sensor.h |  5 ++++
>  src/libcamera/camera_sensor.cpp            | 31 ++++++++++++++++++++++
>  2 files changed, 36 insertions(+)
>
> diff --git a/include/libcamera/internal/camera_sensor.h
> b/include/libcamera/internal/camera_sensor.h
> index b9eba89f00fba882..6be1cfd49134c534 100644
> --- a/include/libcamera/internal/camera_sensor.h
> +++ b/include/libcamera/internal/camera_sensor.h
> @@ -14,6 +14,7 @@
>  #include <libcamera/controls.h>
>  #include <libcamera/geometry.h>
>
> +#include "libcamera/internal/delayed_controls.h"
>  #include "libcamera/internal/formats.h"
>  #include "libcamera/internal/log.h"
>  #include "libcamera/internal/v4l2_subdevice.h"
> @@ -61,6 +62,8 @@ public:
>         ControlList getControls(const std::vector<uint32_t> &ids);
>         int setControls(ControlList *ctrls);
>
> +       DelayedControls *delayedContols();
> +
>         const ControlList &properties() const { return properties_; }
>         int sensorInfo(CameraSensorInfo *info) const;
>
> @@ -83,6 +86,8 @@ private:
>         std::vector<Size> sizes_;
>
>         ControlList properties_;
> +
> +       std::unique_ptr<DelayedControls> delayedControls_;
>  };
>
>  } /* namespace libcamera */
> diff --git a/src/libcamera/camera_sensor.cpp
> b/src/libcamera/camera_sensor.cpp
> index 935de528c4963453..6c92c97f4cc2547a 100644
> --- a/src/libcamera/camera_sensor.cpp
> +++ b/src/libcamera/camera_sensor.cpp
> @@ -493,6 +493,37 @@ int CameraSensor::setControls(ControlList *ctrls)
>         return subdev_->setControls(ctrls);
>  }
>
> +/**
> + * \brief Get the sensors delayed controls interface
> + *
> + * Access the sensors delayed controls interface. This interface aids
> pipelines
> + * keeping tack of controls that needs time to take effect. The interface
> is
> + * optional to use and does not interact with setControls() and
> getControls()
> + * that operates directly on the sensor device.
> + *
> + * \sa DelayedControls
> + * \return The delayed controls interface
> + */
> +DelayedControls *CameraSensor::delayedContols()
> +{
> +       if (!delayedControls_) {
> +               /*
> +                * \todo Read dealy values from the sensor itself or from a
> +                * a sensor database. For now use generic values taken from
> +                * the Raspberry Pi and listed as generic values.
> +                */
> +               std::unordered_map<uint32_t, unsigned int> delays = {
> +                       { V4L2_CID_ANALOGUE_GAIN, 1 },
> +                       { V4L2_CID_EXPOSURE, 2 },
> +               };
>

This will break the OV5647 sensor usage with Raspberry Pi without
referring back to a sensor database .  OV5647 has a delay of 2 for gain and
exposure, so will not work with the above hard-coded settings.

In a more general sense, I wonder if initialising the DelayedControl here
is the right thing to do?  I have some changes waiting to be submitted for
review that add framerate control to the Raspberry Pi stack.  In this
change, I've added a VBLANK control to the staggered writer.  There are
also some changes to control very long exposures on the imx477 that go
through the staggered writer.  In these cases, I would have to add values
to the map above, but other pipeline handlers would never need to use
them.  This may be a bit wasteful, I don't know...  Would it make more
sense for the pipeline handlers to initialise the DelayedControls as they
need to?

Regards,
Naush



> +
> +               delayedControls_ =
> +                       std::make_unique<DelayedControls>(subdev_.get(),
> delays);
> +       }
> +
> +       return delayedControls_.get();
> +}
> +
>  /**
>   * \brief Assemble and return the camera sensor info
>   * \param[out] info The camera sensor info
> --
> 2.29.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20201028/45c6845b/attachment.htm>


More information about the libcamera-devel mailing list