From patchwork Thu Apr 8 13:36:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 11873 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 56EFCBD16B for ; Thu, 8 Apr 2021 13:36:44 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 90EA768800; Thu, 8 Apr 2021 15:36:43 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="CaoJTeD+"; dkim-atps=neutral Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id CD4EB602CC for ; Thu, 8 Apr 2021 15:36:41 +0200 (CEST) Received: by mail-wr1-x431.google.com with SMTP id a4so2191288wrr.2 for ; Thu, 08 Apr 2021 06:36:41 -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=AQav4R2q5Pmtad2u5QffIsZ0yQgPDaIh0eB6DfyPay8=; b=CaoJTeD+yxDhoek3PfysPemkHVQIhRagg0YzDC4J+gRDJD1fZQflj6QT7dTS7Vrkz+ AM5qxmCp+elFhsSR57/D6gDaTe7PWFIQK6UV8NQPspmxf3YTTGM4IPoEld4BExLMXs+k VUP3AhdlFNciRaWxOKtPqTzHwiB/B7ErVZLHPhrXIUgSdNsKaITZU+QW0NKiSANKDPH+ 2FFE7z0/UC/klvUa05oki9ngqQjoTmULhKuoVOSe3oq/jkfleIUbyCSkwnddh8FM+6C5 FvstviJ0jNw0CdGQS7RlcmC1PVO5SAU+gas34BOAevvm2bXsOVZjL/0+Fg3wEePJ0azx LoZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=AQav4R2q5Pmtad2u5QffIsZ0yQgPDaIh0eB6DfyPay8=; b=IAF8wlKOdqDnjkWenwyXJTWMnD/IP3ydhV1Mc0jWAbE2njvudd5LduRK4I89MtZVn7 HtuewXlNM651/ixSouK81/7aVg8/sq1pqmN1yD0zaFUoY6XTCtiwvbcRcolk7teGA1bK 6Fb15PGgY/gc9WGOk7QiXS14zOsWENP6y83Nno0CTS/FSl9WOLydzgkqVd4MpOQHTGAc xGAQF1h6W/8dPbimuIXNqv94jZSGUUnwWjchA/dJUXxyx6TF1qA8Ry2TY3kKyRxWdeYe Id2dZma2iEqwVQk7WwTzbuW6DuFG7Nwp7/iwPQNAseduLDjqXL4OnA5OrEU9dUiNKZjr XONA== X-Gm-Message-State: AOAM530hmDiK6Z4q1r1ktgsnRiHZ1CtgaslRC5rV8fU/P/Q3On8nfso9 yuQCa0xMOzYbdH8o2HUYDukf4DvKBuFsmw== X-Google-Smtp-Source: ABdhPJyLpZUgqJq7EiIKMiufH6xY18MWfh+PPKuVRcZQb4ZW8UNVL40d0am5HtUhDPtU9cl14H/y5A== X-Received: by 2002:adf:fb0b:: with SMTP id c11mr11491354wrr.425.1617889001378; Thu, 08 Apr 2021 06:36:41 -0700 (PDT) Received: from pi4-davidp.lan (plowpeople3.plus.com. [80.229.223.72]) by smtp.gmail.com with ESMTPSA id z18sm13132522wmc.27.2021.04.08.06.36.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 08 Apr 2021 06:36:40 -0700 (PDT) From: David Plowman To: libcamera-devel@lists.libcamera.org Date: Thu, 8 Apr 2021 14:36:34 +0100 Message-Id: <20210408133634.16815-4-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210408133634.16815-1-david.plowman@raspberrypi.com> References: <20210408133634.16815-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 3/3] ipa: raspberrypi: Update sensor's RED/BLUE balance controls when present 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" If the sensor exposes V4L2_CID_RED_BALANCE and V4L2_CID_BLUE_BALANCE controls, assume it wants to be told the colour gains. We want these to be applied as soon as possible so we add a new setSensorControls signal to the IPA which passes these back to the pipeline handler without using the DelayedControls mechanism. Signed-off-by: David Plowman Reviewed-by: Kieran Bingham --- include/libcamera/ipa/raspberrypi.mojom | 1 + src/ipa/raspberrypi/raspberrypi.cpp | 13 +++++++++++++ src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 10 ++++++++++ 3 files changed, 24 insertions(+) diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom index f38c2261..ebaf0a04 100644 --- a/include/libcamera/ipa/raspberrypi.mojom +++ b/include/libcamera/ipa/raspberrypi.mojom @@ -117,6 +117,7 @@ interface IPARPiEventInterface { statsMetadataComplete(uint32 bufferId, ControlList controls); runIsp(uint32 bufferId); embeddedComplete(uint32 bufferId); + setSensorControls(ControlList controls); setIspControls(ControlList controls); setDelayedControls(ControlList controls); }; diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp index dad6395f..f95896d2 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -1036,6 +1036,19 @@ void IPARPi::processStats(unsigned int bufferId) setDelayedControls.emit(ctrls); } + + struct AwbStatus awbStatus; + if (rpiMetadata_.Get("awb.status", awbStatus) == 0 && + sensorCtrls_.find(V4L2_CID_RED_BALANCE) != sensorCtrls_.end() && + sensorCtrls_.find(V4L2_CID_BLUE_BALANCE) != sensorCtrls_.end()) { + ControlList ctrls(sensorCtrls_); + ctrls.set(V4L2_CID_RED_BALANCE, + static_cast(helper_->ColourGainCode(awbStatus.gain_r))); + ctrls.set(V4L2_CID_BLUE_BALANCE, + static_cast(helper_->ColourGainCode(awbStatus.gain_b))); + + setSensorControls.emit(ctrls); + } } void IPARPi::applyAWB(const struct AwbStatus *awbStatus, ControlList &ctrls) diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp index f22e286e..8dae4912 100644 --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp @@ -152,6 +152,7 @@ public: void statsMetadataComplete(uint32_t bufferId, const ControlList &controls); void runIsp(uint32_t bufferId); void embeddedComplete(uint32_t bufferId); + void setSensorControls(const ControlList &controls); void setIspControls(const ControlList &controls); void setDelayedControls(const ControlList &controls); @@ -1219,6 +1220,7 @@ int RPiCameraData::loadIPA(ipa::RPi::SensorConfig *sensorConfig) ipa_->statsMetadataComplete.connect(this, &RPiCameraData::statsMetadataComplete); ipa_->runIsp.connect(this, &RPiCameraData::runIsp); ipa_->embeddedComplete.connect(this, &RPiCameraData::embeddedComplete); + ipa_->setSensorControls.connect(this, &RPiCameraData::setSensorControls); ipa_->setIspControls.connect(this, &RPiCameraData::setIspControls); ipa_->setDelayedControls.connect(this, &RPiCameraData::setDelayedControls); @@ -1361,6 +1363,14 @@ void RPiCameraData::embeddedComplete(uint32_t bufferId) handleState(); } +void RPiCameraData::setSensorControls(const ControlList &controls) +{ + ControlList ctrls = controls; + + unicam_[Unicam::Image].dev()->setControls(&ctrls); + handleState(); +} + void RPiCameraData::setIspControls(const ControlList &controls) { ControlList ctrls = controls;