{"id":17656,"url":"https://patchwork.libcamera.org/api/patches/17656/?format=json","web_url":"https://patchwork.libcamera.org/patch/17656/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20221022062310.2545463-6-paul.elder@ideasonboard.com>","date":"2022-10-22T06:23:04","name":"[libcamera-devel,v2,05/11] utils: libtuning: parsers: Add raspberrypi parser","commit_ref":null,"pull_url":null,"state":"accepted","archived":false,"hash":"8fabf92360cb2f31ebd92ad941b8f325e6a68027","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/?format=json","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/17656/mbox/","series":[{"id":3573,"url":"https://patchwork.libcamera.org/api/series/3573/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=3573","date":"2022-10-22T06:22:59","name":"utils: tuning: Add a new tuning infrastructure","version":2,"mbox":"https://patchwork.libcamera.org/series/3573/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/17656/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/17656/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 DC81DC327C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 22 Oct 2022 06:23:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9F1F462ED4;\n\tSat, 22 Oct 2022 08:23:32 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0216E62ED3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 22 Oct 2022 08:23:29 +0200 (CEST)","from pyrite.rasen.tech (h175-177-042-159.catv02.itscom.jp\n\t[175.177.42.159])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 79900106;\n\tSat, 22 Oct 2022 08:23:28 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666419812;\n\tbh=oTz/amQ7ZjYtekRYlssX1ydgV9EwvTT8q6SSQzZqRh4=;\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:\n\tFrom;\n\tb=LeYrh0JY5jui2pJoHoLpdkDILi8dzO2T7He2GuVmSyoQWlG+s5DEs2on3CysGuwzY\n\tvJVOWMHP/zm3Eaaz7GbjUx1rNgUAYPHj/TcpSdIlAcVeyuaNvVv5hM9xuSBBJTWgGw\n\tmcicd/KER6OCN7UPcSClHS37CATQkxFRWUm0f/QlbR8PH24zj/hpuQC9SgvVe+ScIh\n\tbUUEfchFiI+BXt0Ks/4wM7e2JetS8015/Iz/JKe0z5kck7BV3U38I7ZMPg4L0v/Ixd\n\tWBY+IOP8afDUX+TcIJuDpSPneMbMKE3HRIUTQ1HFDDwISvoIazG1yPw41qRxCZAdI0\n\tD+dNul3Q4Fs3Q==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1666419809;\n\tbh=oTz/amQ7ZjYtekRYlssX1ydgV9EwvTT8q6SSQzZqRh4=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=AgSsW9+EmPJQCGLwgW54qUNlDIIMBPw1xnAXdWPJaqHwRJnsi4Ca4oZEYKc908UAr\n\to9EVTxfJ+zCncDIHROUT5DtL0vSNkrEiN7d9lT8mmoJRtt7vsX75TtdOsOdDMxddY9\n\t0IiW9MytUbpW1yXE5cI0MXdiezdq68lap+t6+kWI="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"AgSsW9+E\"; dkim-atps=neutral","To":"libcamera-devel@lists.libcamera.org","Date":"Sat, 22 Oct 2022 15:23:04 +0900","Message-Id":"<20221022062310.2545463-6-paul.elder@ideasonboard.com>","X-Mailer":"git-send-email 2.30.2","In-Reply-To":"<20221022062310.2545463-1-paul.elder@ideasonboard.com>","References":"<20221022062310.2545463-1-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [PATCH v2 05/11] utils: libtuning: parsers: Add\n\traspberrypi parser","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":"Paul Elder via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Paul Elder <paul.elder@ideasonboard.com>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Add a parser to libtuning for parsing configuration files that are the\nsame format as raspberrypi's ctt's configuration files.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n\n---\nChanges in v2:\n- fix python errors\n- fix style\n- add SPDX and copyright\n- don't put black level in the processed config, as raspberrypi ctt's\n  config format uses -1 as a magical value to tell ctt to use the value\n  from the image, but in our Image loading function it already does, and\n  uses this config value to override it if its present\n- Don't validate module config in parser, instead libtuning will do it;\n  parser just converts the key from string to module instance\n---\n utils/tuning/libtuning/parsers/__init__.py    |  5 +\n .../libtuning/parsers/raspberrypi_parser.py   | 91 +++++++++++++++++++\n 2 files changed, 96 insertions(+)\n create mode 100644 utils/tuning/libtuning/parsers/raspberrypi_parser.py","diff":"diff --git a/utils/tuning/libtuning/parsers/__init__.py b/utils/tuning/libtuning/parsers/__init__.py\nindex e69de29b..9d20d2fc 100644\n--- a/utils/tuning/libtuning/parsers/__init__.py\n+++ b/utils/tuning/libtuning/parsers/__init__.py\n@@ -0,0 +1,5 @@\n+# SPDX-License-Identifier: GPL-2.0-or-later\n+#\n+# Copyright (C) 2022, Paul Elder <paul.elder@ideasonboard.com>\n+\n+from libtuning.parsers.raspberrypi_parser import RaspberryPiParser\ndiff --git a/utils/tuning/libtuning/parsers/raspberrypi_parser.py b/utils/tuning/libtuning/parsers/raspberrypi_parser.py\nnew file mode 100644\nindex 00000000..196c5b36\n--- /dev/null\n+++ b/utils/tuning/libtuning/parsers/raspberrypi_parser.py\n@@ -0,0 +1,91 @@\n+# SPDX-License-Identifier: GPL-2.0-or-later\n+#\n+# Copyright (C) 2022, Paul Elder <paul.elder@ideasonboard.com>\n+\n+from .parser import Parser\n+\n+import json\n+import numbers\n+\n+import libtuning.utils as utils\n+\n+\n+class RaspberryPiParser(Parser):\n+    def __init__(self):\n+        super().__init__()\n+\n+    # The string in the 'disable' and 'plot' lists are formatted as\n+    # 'rpi.{module_name}'.\n+    # @brief Enumerate, as a module, @a listt if its value exists in @a dictt\n+    #        and it is the name of a valid module in @a modules\n+    def enumerate_rpi_modules(self, listt, dictt, modules):\n+        for x in listt:\n+            name = x.replace('rpi.', '')\n+            if name not in dictt:\n+                continue\n+            module = utils.get_module_by_typename(modules, name)\n+            if module is not None:\n+                yield module\n+\n+    def _validMacbethOption(self, value):\n+        if not isinstance(value, dict):\n+            return False\n+\n+        if list(value.keys()) != ['small', 'show']:\n+            return False\n+\n+        for val in value.values():\n+            if not isinstance(val, numbers.Number):\n+                return False\n+\n+        return True\n+\n+    def _parse(self, config_file, modules):\n+        with open(config_file, 'r') as config_json:\n+            config = json.load(config_json)\n+\n+        disable = []\n+        for module in self.enumerate_rpi_modules(config['disable'], config, modules):\n+            disable.append(module)\n+            # Remove the disabled module's config too\n+            config.pop(module.name)\n+        config.pop('disable')\n+\n+        # The raspberrypi config format has 'plot' map to a list of module\n+        # names which should be plotted.  libtuning has each module contain the\n+        # plot information in itself so do this conversion.\n+\n+        for module in self.enumerate_rpi_modules(config['plot'], config, modules):\n+            # It's fine to set the value of a potentially disabled module, as\n+            # the object still exists at this point\n+            module.appendValue('debug', 'plot')\n+        config.pop('plot')\n+\n+        # Convert the keys from module name to module instance\n+\n+        new_config = {}\n+\n+        for module_name in config:\n+            module = utils.get_module_by_typename(modules, module_name)\n+            if module is not None:\n+                new_config[module] = config[module_name]\n+\n+        new_config['general'] = {}\n+\n+        if 'blacklevel' in config:\n+            if not isinstance(config['blacklevel'], numbers.Number):\n+                raise TypeError('Config \"blacklevel\" must be a number')\n+            # Raspberry Pi's ctt config has magic blacklevel value -1 to mean\n+            # \"get it from the image metadata\". Since we already do that in\n+            # Image, don't save it to the config here.\n+            if config['blacklevel'] >= 0:\n+                new_config['general']['blacklevel'] = config['blacklevel']\n+\n+        if 'macbeth' in config:\n+            if not self._validMacbethOption(config['macbeth']):\n+                raise TypeError('Config \"macbeth\" must be a dict: {\"small\": number, \"show\": number}')\n+            new_config['general']['macbeth'] = config['macbeth']\n+        else:\n+            new_config['general']['macbeth'] = {'small': 0, 'show': 0}\n+\n+        return new_config, disable\n","prefixes":["libcamera-devel","v2","05/11"]}