libcamera: camera_sensor: Add parameter to limit returned sensor size

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@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
This commit is contained in:
Stefan Klug 2024-12-16 16:40:59 +01:00
parent 041377839b
commit 60e94a0d99
3 changed files with 11 additions and 3 deletions

View file

@ -53,7 +53,7 @@ public:
virtual V4L2SubdeviceFormat virtual V4L2SubdeviceFormat
getFormat(const std::vector<unsigned int> &mbusCodes, getFormat(const std::vector<unsigned int> &mbusCodes,
const Size &size) const = 0; const Size &size, const Size maxSize = Size()) const = 0;
virtual int setFormat(V4L2SubdeviceFormat *format, virtual int setFormat(V4L2SubdeviceFormat *format,
Transform transform = Transform::Identity) = 0; Transform transform = Transform::Identity) = 0;
virtual int tryFormat(V4L2SubdeviceFormat *format) const = 0; virtual int tryFormat(V4L2SubdeviceFormat *format) const = 0;

View file

@ -116,6 +116,7 @@ CameraSensor::~CameraSensor() = default;
* \brief Retrieve the best sensor format for a desired output * \brief Retrieve the best sensor format for a desired output
* \param[in] mbusCodes The list of acceptable media bus codes * \param[in] mbusCodes The list of acceptable media bus codes
* \param[in] size The desired size * \param[in] size The desired size
* \param[in] maxSize The maximum size
* *
* Media bus codes are selected from \a mbusCodes, which lists all acceptable * Media bus codes are selected from \a mbusCodes, which lists all acceptable
* codes in decreasing order of preference. Media bus codes supported by the * codes in decreasing order of preference. Media bus codes supported by the
@ -134,6 +135,8 @@ CameraSensor::~CameraSensor() = default;
* bandwidth. * bandwidth.
* - The desired \a size shall be supported by one of the media bus code listed * - The desired \a size shall be supported by one of the media bus code listed
* in \a mbusCodes. * 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 * When multiple media bus codes can produce the same size, the code at the
* lowest position in \a mbusCodes is selected. * lowest position in \a mbusCodes is selected.

View file

@ -74,7 +74,8 @@ public:
Size resolution() const override; Size resolution() const override;
V4L2SubdeviceFormat getFormat(const std::vector<unsigned int> &mbusCodes, 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, int setFormat(V4L2SubdeviceFormat *format,
Transform transform = Transform::Identity) override; Transform transform = Transform::Identity) override;
int tryFormat(V4L2SubdeviceFormat *format) const override; int tryFormat(V4L2SubdeviceFormat *format) const override;
@ -699,7 +700,7 @@ Size CameraSensorLegacy::resolution() const
V4L2SubdeviceFormat V4L2SubdeviceFormat
CameraSensorLegacy::getFormat(const std::vector<unsigned int> &mbusCodes, 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 desiredArea = size.width * size.height;
unsigned int bestArea = UINT_MAX; unsigned int bestArea = UINT_MAX;
@ -716,6 +717,10 @@ CameraSensorLegacy::getFormat(const std::vector<unsigned int> &mbusCodes,
for (const SizeRange &range : formats->second) { for (const SizeRange &range : formats->second) {
const Size &sz = range.max; 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) if (sz.width < size.width || sz.height < size.height)
continue; continue;