{"id":4100,"url":"https://patchwork.libcamera.org/api/1.1/patches/4100/?format=json","web_url":"https://patchwork.libcamera.org/patch/4100/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20200619092725.19109-3-david.plowman@raspberrypi.com>","date":"2020-06-19T09:27:24","name":"[libcamera-devel,2/3] libcamera: raspberrypi: add sharpness strength control to Raspberry Pi IPAs","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"d003eee92cf0f8625d8c70b8f03cad41efa48d55","submitter":{"id":42,"url":"https://patchwork.libcamera.org/api/1.1/people/42/?format=json","name":"David Plowman","email":"david.plowman@raspberrypi.com"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/4100/mbox/","series":[{"id":1018,"url":"https://patchwork.libcamera.org/api/1.1/series/1018/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=1018","date":"2020-06-19T09:27:22","name":"libcamera sharpness strength control","version":1,"mbox":"https://patchwork.libcamera.org/series/1018/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/4100/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/4100/checks/","tags":{},"headers":{"Return-Path":"<david.plowman@raspberrypi.com>","Received":["from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com\n\t[IPv6:2a00:1450:4864:20::42b])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 98524609B3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 19 Jun 2020 11:27:53 +0200 (CEST)","by mail-wr1-x42b.google.com with SMTP id q11so8997824wrp.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 19 Jun 2020 02:27:53 -0700 (PDT)","from pi4-davidp.lan (plowpeople3.plus.com. [80.229.223.72])\n\tby smtp.gmail.com with ESMTPSA id\n\tn65sm5156154wmf.47.2020.06.19.02.27.52\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 19 Jun 2020 02:27:52 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=raspberrypi.com\n\theader.i=@raspberrypi.com\n\theader.b=\"aQKA7vm0\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references\n\t:mime-version:content-transfer-encoding;\n\tbh=3QCDBkaxFXVXaBWcvlJm6aIO+K2xVTiA1JY72i6arQ8=;\n\tb=aQKA7vm0D8C1i3DTs3IAo5x5ER8wyE/snCIqoRvJZLrDp/qiDfyVc4hJiPn3kU19M1\n\tkgb+tExfzWk/ynqKeeZ/FHr66aCARpuMIQsF7iAItZMrJ2cf6efRZg8928lXhmskP4qB\n\ts5vXhAL1VGFJCEA2/wk8BNox6o7Y4CmtrnDwrugiByVC83kq4+Azd7NFXXJuidu8GghR\n\t+1qGR5P8I3LXrZK1thgom7LAyEPtKsGlRa8ofHmXHZgMoSKKrMDc3xbXmU/RZQ6BIGyn\n\ta6VX1SHiHm2SNsHogfUucVUhaabpAbyZgIlCTns2h71NVGsfqBfGzBO4DBNLdf3QUrem\n\tB3Bw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references:mime-version:content-transfer-encoding;\n\tbh=3QCDBkaxFXVXaBWcvlJm6aIO+K2xVTiA1JY72i6arQ8=;\n\tb=ZI/QuoORfL4qLml0TT4oPQyq8pDwLbco6hbEHg5qWzy1L8Ee9nCTbMwqVEO6thcK1p\n\t8D1E2wadweFRY4zQAcef61kYqCUuSOs4YTZXBMrtmKZIPdUqaZaNz1ScFlA7NdoPuoNy\n\ttYhwHPB4o+GDAoFfdrd64iX5K1vB+y8PaIDhZK15goh0ygF1XpEamuzD/ixjol6JIFmh\n\t06U64TA5a2rUNAqnY+/cnQCA1Ysy4+5PhaRu5WYQkYHzBwVbAZXxgH6cZk9SOw7oiqWY\n\tgc1SZccHgfTD5ol1KmaD2G/PRb6yCt4+Pe/WdN0/bXK2jiDCVp63+5EJBCuEExzVYXaL\n\tgZmw==","X-Gm-Message-State":"AOAM533WzkMuefpJiNJVM0YFnqoXPyXourzbSuq4DWg/XSdp/BKrx31q\n\t8tGOER7xMmZdWt5fzJtPAe+SAh6lJ2c=","X-Google-Smtp-Source":"ABdhPJxZwExjevM8zKMtt6JI9M1QTQS8xjMnPXDFbRQJTdowrM+F/TT3jyJR9w8g5pKG4FS28A+IlA==","X-Received":"by 2002:a5d:490f:: with SMTP id\n\tx15mr2998614wrq.259.1592558872976; \n\tFri, 19 Jun 2020 02:27:52 -0700 (PDT)","From":"David Plowman <david.plowman@raspberrypi.com>","To":"libcamera-devel@lists.libcamera.org","Date":"Fri, 19 Jun 2020 10:27:24 +0100","Message-Id":"<20200619092725.19109-3-david.plowman@raspberrypi.com>","X-Mailer":"git-send-email 2.20.1","In-Reply-To":"<20200619092725.19109-1-david.plowman@raspberrypi.com>","References":"<20200619092725.19109-1-david.plowman@raspberrypi.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [PATCH 2/3] libcamera: raspberrypi: add sharpness\n\tstrength control to Raspberry Pi IPAs","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Fri, 19 Jun 2020 09:27:53 -0000"},"content":"The sharpness control is, loosely speaking, a gain applied to\nthe amount of sharpening added to an image. We also report the\nsharpness setting used back to the caller in metadata.\n\nSigned-off-by: David Plowman <david.plowman@raspberrypi.com>\n---\n .../raspberrypi/controller/rpi/sharpen.cpp    | 23 +++++++++++++++----\n .../raspberrypi/controller/rpi/sharpen.hpp    |  6 +++--\n .../controller/sharpen_algorithm.hpp          | 21 +++++++++++++++++\n .../raspberrypi/controller/sharpen_status.h   |  2 ++\n 4 files changed, 46 insertions(+), 6 deletions(-)\n create mode 100644 src/ipa/raspberrypi/controller/sharpen_algorithm.hpp","diff":"diff --git a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp\nindex 1f07bb6..45fe3fe 100644\n--- a/src/ipa/raspberrypi/controller/rpi/sharpen.cpp\n+++ b/src/ipa/raspberrypi/controller/rpi/sharpen.cpp\n@@ -17,7 +17,7 @@ using namespace RPi;\n #define NAME \"rpi.sharpen\"\n \n Sharpen::Sharpen(Controller *controller)\n-\t: Algorithm(controller)\n+\t: SharpenAlgorithm(controller), user_strength_(1.0)\n {\n }\n \n@@ -40,15 +40,30 @@ void Sharpen::Read(boost::property_tree::ptree const &params)\n \tlimit_ = params.get<double>(\"limit\", 1.0);\n }\n \n+void Sharpen::SetStrength(double strength)\n+{\n+\t// Note that this method is how an application sets the overall\n+\t// sharpening \"strength\". We call this the \"user strength\" field\n+\t// as there already is a strength_ field - being an internal gain\n+\t// parameter that gets passed to the ISP control code.\n+\tuser_strength_ = strength;\n+}\n+\n void Sharpen::Prepare(Metadata *image_metadata)\n {\n \tdouble mode_factor = mode_factor_;\n+\t// The user_strength affects the algorithm's internal gain directly, but\n+\t// we adjust the limit and threshold more cautiously, hence the sqrt.\n+\tdouble user_strength = user_strength_;\n+\tdouble user_strength_sqrt = sqrt(user_strength);\n \tstruct SharpenStatus status;\n \t// Binned modes seem to need the sharpening toned down with this\n \t// pipeline.\n-\tstatus.threshold = threshold_ * mode_factor;\n-\tstatus.strength = strength_ / mode_factor;\n-\tstatus.limit = limit_ / mode_factor;\n+\tstatus.threshold = threshold_ * mode_factor / user_strength_sqrt;\n+\tstatus.strength = (strength_ / mode_factor) * user_strength;\n+\tstatus.limit = (limit_ / mode_factor) * user_strength_sqrt;\n+\t// Finally, report any application-supplied parameters that were used.\n+\tstatus.user_strength = user_strength;\n \timage_metadata->Set(\"sharpen.status\", status);\n }\n \ndiff --git a/src/ipa/raspberrypi/controller/rpi/sharpen.hpp b/src/ipa/raspberrypi/controller/rpi/sharpen.hpp\nindex 3b0d680..5b419b4 100644\n--- a/src/ipa/raspberrypi/controller/rpi/sharpen.hpp\n+++ b/src/ipa/raspberrypi/controller/rpi/sharpen.hpp\n@@ -6,20 +6,21 @@\n  */\n #pragma once\n \n-#include \"../algorithm.hpp\"\n+#include \"../sharpen_algorithm.hpp\"\n #include \"../sharpen_status.h\"\n \n // This is our implementation of the \"sharpen algorithm\".\n \n namespace RPi {\n \n-class Sharpen : public Algorithm\n+class Sharpen : public SharpenAlgorithm\n {\n public:\n \tSharpen(Controller *controller);\n \tchar const *Name() const override;\n \tvoid SwitchMode(CameraMode const &camera_mode) override;\n \tvoid Read(boost::property_tree::ptree const &params) override;\n+\tvoid SetStrength(double strength) override;\n \tvoid Prepare(Metadata *image_metadata) override;\n \n private:\n@@ -27,6 +28,7 @@ private:\n \tdouble strength_;\n \tdouble limit_;\n \tstd::atomic<double> mode_factor_;\n+\tstd::atomic<double> user_strength_;\n };\n \n } // namespace RPi\ndiff --git a/src/ipa/raspberrypi/controller/sharpen_algorithm.hpp b/src/ipa/raspberrypi/controller/sharpen_algorithm.hpp\nnew file mode 100644\nindex 0000000..3b27a74\n--- /dev/null\n+++ b/src/ipa/raspberrypi/controller/sharpen_algorithm.hpp\n@@ -0,0 +1,21 @@\n+/* SPDX-License-Identifier: BSD-2-Clause */\n+/*\n+ * Copyright (C) 2020, Raspberry Pi (Trading) Limited\n+ *\n+ * sharpen_algorithm.hpp - sharpness control algorithm interface\n+ */\n+#pragma once\n+\n+#include \"algorithm.hpp\"\n+\n+namespace RPi {\n+\n+class SharpenAlgorithm : public Algorithm\n+{\n+public:\n+\tSharpenAlgorithm(Controller *controller) : Algorithm(controller) {}\n+\t// A sharpness control algorithm must provide the following:\n+\tvirtual void SetStrength(double strength) = 0;\n+};\n+\n+} // namespace RPi\ndiff --git a/src/ipa/raspberrypi/controller/sharpen_status.h b/src/ipa/raspberrypi/controller/sharpen_status.h\nindex 6de80f4..7501b19 100644\n--- a/src/ipa/raspberrypi/controller/sharpen_status.h\n+++ b/src/ipa/raspberrypi/controller/sharpen_status.h\n@@ -19,6 +19,8 @@ struct SharpenStatus {\n \tdouble strength;\n \t// upper limit of the allowed sharpening response\n \tdouble limit;\n+\t// The sharpening strength requested by the user or application.\n+\tdouble user_strength;\n };\n \n #ifdef __cplusplus\n","prefixes":["libcamera-devel","2/3"]}