Message ID | 20241216154124.203650-20-stefan.klug@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Stefan 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@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> Thanks j > > --- > > 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; > 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; > > -- > 2.43.0 >
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@ideasonboard.com> > Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> > Reviewed-by: Paul Elder <paul.elder@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; >
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; 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;