From patchwork Sun May 19 11:56:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 20072 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 53964C322E for ; Sun, 19 May 2024 11:56:39 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9102A6347F; Sun, 19 May 2024 13:56:37 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ZowIMKQ5"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6E4B663469 for ; Sun, 19 May 2024 13:56:33 +0200 (CEST) Received: from fedora.local (unknown [IPv6:2405:201:2015:f873:9278:2c85:fd02:c5f5]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 61B2A49E; Sun, 19 May 2024 13:56:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1716119783; bh=ZyOTc94RM3gN+8FzYyzXlDr4n2wQ/pw8HRPfwnqXfvo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZowIMKQ5WdOAVtQEZK996VUEnKU11PdlHLZeNVgm0F70z0HPFycEyiGxw9eMBszEp snOEvC7LFitiicFsAmqBl0McfvI1NSxKJdKXhDGdp6MmTobICj+kkL7lFh5gYF0xDg SkOwv0CB2krJv8cxMiSSJjxaSGqH5LcAS2ZWfudw= From: Umang Jain To: libcamera-devel@lists.libcamera.org Cc: Umang Jain Subject: [PATCH v2 2/4] libcamera: converter_v4l2_m2m: Support crop selection Date: Sun, 19 May 2024 17:26:20 +0530 Message-ID: <20240519115622.32170-3-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240519115622.32170-1-umang.jain@ideasonboard.com> References: <20240519115622.32170-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add a helper to set selection rectangle on the video node to support cropping and scaling capabilites. Signed-off-by: Umang Jain --- .../internal/converter/converter_v4l2_m2m.h | 5 ++++ .../converter/converter_v4l2_m2m.cpp | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h index 1126050c..acc6424c 100644 --- a/include/libcamera/internal/converter/converter_v4l2_m2m.h +++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h @@ -29,6 +29,7 @@ class MediaDevice; class Size; class SizeRange; struct StreamConfiguration; +class Rectangle; class V4L2M2MDevice; class V4L2M2MConverter : public Converter @@ -56,6 +57,8 @@ public: int queueBuffers(FrameBuffer *input, const std::map &outputs); + int setSelection(unsigned int output, unsigned int target, Rectangle *rect); + private: class Stream : protected Loggable { @@ -74,6 +77,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 d8929fc5..2d3ee257 100644 --- a/src/libcamera/converter/converter_v4l2_m2m.cpp +++ b/src/libcamera/converter/converter_v4l2_m2m.cpp @@ -155,6 +155,15 @@ int V4L2M2MConverter::Stream::queueBuffers(FrameBuffer *input, FrameBuffer *outp return 0; } +int V4L2M2MConverter::Stream::setSelection(unsigned int target, Rectangle *rect) +{ + int ret = m2m_->output()->setSelection(target, rect); + if (ret < 0) + return ret; + + return 0; +} + std::string V4L2M2MConverter::Stream::logPrefix() const { return "stream" + std::to_string(index_); @@ -370,6 +379,23 @@ int V4L2M2MConverter::exportBuffers(unsigned int output, unsigned int count, return streams_[output].exportBuffers(count, buffers); } +/** + * \brief Set a selection rectangle \a rect for \a target + * \param[in] output Index of the 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(unsigned int output, unsigned int target, + Rectangle *rect) +{ + if (output >= streams_.size()) + return -EINVAL; + + return streams_[output].setSelection(target, rect); +} + /** * \copydoc libcamera::Converter::start */