From patchwork Wed May 21 12:53:27 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 23411 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 28D1DC31E9 for ; Wed, 21 May 2025 12:53:38 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 8AC9268D8E; Wed, 21 May 2025 14:53:35 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="t0NHxRQZ"; dkim-atps=neutral Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 6292B68D85 for ; Wed, 21 May 2025 14:53:31 +0200 (CEST) Received: by mail-wr1-x436.google.com with SMTP id ffacd0b85a97d-3a35919fa8bso2753336f8f.0 for ; Wed, 21 May 2025 05:53:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=raspberrypi.com; s=google; t=1747832011; x=1748436811; darn=lists.libcamera.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Ro6xXZVSsfDY1zwGPPTsbwHeqpAv0ev++txLt8duHVY=; b=t0NHxRQZ5Tk9Q6pB2tviOOdQ9SLYShqX1n2woTbXKkaSnf6uc44wfO1K2xsxX3mIh1 Dk0aZweYZRm1UsK0yZdS8XbePIXuqED1YggORnstvDhTfp94yVsjz9ehhsmSnFVEsHvH ac4qG0XaPqthuT/1ImGjv5jYWW5OUZDbeakzgcwKAz/PEjSFssNPyUDcMSLOAYAYEB/d r8Fd9xr6Yo/lhOlPxgfd+1OXJXaQwtB0Sp67+oth/xqFFhZr6WwvILdi+cZ9fbodTDmH ez58qW/SkV1uV8y7a/D3EsJQdV+xsxxRRmY4xUVGfw5mbT9Yq43K7vegQF1iL2NmGVQe 4hyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747832011; x=1748436811; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Ro6xXZVSsfDY1zwGPPTsbwHeqpAv0ev++txLt8duHVY=; b=IfOjmJZBCp3wAK78qFsHNusM5K6BQgHK9OaEeE3aZRjJpfhHCfg8TUHNjdZjxsC5c2 GROYCCNVS47+FE5wkJ2LW87g4vtBxGhFv/zhj5hXewrlJ+PeNxbmgu9KqMkrYkfiez/8 mrS3G4QeSdstLDtYeGxuJGS2sg7gi0uO/Wjyb3hWPPGcjyBrHEZy8rQ02f+3E7P4G4OB NT+csdz5Bq22n9kjQwDRCisSm0ATVOnkWTpCbUxKwK93rCeI29Q82SgXjDS44r5inmb4 EfnkooNT6NrO5yutlVAHm+FUwG7v2xSXgIfR7BTs9PjlAUuCmmn9yZ15N4J/IrbdMyco C/QQ== X-Gm-Message-State: AOJu0YyUh0im+sBos0HQDYHFqKdPdxJ59d3xpctOoBd/JB0kjzjjOQzR yKG6v7k3Vn0VZvCAKKD6ObkwYfyCjpr7DMdavvT+Z8Thq/Yv6QkrAT/lCv30ONcObaSuNtfw+8+ skM/twqk= X-Gm-Gg: ASbGncuLb+Smb8H4g4kLrWKjENtP0LAkfgHAsOacTMgIN61cf1uM0/jdakK/IKhGTZI aTipMAHqqLhd3yyvFbNz8/AAqF3zA4EhtwOfrG7aGGx05h9xHSqDMFTX1ppRTR/uGANp6RmPhDM EXTeb6oOMwUIovrpCApys52orNCCQIxdypujm8XPhiS3SGe5eAxJpwVhF6CX8Cg281tp4neMw7G C5R4nRj4BfbdDEv12tnPjaAxb4333N+LttyxPvpMNqeLqMSL1Ygh6uxAqaq4QCRN+GOhBAR34Da uO6BRuNRE68LhjS1+aUj4b4BFkQrasBtjCqp6NuqjUYNSws2UoY91qV/SsuECpn4kaL7QthMcKJ LOsADzTWMjk2zkyR/6w== X-Google-Smtp-Source: AGHT+IF3/JpUnR8kOX9nsqxmJXlAhtXE6PYzvz9ilUgs64ciThy/OUkffYjbKT1Aj7vbcKjj4ZuvGA== X-Received: by 2002:a05:6000:22c8:b0:3a3:76cd:3e80 with SMTP id ffacd0b85a97d-3a376cd4028mr7563807f8f.21.1747832010592; Wed, 21 May 2025 05:53:30 -0700 (PDT) Received: from raspberrypi.pitowers.org ([2a00:1098:3142:1f:ffc9:aff6:7f7f:893b]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-447f6f0556bsm67938395e9.12.2025.05.21.05.53.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 May 2025 05:53:30 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Cc: David Plowman Subject: [PATCH 1/1] libcamera: camera: Fix up the AeEnable control during Camera::start() Date: Wed, 21 May 2025 13:53:27 +0100 Message-Id: <20250521125327.6378-2-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250521125327.6378-1-david.plowman@raspberrypi.com> References: <20250521125327.6378-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" In Camera::queueRequest() the control list is updated transparently by converting AeEnable into ExposureTimeMode and AnalogueGainMode controls. However, this was not happening during Camera::start(), meaning that setting AeEnable there was having no effect. It should behave the same here too. Fixes: 7abd4139051c ("libcamera: camera: Pre-process AeEnable control") Signed-off-by: David Plowman Reviewed-by: Paul Elder --- include/libcamera/camera.h | 2 ++ src/libcamera/camera.cpp | 57 +++++++++++++++++++++++++------------- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index 94cee7bd..b24a2974 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -165,6 +165,8 @@ private: friend class FrameBufferAllocator; int exportFrameBuffers(Stream *stream, std::vector> *buffers); + + void patchControlList(ControlList &controls); }; } /* namespace libcamera */ diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index c180a5fd..23b9207a 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -1266,6 +1266,33 @@ std::unique_ptr Camera::createRequest(uint64_t cookie) return request; } +/** + * \brief Patch a control list that contains the AeEnable control + * \param[inout] controls The control list to be patched + * + * The control list is patched in place, turning the AeEnable control into + * the equivalent ExposureTimeMode/AnalogueGainMode controls. + */ +void Camera::patchControlList(ControlList &controls) +{ + const auto &aeEnable = controls.get(controls::AeEnable); + if (aeEnable) { + if (_d()->controlInfo_.count(controls::AnalogueGainMode.id()) && + !controls.contains(controls::AnalogueGainMode.id())) { + controls.set(controls::AnalogueGainMode, + *aeEnable ? controls::AnalogueGainModeAuto + : controls::AnalogueGainModeManual); + } + + if (_d()->controlInfo_.count(controls::ExposureTimeMode.id()) && + !controls.contains(controls::ExposureTimeMode.id())) { + controls.set(controls::ExposureTimeMode, + *aeEnable ? controls::ExposureTimeModeAuto + : controls::ExposureTimeModeManual); + } + } +} + /** * \brief Queue a request to the camera * \param[in] request The request to queue to the camera @@ -1329,23 +1356,7 @@ int Camera::queueRequest(Request *request) } /* Pre-process AeEnable. */ - ControlList &controls = request->controls(); - const auto &aeEnable = controls.get(controls::AeEnable); - if (aeEnable) { - if (_d()->controlInfo_.count(controls::AnalogueGainMode.id()) && - !controls.contains(controls::AnalogueGainMode.id())) { - controls.set(controls::AnalogueGainMode, - *aeEnable ? controls::AnalogueGainModeAuto - : controls::AnalogueGainModeManual); - } - - if (_d()->controlInfo_.count(controls::ExposureTimeMode.id()) && - !controls.contains(controls::ExposureTimeMode.id())) { - controls.set(controls::ExposureTimeMode, - *aeEnable ? controls::ExposureTimeModeAuto - : controls::ExposureTimeModeManual); - } - } + patchControlList(request->controls()); d->pipe_->invokeMethod(&PipelineHandler::queueRequest, ConnectionTypeQueued, request); @@ -1383,8 +1394,16 @@ int Camera::start(const ControlList *controls) ASSERT(d->requestSequence_ == 0); - ret = d->pipe_->invokeMethod(&PipelineHandler::start, - ConnectionTypeBlocking, this, controls); + if (controls) { + ControlList copy(*controls); + patchControlList(copy); + ret = d->pipe_->invokeMethod(&PipelineHandler::start, + ConnectionTypeBlocking, this, ©); + } + else + ret = d->pipe_->invokeMethod(&PipelineHandler::start, + ConnectionTypeBlocking, this, nullptr); + if (ret) return ret;