From patchwork Sun May 3 22:53:15 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 26602 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 94B8FC32F6 for ; Sun, 3 May 2026 22:53:23 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 941E663026; Mon, 4 May 2026 00:53:20 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="lZ0UAmqG"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id BCF8962E6A for ; Mon, 4 May 2026 00:53:18 +0200 (CEST) Received: from killaraus.ideasonboard.com (2001-14ba-703d-e500--2a1.rev.dnainternet.fi [IPv6:2001:14ba:703d:e500::2a1]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 442AD8F for ; Mon, 4 May 2026 00:53:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1777848797; bh=hpEs/yp4jQ+AI177k962gViwjRDxsGjK5m9dJRnNBLI=; h=From:To:Subject:Date:In-Reply-To:References:From; b=lZ0UAmqGZyyDSgxsSzjPWQ3RM5+hxE8bBSct20R90FHndzZ3RmRciBSbzzuIqi8Jt I9wr6M6S5psg/LU4i6KowxF66Rxi85JOkMGT4ZNXF/fJzXEytKkznQCq21s4FvzyGO veXiEzYWDH5MWFf3VuO4z88GIfbMqHFbPvnjMK9s= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Subject: [PATCH 2/2] treewide: Use utils::defopt Date: Mon, 4 May 2026 01:53:15 +0300 Message-ID: <20260503225315.1272813-2-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260503225315.1272813-1-laurent.pinchart@ideasonboard.com> References: <20260503225315.1272813-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Calling std::optional::value_or() constructs the value passed as an argument to the function, even if the std::optional already contains a valus. This can be fairly inefficient when using values whose default constructor is expensive. Fix it by using utils::defopt. Signed-off-by: Laurent Pinchart Reviewed-by: Barnabás Pőcze Reviewed-by: Kieran Bingham --- src/android/camera_capabilities.cpp | 5 +++-- src/ipa/libipa/agc_mean_luminance.cpp | 6 ++++-- src/ipa/libipa/awb_bayes.cpp | 6 ++++-- src/ipa/mali-c55/algorithms/lsc.cpp | 8 +++++--- src/ipa/rkisp1/algorithms/agc.cpp | 2 +- src/ipa/rkisp1/algorithms/dpf.cpp | 7 ++++--- src/ipa/rkisp1/algorithms/gsl.cpp | 8 ++++---- src/ipa/rkisp1/algorithms/lsc.cpp | 4 ++-- src/libcamera/ipa_manager.cpp | 2 +- src/libcamera/ipa_proxy.cpp | 4 ++-- src/libcamera/pipeline/rpi/pisp/pisp.cpp | 2 +- src/v4l2/v4l2_compat_manager.cpp | 2 +- test/value-node.cpp | 4 ++-- 13 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp index b161bc6b3ed6..6b58dd554873 100644 --- a/src/android/camera_capabilities.cpp +++ b/src/android/camera_capabilities.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -1064,7 +1065,7 @@ int CameraCapabilities::initializeStaticMetadata() /* Sensor static metadata. */ std::array pixelArraySize; { - const Size &size = properties.get(properties::PixelArraySize).value_or(Size{}); + const Size &size = properties.get(properties::PixelArraySize).value_or(utils::defopt); pixelArraySize[0] = size.width; pixelArraySize[1] = size.height; staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, @@ -1083,7 +1084,7 @@ int CameraCapabilities::initializeStaticMetadata() { const Span rects = - properties.get(properties::PixelArrayActiveAreas).value_or(Span{}); + properties.get(properties::PixelArrayActiveAreas).value_or(utils::defopt); std::vector data{ static_cast(rects[0].x), static_cast(rects[0].y), diff --git a/src/ipa/libipa/agc_mean_luminance.cpp b/src/ipa/libipa/agc_mean_luminance.cpp index 1d385551adc6..c226dd23552c 100644 --- a/src/ipa/libipa/agc_mean_luminance.cpp +++ b/src/ipa/libipa/agc_mean_luminance.cpp @@ -11,6 +11,8 @@ #include #include +#include + #include #include "exposure_mode_helper.h" @@ -288,9 +290,9 @@ int AgcMeanLuminance::parseExposureModes(const ValueNode &tuningData) } std::vector exposureTimes = - modeValues["exposureTime"].get>().value_or(std::vector{}); + modeValues["exposureTime"].get>().value_or(utils::defopt); std::vector gains = - modeValues["gain"].get>().value_or(std::vector{}); + modeValues["gain"].get>().value_or(utils::defopt); if (exposureTimes.size() != gains.size()) { LOG(AgcMeanLuminance, Error) diff --git a/src/ipa/libipa/awb_bayes.cpp b/src/ipa/libipa/awb_bayes.cpp index a1412c8bd2b5..9fd85e5a4505 100644 --- a/src/ipa/libipa/awb_bayes.cpp +++ b/src/ipa/libipa/awb_bayes.cpp @@ -16,6 +16,8 @@ #include #include +#include + #include #include "colours.h" @@ -211,9 +213,9 @@ int AwbBayes::readPriors(const ValueNode &tuningData) } std::vector temperatures = - p["ct"].get>().value_or(std::vector{}); + p["ct"].get>().value_or(utils::defopt); std::vector probabilities = - p["probability"].get>().value_or(std::vector{}); + p["probability"].get>().value_or(utils::defopt); if (temperatures.size() != probabilities.size()) { LOG(Awb, Error) diff --git a/src/ipa/mali-c55/algorithms/lsc.cpp b/src/ipa/mali-c55/algorithms/lsc.cpp index fe230fdff418..36e50163aecc 100644 --- a/src/ipa/mali-c55/algorithms/lsc.cpp +++ b/src/ipa/mali-c55/algorithms/lsc.cpp @@ -7,6 +7,8 @@ #include "lsc.h" +#include + #include "libcamera/internal/value_node.h" namespace libcamera { @@ -48,11 +50,11 @@ int Lsc::init([[maybe_unused]] IPAContext &context, const ValueNode &tuningData) } std::vector rTable = - yamlSet["r"].get>().value_or(std::vector{}); + yamlSet["r"].get>().value_or(utils::defopt); std::vector gTable = - yamlSet["g"].get>().value_or(std::vector{}); + yamlSet["g"].get>().value_or(utils::defopt); std::vector bTable = - yamlSet["b"].get>().value_or(std::vector{}); + yamlSet["b"].get>().value_or(utils::defopt); /* * Some validation to do; only 16x16 and 32x32 tables of diff --git a/src/ipa/rkisp1/algorithms/agc.cpp b/src/ipa/rkisp1/algorithms/agc.cpp index 523930488a3b..9bb9d943163f 100644 --- a/src/ipa/rkisp1/algorithms/agc.cpp +++ b/src/ipa/rkisp1/algorithms/agc.cpp @@ -55,7 +55,7 @@ int Agc::parseMeteringModes(IPAContext &context, const ValueNode &tuningData) } std::vector weights = - value.get>().value_or(std::vector{}); + value.get>().value_or(utils::defopt); if (weights.size() != context.hw.numHistogramWeights) { LOG(RkISP1Agc, Warning) << "Failed to read metering mode'" << key << "'"; diff --git a/src/ipa/rkisp1/algorithms/dpf.cpp b/src/ipa/rkisp1/algorithms/dpf.cpp index 5c5b539f1ee8..b2c9ec568b97 100644 --- a/src/ipa/rkisp1/algorithms/dpf.cpp +++ b/src/ipa/rkisp1/algorithms/dpf.cpp @@ -12,6 +12,7 @@ #include #include +#include #include @@ -72,7 +73,7 @@ int Dpf::init([[maybe_unused]] IPAContext &context, * +---------|--------> X * -4....-1 0 1 2 3 4 */ - values = dFObject["g"].get>().value_or(std::vector{}); + values = dFObject["g"].get>().value_or(utils::defopt); if (values.size() != RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS) { LOG(RkISP1Dpf, Error) << "Invalid 'DomainFilter:g': expected " @@ -108,7 +109,7 @@ int Dpf::init([[maybe_unused]] IPAContext &context, * For a 9x9 kernel, columns -6 and 6 are dropped, so coefficient * number 6 is not used. */ - values = dFObject["rb"].get>().value_or(std::vector{}); + values = dFObject["rb"].get>().value_or(utils::defopt); if (values.size() != RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS && values.size() != RKISP1_CIF_ISP_DPF_MAX_SPATIAL_COEFFS - 1) { LOG(RkISP1Dpf, Error) @@ -137,7 +138,7 @@ int Dpf::init([[maybe_unused]] IPAContext &context, const ValueNode &rFObject = tuningData["NoiseLevelFunction"]; std::vector nllValues; - nllValues = rFObject["coeff"].get>().value_or(std::vector{}); + nllValues = rFObject["coeff"].get>().value_or(utils::defopt); if (nllValues.size() != RKISP1_CIF_ISP_DPF_MAX_NLF_COEFFS) { LOG(RkISP1Dpf, Error) << "Invalid 'RangeFilter:coeff': expected " diff --git a/src/ipa/rkisp1/algorithms/gsl.cpp b/src/ipa/rkisp1/algorithms/gsl.cpp index d6272f3a39ef..d83aab8506f3 100644 --- a/src/ipa/rkisp1/algorithms/gsl.cpp +++ b/src/ipa/rkisp1/algorithms/gsl.cpp @@ -59,7 +59,7 @@ int GammaSensorLinearization::init([[maybe_unused]] IPAContext &context, const ValueNode &tuningData) { std::vector xIntervals = - tuningData["x-intervals"].get>().value_or(std::vector{}); + tuningData["x-intervals"].get>().value_or(utils::defopt); if (xIntervals.size() != kDegammaXIntervals) { LOG(RkISP1Gsl, Error) << "Invalid 'x' coordinates: expected " @@ -83,7 +83,7 @@ int GammaSensorLinearization::init([[maybe_unused]] IPAContext &context, return -EINVAL; } - curveYr_ = yObject["red"].get>().value_or(std::vector{}); + curveYr_ = yObject["red"].get>().value_or(utils::defopt); if (curveYr_.size() != RKISP1_CIF_ISP_DEGAMMA_CURVE_SIZE) { LOG(RkISP1Gsl, Error) << "Invalid 'y:red' coordinates: expected " @@ -92,7 +92,7 @@ int GammaSensorLinearization::init([[maybe_unused]] IPAContext &context, return -EINVAL; } - curveYg_ = yObject["green"].get>().value_or(std::vector{}); + curveYg_ = yObject["green"].get>().value_or(utils::defopt); if (curveYg_.size() != RKISP1_CIF_ISP_DEGAMMA_CURVE_SIZE) { LOG(RkISP1Gsl, Error) << "Invalid 'y:green' coordinates: expected " @@ -101,7 +101,7 @@ int GammaSensorLinearization::init([[maybe_unused]] IPAContext &context, return -EINVAL; } - curveYb_ = yObject["blue"].get>().value_or(std::vector{}); + curveYb_ = yObject["blue"].get>().value_or(utils::defopt); if (curveYb_.size() != RKISP1_CIF_ISP_DEGAMMA_CURVE_SIZE) { LOG(RkISP1Gsl, Error) << "Invalid 'y:blue' coordinates: expected " diff --git a/src/ipa/rkisp1/algorithms/lsc.cpp b/src/ipa/rkisp1/algorithms/lsc.cpp index 54e374bd9c3c..25f7c512b35c 100644 --- a/src/ipa/rkisp1/algorithms/lsc.cpp +++ b/src/ipa/rkisp1/algorithms/lsc.cpp @@ -317,7 +317,7 @@ std::vector LscTableLoader::parseTable(const ValueNode &tuningData, RKISP1_CIF_ISP_LSC_SAMPLES_MAX * RKISP1_CIF_ISP_LSC_SAMPLES_MAX; std::vector table = - tuningData[prop].get>().value_or(std::vector{}); + tuningData[prop].get>().value_or(utils::defopt); if (table.size() != kLscNumSamples) { LOG(RkISP1Lsc, Error) << "Invalid '" << prop << "' values: expected " @@ -333,7 +333,7 @@ std::vector parseSizes(const ValueNode &tuningData, const char *prop) { std::vector sizes = - tuningData[prop].get>().value_or(std::vector{}); + tuningData[prop].get>().value_or(utils::defopt); if (sizes.size() != RKISP1_CIF_ISP_LSC_SECTORS_TBL_SIZE) { LOG(RkISP1Lsc, Error) << "Invalid '" << prop << "' values: expected " diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp index a351f4f7b581..41918e4c2934 100644 --- a/src/libcamera/ipa_manager.cpp +++ b/src/libcamera/ipa_manager.cpp @@ -123,7 +123,7 @@ IPAManager::IPAManager(const CameraManager &cm) /* User-specified paths take precedence. */ const auto modulePaths = configuration.listOption({ "ipa", "module_paths" }) - .value_or(std::vector()); + .value_or(utils::defopt); for (const auto &dir : modulePaths) { if (dir.empty()) continue; diff --git a/src/libcamera/ipa_proxy.cpp b/src/libcamera/ipa_proxy.cpp index bc8ff090fa86..83efe1dc6368 100644 --- a/src/libcamera/ipa_proxy.cpp +++ b/src/libcamera/ipa_proxy.cpp @@ -125,9 +125,9 @@ IPAProxy::IPAProxy(IPAModule *ipam, const CameraManager &cm) const GlobalConfiguration &configuration = cm._d()->configuration(); configPaths_ = configuration.listOption({ "ipa", "config_paths" }) - .value_or(std::vector()); + .value_or(utils::defopt); execPaths_ = configuration.listOption({ "ipa", "proxy_paths" }) - .value_or(std::vector()); + .value_or(utils::defopt); } IPAProxy::~IPAProxy() diff --git a/src/libcamera/pipeline/rpi/pisp/pisp.cpp b/src/libcamera/pipeline/rpi/pisp/pisp.cpp index c7799f2b4bd9..cc7e32c32337 100644 --- a/src/libcamera/pipeline/rpi/pisp/pisp.cpp +++ b/src/libcamera/pipeline/rpi/pisp/pisp.cpp @@ -2190,7 +2190,7 @@ int PiSPCameraData::configureEntities(V4L2SubdeviceFormat sensorFormat, }; const V4L2Subdevice::Stream embeddedDataStream{ csiVideoSinkPad, - sensor_->embeddedDataStream().value_or(V4L2Subdevice::Stream{}).stream + sensor_->embeddedDataStream().value_or(utils::defopt).stream }; V4L2Subdevice::Routing routing; diff --git a/src/v4l2/v4l2_compat_manager.cpp b/src/v4l2/v4l2_compat_manager.cpp index a92f2e2944fc..1a0ba5fef3ca 100644 --- a/src/v4l2/v4l2_compat_manager.cpp +++ b/src/v4l2/v4l2_compat_manager.cpp @@ -117,7 +117,7 @@ int V4L2CompatManager::getCameraIndex(int fd) for (auto [index, camera] : utils::enumerate(cameras)) { Span devices = camera->properties() .get(properties::SystemDevices) - .value_or(Span{}); + .value_or(utils::defopt); /* * While there may be multiple cameras that could reference the diff --git a/test/value-node.cpp b/test/value-node.cpp index 3b6466e75b13..a6977d5429c8 100644 --- a/test/value-node.cpp +++ b/test/value-node.cpp @@ -509,7 +509,7 @@ protected: }, [&](const Size &arg) -> int { - if (node.get().value_or(Size{}) != arg || + if (node.get().value_or(utils::defopt) != arg || node.get(Size{}) != arg) { std::cerr << "Invalid node size value" @@ -521,7 +521,7 @@ protected: }, [&](const std::string &arg) -> int { - if (node.get().value_or(std::string{}) != arg || + if (node.get().value_or(utils::defopt) != arg || node.get(std::string{}) != arg) { std::cerr << "Invalid node string value"