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 <laurent.pinchart@ideasonboard.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Tested-by: Naushir Patuck <naush@raspberrypi.com>
This commit is contained in:
Laurent Pinchart 2022-07-26 02:36:38 +03:00
parent f357b1bf6e
commit 0821497ddd

View file

@ -6,6 +6,7 @@
*/ */
#include <map> #include <map>
#include <tuple>
#include <linux/bcm2835-isp.h> #include <linux/bcm2835-isp.h>
@ -43,19 +44,25 @@ int AgcMeteringMode::read(boost::property_tree::ptree const &params)
return 0; return 0;
} }
static std::string static std::tuple<int, std::string>
readMeteringModes(std::map<std::string, AgcMeteringMode> &meteringModes, readMeteringModes(std::map<std::string, AgcMeteringMode> &meteringModes,
boost::property_tree::ptree const &params) boost::property_tree::ptree const &params)
{ {
std::string first; std::string first;
int ret;
for (auto &p : params) { for (auto &p : params) {
AgcMeteringMode meteringMode; AgcMeteringMode meteringMode;
meteringMode.read(p.second); ret = meteringMode.read(p.second);
if (ret)
return { ret, {} };
meteringModes[p.first] = std::move(meteringMode); meteringModes[p.first] = std::move(meteringMode);
if (first.empty()) if (first.empty())
first = p.first; first = p.first;
} }
return first;
return { 0, first };
} }
static int readList(std::vector<double> &list, static int readList(std::vector<double> &list,
@ -87,19 +94,25 @@ int AgcExposureMode::read(boost::property_tree::ptree const &params)
return 0; return 0;
} }
static std::string static std::tuple<int, std::string>
readExposureModes(std::map<std::string, AgcExposureMode> &exposureModes, readExposureModes(std::map<std::string, AgcExposureMode> &exposureModes,
boost::property_tree::ptree const &params) boost::property_tree::ptree const &params)
{ {
std::string first; std::string first;
int ret;
for (auto &p : params) { for (auto &p : params) {
AgcExposureMode exposureMode; AgcExposureMode exposureMode;
exposureMode.read(p.second); ret = exposureMode.read(p.second);
if (ret)
return { ret, {} };
exposureModes[p.first] = std::move(exposureMode); exposureModes[p.first] = std::move(exposureMode);
if (first.empty()) if (first.empty())
first = p.first; first = p.first;
} }
return first;
return { 0, first };
} }
int AgcConstraint::read(boost::property_tree::ptree const &params) int AgcConstraint::read(boost::property_tree::ptree const &params)
@ -115,38 +128,62 @@ int AgcConstraint::read(boost::property_tree::ptree const &params)
return yTarget.read(params.get_child("y_target")); return yTarget.read(params.get_child("y_target"));
} }
static AgcConstraintMode static std::tuple<int, AgcConstraintMode>
readConstraintMode(boost::property_tree::ptree const &params) readConstraintMode(boost::property_tree::ptree const &params)
{ {
AgcConstraintMode mode; AgcConstraintMode mode;
int ret;
for (auto &p : params) { for (auto &p : params) {
AgcConstraint constraint; AgcConstraint constraint;
constraint.read(p.second); ret = constraint.read(p.second);
if (ret)
return { ret, {} };
mode.push_back(std::move(constraint)); mode.push_back(std::move(constraint));
} }
return mode;
return { 0, mode };
} }
static std::string readConstraintModes(std::map<std::string, AgcConstraintMode> &constraintModes, static std::tuple<int, std::string>
readConstraintModes(std::map<std::string, AgcConstraintMode> &constraintModes,
boost::property_tree::ptree const &params) boost::property_tree::ptree const &params)
{ {
std::string first; std::string first;
int ret;
for (auto &p : params) { 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()) if (first.empty())
first = p.first; first = p.first;
} }
return first;
return { 0, first };
} }
int AgcConfig::read(boost::property_tree::ptree const &params) int AgcConfig::read(boost::property_tree::ptree const &params)
{ {
LOG(RPiAgc, Debug) << "AgcConfig"; LOG(RPiAgc, Debug) << "AgcConfig";
defaultMeteringMode = readMeteringModes(meteringModes, params.get_child("metering_modes")); int ret;
defaultExposureMode = readExposureModes(exposureModes, params.get_child("exposure_modes"));
defaultConstraintMode = readConstraintModes(constraintModes, params.get_child("constraint_modes"));
int ret = yTarget.read(params.get_child("y_target")); 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;
ret = yTarget.read(params.get_child("y_target"));
if (ret) if (ret)
return ret; return ret;