[{"id":35657,"web_url":"https://patchwork.libcamera.org/comment/35657/","msgid":"<85o6ru3483.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","date":"2025-09-01T09:35:24","subject":"Re: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for\n\tswISP","submitter":{"id":177,"url":"https://patchwork.libcamera.org/api/people/177/","name":"Milan Zamazal","email":"mzamazal@redhat.com"},"content":"Hi Robert,\n\nthank you for the patch.\n\nRobert Mader <robert.mader@collabora.com> writes:\n\n> When using the softwareISP we allocate the output buffers ourselves,\n\nHow does it differ from the other cases, namely for a converter and for\nraw streams?  Should it be explained in a code comment in the code\nbelow?\n\n> usually from system memory. There's thus no strong reason to limit\n> choices for client. Situations where this might be useful include:\n> 1. Video encoding, e.g. encoding multiple buffers in parallel.\n> 2. Clients requesting a single buffer - e.g. in multi-stream scenarios.\n>\n> Thus allow up to 16 buffers - arbitrarily decided - while keeping the\n> default to the previous 4.\n>\n> While on it, mark the config as adjusted if we did so.\n>\n> Signed-off-by: Robert Mader <robert.mader@collabora.com>\n> ---\n>  src/libcamera/pipeline/simple/simple.cpp | 38 ++++++++++++++++++++++--\n>  1 file changed, 36 insertions(+), 2 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 9b24a0db9..da871c7fb 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -375,6 +375,9 @@ public:\n>  \tconst Transform &combinedTransform() const { return combinedTransform_; }\n>  \n>  private:\n> +\tstatic constexpr unsigned int kNumBuffersDefault = 4;\n> +\tstatic constexpr unsigned int kNumBuffersSwISPMax = 16;\n\ns/kNumBuffersSwISPMax/kNumBuffersSwIspMax/ to make it consistent with\nsimilar identifiers.\n\n> +\n>  \t/*\n>  \t * The SimpleCameraData instance is guaranteed to be valid as long as\n>  \t * the corresponding Camera instance is valid. In order to borrow a\n> @@ -1246,6 +1249,31 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n>  \t\t\t\t\t\t\t\t\t    cfg.size);\n>  \t\t\tif (cfg.stride == 0)\n>  \t\t\t\treturn Invalid;\n> +\n> +\t\t\tif (data_->converter_) {\n> +\t\t\t\tif (cfg.bufferCount != kNumBuffersDefault) {\n> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> +\t\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n> +\t\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n> +\t\t\t\t\tstatus = Adjusted;\n> +\t\t\t\t}\n> +\t\t\t} else {\n> +\t\t\t\tif (cfg.bufferCount == 0) {\n> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> +\t\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n> +\t\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n> +\t\t\t\t\tstatus = Adjusted;\n> +\t\t\t\t}\n> +\t\t\t\tif (cfg.bufferCount > kNumBuffersSwISPMax) {\n> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> +\t\t\t\t\t\t<< \" to \" << kNumBuffersSwISPMax;\n> +\t\t\t\t\tcfg.bufferCount = kNumBuffersSwISPMax;\n> +\t\t\t\t\tstatus = Adjusted;\n> +\t\t\t\t}\n> +\t\t\t}\n>  \t\t} else {\n>  \t\t\tV4L2DeviceFormat format;\n>  \t\t\tformat.fourcc = data_->video_->toV4L2PixelFormat(cfg.pixelFormat);\n> @@ -1257,9 +1285,15 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n>  \n>  \t\t\tcfg.stride = format.planes[0].bpl;\n>  \t\t\tcfg.frameSize = format.planes[0].size;\n> -\t\t}\n>  \n> -\t\tcfg.bufferCount = 4;\n> +\t\t\tif (cfg.bufferCount != kNumBuffersDefault) {\n> +\t\t\t\tLOG(SimplePipeline, Debug)\n> +\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> +\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n> +\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n> +\t\t\t\tstatus = Adjusted;\n> +\t\t\t}\n> +\t\t}\n>  \t}\n>  \n>  \treturn status;","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 6DA11BEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  1 Sep 2025 09:35:38 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4D7DA69331;\n\tMon,  1 Sep 2025 11:35:37 +0200 (CEST)","from us-smtp-delivery-124.mimecast.com\n\t(us-smtp-delivery-124.mimecast.com [170.10.133.124])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8C3E6613AC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  1 Sep 2025 11:35:35 +0200 (CEST)","from mail-wr1-f71.google.com (mail-wr1-f71.google.com\n\t[209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS\n\t(version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n\tus-mta-600-2ZdsMnOKN9uhp6a2jm8_qg-1; Mon, 01 Sep 2025 05:35:28 -0400","by mail-wr1-f71.google.com with SMTP id\n\tffacd0b85a97d-3ccd58af2bbso1787339f8f.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 01 Sep 2025 02:35:27 -0700 (PDT)","from mzamazal-thinkpadp1gen7.tpbc.csb\n\t(ip-77-48-47-2.net.vodafone.cz. [77.48.47.2])\n\tby smtp.gmail.com with ESMTPSA id\n\tffacd0b85a97d-3cf275d2722sm14660734f8f.19.2025.09.01.02.35.25\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 01 Sep 2025 02:35:25 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=redhat.com header.i=@redhat.com\n\theader.b=\"hXyzdhuP\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n\ts=mimecast20190719; t=1756719334;\n\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n\tto:to:cc:cc:mime-version:mime-version:content-type:content-type:\n\tin-reply-to:in-reply-to:references:references;\n\tbh=Rgt5S44ZQxwRdKIWzrYmTPY/ID5gFqLp3wJcUdBR8W8=;\n\tb=hXyzdhuPSTKeh3D8VnR98ENVbf/I6fWcibwW8DaxcjJMBYoqdjF+KWYQ0si0PTvdq/WjwM\n\thj7JFZUv4VDLnskZxsNo/YG7qEg2T1O2DXBXpS6+jooE/vn2euY0hooRYTgc/xLlA2deHY\n\td1tcNIe2mmo9evOajs5+DKlX8IWbMW0=","X-MC-Unique":"2ZdsMnOKN9uhp6a2jm8_qg-1","X-Mimecast-MFC-AGG-ID":"2ZdsMnOKN9uhp6a2jm8_qg_1756719327","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1756719326; x=1757324126;\n\th=mime-version:user-agent:message-id:date:references:in-reply-to\n\t:subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=Rgt5S44ZQxwRdKIWzrYmTPY/ID5gFqLp3wJcUdBR8W8=;\n\tb=QYVKN84SD5IL+Kl/AefM9UUX8YPLBu30bwUxc8EirlYFKFDZ3i7HMEdyoG4bsuWeqf\n\tQ+44Koc6Q52WP/fJo+0KhN52iLJjSZFo8qolC0iix9Z/+sTiFEbIcX8mwRqhRluhqaj1\n\tH+8Uzt0uEGrjTXPDsWqcGuL5LELNUAZ2uEDc3Isv6u3/l7Z6glEFyKj9tcpUbaKxIgDG\n\tJOWR9ej9ZLYnQB8cUrmYw5rco3rSNxgw9HD7sR0qdJw3RMlb4dimdPYC82CdGd/VmtU7\n\tEQOgDBnkt1K79y6TTJyJ6oomSq01rNnN1SE8B6m3KSpBKTeTD2eCX/+ZLX4txZItuPsM\n\txCow==","X-Gm-Message-State":"AOJu0Yw+4FjbyRtwrcdPAzv0K93gvQmQMknBxqVLUf/Sbc2pBu7CSPJk\n\tCn/FwvstkjH02A3Jo0g+BDHDAJW+hj1Xyd1ywFSvLqvArsGsPP4evjuVZueekzTAQW3sn3Cdo7c\n\tKiObWP67D6bMvwSeMDS4OxvJ2S6wNIn058ybqiCHk0OcG9LjwQHrp7KDyijhCXBrnk+uilOVCnp\n\twvp+KJ3mxZxPm0/scYDzFofTAGgj8+/hX2C5cyVowFi7tcXPFjmlzSt58L0VY=","X-Gm-Gg":"ASbGncts8w1Cq4BuIOBMZ+wMbf4BgEi0/KmMMlhSV5XD2Zv8M1a4Lt/Zf/zBYm08WeF\n\tk6+JuWiCYCCYqQY9krdImidmodkfmPF5LwrF485fQ4zQU9+0add5gpFmzk6xA4TWJDP+fj5fJoz\n\to314cTVXR8trSEFTfcEpLCa42DzGmYpM5FEqYS3OraIEzW8x+XbL68Aji3rVBGWaVhHG1+lUE5Y\n\tfqnyVczJ8ZIw9N/Qv9TWODpLfR98fZErbxvAOTItUQN+mKS6i+QJ/fCZoFN8XgLqMY2W+h+DiHy\n\tTNX4m+KFG8ZzWp41AEdKkwLOnq/rNZmrCIbvy5j+hooZrrFsb5fBTzfcWjQ/GnQzaUY43AI31jf\n\tjEkbmYufsyfT7Z5OctA==","X-Received":["by 2002:a05:6000:3110:b0:3cf:ef30:c819 with SMTP id\n\tffacd0b85a97d-3d1dc699e64mr5354265f8f.4.1756719326294; \n\tMon, 01 Sep 2025 02:35:26 -0700 (PDT)","by 2002:a05:6000:3110:b0:3cf:ef30:c819 with SMTP id\n\tffacd0b85a97d-3d1dc699e64mr5354232f8f.4.1756719325810; \n\tMon, 01 Sep 2025 02:35:25 -0700 (PDT)"],"X-Google-Smtp-Source":"AGHT+IEc+knXQ/HMjpJaeszPGdU3qfkADInfAZS1PIwjf8PIj2NPJBi1L07+khehTX0eeHkafk14aw==","From":"Milan Zamazal <mzamazal@redhat.com>","To":"Robert Mader <robert.mader@collabora.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for\n\tswISP","In-Reply-To":"<20250831165243.36652-1-robert.mader@collabora.com> (Robert\n\tMader's message of \"Sun, 31 Aug 2025 18:52:43 +0200\")","References":"<20250831165243.36652-1-robert.mader@collabora.com>","Date":"Mon, 01 Sep 2025 11:35:24 +0200","Message-ID":"<85o6ru3483.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","User-Agent":"Gnus/5.13 (Gnus v5.13)","MIME-Version":"1.0","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"0hpagFD7pA3_L7uyIu4avyInehPYgtf1MEgF5pkUWgo_1756719327","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":35658,"web_url":"https://patchwork.libcamera.org/comment/35658/","msgid":"<31bb5399-90e6-4b28-b15e-f12fee65ff75@collabora.com>","date":"2025-09-01T10:22:37","subject":"Re: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for\n\tswISP","submitter":{"id":140,"url":"https://patchwork.libcamera.org/api/people/140/","name":"Robert Mader","email":"robert.mader@collabora.com"},"content":"On 01.09.25 11:35, Milan Zamazal wrote:\n> Hi Robert,\n>\n> thank you for the patch.\n>\n> Robert Mader<robert.mader@collabora.com> writes:\n>\n>> When using the softwareISP we allocate the output buffers ourselves,\n> How does it differ from the other cases, namely for a converter and for\n> raw streams?  Should it be explained in a code comment in the code\n> below?\n\nIn the other cases we allocate buffers via V4L2, while in the swISP case \nwe use our own DmaBufAllocator (only allocating 3 \"internal\" buffers via \nV4L2), thus shouldn't have any hardware limitation apart from system \nmemory. FTR., it might well make sense to allow more buffers in the \nother cases as well - I'm just not sure if some V4L2 drivers might have \nlimitations. If we can assume that every well written driver handles \n1-16 buffers - then I'd say lets support it.\n\n>> usually from system memory. There's thus no strong reason to limit\n>> choices for client. Situations where this might be useful include:\n>> 1. Video encoding, e.g. encoding multiple buffers in parallel.\n>> 2. Clients requesting a single buffer - e.g. in multi-stream scenarios.\n>>\n>> Thus allow up to 16 buffers - arbitrarily decided - while keeping the\n>> default to the previous 4.\n>>\n>> While on it, mark the config as adjusted if we did so.\n>>\n>> Signed-off-by: Robert Mader<robert.mader@collabora.com>\n>> ---\n>>   src/libcamera/pipeline/simple/simple.cpp | 38 ++++++++++++++++++++++--\n>>   1 file changed, 36 insertions(+), 2 deletions(-)\n>>\n>> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n>> index 9b24a0db9..da871c7fb 100644\n>> --- a/src/libcamera/pipeline/simple/simple.cpp\n>> +++ b/src/libcamera/pipeline/simple/simple.cpp\n>> @@ -375,6 +375,9 @@ public:\n>>   \tconst Transform &combinedTransform() const { return combinedTransform_; }\n>>   \n>>   private:\n>> +\tstatic constexpr unsigned int kNumBuffersDefault = 4;\n>> +\tstatic constexpr unsigned int kNumBuffersSwISPMax = 16;\n> s/kNumBuffersSwISPMax/kNumBuffersSwIspMax/ to make it consistent with\n> similar identifiers.\n\nThanks, will change in v2!\n\n>> +\n>>   \t/*\n>>   \t * The SimpleCameraData instance is guaranteed to be valid as long as\n>>   \t * the corresponding Camera instance is valid. In order to borrow a\n>> @@ -1246,6 +1249,31 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n>>   \t\t\t\t\t\t\t\t\t    cfg.size);\n>>   \t\t\tif (cfg.stride == 0)\n>>   \t\t\t\treturn Invalid;\n>> +\n>> +\t\t\tif (data_->converter_) {\n>> +\t\t\t\tif (cfg.bufferCount != kNumBuffersDefault) {\n>> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n>> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n>> +\t\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n>> +\t\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n>> +\t\t\t\t\tstatus = Adjusted;\n>> +\t\t\t\t}\n>> +\t\t\t} else {\n>> +\t\t\t\tif (cfg.bufferCount == 0) {\n>> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n>> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n>> +\t\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n>> +\t\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n>> +\t\t\t\t\tstatus = Adjusted;\n>> +\t\t\t\t}\n>> +\t\t\t\tif (cfg.bufferCount > kNumBuffersSwISPMax) {\n>> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n>> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n>> +\t\t\t\t\t\t<< \" to \" << kNumBuffersSwISPMax;\n>> +\t\t\t\t\tcfg.bufferCount = kNumBuffersSwISPMax;\n>> +\t\t\t\t\tstatus = Adjusted;\n>> +\t\t\t\t}\n>> +\t\t\t}\n>>   \t\t} else {\n>>   \t\t\tV4L2DeviceFormat format;\n>>   \t\t\tformat.fourcc = data_->video_->toV4L2PixelFormat(cfg.pixelFormat);\n>> @@ -1257,9 +1285,15 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n>>   \n>>   \t\t\tcfg.stride = format.planes[0].bpl;\n>>   \t\t\tcfg.frameSize = format.planes[0].size;\n>> -\t\t}\n>>   \n>> -\t\tcfg.bufferCount = 4;\n>> +\t\t\tif (cfg.bufferCount != kNumBuffersDefault) {\n>> +\t\t\t\tLOG(SimplePipeline, Debug)\n>> +\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n>> +\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n>> +\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n>> +\t\t\t\tstatus = Adjusted;\n>> +\t\t\t}\n>> +\t\t}\n>>   \t}\n>>   \n>>   \treturn status;","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id D0D71BDB13\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  1 Sep 2025 10:22:49 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5C41869325;\n\tMon,  1 Sep 2025 12:22:48 +0200 (CEST)","from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com\n\t[136.143.188.112])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 70AF269318\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  1 Sep 2025 12:22:45 +0200 (CEST)","by mx.zohomail.com with SMTPS id 175672216013044.115343754284936; \n\tMon, 1 Sep 2025 03:22:40 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=collabora.com\n\theader.i=robert.mader@collabora.com header.b=\"ZF96ANaC\"; \n\tdkim-atps=neutral","ARC-Seal":"i=1; a=rsa-sha256; t=1756722161; cv=none; \n\td=zohomail.com; s=zohoarc; \n\tb=djw5Fagv4Kt2Bs9wof6WmTbfGGIdYd4MxNwWPcrmSqUNQzcH3VAirulBq2UxlvTs2+TiixOEv0nWj/L1CF4M7H5JxBtlLapkHLAkLSPzmLAFifxZhEHEAYDOCoj90WamKVdRvnFmzazkFsp+dDaCUKqyvJ1Cxh7XXjx2ddli2c4=","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; \n\ts=zohoarc; t=1756722161;\n\th=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To;\n\tbh=dOBTWtPh05ME5agkQzUJGUCVUNVYA7nxMyyr5VmJ9bw=; \n\tb=kBPc2DYkN4AVqXRh9mzIAOM1af7hiauwl2DCzGorGMUHpcB9hm0u34PXt74pbBpznhHED/32xMYDUjPGAzV2X+4lO9p/b6QVg5iPf/IFZubNCRIYhoXmqsthJDJeOazfoyM8VdmiJ/r64og2Pw9cHaamMpuscGRFyJHp8KYN4+w=","ARC-Authentication-Results":"i=1; mx.zohomail.com;\n\tdkim=pass  header.i=collabora.com;\n\tspf=pass  smtp.mailfrom=robert.mader@collabora.com;\n\tdmarc=pass header.from=<robert.mader@collabora.com>","DKIM-Signature":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1756722161;\n\ts=zohomail; d=collabora.com; i=robert.mader@collabora.com;\n\th=Content-Type:Message-ID:Date:Date:MIME-Version:Subject:Subject:To:To:Cc:Cc:References:From:From:In-Reply-To:Message-Id:Reply-To;\n\tbh=dOBTWtPh05ME5agkQzUJGUCVUNVYA7nxMyyr5VmJ9bw=;\n\tb=ZF96ANaCkD9VkKqAzjvlMVzHVTtPBPWPUfVBz+g2iWLT9p5Wd9kZLxado6dhUKG/\n\taIoLfNpzBP/4FNzGO5s1qIjleStMQAf1gHTPB6XXw6hFyjBSckGKv7kyJqfL+al4/Qx\n\t6ypDGrnB6U9MVNzdeqW3yNkKzkeQUvXJgac2nFQw=","Content-Type":"multipart/alternative;\n\tboundary=\"------------LTgrwHxnljqEybNYCpiToz0t\"","Message-ID":"<31bb5399-90e6-4b28-b15e-f12fee65ff75@collabora.com>","Date":"Mon, 1 Sep 2025 12:22:37 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for\n\tswISP","To":"Milan Zamazal <mzamazal@redhat.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20250831165243.36652-1-robert.mader@collabora.com>\n\t<85o6ru3483.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","Content-Language":"en-US, de-DE","From":"Robert Mader <robert.mader@collabora.com>","In-Reply-To":"<85o6ru3483.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":35666,"web_url":"https://patchwork.libcamera.org/comment/35666/","msgid":"<mkrgkm5cixwaqdthpufmwbre6zr2iiyb6uxisp23aglmtx5v3j@tyygnomitsk3>","date":"2025-09-01T12:11:14","subject":"Re: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for\n\tswISP","submitter":{"id":232,"url":"https://patchwork.libcamera.org/api/people/232/","name":"Umang Jain","email":"uajain@igalia.com"},"content":"Hi Robert,\n\nOn Sun, Aug 31, 2025 at 06:52:43PM +0200, Robert Mader wrote:\n> When using the softwareISP we allocate the output buffers ourselves,\n> usually from system memory. There's thus no strong reason to limit\n> choices for client. Situations where this might be useful include:\n> 1. Video encoding, e.g. encoding multiple buffers in parallel.\n> 2. Clients requesting a single buffer - e.g. in multi-stream scenarios.\n\nThese use cases should be able to pass in bufferCount according to their\nneeds, no ?\n\n> \n> Thus allow up to 16 buffers - arbitrarily decided - while keeping the\n> default to the previous 4.\n> \n> While on it, mark the config as adjusted if we did so.\n\nWhy not properly support the cfg.bufferCount instead?\nFor e.g. there was a recent patch merged for the rkisp1 pipeline\nhandler.\n\n\ncommit 521177161a76949e85a76ddebe0694db7545ae4f\nAuthor: Stefan Klug <stefan.klug@ideasonboard.com>\nDate:   Thu Jul 17 14:59:24 2025 +0200\n\n    pipeline: rkisp1: Properly handle the bufferCount set in the stream configuration\n\n    The StreamConfiguration::bufferCount is reset to a hardcoded value of 4\n    in RkISP1Path::validate(). Keep the minimum value of 4 but do not reset\n    it, if it was set to a larger value.  This allows the user to set\n    bufferCount to an arbitrary number of buffers which then can be\n    allocated for example by the FrameBufferAllocator. If the bufferCount is\n    set to a smaller value it gets reset to kRkISP1MinBufferCount again and\n    the configuration is marked as adjusted.\n\nDo you think the simple pipeline handler will be able to support\ncfg.bufferCount or there will be some blockers ?\n\n> \n> Signed-off-by: Robert Mader <robert.mader@collabora.com>\n> ---\n>  src/libcamera/pipeline/simple/simple.cpp | 38 ++++++++++++++++++++++--\n>  1 file changed, 36 insertions(+), 2 deletions(-)\n> \n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 9b24a0db9..da871c7fb 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -375,6 +375,9 @@ public:\n>  \tconst Transform &combinedTransform() const { return combinedTransform_; }\n>  \n>  private:\n> +\tstatic constexpr unsigned int kNumBuffersDefault = 4;\n> +\tstatic constexpr unsigned int kNumBuffersSwISPMax = 16;\n> +\n>  \t/*\n>  \t * The SimpleCameraData instance is guaranteed to be valid as long as\n>  \t * the corresponding Camera instance is valid. In order to borrow a\n> @@ -1246,6 +1249,31 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n>  \t\t\t\t\t\t\t\t\t    cfg.size);\n>  \t\t\tif (cfg.stride == 0)\n>  \t\t\t\treturn Invalid;\n> +\n> +\t\t\tif (data_->converter_) {\n> +\t\t\t\tif (cfg.bufferCount != kNumBuffersDefault) {\n> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> +\t\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n> +\t\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n> +\t\t\t\t\tstatus = Adjusted;\n> +\t\t\t\t}\n> +\t\t\t} else {\n> +\t\t\t\tif (cfg.bufferCount == 0) {\n> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> +\t\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n> +\t\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n> +\t\t\t\t\tstatus = Adjusted;\n> +\t\t\t\t}\n> +\t\t\t\tif (cfg.bufferCount > kNumBuffersSwISPMax) {\n> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> +\t\t\t\t\t\t<< \" to \" << kNumBuffersSwISPMax;\n> +\t\t\t\t\tcfg.bufferCount = kNumBuffersSwISPMax;\n> +\t\t\t\t\tstatus = Adjusted;\n> +\t\t\t\t}\n> +\t\t\t}\n>  \t\t} else {\n>  \t\t\tV4L2DeviceFormat format;\n>  \t\t\tformat.fourcc = data_->video_->toV4L2PixelFormat(cfg.pixelFormat);\n> @@ -1257,9 +1285,15 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n>  \n>  \t\t\tcfg.stride = format.planes[0].bpl;\n>  \t\t\tcfg.frameSize = format.planes[0].size;\n> -\t\t}\n>  \n> -\t\tcfg.bufferCount = 4;\n> +\t\t\tif (cfg.bufferCount != kNumBuffersDefault) {\n> +\t\t\t\tLOG(SimplePipeline, Debug)\n> +\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> +\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n> +\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n> +\t\t\t\tstatus = Adjusted;\n> +\t\t\t}\n> +\t\t}\n>  \t}\n>  \n>  \treturn status;\n> -- \n> 2.51.0\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 7CE81BDB13\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  1 Sep 2025 12:11:07 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 140ED69325;\n\tMon,  1 Sep 2025 14:11:06 +0200 (CEST)","from fanzine2.igalia.com (fanzine2.igalia.com [213.97.179.56])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5264A69318\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  1 Sep 2025 14:11:02 +0200 (CEST)","from [49.36.69.233] (helo=uajain)\n\tby fanzine2.igalia.com with esmtpsa \n\t(Cipher TLS1.3:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256)\n\t(Exim) id 1ut3NF-005GvT-0Y; Mon, 01 Sep 2025 14:11:01 +0200"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=igalia.com header.i=@igalia.com\n\theader.b=\"JogdI3A/\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com;\n\ts=20170329;\n\th=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:\n\tSubject:Cc:To:From:Date:Sender:Reply-To:Content-Transfer-Encoding:Content-ID:\n\tContent-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc\n\t:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe:\n\tList-Post:List-Owner:List-Archive;\n\tbh=FUufmXJRhYk1O7IAXMG4XXKnRVMW4ymuacULsgrp4lo=;\n\tb=JogdI3A/kxPx/3Z+2EJbgNaoV/\n\trijeBFT8IM3rp6ur/XUHi8FWgBdsAzPxK2edm5N+xseUM+XrhMVFQ5442zRB2qgw/Mvd5JRX5ub3q\n\t61zJyN38Gpf8d6i9YXhKpn75l07klErGMMdqfXzSiAPJeycGoccoTLZelPzeYS3JMXHWlR9oYyzrR\n\tmbLX5WWLT82WIfYanLTkwIOjGdA89Bq1LuKkabpoipJhAjEUs/0VOgR3UVkThj23vVixuIzvDK4x3\n\t1I71H42ARPFCQ2XJF7EBQvczz8GxwFiz6ndOuD3wk2HweStZiKmqT6RGMRsHSXXk+IQ6PWhT+cxLL\n\tRFVZoMBQ==;","Date":"Mon, 1 Sep 2025 17:41:14 +0530","From":"Umang Jain <uajain@igalia.com>","To":"Robert Mader <robert.mader@collabora.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for\n\tswISP","Message-ID":"<mkrgkm5cixwaqdthpufmwbre6zr2iiyb6uxisp23aglmtx5v3j@tyygnomitsk3>","References":"<20250831165243.36652-1-robert.mader@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20250831165243.36652-1-robert.mader@collabora.com>","User-Agent":"NeoMutt/20250510-dirty","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":35667,"web_url":"https://patchwork.libcamera.org/comment/35667/","msgid":"<73ec51de-f332-4e9a-9ecf-49d4c954db40@collabora.com>","date":"2025-09-01T12:24:03","subject":"Re: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for\n\tswISP","submitter":{"id":140,"url":"https://patchwork.libcamera.org/api/people/140/","name":"Robert Mader","email":"robert.mader@collabora.com"},"content":"On 01.09.25 14:11, Umang Jain wrote:\n> Hi Robert,\n>\n> On Sun, Aug 31, 2025 at 06:52:43PM +0200, Robert Mader wrote:\n>> When using the softwareISP we allocate the output buffers ourselves,\n>> usually from system memory. There's thus no strong reason to limit\n>> choices for client. Situations where this might be useful include:\n>> 1. Video encoding, e.g. encoding multiple buffers in parallel.\n>> 2. Clients requesting a single buffer - e.g. in multi-stream scenarios.\n> These use cases should be able to pass in bufferCount according to their\n> needs, no ?\nErr, exactly. That's what I'm trying to allow here - just limited to the \nswISP because I'm not sure about potential hardware limitations in other \nuse-cases.\n>> Thus allow up to 16 buffers - arbitrarily decided - while keeping the\n>> default to the previous 4.\n>>\n>> While on it, mark the config as adjusted if we did so.\n> Why not properly support the cfg.bufferCount instead?\n> For e.g. there was a recent patch merged for the rkisp1 pipeline\n> handler.\n\nWhat do you mean with \"properly support the cfg.bufferCount\"? No upper \nlimit?\n\n> commit 521177161a76949e85a76ddebe0694db7545ae4f\n> Author: Stefan Klug<stefan.klug@ideasonboard.com>\n> Date:   Thu Jul 17 14:59:24 2025 +0200\n>\n>      pipeline: rkisp1: Properly handle the bufferCount set in the stream configuration\n>\n>      The StreamConfiguration::bufferCount is reset to a hardcoded value of 4\n>      in RkISP1Path::validate(). Keep the minimum value of 4 but do not reset\n>      it, if it was set to a larger value.  This allows the user to set\n>      bufferCount to an arbitrary number of buffers which then can be\n>      allocated for example by the FrameBufferAllocator. If the bufferCount is\n>      set to a smaller value it gets reset to kRkISP1MinBufferCount again and\n>      the configuration is marked as adjusted.\n>\n> Do you think the simple pipeline handler will be able to support\n> cfg.bufferCount or there will be some blockers ?\n\nYep, that patch motivated the change here. Previously the simple \npipeline behaved like rkisp1 did before the quoted patch, i.e. \nhardcoding cfg.bufferCount to 4 (and not marking the config as \nadjusted). With this patch users get what they requested in \ncfg.bufferCount - if the swISP is used and with an arbitrary upper limit \nof 16.\n\n>> Signed-off-by: Robert Mader<robert.mader@collabora.com>\n>> ---\n>>   src/libcamera/pipeline/simple/simple.cpp | 38 ++++++++++++++++++++++--\n>>   1 file changed, 36 insertions(+), 2 deletions(-)\n>>\n>> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n>> index 9b24a0db9..da871c7fb 100644\n>> --- a/src/libcamera/pipeline/simple/simple.cpp\n>> +++ b/src/libcamera/pipeline/simple/simple.cpp\n>> @@ -375,6 +375,9 @@ public:\n>>   \tconst Transform &combinedTransform() const { return combinedTransform_; }\n>>   \n>>   private:\n>> +\tstatic constexpr unsigned int kNumBuffersDefault = 4;\n>> +\tstatic constexpr unsigned int kNumBuffersSwISPMax = 16;\n>> +\n>>   \t/*\n>>   \t * The SimpleCameraData instance is guaranteed to be valid as long as\n>>   \t * the corresponding Camera instance is valid. In order to borrow a\n>> @@ -1246,6 +1249,31 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n>>   \t\t\t\t\t\t\t\t\t    cfg.size);\n>>   \t\t\tif (cfg.stride == 0)\n>>   \t\t\t\treturn Invalid;\n>> +\n>> +\t\t\tif (data_->converter_) {\n>> +\t\t\t\tif (cfg.bufferCount != kNumBuffersDefault) {\n>> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n>> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n>> +\t\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n>> +\t\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n>> +\t\t\t\t\tstatus = Adjusted;\n>> +\t\t\t\t}\n>> +\t\t\t} else {\n>> +\t\t\t\tif (cfg.bufferCount == 0) {\n>> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n>> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n>> +\t\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n>> +\t\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n>> +\t\t\t\t\tstatus = Adjusted;\n>> +\t\t\t\t}\n>> +\t\t\t\tif (cfg.bufferCount > kNumBuffersSwISPMax) {\n>> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n>> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n>> +\t\t\t\t\t\t<< \" to \" << kNumBuffersSwISPMax;\n>> +\t\t\t\t\tcfg.bufferCount = kNumBuffersSwISPMax;\n>> +\t\t\t\t\tstatus = Adjusted;\n>> +\t\t\t\t}\n>> +\t\t\t}\n>>   \t\t} else {\n>>   \t\t\tV4L2DeviceFormat format;\n>>   \t\t\tformat.fourcc = data_->video_->toV4L2PixelFormat(cfg.pixelFormat);\n>> @@ -1257,9 +1285,15 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n>>   \n>>   \t\t\tcfg.stride = format.planes[0].bpl;\n>>   \t\t\tcfg.frameSize = format.planes[0].size;\n>> -\t\t}\n>>   \n>> -\t\tcfg.bufferCount = 4;\n>> +\t\t\tif (cfg.bufferCount != kNumBuffersDefault) {\n>> +\t\t\t\tLOG(SimplePipeline, Debug)\n>> +\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n>> +\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n>> +\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n>> +\t\t\t\tstatus = Adjusted;\n>> +\t\t\t}\n>> +\t\t}\n>>   \t}\n>>   \n>>   \treturn status;\n>> -- \n>> 2.51.0\n>>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 0E9CEBEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  1 Sep 2025 12:24:16 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E643369323;\n\tMon,  1 Sep 2025 14:24:14 +0200 (CEST)","from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com\n\t[136.143.188.112])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4A82E69318\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  1 Sep 2025 14:24:12 +0200 (CEST)","by mx.zohomail.com with SMTPS id 1756729446424127.30550534160375; \n\tMon, 1 Sep 2025 05:24:06 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=collabora.com\n\theader.i=robert.mader@collabora.com header.b=\"JebBCSse\"; \n\tdkim-atps=neutral","ARC-Seal":"i=1; a=rsa-sha256; t=1756729449; cv=none; \n\td=zohomail.com; s=zohoarc; \n\tb=E5apjsjeaSbbGEVDeHxG7rHASiy95nfaqfTavWEPY4Fj3i0sKEVay1dFW4lbwtX0d/Bk+iY0x+AxDtZwkoSGuAiaiW5wdCeuludtbOieYgvjmrztol4TUxOL9Lrsxj9AW4bQnlzZf5KDj8+LPnAUILnGsld0NADKrY/4FV0AgMI=","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; \n\ts=zohoarc; t=1756729449;\n\th=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To;\n\tbh=f+rYyW58MCbShUmiYteIdOKAXpReACHIodRxxH+faNg=; \n\tb=HPeCPTheZH4kBlvwuOLzw1x095JVc6g5tAodB4UYWsqIURNkNguARUu+4zIGYQ/kj9vgxjS3zWGwO5797zqS83CyuUgkLGFhKu6ip6yTck7EgStzKQbKcddzCS8R1jv74XYl70W5rRVnUWSAkhA8BV39WFBE3ZfpDUIJh6GAS8w=","ARC-Authentication-Results":"i=1; mx.zohomail.com;\n\tdkim=pass  header.i=collabora.com;\n\tspf=pass  smtp.mailfrom=robert.mader@collabora.com;\n\tdmarc=pass header.from=<robert.mader@collabora.com>","DKIM-Signature":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1756729448;\n\ts=zohomail; d=collabora.com; i=robert.mader@collabora.com;\n\th=Content-Type:Message-ID:Date:Date:MIME-Version:Subject:Subject:To:To:Cc:Cc:References:From:From:In-Reply-To:Message-Id:Reply-To;\n\tbh=f+rYyW58MCbShUmiYteIdOKAXpReACHIodRxxH+faNg=;\n\tb=JebBCSse9qZ744FyAGPDva5BQWM2sdbY3XoIJOYtM8aZ9yf5WyRf9ol82WfersVM\n\tbLX+ovzZsDpdAJO2VuXF8a8QfE5DfxzylXFJVCbb2stRn+h28A9GbiNVOVhej5gkR3c\n\tlrp+658feVz24MQeeYAZJscHkEvrRrZXdTbRuOL8=","Content-Type":"multipart/alternative;\n\tboundary=\"------------wTi8IM27RD86HDCA0aBp8ZQk\"","Message-ID":"<73ec51de-f332-4e9a-9ecf-49d4c954db40@collabora.com>","Date":"Mon, 1 Sep 2025 14:24:03 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for\n\tswISP","To":"Umang Jain <uajain@igalia.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20250831165243.36652-1-robert.mader@collabora.com>\n\t<mkrgkm5cixwaqdthpufmwbre6zr2iiyb6uxisp23aglmtx5v3j@tyygnomitsk3>","Content-Language":"en-US, de-DE","From":"Robert Mader <robert.mader@collabora.com>","In-Reply-To":"<mkrgkm5cixwaqdthpufmwbre6zr2iiyb6uxisp23aglmtx5v3j@tyygnomitsk3>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":35668,"web_url":"https://patchwork.libcamera.org/comment/35668/","msgid":"<e5yxtjcv5bxjeq4fj5hts32aqsbtkvjenfdqbqtge75gruneqk@ntqnkw3v27am>","date":"2025-09-01T12:45:15","subject":"Re: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for\n\tswISP","submitter":{"id":232,"url":"https://patchwork.libcamera.org/api/people/232/","name":"Umang Jain","email":"uajain@igalia.com"},"content":"On Mon, Sep 01, 2025 at 02:24:03PM +0200, Robert Mader wrote:\n> On 01.09.25 14:11, Umang Jain wrote:\n> > Hi Robert,\n> > \n> > On Sun, Aug 31, 2025 at 06:52:43PM +0200, Robert Mader wrote:\n> > > When using the softwareISP we allocate the output buffers ourselves,\n> > > usually from system memory. There's thus no strong reason to limit\n> > > choices for client. Situations where this might be useful include:\n> > > 1. Video encoding, e.g. encoding multiple buffers in parallel.\n> > > 2. Clients requesting a single buffer - e.g. in multi-stream scenarios.\n> > These use cases should be able to pass in bufferCount according to their\n> > needs, no ?\n> Err, exactly. That's what I'm trying to allow here - just limited to the\n> swISP because I'm not sure about potential hardware limitations in other\n> use-cases.\n> > > Thus allow up to 16 buffers - arbitrarily decided - while keeping the\n> > > default to the previous 4.\n> > > \n> > > While on it, mark the config as adjusted if we did so.\n> > Why not properly support the cfg.bufferCount instead?\n> > For e.g. there was a recent patch merged for the rkisp1 pipeline\n> > handler.\n> \n> What do you mean with \"properly support the cfg.bufferCount\"? No upper\n> limit?\n> \n> > commit 521177161a76949e85a76ddebe0694db7545ae4f\n> > Author: Stefan Klug<stefan.klug@ideasonboard.com>\n> > Date:   Thu Jul 17 14:59:24 2025 +0200\n> > \n> >      pipeline: rkisp1: Properly handle the bufferCount set in the stream configuration\n> > \n> >      The StreamConfiguration::bufferCount is reset to a hardcoded value of 4\n> >      in RkISP1Path::validate(). Keep the minimum value of 4 but do not reset\n> >      it, if it was set to a larger value.  This allows the user to set\n> >      bufferCount to an arbitrary number of buffers which then can be\n> >      allocated for example by the FrameBufferAllocator. If the bufferCount is\n> >      set to a smaller value it gets reset to kRkISP1MinBufferCount again and\n> >      the configuration is marked as adjusted.\n> > \n> > Do you think the simple pipeline handler will be able to support\n> > cfg.bufferCount or there will be some blockers ?\n> \n> Yep, that patch motivated the change here. Previously the simple pipeline\n> behaved like rkisp1 did before the quoted patch, i.e. hardcoding\n> cfg.bufferCount to 4 (and not marking the config as adjusted). With this\n> patch users get what they requested in cfg.bufferCount - if the swISP is\n> used and with an arbitrary upper limit of 16.\n\nAh ok, so the logic is aligned.\n\n> \n> > > Signed-off-by: Robert Mader<robert.mader@collabora.com>\n> > > ---\n> > >   src/libcamera/pipeline/simple/simple.cpp | 38 ++++++++++++++++++++++--\n> > >   1 file changed, 36 insertions(+), 2 deletions(-)\n> > > \n> > > diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> > > index 9b24a0db9..da871c7fb 100644\n> > > --- a/src/libcamera/pipeline/simple/simple.cpp\n> > > +++ b/src/libcamera/pipeline/simple/simple.cpp\n> > > @@ -375,6 +375,9 @@ public:\n> > >   \tconst Transform &combinedTransform() const { return combinedTransform_; }\n> > >   private:\n> > > +\tstatic constexpr unsigned int kNumBuffersDefault = 4;\n> > > +\tstatic constexpr unsigned int kNumBuffersSwISPMax = 16;\n> > > +\n> > >   \t/*\n> > >   \t * The SimpleCameraData instance is guaranteed to be valid as long as\n> > >   \t * the corresponding Camera instance is valid. In order to borrow a\n> > > @@ -1246,6 +1249,31 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n> > >   \t\t\t\t\t\t\t\t\t    cfg.size);\n> > >   \t\t\tif (cfg.stride == 0)\n> > >   \t\t\t\treturn Invalid;\n> > > +\n> > > +\t\t\tif (data_->converter_) {\n> > > +\t\t\t\tif (cfg.bufferCount != kNumBuffersDefault) {\n> > > +\t\t\t\t\tLOG(SimplePipeline, Debug)\n> > > +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> > > +\t\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n> > > +\t\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n> > > +\t\t\t\t\tstatus = Adjusted;\n> > > +\t\t\t\t}\n> > > +\t\t\t} else {\n> > > +\t\t\t\tif (cfg.bufferCount == 0) {\n> > > +\t\t\t\t\tLOG(SimplePipeline, Debug)\n> > > +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> > > +\t\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n> > > +\t\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n> > > +\t\t\t\t\tstatus = Adjusted;\n> > > +\t\t\t\t}\n> > > +\t\t\t\tif (cfg.bufferCount > kNumBuffersSwISPMax) {\n> > > +\t\t\t\t\tLOG(SimplePipeline, Debug)\n> > > +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> > > +\t\t\t\t\t\t<< \" to \" << kNumBuffersSwISPMax;\n> > > +\t\t\t\t\tcfg.bufferCount = kNumBuffersSwISPMax;\n> > > +\t\t\t\t\tstatus = Adjusted;\n> > > +\t\t\t\t}\n> > > +\t\t\t}\n\nUntil here, this makes sense to me.\n\n> > >   \t\t} else {\n> > >   \t\t\tV4L2DeviceFormat format;\n> > >   \t\t\tformat.fourcc = data_->video_->toV4L2PixelFormat(cfg.pixelFormat);\n> > > @@ -1257,9 +1285,15 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n> > >   \t\t\tcfg.stride = format.planes[0].bpl;\n> > >   \t\t\tcfg.frameSize = format.planes[0].size;\n> > > -\t\t}\n> > > -\t\tcfg.bufferCount = 4;\n> > > +\t\t\tif (cfg.bufferCount != kNumBuffersDefault) {\n> > > +\t\t\t\tLOG(SimplePipeline, Debug)\n> > > +\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> > > +\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n> > > +\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n> > > +\t\t\t\tstatus = Adjusted;\n> > > +\t\t\t}\n> > > +\t\t}\n\nHowever, I don't understand this. I see that cfg.bufferCount here is\neither 1) kNumBuffersDefault or 2) a value <= kNumBuffersSwISPMax. Won't it\nget reset in case of 2) ?\n\n> > >   \t}\n> > >   \treturn status;\n> > > -- \n> > > 2.51.0\n> > > \n> -- \n> Robert Mader\n> Consultant Software Developer\n> \n> Collabora Ltd.\n> Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, UK\n> Registered in England & Wales, no. 5513718","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 89E79BDB13\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  1 Sep 2025 12:45:11 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 46B0D69324;\n\tMon,  1 Sep 2025 14:45:10 +0200 (CEST)","from fanzine2.igalia.com (fanzine2.igalia.com [213.97.179.56])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 874F069323\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  1 Sep 2025 14:45:06 +0200 (CEST)","from [49.36.69.233] (helo=uajain)\n\tby fanzine2.igalia.com with esmtpsa \n\t(Cipher TLS1.3:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256)\n\t(Exim) id 1ut3uD-005Hdp-65; Mon, 01 Sep 2025 14:45:05 +0200"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=igalia.com header.i=@igalia.com\n\theader.b=\"GqmW7ipb\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com;\n\ts=20170329;\n\th=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:\n\tSubject:Cc:To:From:Date:Sender:Reply-To:Content-Transfer-Encoding:Content-ID:\n\tContent-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc\n\t:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe:\n\tList-Post:List-Owner:List-Archive;\n\tbh=LIPH4oW3KX0sOf7ahUbMTBSgABg6fRmAngzi24LOIiw=;\n\tb=GqmW7ipbQraoE+zC7HmfFIxmVT\n\tsVyVFqIg22RaTqwKso+7dmNr2J5mspxzvP6u+fMkuMWGVmRDmtFITZyiDDqRPr9yryawJs9TSu4dS\n\tEXnUtDChqcRegmUCsKxjsWqy/AolAfXJaFnNkEg2HN9M1pRhz+1V1YmOvm8hWI7a5QFIBRHsz9z7v\n\tMCeOUST9V/ZeOqf5MXtt7gZn0uZaOclk+UCunNDgU5VlyvM5Ocwv00pP7MzKi1/owejOPkdSCNcv5\n\t9pJhNoHcRP1w52HNMi+lLKfvkZSLP1XZlBN2YSPf4pVv5eB6q6tiyqeOYJnmomeOmF13lXitAtCTP\n\t77ao2uwQ==;","Date":"Mon, 1 Sep 2025 18:15:15 +0530","From":"Umang Jain <uajain@igalia.com>","To":"Robert Mader <robert.mader@collabora.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for\n\tswISP","Message-ID":"<e5yxtjcv5bxjeq4fj5hts32aqsbtkvjenfdqbqtge75gruneqk@ntqnkw3v27am>","References":"<20250831165243.36652-1-robert.mader@collabora.com>\n\t<mkrgkm5cixwaqdthpufmwbre6zr2iiyb6uxisp23aglmtx5v3j@tyygnomitsk3>\n\t<73ec51de-f332-4e9a-9ecf-49d4c954db40@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<73ec51de-f332-4e9a-9ecf-49d4c954db40@collabora.com>","User-Agent":"NeoMutt/20250510-dirty","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":35681,"web_url":"https://patchwork.libcamera.org/comment/35681/","msgid":"<20250901150740.GF1705@pendragon.ideasonboard.com>","date":"2025-09-01T15:07:40","subject":"Re: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for\n\tswISP","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Mon, Sep 01, 2025 at 12:22:37PM +0200, Robert Mader wrote:\n> On 01.09.25 11:35, Milan Zamazal wrote:\n> > Hi Robert,\n> >\n> > thank you for the patch.\n> >\n> > Robert Mader<robert.mader@collabora.com> writes:\n> >\n> >> When using the softwareISP we allocate the output buffers ourselves,\n> > How does it differ from the other cases, namely for a converter and for\n> > raw streams?  Should it be explained in a code comment in the code\n> > below?\n> \n> In the other cases we allocate buffers via V4L2, while in the swISP case \n> we use our own DmaBufAllocator (only allocating 3 \"internal\" buffers via \n> V4L2), thus shouldn't have any hardware limitation apart from system \n> memory. FTR., it might well make sense to allow more buffers in the \n> other cases as well - I'm just not sure if some V4L2 drivers might have \n> limitations. If we can assume that every well written driver handles \n> 1-16 buffers - then I'd say lets support it.\n\nFor all practical purposes, the limit should be the same for\nV4L2-allocated buffers: the only limiting factor is system memory.\nDrivers are free to set an arbitrary limit on the number of buffers, but\nin practice only 3 drivers set such a limit (hantro, vicodec and vivid),\nand all of them set the limit to 64. The limit is otherwise set by the\nvb2 core to 32 buffers.\n\n> >> usually from system memory. There's thus no strong reason to limit\n> >> choices for client. Situations where this might be useful include:\n> >> 1. Video encoding, e.g. encoding multiple buffers in parallel.\n> >> 2. Clients requesting a single buffer - e.g. in multi-stream scenarios.\n> >>\n> >> Thus allow up to 16 buffers - arbitrarily decided - while keeping the\n> >> default to the previous 4.\n> >>\n> >> While on it, mark the config as adjusted if we did so.\n> >>\n> >> Signed-off-by: Robert Mader<robert.mader@collabora.com>\n> >> ---\n> >>   src/libcamera/pipeline/simple/simple.cpp | 38 ++++++++++++++++++++++--\n> >>   1 file changed, 36 insertions(+), 2 deletions(-)\n> >>\n> >> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> >> index 9b24a0db9..da871c7fb 100644\n> >> --- a/src/libcamera/pipeline/simple/simple.cpp\n> >> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> >> @@ -375,6 +375,9 @@ public:\n> >>   \tconst Transform &combinedTransform() const { return combinedTransform_; }\n> >>   \n> >>   private:\n> >> +\tstatic constexpr unsigned int kNumBuffersDefault = 4;\n> >> +\tstatic constexpr unsigned int kNumBuffersSwISPMax = 16;\n> > s/kNumBuffersSwISPMax/kNumBuffersSwIspMax/ to make it consistent with\n> > similar identifiers.\n> \n> Thanks, will change in v2!\n> \n> >> +\n> >>   \t/*\n> >>   \t * The SimpleCameraData instance is guaranteed to be valid as long as\n> >>   \t * the corresponding Camera instance is valid. In order to borrow a\n> >> @@ -1246,6 +1249,31 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n> >>   \t\t\t\t\t\t\t\t\t    cfg.size);\n> >>   \t\t\tif (cfg.stride == 0)\n> >>   \t\t\t\treturn Invalid;\n> >> +\n> >> +\t\t\tif (data_->converter_) {\n> >> +\t\t\t\tif (cfg.bufferCount != kNumBuffersDefault) {\n> >> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n> >> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> >> +\t\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n> >> +\t\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n> >> +\t\t\t\t\tstatus = Adjusted;\n> >> +\t\t\t\t}\n> >> +\t\t\t} else {\n> >> +\t\t\t\tif (cfg.bufferCount == 0) {\n> >> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n> >> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> >> +\t\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n> >> +\t\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n> >> +\t\t\t\t\tstatus = Adjusted;\n> >> +\t\t\t\t}\n> >> +\t\t\t\tif (cfg.bufferCount > kNumBuffersSwISPMax) {\n> >> +\t\t\t\t\tLOG(SimplePipeline, Debug)\n> >> +\t\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> >> +\t\t\t\t\t\t<< \" to \" << kNumBuffersSwISPMax;\n> >> +\t\t\t\t\tcfg.bufferCount = kNumBuffersSwISPMax;\n> >> +\t\t\t\t\tstatus = Adjusted;\n> >> +\t\t\t\t}\n> >> +\t\t\t}\n> >>   \t\t} else {\n> >>   \t\t\tV4L2DeviceFormat format;\n> >>   \t\t\tformat.fourcc = data_->video_->toV4L2PixelFormat(cfg.pixelFormat);\n> >> @@ -1257,9 +1285,15 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n> >>   \n> >>   \t\t\tcfg.stride = format.planes[0].bpl;\n> >>   \t\t\tcfg.frameSize = format.planes[0].size;\n> >> -\t\t}\n> >>   \n> >> -\t\tcfg.bufferCount = 4;\n> >> +\t\t\tif (cfg.bufferCount != kNumBuffersDefault) {\n> >> +\t\t\t\tLOG(SimplePipeline, Debug)\n> >> +\t\t\t\t\t<< \"Adjusting bufferCount from \" << cfg.bufferCount\n> >> +\t\t\t\t\t<< \" to \" << kNumBuffersDefault;\n> >> +\t\t\t\tcfg.bufferCount = kNumBuffersDefault;\n> >> +\t\t\t\tstatus = Adjusted;\n> >> +\t\t\t}\n> >> +\t\t}\n> >>   \t}\n> >>   \n> >>   \treturn status;","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id ED99FBEFBE\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  1 Sep 2025 15:08:01 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8AF1369332;\n\tMon,  1 Sep 2025 17:08:01 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 66D3069323\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  1 Sep 2025 17:08:00 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(230.215-178-91.adsl-dyn.isp.belgacom.be [91.178.215.230])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 21354E92;\n\tMon,  1 Sep 2025 17:06:53 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"qAgCDACu\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1756739213;\n\tbh=Z2RVVg4UmzzSZg8OWXQx4m9y7Z4t8NCcFXmn2w/UgeE=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=qAgCDACu89kObcs1wyKofQ02qAtqE5psZb9cLzuymMQYj2Xt2bKQxaHaSQukA3XZ0\n\trQ64skcVeoy1CYIdU5za7ONMdptxkRJR9xI1yMImBBQCOzbxa/1Fv4LxwIttdD6Nmt\n\tg+CiRwFdKL3aKUiGLecvsGI09DQvlVEZ6RdDSjXU=","Date":"Mon, 1 Sep 2025 17:07:40 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Robert Mader <robert.mader@collabora.com>","Cc":"Milan Zamazal <mzamazal@redhat.com>, libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH] pipeline: simple: Allow buffer counts from 1 to 16 for\n\tswISP","Message-ID":"<20250901150740.GF1705@pendragon.ideasonboard.com>","References":"<20250831165243.36652-1-robert.mader@collabora.com>\n\t<85o6ru3483.fsf@mzamazal-thinkpadp1gen7.tpbc.csb>\n\t<31bb5399-90e6-4b28-b15e-f12fee65ff75@collabora.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<31bb5399-90e6-4b28-b15e-f12fee65ff75@collabora.com>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]