[PATCH v3 2/4] libcamera: converter_v4l2_m2m: Support crop selection
Umang Jain
umang.jain at ideasonboard.com
Wed Jun 26 05:48:23 CEST 2024
Hi Kieran,
On 26/06/24 2:21 am, Kieran Bingham wrote:
> Quoting Umang Jain (2024-06-25 07:23:25)
>> Add a helper to set selection rectangle on the video node
>> to support cropping and scaling capabilites.
>>
>> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
>> ---
>> .../internal/converter/converter_v4l2_m2m.h | 5 ++++
>> .../converter/converter_v4l2_m2m.cpp | 27 +++++++++++++++++++
>> 2 files changed, 32 insertions(+)
>>
>> diff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h
>> index b9e59899..846e9f9e 100644
>> --- a/include/libcamera/internal/converter/converter_v4l2_m2m.h
>> +++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h
>> @@ -30,6 +30,7 @@ class Size;
>> class SizeRange;
>> class Stream;
>> struct StreamConfiguration;
>> +class Rectangle;
>> class V4L2M2MDevice;
>>
>> class V4L2M2MConverter : public Converter
>> @@ -57,6 +58,8 @@ public:
>> int queueBuffers(FrameBuffer *input,
>> const std::map<const Stream *, FrameBuffer *> &outputs);
>>
>> + int setSelection(const Stream *stream, unsigned int target, Rectangle *rect);
>> +
>> private:
>> class V4L2M2MStream : protected Loggable
>> {
>> @@ -75,6 +78,8 @@ private:
>>
>> int queueBuffers(FrameBuffer *input, FrameBuffer *output);
>>
>> + int setSelection(unsigned int target, Rectangle *rect);
>> +
>> protected:
>> std::string logPrefix() const override;
>>
>> diff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp
>> index 2e77872e..c323f677 100644
>> --- a/src/libcamera/converter/converter_v4l2_m2m.cpp
>> +++ b/src/libcamera/converter/converter_v4l2_m2m.cpp
>> @@ -155,6 +155,15 @@ int V4L2M2MConverter::V4L2M2MStream::queueBuffers(FrameBuffer *input, FrameBuffe
>> return 0;
>> }
>>
>> +int V4L2M2MConverter::V4L2M2MStream::setSelection(unsigned int target, Rectangle *rect)
>> +{
>> + int ret = m2m_->output()->setSelection(target, rect);
> Can selections ever be expected to be set on the input()?
I don't think so - You get -EINVAL here if you try to set selection on
input (i.e. capture) nodes
>
>> + if (ret < 0)
>> + return ret;
>> +
>> + return 0;
>> +}
>> +
>> std::string V4L2M2MConverter::V4L2M2MStream::logPrefix() const
>> {
>> return stream_->configuration().toString();
>> @@ -374,6 +383,24 @@ int V4L2M2MConverter::exportBuffers(const Stream *stream, unsigned int count,
>> return iter->second->exportBuffers(count, buffers);
>> }
>>
>> +/**
>> + * \brief Set a selection rectangle \a rect for \a target
>> + * \param[in] stream Pointer to output stream
>> + * \param[in] target The selection target defined by the V4L2_SEL_TGT_* flags
>> + * \param[inout] rect The selection rectangle to be applied
>> + *
>> + * \return 0 on success or a negative error code otherwise
>> + */
>> +int V4L2M2MConverter::setSelection(const Stream *stream, unsigned int target,
>> + Rectangle *rect)
> I'm not yet sure how far up the V4L2 types should be transferred in this, but as the class name is V4L2M2M - I think we're still good here.
>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
>> +{
>> + auto iter = streams_.find(stream);
>> + if (iter == streams_.end())
>> + return -EINVAL;
>> +
>> + return iter->second->setSelection(target, rect);
>> +}
>> +
>> /**
>> * \copydoc libcamera::Converter::start
>> */
>> --
>> 2.44.0
>>
More information about the libcamera-devel
mailing list