From patchwork Thu May 28 14:51:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Naushir Patuck X-Patchwork-Id: 3872 Return-Path: Received: from mail-wm1-x341.google.com (mail-wm1-x341.google.com [IPv6:2a00:1450:4864:20::341]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A5402603D3 for ; Thu, 28 May 2020 16:51:42 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=raspberrypi.com header.i=@raspberrypi.com header.b="CkI6uBIe"; dkim-atps=neutral Received: by mail-wm1-x341.google.com with SMTP id j198so4674559wmj.0 for ; Thu, 28 May 2020 07:51:42 -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:mime-version :content-transfer-encoding; bh=jgXiadbZYvKLQndADklLass72kpnnq3zeVMnbuSWbvE=; b=CkI6uBIeBqyGrb2zfFqvCe+9KAqy/8X4Rgo5i+XTlBp6rBUZFgYoFQiiWvxB9lmzp2 8TqbgHjl+ZOU47oIAQ8zoBgJnHua+mFVZkvfhTCVJA7qHYkxy6bGnvodDn5jr11HzKPi D40K6T/U6nEgHYob1CWZHyTjF/JB+GYVMKuJI83kLaJvKSigH5ur1MNTbjD1/PGZK+mf x34/pZrlskQwIX6wK6XmecBCo276gM8LYzd3hKsikwSTa8Gi++sMlCq6LqrmnayHcmpy vpDVRblNgMvMim50TYouqFd2nyql5sUpB+yXI7hAFt8DGZ7/S/Q6KaMUoQJTL/wqaTMl koXg== 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:mime-version :content-transfer-encoding; bh=jgXiadbZYvKLQndADklLass72kpnnq3zeVMnbuSWbvE=; b=ivm2U68zhqOeDE/EQjoPBxae6tzAW2zkW9RTVJGQqmte6UhH3qj/Ag1VD2pzHtUEuH 2ydLrSsn2aGU/IQ00MUAuvG6pOefK7nc9wwPscbHcO/PsbKNoGdFQv9a85Q6o85QW7eU MaQYuD3cAKbJzePb/sC+bZI3su+sUfRBHHwi6/65CVgGrsMZz5PZ5yuqOg10xYh2uzFW Fe8Y9ttwBIvChO1ivvLFUbzjFTE3RtbDVP37QbD9DsBKoHMqa5LzhIfBCtpov2En+CbA us919THPBgEPP81b7bxuO11lyP4D/B4plJzDwAPqzzA+hz6O8FIyxaApHRr8e+ypi5pQ SQCg== X-Gm-Message-State: AOAM533NTyyJLAz8rF9ROaOuCZdPfJzvC3JRuBVLFn4colN01uKYll7F cpIqD5IDaKq3T8G6MPXxxpJlTHAJuugIXQ== X-Google-Smtp-Source: ABdhPJyev8ozBXADwDoKqJVo02czNy1g9dAWHXqJTk2oD5BsA9fqcWoyeckEjWMmLUhNIkMJ2qBFvw== X-Received: by 2002:a1c:3dd6:: with SMTP id k205mr2767319wma.87.1590677501675; Thu, 28 May 2020 07:51:41 -0700 (PDT) Received: from naushir-VirtualBox.patuck.local ([88.97.76.4]) by smtp.gmail.com with ESMTPSA id u23sm7284558wmu.20.2020.05.28.07.51.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 May 2020 07:51:40 -0700 (PDT) From: Naushir Patuck To: libcamera-devel@lists.libcamera.org Date: Thu, 28 May 2020 15:51:32 +0100 Message-Id: <20200528145132.96102-1-naush@raspberrypi.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH] ipa: rpi: Add "focus" algorithm 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-List-Received-Date: Thu, 28 May 2020 14:51:43 -0000 From: David Plowman Adds FocusStatus to the image metadata, containing contrast measurements across the image. Optionally also prints a contrast measure to the console, to aid in manual adjustment of the lens. Note that it is not an actual auto-focus algorithm that can drive a lens! Signed-off-by: David Plowman Signed-off-by: Naushir Patuck Reviewed-by: Laurent Pinchart --- src/ipa/raspberrypi/controller/focus_status.h | 26 ++++++++++ src/ipa/raspberrypi/controller/rpi/focus.cpp | 51 +++++++++++++++++++ src/ipa/raspberrypi/controller/rpi/focus.hpp | 31 +++++++++++ src/ipa/raspberrypi/data/imx477.json | 4 ++ src/ipa/raspberrypi/meson.build | 1 + 5 files changed, 113 insertions(+) create mode 100644 src/ipa/raspberrypi/controller/focus_status.h create mode 100644 src/ipa/raspberrypi/controller/rpi/focus.cpp create mode 100644 src/ipa/raspberrypi/controller/rpi/focus.hpp diff --git a/src/ipa/raspberrypi/controller/focus_status.h b/src/ipa/raspberrypi/controller/focus_status.h new file mode 100644 index 00000000..3ad88777 --- /dev/null +++ b/src/ipa/raspberrypi/controller/focus_status.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2020, Raspberry Pi (Trading) Limited + * + * focus_status.h - focus measurement status + */ +#pragma once + +#include + +// The focus algorithm should post the following structure into the image's +// "focus.status" metadata. Recall that it's only reporting focus (contrast) +// measurements, it's not driving any kind of auto-focus algorithm! + +#ifdef __cplusplus +extern "C" { +#endif + +struct FocusStatus { + int num; + uint32_t focus_measures[FOCUS_REGIONS]; +}; + +#ifdef __cplusplus +} +#endif diff --git a/src/ipa/raspberrypi/controller/rpi/focus.cpp b/src/ipa/raspberrypi/controller/rpi/focus.cpp new file mode 100644 index 00000000..d6cdc4bf --- /dev/null +++ b/src/ipa/raspberrypi/controller/rpi/focus.cpp @@ -0,0 +1,51 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2020, Raspberry Pi (Trading) Limited + * + * focus.cpp - focus algorithm + */ +#include + +#include "../focus_status.h" +#include "../logging.hpp" +#include "focus.hpp" + +using namespace RPi; + +#define NAME "rpi.focus" + +Focus::Focus(Controller *controller) + : Algorithm(controller) +{ +} + +char const *Focus::Name() const +{ + return NAME; +} + +void Focus::Read(boost::property_tree::ptree const ¶ms) +{ + print_ = params.get("print", 0); +} + +void Focus::Process(StatisticsPtr &stats, Metadata *image_metadata) +{ + FocusStatus status; + int i; + for (i = 0; i < FOCUS_REGIONS; i++) + status.focus_measures[i] = stats->focus_stats[i].contrast_val[1][1] / 1000; + status.num = i; + image_metadata->Set("focus.status", status); + if (print_) { + uint32_t value = (status.focus_measures[5] + status.focus_measures[6]) / 10; + RPI_LOG("Focus contrast measure: " << value); + } +} + +/* Register algorithm with the system. */ +static Algorithm *Create(Controller *controller) +{ + return new Focus(controller); +} +static RegisterAlgorithm reg(NAME, &Create); diff --git a/src/ipa/raspberrypi/controller/rpi/focus.hpp b/src/ipa/raspberrypi/controller/rpi/focus.hpp new file mode 100644 index 00000000..d53401f7 --- /dev/null +++ b/src/ipa/raspberrypi/controller/rpi/focus.hpp @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2020, Raspberry Pi (Trading) Limited + * + * focus.hpp - focus algorithm + */ +#pragma once + +#include "../algorithm.hpp" +#include "../metadata.hpp" + +/* + * The "focus" algorithm. All it does it print out a version of the + * focus contrast measure; there is no actual auto-focus mechanism to + * control. + */ + +namespace RPi { + +class Focus : public Algorithm +{ +public: + Focus(Controller *controller); + char const *Name() const override; + void Read(boost::property_tree::ptree const ¶ms) override; + void Process(StatisticsPtr &stats, Metadata *image_metadata) override; +private: + bool print_; +}; + +} /* namespace RPi */ diff --git a/src/ipa/raspberrypi/data/imx477.json b/src/ipa/raspberrypi/data/imx477.json index dce5234f..389e8ce8 100644 --- a/src/ipa/raspberrypi/data/imx477.json +++ b/src/ipa/raspberrypi/data/imx477.json @@ -412,5 +412,9 @@ "rpi.sharpen": { + }, + "rpi.focus": + { + "print": 1 } } diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build index 697902e9..9445cd09 100644 --- a/src/ipa/raspberrypi/meson.build +++ b/src/ipa/raspberrypi/meson.build @@ -29,6 +29,7 @@ rpi_ipa_sources = files([ 'controller/rpi/awb.cpp', 'controller/rpi/sharpen.cpp', 'controller/rpi/black_level.cpp', + 'controller/rpi/focus.cpp', 'controller/rpi/geq.cpp', 'controller/rpi/noise.cpp', 'controller/rpi/lux.cpp',