[PATCH v4 19/20] libcamera: camera_sensor: Add parameter to limit returned sensor size
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Dec 17 22:05:31 CET 2024
On Mon, Dec 16, 2024 at 04:40:59PM +0100, Stefan Klug wrote:
> The getFormat function takes the aspect ratio and the area of the
> requested size into account when choosing the best sensor size. In case
> the sensor is connected to an rkisp1 the maximum supported frame size of
> the ISP is another constraining factor for the selection of the best
> format. Add a maxSize parameter to support such a constraint.
>
> Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
> Signed-off-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
> Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
>
> ---
>
> Changes in v4:
> - Collected tags
>
> Changes in v3:
> - Added this patch
> ---
> include/libcamera/internal/camera_sensor.h | 2 +-
> src/libcamera/sensor/camera_sensor.cpp | 3 +++
> src/libcamera/sensor/camera_sensor_legacy.cpp | 9 +++++++--
> 3 files changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
> index d030e254a552..605ea8136900 100644
> --- a/include/libcamera/internal/camera_sensor.h
> +++ b/include/libcamera/internal/camera_sensor.h
> @@ -53,7 +53,7 @@ public:
>
> virtual V4L2SubdeviceFormat
> getFormat(const std::vector<unsigned int> &mbusCodes,
> - const Size &size) const = 0;
> + const Size &size, const Size maxSize = Size()) const = 0;
This feels like a bit of a hack. That's fine for now, the CameraSensor
API is made of hacks. We'll clean it up later.
> virtual int setFormat(V4L2SubdeviceFormat *format,
> Transform transform = Transform::Identity) = 0;
> virtual int tryFormat(V4L2SubdeviceFormat *format) const = 0;
> diff --git a/src/libcamera/sensor/camera_sensor.cpp b/src/libcamera/sensor/camera_sensor.cpp
> index 208a1603cb32..a131ac224ec0 100644
> --- a/src/libcamera/sensor/camera_sensor.cpp
> +++ b/src/libcamera/sensor/camera_sensor.cpp
> @@ -116,6 +116,7 @@ CameraSensor::~CameraSensor() = default;
> * \brief Retrieve the best sensor format for a desired output
> * \param[in] mbusCodes The list of acceptable media bus codes
> * \param[in] size The desired size
> + * \param[in] maxSize The maximum size
> *
> * Media bus codes are selected from \a mbusCodes, which lists all acceptable
> * codes in decreasing order of preference. Media bus codes supported by the
> @@ -134,6 +135,8 @@ CameraSensor::~CameraSensor() = default;
> * bandwidth.
> * - The desired \a size shall be supported by one of the media bus code listed
> * in \a mbusCodes.
> + * - The desired \a size shall fit into the maximum size \a maxSize if it is not
> + * null.
> *
> * When multiple media bus codes can produce the same size, the code at the
> * lowest position in \a mbusCodes is selected.
> diff --git a/src/libcamera/sensor/camera_sensor_legacy.cpp b/src/libcamera/sensor/camera_sensor_legacy.cpp
> index 17d6fa680e39..32989c19c019 100644
> --- a/src/libcamera/sensor/camera_sensor_legacy.cpp
> +++ b/src/libcamera/sensor/camera_sensor_legacy.cpp
> @@ -74,7 +74,8 @@ public:
> Size resolution() const override;
>
> V4L2SubdeviceFormat getFormat(const std::vector<unsigned int> &mbusCodes,
> - const Size &size) const override;
> + const Size &size,
> + const Size maxSize) const override;
> int setFormat(V4L2SubdeviceFormat *format,
> Transform transform = Transform::Identity) override;
> int tryFormat(V4L2SubdeviceFormat *format) const override;
> @@ -699,7 +700,7 @@ Size CameraSensorLegacy::resolution() const
>
> V4L2SubdeviceFormat
> CameraSensorLegacy::getFormat(const std::vector<unsigned int> &mbusCodes,
> - const Size &size) const
> + const Size &size, Size maxSize) const
> {
> unsigned int desiredArea = size.width * size.height;
> unsigned int bestArea = UINT_MAX;
> @@ -716,6 +717,10 @@ CameraSensorLegacy::getFormat(const std::vector<unsigned int> &mbusCodes,
> for (const SizeRange &range : formats->second) {
> const Size &sz = range.max;
>
> + if (!maxSize.isNull() &&
> + (sz.width > maxSize.width || sz.height > maxSize.height))
> + continue;
> +
> if (sz.width < size.width || sz.height < size.height)
> continue;
>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list