From patchwork Mon Sep 13 10:20:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 13821 X-Patchwork-Delegate: paul.elder@ideasonboard.com 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 77EE0BDC71 for ; Mon, 13 Sep 2021 10:20:28 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 48AAF6918C; Mon, 13 Sep 2021 12:20:28 +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="VW3UC9sG"; 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 E0DE46024C for ; Mon, 13 Sep 2021 12:20:24 +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 6FA8D8F; Mon, 13 Sep 2021 12:20:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1631528424; bh=ekiVG6jx0fuYugwInTqLlWTtNZjkMShcG+8YxQV1t9g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VW3UC9sG60swJvJo1uWAItXd82LNwLwIm1DZXIRxt/MxsTEFa3KOHOYLGHAAB6xou zFO5bH/G1bPOExw1JG3dalUHTIp647JMLML08RxZ0NAuscQqCYWluf7MRa1BA8qaeh 8VCK2ZpdDnr8EEcLoCYWEDmIGx909R84tBVOCsq8= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Mon, 13 Sep 2021 19:20:07 +0900 Message-Id: <20210913102007.2303225-3-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210913102007.2303225-1-paul.elder@ideasonboard.com> References: <20210913102007.2303225-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 3/3] android: Plumb noise reduction 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: - hardware level detection based on available noise reduction values (no sepcific capabilities seem to require it; only FULL in general) - Conversion from android to libcamera noise reduction modes for request (use switch-case instead of direct copy just in case) - Conversion from libcamera to android noise reduction modes for result We already have the mechanism to report the available noise reduction modes, so that is not added. Signed-off-by: Paul Elder --- src/android/camera_capabilities.cpp | 19 +++++++++++++ src/android/camera_device.cpp | 41 +++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/src/android/camera_capabilities.cpp b/src/android/camera_capabilities.cpp index 08e44a1a..be6687d9 100644 --- a/src/android/camera_capabilities.cpp +++ b/src/android/camera_capabilities.cpp @@ -375,6 +375,25 @@ void CameraCapabilities::computeHwLevel( if (!found || *entry.data.i32 != 0) hwLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED; + found = staticMetadata_->entryContains( + ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, + ANDROID_NOISE_REDUCTION_MODE_OFF); + if (!found) + hwLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED; + + found = staticMetadata_->entryContains( + ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, + ANDROID_NOISE_REDUCTION_MODE_FAST); + if (!found) + hwLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED; + + /* Android docs don't say this is required, but CTS does. */ + found = staticMetadata_->entryContains( + ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, + ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY); + if (!found) + hwLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED; + hwLevel_ = hwLevel; } diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index ab31bdda..502dd10a 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -826,6 +826,40 @@ int CameraDevice::processControls(Camera3RequestDescriptor *descriptor) controls.set(controls::draft::TestPatternMode, testPatternMode); } + if (settings.getEntry(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, &entry)) { + const uint8_t data = *entry.data.u8; + int32_t noiseReductionMode = controls::NoiseReductionModeOff; + switch (data) { + case ANDROID_NOISE_REDUCTION_MODE_OFF: + noiseReductionMode = controls::NoiseReductionModeOff; + break; + + case ANDROID_NOISE_REDUCTION_MODE_FAST: + noiseReductionMode = controls::NoiseReductionModeFast; + break; + + case ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY: + noiseReductionMode = controls::NoiseReductionModeHighQuality; + break; + + case ANDROID_NOISE_REDUCTION_MODE_MINIMAL: + noiseReductionMode = controls::NoiseReductionModeRaw; + break; + + case ANDROID_NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG: + noiseReductionMode = controls::NoiseReductionModeZSL; + break; + + default: + LOG(HAL, Error) + << "Unknown noise reduction mode: " << data; + + return -EINVAL; + } + + controls.set(controls::NoiseReductionMode, noiseReductionMode); + } + return 0; } @@ -1379,6 +1413,13 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons resultMetadata->addEntry(ANDROID_SCALER_CROP_REGION, cropRect); } + if (metadata.contains(controls::NoiseReductionMode)) { + const int32_t noiseReductionMode = + metadata.get(controls::NoiseReductionMode); + resultMetadata->addEntry(ANDROID_NOISE_REDUCTION_MODE, + noiseReductionMode); + } + if (metadata.contains(controls::draft::TestPatternMode)) { const int32_t testPatternMode = metadata.get(controls::draft::TestPatternMode);