[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