From patchwork Thu Nov 26 14:23:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Plowman X-Patchwork-Id: 10508 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 4C251BE08A for ; Thu, 26 Nov 2020 14:23:29 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C7C5763470; Thu, 26 Nov 2020 15:23:28 +0100 (CET) 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="CAGV+q2i"; dkim-atps=neutral Received: from mail-ej1-x62c.google.com (mail-ej1-x62c.google.com [IPv6:2a00:1450:4864:20::62c]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1B19D6346B for ; Thu, 26 Nov 2020 15:23:27 +0100 (CET) Received: by mail-ej1-x62c.google.com with SMTP id a16so3188080ejj.5 for ; Thu, 26 Nov 2020 06:23:27 -0800 (PST) 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=oSLgktFCKL+BD4JC3I/jRKa0iCz7TO1buKMoSeXAMkQ=; b=CAGV+q2iwlRvNpiEziER/ZDZs2wG5g1hpcfn/t7JbKI1EHaZplRKFc2k93mUOwP0Sn QS5zlR4TCWAZDtwMkMChK6BUGTN39cEe3nXp2obHWQ6UtdELdeZHfTn+gU3fTOX7+eBX 1QBGKkP2jUHEfIRUdgswCBU9xPvD6l28UlvyjYI89SUX00yxhse5jdi8XDH9S3Ho4dqF J84vpM14qxWq9KQTBMbD5j39h1kmTkR5vR/giQP0P8CSze3+ulwDmJ4qvXi+rdL0ASIk u3I5jX/wS7tdWn3oAtmjjkztFopKjq2sNSXyVjuVupV0Ywk3B5CZLTydPp1aujfChH94 /5sw== 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=oSLgktFCKL+BD4JC3I/jRKa0iCz7TO1buKMoSeXAMkQ=; b=ekrEyY9ucxXIudi8wx/JBOgWlXPrN6lJhJnwKjauMJDEg5sWXmvEqzrZIgZbDuiCRD GdT2phd13yczrOY2gh4JIs7eQAYqPchDk9hBY6KD3juSfT4ZE9eSeUMYzYR8hOpGUX0D oa/NQ2SFBUf4BYDR2nDoFBAqeQQcDtVeKFxMI1AIryqsy/Gbq2VGiKhpsEQRKGyazYS3 W8lwz4DyO6GFiVJRycBbvadUFUm19WtdSVEdfAwFxk8IJJV29Q/dU1w/Gz1vbCcF0QpR l+Xrr9qP+viOkZcBgJncf6mHFGCrkE2PzqBStpPFr9FOd9hWEanFlc4ECzvebW7xFeRh lG7A== X-Gm-Message-State: AOAM530UDzYSr5O7VNLFMC/fXLq31AiYSPWtxv7Rwm/37ZaBpDLUWhnJ C8l6jDTOBb4QDv/1NEGJCRpf2vMvX83XFWbL X-Google-Smtp-Source: ABdhPJzxafgF6I0RfUTSIlpm1uDXZ5p3L5aDOur4KBm7kgX5VesN/2wC1xOWwwwqleDRQ/13NyGQWw== X-Received: by 2002:a17:906:d92c:: with SMTP id rn12mr2874757ejb.472.1606400606434; Thu, 26 Nov 2020 06:23:26 -0800 (PST) Received: from pi4-davidp.lan (plowpeople3.plus.com. [80.229.223.72]) by smtp.gmail.com with ESMTPSA id f24sm3237003edx.90.2020.11.26.06.23.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Nov 2020 06:23:25 -0800 (PST) From: David Plowman To: libcamera-devel@lists.libcamera.org Date: Thu, 26 Nov 2020 14:23:19 +0000 Message-Id: <20201126142321.5563-3-david.plowman@raspberrypi.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20201126142321.5563-1-david.plowman@raspberrypi.com> References: <20201126142321.5563-1-david.plowman@raspberrypi.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 2/4] src: ipa: raspberrypi: agc: Make AGC handle Pause/Resume for itself 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" AGC, when paused, sets the last exposure/gain it wrote to be its "fixed" values and will therefore continue to return them. When resumed, we clear them so that both will float again. This approach is better because AGC can be paused and we can subsequently change (for example) the exposure and the gain won't float again. Signed-off-by: David Plowman Reviewed-by: Kieran Bingham Reviewed-by: Naushir Patuck Reviewed-by: Laurent Pinchart --- src/ipa/raspberrypi/controller/rpi/agc.cpp | 24 ++++++++++++++++++++++ src/ipa/raspberrypi/controller/rpi/agc.hpp | 4 ++++ 2 files changed, 28 insertions(+) diff --git a/src/ipa/raspberrypi/controller/rpi/agc.cpp b/src/ipa/raspberrypi/controller/rpi/agc.cpp index 30a1c1c1..9da18c31 100644 --- a/src/ipa/raspberrypi/controller/rpi/agc.cpp +++ b/src/ipa/raspberrypi/controller/rpi/agc.cpp @@ -184,6 +184,26 @@ void Agc::Read(boost::property_tree::ptree const ¶ms) exposure_mode_ = &config_.exposure_modes[exposure_mode_name_]; constraint_mode_name_ = config_.default_constraint_mode; constraint_mode_ = &config_.constraint_modes[constraint_mode_name_]; + // Set up the "last shutter/gain" values, in case AGC starts "disabled". + status_.shutter_time = config_.default_exposure_time; + status_.analogue_gain = config_.default_analogue_gain; +} + +bool Agc::IsPaused() const +{ + return false; +} + +void Agc::Pause() +{ + fixed_shutter_ = status_.shutter_time; + fixed_analogue_gain_ = status_.analogue_gain; +} + +void Agc::Resume() +{ + fixed_shutter_ = 0; + fixed_analogue_gain_ = 0; } void Agc::SetEv(double ev) @@ -199,11 +219,15 @@ void Agc::SetFlickerPeriod(double flicker_period) void Agc::SetFixedShutter(double fixed_shutter) { fixed_shutter_ = fixed_shutter; + // Set this in case someone calls Pause() straight after. + status_.shutter_time = fixed_shutter; } void Agc::SetFixedAnalogueGain(double fixed_analogue_gain) { fixed_analogue_gain_ = fixed_analogue_gain; + // Set this in case someone calls Pause() straight after. + status_.analogue_gain = fixed_analogue_gain; } void Agc::SetMeteringMode(std::string const &metering_mode_name) diff --git a/src/ipa/raspberrypi/controller/rpi/agc.hpp b/src/ipa/raspberrypi/controller/rpi/agc.hpp index 47ebb324..95db1812 100644 --- a/src/ipa/raspberrypi/controller/rpi/agc.hpp +++ b/src/ipa/raspberrypi/controller/rpi/agc.hpp @@ -70,6 +70,10 @@ public: Agc(Controller *controller); char const *Name() const override; void Read(boost::property_tree::ptree const ¶ms) override; + // AGC handles "pausing" for itself. + bool IsPaused() const override; + void Pause() override; + void Resume() override; void SetEv(double ev) override; void SetFlickerPeriod(double flicker_period) override; void SetFixedShutter(double fixed_shutter) override; // microseconds