[PATCH v4 08/20] libcamera: converter: Add function to query crop bounds

Jacopo Mondi jacopo.mondi at ideasonboard.com
Mon Dec 16 19:08:02 CET 2024


Hi Stefan

On Mon, Dec 16, 2024 at 04:40:48PM +0100, Stefan Klug wrote:
> The inputCropBounds_ member of the V4L2M2MConverter::Stream class is
> only initialized after a V4L2M2MConverter::configure() call, when the
> streams are initialized.
>
> However, the converter has crop limits that do not depend on the
> configured Streams, and which are currently not accessible from the
> class interface.

However you seem to store the absolute limts computed at class
creation in inputCropBounds_ which gets updated at each configure()
time.

>
> Add a new inputCropBounds() function to the V4L2M2MConverter class
> that allows to retrieve the converter crop limits before any stream
> is configured.

But in this way, after a configuration, calling

        inputCropBounds()
        inputCropBounds(stream)

return the same data.

Or have I missed something ?
When we discussed it I know I suggested to split the two functions
apart, but my thinking was about being able to return the default crop
rectangle despite the currently configured format. Sorry if I wasn't
clear. Or do you actually prefer this version ?

>
> This is particularly useful for pipelines to initialize controls and
> properties and to implement validation before the Camera gets
> configured.
>
> Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
>
> ---
>
> Changes in v4:
> - Split off from libcamera: converter_v4l2_m2m: Improve crop bounds
>   support
> - Added separate inputCropBounds() function to the dewarper class
>
> Fuxup inputCrop()
> ---
>  include/libcamera/internal/converter.h         |  1 +
>  .../internal/converter/converter_v4l2_m2m.h    |  2 ++
>  src/libcamera/converter.cpp                    | 13 +++++++++++++
>  src/libcamera/converter/converter_v4l2_m2m.cpp | 18 ++++++++++++------
>  4 files changed, 28 insertions(+), 6 deletions(-)
>
> diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h
> index ffbb6f345cd5..04187a2a96e8 100644
> --- a/include/libcamera/internal/converter.h
> +++ b/include/libcamera/internal/converter.h
> @@ -66,6 +66,7 @@ public:
>  				 const std::map<const Stream *, FrameBuffer *> &outputs) = 0;
>
>  	virtual int setInputCrop(const Stream *stream, Rectangle *rect) = 0;
> +	virtual std::pair<Rectangle, Rectangle> inputCropBounds() = 0;
>  	virtual std::pair<Rectangle, Rectangle> inputCropBounds(const Stream *stream) = 0;
>
>  	Signal<FrameBuffer *> inputBufferReady;
> diff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h
> index 9b8e43ff0b91..402a803959b9 100644
> --- a/include/libcamera/internal/converter/converter_v4l2_m2m.h
> +++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h
> @@ -60,6 +60,7 @@ public:
>  			 const std::map<const Stream *, FrameBuffer *> &outputs) override;
>
>  	int setInputCrop(const Stream *stream, Rectangle *rect) override;
> +	std::pair<Rectangle, Rectangle> inputCropBounds() override { return inputCropBounds_; }
>  	std::pair<Rectangle, Rectangle> inputCropBounds(const Stream *stream) override;
>
>  private:
> @@ -106,6 +107,7 @@ private:
>
>  	std::map<const Stream *, std::unique_ptr<V4L2M2MStream>> streams_;
>  	std::map<FrameBuffer *, unsigned int> queue_;
> +	std::pair<Rectangle, Rectangle> inputCropBounds_;
>  };
>
>  } /* namespace libcamera */
> diff --git a/src/libcamera/converter.cpp b/src/libcamera/converter.cpp
> index 3a3f84344c5e..73c02fdcf4bb 100644
> --- a/src/libcamera/converter.cpp
> +++ b/src/libcamera/converter.cpp
> @@ -185,6 +185,16 @@ Converter::~Converter()
>
>  /**
>   * \fn Converter::inputCropBounds()
> + * \brief Retrieve the crop bounds of the converter
> + *
> + * Retrieve the minimum and maximum crop bounds of the converter. This can be
> + * used to query the crop bounds before configuring a stream.
> + *
> + * \return A pair containing the minimum and maximum crop bound in that order
> + */
> +
> +/**
> + * \fn Converter::inputCropBounds(const Stream *stream)
>   * \brief Retrieve the crop bounds for \a stream
>   * \param[in] stream The output stream
>   *
> @@ -195,6 +205,9 @@ Converter::~Converter()
>   * this function should be called after the \a stream has been configured using
>   * configure().
>   *
> + * When called with an unconfigured \a stream, this function returns a pair of
> + * null rectangles.
> + *
>   * \return A pair containing the minimum and maximum crop bound in that order
>   */
>
> diff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp
> index 8c341fe199f6..342aa32dab52 100644
> --- a/src/libcamera/converter/converter_v4l2_m2m.cpp
> +++ b/src/libcamera/converter/converter_v4l2_m2m.cpp
> @@ -273,10 +273,9 @@ V4L2M2MConverter::V4L2M2MConverter(MediaDevice *media)
>  		return;
>  	}
>
> -	Rectangle minCrop;
> -	Rectangle maxCrop;
> -	ret = getCropBounds(m2m_->output(), minCrop, maxCrop);
> -	if (!ret && minCrop != maxCrop) {
> +	ret = getCropBounds(m2m_->output(), inputCropBounds_.first,
> +			    inputCropBounds_.second);
> +	if (!ret && inputCropBounds_.first != inputCropBounds_.second) {
>  		features_ |= Feature::InputCrop;
>
>  		LOG(Converter, Info)
> @@ -469,14 +468,21 @@ int V4L2M2MConverter::setInputCrop(const Stream *stream, Rectangle *rect)
>  }
>
>  /**
> - * \copydoc libcamera::Converter::inputCropBounds
> + * \fn libcamera::V4L2M2MConverter::inputCropBounds()
> + * \copydoc libcamera::Converter::inputCropBounds()
> + */
> +
> +/**
> + * \copydoc libcamera::Converter::inputCropBounds(const Stream *stream)
>   */
>  std::pair<Rectangle, Rectangle>
>  V4L2M2MConverter::inputCropBounds(const Stream *stream)
>  {
>  	auto iter = streams_.find(stream);
> -	if (iter == streams_.end())
> +	if (iter == streams_.end()) {
> +		LOG(Converter, Error) << "Invalid output stream";
>  		return {};
> +	}
>
>  	return iter->second->inputCropBounds();
>  }
> --
> 2.43.0
>


More information about the libcamera-devel mailing list