diff options
-rw-r--r-- | include/libcamera/internal/converter.h | 1 | ||||
-rw-r--r-- | include/libcamera/internal/converter/converter_v4l2_m2m.h | 2 | ||||
-rw-r--r-- | src/libcamera/converter.cpp | 13 | ||||
-rw-r--r-- | 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 ffbb6f34..04187a2a 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 9b8e43ff..402a8039 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 3a3f8434..73c02fdc 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 8c341fe1..342aa32d 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(); } |