[{"id":24131,"web_url":"https://patchwork.libcamera.org/comment/24131/","msgid":"<Yt8HxmoW5Vw1OFP+@pendragon.ideasonboard.com>","date":"2022-07-25T21:14:46","subject":"Re: [libcamera-devel] [PATCH 15/15] ipa: raspberryip: Remove all\n\texception throw statements","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Naush,\n\nThank you for the patch.\n\nOn Mon, Jul 25, 2022 at 02:46:39PM +0100, Naushir Patuck via libcamera-devel wrote:\n> Replace all exception throw statements with LOG(RPi*, Fatal) error messages.\n> \n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> ---\n>  src/ipa/raspberrypi/controller/rpi/agc.cpp  | 26 +++++++++------------\n>  src/ipa/raspberrypi/controller/rpi/alsc.cpp | 25 ++++++++------------\n>  src/ipa/raspberrypi/controller/rpi/awb.cpp  | 18 ++++++--------\n>  src/ipa/raspberrypi/controller/rpi/ccm.cpp  |  9 ++++---\n>  src/ipa/raspberrypi/controller/rpi/dpc.cpp  |  2 +-\n>  src/ipa/raspberrypi/controller/rpi/geq.cpp  |  2 +-\n>  6 files changed, 34 insertions(+), 48 deletions(-)\n> \n> diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> index 2c7928bbac4d..0f44ceb3feda 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp\n> @@ -35,11 +35,11 @@ void AgcMeteringMode::read(boost::property_tree::ptree const &params)\n>  \tint num = 0;\n>  \tfor (auto &p : params.get_child(\"weights\")) {\n>  \t\tif (num == AGC_STATS_SIZE)\n> -\t\t\tthrow std::runtime_error(\"AgcConfig: too many weights\");\n> +\t\t\tLOG(RPiAgc, Fatal) << \"AgcConfig: too many weights\";\n\nA patch on top to s/AgcConfig/AgcMeteringMode/ would be nice.\n\n>  \t\tweights[num++] = p.second.get_value<double>();\n>  \t}\n>  \tif (num != AGC_STATS_SIZE)\n> -\t\tthrow std::runtime_error(\"AgcConfig: insufficient weights\");\n> +\t\tLOG(RPiAgc, Fatal) << \"AgcConfig: insufficient weights\";\n>  }\n>  \n>  static std::string\n> @@ -78,11 +78,11 @@ void AgcExposureMode::read(boost::property_tree::ptree const &params)\n>  \tint numShutters = readList(shutter, params.get_child(\"shutter\"));\n>  \tint numAgs = readList(gain, params.get_child(\"gain\"));\n>  \tif (numShutters < 2 || numAgs < 2)\n> -\t\tthrow std::runtime_error(\n> -\t\t\t\"AgcConfig: must have at least two entries in exposure profile\");\n> +\t\tLOG(RPiAgc, Fatal)\n> +\t\t\t<< \"AgcConfig: must have at least two entries in exposure profile\";\n>  \tif (numShutters != numAgs)\n> -\t\tthrow std::runtime_error(\n> -\t\t\t\"AgcConfig: expect same number of exposure and gain entries in exposure profile\");\n> +\t\tLOG(RPiAgc, Fatal)\n> +\t\t\t<< \"AgcConfig: expect same number of exposure and gain entries in exposure profile\";\n>  }\n>  \n>  static std::string\n> @@ -106,8 +106,7 @@ void AgcConstraint::read(boost::property_tree::ptree const &params)\n>  \ttransform(boundString.begin(), boundString.end(),\n>  \t\t  boundString.begin(), ::toupper);\n>  \tif (boundString != \"UPPER\" && boundString != \"LOWER\")\n> -\t\tthrow std::runtime_error(\n> -\t\t\t\"AGC constraint type should be UPPER or LOWER\");\n> +\t\tLOG(RPiAgc, Fatal) << \"AGC constraint type should be UPPER or LOWER\";\n>  \tbound = boundString == \"UPPER\" ? Bound::UPPER : Bound::LOWER;\n>  \tqLo = params.get<double>(\"q_lo\");\n>  \tqHi = params.get<double>(\"q_hi\");\n> @@ -465,8 +464,7 @@ void Agc::housekeepConfig()\n>  \tif (strcmp(meteringModeName_.c_str(), status_.meteringMode)) {\n>  \t\tauto it = config_.meteringModes.find(meteringModeName_);\n>  \t\tif (it == config_.meteringModes.end())\n> -\t\t\tthrow std::runtime_error(\"Agc: no metering mode \" +\n> -\t\t\t\t\t\t meteringModeName_);\n> +\t\t\tLOG(RPiAgc, Fatal) << \"Agc: no metering mode \" << meteringModeName_;\n\nYou can drop the \"Agc:\" prefix as the log category name will make it\nclear. Same comment for messages below.\n\nMost of the Fatal log statements occur at config read time. While it's\nnot nice to abort, there's no urgency to fix that. The calls that occur\nat runtime bother me a bit more, it would be good to fix that (on top).\nAt the moment, if a configuration file doesn't define, for instance, a\nmatrix metering mode, I think an application will crash libcamera if it\ntries to select it.\n\nThe problem predates this patch, so it's not a blocker to get this\nmerged. With the prefix issue addressed,\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>  \t\tmeteringMode_ = &it->second;\n>  \t\tcopyString(meteringModeName_, status_.meteringMode,\n>  \t\t\t   sizeof(status_.meteringMode));\n> @@ -474,8 +472,7 @@ void Agc::housekeepConfig()\n>  \tif (strcmp(exposureModeName_.c_str(), status_.exposureMode)) {\n>  \t\tauto it = config_.exposureModes.find(exposureModeName_);\n>  \t\tif (it == config_.exposureModes.end())\n> -\t\t\tthrow std::runtime_error(\"Agc: no exposure profile \" +\n> -\t\t\t\t\t\t exposureModeName_);\n> +\t\t\tLOG(RPiAgc, Fatal) << \"Agc: no exposure profile \" << exposureModeName_;\n>  \t\texposureMode_ = &it->second;\n>  \t\tcopyString(exposureModeName_, status_.exposureMode,\n>  \t\t\t   sizeof(status_.exposureMode));\n> @@ -484,8 +481,7 @@ void Agc::housekeepConfig()\n>  \t\tauto it =\n>  \t\t\tconfig_.constraintModes.find(constraintModeName_);\n>  \t\tif (it == config_.constraintModes.end())\n> -\t\t\tthrow std::runtime_error(\"Agc: no constraint list \" +\n> -\t\t\t\t\t\t constraintModeName_);\n> +\t\t\tLOG(RPiAgc, Fatal) << \"Agc: no constraint list \" << constraintModeName_;\n>  \t\tconstraintMode_ = &it->second;\n>  \t\tcopyString(constraintModeName_, status_.constraint_mode,\n>  \t\t\t   sizeof(status_.constraint_mode));\n> @@ -502,7 +498,7 @@ void Agc::fetchCurrentExposure(Metadata *imageMetadata)\n>  \tDeviceStatus *deviceStatus =\n>  \t\timageMetadata->getLocked<DeviceStatus>(\"device.status\");\n>  \tif (!deviceStatus)\n> -\t\tthrow std::runtime_error(\"Agc: no device metadata\");\n> +\t\tLOG(RPiAgc, Fatal) << \"Agc: no device metadata\";\n>  \tcurrent_.shutter = deviceStatus->shutterSpeed;\n>  \tcurrent_.analogueGain = deviceStatus->analogueGain;\n>  \tAgcStatus *agcStatus =\n> diff --git a/src/ipa/raspberrypi/controller/rpi/alsc.cpp b/src/ipa/raspberrypi/controller/rpi/alsc.cpp\n> index 7dd35aef10c4..f2111a7f63ec 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/alsc.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/alsc.cpp\n> @@ -54,10 +54,10 @@ static void generateLut(double *lut, boost::property_tree::ptree const &params)\n>  {\n>  \tdouble cstrength = params.get<double>(\"corner_strength\", 2.0);\n>  \tif (cstrength <= 1.0)\n> -\t\tthrow std::runtime_error(\"Alsc: corner_strength must be > 1.0\");\n> +\t\tLOG(RPiAlsc, Fatal) << \"Alsc: corner_strength must be > 1.0\";\n>  \tdouble asymmetry = params.get<double>(\"asymmetry\", 1.0);\n>  \tif (asymmetry < 0)\n> -\t\tthrow std::runtime_error(\"Alsc: asymmetry must be >= 0\");\n> +\t\tLOG(RPiAlsc, Fatal) << \"Alsc: asymmetry must be >= 0\";\n>  \tdouble f1 = cstrength - 1, f2 = 1 + sqrt(cstrength);\n>  \tdouble R2 = X * Y / 4 * (1 + asymmetry * asymmetry);\n>  \tint num = 0;\n> @@ -79,12 +79,11 @@ static void readLut(double *lut, boost::property_tree::ptree const &params)\n>  \tconst int maxNum = XY;\n>  \tfor (auto &p : params) {\n>  \t\tif (num == maxNum)\n> -\t\t\tthrow std::runtime_error(\n> -\t\t\t\t\"Alsc: too many entries in LSC table\");\n> +\t\t\tLOG(RPiAlsc, Fatal) << \"Alsc: too many entries in LSC table\";\n>  \t\tlut[num++] = p.second.get_value<double>();\n>  \t}\n>  \tif (num < maxNum)\n> -\t\tthrow std::runtime_error(\"Alsc: too few entries in LSC table\");\n> +\t\tLOG(RPiAlsc, Fatal) << \"Alsc: too few entries in LSC table\";\n>  }\n>  \n>  static void readCalibrations(std::vector<AlscCalibration> &calibrations,\n> @@ -96,9 +95,8 @@ static void readCalibrations(std::vector<AlscCalibration> &calibrations,\n>  \t\tfor (auto &p : params.get_child(name)) {\n>  \t\t\tdouble ct = p.second.get<double>(\"ct\");\n>  \t\t\tif (ct <= lastCt)\n> -\t\t\t\tthrow std::runtime_error(\n> -\t\t\t\t\t\"Alsc: entries in \" + name +\n> -\t\t\t\t\t\" must be in increasing ct order\");\n> +\t\t\t\tLOG(RPiAlsc, Fatal)\n> +\t\t\t\t\t<< \"Alsc: entries in \" << name << \" must be in increasing ct order\";\n>  \t\t\tAlscCalibration calibration;\n>  \t\t\tcalibration.ct = lastCt = ct;\n>  \t\t\tboost::property_tree::ptree const &table =\n> @@ -106,17 +104,14 @@ static void readCalibrations(std::vector<AlscCalibration> &calibrations,\n>  \t\t\tint num = 0;\n>  \t\t\tfor (auto it = table.begin(); it != table.end(); it++) {\n>  \t\t\t\tif (num == XY)\n> -\t\t\t\t\tthrow std::runtime_error(\n> -\t\t\t\t\t\t\"Alsc: too many values for ct \" +\n> -\t\t\t\t\t\tstd::to_string(ct) + \" in \" +\n> -\t\t\t\t\t\tname);\n> +\t\t\t\t\tLOG(RPiAlsc, Fatal)\n> +\t\t\t\t\t\t<< \"Alsc: too many values for ct \" << ct << \" in \" << name;\n>  \t\t\t\tcalibration.table[num++] =\n>  \t\t\t\t\tit->second.get_value<double>();\n>  \t\t\t}\n>  \t\t\tif (num != XY)\n> -\t\t\t\tthrow std::runtime_error(\n> -\t\t\t\t\t\"Alsc: too few values for ct \" +\n> -\t\t\t\t\tstd::to_string(ct) + \" in \" + name);\n> +\t\t\t\tLOG(RPiAlsc, Fatal)\n> +\t\t\t\t\t<< \"Alsc: too few values for ct \" << ct << \" in \" << name;\n>  \t\t\tcalibrations.push_back(calibration);\n>  \t\t\tLOG(RPiAlsc, Debug)\n>  \t\t\t\t<< \"Read \" << name << \" calibration for ct \" << ct;\n> diff --git a/src/ipa/raspberrypi/controller/rpi/awb.cpp b/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> index 5f601290ce72..aabfec6bd672 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/awb.cpp\n> @@ -46,18 +46,15 @@ static void readCtCurve(Pwl &ctR, Pwl &ctB,\n>  \t\tdouble ct = it->second.get_value<double>();\n>  \t\tassert(it == params.begin() || ct != ctR.domain().end);\n>  \t\tif (++it == params.end())\n> -\t\t\tthrow std::runtime_error(\n> -\t\t\t\t\"AwbConfig: incomplete CT curve entry\");\n> +\t\t\tLOG(RPiAwb, Fatal) << \"AwbConfig: incomplete CT curve entry\";\n>  \t\tctR.append(ct, it->second.get_value<double>());\n>  \t\tif (++it == params.end())\n> -\t\t\tthrow std::runtime_error(\n> -\t\t\t\t\"AwbConfig: incomplete CT curve entry\");\n> +\t\t\tLOG(RPiAwb, Fatal) << \"AwbConfig: incomplete CT curve entry\";\n>  \t\tctB.append(ct, it->second.get_value<double>());\n>  \t\tnum++;\n>  \t}\n>  \tif (num < 2)\n> -\t\tthrow std::runtime_error(\n> -\t\t\t\"AwbConfig: insufficient points in CT curve\");\n> +\t\tLOG(RPiAwb, Fatal) << \"AwbConfig: insufficient points in CT curve\";\n>  }\n>  \n>  void AwbConfig::read(boost::property_tree::ptree const &params)\n> @@ -74,12 +71,11 @@ void AwbConfig::read(boost::property_tree::ptree const &params)\n>  \t\t\tAwbPrior prior;\n>  \t\t\tprior.read(p.second);\n>  \t\t\tif (!priors.empty() && prior.lux <= priors.back().lux)\n> -\t\t\t\tthrow std::runtime_error(\"AwbConfig: Prior must be ordered in increasing lux value\");\n> +\t\t\t\tLOG(RPiAwb, Fatal) << \"AwbConfig: Prior must be ordered in increasing lux value\";\n>  \t\t\tpriors.push_back(prior);\n>  \t\t}\n>  \t\tif (priors.empty())\n> -\t\t\tthrow std::runtime_error(\n> -\t\t\t\t\"AwbConfig: no AWB priors configured\");\n> +\t\t\tLOG(RPiAwb, Fatal) << \"AwbConfig: no AWB priors configured\";\n>  \t}\n>  \tif (params.get_child_optional(\"modes\")) {\n>  \t\tfor (auto &p : params.get_child(\"modes\")) {\n> @@ -88,7 +84,7 @@ void AwbConfig::read(boost::property_tree::ptree const &params)\n>  \t\t\t\tdefaultMode = &modes[p.first];\n>  \t\t}\n>  \t\tif (defaultMode == nullptr)\n> -\t\t\tthrow std::runtime_error(\"AwbConfig: no AWB modes configured\");\n> +\t\t\tLOG(RPiAwb, Fatal) << \"AwbConfig: no AWB modes configured\";\n>  \t}\n>  \tminPixels = params.get<double>(\"min_pixels\", 16.0);\n>  \tminG = params.get<uint16_t>(\"min_G\", 32);\n> @@ -98,7 +94,7 @@ void AwbConfig::read(boost::property_tree::ptree const &params)\n>  \ttransversePos = params.get<double>(\"transverse_pos\", 0.01);\n>  \ttransverseNeg = params.get<double>(\"transverse_neg\", 0.01);\n>  \tif (transversePos <= 0 || transverseNeg <= 0)\n> -\t\tthrow std::runtime_error(\"AwbConfig: transverse_pos/neg must be > 0\");\n> +\t\tLOG(RPiAwb, Fatal) << \"AwbConfig: transverse_pos/neg must be > 0\";\n>  \tsensitivityR = params.get<double>(\"sensitivity_r\", 1.0);\n>  \tsensitivityB = params.get<double>(\"sensitivity_b\", 1.0);\n>  \tif (bayes) {\n> diff --git a/src/ipa/raspberrypi/controller/rpi/ccm.cpp b/src/ipa/raspberrypi/controller/rpi/ccm.cpp\n> index 8095c42dc0c8..cf0c85d26cf9 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/ccm.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/ccm.cpp\n> @@ -45,11 +45,11 @@ void Matrix::read(boost::property_tree::ptree const &params)\n>  \tint n = 0;\n>  \tfor (auto it = params.begin(); it != params.end(); it++) {\n>  \t\tif (n++ == 9)\n> -\t\t\tthrow std::runtime_error(\"Ccm: too many values in CCM\");\n> +\t\t\tLOG(RPiCcm, Fatal) << \"Ccm: too many values in CCM\";\n>  \t\t*ptr++ = it->second.get_value<double>();\n>  \t}\n>  \tif (n < 9)\n> -\t\tthrow std::runtime_error(\"Ccm: too few values in CCM\");\n> +\t\tLOG(RPiCcm, Fatal) << \"Ccm: too few values in CCM\";\n>  }\n>  \n>  Ccm::Ccm(Controller *controller)\n> @@ -70,12 +70,11 @@ void Ccm::read(boost::property_tree::ptree const &params)\n>  \t\tctCcm.ccm.read(p.second.get_child(\"ccm\"));\n>  \t\tif (!config_.ccms.empty() &&\n>  \t\t    ctCcm.ct <= config_.ccms.back().ct)\n> -\t\t\tthrow std::runtime_error(\n> -\t\t\t\t\"Ccm: CCM not in increasing colour temperature order\");\n> +\t\t\tLOG(RPiCcm, Fatal) << \"Ccm: CCM not in increasing colour temperature order\";\n>  \t\tconfig_.ccms.push_back(std::move(ctCcm));\n>  \t}\n>  \tif (config_.ccms.empty())\n> -\t\tthrow std::runtime_error(\"Ccm: no CCMs specified\");\n> +\t\tLOG(RPiCcm, Fatal) << \"Ccm: no CCMs specified\";\n>  }\n>  \n>  void Ccm::setSaturation(double saturation)\n> diff --git a/src/ipa/raspberrypi/controller/rpi/dpc.cpp b/src/ipa/raspberrypi/controller/rpi/dpc.cpp\n> index 9cd78abe28d6..d5d784e7ca64 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/dpc.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/dpc.cpp\n> @@ -35,7 +35,7 @@ void Dpc::read(boost::property_tree::ptree const &params)\n>  {\n>  \tconfig_.strength = params.get<int>(\"strength\", 1);\n>  \tif (config_.strength < 0 || config_.strength > 2)\n> -\t\tthrow std::runtime_error(\"Dpc: bad strength value\");\n> +\t\tLOG(RPiDpc, Fatal) << \"Dpc: bad strength value\";\n>  }\n>  \n>  void Dpc::prepare(Metadata *imageMetadata)\n> diff --git a/src/ipa/raspberrypi/controller/rpi/geq.cpp b/src/ipa/raspberrypi/controller/rpi/geq.cpp\n> index 4e8ed696851b..696da4aeea59 100644\n> --- a/src/ipa/raspberrypi/controller/rpi/geq.cpp\n> +++ b/src/ipa/raspberrypi/controller/rpi/geq.cpp\n> @@ -40,7 +40,7 @@ void Geq::read(boost::property_tree::ptree const &params)\n>  \tconfig_.offset = params.get<uint16_t>(\"offset\", 0);\n>  \tconfig_.slope = params.get<double>(\"slope\", 0.0);\n>  \tif (config_.slope < 0.0 || config_.slope >= 1.0)\n> -\t\tthrow std::runtime_error(\"Geq: bad slope value\");\n> +\t\tLOG(RPiGeq, Fatal) << \"Geq: bad slope value\";\n>  \tif (params.get_child_optional(\"strength\"))\n>  \t\tconfig_.strength.read(params.get_child(\"strength\"));\n>  }","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3EDB4C3275\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 25 Jul 2022 21:14:53 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 91E7163312;\n\tMon, 25 Jul 2022 23:14:52 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 27AF76330A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 25 Jul 2022 23:14:51 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 928C66D1;\n\tMon, 25 Jul 2022 23:14:50 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1658783692;\n\tbh=qAjiP1+HpXwKjGs9lNgv23FIU9gD0IY9wCVAe7slqHA=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=pq5hCrhXb1A4ay37XgKRZjGHS4IVPuNE6NT2SZOZXSI6r7UUBMoo2bF90TURBDiqv\n\t44fL27HyEpz6NqHxb8M3zm6/qExhKvXIHkCM8uDmMeUK238PyndaU20XRylUn95kyx\n\tBOGqkF4OjFq7Gj7/o2LyAZPEwPjNrwPL5KAP9Cqu8ZIF75tct5X9eAiqKVnBn9pgcm\n\tPFH50Q7GjVUK0tIoNGCRUIhp4wrHgR//B3hX7Dx3RTv8QE9BAbT3pfmEgD+uP7h8bT\n\tQ88SaPUsvwPXAx3kSdfP0Xw7kupsOTrhPkD4PI3x9ib9h0feedxz42IReCaul3NHJP\n\tYg5mQQF6OKZ3w==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1658783690;\n\tbh=qAjiP1+HpXwKjGs9lNgv23FIU9gD0IY9wCVAe7slqHA=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=s1lNO78dB04TLWE/Vlq5+5sDbjL9bZSTEbaV8nbMAUruGAj7p3fP1hbphW7TpdMHV\n\tTZhyOzOauS7+H9tK9zNvDmBeoR/o3gLEkZ4A61uTRTSJ1swI12nOTjRtGB2ME3oLii\n\t3v5Gjk+2JpbGt4LEL8azPG9o43jmo9DLFEkWTPUM="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"s1lNO78d\"; dkim-atps=neutral","Date":"Tue, 26 Jul 2022 00:14:46 +0300","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<Yt8HxmoW5Vw1OFP+@pendragon.ideasonboard.com>","References":"<20220725134639.4572-1-naush@raspberrypi.com>\n\t<20220725134639.4572-16-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220725134639.4572-16-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH 15/15] ipa: raspberryip: Remove all\n\texception throw statements","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]