From patchwork Tue Sep 28 07:49:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 13960 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 76164BDC71 for ; Tue, 28 Sep 2021 07:50:18 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3457F69191; Tue, 28 Sep 2021 09:50:18 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Szw4GfhU"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 451E96918C for ; Tue, 28 Sep 2021 09:50:16 +0200 (CEST) Received: from pyrite.rasen.tech (unknown [IPv6:2400:4051:61:600:2c71:1b79:d06d:5032]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B12233F1; Tue, 28 Sep 2021 09:50:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1632815415; bh=QzGM2k8AjSMrdfc0gNzEgdnJXXFC8yzw1gJYu+nieYM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Szw4GfhUMoa3V20UVSNSCFr1sZWrk/2jczkKnpZAOqhkHYRvwpA72DONvwSIqMVi5 lzaw2Dxw2RvV/DCeoYNHv0TgvCg9Q8ldJk8jzOlY9YjBG1jkafNgJaYR6EZnVzvhww hFkMWxQ1xWTcDKEqt+4QX8hj7YW4h6jmVoMBB60g= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Tue, 28 Sep 2021 16:49:56 +0900 Message-Id: <20210928074959.3489544-2-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210928074959.3489544-1-paul.elder@ideasonboard.com> References: <20210928074959.3489544-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 1/4] libcamera: pipeline: uvcvideo: Support the new AE 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add support for the new AE controls in the uvcvideo pipeline handler. Signed-off-by: Paul Elder --- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 35 +++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index 264f5370..c227d885 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -268,7 +268,9 @@ int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id, cid = V4L2_CID_CONTRAST; else if (id == controls::Saturation) cid = V4L2_CID_SATURATION; - else if (id == controls::AeEnable) + else if (id == controls::ExposureTimeMode) + cid = V4L2_CID_EXPOSURE_AUTO; + else if (id == controls::AnalogueGainMode) cid = V4L2_CID_EXPOSURE_AUTO; else if (id == controls::ExposureTime) cid = V4L2_CID_EXPOSURE_ABSOLUTE; @@ -302,9 +304,33 @@ int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id, } case V4L2_CID_EXPOSURE_AUTO: { - int32_t ivalue = value.get() + bool exposureSet = controls->contains(V4L2_CID_EXPOSURE_AUTO); + + /* \todo Make this nicer. */ + int32_t ivalue; + if (id == controls::ExposureTimeMode && exposureSet) { + int32_t exposureMode = controls->get(V4L2_CID_EXPOSURE_AUTO); + ivalue = value.get() == ExposureTimeModeAuto + ? (exposureMode == V4L2_EXPOSURE_SHUTTER_PRIORITY + ? V4L2_EXPOSURE_AUTO + : V4L2_EXPOSURE_APERTURE_PRIORITY) + : V4L2_EXPOSURE_MANUAL; + } else if (id == controls::ExposureTimeMode && !exposureSet) { + ivalue = value.get() == ExposureTimeModeAuto ? V4L2_EXPOSURE_APERTURE_PRIORITY : V4L2_EXPOSURE_MANUAL; + } else if (id == controls::AnalogueGainMode && exposureSet) { + int32_t exposureMode = controls->get(V4L2_CID_EXPOSURE_AUTO); + ivalue = value.get() == AnalogueGainModeAuto + ? (exposureMode == V4L2_EXPOSURE_APERTURE_PRIORITY + ? V4L2_EXPOSURE_AUTO + : V4L2_EXPOSURE_SHUTTER_PRIORITY) + : V4L2_EXPOSURE_MANUAL; + } else if (id == controls::AnalogueGainMode && !exposureSet) { + ivalue = value.get() == AnalogueGainModeAuto + ? V4L2_EXPOSURE_SHUTTER_PRIORITY + : V4L2_EXPOSURE_MANUAL; + } controls->set(V4L2_CID_EXPOSURE_AUTO, ivalue); break; } @@ -559,7 +585,7 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info, id = &controls::Saturation; break; case V4L2_CID_EXPOSURE_AUTO: - id = &controls::AeEnable; + id = &controls::ExposureTimeMode; break; case V4L2_CID_EXPOSURE_ABSOLUTE: id = &controls::ExposureTime; @@ -610,7 +636,8 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info, break; case V4L2_CID_EXPOSURE_AUTO: - info = ControlInfo{ false, true, true }; + info = ControlInfo{ { ExposureTimeModeAuto, ExposureTimeModeDisabled }, + ExposureTimeModeDisabled }; break; case V4L2_CID_EXPOSURE_ABSOLUTE: From patchwork Tue Sep 28 07:49:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 13961 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 0723DBDC71 for ; Tue, 28 Sep 2021 07:50:21 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B9C6869193; Tue, 28 Sep 2021 09:50:20 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="BglQDsbl"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 006BC6918B for ; Tue, 28 Sep 2021 09:50:17 +0200 (CEST) Received: from pyrite.rasen.tech (unknown [IPv6:2400:4051:61:600:2c71:1b79:d06d:5032]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 8C6313F6; Tue, 28 Sep 2021 09:50:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1632815417; bh=jmN6IIaNhDD+vaYXmVAhwXMLVZyuUaWQdDJb0Op7NPI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BglQDsblhWPLHQiCXu4Jos/Nv4h+SO6jGSDkfT/SHpM4qxBRRAEaRVWOISmLD71jb d7nkJjZjPXir0Y1w9UsISGy0ZB0oVIWmX0xC4kjJ2zkaoYKzhhrX6sPaxwtKytUgZ5 W4iLyOCIAmxbrblxMBuyFZPhMM6mKEuOqpB5ANYQ= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Tue, 28 Sep 2021 16:49:57 +0900 Message-Id: <20210928074959.3489544-3-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210928074959.3489544-1-paul.elder@ideasonboard.com> References: <20210928074959.3489544-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 2/4] libcamera: pipeline: raspberrypi: Support the new AE 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add support for the new AE controls in the raspberrypi pipeline handler, and in the IPA. Signed-off-by: Paul Elder --- This is very hacky. I wasn't sure what the best way was to plumb it into the raspberrypi IPA as it was a bit hairy... --- include/libcamera/ipa/raspberrypi.h | 3 +- src/ipa/raspberrypi/controller/rpi/agc.cpp | 18 ++++++++- src/ipa/raspberrypi/controller/rpi/agc.hpp | 5 +++ src/ipa/raspberrypi/raspberrypi.cpp | 42 ++++++++++++++++---- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 17 ++++---- 5 files changed, 67 insertions(+), 18 deletions(-) diff --git a/include/libcamera/ipa/raspberrypi.h b/include/libcamera/ipa/raspberrypi.h index 521eaecd..363ea038 100644 --- a/include/libcamera/ipa/raspberrypi.h +++ b/include/libcamera/ipa/raspberrypi.h @@ -28,8 +28,9 @@ namespace RPi { * unsupported control is encountered. */ static const ControlInfoMap Controls({ - { &controls::AeEnable, ControlInfo(false, true) }, + { &controls::ExposureTimeMode, ControlInfo(controls::ExposureTimeModeValues) }, { &controls::ExposureTime, ControlInfo(0, 999999) }, + { &controls::AnalogueGainMode, ControlInfo(controls::AnalogueGainModeValues) }, { &controls::AnalogueGain, ControlInfo(1.0f, 32.0f) }, { &controls::AeMeteringMode, ControlInfo(controls::AeMeteringModeValues) }, { &controls::AeConstraintMode, ControlInfo(controls::AeConstraintModeValues) }, diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp index 289c1fce..b45ea454 100644 --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp @@ -203,14 +203,30 @@ bool Agc::IsPaused() const } void Agc::Pause() +{ +} + +void Agc::Resume() +{ +} + +void Agc::PauseExposure() { fixed_shutter_ = status_.shutter_time; +} + +void Agc::PauseGain() +{ fixed_analogue_gain_ = status_.analogue_gain; } -void Agc::Resume() +void Agc::ResumeExposure() { fixed_shutter_ = 0s; +} + +void Agc::ResumeGain() +{ fixed_analogue_gain_ = 0; } diff --git a/src/ipa/raspberrypi/controller/rpi/agc.hpp b/src/ipa/raspberrypi/controller/rpi/agc.hpp index 82063636..7ca3ca2f 100644 --- a/src/ipa/raspberrypi/controller/rpi/agc.hpp +++ b/src/ipa/raspberrypi/controller/rpi/agc.hpp @@ -92,6 +92,11 @@ public: void Prepare(Metadata *image_metadata) override; void Process(StatisticsPtr &stats, Metadata *image_metadata) override; + void PauseExposure(); + void PauseGain(); + void ResumeExposure(); + void ResumeGain(); + private: void updateLockStatus(DeviceStatus const &device_status); AgcConfig config_; diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp index 047123ab..99935515 100644 --- a/src/ipa/raspberrypi/raspberrypi.cpp +++ b/src/ipa/raspberrypi/raspberrypi.cpp @@ -53,6 +53,8 @@ #include "sharpen_algorithm.hpp" #include "sharpen_status.h" +#include "controller/rpi/agc.hpp" + namespace libcamera { using namespace std::literals::chrono_literals; @@ -478,7 +480,10 @@ void IPARPi::reportMetadata() AgcStatus *agcStatus = rpiMetadata_.GetLocked("agc.status"); if (agcStatus) { - libcameraMetadata_.set(controls::AeLocked, agcStatus->locked); + libcameraMetadata_.set(controls::AeState, + agcStatus->locked ? + controls::AeStateConverged : + controls::AeStateSearching); libcameraMetadata_.set(controls::DigitalGain, agcStatus->digital_gain); } @@ -623,20 +628,22 @@ void IPARPi::queueRequest(const ControlList &controls) << " = " << ctrl.second.toString(); switch (ctrl.first) { - case controls::AE_ENABLE: { - RPiController::Algorithm *agc = controller_.GetAlgorithm("agc"); + case controls::EXPOSURE_TIME_MODE: { + RPiController::Algorithm *algo = controller_.GetAlgorithm("agc"); + RPiController::Agc *agc = reinterpret_cast(algo); if (!agc) { LOG(IPARPI, Warning) - << "Could not set AE_ENABLE - no AGC algorithm"; + << "Could not set EXPOSURE_TIME_MODE - no AGC algorithm"; break; } - if (ctrl.second.get() == false) - agc->Pause(); + if (ctrl.second.get() == controls::ExposureTimeModeDisabled) + agc->PauseExposure(); else - agc->Resume(); + agc->ResumeExposure(); - libcameraMetadata_.set(controls::AeEnable, ctrl.second.get()); + libcameraMetadata_.set(controls::ExposureTimeMode, + ctrl.second.get()); break; } @@ -656,6 +663,25 @@ void IPARPi::queueRequest(const ControlList &controls) break; } + case controls::ANALOGUE_GAIN_MODE: { + RPiController::Algorithm *algo = controller_.GetAlgorithm("agc"); + RPiController::Agc *agc = reinterpret_cast(algo); + if (!agc) { + LOG(IPARPI, Warning) + << "Could not set ANALOGUE_GAIN_MODE - no AGC algorithm"; + break; + } + + if (ctrl.second.get() == controls::AnalogueGainModeDisabled) + agc->PauseGain(); + else + agc->ResumeGain(); + + libcameraMetadata_.set(controls::AnalogueGainMode, + ctrl.second.get()); + break; + } + case controls::ANALOGUE_GAIN: { RPiController::AgcAlgorithm *agc = dynamic_cast( controller_.GetAlgorithm("agc")); diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index c227d885..3a9c3b8d 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -309,25 +309,25 @@ int PipelineHandlerUVC::processControl(ControlList *controls, unsigned int id, /* \todo Make this nicer. */ int32_t ivalue; if (id == controls::ExposureTimeMode && exposureSet) { - int32_t exposureMode = controls->get(V4L2_CID_EXPOSURE_AUTO); - ivalue = value.get() == ExposureTimeModeAuto + int32_t exposureMode = controls->get(V4L2_CID_EXPOSURE_AUTO).get(); + ivalue = value.get() == controls::ExposureTimeModeAuto ? (exposureMode == V4L2_EXPOSURE_SHUTTER_PRIORITY ? V4L2_EXPOSURE_AUTO : V4L2_EXPOSURE_APERTURE_PRIORITY) : V4L2_EXPOSURE_MANUAL; } else if (id == controls::ExposureTimeMode && !exposureSet) { - ivalue = value.get() == ExposureTimeModeAuto + ivalue = value.get() == controls::ExposureTimeModeAuto ? V4L2_EXPOSURE_APERTURE_PRIORITY : V4L2_EXPOSURE_MANUAL; } else if (id == controls::AnalogueGainMode && exposureSet) { - int32_t exposureMode = controls->get(V4L2_CID_EXPOSURE_AUTO); - ivalue = value.get() == AnalogueGainModeAuto + int32_t exposureMode = controls->get(V4L2_CID_EXPOSURE_AUTO).get(); + ivalue = value.get() == controls::AnalogueGainModeAuto ? (exposureMode == V4L2_EXPOSURE_APERTURE_PRIORITY ? V4L2_EXPOSURE_AUTO : V4L2_EXPOSURE_SHUTTER_PRIORITY) : V4L2_EXPOSURE_MANUAL; } else if (id == controls::AnalogueGainMode && !exposureSet) { - ivalue = value.get() == AnalogueGainModeAuto + ivalue = value.get() == controls::AnalogueGainModeAuto ? V4L2_EXPOSURE_SHUTTER_PRIORITY : V4L2_EXPOSURE_MANUAL; } @@ -636,8 +636,9 @@ void UVCCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info, break; case V4L2_CID_EXPOSURE_AUTO: - info = ControlInfo{ { ExposureTimeModeAuto, ExposureTimeModeDisabled }, - ExposureTimeModeDisabled }; + info = ControlInfo{ { controls::ExposureTimeModeAuto, + controls::ExposureTimeModeDisabled }, + controls::ExposureTimeModeDisabled }; break; case V4L2_CID_EXPOSURE_ABSOLUTE: From patchwork Tue Sep 28 07:49:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 13962 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 954ACBDC71 for ; Tue, 28 Sep 2021 07:50:21 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 490496918C; Tue, 28 Sep 2021 09:50:21 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="wAmPojR1"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id CE37D69185 for ; Tue, 28 Sep 2021 09:50:19 +0200 (CEST) Received: from pyrite.rasen.tech (unknown [IPv6:2400:4051:61:600:2c71:1b79:d06d:5032]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 649763F1; Tue, 28 Sep 2021 09:50:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1632815419; bh=eEP8l/MkHcy0nHh00HjnWRpnzDbijz/4MV3PPuSCO/I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=wAmPojR1LNviztmZHIsmqRYODfPeAAuhsIr/IfRNDfX167w5zu64Wyqd33n4oVg/B AlpXMQiWM84EFSYqNG0nkCGy7O9NJKmpSpPOkI9sNA5l6WmJJC5Ecgt09hrdtoWkk/ HQilG/r/Y5PC0IEA+Sp/odkVORiiSk4/tDKXcVqs= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Tue, 28 Sep 2021 16:49:58 +0900 Message-Id: <20210928074959.3489544-4-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210928074959.3489544-1-paul.elder@ideasonboard.com> References: <20210928074959.3489544-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 3/4] test: ipa_data_serializer: Remove controls::AeEnable 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" Remove controls::AeEnable from the IPA data serializer test, as it is no longer an available control. Signed-off-by: Paul Elder --- test/serialization/ipa_data_serializer_test.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/serialization/ipa_data_serializer_test.cpp b/test/serialization/ipa_data_serializer_test.cpp index 5fcdcb8e..85ad4d04 100644 --- a/test/serialization/ipa_data_serializer_test.cpp +++ b/test/serialization/ipa_data_serializer_test.cpp @@ -33,7 +33,6 @@ using namespace std; using namespace libcamera; static const ControlInfoMap Controls = ControlInfoMap({ - { &controls::AeEnable, ControlInfo(false, true) }, { &controls::ExposureTime, ControlInfo(0, 999999) }, { &controls::AnalogueGain, ControlInfo(1.0f, 32.0f) }, { &controls::ColourGains, ControlInfo(0.0f, 32.0f) }, From patchwork Tue Sep 28 07:49:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 13963 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 13405BDC71 for ; Tue, 28 Sep 2021 07:50:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D0A9D69193; Tue, 28 Sep 2021 09:50:23 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="nf0fdBXe"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id ACB146918B for ; Tue, 28 Sep 2021 09:50:21 +0200 (CEST) Received: from pyrite.rasen.tech (unknown [IPv6:2400:4051:61:600:2c71:1b79:d06d:5032]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3E8223F1; Tue, 28 Sep 2021 09:50:19 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1632815421; bh=UMnRQBd2/OGg6MZtecUw6vLiP8qMq84DrU911k08lvE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nf0fdBXeYR35HUtB7VVNhuu5yD5Nur5WE4k+5H+15HbCFucjDYqTHzkQNuvyT1nHd 22nUUx6abFh8ZZz7TYZ9+te/AiR5DlLJeesOldSX6BTMjfeUTPoWG1xvfJxDFOJpfB gKjKMoIJxRb5hAM/lryA1hsuyI8B3ePdW8jmX7/o= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Tue, 28 Sep 2021 16:49:59 +0900 Message-Id: <20210928074959.3489544-5-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210928074959.3489544-1-paul.elder@ideasonboard.com> References: <20210928074959.3489544-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH 4/4] libcamera: pipeline: rkisp1: Support the new AE 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: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add support for the new AE controls in the rkisp1 pipeline handler, and in the IPA. Signed-off-by: Paul Elder --- It seems that the rkisp1 pipeline handler doesn't properly expose its control capabilities? And even though it exposed AeEnable with both true and false it didn't expose or handle AnalogueGain nor ExposureTime either? So I just simply replaced AeEnable with ExposureTimeMode for now. --- src/ipa/rkisp1/rkisp1.cpp | 18 ++++++++++-------- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp index bf2c13b6..708adfc9 100644 --- a/src/ipa/rkisp1/rkisp1.cpp +++ b/src/ipa/rkisp1/rkisp1.cpp @@ -52,7 +52,7 @@ private: const rkisp1_stat_buffer *stats); void setControls(unsigned int frame); - void metadataReady(unsigned int frame, unsigned int aeState); + void metadataReady(unsigned int frame, int aeState); std::map buffers_; std::map mappedBuffers_; @@ -221,8 +221,9 @@ void IPARkISP1::queueRequest(unsigned int frame, rkisp1_params_cfg *params, memset(params, 0, sizeof(*params)); /* Auto Exposure on/off. */ - if (controls.contains(controls::AeEnable)) { - autoExposure_ = controls.get(controls::AeEnable); + if (controls.contains(controls::ExposureTimeMode)) { + autoExposure_ = (controls.get(controls::ExposureTimeMode) == + controls::ExposureTimeModeAuto); if (autoExposure_) params->module_ens = RKISP1_CIF_ISP_MODULE_AEC; @@ -239,7 +240,7 @@ void IPARkISP1::updateStatistics(unsigned int frame, const rkisp1_stat_buffer *stats) { const rkisp1_cif_isp_stat *params = &stats->params; - unsigned int aeState = 0; + int aeState = controls::AeStateInactive; if (stats->meas_type & RKISP1_CIF_ISP_STAT_AUTOEXP) { const rkisp1_cif_isp_ae_stat *ae = ¶ms->ae; @@ -274,7 +275,9 @@ void IPARkISP1::updateStatistics(unsigned int frame, setControls(frame + 1); } - aeState = fabs(factor - 1.0f) < 0.05f ? 2 : 1; + aeState = fabs(factor - 1.0f) < 0.05f ? + controls::AeStateConverged : + controls::AeStateSearching; } metadataReady(frame, aeState); @@ -293,12 +296,11 @@ void IPARkISP1::setControls(unsigned int frame) queueFrameAction.emit(frame, op); } -void IPARkISP1::metadataReady(unsigned int frame, unsigned int aeState) +void IPARkISP1::metadataReady(unsigned int frame, int aeState) { ControlList ctrls(controls::controls); - if (aeState) - ctrls.set(controls::AeLocked, aeState == 2); + ctrls.set(controls::AeState, aeState); RkISP1Action op; op.op = ActionMetadata; diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 98008862..1ed4522f 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -935,8 +935,8 @@ int PipelineHandlerRkISP1::createCamera(MediaEntity *sensor) ControlInfoMap::Map ctrls; ctrls.emplace(std::piecewise_construct, - std::forward_as_tuple(&controls::AeEnable), - std::forward_as_tuple(false, true)); + std::forward_as_tuple(&controls::ExposureTimeMode), + std::forward_as_tuple(ControlInfo(controls::AeExposureModeValues))); data->controlInfo_ = ControlInfoMap(std::move(ctrls), controls::controls);