From patchwork Wed Apr 27 22:30:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Rauch X-Patchwork-Id: 15738 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 697D8C3256 for ; Wed, 27 Apr 2022 22:30:13 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C07956564B; Thu, 28 Apr 2022 00:30:11 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1651098611; bh=8Z/TQf7DbNeFmtw2DOYLxNoW8vSdLF3ml0tv0nfJknA=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=XSuIlLkxtHmAAI7U+BxiOGXJz9/IaFDcpaPZNJTWkIolW4tmMc2tBwBrHog/ymXT2 V5ex7ZJzZWnUavu8ECAfWYwfONuDhEOZhUcZfN+LyDID6HsN8maFlnZCa3vOr6ifdS Nqu3SyLAhwIxd4Ih3iO1S9M7GRRRmiAZeHT/13GNeBg/AQa9Y/HzdzP81RuGC5xpoq dEV25B57FGptZ5lrTenYNfbj93gBEbibedf07lMvayF9/JN6a13S0Lg5QImYP8bl01 dGcD0QIaaTjHpfBXneEjjOkovKrWx66aKGowMKcOLe15zUKh3cum5ygvnEP+zniwVc +VeCYvtG6mBBw== Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3F3BF6563F for ; Thu, 28 Apr 2022 00:30:08 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=gmx.net header.i=@gmx.net header.b="VxCjHSTo"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1651098607; bh=8Z/TQf7DbNeFmtw2DOYLxNoW8vSdLF3ml0tv0nfJknA=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=VxCjHSToxaw9QrfJBzU0NXRuXOD9z+AAEMTTEGctMbNiQ66COVVRLHraFZKC1znc5 IGqqXm6x0oyePPe0PxuRKLiVkUMOKP+PJaW3pdbSrkno2nixl2bdheBz5S/TSQRCOb tsrXc+2b76iSmYzTDbIVGaGkcSEq7wj7WFqM+7Kg= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([92.10.251.63]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MOA3F-1nU7de1G0X-00OWv5; Thu, 28 Apr 2022 00:30:07 +0200 To: libcamera-devel@lists.libcamera.org Date: Wed, 27 Apr 2022 23:30:01 +0100 Message-Id: <20220427223004.115381-2-Rauch.Christian@gmx.de> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220427223004.115381-1-Rauch.Christian@gmx.de> References: <20220427223004.115381-1-Rauch.Christian@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:X73hD7rLAxVCFz2KfUez6VvMFNcTAbSK1GPiL3MmS8mhPIuzBBQ +S7kAuYVaQNm8brJS1gt5EQ13pi279cL7yyqpcaFFWQDopzZJeySSK+VfeJ2VDaE8BsV4Hk v/hDc1MZq0zXC/KTCTnb1U/FW6GwhbJ+/vfOM8jH62RA3zJZUNylSaaktbqG20XtGltDLV7 VR5PI1ytbHAlRNtCd1SqQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:Tk73K1bVSIE=:BwJwK6ocYcWZaNSe6YAIOV RDvdVvL4Pi2akUvxAi1EUCJqfayTWvXrV/qrSZjSnsHOxRLUFqcypzc/tWIeiLsR3M9VWLW6a 7bKFiPxKRFJXNMycbdQFnQh0ZN0x29wh8EUJPiUrBm9+Tj5cDoQ+418vV+Di/BW6F6Hqorf4J O7bReyPZ1yPicrrd8jZif5OUFUOAlfNPd0OB6Me2LASPK+CTZDHPRBQuyMyA8y40CBscCRwRz 1cgy08a0d3nnkVFH4qI2r3WuD8GN1HJ9kcRqyJXueuf8VpbB0kdoSaeWQcDdwJFiOWphKozSl em05CN4KQ7jjxqS6oQnhB85YNReSFFynm7zYk+sLklCRI9mKC5tDxM/Qi9ABtO4vwhd1oYw8i R8LqK7GhEo0NnmsnA35UTBFTJp0aT6ML+PMsCoSnjwssYKTl/mCO6G9xV3sGEmRew9HTPIKzh JNXw/Jw8HUdqXy/ZKReVKddrBvCS/8gn3CVu66jR+8d2p0lDJoJ1AepmAMnNi/mR44okCl2Ap dF66ffUCaQOc/IKK02MbrM8c/1CSz9HSsEMzNC/g4LAV1NL5/5kWIF4UGib5FEH+uy/MgIXD5 eKTiDDgIeOsZEKnYHGpPazCeTAxXO+Q41Sac0KV7DqRjau8r7gdguQOm8cv6gZ/P3sLgikc8v vy9Um3HnM/bhpW/oBwBreZA66rnwsy08poYOflRhJPevWLGAjEaYi4i+qKl1o2Pql+gd40TFG fHTzkjEMCy2AprCFN4LcyjrGvQSqZL2sCcpYW/f1WrX0iU8sS8k+rOYy9DAJQWTFxT+bomZsR auWh3tqJ4tZZXiZfBX7gqDow1OD+4++BvfPFlpbX7lE62pK6Ks/FXZYQDyoEjJPjL9ldOoCZS i5ACBl0oUR5yN3EJZ2YO9p/YEcYVlGKXFd/5/T6qyCSgnO4kgZWRVGox6CJQsxF/cSslZJw/C BxynP/rpDo7br7yGTOzAENsOrS8WzrOhw2n8QR+EJCX/l49bVB6oaU/PtfZxBY39MpdmKBbtH KDzSbF9Wx0pOjBQ36e27lGTAhjckSAxjpucyUS5O7kyirySo+rvRoEM7AqXRsax8LFsFxHuzw Z/cdD9DCQ9XjJc= Subject: [libcamera-devel] [PATCH v4 1/4] use std::optional to handle invalid control values 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: , X-Patchwork-Original-From: Christian Rauch via libcamera-devel From: Christian Rauch Reply-To: Christian Rauch Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Previously, ControlList::get() would use default constructed objects to indicate that a ControlList does not have the requested Control. This has several disadvantages: 1) It requires types to be default constructible, 2) it does not differentiate between a default constructed object and an object that happens to have the same state as a default constructed object. std::optional additionally stores the information if the object is valid or not, and therefore is more expressive than a default constructed object. Signed-off-by: Christian Rauch --- include/libcamera/controls.h | 7 ++++--- src/cam/main.cpp | 4 ++-- src/ipa/raspberrypi/raspberrypi.cpp | 2 +- src/libcamera/pipeline/ipu3/ipu3.cpp | 9 ++++----- .../pipeline/raspberrypi/raspberrypi.cpp | 10 ++++++---- src/qcam/dng_writer.cpp | 15 +++++++++------ 6 files changed, 26 insertions(+), 21 deletions(-) -- 2.34.1 diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h index 665bcac1..363e7809 100644 --- a/include/libcamera/controls.h +++ b/include/libcamera/controls.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -167,7 +168,7 @@ public: using V = typename T::value_type; const V *value = reinterpret_cast(data().data()); - return { value, numElements_ }; + return T{ value, numElements_ }; } #ifndef __DOXYGEN__ @@ -373,11 +374,11 @@ public: bool contains(unsigned int id) const; template - T get(const Control &ctrl) const + std::optional get(const Control &ctrl) const { const ControlValue *val = find(ctrl.id()); if (!val) - return T{}; + return std::nullopt; return val->get(); } diff --git a/src/cam/main.cpp b/src/cam/main.cpp index c7f664b9..853a78ed 100644 --- a/src/cam/main.cpp +++ b/src/cam/main.cpp @@ -293,7 +293,7 @@ std::string CamApp::cameraName(const Camera *camera) * is only used if the location isn't present or is set to External. */ if (props.contains(properties::Location)) { - switch (props.get(properties::Location)) { + switch (props.get(properties::Location).value_or(int32_t{})) { case properties::CameraLocationFront: addModel = false; name = "Internal front camera "; @@ -313,7 +313,7 @@ std::string CamApp::cameraName(const Camera *camera) * If the camera location is not availble use the camera model * to build the camera name. */ - name = "'" + props.get(properties::Model) + "' "; + name = "'" + props.get(properties::Model).value_or(std::string{}) + "' "; } name += "(" + camera->id() + ")"; diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp index 5efd051b..bf54f64f 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -936,7 +936,7 @@ void IPARPi::returnEmbeddedBuffer(unsigned int bufferId) void IPARPi::prepareISP(const ISPConfig &data) { - int64_t frameTimestamp = data.controls.get(controls::SensorTimestamp); + int64_t frameTimestamp = data.controls.get(controls::SensorTimestamp).value_or(int64_t{}); RPiController::Metadata lastMetadata; Span embeddedBuffer; diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index fd989e61..1e9e5081 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -1145,7 +1145,7 @@ int PipelineHandlerIPU3::registerCameras() /* Convert the sensor rotation to a transformation */ int32_t rotation = 0; if (data->properties_.contains(properties::Rotation)) - rotation = data->properties_.get(properties::Rotation); + rotation = data->properties_.get(properties::Rotation).value_or(int32_t{}); else LOG(IPU3, Warning) << "Rotation control not exposed by " << cio2->sensor()->id() @@ -1331,7 +1331,7 @@ void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer) request->metadata().set(controls::draft::PipelineDepth, 3); /* \todo Actually apply the scaler crop region to the ImgU. */ if (request->controls().contains(controls::ScalerCrop)) - cropRegion_ = request->controls().get(controls::ScalerCrop); + cropRegion_ = request->controls().get(controls::ScalerCrop).value_or(Rectangle{}); request->metadata().set(controls::ScalerCrop, cropRegion_); if (frameInfos_.tryComplete(info)) @@ -1424,7 +1424,7 @@ void IPU3CameraData::statBufferReady(FrameBuffer *buffer) return; } - ipa_->processStatsBuffer(info->id, request->metadata().get(controls::SensorTimestamp), + ipa_->processStatsBuffer(info->id, request->metadata().get(controls::SensorTimestamp).value_or(int64_t{}), info->statBuffer->cookie(), info->effectiveSensorControls); } @@ -1458,8 +1458,7 @@ void IPU3CameraData::frameStart(uint32_t sequence) if (!request->controls().contains(controls::draft::TestPatternMode)) return; - const int32_t testPatternMode = request->controls().get( - controls::draft::TestPatternMode); + const int32_t testPatternMode = request->controls().get(controls::draft::TestPatternMode).value_or(int32_t{}); int ret = cio2_.sensor()->setTestPatternMode( static_cast(testPatternMode)); diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index acc0beca..ce86ba45 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -365,7 +365,7 @@ CameraConfiguration::Status RPiCameraConfiguration::validate() * error means the platform can never run. Let's just print a warning * and continue regardless; the rotation is effectively set to zero. */ - int32_t rotation = data_->sensor_->properties().get(properties::Rotation); + int32_t rotation = data_->sensor_->properties().get(properties::Rotation).value_or(int32_t{}); bool success; Transform rotationTransform = transformFromRotation(rotation, &success); if (!success) @@ -1696,7 +1696,9 @@ void RPiCameraData::statsMetadataComplete(uint32_t bufferId, const ControlList & * V4L2_CID_NOTIFY_GAINS control (which means notifyGainsUnity_ is set). */ if (notifyGainsUnity_ && controls.contains(libcamera::controls::ColourGains)) { - libcamera::Span colourGains = controls.get(libcamera::controls::ColourGains); + libcamera::Span colourGains = + controls.get(libcamera::controls::ColourGains).\ + value_or(libcamera::Span({ 0, 0 })); /* The control wants linear gains in the order B, Gb, Gr, R. */ ControlList ctrls(sensor_->controls()); std::array gains{ @@ -2031,7 +2033,7 @@ Rectangle RPiCameraData::scaleIspCrop(const Rectangle &ispCrop) const void RPiCameraData::applyScalerCrop(const ControlList &controls) { if (controls.contains(controls::ScalerCrop)) { - Rectangle nativeCrop = controls.get(controls::ScalerCrop); + Rectangle nativeCrop = controls.get(controls::ScalerCrop).value_or(Rectangle{}); if (!nativeCrop.width || !nativeCrop.height) nativeCrop = { 0, 0, 1, 1 }; @@ -2069,7 +2071,7 @@ void RPiCameraData::fillRequestMetadata(const ControlList &bufferControls, Request *request) { request->metadata().set(controls::SensorTimestamp, - bufferControls.get(controls::SensorTimestamp)); + bufferControls.get(controls::SensorTimestamp).value_or(int64_t{})); request->metadata().set(controls::ScalerCrop, scalerCrop_); } diff --git a/src/qcam/dng_writer.cpp b/src/qcam/dng_writer.cpp index 34c8df5a..e119ca52 100644 --- a/src/qcam/dng_writer.cpp +++ b/src/qcam/dng_writer.cpp @@ -392,7 +392,7 @@ int DNGWriter::write(const char *filename, const Camera *camera, TIFFSetField(tif, TIFFTAG_MAKE, "libcamera"); if (cameraProperties.contains(properties::Model)) { - std::string model = cameraProperties.get(properties::Model); + std::string model = cameraProperties.get(properties::Model).value_or(std::string{}); TIFFSetField(tif, TIFFTAG_MODEL, model.c_str()); /* \todo set TIFFTAG_UNIQUECAMERAMODEL. */ } @@ -438,7 +438,8 @@ int DNGWriter::write(const char *filename, const Camera *camera, const double eps = 1e-2; if (metadata.contains(controls::ColourGains)) { - Span const &colourGains = metadata.get(controls::ColourGains); + Span const &colourGains = + metadata.get(controls::ColourGains).value_or(libcamera::Span({ 0, 0 })); if (colourGains[0] > eps && colourGains[1] > eps) { wbGain = Matrix3d::diag(colourGains[0], 1, colourGains[1]); neutral[0] = 1.0 / colourGains[0]; /* red */ @@ -446,7 +447,8 @@ int DNGWriter::write(const char *filename, const Camera *camera, } } if (metadata.contains(controls::ColourCorrectionMatrix)) { - Span const &coeffs = metadata.get(controls::ColourCorrectionMatrix); + Span const &coeffs = + metadata.get(controls::ColourCorrectionMatrix).value_or(Span({ 0, 0, 0, 0, 0, 0, 0, 0, 0 })); Matrix3d ccmSupplied(coeffs); if (ccmSupplied.determinant() > eps) ccm = ccmSupplied; @@ -515,7 +517,8 @@ int DNGWriter::write(const char *filename, const Camera *camera, uint32_t whiteLevel = (1 << info->bitsPerSample) - 1; if (metadata.contains(controls::SensorBlackLevels)) { - Span levels = metadata.get(controls::SensorBlackLevels); + Span levels = + metadata.get(controls::SensorBlackLevels).value_or(Span({ 0, 0, 0, 0 })); /* * The black levels control is specified in R, Gr, Gb, B order. @@ -593,13 +596,13 @@ int DNGWriter::write(const char *filename, const Camera *camera, TIFFSetField(tif, EXIFTAG_DATETIMEDIGITIZED, strTime); if (metadata.contains(controls::AnalogueGain)) { - float gain = metadata.get(controls::AnalogueGain); + float gain = metadata.get(controls::AnalogueGain).value_or(float{}); uint16_t iso = std::min(std::max(gain * 100, 0.0f), 65535.0f); TIFFSetField(tif, EXIFTAG_ISOSPEEDRATINGS, 1, &iso); } if (metadata.contains(controls::ExposureTime)) { - float exposureTime = metadata.get(controls::ExposureTime) / 1e6; + float exposureTime = metadata.get(controls::ExposureTime).value_or(float{}) / 1e6; TIFFSetField(tif, EXIFTAG_EXPOSURETIME, exposureTime); } From patchwork Wed Apr 27 22:30:02 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Rauch X-Patchwork-Id: 15739 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 05EABC3256 for ; Wed, 27 Apr 2022 22:30:15 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id DE5446564C; Thu, 28 Apr 2022 00:30:12 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1651098613; bh=KhDEhrcooUEg4LlVLFrto+wzWSv9nmQuCaj/02wozVo=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=xtnMP+u8BKiYZD99YJ8qj2JLGzjGAKUAtoIrnzU2lnEOOuF5hvpmKtGc/RvcOLPgQ 57OJUDCpGuwCYe955BrI+qpF3eSMRGqK57KKtC1ASY9doxiHFRi3HpLc4gtVfC+4wd 9uqJVEoNwhKuvinOM8pKZBDd17louzq0Fe4wxfWPZOvAz9MABY7PpuOPPUgUiRds5/ iAHAIJKCZa4zbTM5Zgd0hT4MwUDTEvmusw6qja3M02jNADOfBdJooJBDoN3Xyq3UOb Tj8Ki4wcUh8U1dG5l/NEk/3qimoXt+Q74aJ5QzNJMbMCTUKCobL+AfbcNPwtvczKvQ R4ic2GHc0uDmQ== Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B84B465644 for ; Thu, 28 Apr 2022 00:30:08 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=gmx.net header.i=@gmx.net header.b="iS4hTNw/"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1651098607; bh=KhDEhrcooUEg4LlVLFrto+wzWSv9nmQuCaj/02wozVo=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=iS4hTNw/97Gx2VAulGGCVyeMG5uuhTFrXAfjz0XWmlqkHmbg+6zYL9vC5GydHroku Y9tfVNlRV8+29D4Ndl2bUvf0UnCbE53eQsxEgddsv4rWYno542B6wsU472MZLwMQqq KhqP/LlAAP7qXI891mUjebRl67nS0nuReaFOYzZ8= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([92.10.251.63]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1N2V4J-1nreTI2cUZ-013rQD; Thu, 28 Apr 2022 00:30:07 +0200 To: libcamera-devel@lists.libcamera.org Date: Wed, 27 Apr 2022 23:30:02 +0100 Message-Id: <20220427223004.115381-3-Rauch.Christian@gmx.de> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220427223004.115381-1-Rauch.Christian@gmx.de> References: <20220427223004.115381-1-Rauch.Christian@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:s7t5ewETq+zxYFc9Lw9obsh2KV3N/4STpmndvEVbYO6E2lzqytB AG2LVDhb9p7kIZDswA4PGT7w5J715MQdM9F60zXh2GJnqcfkJYzdm98+BKweqPr75S9hpRi xu0V6Yj2pBTx1DqPG3kzSKLBOwUmPMPqftTNOExvS5qdZABic+NUFyBjXPbRzQDGJdvkjrE MEJzfTWdoio6ZmeZRX+Lw== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:3KKdqAPC24k=:Cd9W0vkp0a/ihhTKh6/7nj jXAFwWtUO0Cj7ETpplwBcLTxAKsEs1ea/+tsPCtPMCe9CFVo+ejp6K1+xKKofmcLSeg9OpIbV RZF9U+mTZiTDcQ9yO8bbx01JBpnNUqUxhrewSxcGilcYDWQdHJzbNUg7UNHPhSQX6aYqA5rPl 5rKJJymEr/c4O1Hvrs0Lz1tqLuNLjX+Jfjbvih6P+fvixaFoHC+ySxlESa8Fbs+0fR573wOha QiBy+Vf8ZtZfnBSjpZSIDT0X/CJJofe0sXgSrKhIww36uCYJbZvSOJL5MNedoGDnsogOES622 QMWR2idFrNeC6htBFpWBK+qmUUhxgp0c/UZ5LdgrNrdCZ81DkvuRHtESYQdsYWUYcS3JLmYD7 7hEIiSAA65nrlwBkt72TetvE5+f58yYJPuEY9K7ZI6B0UEUjbVhk4n+ViKiD8vDrfC6WAXrcn V+vbLUu4hVmdjT5kAlguXEJTk3AePQdkIGO7CUWAy/rMzU1m/PjJ42F4swiyJ4K+a9Xfz9yTe n7mrhzQUK2YByQrmocM0muicQ71TM4irrlba6CAdkAAYTXhslwLGzwqmx1omqLYUqT7aZNdQt Tgrubncp2FvQ/eze9E+uZ5NYIwfds3sDkgWo5DRNRZcy1/vrcaXPpAkgOrqowcnQb10SMPcgO x1KZLXJ47uC36XUxiT0oF6kGeniKt3RoV2UGTDrn3O3BY6/Kw8tQC4IRpaL1cy/wZRmJG4SNs N92C9EvdIKaJsotQL86IhZjiIIb9L4ZCbZoyKygzRYo8Zb/6wV3okfbBbUUxutZFSB5yJ93ga TxU4kLHhHbZ+IEpvUNnMydl3ZB+Q6Os1c4LFTLul0HTIL21uSXXHbhsGF2TPLk7lQtaRj6ApG B+i3TC1M6AUK8UI4MBhtsD/ZWDabTKSnR0ZgzriogWNCXqdcBw9CBUTk3AX541SxW/TztvKJO YSqciYnHYBq5UIBlnFh0DMNHODKHNFTMe8UXdSre7tcQGqbgho0xGqj/iaz+wPJs1NjBBIC5U nkr3suVV9ow1F1Qecskzn2yc8CDz5heErMay36ilJB7gAww1pBFNGAwlxEfWCKY6fgkUXbUHy NPPzLcSfalQqHY= Subject: [libcamera-devel] [PATCH v4 2/4] libcamera: controls: Define size of array controls as a shape vector 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: , X-Patchwork-Original-From: Christian Rauch via libcamera-devel From: Christian Rauch Reply-To: Christian Rauch Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" This follows the convention in other Tensor APIs. Since all tensors are represented as a Span with a single dimension, values provided in 'size' are interpreted as fixed-size Spans, while an empty array ("[]") will be interpreted as variable-sized Span. Signed-off-by: Christian Rauch Reviewed-by: Jacopo Mondi --- src/libcamera/control_ids.yaml | 2 +- src/libcamera/property_ids.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) -- 2.34.1 diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml index 9d4638ae..c3f593a1 100644 --- a/src/libcamera/control_ids.yaml +++ b/src/libcamera/control_ids.yaml @@ -291,7 +291,7 @@ controls: transformation. The 3x3 matrix is stored in conventional reading order in an array of 9 floating point values. - size: [3x3] + size: [3,3] - ScalerCrop: type: Rectangle diff --git a/src/libcamera/property_ids.yaml b/src/libcamera/property_ids.yaml index 12ecbce5..47c350ed 100644 --- a/src/libcamera/property_ids.yaml +++ b/src/libcamera/property_ids.yaml @@ -497,7 +497,7 @@ controls: - PixelArrayOpticalBlackRectangles: type: Rectangle - size: [n] + size: [] description: | The pixel array region(s) which contain optical black pixels considered valid for calibration purposes. @@ -592,7 +592,7 @@ controls: - PixelArrayActiveAreas: type: Rectangle - size: [n] + size: [] description: | The PixelArrayActiveAreas property defines the (possibly multiple and overlapping) portions of the camera sensor readable pixel matrix From patchwork Wed Apr 27 22:30:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Rauch X-Patchwork-Id: 15740 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 02396C326C for ; Wed, 27 Apr 2022 22:30:15 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3C03E65646; Thu, 28 Apr 2022 00:30:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1651098614; bh=ATeKyqRnHw9iVa0bTgA+UNdA5iARog/YOYpAYY2+Gv0=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=BhhAxkLeCrnrYs9uGNkiFPpK7iwFNFIEUP6kuGyh0q3fGLW8+3fA2MmeySUxvHwWJ Mwdghkf0Z0K8gapZeLREr0X2wgNhRHMFu74LcIgfPCeMV9FFXq2ZERR1/P3CXXfxKq kxkwhP3eubGkcuEowGAvGEKju733+R9UI2ZnUkE7CHUC2q4Sm1w9TO8qjLCbzrsPay ohM2Mg6PQM/5POqaSgzZYBsTmGrMCi5z0F2iEwUjM31kXa5sm6/Z+JMPRf4Cm4lrR7 xvk277JeBMobVYaAu48BS/W8pOSLi4A1/ng/i1J070MhMoE3KZ8vxxz0+lYPqm3Xxl 1mBkzASPya9jw== Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B71B865640 for ; Thu, 28 Apr 2022 00:30:08 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=gmx.net header.i=@gmx.net header.b="cKLHBH3h"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1651098608; bh=ATeKyqRnHw9iVa0bTgA+UNdA5iARog/YOYpAYY2+Gv0=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=cKLHBH3hrmD70hTOBSfWv6x3nToknYK/IvBXlwP0A1ahfcCrHeJjHZdLy6gGyxRx1 6VrWW3FcHoqPc0ZVpwp3d9/PaAS5ydHtsAM6moiaBccmP9NdlCL6Y7QOTtqzKGy5lL ECqMCzmPZX+WjElJMfpZ7ogf7Bxd2kwDvY9X8aJ8= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([92.10.251.63]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1M26vB-1nhNCA3jYn-002aDT; Thu, 28 Apr 2022 00:30:08 +0200 To: libcamera-devel@lists.libcamera.org Date: Wed, 27 Apr 2022 23:30:03 +0100 Message-Id: <20220427223004.115381-4-Rauch.Christian@gmx.de> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220427223004.115381-1-Rauch.Christian@gmx.de> References: <20220427223004.115381-1-Rauch.Christian@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:3vcZya9a+160FgsbefgoiRlIM6tgXwRG6JmcapPdvInDwqXaDcz dROUVU/HPyLofMjfuGQUJS6vGzqI49w0Pygh8LuD6LXGmyagki070NAqny8SVSlZH3c+T0w YzUZmC1EPwPH/RPz6Ii6Id/di+hVWOZMDFEkk3jMNQqFCySqr3QEpJ941LDar6JG7KI6O8E 66bD4XVOMuzFcyulT4r0Q== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:zauLqDbqV4s=:cr4S0LIwk5yASanFgJNatK IC81Es+amu8TGiNTysMuofKXHAnGYG7NofIyTb34Y1v+pq0DfbQbrFE1bGGVhNDCZ7oqWdVXA S1eEus62cu+w1WGWe5phOoO6tNcTf4w4u75LESRr7miLaUyrrl0LQkTZlUe7US+U/xNFA5XhV ccpZu59lZefDXnNTqoHbEoNSgHvwPQ9I2hxuzrMxp28QcXzsocVwFKSrDiZ3wc2TeshXlgAtp F8JcrJbVRy6RuF2tNW6N01IkZs2akLuPDdFmIGi7ES0izFpSn5VciHcCSiwvwwiPMy9oP2aT7 MwHYr4hXhuyx4X6L7b2Kv8Edp/8ce4zgk/OUo7WKScgWWhmWVz+VToAZxqQR6WJbUe10327mU QhW5aoDakulyOIJefNGGAs8v3KPBasiw1+ZhfbseDVUjjzl924xMQ+HXUQIfRvRsxP/PZ6aTH 0kau6jXmb5FtskUT9jYZQDViU3ouKUkKA91zGebJORkVgSsk+zE3r9aCiKlbEeF1pEO8MWgiX rK6FmE2Q6tAZ2L6r3B4XVUdHVccaPt4CpIN8hvMPxW2lsAl6zhkcAnpDllpuL2jKzamOWW3Ro 42wJ9hGFC6XNGDYZcAVSBEYdsZKBoDS4YirWUMhYwVx0XNDmf2uzzLDxG7+bozNWW9K3QEJIR kzFbXqnfIQ90Cwe+rDjmWFMh9WNLGDL2KC/bbSeMhMbpDwCC4UUOqn9D++d6GM6PBZCKDSQ7w QANN6nhTGXK8P88urFzWZ8TpIGWv3dtOixmzN0sSNjon26xOMj18mG/uCI+CZQLHrc5lhUR3A drd0SaW0jil49loUoX63kkrIyoqO99KUtjU99WBgO4bTqmj2ueg5q6SNb2u/fLpJ4YrOrTKP2 JCOehw0FnZPauCln//gCUxOPCzbsaCJDArWTHsKHVXtQnHU6gguGExC+/iVLn1XNdezgsrxsb dvcs0GnmvmSjxYHJWgodkl1nHVESnCI59BoWkCtu+pr5mBsN8woqmbEoMxmLTZ4PWpgn0n19y MUBbiZ6c3/qhcKVWepV3gGFUIf6Pii5rAFOHL32z8kM8X4mtTCu8pX0prcznkju2rcMiVibgG cJS1HI4+fpI/BA= Subject: [libcamera-devel] [PATCH v4 3/4] generate fixed- and variable-sized Span Controls 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: , X-Patchwork-Original-From: Christian Rauch via libcamera-devel From: Christian Rauch Reply-To: Christian Rauch Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" This defines Controls with a 'size' as either variable-sized Span or as fixed-sized Span. Signed-off-by: Christian Rauch --- utils/gen-controls.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) -- 2.34.1 diff --git a/utils/gen-controls.py b/utils/gen-controls.py index 3f99b5e2..c9e79a22 100755 --- a/utils/gen-controls.py +++ b/utils/gen-controls.py @@ -7,6 +7,7 @@ # gen-controls.py - Generate control definitions from YAML import argparse +import math import string import sys import yaml @@ -22,6 +23,25 @@ def format_description(description): return '\n'.join([(line and ' * ' or ' *') + line for line in description]) +def get_ctrl_type(ctrl): + ctrl_type = ctrl['type'] + ctrl_size_arr = ctrl.get('size') + ctrl_is_span = ctrl_size_arr is not None + + if ctrl_type == 'string': + return 'std::string' + elif ctrl_is_span: + ctrl_span_size = math.prod(ctrl_size_arr) if len(ctrl_size_arr) > 0 else None + if ctrl_span_size: + # fixed-sized Span + return f"Span" + else: + # variable-sized Span + return f"Span" + else: + return ctrl_type + + def generate_cpp(controls): enum_doc_start_template = string.Template('''/** * \\enum ${name}Enum @@ -50,11 +70,7 @@ ${description} name, ctrl = ctrl.popitem() id_name = snake_case(name).upper() - ctrl_type = ctrl['type'] - if ctrl_type == 'string': - ctrl_type = 'std::string' - elif ctrl.get('size'): - ctrl_type = 'Span' % ctrl_type + ctrl_type = get_ctrl_type(ctrl) info = { 'name': name, @@ -135,11 +151,7 @@ def generate_h(controls): ids.append('\t' + id_name + ' = ' + str(id_value) + ',') - ctrl_type = ctrl['type'] - if ctrl_type == 'string': - ctrl_type = 'std::string' - elif ctrl.get('size'): - ctrl_type = 'Span' % ctrl_type + ctrl_type = get_ctrl_type(ctrl) info = { 'name': name, From patchwork Wed Apr 27 22:30:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Rauch X-Patchwork-Id: 15741 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 641DCC3256 for ; Wed, 27 Apr 2022 22:30:16 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D93C66564D; Thu, 28 Apr 2022 00:30:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1651098614; bh=EHDUM2P5pwfuT7LnX3aqWA3xtIJT07JPWG1WLdGyah4=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=FPBolv0L1NvjbAbjpN7ewRcn7vlslGPKrbAjyR0EzcJw2lHSXzkzVSmZqU59PTLFM dOvA5Rat7uub/kVOyavw8KXB2YwNp1Uw5k+y87qdD36234hsLy5y8OQfu9+OhJtd2n EfvsEVR5NUt0HM15OlbfDcrjcCUnVD9MYcgHRr5LQ46ZPwIGKANwqjPjOZxoMF/Y5n O+veudXodFvQKI5qUwwDvcqpTUN+5SRr4DFH9sFSTdOTjmF75Nu6TIzQGRP04zgkiE a9fS4HxJobUJvDjkcSVVDj6B83dA0wMlhKYPhGTMoGtqKyqFX1Jab7g8zj9tDdnrJG glwn/wHsJavkw== Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DC51665646 for ; Thu, 28 Apr 2022 00:30:08 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=gmx.net header.i=@gmx.net header.b="ZbZEo31q"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1651098608; bh=EHDUM2P5pwfuT7LnX3aqWA3xtIJT07JPWG1WLdGyah4=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=ZbZEo31qH8A2VXCe4wDbCVUmO/m18BW4AX84Sh2ZDasj2dV21JNpZBmwifKO3T9Oe Fbjs3B+wKuDB5Mm3cLdsH/IdvE7piEoPH+RcKD3Nn/jcB0i3aUNpM3KsH3Ni+Ztpbx pioek0tnQS2zcvMaNon0Ump1RjN2HB7za5J+JQ7I= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([92.10.251.63]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MxlzC-1o56sg0bx0-00zEiS; Thu, 28 Apr 2022 00:30:08 +0200 To: libcamera-devel@lists.libcamera.org Date: Wed, 27 Apr 2022 23:30:04 +0100 Message-Id: <20220427223004.115381-5-Rauch.Christian@gmx.de> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220427223004.115381-1-Rauch.Christian@gmx.de> References: <20220427223004.115381-1-Rauch.Christian@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:K7a7ojRXfc5NtD2hy8HN8T2ijGK+Jan+Y0MBrx8fCm1urjqxRpu RbyUL/kRJWzsEijSMZuA3EFI4kEAq+sXXlqEXCoaKwnqOOzqPR/Mv5Iujeokna7c9X6emXN 9OkVvJwXo1MBs43AghHEuR1LcSphSpQ98OzfYodtkpsJj5pAFiHeRepaZCHS7OUWWHwJSWI Ce04IXJRcYdCmKkB9oXzg== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:wH7/chnL4u4=:+EnweZOrDJKcvAQ+PQ0ynr Gx77J81eYEVPGweMrb5Jh+ZFSFj/oKRWYC1+AYS03qw8fn8ww6oR+vkY80TxovIRkwmhmW8XR Vmhqxx9U77EyMR8ht1Q4Opxs78pv9fgj/ZWWKJs2n5kzs3/PnEsGQ16ql6HVvFQ4ICHKzbVIs 1dBoaP6HJQW5BVcmyW9Xk2ExSLZK+G/j+KydFXH3lozdUoytSrrTONfhhccWuJKPSdrYsXJ0z /xJw9MZAkFAs647FxxmnEeRcubKUAZAMwEIOpxfpK74psdefR3YZqiF+KHN9kLILyv8aoEGjj L3m4v3rEi4985aZfRgDQ1qopCwaRi/FGJmzBXJ3u0mIj0brTPv28po0k3PDVG3VXYYfwJVkqT DKXAkn5FhTNchfRjVJVYyv4IvfHvSL4pBCTR3Vgk8tqXq+scQfaUzJ4zSkgfuG8MRY+FOK0a9 L7lEiM2pRZ4LVQVHiapPry3Py9oGxkQ7frguc2nvUkO2wHphtwFM4uWyj4oGuCmcG5byC/FDK nmS6iHQQoXnGwDSDzOBRTBc+frv5fFXWO5NnVqgqo2XlmfE5IijXZNoxPNYZ/MilqzU1q05Sb MII8wcg1kt8rcGKp0uvLeKsiL6Lncw/4vV6wr4hkxD8qdh5UVSCCQ7Ofc11DOclXNUgQcSISc HIPFywjtmqNVN7U6D//K3PQtB8Lxnr6F1Lvuto9XqGCgyJEa/7hOI2Mr1OqRIZC+3wkuzKkiW ABtyIR4yL0pgbkPvLCzRnAUQVofkrrUp0D8j1lNnwbzb6AMuxqZwfmGuIgzVTFZiJxAtO37YR BM3qI4Eg9ys8xDMUrfyuOAFVSd3sm1qyFdnyzH5g5eHI9QD9whV1O/Ylqvn1t2st3vPlv0OzJ A3OhrcJwaw9mt5FmpjtQtwTQtS21NFnovD4WSvtxVDAuEPVfXIkjKkQrzCJQZD9rZ/7N1TQ9L LfopUSb8oZITYXNo4hEcCWkDYyrE9rG2K11SV3EK8WmOHRtwomzONbiqoqD/I5B4DAtaOyVEY NCfIxRZlHIeVTdJ5FJOIksSsleX3QbJYxVqKkmcp1v2AOj2Wo+7jzi6nS7L5jBKWW/nxmUF+X 62u9jbdBz8F6U8= Subject: [libcamera-devel] [PATCH v4 4/4] apply explicit fixed-sized Span type casts 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: , X-Patchwork-Original-From: Christian Rauch via libcamera-devel From: Christian Rauch Reply-To: Christian Rauch Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The change of types of some Controls from variable- to fixed-sized requires explicit casting of FrameDurationLimits, ColourGains and SensorBlackLevels. Signed-off-by: Christian Rauch --- src/ipa/raspberrypi/raspberrypi.cpp | 19 ++++++++++--------- .../pipeline/raspberrypi/raspberrypi.cpp | 4 ++-- src/qcam/dng_writer.cpp | 12 ++++++------ 3 files changed, 18 insertions(+), 17 deletions(-) -- 2.34.1 diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp index bf54f64f..57e3de5d 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -502,18 +502,19 @@ void IPARPi::reportMetadata() AwbStatus *awbStatus = rpiMetadata_.GetLocked("awb.status"); if (awbStatus) { - libcameraMetadata_.set(controls::ColourGains, { static_cast(awbStatus->gain_r), - static_cast(awbStatus->gain_b) }); + libcameraMetadata_.set(controls::ColourGains, + Span({ static_cast(awbStatus->gain_r), + static_cast(awbStatus->gain_b) })); libcameraMetadata_.set(controls::ColourTemperature, awbStatus->temperature_K); } BlackLevelStatus *blackLevelStatus = rpiMetadata_.GetLocked("black_level.status"); if (blackLevelStatus) libcameraMetadata_.set(controls::SensorBlackLevels, - { static_cast(blackLevelStatus->black_level_r), - static_cast(blackLevelStatus->black_level_g), - static_cast(blackLevelStatus->black_level_g), - static_cast(blackLevelStatus->black_level_b) }); + Span({ static_cast(blackLevelStatus->black_level_r), + static_cast(blackLevelStatus->black_level_g), + static_cast(blackLevelStatus->black_level_g), + static_cast(blackLevelStatus->black_level_b) })); FocusStatus *focusStatus = rpiMetadata_.GetLocked("focus.status"); if (focusStatus && focusStatus->num == 12) { @@ -818,7 +819,7 @@ void IPARPi::queueRequest(const ControlList &controls) if (gains[0] != 0.0f && gains[1] != 0.0f) /* A gain of 0.0f will switch back to auto mode. */ libcameraMetadata_.set(controls::ColourGains, - { gains[0], gains[1] }); + Span({ gains[0], gains[1] })); break; } @@ -1102,8 +1103,8 @@ void IPARPi::applyFrameDurations(Duration minFrameDuration, Duration maxFrameDur /* Return the validated limits via metadata. */ libcameraMetadata_.set(controls::FrameDurationLimits, - { static_cast(minFrameDuration_.get()), - static_cast(maxFrameDuration_.get()) }); + Span({ static_cast(minFrameDuration_.get()), + static_cast(maxFrameDuration_.get()) })); /* * Calculate the maximum exposure time possible for the AGC to use. diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index ce86ba45..f526c558 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -1696,9 +1696,9 @@ void RPiCameraData::statsMetadataComplete(uint32_t bufferId, const ControlList & * V4L2_CID_NOTIFY_GAINS control (which means notifyGainsUnity_ is set). */ if (notifyGainsUnity_ && controls.contains(libcamera::controls::ColourGains)) { - libcamera::Span colourGains = + libcamera::Span colourGains = controls.get(libcamera::controls::ColourGains).\ - value_or(libcamera::Span({ 0, 0 })); + value_or(libcamera::Span({ 0, 0 })); /* The control wants linear gains in the order B, Gb, Gr, R. */ ControlList ctrls(sensor_->controls()); std::array gains{ diff --git a/src/qcam/dng_writer.cpp b/src/qcam/dng_writer.cpp index e119ca52..030432e3 100644 --- a/src/qcam/dng_writer.cpp +++ b/src/qcam/dng_writer.cpp @@ -438,8 +438,8 @@ int DNGWriter::write(const char *filename, const Camera *camera, const double eps = 1e-2; if (metadata.contains(controls::ColourGains)) { - Span const &colourGains = - metadata.get(controls::ColourGains).value_or(libcamera::Span({ 0, 0 })); + Span const &colourGains = + metadata.get(controls::ColourGains).value_or(libcamera::Span({ 0, 0 })); if (colourGains[0] > eps && colourGains[1] > eps) { wbGain = Matrix3d::diag(colourGains[0], 1, colourGains[1]); neutral[0] = 1.0 / colourGains[0]; /* red */ @@ -447,8 +447,8 @@ int DNGWriter::write(const char *filename, const Camera *camera, } } if (metadata.contains(controls::ColourCorrectionMatrix)) { - Span const &coeffs = - metadata.get(controls::ColourCorrectionMatrix).value_or(Span({ 0, 0, 0, 0, 0, 0, 0, 0, 0 })); + Span const &coeffs = + metadata.get(controls::ColourCorrectionMatrix).value_or(Span({ 0, 0, 0, 0, 0, 0, 0, 0, 0 })); Matrix3d ccmSupplied(coeffs); if (ccmSupplied.determinant() > eps) ccm = ccmSupplied; @@ -517,8 +517,8 @@ int DNGWriter::write(const char *filename, const Camera *camera, uint32_t whiteLevel = (1 << info->bitsPerSample) - 1; if (metadata.contains(controls::SensorBlackLevels)) { - Span levels = - metadata.get(controls::SensorBlackLevels).value_or(Span({ 0, 0, 0, 0 })); + Span levels = + metadata.get(controls::SensorBlackLevels).value_or(Span({ 0, 0, 0, 0 })); /* * The black levels control is specified in R, Gr, Gb, B order.