From patchwork Sat Jun 4 21:11:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Rauch X-Patchwork-Id: 16171 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 CB2FDC326B for ; Sat, 4 Jun 2022 21:11:56 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id F344E65642; Sat, 4 Jun 2022 23:11:53 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1654377114; bh=pdxfYdSHR5Xzt/Pf3GlruiSWcGkUOHD/rcoIH9xhfJQ=; 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=PnjZvOnRoDUdke0elCyF8eqcQ50pmCQTW8uyFtYOUB742iWAFhrZ1ZMHKRnJle96D H7B/BsBiqjxXHhHTyp1SeAAI12U79JgBcw7eZ6h7GnOTjtz80Dh7861gNuYmo+ZwJy 4B3Y4dxFw3NyB9pWTmoPW7TTlZ9Z2PLHGYwHvX86meHgolFT6JGCr6u3v9fuxxspfj WE6tCTqAnytZiBmE+cVC8RfWeTFHoGrWdZMFuW+AL1HiGYF0bMctcVG/vUK9sFfQCW 7xVdccHNOsxDmVhy1HIN9IX0zGvnx0qFgQup9Z6FeyEywDqeNWlgW69N1tONFphm40 2lAM/F83cqN5g== Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E27D9633A6 for ; Sat, 4 Jun 2022 23:11:51 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=gmx.net header.i=@gmx.net header.b="OZnR+jT3"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1654377111; bh=pdxfYdSHR5Xzt/Pf3GlruiSWcGkUOHD/rcoIH9xhfJQ=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=OZnR+jT3SIF/qYyOu4anDQi45a+aheH68gUW/MzFXqiVOpscd0cqCOWjN62CiULAR 5rr4gK1UJ0z5gQLEMe7QoVgvD5/oi1ra4vYnpYOnJxEkGm8n3yN54wZGCo8AFR36pJ MeJYgqylgudn0QybdSJpk3ruDbwnysb+eEjw3J28= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([92.18.80.244]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MHXBj-1o1m3q1Gb3-00DaXS; Sat, 04 Jun 2022 23:11:51 +0200 To: libcamera-devel@lists.libcamera.org Date: Sat, 4 Jun 2022 22:11:44 +0100 Message-Id: <20220604211148.188421-2-Rauch.Christian@gmx.de> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220604211148.188421-1-Rauch.Christian@gmx.de> References: <20220604211148.188421-1-Rauch.Christian@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:5AS387TAGgUs/b9TPTkBuhZQa1CTnQjOyuMaoBH7yCWMxu89vo2 VOFDG1Vrtb8GTHoJAnRdH0imVLCMYx3d7me1R4qdnUuUfc0mH0pUxVylTNx6AJPDw38He7N ve0xNUJMW7oFQkRtxRJbQ+A3t6NMaVF5UybRpebIQ//JptZDCzSGbgEkkr3S57vSJttpOzb bqFEOdvBg5zsZsSFBIUZA== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:E6YXtxvBayU=:gU6PJxRRj9W5ox71NYn5kR LcRU4V1Q+FBp7aENvg29LpP5vOi4rQ4IYCYe9zbC4hkBfG1NzPuDaQhOC+ke4Job+9tM8wO/A J7hLiDxkyMGAeZ8d9JcWocP3IvayOa3GU2nA9bonPdItf8RHu+VPz+F0SYgD25c8zEvtXOU6M CC256fOaL7/JfWVXiTECKFqanAueKAI7jX2yg6roijTQkhrRSxAYxDJ3AMHj8LcQDCuV+3q9v cEVk2s6b6fFAG9f7xzvddg5DwrtB+6lv83Xh7ICRYupiPfAqP1tgYkJXDmeMaGmYjhmvtKEMU TcW45IvB60q5hKYluxV1YlL++glkrbXkhTker8ZpRtKPuaSJaBVEUaGVHVWxF4xvAM4LaIotC UFvwvpCwk5SH8cl4gtNu6aPLP2Zx0zKnQW0s8Yrb6IuuLJ2eeGXv1SN9qDfo8BZRUhr0oTbHo e+3p2agORI6EC9KffgaFjmeo0oTlkDhZEcprnfFu2S8VjPNMIvhkk2txorkXd2bkUg+n3wAlS 5yiu0R60bMza8WtozccqzUZLZFdUOjDjciy0fmaTHjDvb4KGRExHkAPP+Fl81YVatwAe+W5uE sU5V/4GuCEzHJlJvay32FvLl7NOO93A4kp4TU9c/ucpeS39DfoYC38TMMSAOxQp397GkeJv9E sdgdhUnz5ghbH4cutIJzBsRfDHh82TMKVOk+UoUAzK9+6ztTjBjySeAfK3yS8xgj5SGkUzdpF yK5zVFV1qjEFMTj4lFUwKkbmNK/dvWFCRXjxkWhiSA4MNnl8h28Sv6JVahrgIIq8Z3luUfD/X ITkBJkP/IQG9hPQZlz9YsmfIU1XeFMgAA8T4cMCOpnK9E5/zq/lygNJKzE4AAo39k45ovPOpH 9NadOYobNhuhqXqDxHQZNkNQ6K7aGI4VaQg13jMYA/R0jG7GuBs51cy2aAMHwUHV1yOlAcngp 5YfZKb6RN3aWeK1xr6zfK0D/E+lc55Pyc2QUp6XukrgxzRhGCoQIpIvpqxNLKElXvv1x8dXzZ v4BhLLKvViYumNQ/poliKrlGrhG0xZLy2gAemJPLvuetiMqddQaTfoNLqmLnvpWki4qsJqDqA o0VPrwTqBh9u7Uek2VLTj26Zqb0wB7cRnSAfmTcRrRWlS0t8Yg76/2NkA== Subject: [libcamera-devel] [PATCH v7 1/5] libcamera: controls: 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 Reviewed-by: Jacopo Mondi --- include/libcamera/controls.h | 5 +++-- src/android/camera_capabilities.cpp | 12 +++++----- src/android/camera_device.cpp | 21 +++++++++--------- src/android/camera_hal_manager.cpp | 2 +- src/cam/main.cpp | 4 ++-- src/ipa/raspberrypi/raspberrypi.cpp | 2 +- src/libcamera/pipeline/ipu3/ipu3.cpp | 9 ++++---- .../pipeline/raspberrypi/raspberrypi.cpp | 9 ++++---- src/qcam/dng_writer.cpp | 22 +++++++++---------- 9 files changed, 43 insertions(+), 43 deletions(-) -- 2.34.1 diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h index 665bcac1..192be784 100644 --- a/include/libcamera/controls.h +++ b/include/libcamera/controls.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include #include #include @@ -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/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp index 6f197eb8..5304b2da 100644 --- a/src/android/camera_capabilities.cpp +++ b/src/android/camera_capabilities.cpp @@ -1042,7 +1042,7 @@ int CameraCapabilities::initializeStaticMetadata() /* Sensor static metadata. */ std::array pixelArraySize; { - const Size &size = properties.get(properties::PixelArraySize); + const Size &size = properties.get(properties::PixelArraySize).value_or(Size{}); pixelArraySize[0] = size.width; pixelArraySize[1] = size.height; staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, @@ -1050,10 +1050,10 @@ int CameraCapabilities::initializeStaticMetadata() } if (properties.contains(properties::UnitCellSize)) { - const Size &cellSize = properties.get(properties::UnitCellSize); + const auto &cellSize = properties.get(properties::UnitCellSize); std::array physicalSize{ - cellSize.width * pixelArraySize[0] / 1e6f, - cellSize.height * pixelArraySize[1] / 1e6f + cellSize->width * pixelArraySize[0] / 1e6f, + cellSize->height * pixelArraySize[1] / 1e6f }; staticMetadata_->addEntry(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, physicalSize); @@ -1061,7 +1061,7 @@ int CameraCapabilities::initializeStaticMetadata() { const Span &rects = - properties.get(properties::PixelArrayActiveAreas); + properties.get(properties::PixelArrayActiveAreas).value_or(Span{}); std::vector data{ static_cast(rects[0].x), static_cast(rects[0].y), @@ -1080,7 +1080,7 @@ int CameraCapabilities::initializeStaticMetadata() /* Report the color filter arrangement if the camera reports it. */ if (properties.contains(properties::draft::ColorFilterArrangement)) { - uint8_t filterArr = properties.get(properties::draft::ColorFilterArrangement); + uint8_t filterArr = *properties.get(properties::draft::ColorFilterArrangement); staticMetadata_->addEntry(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, filterArr); } diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 8e804d4d..ec117101 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -305,7 +305,7 @@ int CameraDevice::initialize(const CameraConfigData *cameraConfigData) const ControlList &properties = camera_->properties(); if (properties.contains(properties::Location)) { - int32_t location = properties.get(properties::Location); + int32_t location = *properties.get(properties::Location); switch (location) { case properties::CameraLocationFront: facing_ = CAMERA_FACING_FRONT; @@ -355,7 +355,7 @@ int CameraDevice::initialize(const CameraConfigData *cameraConfigData) * metadata. */ if (properties.contains(properties::Rotation)) { - int rotation = properties.get(properties::Rotation); + int rotation = *properties.get(properties::Rotation); orientation_ = (360 - rotation) % 360; if (cameraConfigData && cameraConfigData->rotation != -1 && orientation_ != cameraConfigData->rotation) { @@ -1094,7 +1094,8 @@ void CameraDevice::requestComplete(Request *request) * as soon as possible, earlier than request completion time. */ uint64_t sensorTimestamp = static_cast(request->metadata() - .get(controls::SensorTimestamp)); + .get(controls::SensorTimestamp) + .value_or(0)); notifyShutter(descriptor->frameNumber_, sensorTimestamp); LOG(HAL, Debug) << "Request " << request->cookie() << " completed with " @@ -1473,29 +1474,28 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons rolling_shutter_skew); /* Add metadata tags reported by libcamera. */ - const int64_t timestamp = metadata.get(controls::SensorTimestamp); + const int64_t timestamp = metadata.get(controls::SensorTimestamp).value_or(0); resultMetadata->addEntry(ANDROID_SENSOR_TIMESTAMP, timestamp); if (metadata.contains(controls::draft::PipelineDepth)) { - uint8_t pipeline_depth = - metadata.get(controls::draft::PipelineDepth); + uint8_t pipeline_depth = *metadata.get(controls::draft::PipelineDepth); resultMetadata->addEntry(ANDROID_REQUEST_PIPELINE_DEPTH, pipeline_depth); } if (metadata.contains(controls::ExposureTime)) { - int64_t exposure = metadata.get(controls::ExposureTime) * 1000ULL; + int64_t exposure = *metadata.get(controls::ExposureTime) * 1000ULL; resultMetadata->addEntry(ANDROID_SENSOR_EXPOSURE_TIME, exposure); } if (metadata.contains(controls::FrameDuration)) { - int64_t duration = metadata.get(controls::FrameDuration) * 1000; + int64_t duration = *metadata.get(controls::FrameDuration) * 1000; resultMetadata->addEntry(ANDROID_SENSOR_FRAME_DURATION, duration); } if (metadata.contains(controls::ScalerCrop)) { - Rectangle crop = metadata.get(controls::ScalerCrop); + Rectangle crop = *metadata.get(controls::ScalerCrop); int32_t cropRect[] = { crop.x, crop.y, static_cast(crop.width), static_cast(crop.height), @@ -1504,8 +1504,7 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons } if (metadata.contains(controls::draft::TestPatternMode)) { - const int32_t testPatternMode = - metadata.get(controls::draft::TestPatternMode); + const int32_t testPatternMode = *metadata.get(controls::draft::TestPatternMode); resultMetadata->addEntry(ANDROID_SENSOR_TEST_PATTERN_MODE, testPatternMode); } diff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp index 5f7bfe26..0bffe96f 100644 --- a/src/android/camera_hal_manager.cpp +++ b/src/android/camera_hal_manager.cpp @@ -232,7 +232,7 @@ int32_t CameraHalManager::cameraLocation(const Camera *cam) if (!properties.contains(properties::Location)) return -1; - return properties.get(properties::Location); + return *properties.get(properties::Location); } CameraDevice *CameraHalManager::cameraDeviceFromHalId(unsigned int id) diff --git a/src/cam/main.cpp b/src/cam/main.cpp index 79875ed7..d8115cd8 100644 --- a/src/cam/main.cpp +++ b/src/cam/main.cpp @@ -301,7 +301,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)) { case properties::CameraLocationFront: addModel = false; name = "Internal front camera "; @@ -321,7 +321,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) + "' "; } name += "(" + camera->id() + ")"; diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp index 3b126bb5..f65a0680 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -939,7 +939,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(0); RPiController::Metadata lastMetadata; Span embeddedBuffer; diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index fd989e61..9d9ea138 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)); 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)); 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(0), 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)); 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 adc397e8..a62afdd4 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(0); bool success; Transform rotationTransform = transformFromRotation(rotation, &success); if (!success) @@ -1706,7 +1706,8 @@ 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); /* The control wants linear gains in the order B, Gb, Gr, R. */ ControlList ctrls(sensor_->controls()); std::array gains{ @@ -2041,7 +2042,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); if (!nativeCrop.width || !nativeCrop.height) nativeCrop = { 0, 0, 1, 1 }; @@ -2079,7 +2080,7 @@ void RPiCameraData::fillRequestMetadata(const ControlList &bufferControls, Request *request) { request->metadata().set(controls::SensorTimestamp, - bufferControls.get(controls::SensorTimestamp)); + bufferControls.get(controls::SensorTimestamp).value_or(0)); request->metadata().set(controls::ScalerCrop, scalerCrop_); } diff --git a/src/qcam/dng_writer.cpp b/src/qcam/dng_writer.cpp index 34c8df5a..4b5d8276 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); TIFFSetField(tif, TIFFTAG_MODEL, model.c_str()); /* \todo set TIFFTAG_UNIQUECAMERAMODEL. */ } @@ -438,16 +438,15 @@ 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); - if (colourGains[0] > eps && colourGains[1] > eps) { - wbGain = Matrix3d::diag(colourGains[0], 1, colourGains[1]); - neutral[0] = 1.0 / colourGains[0]; /* red */ - neutral[2] = 1.0 / colourGains[1]; /* blue */ + const auto &colourGains = metadata.get(controls::ColourGains); + if ((*colourGains)[0] > eps && (*colourGains)[1] > eps) { + wbGain = Matrix3d::diag((*colourGains)[0], 1, (*colourGains)[1]); + neutral[0] = 1.0 / (*colourGains)[0]; /* red */ + neutral[2] = 1.0 / (*colourGains)[1]; /* blue */ } } if (metadata.contains(controls::ColourCorrectionMatrix)) { - Span const &coeffs = metadata.get(controls::ColourCorrectionMatrix); - Matrix3d ccmSupplied(coeffs); + Matrix3d ccmSupplied(*metadata.get(controls::ColourCorrectionMatrix)); if (ccmSupplied.determinant() > eps) ccm = ccmSupplied; } @@ -515,7 +514,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); /* * The black levels control is specified in R, Gr, Gb, B order. @@ -593,13 +593,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); 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) / 1e6; TIFFSetField(tif, EXIFTAG_EXPOSURETIME, exposureTime); } From patchwork Sat Jun 4 21:11:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Rauch X-Patchwork-Id: 16172 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 70882C3273 for ; Sat, 4 Jun 2022 21:11:57 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2B97665645; Sat, 4 Jun 2022 23:11:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1654377115; bh=WWfRNiQl+2lLsSZRngsD0CPdkCnXjd4F56SnwKRV+p8=; 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=oOis0300kI9D8vHdeftdfc25sA8coDuIVpgFUIqYwXyaozDqOpYVJSUzKUGViGGAn 0i5ldVGUH6EO06Iwl9AjdFhp6m70Ic4pkFxL80csbVyDfFBrVCkPCb88V4dall5zgY TIW4usjqnUECBcytfHyZGq/p7WKN5wAB/XgPcdU+crishaAgQJq/zGETXm+G6e4bCQ frCj3yk5YnwYNjbnM1DuF9XlfKMwFzOHSK5HMTNEabvKSmTS83Pz0gY08MqW/E9Mtg IMVcoMCpR9HMVbrsIp93maxbBXJZehYZm4gXqzEnhf2jX500rsmeT0lusIfmaeE7YJ 6WbIw50+VXbZg== Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2BFB365633 for ; Sat, 4 Jun 2022 23:11:52 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=gmx.net header.i=@gmx.net header.b="BgNy0l7v"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1654377111; bh=WWfRNiQl+2lLsSZRngsD0CPdkCnXjd4F56SnwKRV+p8=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=BgNy0l7vSqYJAb0shZKsEf+qOmSqX/h7pD2bYl3WDXVK0mQXqgGYQTOzH31rIx41c v0kR4E4vHWL1p4n71nRq9eWz/remYGO0JvXG62qJ6EyygVO8x5mesMq9JaN3sOuQ/f qGV/f5rfE5Y+Myv+mZOHhgfxV849VbZNVTRgwXH8= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([92.18.80.244]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MQv8n-1oB1TE2Z7f-00Nw84; Sat, 04 Jun 2022 23:11:51 +0200 To: libcamera-devel@lists.libcamera.org Date: Sat, 4 Jun 2022 22:11:45 +0100 Message-Id: <20220604211148.188421-3-Rauch.Christian@gmx.de> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220604211148.188421-1-Rauch.Christian@gmx.de> References: <20220604211148.188421-1-Rauch.Christian@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:A6+6cvXWabMvsPyFF86gy1G0n7TIjlZqJqwLsBOKvRweMw/sSfw /UE1bvW0veK+2g78tqMo2sPwnKCOI/FIof8/dbK16TZbeklxnxzBXohWi0aA/04HwbFMjgZ q1e9yanFcKLh+sS7mIHG8FfijEnnvXCPKEdKb5glZ10EpBg6eCOe/LEzaDVpFG11CSUZLrz 3Z9lpvQm32j/OSic5gYVA== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:8Yum4+E7gXM=:OmQQj8TCjlYwQgyiJYmXGY ECerFqdTNXhdXAASVzQQH7PZujp9sHV+HdKUil+4v/4VCC/M8V4k8M8R3n3/LsQebjgvch5wH a181ZW2fTfJTBsDXEOUYn/WBceSnYMXG+c9sqZ2ek6GiwsgWyVEyH+dFDNi6eKj26US1ITzLP ZHAg94ArVV5c6lkYP4t9ot096hBCBSYWTo+GD4Un0SEqxm9qgzx665bdNXQTr4Ym6BcIty+AK mA+JKDP2wV5lZ9QHyc6Q7BjfTQf/8j7dEPt0ukF5s4Md06acWz2ciyTTMSkkOEz+e1I6ghbWA 50sQ+H9AAKypXPbYRNJvxmcQJ2ww9aWwofXApuWt8cViNinr8eoJ5kp76Cj5oVodWMb/HbhTr 4hwtUDr5C81P7XWASjoolhiZgIYOXiPA78Qpx3w/RFBi6jL5i6+r4pgmGZ58uNENEtWK3ttUC NboOGWiP7ck/sPgFOLsRZNBrKruBIQI1kUxBP5WeAFl3jPCmbYMxkkz9vj+z1hEr+gZyilHPK EB2PXI+CRuaGxjSsgmzjPoj3fgJQr3aezpeGBQWLrwNbvtT8mHpbI3/YOMTejdTTiMT3tODqU mVliDgVvvFBSBzb69Ll+v1aVoffo3kdi+aesVqGDvFILF4AxVO1yzLv2bbyHj2UoHGrUvTwwG toZs/n1QUg+TZjhgV75tn8j8VSOo0UAzeMQzQjrqMWy7MjmaNC43WKaKym0qJ7AL0GZcnw0kq pQtfb0nXsZcnc5lGHwiWVxjNWAinVokA8i2Y0Mu86LPl6LpQ+TQWPPGFn/eEeEdsxtJCUM7RP l7jRImROgnqh41Vg1uJS5aPFdwfKpMpmgmiBMkqQ2r+a71IoVxq9WeOkDCDZeBTO+rQjOgEsJ CcYFH4Amg3cCDS3onWhuT37uh/BrXGfXHDh82WF1JEHEUu9s+WCjrXDaUT6Zf4nRWFmzzB9ln dLAr0l6qaIRs8ZuWogBf0adcWlIUY07Lotm/987i1ap/LE4SAR1uxJ8nfBuVjjGyQ+U7anvni 0q7XzY1DNXFYJfCgfMVcGac+mXD7UqJbeOfsQqn5o1cTGqogZj7aDnom6ietPUJf5Pt+4cy+x JjjedAQkuKQ/CglDLD3MRsSW0dl+90rHHFMmVWTNWvoX+Plbyk/EemzrA== Subject: [libcamera-devel] [PATCH v7 2/5] libcamera: ipu3: Fix rogue whitespace 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" Fix a comment line wrongly indented with spaces instead of tabs. Signed-off-by: Christian Rauch Reviewed-by: Jacopo Mondi Reviewed-by: Laurent Pinchart --- src/libcamera/pipeline/ipu3/ipu3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -- 2.34.1 diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 9d9ea138..43db7b68 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -1449,7 +1449,7 @@ void IPU3CameraData::frameStart(uint32_t sequence) /* * Handle controls to be set immediately on the next frame. * This currently only handle the TestPatternMode control. - * + * * \todo Synchronize with the sequence number */ Request *request = processingRequests_.front(); From patchwork Sat Jun 4 21:11:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Rauch X-Patchwork-Id: 16173 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 067FDC3274 for ; Sat, 4 Jun 2022 21:11:57 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id ACE376563A; Sat, 4 Jun 2022 23:11:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1654377115; bh=zcOLN4jTQsCp6vUKu3Yx2tGvQEPJLyoWBisxOznYHvg=; 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=b/n0gd/eBhq9felMkV9TFhj3qA+YvalCPKYei/s6HGRET5IXYIMGJvPKwnHXzYEPP EM2eNaB94mHLlN3HNfb1d1cL+VPrcNszRgSsMyOC2Ej4mTf1QBh0ORX31Yk1/7N/q7 MdGkaNkurBXz3UABC976dan+V+azzODmAxWuoqO2OGQ+KllvWpM3jfSxajYa4vkq0Z WD6GDBV6mOWBgCjRCi2YRfrmaAXj3lmNf0HEmNFfc24BMK3hGBouzVmVwF7r8mfQWb GgfLUx2AFKka31/F7IHsQkKPWUabxYOdOcfRGGYTyAkvABFXkbzuSUYr5Ke7/yX2HW mwN3A25RJLsWQ== Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6C0D4633A6 for ; Sat, 4 Jun 2022 23:11:52 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=gmx.net header.i=@gmx.net header.b="a2/bd6pL"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1654377112; bh=zcOLN4jTQsCp6vUKu3Yx2tGvQEPJLyoWBisxOznYHvg=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=a2/bd6pLv4sMOs74STD83SB8up7WDZHFLWQwNZd3gmW8C3F+9vqKSRVgo4cibLWW/ pCcrlp6e9PCrHgIDrwC1QuzfNt8FHI7OVYWA9pDZC09ahcTYJni5vcKODIhS9wLSW2 ch02WjBKS2E4ta1kpycXG6k+jzlyxqGQp/8TIsKM= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([92.18.80.244]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MhlKs-1nJsWN426q-00doYN; Sat, 04 Jun 2022 23:11:52 +0200 To: libcamera-devel@lists.libcamera.org Date: Sat, 4 Jun 2022 22:11:46 +0100 Message-Id: <20220604211148.188421-4-Rauch.Christian@gmx.de> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220604211148.188421-1-Rauch.Christian@gmx.de> References: <20220604211148.188421-1-Rauch.Christian@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:JUjqzNEYpwJaAMoZ2BqEog188DeC+uvnuyvrhJ14zBFcXtvjWDk MF9GNI4ZS/34eqsIpnXMGXSASZtzpQzH5xxDs0/ExSXWT4ro7BP7y+3bw/KOU93f+Xv87aX rE2i/kMaeOs19UlSNeie65J1n3slENJE6BWVcH+9ytMTiDnt8SBF3YGvBwp2QbhDrD+N/hi WGfbeYEmkZaOYnvkE7iJQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:iRTLmQsnZ5I=:aHnMQRbAwoflId19bBYxcc DdtjLCs3UHlPTBaIOH+wb92JbvESxCvxiQYJl1RAnTpiRuMW0J5rWnBTEWUqRICLYWcgP3/hA nGmTmWab7WfZaAEf1twylboFpJrsghKfwgIEI29YWLqmBnI6EXXJ8HGvQk7MW9Xj2R7ws09sH JPIVugtsggFsOLObOX3rnOz8lnXdQfwankbIDazW+popLfT/IHq8Cu+dUvzBOj704Xf1QFKBI /sVHkvQ96qYkvKPYGaPjQQv9N3OlCMeenQyUr+6mB/Cf5r00AH4fbMx5+vamW3VKyFvNzcC8Z ytgF1iPHlE260iz0y0jt6k/N0LOdQ4zhVaFb5USlHLD4knU7kIYn9FGFS+me6oEnT5teUuaGE 3HY8dCaUSZWSe3b+Hr9XGgUkpWst92lRufVYXamMbK/vj0qI1I8bn6S8Z1IOOaT9Hv9vUX+0F aU2HHoOrTcyus6rGD4o90oxB60iltzmjOrjczoy/c+Biz8IcsN7hOiQlZLLamfovxqrFXaQNw Kl8DLJGBSSOkRoghI7U6GyC4xA8tSzvfvWArXuKBh6IQ1r1ao0jHFcrS3zgPH8kd3a86OMQI/ lonGlQL/QM0Gh/W06qbSoI4hQxTVaSd5XeVZOrkqXZb84gJVGRl421idxqoXdC/G3RhZxudsi I3HSLvW+HEyZHXwcGXJwwLS595rOBUW6akuWkL5tgeQD0KQcxz70G9VLJkOogNagG+bVLo9Ga +qtSzJ1+Rc29WfDq03O/2RyZYsxExbyAvn+QVesV0k/KPGI6crcFbB2R4HGwAXtqv8eG0Y0wn yNfEwgunn6fyAjeQmt5QGqj8eCF8v/jbZwXJV99NPz0xkGgaKnjZKZclbIB8kBDvriLymN7jm 3Ntr5UfzQsjbgsZhT4oyawz/w7FDQBxE/NaopDFIopVMMQPXnGXpFofiG7/HjHOrFWQ4a9jTH u8eKT7MZXqIX2s2f7hZQejmajt4BgKbVMtBlv76ptSXZ8u7eXEzv7lBOWtxP/+yT+egXSZvj7 Fn43/b4tIRpDWKI5x5YKQqJR1WSqTzpaflSjPXCmLrZIbVm/Qio4XzB+Lp6vW2KYZHFd8yQyt RbLo+TDSAxbj2KoQMrH9ckNEpS52w0QVPUcw/Ob7TS6QDG6dvO8Ej0ePg== Subject: [libcamera-devel] [PATCH v7 3/5] 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 | 4 ++-- src/libcamera/property_ids.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) -- 2.34.1 diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml index cd1d4512..f707c1f5 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 @@ -515,7 +515,7 @@ controls: the window where the focal distance for the objects shown in that part of the image are closest to the camera. - size: [n] + size: [] - AfTrigger: type: int32_t diff --git a/src/libcamera/property_ids.yaml b/src/libcamera/property_ids.yaml index 11b7ebdc..a87485d7 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 Sat Jun 4 21:11:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Rauch X-Patchwork-Id: 16174 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 4B751C3275 for ; Sat, 4 Jun 2022 21:11:58 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 1860F6563E; Sat, 4 Jun 2022 23:11:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1654377116; bh=UqwmX7+yMaOqSyR96KduBQpxFaCTOfHvdMO6MxtFX8g=; 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=ka/tYQclf2A2jdAKscy0PiwdhkghDk5xrMBu6c0qKIXIkJsB7YNOeYwX11EVcFDJh tR3qaw3HRiS/LgN3ja+259JQhOTzGlmRU9dL6io+h7lSxrTEm7InsPPy7xakrxPkxh sC5W6jFUsFmckWq1HZlVxEIo/9/t98zjo5p2IW1jLbEtuklM9p44ehKKafNVRP4PdN SHZNmCGgm9ExASxTuQcONHhIlHg6Y97dq4EzQAML5hz7zKTzldXU10qCwE5HsOMGR7 2sVPi6CYlyL1ZZwy9k0w2J5lg/aM838XQWFLH+s+4A9jbe1DhFSXvBO0P4Hg8NAph7 YzJzQALagj24A== Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9ABE165635 for ; Sat, 4 Jun 2022 23:11:52 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=gmx.net header.i=@gmx.net header.b="G1vPW9uv"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1654377112; bh=UqwmX7+yMaOqSyR96KduBQpxFaCTOfHvdMO6MxtFX8g=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=G1vPW9uvo4WlLg91e50rjghkZCQbhTrnYSUPgBCL+TJF2dfMqWnry0eDyyB02FSDm IjoUsAGzem60fh/fLvALvb2gzGuzhgo20eqO7CcY+GNI/iPi0PDh7naMvm2rfLQrvS YZr+Ro1X5witO9AR0kyPJ5vDnCq+1WG9u75OK5Qs= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([92.18.80.244]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1M3DJv-1nwDcD14fN-003fSg; Sat, 04 Jun 2022 23:11:52 +0200 To: libcamera-devel@lists.libcamera.org Date: Sat, 4 Jun 2022 22:11:47 +0100 Message-Id: <20220604211148.188421-5-Rauch.Christian@gmx.de> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220604211148.188421-1-Rauch.Christian@gmx.de> References: <20220604211148.188421-1-Rauch.Christian@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:dj24ZkDnChGySjTVCWFewBr46xBhIq3fWed+/gV5Rub+SxYQ5rC w1l0qAFh6z0MGQ2OagmM4T8HkN8sOfVU6dtEu7VksiSaL8qR8AMha7OAXRpq4AMUrt18BSm bNhw29pllit/R2zNfMPQMu8ycHBC2e2YxoPCGRHbXsx9HcM49Naey8+cwMti11/eLKbSuZD 0Wuva4jSGwSPa6ZL30bJQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:VmKbKDsj+zA=:f3f1lyiDzRx70Ve2Ab+ffs ryB69Jb9L37EHUZU+peEHbRKEHzsncgI1I2/K9sDNI6fAttuoKhskFe2DDPVJNPMVT2qCBplV HoK7xKs653xTwWBUxo+UihSGeNalxwnVX/cmynATOVwEHws2lNRGKCiDRaF6+rMH99id0OvOb iVh9qrzmIW68QZMq5UJZ4Kx8Ayh8LgLQYUGMH74niZrZoUwJ3NhFqJdPj8NgvE6vihS/EIql+ 2Z1jizmjAE6QKT/7m1XNrt6Rq9MC1YpyVp4+N9RD15BzWSplI8RfM6PWkHh3jC4v9eBk0BE33 ssDjW+F4Akzl9nT+Q7NQbr6Wq6/E9KED2bb8tIedqhXOtQKlS0PWgAuy9FmcEta0Rug0eM7J7 3S1aLAclavC3Ovb/S7pq2hOxPy0Wj105On6nHDv/DkIbfq2nYKrOfFKZqmJTtXmgWChXORKhE MXlbCLQ60EffWPmuRWAEKW9zJr0AH+T4UyLxR3RF89O34fbc4xAqoXWB0NXTDyF8CjwvvohWW MKzD4VYfhl5WDSA9Re5/y78dSCxGcYhGhOvTTaIPYh8QVj93ZwDWqqTzW9Urkt7As37EUsISk eAeJGv+N+rDgnywv/ktiV5Odcrizv6cDAiKCJC5ZnOSTFap0HCElKzpxvHBMCl4BHWz33nMzp DQLUe0ZJRlEk+qLVvm5K21On5Pa3e3xlXsBx62egOuv0QSj+ljFbPk3q2KcfTtv4r6WH+K8AV PO0T4pPgE2COH0pNxqoIYQ0cNM2Zhwik1uuPsNA9ZAz46bacVlv5cPxWsYyGq7dmMHf/yKEc/ WyZvAPPOyUYtpoC6rJV/LWsAGfXD2Q7EQ+0W4Bn2AE8eWonhgW95SDjs+VFSLYKL011A1iNdN LFBWd9edEZE0gR9rWzmPfUcqhQG+OYZjgo5o/uG9M3qTWyLEW4ehsfzA6ri+IcaRFmQJ/8Z+c 32ojBRBhVpt4mIw+sWRI9xAX9UzcwIQQMKaIbNBhjtDjeQlZC40o9jeTd8iASss8gAgJrdkUv KE7854w0RhJCOX7YyYU1LPcTqj8VoHAawxGh9mAoOJ0SNZyPHVy00D0lIIR1ysfnlQEpQvQ3Z T8DAcVBAtSQHSdciIzvGmAA37wN4Z3oFxc/maNI2nI2gzoEPIJu9HauWQ== Subject: [libcamera-devel] [PATCH v7 4/5] libcamera: controls: 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 Reviewed-by: Jacopo Mondi --- 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..46ba4394 100755 --- a/utils/gen-controls.py +++ b/utils/gen-controls.py @@ -7,6 +7,8 @@ # gen-controls.py - Generate control definitions from YAML import argparse +from functools import reduce +import operator import string import sys import yaml @@ -22,6 +24,24 @@ 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') + + if ctrl_type == 'string': + return 'std::string' + elif ctrl_size_arr is not None: + if len(ctrl_size_arr) > 0: + # fixed-sized Span + ctrl_span_size = reduce(operator.mul, ctrl_size_arr) + 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 Sat Jun 4 21:11:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Rauch X-Patchwork-Id: 16175 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 8C44AC3276 for ; Sat, 4 Jun 2022 21:11:58 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id DA39465646; Sat, 4 Jun 2022 23:11:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1654377116; bh=57RCMCH2ddS8uCZM3E90CIxLhQ7NCr8PSdJyCaYE2pE=; 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=gpasxA6GlGj6KWsCcrQ1QNfE1mnRlAUBbQsL24fhxjLrVLphT4HaipZd5ymZq9AFK r8Ti05af7ZLviXQli1rESKESHZxXctDthKc0pNUq6i0lCvATsy6kTBiPRGrp3uDpC4 cT479Lxd+Jkd8e/0uPE53g4tYjDZ6YhP3OcaC58GBV8vRMy8sE6xRA1/KaGoR+KerC R7uBnljqnSNigZBDktgGyJ2FybHoPRbK6mdCYppUkgfNYb3JO07kv6LknkgMogNnIR IjDcoDk/7tUKe0uBpzYs5RXTonQCvPY1Ufm+YKpgtPEI5kKW3Mv2hEqJ/VJvfH5hst qm254nL9kiMQQ== Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DD77D65633 for ; Sat, 4 Jun 2022 23:11:52 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=gmx.net header.i=@gmx.net header.b="Vgvac8qb"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1654377112; bh=57RCMCH2ddS8uCZM3E90CIxLhQ7NCr8PSdJyCaYE2pE=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=Vgvac8qbJynp3b9lo+V8AVUHYsD8EERXhOGd9osjMrfFwjdVsfzSHPtID5V981F4m HfgCGZTHiVg73D9UFAKH6FJkl5FMoq8ntY9maGGLc2CDQxcOTDq6vuoJqBD3Dj/mGU BHmX8JKLCQGnqYqlGBk9yb75Szu+aZU/0wBxESas= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([92.18.80.244]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MKbkM-1oE1Tw28Pk-00KvCJ; Sat, 04 Jun 2022 23:11:52 +0200 To: libcamera-devel@lists.libcamera.org Date: Sat, 4 Jun 2022 22:11:48 +0100 Message-Id: <20220604211148.188421-6-Rauch.Christian@gmx.de> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220604211148.188421-1-Rauch.Christian@gmx.de> References: <20220604211148.188421-1-Rauch.Christian@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:mMcMWQsLWY5nZPbxwaVyw/Qzq162bIt00gDssAH8WRZd3ctWuy2 uhEcVnPd5f8NTDiTiAtMtlz4asmHTDcyhu4X7Yezt2GKCoMhpz/IQPIlQJqi1aYMRSlPeGS D6XM6EwLjdqq+1tSA3waXxlu0+/VzMASXHIRSkfwQkKcT84NCTgmNqb8VfLnpiHnTjqW9v5 1nho26pETxTQIFwkzJFnQ== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1; V03:K0:pG9P/BEcBIY=:h5q67KvBbz/Md9SKWVKGzj urQ1imd1o9nNeAlS/AqEON4EHCTxP4SXEtyP37uLIwwcCGos/wWJWSpLqXSQANlLWwx0PZ+7/ DZwppGgG7Ydu+POaDsbcHifNnXQIOZb/TBiW6Jgx3skSnqTkXOXnnXRL4mRpJ/ginnE39dIpf cpcd2a7lNvoGCoBhUXGuxPJNiE0VfuVJevswxI21F1ScpWgtY5gWEOuKqNQDzlKrzPnF3fxZH 2HUHxgv42TPVp3cGQB/D2HtSa7IVVWD2JqBMPW52OUdZpBRLr9rmg3MGToKnOA/0nFnf11MnY vJ06ek1YbwAGyZH5frGCgKso1tpb8WJstRgpeyBTmBCUsByrxXrbt7bpkXtt6vMCMYSFMc7Ep CDQaN+DtppFUX2xoGZrMqpwSLeD+LOa5/wSorv9G8TEXIsbVL8of24yRzZuP6v3mIOrd3YbM6 qmQ8hAnxuLWls1NcEuX0ln5bkl5lgk1xkaJiO8ZHsjPtVDK72hJNxG6ex8c7/v9GlklNhqdg2 9ikr9sZbvMjtWRpin0wfGdHdwRDWXBl/FZ8qhnFVnlmjHXXaFRw19+ygIqr3x0wD3VR4vQY2i 7bT6GkkxXwjjvtuBsPKaOZeO8g5MmzzSUm5v+AQg8CZFQtzRtcuT4w+7a4d0I86Mah9bv4mdS EASEHA0367m1eEHZfv90YaFARs+TxHxeywuWfD3nceaX1BJl7+RINUw2cXexpc1ywfOilfQNU NwLqEc8DEzGGCAkfy52JFt6D1x+5AprPk6KnWVBpGNR5iB3DiF4MWrpGGkwBY07TUR4Vt11bI CSYKB9enL83PGC1Ggvj++zo9aVTFW+CdByzsVjjlTGeINXrk6NmEci9Tpv6RmSsJ2F+U4p1My JqP0+SKjNqdW+pXUpI0aCkAReeuVkR4db+7eiQ/6M0fcR2XLOWaTlvnt0vKL8dtadNnFBP0qc A36IvqNjMl90w1W9BkwurgVPLp8pM8eLQBUj1/P6rEvSTlYCgA4k+7Cw18ahrQ/RA7XxdXE7N Q1PpQppx02lEgZO9euwbmES18zZTT9fYW7A9D6DcyHTAGsSSoXD9iseHq4Lva1d7dDbD70pzJ HEFLPD7B2pDtsqjZDleLZP3VdsoFSG4MXZuUTMPIzqhwVLmEKIVdFLtrg== Subject: [libcamera-devel] [PATCH v7 5/5] libcamera: controls: 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 --- include/libcamera/controls.h | 2 +- src/ipa/raspberrypi/raspberrypi.cpp | 19 ++++++++++--------- .../pipeline/raspberrypi/raspberrypi.cpp | 2 +- src/qcam/dng_writer.cpp | 2 +- 4 files changed, 13 insertions(+), 12 deletions(-) -- 2.34.1 diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h index 192be784..a19f1845 100644 --- a/include/libcamera/controls.h +++ b/include/libcamera/controls.h @@ -168,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__ diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp index f65a0680..203ae613 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -505,18 +505,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({ blackLevelStatus->black_level_r, + blackLevelStatus->black_level_g, + blackLevelStatus->black_level_g, + blackLevelStatus->black_level_b })); FocusStatus *focusStatus = rpiMetadata_.GetLocked("focus.status"); if (focusStatus && focusStatus->num == 12) { @@ -821,7 +822,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; } @@ -1105,8 +1106,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 a62afdd4..6efe7c3c 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -1706,7 +1706,7 @@ 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); /* The control wants linear gains in the order B, Gb, Gr, R. */ ControlList ctrls(sensor_->controls()); diff --git a/src/qcam/dng_writer.cpp b/src/qcam/dng_writer.cpp index 4b5d8276..23612be0 100644 --- a/src/qcam/dng_writer.cpp +++ b/src/qcam/dng_writer.cpp @@ -514,7 +514,7 @@ int DNGWriter::write(const char *filename, const Camera *camera, uint32_t whiteLevel = (1 << info->bitsPerSample) - 1; if (metadata.contains(controls::SensorBlackLevels)) { - Span levels = + Span levels = *metadata.get(controls::SensorBlackLevels); /*