Patch Detail
Show a patch.
GET /api/1.1/patches/17812/?format=api
{ "id": 17812, "url": "https://patchwork.libcamera.org/api/1.1/patches/17812/?format=api", "web_url": "https://patchwork.libcamera.org/patch/17812/", "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": "<20221117185204.11625-2-xavier.roumegue@oss.nxp.com>", "date": "2022-11-17T18:52:04", "name": "[libcamera-devel,v3,2/2] libcamera: pipeline: simple: converter: Use generic converter interface", "commit_ref": null, "pull_url": null, "state": "accepted", "archived": false, "hash": "60bb0171542409bbd92fb54f397081815627feb3", "submitter": { "id": 107, "url": "https://patchwork.libcamera.org/api/1.1/people/107/?format=api", "name": "Xavier Roumegue", "email": "xavier.roumegue@oss.nxp.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/17812/mbox/", "series": [ { "id": 3616, "url": "https://patchwork.libcamera.org/api/1.1/series/3616/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=3616", "date": "2022-11-17T18:52:03", "name": "[libcamera-devel,v3,1/2] libcamera: Declare generic converter interface", "version": 3, "mbox": "https://patchwork.libcamera.org/series/3616/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/17812/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/17812/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 8DE33BD16B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 17 Nov 2022 18:52:43 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 304E7632E6;\n\tThu, 17 Nov 2022 19:52:42 +0100 (CET)", "from EUR05-VI1-obe.outbound.protection.outlook.com\n\t(mail-vi1eur05on20623.outbound.protection.outlook.com\n\t[IPv6:2a01:111:f400:7d00::623])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CECB361F32\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 17 Nov 2022 19:52:39 +0100 (CET)", "from PAXPR04MB8703.eurprd04.prod.outlook.com\n\t(2603:10a6:102:21e::22)\n\tby DU2PR04MB8678.eurprd04.prod.outlook.com (2603:10a6:10:2dd::14)\n\twith Microsoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5813.13;\n\tThu, 17 Nov 2022 18:52:37 +0000", "from PAXPR04MB8703.eurprd04.prod.outlook.com\n\t([fe80::14d3:8e4:cf07:810d]) by\n\tPAXPR04MB8703.eurprd04.prod.outlook.com\n\t([fe80::14d3:8e4:cf07:810d%3]) with mapi id 15.20.5813.020;\n\tThu, 17 Nov 2022 18:52:37 +0000" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1668711162;\n\tbh=NNRm5ysaW9aOkU/3+UmSo4hHHR9ERYJho/lw0z0JnQs=;\n\th=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=NhJtTBrCJh4S89g0JN8AvuEz/mXq78cM9QKW9BwD8j8kKON3AEA2vhKP72/E9tJot\n\t/Bw9HY1CoxkVXQzBnrd4GL1ObDa1L06U84bSBgH69HOvZYCQWJnz2u4Biwdl4rESat\n\tB0+miONJywkEl3QQv7LGyPunwN442h0st3qnN+zMjfKD1okuPvF5QGkfKx4xMg1MMi\n\tdXDT3dT2FnqwWLzVyKTVMTlfo6T2XawP6ub63r6Qvac0WAsc8Z9/zzGRUnI1H+ItDO\n\tx1GF/FTZECX2cZuSDYID1V89o67ffEa0D55rt0orG2Pk9+Cf1UGLRyp22RaziNN4w8\n\tv2/JstQFBjEBw==", "v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com;\n\ts=selector2-NXP1-onmicrosoft-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=KAUDWq3MJRyC2i5jOYmMmBF+MtZu4kl74ng2Y39O4pI=;\n\tb=IxJWFWkyUXBBKQUbEZkFlpp9HnL1XfEtx/YLCVWOy4IDxSKbYSU2+aY89931S6XjfY/nCygyiXbVlmxr6J7jquWMDb8K0vLZhozlX1mym5HRmnhFDRtaaLncSbAkB24FIBlo0spK5tGdeglKnNHLWyzFweZRRMljt0QLdYEl2Ks=" ], "Authentication-Results": [ "lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=NXP1.onmicrosoft.com\n\theader.i=@NXP1.onmicrosoft.com\n\theader.b=\"IxJWFWky\"; dkim-atps=neutral", "dkim=none (message not signed)\n\theader.d=none;dmarc=none action=none header.from=oss.nxp.com;" ], "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n\tb=iGWpRXFySCqzXcBdtSn2Pg777H6yuacpgtD4+kuAyyFDb44MJwVuJ7f4U9nxQU2ZhW5GZNSJRFVt9I2HeIQKgsWThmBnOVohhBuivIDu1lfhvcf39vMAeqZ5UQbHK62wwKIkUpxijhK2gDOPV80TIGUBmOLMz5TPoZDP+lvHDlnvt/KH+Jni+4bCldpsMYTKOlUnAET9c6ZMfgznJCXwxUFOpTMB5qrXY6Wsk/PXKOmk2A8hd2G1bBYN6WYWjG/Jy7xgD0HN3bcrIEfDz2T6Q6eQhgnyNtmBWXdMRPpLNFj4sug2rk99GJ3eEeDbTOBbR1hU/9mXRu00Xa/ZHSteRA==", "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n\ts=arcselector9901;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n\tbh=KAUDWq3MJRyC2i5jOYmMmBF+MtZu4kl74ng2Y39O4pI=;\n\tb=VcuEEDQaSvG5QQQMd6eOunerZ2TKz4sziKTUzjFsDajnUcjK1s/81s8g3s6GNp8z/8UXMx4YC7/zm1DKpnt4yLSRDV2EZiDQkgtO7EvjRJIZIec6JBKV2e2vf15pIPqlQyHhXHFJwljEkLdOMKspWxvcg0d+P5BBV+Lmgy1wOKSNG4Tbr3g/qjVW0/uC7Gmyb+VlbnahyqArHrqVyQ2ze8rASjWS4cGHKHlIkxA4Luj8DgvJLYeRzixuJH/UnJWu0Hoa67dqLb7BzuOHurHsVANPudiIuIFI7j819vUqQPR2eyTjw9c2J2dE1sk9WaqvnRHi6NtIjFGzawoB1pMn4g==", "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n\tsmtp.mailfrom=oss.nxp.com;\n\tdmarc=pass action=none header.from=oss.nxp.com; \n\tdkim=pass header.d=oss.nxp.com; arc=none", "To": "jacopo@jmondi.org,\n\tlaurent.pinchart@ideasonboard.com", "Date": "Thu, 17 Nov 2022 19:52:04 +0100", "Message-Id": "<20221117185204.11625-2-xavier.roumegue@oss.nxp.com>", "X-Mailer": "git-send-email 2.38.1", "In-Reply-To": "<20221117185204.11625-1-xavier.roumegue@oss.nxp.com>", "References": "<20221117185204.11625-1-xavier.roumegue@oss.nxp.com>", "Content-Transfer-Encoding": "8bit", "Content-Type": "text/plain", "X-ClientProxiedBy": "PR3P191CA0006.EURP191.PROD.OUTLOOK.COM\n\t(2603:10a6:102:54::11) To PAXPR04MB8703.eurprd04.prod.outlook.com\n\t(2603:10a6:102:21e::22)", "MIME-Version": "1.0", "X-MS-Exchange-MessageSentRepresentingType": "1", "X-MS-PublicTrafficType": "Email", "X-MS-TrafficTypeDiagnostic": "PAXPR04MB8703:EE_|DU2PR04MB8678:EE_", "X-MS-Office365-Filtering-Correlation-Id": "aa507ec7-8610-45a1-0f8a-08dac8cce562", "X-MS-Exchange-SharedMailbox-RoutingAgent-Processed": "True", "X-MS-Exchange-SenderADCheck": "1", "X-MS-Exchange-AntiSpam-Relay": "0", "X-Microsoft-Antispam": "BCL:0;", "X-Microsoft-Antispam-Message-Info": "eAbVi9/NCkZA7t98uirpefsS0obSSXhU6xTBXUdleAEUIyEfY1tF0s1m55pz7K8qFTaxoA++coUhpxdmxKXIf73zsuWgskS5b9On0+ROn5cqNzab4wyRQOqWja90ZvbOCwwI++qiIzL7fIvMncoNnFO8fMiDxgcwrLVPGoaYghBhWrP7csSxpdqz+OEWL0oBOLYyXS5jy1IMl/2MRdue5Z+zZiG7c/87TIdW408Dj64y+VjgNM8TkwVaZzXuPB58KMSHyM3F4l5b81hW85nSdkLu2Np65eoNA08pAAl60/OCTDvGKRmy/bxu0AEmg/ggIPqX4EI2zBrmmqOy5sRA2jdqJwQPoKisfDw2LQXhKU5rSqY/lOv5pGkH3amS2rVcy71II9g+eshPt/P5FuyVlwwivldFOHcgaxMbnl3vi7KQ3038rNXV1/54y53LCq2IBkCj6izNtWLdpJaV10m8Mivu5CvR+hPXOeSshKoVYCP5AaFxojU6pfkJ9pzSN7FGmw7OR6ds0WQjKL84GNlr0jISPykKA97mcH/XgWzmz6jmpLQISSi3MnyrPpK9PDanKBn0VWnx4y3666c0hH1QrbTV9tgx/9zo6Q/rApyXTg/TRKgFw3qp++nKLd12BA+J27ZixHDasHLUrHfagEl8zQAgwF5Ig4TMwDlOXUdj/rthmTBzXfIRmuKn/II2uvlB", "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n\tIPV:NLI; SFV:NSPM; H:PAXPR04MB8703.eurprd04.prod.outlook.com; PTR:;\n\tCAT:NONE; \n\tSFS:(13230022)(4636009)(136003)(376002)(366004)(39860400002)(346002)(396003)(451199015)(52116002)(6666004)(6506007)(6512007)(44832011)(30864003)(8676002)(8936002)(4326008)(66476007)(66556008)(66946007)(5660300002)(38100700002)(1076003)(186003)(2616005)(41300700001)(478600001)(6486002)(316002)(86362001)(2906002)(83380400001)(41533002);\n\tDIR:OUT; SFP:1101; ", "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1", "X-MS-Exchange-AntiSpam-MessageData-0": "zj9+eymwWxP9sTrpiHmc7s4mlPAxGdVK1i2Vu9TONFvD92PAcmpMRQ0c/xFYh2fbz4nfcPUcrxigqoaVIyyVj42Ablmdlv+kmdOxxF56DYquTR30Kmz2PlqXgDzD2OEvJLEuYxvyV7D9RrJTB73172vDN6R5caz2ofiXkyEG25/PANlrCPctgBf2DmZ4QRdG18+YeXU8KNWvj8n9/jEp3f71OeOPVwY1CHp5Sgavc/xP28GYNml2J4s2RtdHYl1Yvb9caQiQp+tUXr8F4MNGpoN4bj71QvRyWyFlwAdFtTKR4PNTgHQs/8bfl01kPHPR49fbjRACDrF1eWWtd+rD8DDmV+lIOdwfOMdjge7KUGc/OihBy4dFKTmC6oG5b11zAsk86xK41ZkO72hcM2iJzSaZsu0t+0ZczvGryvKngB6hWQUHsE7lEnffF+2Gwc606lTQTHJhxLyQ9ZZdIK0rhkfQ2+djS5jLdjdUVYrQPy3fp3QdFCpZCPC7KU16fLDkmMh81UYqi4nJV3wjW35On9s0fbhhZM5GyLGPEXXZ1vKl5ZEJD19n2k7evRrb6+q+f+uevNtCl8WWIINE51+vbu1mWhrawT4E9dwoB5DgwFrLGuGlcFXgN/INrpGu+egLGJn2z+QVOhu6AlPlUyYr4iN1lKLieR6ZSwrwhcvfVrEbi4CF9kzLR9IPN53u+xWDZ66gocs7tpMitY96+2WD7nDlvFqpj6SntKT4JkxQE1K6vT1UYb0N5WZPH2A8mnFm8pt39Kv/fZdaEcORduuTxkgNzF0ljvUYMwnMn88pkcGtKIJQj8e+b68JcqQ6pHF+B+JnkfIDlJM5Akwj/n3WQIrKz9DA56ZH4Y3LLVpl24o93yi73ZoJH+6af9XPq3CNRaItl+udvTXd49psyOfHzz28RuUxitfHq6Uz1DCteKAXnISlAxxS45FIoIsRGkiJgOzZjnf3NAEF6fub4l5JW0R5QzNgujFVjU9WTi0aL/ef5FPYwgaPKuczQXtL6cwgJzPS1XHU/4ojZ6VclpR1In24WL1xMB/XjrsvcCusAuNllnyveztIwm2pZSLQx37vNzSNIDxX2grWJqdFgSx3ap/dyaFjUdPB729K+/SNm1KwQaeHVgO0wHX4QpQ98xlcKsqMg/N6T1SCz8sxEWk2nwtaLgcsI4MuKNV0d4pzcyErc5LnsG25DVa0XRHBtICbV7o/rw69CyUohGCYgntQZPf7IzZaffu6dcpt0/7Yl7HFpKOIzP2D/8LKQQDeiyJduI+apqh+qSIKsPF6uf+MhpSs81kY68H5syxGtCrgA2TwXT/9T/Ezd72Fsr40J0G2GqGO4XROngiAC4j0LVUv8wHYDPn5QjEV5+kUdo5KPaaCuvzrC/ce6t4Gr7Xf3AhqV6wjQq8szyvH/fk+p8EnUoYM20CPo+z7kG3N73Ec2oQMaER3XR0rj96q9tjiM0/FKxpGc/shlp8ueipi2Uo4RRyTgWS8IzvUi7AlRkpFQVY6VpkRkcXspXdOdd15upz4aNTSmtZ0ubmS3piaBIJ/DFkq6yIyJj7udWD9RYe0cKTiyzA81WyCcwvRxAxmD2Yb8uX11zvb4xxhPT3gyAQZVHYOMwh0HalfuBCfOXjdFN4ykeY5v1AsA+qnS8at3wf1r1FSHqL9FpN1wbIVw87erQ==", "X-OriginatorOrg": "oss.nxp.com", "X-MS-Exchange-CrossTenant-Network-Message-Id": "aa507ec7-8610-45a1-0f8a-08dac8cce562", "X-MS-Exchange-CrossTenant-AuthSource": "PAXPR04MB8703.eurprd04.prod.outlook.com", "X-MS-Exchange-CrossTenant-AuthAs": "Internal", "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "17 Nov 2022 18:52:37.7701\n\t(UTC)", "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted", "X-MS-Exchange-CrossTenant-Id": "686ea1d3-bc2b-4c6f-a92c-d99c5c301635", "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED", "X-MS-Exchange-CrossTenant-UserPrincipalName": "0ngrDSZgSLQD/CLa4iuC9Fc1tG/e4nVvhLtEIZX6EzUeqTFkfs+D21yV73dRJD5vpTRslMUq3kxhWir9OiqN7g==", "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DU2PR04MB8678", "Subject": "[libcamera-devel] [PATCH v3 2/2] libcamera: pipeline: simple:\n\tconverter: Use generic converter interface", "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>", "From": "Xavier Roumegue via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>", "Reply-To": "Xavier Roumegue <xavier.roumegue@oss.nxp.com>", "Cc": "libcamera-devel@lists.libcamera.org", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "Move the simple converter implementation to a generic V4L2 M2M class\nderived from the converter interface. This latter could be used by\nother pipeline implementations and as base class for customized V4L2 M2M\nconverters.\n\nSigned-off-by: Xavier Roumegue <xavier.roumegue@oss.nxp.com>\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n---\n .../internal/converter/converter_v4l2_m2m.h | 18 +--\n .../libcamera/internal/converter/meson.build | 5 +\n include/libcamera/internal/meson.build | 2 +\n .../converter_v4l2_m2m.cpp} | 153 +++++++++++-------\n src/libcamera/converter/meson.build | 5 +\n src/libcamera/meson.build | 1 +\n src/libcamera/pipeline/simple/meson.build | 1 -\n src/libcamera/pipeline/simple/simple.cpp | 6 +-\n 8 files changed, 123 insertions(+), 68 deletions(-)\n rename src/libcamera/pipeline/simple/converter.h => include/libcamera/internal/converter/converter_v4l2_m2m.h (83%)\n create mode 100644 include/libcamera/internal/converter/meson.build\n rename src/libcamera/{pipeline/simple/converter.cpp => converter/converter_v4l2_m2m.cpp} (68%)\n create mode 100644 src/libcamera/converter/meson.build", "diff": "diff --git a/src/libcamera/pipeline/simple/converter.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h\nsimilarity index 83%\nrename from src/libcamera/pipeline/simple/converter.h\nrename to include/libcamera/internal/converter/converter_v4l2_m2m.h\nindex f0ebe2e0..ef31eeba 100644\n--- a/src/libcamera/pipeline/simple/converter.h\n+++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n@@ -1,8 +1,9 @@\n /* SPDX-License-Identifier: LGPL-2.1-or-later */\n /*\n * Copyright (C) 2020, Laurent Pinchart\n+ * Copyright 2022 NXP\n *\n- * converter.h - Format converter for simple pipeline handler\n+ * converter_v4l2_m2m.h - V4l2 M2M Format converter interface\n */\n \n #pragma once\n@@ -19,6 +20,8 @@\n #include <libcamera/base/log.h>\n #include <libcamera/base/signal.h>\n \n+#include \"libcamera/internal/converter.h\"\n+\n namespace libcamera {\n \n class FrameBuffer;\n@@ -28,11 +31,12 @@ class SizeRange;\n struct StreamConfiguration;\n class V4L2M2MDevice;\n \n-class SimpleConverter\n+class V4L2M2MConverter : public Converter\n {\n public:\n-\tSimpleConverter(MediaDevice *media);\n+\tV4L2M2MConverter(MediaDevice *media);\n \n+\tint loadConfiguration([[maybe_unused]] const std::string &filename) { return 0; }\n \tbool isValid() const { return m2m_ != nullptr; }\n \n \tstd::vector<PixelFormat> formats(PixelFormat input);\n@@ -52,14 +56,11 @@ public:\n \tint queueBuffers(FrameBuffer *input,\n \t\t\t const std::map<unsigned int, FrameBuffer *> &outputs);\n \n-\tSignal<FrameBuffer *> inputBufferReady;\n-\tSignal<FrameBuffer *> outputBufferReady;\n-\n private:\n \tclass Stream : protected Loggable\n \t{\n \tpublic:\n-\t\tStream(SimpleConverter *converter, unsigned int index);\n+\t\tStream(V4L2M2MConverter *converter, unsigned int index);\n \n \t\tbool isValid() const { return m2m_ != nullptr; }\n \n@@ -80,7 +81,7 @@ private:\n \t\tvoid captureBufferReady(FrameBuffer *buffer);\n \t\tvoid outputBufferReady(FrameBuffer *buffer);\n \n-\t\tSimpleConverter *converter_;\n+\t\tV4L2M2MConverter *converter_;\n \t\tunsigned int index_;\n \t\tstd::unique_ptr<V4L2M2MDevice> m2m_;\n \n@@ -88,7 +89,6 @@ private:\n \t\tunsigned int outputBufferCount_;\n \t};\n \n-\tstd::string deviceNode_;\n \tstd::unique_ptr<V4L2M2MDevice> m2m_;\n \n \tstd::vector<Stream> streams_;\ndiff --git a/include/libcamera/internal/converter/meson.build b/include/libcamera/internal/converter/meson.build\nnew file mode 100644\nindex 00000000..891e79e7\n--- /dev/null\n+++ b/include/libcamera/internal/converter/meson.build\n@@ -0,0 +1,5 @@\n+# SPDX-License-Identifier: CC0-1.0\n+\n+libcamera_internal_headers += files([\n+ 'converter_v4l2_m2m.h',\n+])\ndiff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build\nindex 8f50d755..b9db5a8c 100644\n--- a/include/libcamera/internal/meson.build\n+++ b/include/libcamera/internal/meson.build\n@@ -45,3 +45,5 @@ libcamera_internal_headers = files([\n 'v4l2_videodevice.h',\n 'yaml_parser.h',\n ])\n+\n+subdir('converter')\ndiff --git a/src/libcamera/pipeline/simple/converter.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp\nsimilarity index 68%\nrename from src/libcamera/pipeline/simple/converter.cpp\nrename to src/libcamera/converter/converter_v4l2_m2m.cpp\nindex acaaa64c..31acb048 100644\n--- a/src/libcamera/pipeline/simple/converter.cpp\n+++ b/src/libcamera/converter/converter_v4l2_m2m.cpp\n@@ -1,12 +1,11 @@\n /* SPDX-License-Identifier: LGPL-2.1-or-later */\n /*\n * Copyright (C) 2020, Laurent Pinchart\n+ * Copyright 2022 NXP\n *\n- * converter.cpp - Format converter for simple pipeline handler\n+ * converter_v4l2_m2m.cpp - V4L2 M2M Format converter\n */\n \n-#include \"converter.h\"\n-\n #include <algorithm>\n #include <limits.h>\n \n@@ -20,19 +19,25 @@\n \n #include \"libcamera/internal/media_device.h\"\n #include \"libcamera/internal/v4l2_videodevice.h\"\n+#include \"libcamera/internal/converter/converter_v4l2_m2m.h\"\n+\n+/**\n+ * \\file internal/converter/converter_v4l2_m2m.h\n+ * \\brief V4L2 M2M based converter\n+ */\n \n namespace libcamera {\n \n-LOG_DECLARE_CATEGORY(SimplePipeline)\n+LOG_DECLARE_CATEGORY(Converter)\n \n /* -----------------------------------------------------------------------------\n- * SimpleConverter::Stream\n+ * V4L2M2MConverter::Stream\n */\n \n-SimpleConverter::Stream::Stream(SimpleConverter *converter, unsigned int index)\n+V4L2M2MConverter::Stream::Stream(V4L2M2MConverter *converter, unsigned int index)\n \t: converter_(converter), index_(index)\n {\n-\tm2m_ = std::make_unique<V4L2M2MDevice>(converter->deviceNode_);\n+\tm2m_ = std::make_unique<V4L2M2MDevice>(converter->deviceNode());\n \n \tm2m_->output()->bufferReady.connect(this, &Stream::outputBufferReady);\n \tm2m_->capture()->bufferReady.connect(this, &Stream::captureBufferReady);\n@@ -42,8 +47,8 @@ SimpleConverter::Stream::Stream(SimpleConverter *converter, unsigned int index)\n \t\tm2m_.reset();\n }\n \n-int SimpleConverter::Stream::configure(const StreamConfiguration &inputCfg,\n-\t\t\t\t const StreamConfiguration &outputCfg)\n+int V4L2M2MConverter::Stream::configure(const StreamConfiguration &inputCfg,\n+\t\t\t\t\tconst StreamConfiguration &outputCfg)\n {\n \tV4L2PixelFormat videoFormat =\n \t\tm2m_->output()->toV4L2PixelFormat(inputCfg.pixelFormat);\n@@ -56,14 +61,14 @@ int SimpleConverter::Stream::configure(const StreamConfiguration &inputCfg,\n \n \tint ret = m2m_->output()->setFormat(&format);\n \tif (ret < 0) {\n-\t\tLOG(SimplePipeline, Error)\n+\t\tLOG(Converter, Error)\n \t\t\t<< \"Failed to set input format: \" << strerror(-ret);\n \t\treturn ret;\n \t}\n \n \tif (format.fourcc != videoFormat || format.size != inputCfg.size ||\n \t format.planes[0].bpl != inputCfg.stride) {\n-\t\tLOG(SimplePipeline, Error)\n+\t\tLOG(Converter, Error)\n \t\t\t<< \"Input format not supported (requested \"\n \t\t\t<< inputCfg.size << \"-\" << videoFormat\n \t\t\t<< \", got \" << format << \")\";\n@@ -78,13 +83,13 @@ int SimpleConverter::Stream::configure(const StreamConfiguration &inputCfg,\n \n \tret = m2m_->capture()->setFormat(&format);\n \tif (ret < 0) {\n-\t\tLOG(SimplePipeline, Error)\n+\t\tLOG(Converter, Error)\n \t\t\t<< \"Failed to set output format: \" << strerror(-ret);\n \t\treturn ret;\n \t}\n \n \tif (format.fourcc != videoFormat || format.size != outputCfg.size) {\n-\t\tLOG(SimplePipeline, Error)\n+\t\tLOG(Converter, Error)\n \t\t\t<< \"Output format not supported\";\n \t\treturn -EINVAL;\n \t}\n@@ -95,13 +100,13 @@ int SimpleConverter::Stream::configure(const StreamConfiguration &inputCfg,\n \treturn 0;\n }\n \n-int SimpleConverter::Stream::exportBuffers(unsigned int count,\n-\t\t\t\t\t std::vector<std::unique_ptr<FrameBuffer>> *buffers)\n+int V4L2M2MConverter::Stream::exportBuffers(unsigned int count,\n+\t\t\t\t\t std::vector<std::unique_ptr<FrameBuffer>> *buffers)\n {\n \treturn m2m_->capture()->exportBuffers(count, buffers);\n }\n \n-int SimpleConverter::Stream::start()\n+int V4L2M2MConverter::Stream::start()\n {\n \tint ret = m2m_->output()->importBuffers(inputBufferCount_);\n \tif (ret < 0)\n@@ -128,7 +133,7 @@ int SimpleConverter::Stream::start()\n \treturn 0;\n }\n \n-void SimpleConverter::Stream::stop()\n+void V4L2M2MConverter::Stream::stop()\n {\n \tm2m_->capture()->streamOff();\n \tm2m_->output()->streamOff();\n@@ -136,8 +141,7 @@ void SimpleConverter::Stream::stop()\n \tm2m_->output()->releaseBuffers();\n }\n \n-int SimpleConverter::Stream::queueBuffers(FrameBuffer *input,\n-\t\t\t\t\t FrameBuffer *output)\n+int V4L2M2MConverter::Stream::queueBuffers(FrameBuffer *input, FrameBuffer *output)\n {\n \tint ret = m2m_->output()->queueBuffer(input);\n \tif (ret < 0)\n@@ -150,12 +154,12 @@ int SimpleConverter::Stream::queueBuffers(FrameBuffer *input,\n \treturn 0;\n }\n \n-std::string SimpleConverter::Stream::logPrefix() const\n+std::string V4L2M2MConverter::Stream::logPrefix() const\n {\n \treturn \"stream\" + std::to_string(index_);\n }\n \n-void SimpleConverter::Stream::outputBufferReady(FrameBuffer *buffer)\n+void V4L2M2MConverter::Stream::outputBufferReady(FrameBuffer *buffer)\n {\n \tauto it = converter_->queue_.find(buffer);\n \tif (it == converter_->queue_.end())\n@@ -167,32 +171,34 @@ void SimpleConverter::Stream::outputBufferReady(FrameBuffer *buffer)\n \t}\n }\n \n-void SimpleConverter::Stream::captureBufferReady(FrameBuffer *buffer)\n+void V4L2M2MConverter::Stream::captureBufferReady(FrameBuffer *buffer)\n {\n \tconverter_->outputBufferReady.emit(buffer);\n }\n \n /* -----------------------------------------------------------------------------\n- * SimpleConverter\n+ * V4L2M2MConverter\n+ */\n+\n+/**\n+ * \\class libcamera::V4L2M2MConverter\n+ * \\brief The V4L2 M2M converter implements the converter interface based on\n+ * V4L2 M2M device.\n+*/\n+\n+/**\n+ * \\fn V4L2M2MConverter::V4L2M2MConverter\n+ * \\brief Construct a V4L2M2MConverter instance\n+ * \\param[in] media The media device implementing the converter\n */\n \n-SimpleConverter::SimpleConverter(MediaDevice *media)\n+V4L2M2MConverter::V4L2M2MConverter(MediaDevice *media)\n+\t: Converter(media)\n {\n-\t/*\n-\t * Locate the video node. There's no need to validate the pipeline\n-\t * further, the caller guarantees that this is a V4L2 mem2mem device.\n-\t */\n-\tconst std::vector<MediaEntity *> &entities = media->entities();\n-\tauto it = std::find_if(entities.begin(), entities.end(),\n-\t\t\t [](MediaEntity *entity) {\n-\t\t\t\t return entity->function() == MEDIA_ENT_F_IO_V4L;\n-\t\t\t });\n-\tif (it == entities.end())\n+\tif (deviceNode().empty())\n \t\treturn;\n \n-\tdeviceNode_ = (*it)->deviceNode();\n-\n-\tm2m_ = std::make_unique<V4L2M2MDevice>(deviceNode_);\n+\tm2m_ = std::make_unique<V4L2M2MDevice>(deviceNode());\n \tint ret = m2m_->open();\n \tif (ret < 0) {\n \t\tm2m_.reset();\n@@ -200,7 +206,21 @@ SimpleConverter::SimpleConverter(MediaDevice *media)\n \t}\n }\n \n-std::vector<PixelFormat> SimpleConverter::formats(PixelFormat input)\n+/**\n+ * \\fn libcamera::V4L2M2MConverter::loadConfiguration\n+ * \\details \\copydetails libcamera::Converter::loadConfiguration\n+ */\n+\n+/**\n+ * \\fn libcamera::V4L2M2MConverter::isValid\n+ * \\details \\copydetails libcamera::Converter::isValid\n+ */\n+\n+/**\n+ * \\fn libcamera::V4L2M2MConverter::formats\n+ * \\details \\copydetails libcamera::Converter::formats\n+ */\n+std::vector<PixelFormat> V4L2M2MConverter::formats(PixelFormat input)\n {\n \tif (!m2m_)\n \t\treturn {};\n@@ -215,13 +235,13 @@ std::vector<PixelFormat> SimpleConverter::formats(PixelFormat input)\n \n \tint ret = m2m_->output()->setFormat(&v4l2Format);\n \tif (ret < 0) {\n-\t\tLOG(SimplePipeline, Error)\n+\t\tLOG(Converter, Error)\n \t\t\t<< \"Failed to set format: \" << strerror(-ret);\n \t\treturn {};\n \t}\n \n \tif (v4l2Format.fourcc != m2m_->output()->toV4L2PixelFormat(input)) {\n-\t\tLOG(SimplePipeline, Debug)\n+\t\tLOG(Converter, Debug)\n \t\t\t<< \"Input format \" << input << \" not supported.\";\n \t\treturn {};\n \t}\n@@ -237,7 +257,10 @@ std::vector<PixelFormat> SimpleConverter::formats(PixelFormat input)\n \treturn pixelFormats;\n }\n \n-SizeRange SimpleConverter::sizes(const Size &input)\n+/**\n+ * \\copydoc libcamera::Converter::sizes\n+ */\n+SizeRange V4L2M2MConverter::sizes(const Size &input)\n {\n \tif (!m2m_)\n \t\treturn {};\n@@ -252,7 +275,7 @@ SizeRange SimpleConverter::sizes(const Size &input)\n \n \tint ret = m2m_->output()->setFormat(&format);\n \tif (ret < 0) {\n-\t\tLOG(SimplePipeline, Error)\n+\t\tLOG(Converter, Error)\n \t\t\t<< \"Failed to set format: \" << strerror(-ret);\n \t\treturn {};\n \t}\n@@ -262,7 +285,7 @@ SizeRange SimpleConverter::sizes(const Size &input)\n \tformat.size = { 1, 1 };\n \tret = m2m_->capture()->setFormat(&format);\n \tif (ret < 0) {\n-\t\tLOG(SimplePipeline, Error)\n+\t\tLOG(Converter, Error)\n \t\t\t<< \"Failed to set format: \" << strerror(-ret);\n \t\treturn {};\n \t}\n@@ -272,7 +295,7 @@ SizeRange SimpleConverter::sizes(const Size &input)\n \tformat.size = { UINT_MAX, UINT_MAX };\n \tret = m2m_->capture()->setFormat(&format);\n \tif (ret < 0) {\n-\t\tLOG(SimplePipeline, Error)\n+\t\tLOG(Converter, Error)\n \t\t\t<< \"Failed to set format: \" << strerror(-ret);\n \t\treturn {};\n \t}\n@@ -282,9 +305,12 @@ SizeRange SimpleConverter::sizes(const Size &input)\n \treturn sizes;\n }\n \n+/**\n+ * \\copydoc libcamera::Converter::strideAndFrameSize\n+ */\n std::tuple<unsigned int, unsigned int>\n-SimpleConverter::strideAndFrameSize(const PixelFormat &pixelFormat,\n-\t\t\t\t const Size &size)\n+V4L2M2MConverter::strideAndFrameSize(const PixelFormat &pixelFormat,\n+\t\t\t\t const Size &size)\n {\n \tV4L2DeviceFormat format;\n \tformat.fourcc = m2m_->capture()->toV4L2PixelFormat(pixelFormat);\n@@ -297,8 +323,11 @@ SimpleConverter::strideAndFrameSize(const PixelFormat &pixelFormat,\n \treturn std::make_tuple(format.planes[0].bpl, format.planes[0].size);\n }\n \n-int SimpleConverter::configure(const StreamConfiguration &inputCfg,\n-\t\t\t const std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs)\n+/**\n+ * \\copydoc libcamera::Converter::configure\n+ */\n+int V4L2M2MConverter::configure(const StreamConfiguration &inputCfg,\n+\t\t\t\tconst std::vector<std::reference_wrapper<StreamConfiguration>> &outputCfgs)\n {\n \tint ret = 0;\n \n@@ -309,7 +338,7 @@ int SimpleConverter::configure(const StreamConfiguration &inputCfg,\n \t\tStream &stream = streams_.emplace_back(this, i);\n \n \t\tif (!stream.isValid()) {\n-\t\t\tLOG(SimplePipeline, Error)\n+\t\t\tLOG(Converter, Error)\n \t\t\t\t<< \"Failed to create stream \" << i;\n \t\t\tret = -EINVAL;\n \t\t\tbreak;\n@@ -328,8 +357,11 @@ int SimpleConverter::configure(const StreamConfiguration &inputCfg,\n \treturn 0;\n }\n \n-int SimpleConverter::exportBuffers(unsigned int output, unsigned int count,\n-\t\t\t\t std::vector<std::unique_ptr<FrameBuffer>> *buffers)\n+/**\n+ * \\copydoc libcamera::Converter::exportBuffers\n+ */\n+int V4L2M2MConverter::exportBuffers(unsigned int output, unsigned int count,\n+\t\t\t\t std::vector<std::unique_ptr<FrameBuffer>> *buffers)\n {\n \tif (output >= streams_.size())\n \t\treturn -EINVAL;\n@@ -337,7 +369,10 @@ int SimpleConverter::exportBuffers(unsigned int output, unsigned int count,\n \treturn streams_[output].exportBuffers(count, buffers);\n }\n \n-int SimpleConverter::start()\n+/**\n+ * \\copydoc libcamera::Converter::start\n+ */\n+int V4L2M2MConverter::start()\n {\n \tint ret;\n \n@@ -352,14 +387,20 @@ int SimpleConverter::start()\n \treturn 0;\n }\n \n-void SimpleConverter::stop()\n+/**\n+ * \\copydoc libcamera::Converter::stop\n+ */\n+void V4L2M2MConverter::stop()\n {\n \tfor (Stream &stream : utils::reverse(streams_))\n \t\tstream.stop();\n }\n \n-int SimpleConverter::queueBuffers(FrameBuffer *input,\n-\t\t\t\t const std::map<unsigned int, FrameBuffer *> &outputs)\n+/**\n+ * \\copydoc libcamera::Converter::queueBuffers\n+ */\n+int V4L2M2MConverter::queueBuffers(FrameBuffer *input,\n+\t\t\t\t const std::map<unsigned int, FrameBuffer *> &outputs)\n {\n \tunsigned int mask = 0;\n \tint ret;\n@@ -402,4 +443,6 @@ int SimpleConverter::queueBuffers(FrameBuffer *input,\n \treturn 0;\n }\n \n+REGISTER_CONVERTER(\"v4l2_m2m\", V4L2M2MConverter, \"pxp\")\n+\n } /* namespace libcamera */\ndiff --git a/src/libcamera/converter/meson.build b/src/libcamera/converter/meson.build\nnew file mode 100644\nindex 00000000..2aa72fe4\n--- /dev/null\n+++ b/src/libcamera/converter/meson.build\n@@ -0,0 +1,5 @@\n+# SPDX-License-Identifier: CC0-1.0\n+\n+libcamera_sources += files([\n+ 'converter_v4l2_m2m.cpp'\n+])\ndiff --git a/src/libcamera/meson.build b/src/libcamera/meson.build\nindex e9d0324e..ffc294f3 100644\n--- a/src/libcamera/meson.build\n+++ b/src/libcamera/meson.build\n@@ -62,6 +62,7 @@ libatomic = cc.find_library('atomic', required : false)\n libthreads = dependency('threads')\n \n subdir('base')\n+subdir('converter')\n subdir('ipa')\n subdir('pipeline')\n subdir('proxy')\ndiff --git a/src/libcamera/pipeline/simple/meson.build b/src/libcamera/pipeline/simple/meson.build\nindex 9c99b32f..42b0896d 100644\n--- a/src/libcamera/pipeline/simple/meson.build\n+++ b/src/libcamera/pipeline/simple/meson.build\n@@ -1,6 +1,5 @@\n # SPDX-License-Identifier: CC0-1.0\n \n libcamera_sources += files([\n- 'converter.cpp',\n 'simple.cpp',\n ])\ndiff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\nindex a32de7f3..24ded4db 100644\n--- a/src/libcamera/pipeline/simple/simple.cpp\n+++ b/src/libcamera/pipeline/simple/simple.cpp\n@@ -30,13 +30,13 @@\n \n #include \"libcamera/internal/camera.h\"\n #include \"libcamera/internal/camera_sensor.h\"\n+#include \"libcamera/internal/converter.h\"\n #include \"libcamera/internal/device_enumerator.h\"\n #include \"libcamera/internal/media_device.h\"\n #include \"libcamera/internal/pipeline_handler.h\"\n #include \"libcamera/internal/v4l2_subdevice.h\"\n #include \"libcamera/internal/v4l2_videodevice.h\"\n \n-#include \"converter.h\"\n \n namespace libcamera {\n \n@@ -266,7 +266,7 @@ public:\n \tstd::vector<Configuration> configs_;\n \tstd::map<PixelFormat, std::vector<const Configuration *>> formats_;\n \n-\tstd::unique_ptr<SimpleConverter> converter_;\n+\tstd::unique_ptr<Converter> converter_;\n \tstd::vector<std::unique_ptr<FrameBuffer>> converterBuffers_;\n \tbool useConverter_;\n \tstd::queue<std::map<unsigned int, FrameBuffer *>> converterQueue_;\n@@ -492,7 +492,7 @@ int SimpleCameraData::init()\n \t/* Open the converter, if any. */\n \tMediaDevice *converter = pipe->converter();\n \tif (converter) {\n-\t\tconverter_ = std::make_unique<SimpleConverter>(converter);\n+\t\tconverter_ = ConverterFactoryBase::create(converter);\n \t\tif (!converter_->isValid()) {\n \t\t\tLOG(SimplePipeline, Warning)\n \t\t\t\t<< \"Failed to create converter, disabling format conversion\";\n", "prefixes": [ "libcamera-devel", "v3", "2/2" ] }