From patchwork Fri Jun 10 12:25:32 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 16195 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 30506C326B for ; Fri, 10 Jun 2022 12:25:32 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3E034633A6; Fri, 10 Jun 2022 14:25:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1654863930; bh=fbvK/Ak27dtZl3TEwoLt4TTFR3XDE3kvqgGiqHUfnmI=; 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=l4ZmidhfeJZuETEjcBx9xqPHqpJbwtetAdSksnUO8MPutcXuA6+6PHXYi9XzaMGoU 3vcgB1krsigEng9T6utp6LyWO5Ndsg9B+mHEHxw+PTl1liCcuEVteSB6pI8/JEedIs vr2NI8ZVD7LYCnD1ppUIl6DtFqgWAYh58PbMFoe6JPzFwmFE97BwoSCLESK3KL0doH HSqNCLbtOMalv7BheeLOpz1VTF1AKjOw5v3c07TZVbafzMp7x5/gRAbDS7I0MgSYLb wKjDmiVympQCyyr3OCL5kYq6gwt/64m3RBgQW5VxrjxflIVyAOGO5+DNESzAJDGTI5 k0oH1U2VEJEDg== Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id BE8FB633A6 for ; Fri, 10 Jun 2022 14:25:28 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="jKrkCgeF"; dkim-atps=neutral Received: by mail-wm1-x32c.google.com with SMTP id z17so8987850wmi.1 for ; Fri, 10 Jun 2022 05:25:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wZA9/ttvFh+Mazt9dmmLKBj2nOFyAUFVT4YF0YKI6g0=; b=jKrkCgeFhsJLtd8e0I2gI2szkkjHT88MBFxskl6/lpCUjiPNMWUt6aW6SQoHRA4TXU iD1ZC8V1PK+LkJOyuhoth64+/pefTPFtsTOcEZogXhp3zWuPZDOHGr+oaFssw6vN27X6 2jpEpscLGPsLLk7fqdld+DrccDh4SqXZfRGLjTbX3RTMPRXBGF92xzhughFoFQV2Pd54 HUFvhjwkEBFr7yRA2cnEeK+kYAnI/niVYskDuZFKs5HO+n2euc18U06TGGcQbuyqj0YM TXGEvK5IVuazl//nxJy9+d6mp2ZNSVbi2JKJ3/6jKP5PLBCr8RzbS0njU8mQ4w0IpRIV dy/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wZA9/ttvFh+Mazt9dmmLKBj2nOFyAUFVT4YF0YKI6g0=; b=YwgrwO8D/Hx0s1HGS0glHhMr4tKHzF84/DWRcsWPZdFcjQOdhrsiGEyQg3V5gpsaRu Mc6KzEaU/iLMVtj0taOFVJ+e3LOMzFzGaMX/MEuNBhsTE+fOtX+e7mf+FcxiDtjz5nrW 8cq4p6TnV/Ej0o22A86eBSrbmqMQyMtB55Bz9GcF3qiDKKIuIFK8MErxiEpfBovBNkar qswiytZb/M8lPPg7Ow13kWSGSwGvRMBTN6Av1YImygNFyM7KdNGC4f2bk3W6Onj7FQsj 2kgdFbdsCvrvaYivn8A6nz7C4gf9iGABwdawF44QJ1pQ57K04zdVXT4TiVzWt5LKmEo1 eTbQ== X-Gm-Message-State: AOAM532qykvvPrX52D9ZuzXBxmGcETWGABQnAmSH7W9lS073h8KEk2cF HKTVKzsgght41ZS3UcJz8fa1hPpYSfKJCg== X-Google-Smtp-Source: ABdhPJzCB11T0jtE8TwFfuZ3t0o6D1Ak9qBWQyMi2krbFeVqj3UPmMyuhEAThevd6EXZFjlBdfVECA== X-Received: by 2002:a7b:c4cb:0:b0:39c:35b3:e8c1 with SMTP id g11-20020a7bc4cb000000b0039c35b3e8c1mr8413573wmk.183.1654863927995; Fri, 10 Jun 2022 05:25:27 -0700 (PDT) Received: from naush-laptop.localdomain ([88.97.76.4]) by smtp.gmail.com with ESMTPSA id e29-20020a5d595d000000b00213b93cff5fsm23097909wri.98.2022.06.10.05.25.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jun 2022 05:25:27 -0700 (PDT) To: libcamera-devel@lists.libcamera.org Date: Fri, 10 Jun 2022 13:25:32 +0100 Message-Id: <20220610122533.11888-2-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220610122533.11888-1-naush@raspberrypi.com> References: <20220610122533.11888-1-naush@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 2/3] pipeline: ipa: raspberrypi: Correctly report available control limits 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: Naushir Patuck via libcamera-devel From: Naushir Patuck Reply-To: Naushir Patuck Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The ipa currently advertises a static ControlInfoMap to specify the available controls and their limits. Fix this limitation by having the IPA populate a new ControlInfoMap with updated limits for ExposureTime, AnalogueGain, and FrameDurationLimits controls based on the current sensor mode. This new ControlInfoMap is then returned back to the pipeline handler and available to the application after a successful Camera::Configure() call. Signed-off-by: Naushir Patuck Reviewed-by: Kieran Bingham --- include/libcamera/ipa/raspberrypi.mojom | 1 + src/ipa/raspberrypi/raspberrypi.cpp | 24 ++++++++++++++++--- .../pipeline/raspberrypi/raspberrypi.cpp | 3 +++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom index 77f52c282b0f..c0de435b7b33 100644 --- a/include/libcamera/ipa/raspberrypi.mojom +++ b/include/libcamera/ipa/raspberrypi.mojom @@ -45,6 +45,7 @@ struct IPAConfig { struct IPAConfigResult { float modeSensitivity; + libcamera.ControlInfoMap controlInfo; }; struct StartConfig { diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp index 089528f5e126..295f6b735dc0 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -74,8 +74,6 @@ constexpr Duration controllerMinFrameDuration = 1.0s / 30.0; /* List of controls handled by the Raspberry Pi IPA */ static const ControlInfoMap::Map ipaControls{ { &controls::AeEnable, ControlInfo(false, true) }, - { &controls::ExposureTime, ControlInfo(0, 999999) }, - { &controls::AnalogueGain, ControlInfo(1.0f, 32.0f) }, { &controls::AeMeteringMode, ControlInfo(controls::AeMeteringModeValues) }, { &controls::AeConstraintMode, ControlInfo(controls::AeConstraintModeValues) }, { &controls::AeExposureMode, ControlInfo(controls::AeExposureModeValues) }, @@ -89,7 +87,6 @@ static const ControlInfoMap::Map ipaControls{ { &controls::Sharpness, ControlInfo(0.0f, 16.0f, 1.0f) }, { &controls::ColourCorrectionMatrix, ControlInfo(-16.0f, 16.0f) }, { &controls::ScalerCrop, ControlInfo(Rectangle{}, Rectangle(65535, 65535, 65535, 65535), Rectangle{}) }, - { &controls::FrameDurationLimits, ControlInfo(INT64_C(1000), INT64_C(1000000000)) }, { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) } }; @@ -446,6 +443,27 @@ int IPARPi::configure(const IPACameraSensorInfo &sensorInfo, ASSERT(controls); *controls = std::move(ctrls); + /* + * Apply the correct limits to the exposure, gain and frame duration controls + * based on the current sensor mode. + */ + ControlInfoMap::Map ctrlMap = ipaControls; + const Duration minSensorFrameDuration = mode_.min_frame_length * mode_.line_length; + const Duration maxSensorFrameDuration = mode_.max_frame_length * mode_.line_length; + ctrlMap.emplace(&controls::FrameDurationLimits, + ControlInfo(static_cast(minSensorFrameDuration.get()), + static_cast(maxSensorFrameDuration.get()))); + + ctrlMap.emplace(&controls::AnalogueGain, + ControlInfo(1.0f, static_cast(helper_->Gain(maxSensorGainCode_)))); + + const uint32_t exposureMin = sensorCtrls_.at(V4L2_CID_EXPOSURE).min().get(); + const uint32_t exposureMax = sensorCtrls_.at(V4L2_CID_EXPOSURE).max().get(); + ctrlMap.emplace(&controls::ExposureTime, + ControlInfo(static_cast(helper_->Exposure(exposureMin).get()), + static_cast(helper_->Exposure(exposureMax).get()))); + + result->controlInfo = ControlInfoMap(std::move(ctrlMap), controls::controls); return 0; } diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index d980c1a71dd8..4596f2babcea 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -940,6 +940,9 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config) /* Store the mode sensitivity for the application. */ data->properties_.set(properties::SensorSensitivity, result.modeSensitivity); + /* Update the controls that the Raspberry Pi IPA can handle. */ + data->controlInfo_ = result.controlInfo; + /* Setup the Video Mux/Bridge entities. */ for (auto &[device, link] : data->bridgeDevices_) { /*