From patchwork Thu Jun 30 13:38:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 16468 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 838A1BE173 for ; Thu, 30 Jun 2022 13:39:35 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0C87A6569A; Thu, 30 Jun 2022 15:39:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1656596375; bh=ENxgh+HpD1p1yd5Rr9RIkQiW7aCtBzXEuxUFTVVDPp0=; 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=ZkmVlCNUuxvWBoVIOswc0R7Cw9o/VgA2cCRRzAYsTev70HjBiZXGDNedwHpRcH0Qn y802fXqYbhUxpSXFE96DVDtqqcE1ZFAehYk6SjXHxU9xIeuxchApO5MByS6SDYRTts Tpb2HxjDRgWYzZRejQst6DK3xs8cO6rTsAbYHdOuRQtmporCRpqXDL35t321uDJ4L2 8z/N+sGzRB9fpF6RCBvFAU0uRT8IdI2kYCNqjF3+LwqL+xzupYH8JM1Ehkz0I0z9cf 3uXL/Vnh8kNlAQoVYpO34iJhfJmaVWsmK7728ckGcBR/fFXKRwf0KFz7FBkhWI2U0K Bkb7M6OzeeRdg== Received: from relay1-d.mail.gandi.net (relay1-d.mail.gandi.net [217.70.183.193]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A3E1865633 for ; Thu, 30 Jun 2022 15:39:30 +0200 (CEST) Received: (Authenticated sender: jacopo@jmondi.org) by mail.gandi.net (Postfix) with ESMTPSA id DA3EB240005; Thu, 30 Jun 2022 13:39:29 +0000 (UTC) To: libcamera-devel@lists.libcamera.org Date: Thu, 30 Jun 2022 15:38:49 +0200 Message-Id: <20220630133902.321099-11-jacopo@jmondi.org> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220630133902.321099-1-jacopo@jmondi.org> References: <20220630133902.321099-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 10/23] libcamera: camera_sensor: Initialize delayed 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: Jacopo Mondi via libcamera-devel From: Jacopo Mondi Reply-To: Jacopo Mondi Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add to the CameraSensor class an instance of the DelayedControls class and initialize it using the sensor delays registered in camera sensor static properties. Signed-off-by: Jacopo Mondi --- include/libcamera/internal/camera_sensor.h | 3 ++ src/libcamera/camera_sensor/camera_sensor.cpp | 41 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index 1eab5e9d53f0..bd5aa0dbc27d 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -21,6 +21,7 @@ #include #include "libcamera/internal/camera_sensor_helper.h" +#include "libcamera/internal/delayed_controls.h" #include "libcamera/internal/formats.h" #include "libcamera/internal/v4l2_subdevice.h" @@ -82,6 +83,7 @@ private: void initStaticProperties(); void initTestPatternModes(); int initProperties(); + int initDelayedControls(); int updateControls(); int applyTestPatternMode(controls::draft::TestPatternModeEnum mode); int discoverAncillaryDevices(); @@ -110,6 +112,7 @@ private: std::unique_ptr focusLens_; std::unique_ptr helper_; + std::unique_ptr delayedCtrls_; }; } /* namespace libcamera */ diff --git a/src/libcamera/camera_sensor/camera_sensor.cpp b/src/libcamera/camera_sensor/camera_sensor.cpp index 976d34aaf876..211c7461f5c6 100644 --- a/src/libcamera/camera_sensor/camera_sensor.cpp +++ b/src/libcamera/camera_sensor/camera_sensor.cpp @@ -189,6 +189,10 @@ int CameraSensor::init() if (ret) return ret; + ret = initDelayedControls(); + if (ret) + return ret; + return applyTestPatternMode(controls::draft::TestPatternModeEnum::TestPatternModeOff); } @@ -460,6 +464,43 @@ int CameraSensor::initProperties() return 0; } +int CameraSensor::initDelayedControls() +{ + /* If no static priorities are available, all controls have delay 0. */ + static const CameraSensorProperties::SensorDelays noDelays{}; + const CameraSensorProperties::SensorDelays *delays = staticProps_ + ? &staticProps_->sensorDelays + : &noDelays; + + const std::map controlsMap{ + { V4L2_CID_ANALOGUE_GAIN, &controls::internal::AnalogueGain }, + { V4L2_CID_EXPOSURE, &controls::internal::ExposureTime }, + { V4L2_CID_VBLANK, &controls::internal::FrameDuration }, + }; + + std::unordered_map params; + for (const auto &[v4l2Ctrl, ctrl] : controlsMap) { + uint32_t delay = 0; + + /* + * If the control is not registered in the delays map, assume 0 + * as delay. + */ + auto it = delays->find(ctrl); + if (it != delays->end()) + delay = it->second; + + /* VBLANK needs the priority flag set. */ + bool priority = v4l2Ctrl == V4L2_CID_VBLANK ? true : false; + + params[v4l2Ctrl] = { delay, priority }; + } + + delayedCtrls_ = std::make_unique(device(), params); + + return 0; +} + int CameraSensor::updateControls() { if (!bayerFormat_)