[libcamera-devel] [RFC PATCH 00/12] Replace boost JSON parser with libyaml in Raspberry Pi IPA

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed May 25 00:58:04 CEST 2022


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
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list