From patchwork Mon Sep 9 16:37:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 21204 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 9CC90C324C for ; Mon, 9 Sep 2024 16:37:39 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C97A5634FB; Mon, 9 Sep 2024 18:37:36 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="HSY8u9bR"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9922E634EB for ; Mon, 9 Sep 2024 18:37:33 +0200 (CEST) Received: from localhost.localdomain (unknown [IPv6:2405:201:2015:f873:55f8:639e:8e9f:12ec]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id F2748D4A; Mon, 9 Sep 2024 18:36:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1725899777; bh=KTmoNqzjKa74nZWG4hb83GikNYhJ6mH0qMAdnr1XOBE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HSY8u9bRz73kkZLCKOoOrkGF9vrMjdGsp0MkGiYyDIEi35MtWVZEUS0no/9Mf1d2Z FoC0Egb8ekfQBtUB51d5oR9wE0xUrxNwT98JIETN1g0EXmUAOJfoYQAa0Pp6D3RLUQ sOInSGnppo3S9bcegERNCitZ5KpXC3K4gcZVwMBA= From: Umang Jain To: libcamera-devel@lists.libcamera.org Cc: Umang Jain Subject: [PATCH 1/2] pipeline: rkisp1: Bound RkISP1 path to ISP maximum input Date: Mon, 9 Sep 2024 22:07:18 +0530 Message-ID: <20240909163719.267211-2-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.45.0 In-Reply-To: <20240909163719.267211-1-umang.jain@ideasonboard.com> References: <20240909163719.267211-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" The RkISP1Path class has maximum resolution defined by RKISP1_RSZ_*_SRC_MAX macros. It might get updated in populateFormats() by querying the formats on the rkisp1_*path video nodes. However, it does not take into account the maximum resolution that the ISP can handle. For instance on i.MX8MP, 4096x3072 is the maximum supported ISP resolution however, RkISP1MainPath had the maximum resolution of RKISP1_RSZ_MP_SRC_MAX, prior to this patch. Fix it by bounding the maximum resolution of RkISP1Path class by passing the maximum resolution of the ISP during RkISP1Path::init(). Signed-off-by: Umang Jain Reviewed-by: Kieran Bingham --- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 15 +++++++++++++-- src/libcamera/pipeline/rkisp1/rkisp1_path.cpp | 4 +++- src/libcamera/pipeline/rkisp1/rkisp1_path.h | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 0a794d63..97ce8457 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -1274,6 +1274,17 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator) if (isp_->open() < 0) return false; + /* + * Retrieve the ISP maximum input size for config validation in the + * path classes. + * + * The ISP maximum input size is independent of the media bus formats + * hence, pick the one first entry of ispFormats and its size range. + */ + V4L2Subdevice::Formats ispFormats = isp_->formats(0); + const SizeRange range = ispFormats.cbegin()->second[0]; + Size ispMaxInputSize = range.max; + /* Locate and open the optional CSI-2 receiver. */ ispSink_ = isp_->entity()->getPadByIndex(0); if (!ispSink_ || ispSink_->links().empty()) @@ -1300,10 +1311,10 @@ bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator) return false; /* Locate and open the ISP main and self paths. */ - if (!mainPath_.init(media_)) + if (!mainPath_.init(media_, ispMaxInputSize)) return false; - if (hasSelfPath_ && !selfPath_.init(media_)) + if (hasSelfPath_ && !selfPath_.init(media_, ispMaxInputSize)) return false; mainPath_.bufferReady().connect(this, &PipelineHandlerRkISP1::bufferReady); diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp index c49017d1..9053af18 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp @@ -62,7 +62,7 @@ RkISP1Path::RkISP1Path(const char *name, const Span &formats, { } -bool RkISP1Path::init(MediaDevice *media) +bool RkISP1Path::init(MediaDevice *media, Size ispMaxInputSize) { std::string resizer = std::string("rkisp1_resizer_") + name_ + "path"; std::string video = std::string("rkisp1_") + name_ + "path"; @@ -77,6 +77,8 @@ bool RkISP1Path::init(MediaDevice *media) populateFormats(); + maxResolution_.boundTo(ispMaxInputSize); + link_ = media->link("rkisp1_isp", 2, resizer, 0); if (!link_) return false; diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.h b/src/libcamera/pipeline/rkisp1/rkisp1_path.h index 08edefec..13ba4b62 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1_path.h +++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.h @@ -35,7 +35,7 @@ public: RkISP1Path(const char *name, const Span &formats, const Size &minResolution, const Size &maxResolution); - bool init(MediaDevice *media); + bool init(MediaDevice *media, Size ispMaxInputSize); int setEnabled(bool enable) { return link_->setEnabled(enable); } bool isEnabled() const { return link_->flags() & MEDIA_LNK_FL_ENABLED; }