[PATCH v3.1] fixup! libcamera: converter_v4l2_m2m: Improve crop bounds support
Stefan Klug
stefan.klug at ideasonboard.com
Fri Dec 13 10:26:05 CET 2024
Changes semantics of inputCropBounds to return null bounds if an
unconfigured stream is provided. Return the device crop bounds if a
nullptr is provided.
Signed-off-by: Stefan Klug <stefan.klug at ideasonboard.com>
---
Hi Jacopo,
I forgot to handle your comment in the v3. Sorry for that. This is my
proposal. It is somewhere in the middle of your suggestions, but I think
it makes the intent clearer.
I would like to keep the getCropBound() a static function as we
discussed before.
The commit message will also be updated for v4.
Is this change ok for you?
Best regards,
Stefan
include/libcamera/internal/converter.h | 4 +++-
.../internal/converter/converter_v4l2_m2m.h | 1 +
src/libcamera/converter.cpp | 12 +++++++++++-
.../converter/converter_v4l2_m2m.cpp | 19 ++++++++++++++++---
src/libcamera/pipeline/rkisp1/rkisp1.cpp | 6 +++++-
5 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h
index 9213ae5b9c33..465b0b0596d9 100644
--- a/include/libcamera/internal/converter.h
+++ b/include/libcamera/internal/converter.h
@@ -73,6 +73,7 @@ public:
virtual int configure(const StreamConfiguration &inputCfg,
const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs) = 0;
+ virtual bool isConfigured(const Stream *stream) const = 0;
virtual int exportBuffers(const Stream *stream, unsigned int count,
std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;
@@ -83,7 +84,8 @@ public:
const std::map<const Stream *, FrameBuffer *> &outputs) = 0;
virtual int setInputCrop(const Stream *stream, Rectangle *rect) = 0;
- virtual std::pair<Rectangle, Rectangle> inputCropBounds(const Stream *stream) = 0;
+ virtual std::pair<Rectangle, Rectangle> inputCropBounds(
+ const Stream *stream = nullptr) = 0;
Signal<FrameBuffer *> inputBufferReady;
Signal<FrameBuffer *> outputBufferReady;
diff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h
index 89bd2878b190..175f0e1109a6 100644
--- a/include/libcamera/internal/converter/converter_v4l2_m2m.h
+++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h
@@ -54,6 +54,7 @@ public:
int configure(const StreamConfiguration &inputCfg,
const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfg);
+ bool isConfigured(const Stream *stream) const override;
int exportBuffers(const Stream *stream, unsigned int count,
std::vector<std::unique_ptr<FrameBuffer>> *buffers);
diff --git a/src/libcamera/converter.cpp b/src/libcamera/converter.cpp
index c3da162b7de7..74cea46cc709 100644
--- a/src/libcamera/converter.cpp
+++ b/src/libcamera/converter.cpp
@@ -169,6 +169,13 @@ Converter::~Converter()
* \return 0 on success or a negative error code otherwise
*/
+/**
+ * \fn Converter::isConfigured()
+ * \brief Check if a given stream is configured
+ * \param[in] stream The output stream
+ * \return True if the \a stream is configured or false otherwise
+ */
+
/**
* \fn Converter::exportBuffers()
* \brief Export buffers from the converter device
@@ -238,9 +245,12 @@ Converter::~Converter()
* this function should be called after the \a stream has been configured using
* configure().
*
- * When called with an invalid \a stream, the function returns the default crop
+ * When called with nullptr \a stream this function returns the default crop
* bounds of the converter.
*
+ * When called with an invalid \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 6857472b29f2..4df253749feb 100644
--- a/src/libcamera/converter/converter_v4l2_m2m.cpp
+++ b/src/libcamera/converter/converter_v4l2_m2m.cpp
@@ -559,6 +559,14 @@ int V4L2M2MConverter::configure(const StreamConfiguration &inputCfg,
return 0;
}
+/**
+ * \copydoc libcamera::Converter::isConfigured
+ */
+bool V4L2M2MConverter::isConfigured(const Stream *stream) const
+{
+ return streams_.find(stream) != streams_.end();
+}
+
/**
* \copydoc libcamera::Converter::exportBuffers
*/
@@ -595,11 +603,16 @@ int V4L2M2MConverter::setInputCrop(const Stream *stream, Rectangle *rect)
std::pair<Rectangle, Rectangle>
V4L2M2MConverter::inputCropBounds(const Stream *stream)
{
+ if (stream == nullptr)
+ return inputCropBounds_;
+
auto iter = streams_.find(stream);
- if (iter != streams_.end())
- return iter->second->inputCropBounds();
+ if (iter == streams_.end()) {
+ LOG(Converter, Error) << "Invalid output stream";
+ return {};
+ }
- return inputCropBounds_;
+ return iter->second->inputCropBounds();
}
/**
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 4dcc5a4fa6a1..ad162164df1a 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -1281,8 +1281,12 @@ int PipelineHandlerRkISP1::updateControls(RkISP1CameraData *data)
ControlInfoMap::Map controls;
if (dewarper_) {
+ const Stream *stream = nullptr;
+ if (dewarper_->isConfigured(&data->mainPathStream_))
+ stream = &data->mainPathStream_;
+
std::pair<Rectangle, Rectangle> cropLimits =
- dewarper_->inputCropBounds(&data->mainPathStream_);
+ dewarper_->inputCropBounds(stream);
/*
* ScalerCrop is specified to be in Sensor coordinates.
--
2.43.0
More information about the libcamera-devel
mailing list