[libcamera-devel] [PATCH 2/2] pipeline: raspberrypi: Restrict the advertised maximum ISP output resolution

David Plowman david.plowman at raspberrypi.com
Wed Dec 8 12:22:13 CET 2021


Hi Naush

Thanks for this patch!

On Wed, 8 Dec 2021 at 09:42, Naushir Patuck <naush at raspberrypi.com> wrote:
>
> Limit the advertised ISP output sizes available to the sensor resolution in
> PipelineHandlerRPi::generateConfiguration(). The user is free to configure a
> larger resolution than this, and this will work. However, this stops strange
> behavior in applications that use the V4L2 compatability layer to run, and
> request the largest possible advertised resolution, which is much larger than
> the sensor resolution.
>
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>

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

Thanks!
David

> ---
>  src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 13 +++++++++----
>  1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 4479e732a645..6ee975e85567 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -531,10 +531,11 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>
>         unsigned int rawCount = 0;
>         unsigned int outCount = 0;
> +       Size sensorSize = data->sensor_->resolution();
>         for (const StreamRole role : roles) {
>                 switch (role) {
>                 case StreamRole::Raw:
> -                       size = data->sensor_->resolution();
> +                       size = sensorSize;
>                         sensorFormat = findBestFormat(data->sensorFormats_, size, defaultRawBitDepth);
>                         pixelFormat = mbusCodeToPixelFormat(sensorFormat.mbus_code,
>                                                             BayerFormat::Packing::CSI2);
> @@ -547,7 +548,7 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>                         fmts = data->isp_[Isp::Output0].dev()->formats();
>                         pixelFormat = formats::NV12;
>                         /* Return the largest sensor resolution. */
> -                       size = data->sensor_->resolution();
> +                       size = sensorSize;
>                         bufferCount = 1;
>                         outCount++;
>                         break;
> @@ -600,11 +601,15 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,
>                                                 std::forward_as_tuple(format.second.begin(), format.second.end()));
>                         }
>                 } else {
> -                       /* Translate the V4L2PixelFormat to PixelFormat. */
> +                       /*
> +                        * Translate the V4L2PixelFormat to PixelFormat. Note that we
> +                        * limit the recommended largest ISP output size to match the
> +                        * sensor resolution.
> +                        */
>                         for (const auto &format : fmts) {
>                                 PixelFormat pf = format.first.toPixelFormat();
>                                 if (pf.isValid())
> -                                       deviceFormats[pf] = format.second;
> +                                       deviceFormats[pf].emplace_back(sensorSize);
>                         }
>                 }
>
> --
> 2.25.1
>


More information about the libcamera-devel mailing list