[libcamera-devel] [PATCH v1 1/3] pipeline: ipa: raspberrypi: Change Unicam timeout handling

David Plowman david.plowman at raspberrypi.com
Fri Feb 24 12:04:10 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 an explicit helper function setCameraTimeout() in the pipeline
> handler to set the Unicam timeout value. This function is signalled from
> the IPA to set up an appropriate timeout. This replaces the
> maxSensorFrameLengthMs value parameter returned back from
> IPARPi::start().
>
> Adjust the timeout to be 5x the maximum frame duration reported by the
> IPA.

(I guess you could have added "or 1s (whichever is longer)", but I
really wouldn't bother resubmitting just for that!!)

>
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>

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

Thanks!
David

> ---
>  include/libcamera/ipa/raspberrypi.mojom       |  2 +-
>  src/ipa/raspberrypi/raspberrypi.cpp           |  2 +-
>  .../pipeline/raspberrypi/raspberrypi.cpp      | 24 ++++++++++++-------
>  3 files changed, 18 insertions(+), 10 deletions(-)
>
> diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom
> index 8e78f167f179..80e0126618c8 100644
> --- a/include/libcamera/ipa/raspberrypi.mojom
> +++ b/include/libcamera/ipa/raspberrypi.mojom
> @@ -49,7 +49,6 @@ struct IPAConfigResult {
>  struct StartConfig {
>         libcamera.ControlList controls;
>         int32 dropFrameCount;
> -       uint32 maxSensorFrameLengthMs;
>  };
>
>  interface IPARPiInterface {
> @@ -132,4 +131,5 @@ interface IPARPiEventInterface {
>         setIspControls(libcamera.ControlList controls);
>         setDelayedControls(libcamera.ControlList controls, uint32 delayContext);
>         setLensControls(libcamera.ControlList controls);
> +       setCameraTimeout(uint32 maxFrameLengthMs);
>  };
> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
> index 9b08ae4ca622..f6826bf27fe1 100644
> --- a/src/ipa/raspberrypi/raspberrypi.cpp
> +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> @@ -341,7 +341,7 @@ void IPARPi::start(const ControlList &controls, StartConfig *startConfig)
>
>         startConfig->dropFrameCount = dropFrameCount_;
>         const Duration maxSensorFrameDuration = mode_.maxFrameLength * mode_.maxLineLength;
> -       startConfig->maxSensorFrameLengthMs = maxSensorFrameDuration.get<std::milli>();
> +       setCameraTimeout.emit(maxSensorFrameDuration.get<std::milli>());
>
>         firstStart_ = false;
>         lastRunTimestamp_ = 0;
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 841209548350..3d04842a2440 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -212,6 +212,7 @@ public:
>         void setIspControls(const ControlList &controls);
>         void setDelayedControls(const ControlList &controls, uint32_t delayContext);
>         void setLensControls(const ControlList &controls);
> +       void setCameraTimeout(uint32_t maxExposureTimeMs);
>         void setSensorControls(ControlList &controls);
>         void unicamTimeout();
>
> @@ -1166,14 +1167,6 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
>                 }
>         }
>
> -       /*
> -        * Set the dequeue timeout to the larger of 2x the maximum possible
> -        * frame duration or 1 second.
> -        */
> -       utils::Duration timeout =
> -               std::max<utils::Duration>(1s, 2 * startConfig.maxSensorFrameLengthMs * 1ms);
> -       data->unicam_[Unicam::Image].dev()->setDequeueTimeout(timeout);
> -
>         return 0;
>  }
>
> @@ -1645,6 +1638,7 @@ int RPiCameraData::loadIPA(ipa::RPi::IPAInitResult *result)
>         ipa_->setIspControls.connect(this, &RPiCameraData::setIspControls);
>         ipa_->setDelayedControls.connect(this, &RPiCameraData::setDelayedControls);
>         ipa_->setLensControls.connect(this, &RPiCameraData::setLensControls);
> +       ipa_->setCameraTimeout.connect(this, &RPiCameraData::setCameraTimeout);
>
>         /*
>          * The configuration (tuning file) is made from the sensor name unless
> @@ -1957,6 +1951,20 @@ 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);
> +
> +       LOG(RPI, Debug) << "Setting Unicam timeout to " << timeout;
> +       unicam_[Unicam::Image].dev()->setDequeueTimeout(timeout);
> +}
> +
>  void RPiCameraData::setSensorControls(ControlList &controls)
>  {
>         /*
> --
> 2.25.1
>


More information about the libcamera-devel mailing list