From patchwork Wed Jun 22 10:20:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 16308 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 85050BD808 for ; Wed, 22 Jun 2022 10:21:04 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 5185B65640; Wed, 22 Jun 2022 12:21:04 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1655893264; bh=2tme2r25E6v8Hd+ZFkt14xUEx8o8WHikpVKgnqRQj7c=; 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=ga0Y1Yp5loKlACzqILVjGM7MQSj4kbB1WotjIf5JXU/w8HSF2NdBm1Boz1luF5UIl qg5/ygVFhGVfEJ5plu1q+6tI2Vh2Al3kPzn+1rHTYh8xSWpzNutKfvGOAro6UNXDIv bcHKJFr6D7Eu4NHkDVMxDY3GVfuCMY2MCu5/HzNtKRQUEPdzAIxA1UsFnw5vjMNbQf AvhD2JZCFNNh3+HWH4ZedBBasIR5Uvz3Zu7zA0LDAAB9bqCu/oEwPIZBCIW1SFVaSV wvk5zWJjMG/OxI2/gv6MgaYrdquP2t7VUIul1j+r9tA/BKWbhVLrWapRNuxKqeub2h G4nL/aTQRW6fA== Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 9E97B65638 for ; Wed, 22 Jun 2022 12:20:59 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="aMlY+3Ae"; dkim-atps=neutral Received: by mail-wr1-x42f.google.com with SMTP id i10so18944992wrc.0 for ; Wed, 22 Jun 2022 03:20:59 -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=hEvVAIMRDdzIdQ1Up9tQJGX/dynhotDpdpBJ2vFJbEs=; b=aMlY+3Aed3/2vFAjbVhtfpj9gUD2OD3bXTXc99zuAs4VVQg2dFk4WOox4zs5124XZ9 FTUNH1tkQ4rcBwEpEtCSj+I0Iv77QMagUwgAi9PZu0opdhDNShWE3riGScgZRAsAd4jI Dt3TzxIiJ0AoLiQN7xeHQXyr3/ocJ9hZIqmqnjwkxcT1tLrN6+p/JL/4Uxevd5kWRf4c 5VRHI3ZXERGNVjEwHttjLESPYVFLfd7n7c8Ve56PFNXLOLt11nph2z7pKDrZUiYqJ7Xp lrVBCyKOAuclkxYWY0fRMxzXEImQIBt5zZYtCrjxyEyhnPiWQvjxn/oc848XvWeKVj9m yzgQ== 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=hEvVAIMRDdzIdQ1Up9tQJGX/dynhotDpdpBJ2vFJbEs=; b=AoZQRLt0Da0Fl1ljeincaQQfuMlwsOHemfD6X8A3FzcSGccXCKJBih8Eufno0Kl0e3 Qljf44sA3sSMeqFqD9hvFLb2KweVBhXpaQPYxVBLPK8oe43kNzjfdtY5rQsD2BO7bOk3 26HrzRFEgvMeREGSjKTh9eG58hMIsqApaB9ge7dF3UqZzSqDj5STbfxLa2LqqdLjIGWt SybY/umtueJqx6e8faNS798wrAeN5P5bJbEfp+khIawzFLw2K/Om1+E1oizBwr9eT/Ks V8pNGv5BqByklagz61mDTgEsRJ7MPUYDIkFWa7E+TbWsTlvzNZF3Y1KjauBRLkT9iJAl s5Qg== X-Gm-Message-State: AJIora+JbPHygHJMJ2RqC2HFRgrMUxgqYP+0uxudKQD9ICRc3fr6Ne3v /6VaS8H0yszFp7B7odztQLBnL2Jvdticoof7 X-Google-Smtp-Source: AGRyM1sK6kD1Gkhy3ezL5g8h7MHj5r+9uXOP5VUfU7zfc8XMDKGDv7n4q/hn8dccsjgtStae0Q+rag== X-Received: by 2002:a5d:6d8f:0:b0:219:b5cd:6516 with SMTP id l15-20020a5d6d8f000000b00219b5cd6516mr2583514wrs.246.1655893258704; Wed, 22 Jun 2022 03:20:58 -0700 (PDT) Received: from naush-laptop.localdomain ([88.97.76.4]) by smtp.gmail.com with ESMTPSA id h204-20020a1c21d5000000b0039c693a54ecsm26849423wmh.23.2022.06.22.03.20.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jun 2022 03:20:58 -0700 (PDT) To: libcamera-devel@lists.libcamera.org Date: Wed, 22 Jun 2022 11:20:46 +0100 Message-Id: <20220622102047.22492-3-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220622102047.22492-1-naush@raspberrypi.com> References: <20220622102047.22492-1-naush@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 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. Before the first call to Camera::configure(), this ControlInfoMap provides some reasonable default limits for ExposureTime, AnalogueGain, and FrameDurationLimits. However, applications must not rely on these values, but obtain the correct limits after the call to Camera::configure(). Signed-off-by: Naushir Patuck Reviewed-by: Kieran Bingham Reviewed-by: David Plowman --- include/libcamera/ipa/raspberrypi.mojom | 1 + src/ipa/raspberrypi/raspberrypi.cpp | 33 +++++++++++++++++-- .../pipeline/raspberrypi/raspberrypi.cpp | 3 ++ 3 files changed, 34 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..8f57350878cf 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -74,8 +74,8 @@ 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::ExposureTime, ControlInfo(0, 66666) }, + { &controls::AnalogueGain, ControlInfo(1.0f, 16.0f) }, { &controls::AeMeteringMode, ControlInfo(controls::AeMeteringModeValues) }, { &controls::AeConstraintMode, ControlInfo(controls::AeConstraintModeValues) }, { &controls::AeExposureMode, ControlInfo(controls::AeExposureModeValues) }, @@ -89,7 +89,7 @@ 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::FrameDurationLimits, ControlInfo(INT64_C(33333), INT64_C(120000)) }, { &controls::draft::NoiseReductionMode, ControlInfo(controls::draft::NoiseReductionModeValues) } }; @@ -446,6 +446,33 @@ 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[&controls::FrameDurationLimits] = + ControlInfo(static_cast(minSensorFrameDuration.get()), + static_cast(maxSensorFrameDuration.get())); + + ctrlMap[&controls::AnalogueGain] = + ControlInfo(1.0f, static_cast(helper_->Gain(maxSensorGainCode_))); + + /* + * Calculate the max exposure limit from the frame duration limit as V4L2 + * will limit the maximum control value based on the current VBLANK value. + */ + Duration maxShutter = Duration::max(); + helper_->GetVBlanking(maxShutter, minSensorFrameDuration, maxSensorFrameDuration); + const uint32_t exposureMin = sensorCtrls_.at(V4L2_CID_EXPOSURE).min().get(); + + ctrlMap[&controls::ExposureTime] = + ControlInfo(static_cast(helper_->Exposure(exposureMin).get()), + static_cast(maxShutter.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_) { /*