[libcamera-devel] [PATCH v6 5/8] ipa: raspberrypi: Introduce version 2.0 format for the camera tuning file
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sat Jul 23 18:28:38 CEST 2022
Hi Naush,
Thank you for the patch.
On Mon, Jul 18, 2022 at 09:15:59AM +0100, Naushir Patuck via libcamera-devel wrote:
> The existing tuning file format (version 1.0) requires the controller algorithms
> to run in the same order as listed in the JSON structure. The JSON specification
> does not mandate any such ordering, but the Boost JSON parser would maintain
> this order.
>
> In order to remove this reliance on the parser to provide ordering, introduce a
> new version 2.0 format for the camera tuning file. In this version, the
> algorithms are specified in a top level list node ("algorithms"), which does
> require strict ordering of the elements.
>
> A "version" node is added to distinguish between the version 1.0 and 2.0
> formats. The absence of the "version" node implies version 1.0.
>
> A "target" node is also added to specify the target platform for this
> configuration.
>
> Update the controller to support either version of the tuning file by looking
> at the version node. CreateAlgorithm member function to now load and configure
> each algorithm. Additionally, make CreateAlgorithm a private member, it does not
> get called externally.
>
> If a version 1.0 format tuning file is used, throw a warning message indicating
> it will be soon deprecated.
>
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
> src/ipa/raspberrypi/controller/controller.cpp | 43 +++++++++++++------
> src/ipa/raspberrypi/controller/controller.hpp | 4 +-
> 2 files changed, 34 insertions(+), 13 deletions(-)
>
> diff --git a/src/ipa/raspberrypi/controller/controller.cpp b/src/ipa/raspberrypi/controller/controller.cpp
> index 67d650ef0c1b..b22a17f18f8e 100644
> --- a/src/ipa/raspberrypi/controller/controller.cpp
> +++ b/src/ipa/raspberrypi/controller/controller.cpp
> @@ -42,22 +42,41 @@ void Controller::Read(char const *filename)
> }
>
> std::unique_ptr<YamlObject> root = YamlParser::parse(file);
> -
> - for (auto const &[key, value] : root->asDict()) {
> - Algorithm *algo = CreateAlgorithm(key.c_str());
> - if (algo) {
> - algo->Read(value);
> - algorithms_.push_back(AlgorithmPtr(algo));
> - } else
> - LOG(RPiController, Warning)
> - << "No algorithm found for \"" << key << "\"";
> + double version = (*root)["version"].get<double>(1.0);
> + if (version < 2.0) {
> + LOG(RPiController, Warning)
> + << "This format of the tuning file will be deprecated soon!"
> + << " Please use the convert_tuning.py utility to update to version 2.0.";
> + for (auto const &[key, value] : root->asDict())
> + CreateAlgorithm(key, value);
> + } else if (version < 3.0) {
> + if (!root->contains("algorithms")) {
> + LOG(RPiController, Fatal)
> + << "Tuning file " << filename
> + << " does not have an \"algorithms\" list!";
> + return;
> + }
> + for (auto const &rootAlgo : (*root)["algorithms"].asList())
> + for (auto const &[key, value] : rootAlgo.asDict())
> + CreateAlgorithm(key, value);
> + } else {
> + LOG(RPiController, Fatal)
> + << "Unrecognised version " << version
> + << " for the tuning file " << filename;
> }
> }
>
> -Algorithm *Controller::CreateAlgorithm(char const *name)
> +void Controller::CreateAlgorithm(const std::string &name, const YamlObject ¶ms)
> {
> - auto it = GetAlgorithms().find(std::string(name));
> - return it != GetAlgorithms().end() ? (*it->second)(this) : nullptr;
> + auto it = GetAlgorithms().find(name);
> + if (it == GetAlgorithms().end()) {
> + LOG(RPiController, Warning)
> + << "No algorithm found for \"" << name << "\"";
> + return;
> + }
> + Algorithm *algo = (*it->second)(this);
> + algo->Read(params);
> + algorithms_.push_back(AlgorithmPtr(algo));
> }
>
> void Controller::Initialise()
> diff --git a/src/ipa/raspberrypi/controller/controller.hpp b/src/ipa/raspberrypi/controller/controller.hpp
> index 3b50ae770d11..9091deac5feb 100644
> --- a/src/ipa/raspberrypi/controller/controller.hpp
> +++ b/src/ipa/raspberrypi/controller/controller.hpp
> @@ -15,6 +15,8 @@
>
> #include <linux/bcm2835-isp.h>
>
> +#include "libcamera/internal/yaml_parser.h"
> +
> #include "camera_mode.h"
> #include "device_status.h"
> #include "metadata.hpp"
> @@ -36,7 +38,6 @@ public:
> Controller();
> Controller(char const *json_filename);
> ~Controller();
> - Algorithm *CreateAlgorithm(char const *name);
> void Read(char const *filename);
> void Initialise();
> void SwitchMode(CameraMode const &camera_mode, Metadata *metadata);
> @@ -46,6 +47,7 @@ public:
> Algorithm *GetAlgorithm(std::string const &name) const;
>
> protected:
> + void CreateAlgorithm(const std::string &name, const libcamera::YamlObject ¶ms);
> Metadata global_metadata_;
> std::vector<AlgorithmPtr> algorithms_;
> bool switch_mode_called_;
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list