From 0821497ddd70a748e4758ecac3536fb73ed0c81c Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Tue, 26 Jul 2022 02:36:38 +0300 Subject: ipa: raspberrypi: Propagate errors from AGC metering tuning data read Update the AGC metering functions that deal with reading tuning data to propagate errors to the caller, using std::tie and std::tuple to group the error code and return value. Signed-off-by: Laurent Pinchart Reviewed-by: Naushir Patuck Tested-by: Naushir Patuck --- src/ipa/raspberrypi/controller/rpi/agc.cpp | 71 +++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 17 deletions(-) (limited to 'src/ipa/raspberrypi/controller/rpi') diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp index 7d3e1b18..cf03fb10 100644 --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp @@ -6,6 +6,7 @@ */ #include +#include #include @@ -43,19 +44,25 @@ int AgcMeteringMode::read(boost::property_tree::ptree const ¶ms) return 0; } -static std::string +static std::tuple readMeteringModes(std::map &meteringModes, boost::property_tree::ptree const ¶ms) { std::string first; + int ret; + for (auto &p : params) { AgcMeteringMode meteringMode; - meteringMode.read(p.second); + ret = meteringMode.read(p.second); + if (ret) + return { ret, {} }; + meteringModes[p.first] = std::move(meteringMode); if (first.empty()) first = p.first; } - return first; + + return { 0, first }; } static int readList(std::vector &list, @@ -87,19 +94,25 @@ int AgcExposureMode::read(boost::property_tree::ptree const ¶ms) return 0; } -static std::string +static std::tuple readExposureModes(std::map &exposureModes, boost::property_tree::ptree const ¶ms) { std::string first; + int ret; + for (auto &p : params) { AgcExposureMode exposureMode; - exposureMode.read(p.second); + ret = exposureMode.read(p.second); + if (ret) + return { ret, {} }; + exposureModes[p.first] = std::move(exposureMode); if (first.empty()) first = p.first; } - return first; + + return { 0, first }; } int AgcConstraint::read(boost::property_tree::ptree const ¶ms) @@ -115,38 +128,62 @@ int AgcConstraint::read(boost::property_tree::ptree const ¶ms) return yTarget.read(params.get_child("y_target")); } -static AgcConstraintMode +static std::tuple readConstraintMode(boost::property_tree::ptree const ¶ms) { AgcConstraintMode mode; + int ret; + for (auto &p : params) { AgcConstraint constraint; - constraint.read(p.second); + ret = constraint.read(p.second); + if (ret) + return { ret, {} }; + mode.push_back(std::move(constraint)); } - return mode; + + return { 0, mode }; } -static std::string readConstraintModes(std::map &constraintModes, - boost::property_tree::ptree const ¶ms) +static std::tuple +readConstraintModes(std::map &constraintModes, + boost::property_tree::ptree const ¶ms) { std::string first; + int ret; + for (auto &p : params) { - constraintModes[p.first] = readConstraintMode(p.second); + std::tie(ret, constraintModes[p.first]) = readConstraintMode(p.second); + if (ret) + return { ret, {} }; + if (first.empty()) first = p.first; } - return first; + + return { 0, first }; } int AgcConfig::read(boost::property_tree::ptree const ¶ms) { LOG(RPiAgc, Debug) << "AgcConfig"; - defaultMeteringMode = readMeteringModes(meteringModes, params.get_child("metering_modes")); - defaultExposureMode = readExposureModes(exposureModes, params.get_child("exposure_modes")); - defaultConstraintMode = readConstraintModes(constraintModes, params.get_child("constraint_modes")); + int ret; + + std::tie(ret, defaultMeteringMode) = + readMeteringModes(meteringModes, params.get_child("metering_modes")); + if (ret) + return ret; + std::tie(ret, defaultExposureMode) = + readExposureModes(exposureModes, params.get_child("exposure_modes")); + if (ret) + return ret; + std::tie(ret, defaultConstraintMode) = + readConstraintModes(constraintModes, params.get_child("constraint_modes")); + if (ret) + return ret; - int ret = yTarget.read(params.get_child("y_target")); + ret = yTarget.read(params.get_child("y_target")); if (ret) return ret; -- cgit v1.2.1