[libcamera-devel] [PATCH v1 3/3] pipeline: raspberrypi: Add a Unicam timeout override config options

David Plowman david.plowman at raspberrypi.com
Fri Feb 24 12:22:26 CET 2023


Hi Naush

Thanks for the patch.

On Thu, 23 Feb 2023 at 12:49, Naushir Patuck via libcamera-devel
<libcamera-devel at lists.libcamera.org> wrote:
>
> Add a new parameter to the pipeline handler config file named
> "unicam_timeout_value_ms" to allow users to override the automiatically

s/automiatically/automatically]

> computed Unicam timeout value.
>
> This value is given in milliseconds, and setting a value of 0 (the
> default value) disables the override.
>
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
> ---
>  .../pipeline/raspberrypi/data/example.yaml    | 11 ++++++-
>  .../pipeline/raspberrypi/raspberrypi.cpp      | 29 ++++++++++++++-----
>  2 files changed, 32 insertions(+), 8 deletions(-)
>
> diff --git a/src/libcamera/pipeline/raspberrypi/data/example.yaml b/src/libcamera/pipeline/raspberrypi/data/example.yaml
> index ad5f2344384f..5d4ca997b7a0 100644
> --- a/src/libcamera/pipeline/raspberrypi/data/example.yaml
> +++ b/src/libcamera/pipeline/raspberrypi/data/example.yaml
> @@ -32,6 +32,15 @@
>                  # Override any request from the IPA to drop a number of startup
>                  # frames.
>                  #
> -                # "disable_startup_frame_drops": false
> +                # "disable_startup_frame_drops": false,
> +
> +                # Custom timeout value (in ms) for Unicam to use. This overrides
> +                # the value computed by the pipeline handler based on frame
> +                # durations.
> +                #
> +                # Set this value to 0 to use the pipeline handler computed
> +                # timeout value.
> +                #
> +                # "unicam_timeout_value_ms": 0
>          }
>  }
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 3d04842a2440..7c8c66129014 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -319,6 +319,11 @@ public:
>                  * frames.
>                  */
>                 bool disableStartupFrameDrops;
> +               /*
> +                * Override the Unicam timeout value calculated by the IPA based
> +                * on frame durations.
> +                */
> +               unsigned int unicamTimeoutValue;
>         };
>
>         Config config_;
> @@ -1158,6 +1163,9 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
>
>         data->state_ = RPiCameraData::State::Idle;
>
> +       if (data->config_.unicamTimeoutValue)
> +               data->setCameraTimeout(data->config_.unicamTimeoutValue);
> +
>         /* Start all streams. */
>         for (auto const stream : data->streams_) {
>                 ret = stream->dev()->streamOn();
> @@ -1715,6 +1723,7 @@ int RPiCameraData::loadPipelineConfiguration()
>                 .minUnicamBuffers = 2,
>                 .minTotalUnicamBuffers = 4,
>                 .disableStartupFrameDrops = false,
> +               .unicamTimeoutValue = 0,
>         };
>
>         char const *configFromEnv = utils::secure_getenv("LIBCAMERA_RPI_CONFIG_FILE");
> @@ -1750,6 +1759,8 @@ int RPiCameraData::loadPipelineConfiguration()
>                 phConfig["min_total_unicam_buffers"].get<unsigned int>(config_.minTotalUnicamBuffers);
>         config_.disableStartupFrameDrops =
>                 phConfig["disable_startup_frame_drops"].get<bool>(config_.disableStartupFrameDrops);
> +       config_.unicamTimeoutValue =
> +               phConfig["unicam_timeout_value_ms"].get<bool>(config_.disableStartupFrameDrops);

Is bool the right type here? Also is the appearance of
"disableStartupFrameDrops" a copy/paste typo?

Apart from these minor things:

Reviewed-by: David Plowman <david.plowman at raspberrypi.com>

Thanks!
David

>
>         if (config_.minTotalUnicamBuffers < config_.minUnicamBuffers) {
>                 LOG(RPI, Error) << "Invalid configuration: min_total_unicam_buffers must be >= min_unicam_buffers";
> @@ -1953,13 +1964,17 @@ void RPiCameraData::setLensControls(const ControlList &controls)
>
>  void RPiCameraData::setCameraTimeout(uint32_t maxFrameLengthMs)
>  {
> -       /*
> -        * Set the dequeue timeout to the larger of 5x the maximum reported
> -        * frame length advertised by the IPA over a number of frames. Allow
> -        * a minimum timeout value of 1s.
> -        */
> -       utils::Duration timeout =
> -               std::max<utils::Duration>(1s, 5 * maxFrameLengthMs * 1ms);
> +       utils::Duration timeout;
> +
> +       if (!config_.unicamTimeoutValue) {
> +               /*
> +                * Set the dequeue timeout to the larger of 5x the maximum reported
> +                * frame length advertised by the IPA over a number of frames. Allow
> +                * a minimum timeout value of 1s.
> +                */
> +               timeout = std::max<utils::Duration>(1s, 5 * maxFrameLengthMs * 1ms);
> +       } else
> +               timeout = config_.unicamTimeoutValue * 1ms;
>
>         LOG(RPI, Debug) << "Setting Unicam timeout to " << timeout;
>         unicam_[Unicam::Image].dev()->setDequeueTimeout(timeout);
> --
> 2.25.1
>


More information about the libcamera-devel mailing list