Show a patch.

GET /api/1.1/patches/26272/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 26272,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/26272/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/26272/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20260310120106.79922-4-johannes.goede@oss.qualcomm.com>",
    "date": "2026-03-10T12:01:04",
    "name": "[v7,3/5] software_isp: debayer_cpu: Add multi-threading support",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "a2e2a4f7885ba32961bd84a94ffb96b1cab496de",
    "submitter": {
        "id": 242,
        "url": "https://patchwork.libcamera.org/api/1.1/people/242/?format=api",
        "name": "Hans de Goede",
        "email": "johannes.goede@oss.qualcomm.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/26272/mbox/",
    "series": [
        {
            "id": 5825,
            "url": "https://patchwork.libcamera.org/api/1.1/series/5825/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5825",
            "date": "2026-03-10T12:01:01",
            "name": "software_isp: debayer_cpu: Add multi-threading support",
            "version": 7,
            "mbox": "https://patchwork.libcamera.org/series/5825/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/26272/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/26272/checks/",
    "tags": {},
    "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 1A945BE086\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 10 Mar 2026 12:01:22 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DC92B62645;\n\tTue, 10 Mar 2026 13:01:20 +0100 (CET)",
            "from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com\n\t[205.220.168.131])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id F346C62626\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 10 Mar 2026 13:01:18 +0100 (CET)",
            "from pps.filterd (m0279863.ppops.net [127.0.0.1])\n\tby mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n\t62A9I8Vt2460651 for <libcamera-devel@lists.libcamera.org>;\n\tTue, 10 Mar 2026 12:01:17 GMT",
            "from mail-vs1-f72.google.com (mail-vs1-f72.google.com\n\t[209.85.217.72])\n\tby mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4csyv1c5eg-1\n\t(version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 10 Mar 2026 12:01:17 +0000 (GMT)",
            "by mail-vs1-f72.google.com with SMTP id\n\tada2fe7eead31-5ffbe27449cso34544749137.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 10 Mar 2026 05:01:17 -0700 (PDT)",
            "from t14s\n\t(2001-1c00-0c32-7800-beb3-9058-f5fe-3f2e.cable.dynamic.v6.ziggo.nl.\n\t[2001:1c00:c32:7800:beb3:9058:f5fe:3f2e])\n\tby smtp.gmail.com with ESMTPSA id\n\t5b1f17b1804b1-48541aa7aacsm87843405e9.13.2026.03.10.05.01.13\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 10 Mar 2026 05:01:13 -0700 (PDT)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=qualcomm.com header.i=@qualcomm.com\n\theader.b=\"fF/rb/Ne\"; dkim=pass (2048-bit key;\n\tunprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n\theader.b=\"HL0w5Z1O\"; dkim-atps=neutral",
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n\tcc:content-transfer-encoding:content-type:date:from:in-reply-to\n\t:message-id:mime-version:references:subject:to; s=qcppdkim1; bh=\n\tj8iK55wVYltfsPQzWGh2pIi5AXAitYIIZhZveZC8niU=; b=fF/rb/NeczPdcfpR\n\tgu7jEtVCj2eBGg3F9Se41p9kk/pUJXlJzoivPHbtS9yiG0FSYYy7sqep2qZPXsUR\n\tVO3dSI9BBNU8s6dmI8GODfdNs0CYVxhUl2j5m7+ujpLnBEWTGPGdHlFKmkyq/LDv\n\tGyZH1lP3Zo9nWKyhvfxx3caCk9lTH3MvFts/CT9n5VtEj//uWuHBas2JkK88Fia9\n\tuc0G22krnlk9TxqzPShWiFh5UH3mG/CGrXhrQ/KoxQhMA+tg7XhPWN8myuAbTSRM\n\tozvaIcGC89voDNypGEgNweyOf8LVs5Xr22mpJ3S3tHnhYCSwVgdW7f0d3M3UpIoN\n\tVFoqig==",
            "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=oss.qualcomm.com; s=google; t=1773144076; x=1773748876;\n\tdarn=lists.libcamera.org; \n\th=content-transfer-encoding:mime-version:references:in-reply-to\n\t:message-id:date:subject:cc:to:from:from:to:cc:subject:date\n\t:message-id:reply-to;\n\tbh=j8iK55wVYltfsPQzWGh2pIi5AXAitYIIZhZveZC8niU=;\n\tb=HL0w5Z1O5oPySme9OkfgKqTKRdlBXodvbMurXYvJ/4o3w6AzGybDKMfE1vI3tbUbeb\n\t9db0EFU2Xy32IWXewPWS2ElteS+cdA7yJHxarud09oFXRGxFnnMac6tSgSsAKJgpdrKW\n\ty8BHcB7lhgjbxyd8MtFXxplqqTMo189418sSYenECOiFOrmkV2/SykH1nWF6lLjBDoqB\n\t2Ci4Z+RXacu9fPkYs+/clTyfRYLKruAsSqum0Gru9UqLoos+/2scGZW3MfMW5S1YqIkp\n\tAgIrwv1XEfaeRTn8nLKYQALGgDQIwWeliATzwKVebt9/1Xmn9cSzOCOReJnczwcqPnF7\n\tPYzQ=="
        ],
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1773144076; x=1773748876;\n\th=content-transfer-encoding:mime-version:references:in-reply-to\n\t:message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n\t:to:cc:subject:date:message-id:reply-to;\n\tbh=j8iK55wVYltfsPQzWGh2pIi5AXAitYIIZhZveZC8niU=;\n\tb=bgd+UlwvXxmDR0rce/LjC7IllLL/dduZUdzVQE/oUNJTNTk/ktPrdimRdj6lI65anU\n\t8iNVAi1VdpvlM/opfPozN8ByVG/WodVBtKt1rh7Ciz7yxFSJ7LQHRs6tDIfSgOLBXIJ7\n\tQhfWlqzU2oMVGZo56gCU7uobEBpl5OS97lAEwY0+za6BIIn4JCnbrkcSzwaU1C75Jbrr\n\toLdS9gep8NVQKSVzUNc/sXt6KdHpcVWlxVi5UFBC0w/hoze9vPPL4OPQpMCNlWzk/rPF\n\tyw3Mb/clOmB2ODv0lL/Rjnrpz5d4gAez0Dp8x6epye8cqwcyODbt8ratV45p4pLhN7Ru\n\tTxlw==",
        "X-Gm-Message-State": "AOJu0Yyzc5PmszAsiW2CVdt8u2qQLBFnbmAWZI+NArP7HIi2ucrngw+3\n\trqD7xA9pamRcTtiTWVTza0nW+9sEeyLpQ2rxHn2ORo961NGC4a8an3HmS5Mb9hHD4fVTW4Jz73o\n\tMdj1va5wjGtEpC2d9OFVXIv9RNgLj3SJ+3OFarZ89KBL/XE+VALigH5imGJCKD782v1xscT436Z\n\t6yyXZaVRdj",
        "X-Gm-Gg": "ATEYQzx0SEKCNKCw7Sy+LwTQVVO0w8ukKLCLZsTIog4LqFezADaVMcSEwjN+G6NddGI\n\tXS2MBxDclxY76sddJ3yFNH+RdKHusTB8AtNEW3/DA3rcQI1cKu09g6zy1dQJwYcTQDuM1zyA/yC\n\tL5n0e/AjNxvEF8lqEqTjAF4h1WRIBCwK/V0dwarJIM+I64Gps1e9lhQLLEODqKzjGHsW64a5+pG\n\tx0QoM/eBPoIBBCibLfB7ejt7/+o9TioiX1D83TKpYXTTIAHAHsUSGmFQFWeF7uBIk+CzZARYVto\n\tMeSyTCMI4nrxQTZzd+mmW6MFDaimZbDe2JFVpGMvEPDdKlsUs4teOrKDrdpjHzIeXdToRpfVjF2\n\ti6shMofsMJIQxN2kME+2yIpH7zH0zesNDcIKJtLdhUyQP3E5KWXroBtdwpcoWX/ZuNodpsVkJuu\n\tAVGLlPZ4KPHWDAq0TNEI3jFxJdwsq6kNb+dA==",
        "X-Received": [
            "by 2002:a05:6102:26d4:b0:5ff:de83:3e46 with SMTP id\n\tada2fe7eead31-6003a341f56mr1157373137.7.1773144075524; \n\tTue, 10 Mar 2026 05:01:15 -0700 (PDT)",
            "by 2002:a05:6102:26d4:b0:5ff:de83:3e46 with SMTP id\n\tada2fe7eead31-6003a341f56mr1157345137.7.1773144074769; \n\tTue, 10 Mar 2026 05:01:14 -0700 (PDT)"
        ],
        "From": "Hans de Goede <johannes.goede@oss.qualcomm.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "Milan Zamazal <mzamazal@redhat.com>, Hans de Goede\n\t<johannes.goede@oss.qualcomm.com>, =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?=\n\t<barnabas.pocze@ideasonboard.com>",
        "Subject": "[PATCH v7 3/5] software_isp: debayer_cpu: Add multi-threading\n\tsupport",
        "Date": "Tue, 10 Mar 2026 13:01:04 +0100",
        "Message-ID": "<20260310120106.79922-4-johannes.goede@oss.qualcomm.com>",
        "X-Mailer": "git-send-email 2.53.0",
        "In-Reply-To": "<20260310120106.79922-1-johannes.goede@oss.qualcomm.com>",
        "References": "<20260310120106.79922-1-johannes.goede@oss.qualcomm.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-Proofpoint-GUID": "3MAOpUKOEH6MDNmz17NZUs5fzruURrkD",
        "X-Proofpoint-ORIG-GUID": "3MAOpUKOEH6MDNmz17NZUs5fzruURrkD",
        "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwMzEwMDEwNCBTYWx0ZWRfX2MDRV3635NWZ\n\tM/+MboujdkJjSqIEYIga1Xp8Annc7S19W61qh6AB+eixy4j36tRU7jXWpzbdBd0n90mHJFOVQLq\n\tDnpw1yYmQGZ8v98hE/eUIa5lm7Skyo8uLRP/HBlxfAAFUwrOjGI4WO6bXyWxF6zMWS7gJwLXQdO\n\tP7cpKsFcpyZp+QvnE4kamTUmNXw3AMdpLzCJDGonWxmuZfTf7hEsnJVkbO2BSYoqsL4lBhj3RzG\n\tIuiccQsP6GKQP/ECvtGOZNoveO8NnFGehcFToV6cB5qKfnnNn/o4Wq3T/NjHNsibkEGCGhqFWVR\n\tYIKDN6mTvYM+2j9XU8IaVcWflkSvarkRU6oSX6xtQHehwduGGvtTHnkQaP6kBhKag9xgedMGjb8\n\tXickuVKrIABqBYQY2plNz8AdWcolHoMA57fr95dYTw7amVofA8KXRDKKbnzWJ00iXQOxSU3SCP0\n\tSEn0BxYhMDF1+MbyF7Q==",
        "X-Authority-Analysis": "v=2.4 cv=Cuays34D c=1 sm=1 tr=0 ts=69b0080d cx=c_pps\n\ta=DUEm7b3gzWu7BqY5nP7+9g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10\n\ta=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n\ta=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=P1BnusSwAAAA:8\n\ta=20KFwNOVAAAA:8 a=EUspDBNiAAAA:8 a=4i1XYD-pSnUufzSozdQA:9\n\ta=3ZKOabzyN94A:10\n\ta=QEXdDO2ut3YA:10 a=-aSRE8QhW-JAV6biHavz:22 a=D0XLA9XvdZm18NrgonBM:22",
        "X-Proofpoint-Virus-Version": "vendor=baseguard\n\tengine=ICAP:2.0.293, Aquarius:18.0.1143, Hydra:6.1.51,\n\tFMLib:17.12.100.49\n\tdefinitions=2026-03-10_02,2026-03-09_02,2025-10-01_01",
        "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n\tmalwarescore=0 clxscore=1015 spamscore=0 adultscore=0\n\tpriorityscore=1501\n\tphishscore=0 suspectscore=0 lowpriorityscore=0 bulkscore=0\n\timpostorscore=0\n\tclassifier=typeunknown authscore=0 authtc= authcc= route=outbound\n\tadjust=0\n\treason=mlx scancount=1 engine=8.22.0-2602130000\n\tdefinitions=main-2603100104",
        "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>"
    },
    "content": "Add CPU soft ISP multi-threading support.\n\nBenchmark results for the Arduino Uno-Q with a weak CPU which is good for\nperformance testing, all numbers with an IMX219 running at\n3280x2464 -> 3272x2464:\n\n1 thread : 147ms / frame, ~6.5 fps\n2 threads:  80ms / frame, ~12.5 fps\n3 threads:  65ms / frame, ~15 fps\n\nAdding a 4th thread does not improve performance.\n\nTested-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com> # ThinkPad X1 Yoga Gen 7 + ov2740\nReviewed-by: Milan Zamazal <mzamazal@redhat.com>\nSigned-off-by: Hans de Goede <johannes.goede@oss.qualcomm.com>\n---\nChanges in v7:\n- Add Debug message logging thread count\n\nChanges in v5:\n- Extend software_isp.threads docs in runtime_configuration.rst\n\nChanges in v4:\n- Document software_isp.threads option in runtime_configuration.rst\n- Add an use constants for min/max/default number of threads\n\nChanges in v3:\n- Adjust for DebayerCpuThread now inheriting from Thread\n- Use for (auto &thread : threads_)\n\nChanges in v2:\n- Adjust to use the new DebayerCpuThread class introduced in the v2 patch-series\n- Re-use threads instead of starting new threads every frame\n---\n Documentation/runtime_configuration.rst    |  8 ++++\n src/libcamera/software_isp/debayer_cpu.cpp | 47 ++++++++++++++++++++--\n src/libcamera/software_isp/debayer_cpu.h   | 10 +++++\n 3 files changed, 62 insertions(+), 3 deletions(-)",
    "diff": "diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst\nindex e99ef2fb9..651929a4d 100644\n--- a/Documentation/runtime_configuration.rst\n+++ b/Documentation/runtime_configuration.rst\n@@ -51,6 +51,7 @@ file structure:\n       measure:\n         skip: # non-negative integer, frames to skip initially\n         number: # non-negative integer, frames to measure\n+      threads: # integer >= 1, number of render threads to use, default 2\n \n Configuration file example\n --------------------------\n@@ -84,6 +85,7 @@ Configuration file example\n        measure:\n          skip: 50\n          number: 30\n+       threads: 2\n \n List of variables and configuration options\n -------------------------------------------\n@@ -167,6 +169,12 @@ software_isp.measure.skip, software_isp.measure.number\n \n    Example `number` value: ``30``\n \n+software_isp.threads\n+   Number of render threads the software ISP uses when using the CPU.\n+   This must be between 1 and 8 and the default is 2.\n+\n+   Example value: ``2``\n+\n Further details\n ---------------\n \ndiff --git a/src/libcamera/software_isp/debayer_cpu.cpp b/src/libcamera/software_isp/debayer_cpu.cpp\nindex fc3305d2e..1de70b3b7 100644\n--- a/src/libcamera/software_isp/debayer_cpu.cpp\n+++ b/src/libcamera/software_isp/debayer_cpu.cpp\n@@ -76,6 +76,7 @@ DebayerCpuThread::DebayerCpuThread(DebayerCpu *debayer, unsigned int threadIndex\n \t  debayer_(debayer), threadIndex_(threadIndex),\n \t  enableInputMemcpy_(enableInputMemcpy)\n {\n+\tmoveToThread(this);\n }\n \n /**\n@@ -107,11 +108,15 @@ DebayerCpu::DebayerCpu(std::unique_ptr<SwStatsCpu> stats, const GlobalConfigurat\n \tbool enableInputMemcpy =\n \t\tconfiguration.option<bool>({ \"software_isp\", \"copy_input_buffer\" }).value_or(true);\n \n-\t/* Just one thread object for now, which will be called inline rather than async */\n-\tthreads_.resize(1);\n+\tunsigned int threadCount =\n+\t\tconfiguration.option<unsigned int>({ \"software_isp\", \"threads\" }).value_or(kDefaultThreads);\n+\tthreadCount = std::clamp(threadCount, kMinThreads, kMaxThreads);\n+\tthreads_.resize(threadCount);\n \n \tfor (unsigned int i = 0; i < threads_.size(); i++)\n \t\tthreads_[i] = std::make_unique<DebayerCpuThread>(this, i, enableInputMemcpy);\n+\n+\tLOG(Debayer, Debug) << \"Thread count \" << threadCount;\n }\n \n DebayerCpu::~DebayerCpu() = default;\n@@ -746,6 +751,11 @@ void DebayerCpuThread::process(uint32_t frame, const uint8_t *src, uint8_t *dst)\n \t\tprocess2(frame, src, dst);\n \telse\n \t\tprocess4(frame, src, dst);\n+\n+\tdebayer_->workPendingMutex_.lock();\n+\tdebayer_->workPending_ &= ~(1 << threadIndex_);\n+\tdebayer_->workPendingMutex_.unlock();\n+\tdebayer_->workPendingCv_.notify_one();\n }\n \n void DebayerCpuThread::process2(uint32_t frame, const uint8_t *src, uint8_t *dst)\n@@ -985,7 +995,21 @@ void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output\n \n \tstats_->startFrame(frame);\n \n-\tthreads_[0]->process(frame, in.planes()[0].data(), out.planes()[0].data());\n+\tworkPendingMutex_.lock();\n+\tworkPending_ = (1 << threads_.size()) - 1;\n+\tworkPendingMutex_.unlock();\n+\n+\tfor (auto &thread : threads_)\n+\t\tthread->invokeMethod(&DebayerCpuThread::process,\n+\t\t\t\t     ConnectionTypeQueued, frame,\n+\t\t\t\t     in.planes()[0].data(), out.planes()[0].data());\n+\n+\t{\n+\t\tMutexLocker locker(workPendingMutex_);\n+\t\tworkPendingCv_.wait(locker, [&]() LIBCAMERA_TSA_REQUIRES(workPendingMutex_) {\n+\t\t\treturn workPending_ == 0;\n+\t\t});\n+\t}\n \n \tmetadata.planes()[0].bytesused = out.planes()[0].size();\n \n@@ -1004,6 +1028,23 @@ void DebayerCpu::process(uint32_t frame, FrameBuffer *input, FrameBuffer *output\n \tinputBufferReady.emit(input);\n }\n \n+int DebayerCpu::start()\n+{\n+\tfor (auto &thread : threads_)\n+\t\tthread->start();\n+\n+\treturn 0;\n+}\n+\n+void DebayerCpu::stop()\n+{\n+\tfor (auto &thread : threads_)\n+\t\tthread->exit();\n+\n+\tfor (auto &thread : threads_)\n+\t\tthread->wait();\n+}\n+\n SizeRange DebayerCpu::sizes(PixelFormat inputFormat, const Size &inputSize)\n {\n \tSize patternSize = this->patternSize(inputFormat);\ndiff --git a/src/libcamera/software_isp/debayer_cpu.h b/src/libcamera/software_isp/debayer_cpu.h\nindex 8e57c273b..a96998e92 100644\n--- a/src/libcamera/software_isp/debayer_cpu.h\n+++ b/src/libcamera/software_isp/debayer_cpu.h\n@@ -16,6 +16,7 @@\n #include <vector>\n \n #include <libcamera/base/object.h>\n+#include <libcamera/base/mutex.h>\n \n #include \"libcamera/internal/bayer_format.h\"\n #include \"libcamera/internal/global_configuration.h\"\n@@ -41,6 +42,8 @@ public:\n \tstd::tuple<unsigned int, unsigned int>\n \tstrideAndFrameSize(const PixelFormat &outputFormat, const Size &size);\n \tvoid process(uint32_t frame, FrameBuffer *input, FrameBuffer *output, const DebayerParams &params);\n+\tint start();\n+\tvoid stop();\n \tSizeRange sizes(PixelFormat inputFormat, const Size &inputSize);\n \tconst SharedFD &getStatsFD() { return stats_->getStatsFD(); }\n \n@@ -144,6 +147,13 @@ private:\n \tstd::unique_ptr<SwStatsCpu> stats_;\n \tunsigned int xShift_; /* Offset of 0/1 applied to window_.x */\n \n+\tstatic constexpr unsigned int kMinThreads = 1;\n+\tstatic constexpr unsigned int kMaxThreads = 8;\n+\tstatic constexpr unsigned int kDefaultThreads = 2;\n+\n+\tunsigned int workPending_ LIBCAMERA_TSA_GUARDED_BY(workPendingMutex_);\n+\tMutex workPendingMutex_;\n+\tConditionVariable workPendingCv_;\n \tstd::vector<std::unique_ptr<DebayerCpuThread>> threads_;\n };\n \n",
    "prefixes": [
        "v7",
        "3/5"
    ]
}