From patchwork Sun Aug 31 16:52:43 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Robert Mader X-Patchwork-Id: 24271 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 A5791BD87C for ; Sun, 31 Aug 2025 16:53:07 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3B90669322; Sun, 31 Aug 2025 18:53:06 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=collabora.com header.i=robert.mader@collabora.com header.b="UIcJvtYt"; dkim-atps=neutral Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 82E7E613AD for ; Sun, 31 Aug 2025 18:53:04 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; t=1756659180; cv=none; d=zohomail.com; s=zohoarc; b=bEPB11UTC9rSUIINZ+hfQBjOxsxbc7JTnHRlDyblwH1w/Y5PM/pHu0jt/042md9AKip6Wn2xcdNqQxl6pWVyNnGCRs45EL6qFhE4+hk2JQyAeoANYuTrjQSdIvsPnsf7XT3eH+paBuQ+4oE8nNyLnv+UfN10Urmjv569kIzhWOo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1756659180; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=lNRPFsZeBwd4qMEQSvEwWx3roM8Fb6spUWxP1sjHmsE=; b=ng4YoIM24Z5JagPdqSH6vTjTENOiGge/JTOOtDCFaTUTdVWhEx+cVQ5Ck1IC3rtnfiKvQ/WLIHlT3dPJXLwbZv+f3TByYUS8f0jYFl+v8TDrKaqPOMbFj0pnSUposaWXEvO781kPimwkXPV7MlXQHtJhAxF8XruoWC5LVUV/xE4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=robert.mader@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1756659180; s=zohomail; d=collabora.com; i=robert.mader@collabora.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=lNRPFsZeBwd4qMEQSvEwWx3roM8Fb6spUWxP1sjHmsE=; b=UIcJvtYt+SOLI977tMQVa/2WDSDzeZkHl/yKF1aJr2nI0wevGzrflzPWJavMiKQ0 yVtVUKtJTT05ksgswCNd+ad6HRSdtGiTqx8AxS5Phw7lM+uPtdbueAmNcZSctcHX+DS TYE6M0CWG/b7wXwQTiI0ciLnnRs+9wvJw1eB9CyY= Received: by mx.zohomail.com with SMTPS id 1756659178048835.429730755252; Sun, 31 Aug 2025 09:52:58 -0700 (PDT) From: Robert Mader To: libcamera-devel@lists.libcamera.org Cc: Robert Mader Subject: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for swISP Date: Sun, 31 Aug 2025 18:52:43 +0200 Message-ID: <20250831165243.36652-1-robert.mader@collabora.com> X-Mailer: git-send-email 2.51.0 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" When using the softwareISP we allocate the output buffers ourselves, usually from system memory. There's thus no strong reason to limit choices for client. Situations where this might be useful include: 1. Video encoding, e.g. encoding multiple buffers in parallel. 2. Clients requesting a single buffer - e.g. in multi-stream scenarios. Thus allow up to 16 buffers - arbitrarily decided - while keeping the default to the previous 4. While on it, mark the config as adjusted if we did so. Signed-off-by: Robert Mader --- src/libcamera/pipeline/simple/simple.cpp | 38 ++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index 9b24a0db9..da871c7fb 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -375,6 +375,9 @@ public: const Transform &combinedTransform() const { return combinedTransform_; } private: + static constexpr unsigned int kNumBuffersDefault = 4; + static constexpr unsigned int kNumBuffersSwISPMax = 16; + /* * The SimpleCameraData instance is guaranteed to be valid as long as * the corresponding Camera instance is valid. In order to borrow a @@ -1246,6 +1249,31 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate() cfg.size); if (cfg.stride == 0) return Invalid; + + if (data_->converter_) { + if (cfg.bufferCount != kNumBuffersDefault) { + LOG(SimplePipeline, Debug) + << "Adjusting bufferCount from " << cfg.bufferCount + << " to " << kNumBuffersDefault; + cfg.bufferCount = kNumBuffersDefault; + status = Adjusted; + } + } else { + if (cfg.bufferCount == 0) { + LOG(SimplePipeline, Debug) + << "Adjusting bufferCount from " << cfg.bufferCount + << " to " << kNumBuffersDefault; + cfg.bufferCount = kNumBuffersDefault; + status = Adjusted; + } + if (cfg.bufferCount > kNumBuffersSwISPMax) { + LOG(SimplePipeline, Debug) + << "Adjusting bufferCount from " << cfg.bufferCount + << " to " << kNumBuffersSwISPMax; + cfg.bufferCount = kNumBuffersSwISPMax; + status = Adjusted; + } + } } else { V4L2DeviceFormat format; format.fourcc = data_->video_->toV4L2PixelFormat(cfg.pixelFormat); @@ -1257,9 +1285,15 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate() cfg.stride = format.planes[0].bpl; cfg.frameSize = format.planes[0].size; - } - cfg.bufferCount = 4; + if (cfg.bufferCount != kNumBuffersDefault) { + LOG(SimplePipeline, Debug) + << "Adjusting bufferCount from " << cfg.bufferCount + << " to " << kNumBuffersDefault; + cfg.bufferCount = kNumBuffersDefault; + status = Adjusted; + } + } } return status;