[{"id":19202,"web_url":"https://patchwork.libcamera.org/comment/19202/","msgid":"<YS2c/tqoLXGOWb7t@pendragon.ideasonboard.com>","date":"2021-08-31T03:07:42","subject":"Re: [libcamera-devel] [RFC PATCH 1/2] android: Plumb Sharpness\n\tcontrol into EDGE_MODE","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Paul,\n\nThank you for the patch.\n\nOn Mon, Aug 23, 2021 at 06:48:05PM +0900, Paul Elder wrote:\n> Plumb the Sharpness control into the HAL for EDGE_MODE and other related\n> android controls.\n> \n> Bug: https://bugs.libcamera.org/show_bug.cgi?id=46\n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> ---\n>  src/android/camera_capabilities.cpp | 33 ++++++++++++++++++++++\n>  src/android/camera_device.cpp       | 44 +++++++++++++++++++++++++++++\n>  2 files changed, 77 insertions(+)\n> \n> diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp\n> index bd661675..d12dc048 100644\n> --- a/src/android/camera_capabilities.cpp\n> +++ b/src/android/camera_capabilities.cpp\n> @@ -231,6 +231,11 @@ bool CameraCapabilities::validateManualSensorCapability()\n>  \t\treturn false;\n>  \t}\n>  \n> +\tif (!staticMetadata_->hasEntry(ANDROID_EDGE_AVAILABLE_EDGE_MODES)) {\n> +\t\tLOG(HAL, Info) << noMode << \"missing edge modes\";\n> +\t\treturn false;\n> +\t}\n\nWhere did you see that the manual sensor capability requires edge mode ?\nI'm looking at\nhttps://developer.android.com/reference/android/hardware/camera2/CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR\nand I don't see edge mode control there. It's however required for FULL\nlevel, but I'm not entirely sure if FULL level request supporting other\nmodes than OFF.\n\n> +\n>  \t/*\n>  \t * \\todo Return true here after we satisfy all the requirements:\n>  \t * https://developer.android.com/reference/android/hardware/camera2/CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR\n> @@ -938,6 +943,22 @@ int CameraCapabilities::initializeStaticMetadata()\n>  \tstaticMetadata_->addEntry(ANDROID_CONTROL_AVAILABLE_MODES,\n>  \t\t\t\t  availableControlModes);\n>  \n> +\n\nExtra blank line.\n\n> +\tconst auto &edgeInfo = controlsInfo.find(&controls::Sharpness);\n> +\tif (edgeInfo != controlsInfo.end()) {\n> +\t\tstd::vector<uint8_t> availableEdgeModes = {\n> +\t\t\tANDROID_EDGE_MODE_OFF,\n> +\t\t\tANDROID_EDGE_MODE_FAST,\n> +\t\t\tANDROID_EDGE_MODE_HIGH_QUALITY,\n> +\t\t};\n> +\n> +\t\tstaticMetadata_->addEntry(ANDROID_EDGE_AVAILABLE_EDGE_MODES,\n> +\t\t\t\t\t  availableEdgeModes);\n> +\t\tavailableCharacteristicsKeys_.insert(ANDROID_EDGE_AVAILABLE_EDGE_MODES);\n> +\t\tavailableRequestKeys_.insert(ANDROID_EDGE_MODE);\n> +\t\tavailableResultKeys_.insert(ANDROID_EDGE_MODE);\n> +\t}\n> +\n>  \t/* JPEG static metadata. */\n>  \n>  \t/*\n> @@ -1330,6 +1351,9 @@ std::unique_ptr<CameraMetadata> CameraCapabilities::requestTemplateManual() cons\n>  \tif (!manualTemplate)\n>  \t\treturn nullptr;\n>  \n> +\tif (availableRequestKeys_.count(ANDROID_EDGE_MODE))\n> +\t\tmanualTemplate->addEntry(ANDROID_EDGE_MODE, ANDROID_EDGE_MODE_OFF);\n> +\n>  \treturn manualTemplate;\n>  }\n>  \n> @@ -1390,6 +1414,9 @@ std::unique_ptr<CameraMetadata> CameraCapabilities::requestTemplatePreview() con\n>  \tuint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;\n>  \trequestTemplate->addEntry(ANDROID_CONTROL_AWB_LOCK, awbLock);\n>  \n> +\tif (availableRequestKeys_.count(ANDROID_EDGE_MODE))\n> +\t\trequestTemplate->addEntry(ANDROID_EDGE_MODE, ANDROID_EDGE_MODE_FAST);\n> +\n>  \tuint8_t flashMode = ANDROID_FLASH_MODE_OFF;\n>  \trequestTemplate->addEntry(ANDROID_FLASH_MODE, flashMode);\n>  \n> @@ -1428,6 +1455,9 @@ std::unique_ptr<CameraMetadata> CameraCapabilities::requestTemplateStill() const\n>  \tif (!stillTemplate)\n>  \t\treturn nullptr;\n>  \n> +\tif (availableRequestKeys_.count(ANDROID_EDGE_MODE))\n> +\t\tstillTemplate->addEntry(ANDROID_EDGE_MODE, ANDROID_EDGE_MODE_HIGH_QUALITY);\n> +\n>  \treturn stillTemplate;\n>  }\n>  \n> @@ -1445,6 +1475,9 @@ std::unique_ptr<CameraMetadata> CameraCapabilities::requestTemplateVideo() const\n>  \tstaticMetadata_->getEntry(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,\n>  \t\t\t\t  &entry);\n>  \n> +\tif (availableRequestKeys_.count(ANDROID_EDGE_MODE))\n> +\t\tpreviewTemplate->addEntry(ANDROID_EDGE_MODE, ANDROID_EDGE_MODE_FAST);\n> +\n>  \t/*\n>  \t * Assume the AE_AVAILABLE_TARGET_FPS_RANGE static metadata\n>  \t * has been assembled as {{min, max} {max, max}}.\n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index a69b687a..96afec81 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -829,6 +829,24 @@ int CameraDevice::processControls(Camera3RequestDescriptor *descriptor)\n>  \t\tcontrols.set(controls::draft::TestPatternMode, testPatternMode);\n>  \t}\n>  \n> +\tif (settings.getEntry(ANDROID_EDGE_MODE, &entry)) {\n> +\t\tconst auto &info = camera_->controls().find(&controls::Sharpness);\n> +\t\tif (info != camera_->controls().end()) {\n> +\t\t\tfloat min = info->second.min().get<float>();\n> +\t\t\tfloat def = info->second.def().get<float>();\n> +\t\t\tfloat max = info->second.max().get<float>();\n> +\t\t\t/*\n> +\t\t\t * The default value might be unusable since control\n> +\t\t\t * serialization ignores it. Alternatively the default\n\nIsn't this something that needs to be fixed in controls serialization ?\nWe can keep the workaround to avoiding depending on that work, but a\ntodo comment is needed then.\n\n> +\t\t\t * could be simply set to zero or the minimum value.\n> +\t\t\t * Use the maximum sharpness value in these cases.\n> +\t\t\t */\n> +\t\t\tfloat val = (def == 0.0f || def == min) ? max : def;\n> +\t\t\tcontrols.set(controls::Sharpness,\n> +\t\t\t\t     *entry.data.u8 == ANDROID_EDGE_MODE_OFF ? min : val);\n> +\t\t}\n> +\t}\n> +\n>  \treturn 0;\n>  }\n>  \n> @@ -1371,6 +1389,32 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons\n>  \t\t\t\t\t duration);\n>  \t}\n>  \n> +\tif (metadata.contains(controls::Sharpness) &&\n> +\t    settings.getEntry(ANDROID_EDGE_MODE, &entry)) {\n> +\t\tconst auto &info = camera_->controls().find(&controls::Sharpness);\n> +\t\tif (info != camera_->controls().end()) {\n> +\t\t\tfloat min = info->second.min().get<float>();\n> +\t\t\tfloat max = info->second.max().get<float>();\n> +\t\t\tfloat sharpness = metadata.get(controls::Sharpness);\n> +\t\t\t/*\n> +\t\t\t * 1% of the sharpening value range is considered \"no\n> +\t\t\t * sharpening\".\n> +\t\t\t */\n> +\t\t\tbool closeToMin = (sharpness - min) < (min + (0.01 * (max - min))) ||\n> +\t\t\t\t\t  min == max;\n> +\n> +\t\t\t/*\n> +\t\t\t * libcamera doesn't distinguish between fast vs HQ\n> +\t\t\t * sharpening modes. Report the mode that was\n> +\t\t\t * requested.\n> +\t\t\t */\n> +\t\t\tresultMetadata->addEntry(ANDROID_EDGE_MODE,\n> +\t\t\t\t\t\t closeToMin ?\n> +\t\t\t\t\t\t (uint8_t)ANDROID_EDGE_MODE_OFF :\n> +\t\t\t\t\t\t *entry.data.u8);\n> +\t\t}\n> +\t}\n> +\n>  \tif (metadata.contains(controls::ScalerCrop)) {\n>  \t\tRectangle crop = metadata.get(controls::ScalerCrop);\n>  \t\tint32_t cropRect[] = {","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 501C5BDC71\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 31 Aug 2021 03:08:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7E38B6916C;\n\tTue, 31 Aug 2021 05:07:59 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 8CE1168891\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 31 Aug 2021 05:07:57 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E93A624F;\n\tTue, 31 Aug 2021 05:07:56 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Ep5U5mp6\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1630379277;\n\tbh=sShLc/9rlaQ31/26V1kMfszPDz8UA4IpKO54Yn19xk4=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Ep5U5mp6Csk1+IWIQe91RzvNaP/sq+ySTzu4dgH/KMwJnaO0ffh+EwnyfhWiUPlC8\n\tqaBHFXobcNw1C8ledzZArD+4mb6vyKzmXDe5gEKNilT/B5UZr+TImZRMHNPYx3mjna\n\t2rK2hKw1LamOVnz1mtcMBCOxjmebJfV9PHlar2E8=","Date":"Tue, 31 Aug 2021 06:07:42 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Paul Elder <paul.elder@ideasonboard.com>","Message-ID":"<YS2c/tqoLXGOWb7t@pendragon.ideasonboard.com>","References":"<20210823094806.1434280-1-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20210823094806.1434280-1-paul.elder@ideasonboard.com>","Subject":"Re: [libcamera-devel] [RFC PATCH 1/2] android: Plumb Sharpness\n\tcontrol into EDGE_MODE","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>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]