[libcamera-devel] [PATCH v2] libcamera: pipeline: raspberrypi: Fix scaler crop when sensor is configured

Naushir Patuck naush at raspberrypi.com
Fri Mar 4 17:11:49 CET 2022


Hi David,

Thank you for your patch.

On Thu, 3 Mar 2022 at 12:11, David Plowman <david.plowman at raspberrypi.com>
wrote:

> We must calculate the initial scaler crop when the camera is
> configured, otherwise the metadata will report this rectangle as being
> all zeroes.
>
> Because the calculation is identical to that performed later in handling
> the scaler crop control, we factor it into a small helper function,
> RPiCameraData::scaleIspCrop.
>
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
>

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


> ---
>  .../pipeline/raspberrypi/raspberrypi.cpp      | 20 ++++++++++++++++---
>  1 file changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 29bff9d6..eede78e6 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -212,6 +212,7 @@ public:
>         void handleStreamBuffer(FrameBuffer *buffer, RPi::Stream *stream);
>         void handleExternalBuffer(FrameBuffer *buffer, RPi::Stream
> *stream);
>         void handleState();
> +       Rectangle scaleIspCrop(const Rectangle &ispCrop) const;
>         void applyScalerCrop(const ControlList &controls);
>
>         std::unique_ptr<ipa::RPi::IPAProxyRPi> ipa_;
> @@ -887,6 +888,9 @@ int PipelineHandlerRPi::configure(Camera *camera,
> CameraConfiguration *config)
>         if (ret)
>                 LOG(RPI, Error) << "Failed to configure the IPA: " << ret;
>
> +       /* Set the scaler crop to the value we are using (scaled to native
> sensor coordinates). */
> +       data->scalerCrop_ = data->scaleIspCrop(data->ispCrop_);
> +
>         /*
>          * Configure the Unicam embedded data output format only if the
> sensor
>          * supports it.
> @@ -1974,6 +1978,18 @@ void RPiCameraData::checkRequestCompleted()
>         }
>  }
>
> +Rectangle RPiCameraData::scaleIspCrop(const Rectangle &ispCrop) const
> +{
> +       /*
> +        * Scale a crop rectangle defined in the ISP's coordinates into
> native sensor
> +        * coordinates.
> +        */
> +       Rectangle nativeCrop =
> ispCrop.scaledBy(sensorInfo_.analogCrop.size(),
> +                                               sensorInfo_.outputSize);
> +       nativeCrop.translateBy(sensorInfo_.analogCrop.topLeft());
> +       return nativeCrop;
> +}
> +
>  void RPiCameraData::applyScalerCrop(const ControlList &controls)
>  {
>         if (controls.contains(controls::ScalerCrop)) {
> @@ -2006,9 +2022,7 @@ void RPiCameraData::applyScalerCrop(const
> ControlList &controls)
>                          * used. But we must first rescale that from ISP
> (camera mode) pixels
>                          * back into sensor native pixels.
>                          */
> -                       scalerCrop_ =
> ispCrop_.scaledBy(sensorInfo_.analogCrop.size(),
> -
>  sensorInfo_.outputSize);
> -
>  scalerCrop_.translateBy(sensorInfo_.analogCrop.topLeft());
> +                       scalerCrop_ = scaleIspCrop(ispCrop_);
>                 }
>         }
>  }
> --
> 2.30.2
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.libcamera.org/pipermail/libcamera-devel/attachments/20220304/44bc7fe0/attachment.htm>


More information about the libcamera-devel mailing list