From patchwork Tue May 24 22:58:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 16026 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 1C3CCBD161 for ; Tue, 24 May 2022 22:58:27 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 346B965666; Wed, 25 May 2022 00:58:26 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1653433106; bh=M1Wq+XSP/SYd8Pr2DR63athuMH/ZxenzpMnHWSAiPz0=; h=To:Date:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Hew3wptfOWkyiRWAq0UFRHib9N00xciQgP/9G+95WJIUFcHSBshJ+bJvoyA8Exai/ tT27eVUHOLK1SV5y4CG8763RnoK513dCAiK/DnpFLwnRXfFVa0bmdJciM7HtD3xfCR aBG2ahjtX8KBsjgSwOyfMOP2jSpNGhSN90EEyWXNVlq0mXNt1698+3my4qB7MIW+bO IPLyH7CQX2LWxD8m3HcOwz7WSNGeE6dFxbCiHnYStg1k1mcRlrjmAUQ4qQKvfSwWT1 PUPclQS3QdXpOErGXMvGFgWjqYvNxn1ImuyR+uVaCFqevB3cSIKd9CltxYAZJUEfdB Sn+ojUj7/RHcg== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7AF4260416 for ; Wed, 25 May 2022 00:58:24 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Sw3LHbo5"; dkim-atps=neutral Received: from pendragon.ideasonboard.com (ip-109-40-241-133.web.vodafone.de [109.40.241.133]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id D4CBF9DA; Wed, 25 May 2022 00:58:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1653433104; bh=M1Wq+XSP/SYd8Pr2DR63athuMH/ZxenzpMnHWSAiPz0=; h=From:To:Cc:Subject:Date:From; b=Sw3LHbo5Vfd1gO7NmmR0Tx8Ft3CvPAdRCRdTmVeTrgIKh8wm9J6N+mkgIDMExFor4 Mw3urru3HiqMEE2OXQC5t9NYTNdTvfxujYwB7jV0VACpcJjJ/tePP+DkWL781Gzvc7 4U8Mo8mSxpoh6N0oZgaW3U6pbpSRgCONLXgklE8g= To: libcamera-devel@lists.libcamera.org Date: Wed, 25 May 2022 01:58:04 +0300 Message-Id: <20220524225816.6830-1-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 00/12] Replace boost JSON parser with libyaml in Raspberry Pi IPA X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Laurent Pinchart via libcamera-devel From: Laurent Pinchart Reply-To: Laurent Pinchart Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Hello, As mentioned in the subject, this patch series replaces the boost JSON parser with the YamlParser implementation based on libyaml for the Raspberry Pi IPA module. The series starts with a few cleanups and extensions in YamlParser, with patch 01/12 turning the enum Type into an enum class, patch 02/12 extending the size() function to support dictionaries in addition to lists, and patch 03/12 moving the parser from using FILE to File for a better RAII-style management of files. Patch 04/12 continues with a small cleanup in the YamlParser unit tests. Patch 05/12 introduces the first big change in the series: a new iterator API for YamlObject. This allows iterating over the elements of a list of dictionaly object. Unlike the boost property_tree implementation that iterates over a pair of std::string key and ptree value, the YamlObject iterators differ for lists and dictionaries. This provides a more familiar API for lists, at the expense of requiring adapter objects (see the asDict() and asList() functions). I'm interested in feedback on this approach, hence the RFC. Patch 06/12 then extends the unit tests to cover the iterator API, and patch 07/12 uses the API in the Android camera HAL. Patch 08/12 completes that part of the series by removing the then unused memberNames() function. The series continue with two extensions to the YamlParser. In patch 09/12 the get() function receives a fix to properly check the value range for 32-bit integers, and in patch 10/12 new specializations of the function are added for 16-bit integers, needed by the Raspberry Pi IPA. The last part of the series converts the Raspberry Pi IPA from boost to YamlParser. Small changes are needed in patch 11/12 to convert tabs to spaces in the tuning JSON files, as they confuse the YAML parser. Patch 12/12 then converts the IPA module, and drops the dependency on boost. When compiled in release mode with clang-13, the Raspberry Pi IPA module .text section shrank from 1317086 to 963614 bytes. I haven't been able to test the series on a Raspberry Pi yet (second reason for the RFC) as I don't have access to my board at the moment. Laurent Pinchart (12): libcamera: yaml_object: Turn Type into an enum class libcamera: yaml_parser: Extend YamlObject::size() to dictionaries libcamera: yaml_parser: Switch from FILE to File test: yaml-parser: Use write() instead of fwrite() libcamera: yaml_parser: Add iterator API test: yaml_parser: Extend tests to cover the iterator API android: Use the YamlObject iterator API libcamera: yaml_parser: Remove memberNames() function libcamera: yaml_parser: Fix range checks for 32-bit integers libcamera: yaml_parser: Add get() specializations for 16-bit integers ipa: raspberrypi: Replace tabs with spaces in tuning data files ipa: raspberrypi: Use YamlParser to replace dependency on boost README.rst | 6 - include/libcamera/internal/yaml_parser.h | 133 +++++++++- src/android/camera_hal_config.cpp | 22 +- src/ipa/raspberrypi/controller/algorithm.cpp | 2 +- src/ipa/raspberrypi/controller/algorithm.hpp | 6 +- src/ipa/raspberrypi/controller/controller.cpp | 27 +- src/ipa/raspberrypi/controller/pwl.cpp | 12 +- src/ipa/raspberrypi/controller/pwl.hpp | 5 +- src/ipa/raspberrypi/controller/rpi/agc.cpp | 94 +++---- src/ipa/raspberrypi/controller/rpi/agc.hpp | 10 +- src/ipa/raspberrypi/controller/rpi/alsc.cpp | 94 ++++--- src/ipa/raspberrypi/controller/rpi/alsc.hpp | 2 +- src/ipa/raspberrypi/controller/rpi/awb.cpp | 89 +++---- src/ipa/raspberrypi/controller/rpi/awb.hpp | 8 +- .../controller/rpi/black_level.cpp | 12 +- .../controller/rpi/black_level.hpp | 2 +- src/ipa/raspberrypi/controller/rpi/ccm.cpp | 28 +-- src/ipa/raspberrypi/controller/rpi/ccm.hpp | 4 +- .../raspberrypi/controller/rpi/contrast.cpp | 18 +- .../raspberrypi/controller/rpi/contrast.hpp | 2 +- src/ipa/raspberrypi/controller/rpi/dpc.cpp | 4 +- src/ipa/raspberrypi/controller/rpi/dpc.hpp | 2 +- src/ipa/raspberrypi/controller/rpi/geq.cpp | 10 +- src/ipa/raspberrypi/controller/rpi/geq.hpp | 2 +- src/ipa/raspberrypi/controller/rpi/lux.cpp | 12 +- src/ipa/raspberrypi/controller/rpi/lux.hpp | 2 +- src/ipa/raspberrypi/controller/rpi/noise.cpp | 6 +- src/ipa/raspberrypi/controller/rpi/noise.hpp | 2 +- src/ipa/raspberrypi/controller/rpi/sdn.cpp | 6 +- src/ipa/raspberrypi/controller/rpi/sdn.hpp | 2 +- .../raspberrypi/controller/rpi/sharpen.cpp | 8 +- .../raspberrypi/controller/rpi/sharpen.hpp | 2 +- src/ipa/raspberrypi/data/imx219.json | 8 +- src/ipa/raspberrypi/data/imx219_noir.json | 10 +- src/ipa/raspberrypi/data/imx290.json | 18 +- src/ipa/raspberrypi/data/imx477.json | 8 +- src/ipa/raspberrypi/data/imx477_noir.json | 10 +- src/ipa/raspberrypi/data/ov5647.json | 10 +- src/ipa/raspberrypi/data/ov5647_noir.json | 12 +- src/ipa/raspberrypi/data/se327m12.json | 6 +- src/ipa/raspberrypi/meson.build | 1 - src/ipa/raspberrypi/raspberrypi.cpp | 1 + src/libcamera/yaml_parser.cpp | 232 +++++++++++++----- test/yaml-parser.cpp | 109 +++++--- 44 files changed, 659 insertions(+), 400 deletions(-) base-commit: 153b468930a9df22debb28889312f8a5c511ee04