From patchwork Thu Apr 22 09:40:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12068 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 2D3AFBDB17 for ; Thu, 22 Apr 2021 09:41:17 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E1F8968858; Thu, 22 Apr 2021 11:41:16 +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="rc7qbJz3"; 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 5A87B6883E for ; Thu, 22 Apr 2021 11:41:15 +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 77A8B3EE; Thu, 22 Apr 2021 11:41:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1619084474; bh=1VwuzHjyBweYpSNaLZQJeG2C0LWe3iRd2q056WbMIxo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rc7qbJz383TYBFa9bkxopem+ybl+A8HEP1/7TQk3wiVJFWM5UQdPzk/KvU3O6b+Aw BXxFSADDKyIRGq750qtbmwmY6wGEt/8Ai1lVRKKsSyOTqbY1VD4FoTP9/Ace8TxKi0 z46TjR/Prql3ulbtqlarUT85RNsiwZmEbvR5JVJA= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Thu, 22 Apr 2021 18:40:51 +0900 Message-Id: <20210422094102.371772-2-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210422094102.371772-1-paul.elder@ideasonboard.com> References: <20210422094102.371772-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH v2 01/12] android: camera_device: Fix typo in result metadata allocation error 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" Fix an error message typo s/static/result/. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart Reviewed-by: Jacopo Mondi --- src/android/camera_device.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 2b8fd1e6..9336a027 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -2195,7 +2195,7 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons std::unique_ptr resultMetadata = std::make_unique(44, 166); if (!resultMetadata->isValid()) { - LOG(HAL, Error) << "Failed to allocate static metadata"; + LOG(HAL, Error) << "Failed to allocate result metadata"; return nullptr; } From patchwork Thu Apr 22 09:40:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12069 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 893AFBDB17 for ; Thu, 22 Apr 2021 09:41:19 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 426AD6885D; Thu, 22 Apr 2021 11:41:19 +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="GeKn+m4B"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3B8A46884C for ; Thu, 22 Apr 2021 11:41:17 +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 B2BE2499; Thu, 22 Apr 2021 11:41:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1619084476; bh=5rqexxn0LBiuh6iCXFTLlfhSc0vyyNxfcBAw6m6WLJ4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GeKn+m4BVDcbgy6xKyC/qMCVC8fkOe5ncVAJrKUxZPcp8gGuHHSy0Z0kWdsrRlZVk OKaUbsVAZOSuvi67ekLRzReiApED5XoFoHTeIkAbZSQu9iHaxLJUIR/gz4ZhncviKZ GlMZrLFOc50DPpwSrSiZNBwjFkjv9iEdfBoHUJdM= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Thu, 22 Apr 2021 18:40:52 +0900 Message-Id: <20210422094102.371772-3-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210422094102.371772-1-paul.elder@ideasonboard.com> References: <20210422094102.371772-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH v2 02/12] android: Switch to FULL 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" Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart Reviewed-by: Jacopo Mondi --- src/android/camera_device.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 9336a027..76863877 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -1258,7 +1258,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() staticMetadata_->addEntry(ANDROID_SCALER_CROPPING_TYPE, &croppingType, 1); /* Info static metadata. */ - uint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED; + uint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL; staticMetadata_->addEntry(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, &supportedHWLevel, 1); From patchwork Thu Apr 22 09:40:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12070 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 6CC68BDB17 for ; Thu, 22 Apr 2021 09:41:21 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2631C6885C; Thu, 22 Apr 2021 11:41:21 +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="HvqD1LqM"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 1866468843 for ; Thu, 22 Apr 2021 11:41:19 +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 684E6499; Thu, 22 Apr 2021 11:41:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1619084478; bh=B66VJivwACtZivlHNm1WqJco1w7s9P6hYewZ52CnKiw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HvqD1LqMEaJ8tlvwIXhqHhNTqQYm+104ZoFJmRZCQjlAknc4oXLrJV0Hvsg4k6k6l CcVYkhL9TwzQRo8EYs4TR2peT5O0oUVVvEHJPfqW27rMimHThg7awD+RpUJTxFenje aR/fCoGhD9srXWk8T7eZeMw6Q1dONk/wlAD80q3A= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Thu, 22 Apr 2021 18:40:53 +0900 Message-Id: <20210422094102.371772-4-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210422094102.371772-1-paul.elder@ideasonboard.com> References: <20210422094102.371772-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH v2 03/12] android: CameraDevice: Report proper min and max frame durations 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" The HAL layer was getting the min and max frame durations from from the camera, then rounding it to fps to report as available fps ranges. The same min and max frame durations were then being reported as min and max frame durations. Since the fps are integer values while the frame durations are in ns, this caused a rounding error making it seem like we were reporting an available max fps that was higher than was was allowed by the minimum frame duration. An example is if the minimum frame duration is reported as 33366700ns. The HAL layer would then convert it to fps, which is 29.97, but it would be rounded and reported as 30 fps. When 30 fps is converted to a frame duration it is 33333333ns, which is less than the minimum frame duration that we report. Thus the minimum frame duration that we report contradicts the fps rage that we report. Fix this by recalculating the frame durations based on the rounded fps values. This allows the following CTS test to pass: - android.hardware.camera2.cts.SurfaceViewPreviewTest#testPreviewFpsRange Signed-off-by: Paul Elder Reviewed-by: Hirokazu Honda Reviewed-by: Jacopo Mondi --- src/android/camera_device.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 76863877..a11ad848 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -900,6 +900,10 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() int32_t minFps = std::round(1e9 / maxFrameDurationNsec); minFps = std::max(1, minFps); + /* Avoid rounding errors when we reuse these variables later */ + minFrameDurationNsec = 1e9 / maxFps; + maxFrameDurationNsec = 1e9 / minFps; + /* * Register to the camera service {min, max} and {max, max} * intervals as requested by the metadata documentation. From patchwork Thu Apr 22 09:40:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12071 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 CE06FBDB17 for ; Thu, 22 Apr 2021 09:41:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 9192768863; Thu, 22 Apr 2021 11:41:24 +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="V4Y+o4FH"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B08896883E for ; Thu, 22 Apr 2021 11:41:20 +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 54A2D9DA; Thu, 22 Apr 2021 11:41:19 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1619084480; bh=uhdciWBQvoTrZ+xsu98ZFWRkzMz8ikxe354w4G5Snxg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=V4Y+o4FHSI74OxPRXI+tPufvP1CME2i4uv+IQ7JYHsqilbHyXi0wO8+E+aFepQefu XvyH2GGYzPS8Aj58PXzRu73TOh0j5cCoNEktBeDruAHIulT5JS38VhR+bfgLpjVEPj ELxrN6kGqGw1JFk9bt8/lMP5MXD4uxGovOhBavdA= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Thu, 22 Apr 2021 18:40:54 +0900 Message-Id: <20210422094102.371772-5-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210422094102.371772-1-paul.elder@ideasonboard.com> References: <20210422094102.371772-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH v2 04/12] android: jpeg: get ISO from SENSOR_SENSITIVITY 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" The data for the exif ISO tag needs to come from SENSOR_SENSITIVITY. Set it. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart --- This on its own doesn't fix any CTS tests, but it prevents a test failure later on when we add the proper static metadata for the FULL hardware level. --- src/android/jpeg/post_processor_jpeg.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/android/jpeg/post_processor_jpeg.cpp b/src/android/jpeg/post_processor_jpeg.cpp index 3bf16996..237fb318 100644 --- a/src/android/jpeg/post_processor_jpeg.cpp +++ b/src/android/jpeg/post_processor_jpeg.cpp @@ -119,7 +119,10 @@ int PostProcessorJpeg::process(const FrameBuffer &source, ret = requestMetadata.getEntry(ANDROID_LENS_APERTURE, &entry); if (ret) exif.setAperture(*entry.data.f); - exif.setISO(100); + + ret = resultMetadata->getEntry(ANDROID_SENSOR_SENSITIVITY, &entry); + exif.setISO(ret ? *entry.data.i32 : 100); + exif.setFlash(Exif::Flash::FlashNotPresent); exif.setWhiteBalance(Exif::WhiteBalance::Auto); From patchwork Thu Apr 22 09:40:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12072 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 8B9C0BDB17 for ; Thu, 22 Apr 2021 09:41:25 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 1D8EE68868; Thu, 22 Apr 2021 11:41:25 +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="h6DYH8Yg"; 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 60EFC6884C for ; Thu, 22 Apr 2021 11:41:22 +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 142F99DA; Thu, 22 Apr 2021 11:41:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1619084482; bh=YccilF9HvnDsp0N9neku+1bINCLZ/OJGPkBbPnWtCNU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h6DYH8YgZxfpngYkBTEB/Blxl7OI62qzCyRMm2UIIqMgh0BS5nSbUVXyS8NIh4Lra LGK7AB+22eBWP73mfoCRVAjIXwSPTA+6tKAID52Vs32AnZVjcrtBTn/fToVzBx/hfe VAtQTIv5qnDinTBIXBIxFvGZDE/pvGKdesltC89E= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Thu, 22 Apr 2021 18:40:55 +0900 Message-Id: <20210422094102.371772-6-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210422094102.371772-1-paul.elder@ideasonboard.com> References: <20210422094102.371772-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH v2 05/12] android: camera_device: Set static metadata for FULL requirements 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" Set the static metadata as required by CTS for FULL hardware level. The tests that this fixes are: android.hardware.camera2.cts.StaticMetadataTest#testHwSupportedLevel Signed-off-by: Paul Elder --- This patch actually introduces more failures in CTS, but that's because we report that we support many more things in the static metadata. The main thing I'm not sure of in this patch is if the entries in any AVAILABLE_* tags require allocated space in the static metadata. Also the android docs say that they need to be int32_t while CTS (and other HAL implementations) say that they need to be uint8_t. --- src/android/camera_device.cpp | 148 +++++++++++++++++++++++++++++++--- 1 file changed, 139 insertions(+), 9 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index a11ad848..7f0f8f1a 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -776,10 +776,19 @@ std::tuple CameraDevice::calculateStaticMetadataSize() { /* * \todo Keep this in sync with the actual number of entries. - * Currently: 54 entries, 874 bytes of static metadata + * Currently: 63 entries, 990 bytes of static metadata */ - uint32_t numEntries = 54; - uint32_t byteSize = 874; + uint32_t numEntries = 63; + uint32_t byteSize = 990; + + // do i need to add for entries in the available keys? + // +1, +4 for EDGE_AVAILABLE_EDGE_MODES + // +1, +4 for LENS_INFO_AVAILABLE_FILTER_DENSITIES + // +1, +4 for BLACK_LEVEL_PATTERN + // +1, +4 for TONEMAP_AVAILABLE_TONE_MAP_MODES + // +1, +4 for TONEMAP_MAX_CURVE_POINTS + + // +36 for new request keys /* * Calculate space occupation in bytes for dynamically built metadata @@ -861,7 +870,9 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() aeAvailableAntiBandingModes.data(), aeAvailableAntiBandingModes.size()); + /* \todo FULL requires OFF */ std::vector aeAvailableModes = { + ANDROID_CONTROL_AE_MODE_OFF, ANDROID_CONTROL_AE_MODE_ON, }; staticMetadata_->addEntry(ANDROID_CONTROL_AE_AVAILABLE_MODES, @@ -958,9 +969,11 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() /* * \todo Inspect the Camera capabilities to report the available - * AWB modes. Default to AUTO as CTS tests require it. + * AWB modes. Default to AUTO as CTS tests require it. FULL requires + * OFF. */ std::vector availableAwbModes = { + ANDROID_CONTROL_AWB_MODE_OFF, ANDROID_CONTROL_AWB_MODE_AUTO, }; staticMetadata_->addEntry(ANDROID_CONTROL_AWB_AVAILABLE_MODES, @@ -983,17 +996,32 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() sceneModesOverride.data(), sceneModesOverride.size()); - uint8_t aeLockAvailable = ANDROID_CONTROL_AE_LOCK_AVAILABLE_FALSE; + /* true for MANUAL_SENSOR or BURST_CAPTURE capable devices */ + uint8_t aeLockAvailable = ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE; staticMetadata_->addEntry(ANDROID_CONTROL_AE_LOCK_AVAILABLE, &aeLockAvailable, 1); - uint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_FALSE; + /* true for MANUAL_SENSOR or BURST_CAPTURE capable devices */ + uint8_t awbLockAvailable = ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE; staticMetadata_->addEntry(ANDROID_CONTROL_AWB_LOCK_AVAILABLE, &awbLockAvailable, 1); char availableControlModes = ANDROID_CONTROL_MODE_AUTO; staticMetadata_->addEntry(ANDROID_CONTROL_AVAILABLE_MODES, &availableControlModes, 1); + /* + * FULL - always support OFF + * camera devices that support YUV_REPROCESSING or PRIVATE_REPROCESSING - ZERO_SHUTTER_LAG + * all devices will list FAST + */ + std::vector availableEdgeModes = { + ANDROID_EDGE_MODE_OFF, + ANDROID_EDGE_MODE_FAST, + ANDROID_EDGE_MODE_HIGH_QUALITY, + }; + staticMetadata_->addEntry(ANDROID_EDGE_AVAILABLE_EDGE_MODES, + availableEdgeModes.data(), + availableEdgeModes.size()); /* JPEG static metadata. */ @@ -1079,10 +1107,20 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() exposureInfo->second.min().get() * 1000LL, exposureInfo->second.max().get() * 1000LL, }; + /* min must be at most 100us, max at least 100ms */ + if (exposureTimeRange[0] > 100000) + exposureTimeRange[0] = 100000; + if (exposureTimeRange[1] < 100000000) + exposureTimeRange[1] = 100000000; staticMetadata_->addEntry(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, &exposureTimeRange, 2); } + /* min at most 100, max at least 800 */ + int32_t maxAnalogSensitivity = 800; + staticMetadata_->addEntry(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, + &maxAnalogSensitivity, 1); + staticMetadata_->addEntry(ANDROID_SENSOR_ORIENTATION, &orientation_, 1); std::vector testPatterModes = { @@ -1092,6 +1130,21 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() testPatterModes.data(), testPatterModes.size()); + /* + * required for FULL (docs don't say it is, but cts says it is) + * \todo figure out how this works + */ + std::vector blackLevelPattern = { 0, 0, 0, 0 }; + staticMetadata_->addEntry(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, + blackLevelPattern.data(), + blackLevelPattern.size()); + + /* range of valid values: > 255 (8-bit output) */ + /* this xnor BLACK_LEVEL_PATTERN must be available */ + int32_t whiteLevel = 256; + staticMetadata_->addEntry(ANDROID_SENSOR_INFO_WHITE_LEVEL, + &whiteLevel, 1); + std::vector physicalSize = { 2592, 1944, }; @@ -1131,7 +1184,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() } /* Sync static metadata. */ - int32_t maxLatency = ANDROID_SYNC_MAX_LATENCY_UNKNOWN; + int32_t maxLatency = ANDROID_SYNC_MAX_LATENCY_PER_FRAME_CONTROL; staticMetadata_->addEntry(ANDROID_SYNC_MAX_LATENCY, &maxLatency, 1); /* Flash static metadata. */ @@ -1147,6 +1200,15 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() lensApertures.data(), lensApertures.size()); + /* + * Required for FULL + * \todo get this information from the camera, in ascending order + */ + std::vector availableFilterDensities = { 0 }; + staticMetadata_->addEntry(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, + availableFilterDensities.data(), + availableFilterDensities.size()); + uint8_t lensFacing; switch (facing_) { default: @@ -1176,6 +1238,11 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() opticalStabilizations.data(), opticalStabilizations.size()); + /* \todo set this based on camera capability */ + int distanceCalibration = ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE; + staticMetadata_->addEntry(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, + &distanceCalibration, 1); + float hypeFocalDistance = 0; staticMetadata_->addEntry(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, &hypeFocalDistance, 1); @@ -1188,12 +1255,18 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() { std::vector data; data.reserve(5); + /* + * \todo if this doesn't have OFF and FAST and HIGH_QUALITY + * then this camera does not support FULL + */ const auto &infoMap = controlsInfo.find(&controls::draft::NoiseReductionMode); if (infoMap != controlsInfo.end()) { for (const auto &value : infoMap->second.values()) data.push_back(value.get()); } else { data.push_back(ANDROID_NOISE_REDUCTION_MODE_OFF); + data.push_back(ANDROID_NOISE_REDUCTION_MODE_FAST); + data.push_back(ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY); } staticMetadata_->addEntry(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, data.data(), data.size()); @@ -1261,6 +1334,16 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() uint8_t croppingType = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY; staticMetadata_->addEntry(ANDROID_SCALER_CROPPING_TYPE, &croppingType, 1); + /* \todo figure out if this should be int32 as documented */ + std::vector shadingAvailableModes = { + ANDROID_SHADING_MODE_OFF, + ANDROID_SHADING_MODE_FAST, + ANDROID_SHADING_MODE_HIGH_QUALITY, + }; + staticMetadata_->addEntry(ANDROID_SHADING_AVAILABLE_MODES, + shadingAvailableModes.data(), + shadingAvailableModes.size()); + /* Info static metadata. */ uint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL; staticMetadata_->addEntry(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, @@ -1288,6 +1371,10 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() std::vector availableCapabilities = { ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE, + ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR, + ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING, + ANDROID_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS, + ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE, }; /* Report if camera supports RAW. */ @@ -1306,7 +1393,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() } /* Number of { RAW, YUV, JPEG } supported output streams */ - int32_t numOutStreams[] = { rawStreamAvailable, 2, 1 }; + int32_t numOutStreams[] = { rawStreamAvailable, 3, 1 }; staticMetadata_->addEntry(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, &numOutStreams, 3); @@ -1314,6 +1401,29 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() availableCapabilities.data(), availableCapabilities.size()); + /* + * required for FULL + * at least one of the below mode combinations: + * - CONTRAST_CURVE, FAST, HIGH_QUALITY + * - GAMMA_VALUE, PRESET_CURVE, FAST, HIGH_QUALITY + */ + std::vector availableTonemapModes = { + ANDROID_TONEMAP_MODE_CONTRAST_CURVE, + ANDROID_TONEMAP_MODE_FAST, + ANDROID_TONEMAP_MODE_HIGH_QUALITY, + }; + staticMetadata_->addEntry(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES, + availableTonemapModes.data(), + availableTonemapModes.size()); + + /* + * required for FULL + * \todo get from camera (camCapabilities[camId]->tonemapCurvePoints?) + */ + int32_t tonemapCurvePoints = 0; + staticMetadata_->addEntry(ANDROID_TONEMAP_MAX_CURVE_POINTS, + &tonemapCurvePoints, 1); + std::vector availableCharacteristicsKeys = { ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, @@ -1331,14 +1441,17 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() ANDROID_CONTROL_AWB_LOCK_AVAILABLE, ANDROID_CONTROL_MAX_REGIONS, ANDROID_CONTROL_SCENE_MODE_OVERRIDES, + ANDROID_EDGE_AVAILABLE_EDGE_MODES, ANDROID_FLASH_INFO_AVAILABLE, ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, ANDROID_JPEG_MAX_SIZE, ANDROID_LENS_FACING, ANDROID_LENS_INFO_AVAILABLE_APERTURES, + ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, + ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, @@ -1353,6 +1466,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, ANDROID_SCALER_CROPPING_TYPE, ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES, + ANDROID_SENSOR_BLACK_LEVEL_PATTERN, ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, @@ -1361,17 +1475,25 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE, + ANDROID_SENSOR_INFO_WHITE_LEVEL, + ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, ANDROID_SENSOR_ORIENTATION, + ANDROID_SHADING_AVAILABLE_MODES, ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, ANDROID_SYNC_MAX_LATENCY, + ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES, + ANDROID_TONEMAP_MAX_CURVE_POINTS, }; staticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, availableCharacteristicsKeys.data(), availableCharacteristicsKeys.size()); std::vector availableRequestKeys = { + ANDROID_BLACK_LEVEL_LOCK, ANDROID_COLOR_CORRECTION_ABERRATION_MODE, + ANDROID_COLOR_CORRECTION_GAINS, + ANDROID_COLOR_CORRECTION_TRANSFORM, ANDROID_CONTROL_AE_ANTIBANDING_MODE, ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, ANDROID_CONTROL_AE_LOCK, @@ -1387,16 +1509,24 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() ANDROID_CONTROL_MODE, ANDROID_CONTROL_SCENE_MODE, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, + ANDROID_EDGE_MODE, ANDROID_FLASH_MODE, ANDROID_JPEG_ORIENTATION, ANDROID_JPEG_QUALITY, ANDROID_JPEG_THUMBNAIL_QUALITY, ANDROID_JPEG_THUMBNAIL_SIZE, ANDROID_LENS_APERTURE, + ANDROID_LENS_FILTER_DENSITY, ANDROID_LENS_OPTICAL_STABILIZATION_MODE, ANDROID_NOISE_REDUCTION_MODE, ANDROID_SCALER_CROP_REGION, - ANDROID_STATISTICS_FACE_DETECT_MODE + ANDROID_SENSOR_EXPOSURE_TIME, + ANDROID_SENSOR_FRAME_DURATION, + ANDROID_SENSOR_SENSITIVITY, + ANDROID_SHADING_MODE, + ANDROID_STATISTICS_FACE_DETECT_MODE, + ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, + ANDROID_TONEMAP_MODE, }; staticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, availableRequestKeys.data(), From patchwork Thu Apr 22 09:40:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12073 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 6B338BDB17 for ; Thu, 22 Apr 2021 09:41:26 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 05A976886D; Thu, 22 Apr 2021 11:41:26 +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="K+rahmIk"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 146F968863 for ; Thu, 22 Apr 2021 11:41: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 B8A029DA; Thu, 22 Apr 2021 11:41:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1619084483; bh=HIQgNWwm68K+0vmeDAg2/Cg12y25wiJip/8i/4BJiX4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=K+rahmIku+X8xW+g9KpLjJhyKAfVYOdsyqiyvpx9srTR/2ZjCZ/xBwtWHm29aqMGt gnMKcAHp42NDADuHL1A2mqzMf5nc8Tp0oC3FjHSBYUeaUnQ37en9EKwZUAGSzR6pKh epV89KCua+1Q3Ev+FaeKQK7oKdFbN5B5CxQkbcu8= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Thu, 22 Apr 2021 18:40:56 +0900 Message-Id: <20210422094102.371772-7-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210422094102.371772-1-paul.elder@ideasonboard.com> References: <20210422094102.371772-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH v2 06/12] android: camera_device: Set templates for FULL requirements 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 separate functions for manual template and still capture template. Set all template values to match FULL requirements. This patch fixes the following tests: - android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceCreateCaptureBuilder - android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceManualTemplate - android.hardware.camera2.cts.CameraDeviceTest#testCameraDevicePreviewTemplate - android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceRecordingTemplate - android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceStillTemplate - android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceVideoSnapShotTemplate Signed-off-by: Paul Elder --- All of the templates build off of the preview template, but there is one tag that the preview template doesn't initialize but the manual template adds, so we still have to allocate space for that one in the preview template. Certainly there's a better way... --- src/android/camera_device.cpp | 105 +++++++++++++++++++++++++++++++--- src/android/camera_device.h | 2 + 2 files changed, 99 insertions(+), 8 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 7f0f8f1a..c9d4afc3 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -1596,8 +1596,9 @@ std::unique_ptr CameraDevice::requestTemplatePreview() /* * \todo Keep this in sync with the actual number of entries. * Currently: 20 entries, 35 bytes + * \todo how to split this with the functions that build off of this? */ - auto requestTemplate = std::make_unique(21, 36); + auto requestTemplate = std::make_unique(30, 65); if (!requestTemplate->isValid()) { return nullptr; } @@ -1653,6 +1654,9 @@ std::unique_ptr CameraDevice::requestTemplatePreview() requestTemplate->addEntry(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); + uint8_t edgeMode = ANDROID_EDGE_MODE_FAST; + requestTemplate->addEntry(ANDROID_EDGE_MODE, &edgeMode, 1); + uint8_t flashMode = ANDROID_FLASH_MODE_OFF; requestTemplate->addEntry(ANDROID_FLASH_MODE, &flashMode, 1); @@ -1661,7 +1665,8 @@ std::unique_ptr CameraDevice::requestTemplatePreview() requestTemplate->addEntry(ANDROID_STATISTICS_FACE_DETECT_MODE, &faceDetectMode, 1); - uint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF; + /* \todo FULL expects this to be FAST, not OFF*/ + uint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_FAST; requestTemplate->addEntry(ANDROID_NOISE_REDUCTION_MODE, &noiseReduction, 1); @@ -1683,6 +1688,35 @@ std::unique_ptr CameraDevice::requestTemplatePreview() requestTemplate->addEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1); + int64_t exposureTime = 100000; + requestTemplate->addEntry(ANDROID_SENSOR_EXPOSURE_TIME, + &exposureTime, 1); + + int32_t sensorSensitivity = 32; + requestTemplate->addEntry(ANDROID_SENSOR_SENSITIVITY, + &sensorSensitivity, 1); + + bool blackLevelLock = false; + requestTemplate->addEntry(ANDROID_BLACK_LEVEL_LOCK, + &blackLevelLock, 1); + + /* Hardcode this. We ignore it if it comes in as a request key. */ + int64_t frameDuration = 33333333; + requestTemplate->addEntry(ANDROID_SENSOR_FRAME_DURATION, + &frameDuration, 1); + + uint8_t shadingMapMode = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF; + requestTemplate->addEntry(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, + &shadingMapMode, 1); + + /* \todo handle this */ + uint8_t tonemapMode = ANDROID_TONEMAP_MODE_FAST; + requestTemplate->addEntry(ANDROID_TONEMAP_MODE, &tonemapMode, 1); + + /* \todo get this from request? and set it. handle map mode too */ + uint8_t shadingMode = ANDROID_SHADING_MODE_FAST; + requestTemplate->addEntry(ANDROID_SHADING_MODE, &shadingMode, 1); + return requestTemplate; } @@ -1700,6 +1734,9 @@ std::unique_ptr CameraDevice::requestTemplateVideo() staticMetadata_->getEntry(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, &entry); + uint8_t edgeMode = ANDROID_EDGE_MODE_FAST; + previewTemplate->updateEntry(ANDROID_EDGE_MODE, &edgeMode, 1); + /* * Assume the AE_AVAILABLE_TARGET_FPS_RANGE static metadata * has been assembled as {{min, max} {max, max}}. @@ -1710,6 +1747,58 @@ std::unique_ptr CameraDevice::requestTemplateVideo() return previewTemplate; } +std::unique_ptr CameraDevice::requestTemplateStill() +{ + std::unique_ptr previewTemplate = requestTemplatePreview(); + if (!previewTemplate) + return nullptr; + + /* + * The still template with FULL requires the noise reduction mode to be + * HIGH_QUALITY. + */ + uint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY; + previewTemplate->updateEntry(ANDROID_NOISE_REDUCTION_MODE, + &noiseReduction, 1); + + uint8_t edgeMode = ANDROID_EDGE_MODE_HIGH_QUALITY; + previewTemplate->updateEntry(ANDROID_EDGE_MODE, &edgeMode, 1); + + uint8_t shadingMode = ANDROID_SHADING_MODE_HIGH_QUALITY; + previewTemplate->updateEntry(ANDROID_SHADING_MODE, &shadingMode, 1); + + uint8_t tonemapMode = ANDROID_TONEMAP_MODE_HIGH_QUALITY; + previewTemplate->updateEntry(ANDROID_TONEMAP_MODE, &tonemapMode, 1); + + return previewTemplate; +} + +std::unique_ptr CameraDevice::requestTemplateManual() +{ + std::unique_ptr previewTemplate = requestTemplatePreview(); + if (!previewTemplate) + return nullptr; + + uint8_t controlMode = ANDROID_CONTROL_MODE_OFF; + previewTemplate->updateEntry(ANDROID_CONTROL_MODE, &controlMode, 1); + + uint8_t aeMode = ANDROID_CONTROL_AE_MODE_OFF; + previewTemplate->updateEntry(ANDROID_CONTROL_AE_MODE, &aeMode, 1); + + uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_OFF; + previewTemplate->updateEntry(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); + + uint8_t edgeMode = ANDROID_EDGE_MODE_OFF; + previewTemplate->updateEntry(ANDROID_EDGE_MODE, &edgeMode, 1); + + /* \todo get this from available filter densities */ + float filterDensity = 0.0f; + previewTemplate->addEntry(ANDROID_LENS_FILTER_DENSITY, + &filterDensity, 1); + + return previewTemplate; +} + /* * Produce a metadata pack to be used as template for a capture request. */ @@ -1728,12 +1817,8 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) requestTemplate = requestTemplatePreview(); break; case CAMERA3_TEMPLATE_STILL_CAPTURE: - /* - * Use the preview template for still capture, they only differ - * for the torch mode we currently do not support. - */ captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; - requestTemplate = requestTemplatePreview(); + requestTemplate = requestTemplateStill(); break; case CAMERA3_TEMPLATE_VIDEO_RECORD: captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; @@ -1743,9 +1828,13 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; requestTemplate = requestTemplateVideo(); break; + case CAMERA3_TEMPLATE_MANUAL: + /* required for FULL */ + captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL; + requestTemplate = requestTemplateManual(); + break; /* \todo Implement templates generation for the remaining use cases. */ case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: - case CAMERA3_TEMPLATE_MANUAL: default: LOG(HAL, Error) << "Unsupported template request type: " << type; return nullptr; diff --git a/src/android/camera_device.h b/src/android/camera_device.h index 23457e47..8edbcdfd 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -104,6 +104,8 @@ private: void notifyError(uint32_t frameNumber, camera3_stream_t *stream); std::unique_ptr requestTemplatePreview(); std::unique_ptr requestTemplateVideo(); + std::unique_ptr requestTemplateStill(); + std::unique_ptr requestTemplateManual(); libcamera::PixelFormat toPixelFormat(int format) const; int processControls(Camera3RequestDescriptor *descriptor); std::unique_ptr getResultMetadata( From patchwork Thu Apr 22 09:40:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12074 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 EEF62BDB17 for ; Thu, 22 Apr 2021 09:41:28 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 890E76886A; Thu, 22 Apr 2021 11:41: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="ol8fDO0i"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id BA3C06886A for ; Thu, 22 Apr 2021 11:41:25 +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 6B6B73EE; Thu, 22 Apr 2021 11:41:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1619084485; bh=JeADEKri/fxivXxPB3eygIXKGKrdC+F0/teuLg1JhNQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ol8fDO0ifJRW4BhBD/LlwueBPOGbdj4cJIVHmOkFhPefvE3Yr3mZNAzSW54kyQpbs zrEZcwHLgcwcyLK3rrwM0otqMzp5P9Cin/g4YZRGf9om+2ksF1oncmq/mwHhrApcmW sqTo20/aoFxFXyCa6Nhj2PHzAjLLohJQvO8h1YxI= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Thu, 22 Apr 2021 18:40:57 +0900 Message-Id: <20210422094102.371772-8-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210422094102.371772-1-paul.elder@ideasonboard.com> References: <20210422094102.371772-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH v2 07/12] android: camera_device: Set result metadata for FULL requirements 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" Set the result metadata to satisfy FULL hardware level requirements. Also add the new result metadata tags to the static metadata. This fixes many tests under: - android.hardware.camera2.cts.CaptureRequestTest - testAeModeAndLock - testAntiBandingModes - testAwbModeAndLock - testBlackLevelLock - testEdgeModeControlFastFps - testNoiseReductionModeControlFastFps - testToneMapControl - android.hardware.camera2.cts.CaptureResultTest - testCameraCaptureResultAllKeys - android.hardware.camera2.cts.ImageReaderTest - testDiscardFreeBuffers - testFlexibleYuv - testJpeg - testLongProcessingRepeatingFlexibleYuv - testRepeatingJpeg - android.hardware.camera2.cts.StaticMetadataTest - testCapabilities Signed-off-by: Paul Elder --- Again, not sure if the entries in the results key list needs to be added to the static metadata allocation size. --- src/android/camera_device.cpp | 127 ++++++++++++++++++++++++++++++---- src/android/camera_device.h | 2 + 2 files changed, 117 insertions(+), 12 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index c9d4afc3..99c67555 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -402,7 +402,7 @@ CameraDevice::Camera3RequestDescriptor::Camera3RequestDescriptor( CameraDevice::CameraDevice(unsigned int id, std::shared_ptr camera) : id_(id), running_(false), camera_(std::move(camera)), - facing_(CAMERA_FACING_FRONT), orientation_(0) + facing_(CAMERA_FACING_FRONT), orientation_(0), lastTimestamp_(0) { camera_->requestCompleted.connect(this, &CameraDevice::requestComplete); @@ -776,10 +776,10 @@ std::tuple CameraDevice::calculateStaticMetadataSize() { /* * \todo Keep this in sync with the actual number of entries. - * Currently: 63 entries, 990 bytes of static metadata + * Currently: 63 entries, 1014 bytes of static metadata */ uint32_t numEntries = 63; - uint32_t byteSize = 990; + uint32_t byteSize = 1014; // do i need to add for entries in the available keys? // +1, +4 for EDGE_AVAILABLE_EDGE_MODES @@ -787,6 +787,7 @@ std::tuple CameraDevice::calculateStaticMetadataSize() // +1, +4 for BLACK_LEVEL_PATTERN // +1, +4 for TONEMAP_AVAILABLE_TONE_MAP_MODES // +1, +4 for TONEMAP_MAX_CURVE_POINTS + // +4x9 = 36 for the new result tags // +36 for new request keys @@ -1419,8 +1420,9 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() /* * required for FULL * \todo get from camera (camCapabilities[camId]->tonemapCurvePoints?) + * at least 64 */ - int32_t tonemapCurvePoints = 0; + int32_t tonemapCurvePoints = 64; staticMetadata_->addEntry(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1); @@ -1526,6 +1528,9 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() ANDROID_SHADING_MODE, ANDROID_STATISTICS_FACE_DETECT_MODE, ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, + ANDROID_TONEMAP_CURVE_BLUE, + ANDROID_TONEMAP_CURVE_GREEN, + ANDROID_TONEMAP_CURVE_RED, ANDROID_TONEMAP_MODE, }; staticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, @@ -1533,6 +1538,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() availableRequestKeys.size()); std::vector availableResultKeys = { + ANDROID_BLACK_LEVEL_LOCK, ANDROID_COLOR_CORRECTION_ABERRATION_MODE, ANDROID_CONTROL_AE_ANTIBANDING_MODE, ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, @@ -1552,8 +1558,10 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() ANDROID_CONTROL_MODE, ANDROID_CONTROL_SCENE_MODE, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, + ANDROID_EDGE_MODE, ANDROID_FLASH_MODE, ANDROID_FLASH_STATE, + ANDROID_HOT_PIXEL_MODE, ANDROID_JPEG_GPS_COORDINATES, ANDROID_JPEG_GPS_PROCESSING_METHOD, ANDROID_JPEG_GPS_TIMESTAMP, @@ -1563,20 +1571,30 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() ANDROID_JPEG_THUMBNAIL_QUALITY, ANDROID_JPEG_THUMBNAIL_SIZE, ANDROID_LENS_APERTURE, + ANDROID_LENS_FILTER_DENSITY, ANDROID_LENS_FOCAL_LENGTH, + ANDROID_LENS_FOCUS_DISTANCE, + ANDROID_LENS_FOCUS_RANGE, // undocumented ANDROID_LENS_OPTICAL_STABILIZATION_MODE, ANDROID_LENS_STATE, ANDROID_NOISE_REDUCTION_MODE, ANDROID_REQUEST_PIPELINE_DEPTH, ANDROID_SCALER_CROP_REGION, ANDROID_SENSOR_EXPOSURE_TIME, + ANDROID_SENSOR_FRAME_DURATION, ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, + ANDROID_SENSOR_SENSITIVITY, ANDROID_SENSOR_TEST_PATTERN_MODE, ANDROID_SENSOR_TIMESTAMP, + ANDROID_SHADING_MODE, ANDROID_STATISTICS_FACE_DETECT_MODE, ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, ANDROID_STATISTICS_SCENE_FLICKER, + ANDROID_TONEMAP_CURVE_BLUE, + ANDROID_TONEMAP_CURVE_GREEN, + ANDROID_TONEMAP_CURVE_RED, + ANDROID_TONEMAP_MODE, }; staticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_RESULT_KEYS, availableResultKeys.data(), @@ -2277,6 +2295,10 @@ void CameraDevice::requestComplete(Request *request) resultMetadata = getResultMetadata(descriptor); + const ControlList &metadata = descriptor->request_->metadata(); + if (metadata.contains(controls::SensorTimestamp)) + lastTimestamp_ = metadata.get(controls::SensorTimestamp); + /* Handle any JPEG compression. */ for (camera3_stream_buffer_t &buffer : descriptor.buffers_) { CameraStream *cameraStream = @@ -2416,7 +2438,7 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons * Total bytes for JPEG metadata: 82 */ std::unique_ptr resultMetadata = - std::make_unique(44, 166); + std::make_unique(57, 303); if (!resultMetadata->isValid()) { LOG(HAL, Error) << "Failed to allocate result metadata"; return nullptr; @@ -2428,6 +2450,11 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons * from libcamera::Request::metadata. */ + /* FULL */ + found = settings.getEntry(ANDROID_BLACK_LEVEL_LOCK, &entry); + bool valueBool = found ? *entry.data.u8 : false; + resultMetadata->addEntry(ANDROID_BLACK_LEVEL_LOCK, &valueBool, 1); + uint8_t value = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF; resultMetadata->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, &value, 1); @@ -2439,8 +2466,11 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons resultMetadata->addEntry(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &value32, 1); + /* \todo apply this */ value = ANDROID_CONTROL_AE_LOCK_OFF; - resultMetadata->addEntry(ANDROID_CONTROL_AE_LOCK, &value, 1); + found = settings.getEntry(ANDROID_CONTROL_AE_LOCK, &entry); + resultMetadata->addEntry(ANDROID_CONTROL_AE_LOCK, + found ? entry.data.u8 : &value, 1); value = ANDROID_CONTROL_AE_MODE_ON; resultMetadata->addEntry(ANDROID_CONTROL_AE_MODE, &value, 1); @@ -2472,12 +2502,16 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons resultMetadata->addEntry(ANDROID_CONTROL_AF_TRIGGER, &value, 1); value = ANDROID_CONTROL_AWB_MODE_AUTO; - resultMetadata->addEntry(ANDROID_CONTROL_AWB_MODE, &value, 1); + found = settings.getEntry(ANDROID_CONTROL_AWB_MODE, &entry); + resultMetadata->addEntry(ANDROID_CONTROL_AWB_MODE, + found ? entry.data.u8 : &value, 1); - value = ANDROID_CONTROL_AWB_LOCK_OFF; + found = settings.getEntry(ANDROID_CONTROL_AWB_LOCK, &entry); + value = found ? *entry.data.u8 : ANDROID_CONTROL_AWB_LOCK_OFF; resultMetadata->addEntry(ANDROID_CONTROL_AWB_LOCK, &value, 1); - value = ANDROID_CONTROL_AWB_STATE_CONVERGED; + value = value ? ANDROID_CONTROL_AWB_STATE_LOCKED : + ANDROID_CONTROL_AWB_STATE_CONVERGED; resultMetadata->addEntry(ANDROID_CONTROL_AWB_STATE, &value, 1); value = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; @@ -2495,18 +2529,37 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons value = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; resultMetadata->addEntry(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &value, 1); + found = settings.getEntry(ANDROID_EDGE_MODE, &entry); + value = found ? *entry.data.u8 : ANDROID_EDGE_MODE_OFF; + resultMetadata->addEntry(ANDROID_EDGE_MODE, &value, 1); + value = ANDROID_FLASH_MODE_OFF; resultMetadata->addEntry(ANDROID_FLASH_MODE, &value, 1); value = ANDROID_FLASH_STATE_UNAVAILABLE; resultMetadata->addEntry(ANDROID_FLASH_STATE, &value, 1); + value = ANDROID_HOT_PIXEL_MODE_OFF; + resultMetadata->addEntry(ANDROID_HOT_PIXEL_MODE, &value, 1); + if (settings.getEntry(ANDROID_LENS_APERTURE, &entry)) resultMetadata->addEntry(ANDROID_LENS_APERTURE, entry.data.f, 1); + float filterDensity = 0.0f; + resultMetadata->addEntry(ANDROID_LENS_FILTER_DENSITY, + &filterDensity, 1); + float focal_length = 1.0; resultMetadata->addEntry(ANDROID_LENS_FOCAL_LENGTH, &focal_length, 1); + float focusDistance = 0.0f; + resultMetadata->addEntry(ANDROID_LENS_FOCUS_DISTANCE, + &focusDistance, 1); + + /* there's no documentation on this */ + float focusRange[] = { 0.0f, 1.0f }; + resultMetadata->addEntry(ANDROID_LENS_FOCUS_RANGE, &focusRange, 2); + value = ANDROID_LENS_STATE_STATIONARY; resultMetadata->addEntry(ANDROID_LENS_STATE, &value, 1); @@ -2518,6 +2571,11 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons resultMetadata->addEntry(ANDROID_SENSOR_TEST_PATTERN_MODE, &value32, 1); + + /* \todo get this from request? and set it. handle map mode too */ + value = ANDROID_SHADING_MODE_OFF; + resultMetadata->addEntry(ANDROID_SHADING_MODE, &value, 1); + value = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; resultMetadata->addEntry(ANDROID_STATISTICS_FACE_DETECT_MODE, &value, 1); @@ -2534,14 +2592,48 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons resultMetadata->addEntry(ANDROID_STATISTICS_SCENE_FLICKER, &value, 1); + /* \todo handle this */ + found = settings.getEntry(ANDROID_TONEMAP_MODE, &entry); + value = found ? *entry.data.u8 : ANDROID_TONEMAP_MODE_FAST; + resultMetadata->addEntry(ANDROID_TONEMAP_MODE, &value, 1); + value = ANDROID_NOISE_REDUCTION_MODE_OFF; - resultMetadata->addEntry(ANDROID_NOISE_REDUCTION_MODE, &value, 1); + found = settings.getEntry(ANDROID_NOISE_REDUCTION_MODE, &entry); + resultMetadata->addEntry(ANDROID_NOISE_REDUCTION_MODE, + found ? entry.data.u8 : &value, 1); /* 33.3 msec */ const int64_t rolling_shutter_skew = 33300000; resultMetadata->addEntry(ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, &rolling_shutter_skew, 1); + /* + * CTS doesn't actually check if this is equal to the requested + * tonemap, so just set a linear tonemap + * it's in [in, out] [in, out] format + */ + std::vector tonemap = { + 0.0, 0.0, + 1.0, 1.0, + }; + resultMetadata->addEntry(ANDROID_TONEMAP_CURVE_BLUE, + tonemap.data(), tonemap.size()); + resultMetadata->addEntry(ANDROID_TONEMAP_CURVE_GREEN, + tonemap.data(), tonemap.size()); + resultMetadata->addEntry(ANDROID_TONEMAP_CURVE_RED, + tonemap.data(), tonemap.size()); + + /* + * \todo get the tonemap gamma and tonemap preset curve from request + * and copy to result + */ + + /* \todo get this from camera */ + value32 = 32; + found = settings.getEntry(ANDROID_SENSOR_SENSITIVITY, &entry); + resultMetadata->addEntry(ANDROID_SENSOR_SENSITIVITY, + found ? entry.data.i32 : &value32, 1); + /* Add metadata tags reported by libcamera. */ if (metadata.contains(controls::draft::PipelineDepth)) { uint8_t pipeline_depth = @@ -2550,15 +2642,26 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons &pipeline_depth, 1); } - if (metadata.contains(controls::ExposureTime)) { + found = settings.getEntry(ANDROID_SENSOR_EXPOSURE_TIME, &entry); + if (found || metadata.contains(controls::ExposureTime)) { int64_t exposure = metadata.get(controls::ExposureTime) * 1000ULL; resultMetadata->addEntry(ANDROID_SENSOR_EXPOSURE_TIME, - &exposure, 1); + found ? entry.data.i64 : &exposure, 1); } if (metadata.contains(controls::SensorTimestamp)) { int64_t timestamp = metadata.get(controls::SensorTimestamp); resultMetadata->addEntry(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); + + int64_t frameDuration = timestamp - lastTimestamp_; + /* + * frame duration should be at last as long as the requested + * exposure time, hardcode it for now + */ + if (found && frameDuration < *entry.data.i64) + frameDuration = *entry.data.i64; + resultMetadata->addEntry(ANDROID_SENSOR_FRAME_DURATION, + &frameDuration, 1); } if (metadata.contains(controls::ScalerCrop)) { diff --git a/src/android/camera_device.h b/src/android/camera_device.h index 8edbcdfd..fcd57fcd 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -139,6 +139,8 @@ private: unsigned int maxJpegBufferSize_; + int64_t lastTimestamp_; + CameraMetadata lastSettings_; }; From patchwork Thu Apr 22 09:40:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12075 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 60B94BDB17 for ; Thu, 22 Apr 2021 09:41:31 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id D358468863; Thu, 22 Apr 2021 11:41:30 +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="siGthfA6"; 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 7979A68866 for ; Thu, 22 Apr 2021 11:41:27 +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 1EEDF3EE; Thu, 22 Apr 2021 11:41:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1619084487; bh=AfHgskQzbZnCKUuTmS4VrHZbo/Ol9dJIPc7mY5BTcuE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=siGthfA69jafD2hJ6sFTDq58dUscSIpteJe6IDcyY9RLmzpJym5heuDpVOyOCco6r HLI2oFvRc8JAGatlodE+lhy9cOykGddOGxJ7z0tq5rbuKA5eRRRfz3TQJIwaPbuArS 747sbl20I9FO1TDkhTWdMOCQhe/TUdpb6EGwl4lo= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Thu, 22 Apr 2021 18:40:58 +0900 Message-Id: <20210422094102.371772-9-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210422094102.371772-1-paul.elder@ideasonboard.com> References: <20210422094102.371772-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH v2 08/12] controls: Add controls necessary for FULL compliance 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 controls necessary for FULL compliance: - BlackLevelLocked - EdgeMode - FrameDuration - SensorSensitivity - TonemapMode While at it, change the names of some AwbState values to be consistent and to avoid potential conflicts with AwbLocked. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart --- src/libcamera/control_ids.yaml | 78 +++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/src/libcamera/control_ids.yaml b/src/libcamera/control_ids.yaml index f025819a..61c5c96f 100644 --- a/src/libcamera/control_ids.yaml +++ b/src/libcamera/control_ids.yaml @@ -420,6 +420,13 @@ controls: The camera will cancel any active trigger and the AF routine is reset to its initial state. + - BlackLevelLocked: + type: bool + draft: true + description: | + Whether black-level compensation is locked to its current values, or is + free to vary. Currently identical to ANDROID_BLACK_LEVEL_LOCK. + - NoiseReductionMode: type: int32_t draft: true @@ -554,13 +561,46 @@ controls: - name: AwbStateSearching value: 1 description: The AWB algorithm has not converged yet. - - name: AwbConverged + - name: AwbStateConverged value: 2 description: The AWB algorithm has converged. - - name: AwbLocked + - name: AwbStateLocked value: 3 description: The AWB algorithm is locked. + - EdgeMode: + type: int32_t + draft: true + description: | + Control to report the operation mode of edge enhancement. Currently + identical to ANDROID_EDGE_MODE. + enum: + - name: EdgeModeOff + value: 0 + description: No edge enhancement is applied. + - name: EdgeModeFast + value: 1 + description: | + Apply edge enhancement at a quality level tha does not + slow down frame rate relative to sensor output. + - name: EdgeModeHighQuality + value: 2 + description: | + Apply high-quality edge enhancement, at a cost of possible reduced + output frame rate. + - name: EdgeModeZSL + value: 3 + description: | + Edge enhancement is applied at different levels for different output + streams, based on resolution. + + - FrameDuration: + type: int64_t + draft: true + description: | + Duration from start of frame exposure to start of next frame exposure, in + nanoseconds. Currently identical to ANDROID_SENSOR_FRAME_DURATION. + - SensorRollingShutterSkew: type: int64_t draft: true @@ -569,6 +609,13 @@ controls: row and the start of exposure of the last row. Currently identical to ANDROID_SENSOR_ROLLING_SHUTTER_SKEW + - SensorSensitivity: + type: int32_t + draft: true + description: | + The amount of gain applied to sensor data before processing. Currently + identical to ANDROID_SENSOR_SENSITIVITY. + - LensShadingMapMode: type: int32_t draft: true @@ -600,6 +647,33 @@ controls: value: 2 description: 60Hz flickering detected. + - TonemapMode: + type: int32_t + draft: true + description: | + High-level global contrast/gamma/tonemapping control. Currently identical + to ANDROID_TONEMAP_MODE. + enum: + - name: TonemapModeContrastCurve + value: 0 + description: Use the specified tonemapping curve. + - name: TonemapModeFast + value: 1 + description: | + Advanced gamma mapping and color enhancement may be applied, without + reducing frame rate compared to raw sensor output. + - name: TonemapModeHighQuality + value: 2 + description: | + High-quality gamma mapping and color enhancement will be applied, at + the cost of possibly reduced frame rate compared to raw sensor output. + - name: TonemapModeGammaValue + value: 3 + description: Use the specified gamma value for tonemapping. + - name: TonemapModePresetCurve + value: 4 + description: Use the specified preset tonemapping curve. + - PipelineDepth: type: int32_t draft: true From patchwork Thu Apr 22 09:40:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12076 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 416DABDB17 for ; Thu, 22 Apr 2021 09:41:32 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E2BB76885E; Thu, 22 Apr 2021 11:41:31 +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="q+VfUPsH"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 270CE6885A for ; Thu, 22 Apr 2021 11:41:29 +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 C0FDB3EE; Thu, 22 Apr 2021 11:41:27 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1619084488; bh=fp6PnHlLUN8w+sOPVCI/naUNJevLG7Zp/k/mvZLz8kI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=q+VfUPsH7J5+iMmumDXdhTPaDFY0Rf/IW9vkiQ09Z3nR6ruNjKGDQtIpYnjVDwKLv KrzVTl9OQ5VEWzb3XCxrv+JkVDoNwP5oTrq5Lgo+MCQV6keTIUqjIqDXg0P+Zee/tP xGq3ljeYTT85fqGaTmLgiJn5GBO8wepuO6RPJEU0= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Thu, 22 Apr 2021 18:40:59 +0900 Message-Id: <20210422094102.371772-10-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210422094102.371772-1-paul.elder@ideasonboard.com> References: <20210422094102.371772-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH v2 09/12] pipeline: ipu3: Add controls for FULL compliance 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 controls to IPU3Controls that are necessary for FULL compliance. Signed-off-by: Paul Elder --- src/libcamera/pipeline/ipu3/ipu3.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 28e849a4..70a5e9ce 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -48,8 +48,27 @@ static constexpr unsigned int IMGU_OUTPUT_WIDTH_MARGIN = 64; static constexpr unsigned int IMGU_OUTPUT_HEIGHT_MARGIN = 32; static constexpr Size IPU3ViewfinderSize(1280, 720); +const std::array IPU3NoiseReductionModeValues = { + static_cast(controls::draft::NoiseReductionModeOff), + static_cast(controls::draft::NoiseReductionModeFast), + static_cast(controls::draft::NoiseReductionModeHighQuality), +}; + static const ControlInfoMap::Map IPU3Controls = { { &controls::draft::PipelineDepth, ControlInfo(2, 3) }, + { &controls::draft::BlackLevelLocked, ControlInfo(false, true) }, + { &controls::AeLocked, ControlInfo(false, true) }, + { &controls::draft::AePrecaptureTrigger, + ControlInfo(controls::draft::AePrecaptureTriggerValues) }, + { &controls::AwbMode, ControlInfo(controls::AwbModeValues) }, + { &controls::AwbLocked, ControlInfo(false, true) }, + { &controls::draft::EdgeMode, + ControlInfo(controls::draft::EdgeModeValues) }, + { &controls::draft::NoiseReductionMode, + ControlInfo(IPU3NoiseReductionModeValues) }, + { &controls::draft::SensorSensitivity, ControlInfo(32, 2400) }, + { &controls::draft::TonemapMode, + ControlInfo(controls::draft::TonemapModeValues) }, }; class IPU3CameraData : public CameraData From patchwork Thu Apr 22 09:41:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12077 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 2CEE4BDB17 for ; Thu, 22 Apr 2021 09:41:34 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id AF63E68865; Thu, 22 Apr 2021 11:41:33 +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="iPcup3IU"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id AF47A6883E for ; Thu, 22 Apr 2021 11:41:30 +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 707863EE; Thu, 22 Apr 2021 11:41:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1619084490; bh=u/VhtE817BG5sUZK4UJUd8b8nK3Jeg1JwwZWsNU1cBk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iPcup3IU5j3dvfVdOcpKKuhj8f1t5MqRzuwIK9mhWpAIH6vAMeaoYBj+ZJLD/gPPd qu33od9yPHzU6KTSgfwRpX7CJOEcIH6rx5DXHKbY83y1lWI7robZ8gLe9zhWpYYzfK 0FjrlIXuqq/dZJmpOSWzSKBjeJZcz9KEDfvQE4x0= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Thu, 22 Apr 2021 18:41:00 +0900 Message-Id: <20210422094102.371772-11-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210422094102.371772-1-paul.elder@ideasonboard.com> References: <20210422094102.371772-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH v2 10/12] android: camera_device: Translate android controls to libcamera controls 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" Translate the newly added android controls that are required to FULL compliance into libcamera controls before sending them to the Camera. Signed-off-by: Paul Elder Reviewed-by: Jacopo Mondi --- src/android/camera_device.cpp | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 99c67555..30692a67 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -2136,15 +2136,46 @@ int CameraDevice::processControls(Camera3RequestDescriptor *descriptor) /* Translate the Android request settings to libcamera controls. */ camera_metadata_ro_entry_t entry; + ControlList &controls = descriptor->request_->controls(); + if (settings.getEntry(ANDROID_SCALER_CROP_REGION, &entry)) { const int32_t *data = entry.data.i32; Rectangle cropRegion{ data[0], data[1], static_cast(data[2]), static_cast(data[3]) }; - ControlList &controls = descriptor->request_->controls(); controls.set(controls::ScalerCrop, cropRegion); } + if (settings.getEntry(ANDROID_SENSOR_EXPOSURE_TIME, &entry)) + controls.set(controls::ExposureTime, *entry.data.i64 / 1000ULL); + + if (settings.getEntry(ANDROID_BLACK_LEVEL_LOCK, &entry)) + controls.set(controls::draft::BlackLevelLocked, *entry.data.u8); + + if (settings.getEntry(ANDROID_CONTROL_AE_LOCK, &entry)) + controls.set(controls::AeLocked, *entry.data.u8); + + if (settings.getEntry(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, &entry)) + controls.set(controls::draft::AePrecaptureTrigger, *entry.data.u8); + + if (settings.getEntry(ANDROID_CONTROL_AWB_MODE, &entry)) + controls.set(controls::AwbMode, *entry.data.u8); + + if (settings.getEntry(ANDROID_CONTROL_AWB_LOCK, &entry)) + controls.set(controls::AwbLocked, *entry.data.u8); + + if (settings.getEntry(ANDROID_EDGE_MODE, &entry)) + controls.set(controls::draft::EdgeMode, *entry.data.u8); + + if (settings.getEntry(ANDROID_NOISE_REDUCTION_MODE, &entry)) + controls.set(controls::draft::NoiseReductionMode, *entry.data.u8); + + if (settings.getEntry(ANDROID_SENSOR_SENSITIVITY, &entry)) + controls.set(controls::draft::SensorSensitivity, *entry.data.i32); + + if (settings.getEntry(ANDROID_TONEMAP_MODE, &entry)) + controls.set(controls::draft::TonemapMode, *entry.data.u8); + return 0; } From patchwork Thu Apr 22 09:41:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12078 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 53F2ABDB17 for ; Thu, 22 Apr 2021 09:41:35 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0FEE068871; Thu, 22 Apr 2021 11:41:35 +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="FYYZ9zVk"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7B77C68873 for ; Thu, 22 Apr 2021 11:41:32 +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 1C0023EE; Thu, 22 Apr 2021 11:41:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1619084492; bh=gPz8fEnlfgcGENnZrqlXy3CU8jc3xyMPytdFpKkmHn8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FYYZ9zVkAlyH0YBVaPwuGeDHaxCl2zwbQZxiu3xGc+F6vg8vgAUlPdGnl3XacXF2f sgYo8iOzoTwImrB6M5Q3zKUJRBa4NuLBfab6IKY7iCPpg3XPgpkVeOO8+VOMMBdRxz FKsMjpwElFPVwErZNQS4C1Karvse7metJeuo1HEI= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Thu, 22 Apr 2021 18:41:01 +0900 Message-Id: <20210422094102.371772-12-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210422094102.371772-1-paul.elder@ideasonboard.com> References: <20210422094102.371772-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH v2 11/12] pipeline: ipu3: Set request metadata for FULL compliance 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" Set the request metadata as required by FULL hardware level. Signed-off-by: Paul Elder --- src/libcamera/pipeline/ipu3/ipu3.cpp | 67 ++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 70a5e9ce..de90b9fe 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -75,7 +75,8 @@ class IPU3CameraData : public CameraData { public: IPU3CameraData(PipelineHandler *pipe) - : CameraData(pipe), exposureTime_(0), supportsFlips_(false) + : CameraData(pipe), exposureTime_(0), supportsFlips_(false), + lastTimestamp_(0) { } @@ -106,6 +107,8 @@ public: private: void queueFrameAction(unsigned int id, const ipa::ipu3::IPU3Action &action); + + int64_t lastTimestamp_; }; class IPU3CameraConfiguration : public CameraConfiguration @@ -1249,12 +1252,65 @@ void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer) request->metadata().set(controls::draft::PipelineDepth, 3); /* \todo Move the ExposureTime control to the IPA. */ - request->metadata().set(controls::ExposureTime, exposureTime_); + request->metadata().set(controls::ExposureTime, + request->controls().contains(controls::ExposureTime) ? + request->controls().get(controls::ExposureTime) : + exposureTime_); /* \todo Actually apply the scaler crop region to the ImgU. */ if (request->controls().contains(controls::ScalerCrop)) cropRegion_ = request->controls().get(controls::ScalerCrop); request->metadata().set(controls::ScalerCrop, cropRegion_); + request->metadata().set(controls::draft::BlackLevelLocked, + request->controls().contains(controls::draft::BlackLevelLocked) ? + request->controls().get(controls::draft::BlackLevelLocked) : + false); + + request->metadata().set(controls::AeLocked, + request->controls().contains(controls::AeLocked) ? + request->controls().get(controls::AeLocked) : + false); + + request->metadata().set(controls::draft::AePrecaptureTrigger, + request->controls().contains(controls::draft::AePrecaptureTrigger) ? + request->controls().get(controls::draft::AePrecaptureTrigger) : + controls::draft::AePrecaptureTriggerIdle); + + request->metadata().set(controls::AwbMode, + request->controls().contains(controls::AwbMode) ? + request->controls().get(controls::AwbMode) : + controls::AwbAuto); + + request->metadata().set(controls::AwbLocked, + request->controls().contains(controls::AwbLocked) ? + request->controls().get(controls::AwbLocked) : + false); + + request->metadata().set(controls::draft::EdgeMode, + request->controls().contains(controls::draft::EdgeMode) ? + request->controls().get(controls::draft::EdgeMode) : + (uint8_t)controls::draft::EdgeModeOff); + + request->metadata().set(controls::draft::NoiseReductionMode, + request->controls().contains(controls::draft::NoiseReductionMode) ? + request->controls().get(controls::draft::NoiseReductionMode) : + controls::draft::NoiseReductionModeOff); + + request->metadata().set(controls::draft::SensorSensitivity, + request->controls().contains(controls::draft::SensorSensitivity) ? + request->controls().get(controls::draft::SensorSensitivity) : + 32); + + if (request->metadata().get(controls::draft::FrameDuration) < + request->metadata().get(controls::ExposureTime) * 1000) + request->metadata().set(controls::draft::FrameDuration, + request->metadata().get(controls::ExposureTime) * 1000); + + request->metadata().set(controls::draft::TonemapMode, + request->controls().contains(controls::draft::TonemapMode) ? + request->controls().get(controls::draft::TonemapMode) : + (uint8_t)controls::draft::TonemapModeFast); + if (frameInfos_.tryComplete(info)) pipe_->completeRequest(request); } @@ -1280,8 +1336,13 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer) * \todo The sensor timestamp should be better estimated by connecting * to the V4L2Device::frameStart signal. */ + int64_t timestamp = buffer->metadata().timestamp; request->metadata().set(controls::SensorTimestamp, - buffer->metadata().timestamp); + timestamp); + + request->metadata().set(controls::draft::FrameDuration, + timestamp - lastTimestamp_); + lastTimestamp_ = timestamp; /* If the buffer is cancelled force a complete of the whole request. */ if (buffer->metadata().status == FrameMetadata::FrameCancelled) { From patchwork Thu Apr 22 09:41:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 12079 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 AE01CBDB17 for ; Thu, 22 Apr 2021 09:41:37 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 621D56886B; Thu, 22 Apr 2021 11:41:37 +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="G9z1XEgV"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2B00368863 for ; Thu, 22 Apr 2021 11:41:34 +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 BE709AF2; Thu, 22 Apr 2021 11:41:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1619084493; bh=rDR6t0LFMl6rqOEBGAJFt0Yj8iAF4p4dZvFHEkl5B5Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=G9z1XEgVQEOL83K5O0GOr/iUxF1IAwILEYC8HvbJvxN1kox1Zlb8Pmb33niabXkfr BWuEB9wmG3zz6g63B9Xte1p6l8zjR10lLNlmPf5PxjLv65UN+qdqBZOMaxAkq2X6bg nOyU6SM5xoVU8jFGLfHRd2n0M9moIXlzxk1XyE9A= From: Paul Elder To: libcamera-devel@lists.libcamera.org Date: Thu, 22 Apr 2021 18:41:02 +0900 Message-Id: <20210422094102.371772-13-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210422094102.371772-1-paul.elder@ideasonboard.com> References: <20210422094102.371772-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC PATCH v2 12/12] android camera_device: Set result metadata from libcamera metadata 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" Set the result metadata required for FULL hardware level based on the metadata returned from libcamera. Signed-off-by: Paul Elder --- src/android/camera_device.cpp | 98 ++++++++++++++++------------------- src/android/camera_device.h | 2 - 2 files changed, 46 insertions(+), 54 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 30692a67..303767e5 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -402,7 +402,7 @@ CameraDevice::Camera3RequestDescriptor::Camera3RequestDescriptor( CameraDevice::CameraDevice(unsigned int id, std::shared_ptr camera) : id_(id), running_(false), camera_(std::move(camera)), - facing_(CAMERA_FACING_FRONT), orientation_(0), lastTimestamp_(0) + facing_(CAMERA_FACING_FRONT), orientation_(0) { camera_->requestCompleted.connect(this, &CameraDevice::requestComplete); @@ -2326,10 +2326,6 @@ void CameraDevice::requestComplete(Request *request) resultMetadata = getResultMetadata(descriptor); - const ControlList &metadata = descriptor->request_->metadata(); - if (metadata.contains(controls::SensorTimestamp)) - lastTimestamp_ = metadata.get(controls::SensorTimestamp); - /* Handle any JPEG compression. */ for (camera3_stream_buffer_t &buffer : descriptor.buffers_) { CameraStream *cameraStream = @@ -2450,7 +2446,6 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons const ControlList &metadata = descriptor.request_->metadata(); const CameraMetadata &settings = descriptor.settings_; camera_metadata_ro_entry_t entry; - bool found; /* * \todo Keep this in sync with the actual number of entries. @@ -2482,9 +2477,10 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons */ /* FULL */ - found = settings.getEntry(ANDROID_BLACK_LEVEL_LOCK, &entry); - bool valueBool = found ? *entry.data.u8 : false; - resultMetadata->addEntry(ANDROID_BLACK_LEVEL_LOCK, &valueBool, 1); + if (metadata.contains(controls::draft::BlackLevelLocked)) { + bool valueBool = metadata.get(controls::draft::BlackLevelLocked); + resultMetadata->addEntry(ANDROID_BLACK_LEVEL_LOCK, &valueBool, 1); + } uint8_t value = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF; resultMetadata->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, @@ -2497,11 +2493,10 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons resultMetadata->addEntry(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &value32, 1); - /* \todo apply this */ - value = ANDROID_CONTROL_AE_LOCK_OFF; - found = settings.getEntry(ANDROID_CONTROL_AE_LOCK, &entry); - resultMetadata->addEntry(ANDROID_CONTROL_AE_LOCK, - found ? entry.data.u8 : &value, 1); + if (metadata.contains(controls::AeLocked)) { + value = metadata.get(controls::AeLocked); + resultMetadata->addEntry(ANDROID_CONTROL_AE_LOCK, &value, 1); + } value = ANDROID_CONTROL_AE_MODE_ON; resultMetadata->addEntry(ANDROID_CONTROL_AE_MODE, &value, 1); @@ -2515,10 +2510,11 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons resultMetadata->addEntry(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, entry.data.i32, 2); - value = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE; - found = settings.getEntry(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, &entry); - resultMetadata->addEntry(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, - found ? entry.data.u8 : &value, 1); + if (metadata.contains(controls::draft::AePrecaptureTrigger)) { + value = metadata.get(controls::draft::AePrecaptureTrigger); + resultMetadata->addEntry(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, + &value, 1); + } value = ANDROID_CONTROL_AE_STATE_CONVERGED; resultMetadata->addEntry(ANDROID_CONTROL_AE_STATE, &value, 1); @@ -2532,14 +2528,15 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons value = ANDROID_CONTROL_AF_TRIGGER_IDLE; resultMetadata->addEntry(ANDROID_CONTROL_AF_TRIGGER, &value, 1); - value = ANDROID_CONTROL_AWB_MODE_AUTO; - found = settings.getEntry(ANDROID_CONTROL_AWB_MODE, &entry); - resultMetadata->addEntry(ANDROID_CONTROL_AWB_MODE, - found ? entry.data.u8 : &value, 1); + if (metadata.contains(controls::AwbMode)) { + value = metadata.get(controls::AwbMode); + resultMetadata->addEntry(ANDROID_CONTROL_AWB_MODE, &value, 1); + } - found = settings.getEntry(ANDROID_CONTROL_AWB_LOCK, &entry); - value = found ? *entry.data.u8 : ANDROID_CONTROL_AWB_LOCK_OFF; - resultMetadata->addEntry(ANDROID_CONTROL_AWB_LOCK, &value, 1); + if (metadata.contains(controls::AwbLocked)) { + value = metadata.get(controls::AwbLocked); + resultMetadata->addEntry(ANDROID_CONTROL_AWB_LOCK, &value, 1); + } value = value ? ANDROID_CONTROL_AWB_STATE_LOCKED : ANDROID_CONTROL_AWB_STATE_CONVERGED; @@ -2560,9 +2557,10 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons value = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; resultMetadata->addEntry(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &value, 1); - found = settings.getEntry(ANDROID_EDGE_MODE, &entry); - value = found ? *entry.data.u8 : ANDROID_EDGE_MODE_OFF; - resultMetadata->addEntry(ANDROID_EDGE_MODE, &value, 1); + if (metadata.contains(controls::draft::EdgeMode)) { + value = metadata.get(controls::draft::EdgeMode); + resultMetadata->addEntry(ANDROID_EDGE_MODE, &value, 1); + } value = ANDROID_FLASH_MODE_OFF; resultMetadata->addEntry(ANDROID_FLASH_MODE, &value, 1); @@ -2623,15 +2621,16 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons resultMetadata->addEntry(ANDROID_STATISTICS_SCENE_FLICKER, &value, 1); - /* \todo handle this */ - found = settings.getEntry(ANDROID_TONEMAP_MODE, &entry); - value = found ? *entry.data.u8 : ANDROID_TONEMAP_MODE_FAST; - resultMetadata->addEntry(ANDROID_TONEMAP_MODE, &value, 1); + if (metadata.contains(controls::draft::TonemapMode)) { + value = metadata.get(controls::draft::TonemapMode); + resultMetadata->addEntry(ANDROID_TONEMAP_MODE, &value, 1); + } - value = ANDROID_NOISE_REDUCTION_MODE_OFF; - found = settings.getEntry(ANDROID_NOISE_REDUCTION_MODE, &entry); - resultMetadata->addEntry(ANDROID_NOISE_REDUCTION_MODE, - found ? entry.data.u8 : &value, 1); + if (metadata.contains(controls::draft::NoiseReductionMode)) { + value = metadata.get(controls::draft::NoiseReductionMode); + resultMetadata->addEntry(ANDROID_NOISE_REDUCTION_MODE, + &value, 1); + } /* 33.3 msec */ const int64_t rolling_shutter_skew = 33300000; @@ -2659,11 +2658,11 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons * and copy to result */ - /* \todo get this from camera */ - value32 = 32; - found = settings.getEntry(ANDROID_SENSOR_SENSITIVITY, &entry); - resultMetadata->addEntry(ANDROID_SENSOR_SENSITIVITY, - found ? entry.data.i32 : &value32, 1); + if (metadata.contains(controls::draft::SensorSensitivity)) { + value32 = metadata.get(controls::draft::SensorSensitivity); + resultMetadata->addEntry(ANDROID_SENSOR_SENSITIVITY, + &value32, 1); + } /* Add metadata tags reported by libcamera. */ if (metadata.contains(controls::draft::PipelineDepth)) { @@ -2673,26 +2672,21 @@ CameraDevice::getResultMetadata(const Camera3RequestDescriptor &descriptor) cons &pipeline_depth, 1); } - found = settings.getEntry(ANDROID_SENSOR_EXPOSURE_TIME, &entry); - if (found || metadata.contains(controls::ExposureTime)) { + if (metadata.contains(controls::ExposureTime)) { int64_t exposure = metadata.get(controls::ExposureTime) * 1000ULL; resultMetadata->addEntry(ANDROID_SENSOR_EXPOSURE_TIME, - found ? entry.data.i64 : &exposure, 1); + &exposure, 1); } if (metadata.contains(controls::SensorTimestamp)) { int64_t timestamp = metadata.get(controls::SensorTimestamp); resultMetadata->addEntry(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); + } - int64_t frameDuration = timestamp - lastTimestamp_; - /* - * frame duration should be at last as long as the requested - * exposure time, hardcode it for now - */ - if (found && frameDuration < *entry.data.i64) - frameDuration = *entry.data.i64; + if (metadata.contains(controls::draft::FrameDuration)) { + int64_t duration = metadata.get(controls::draft::FrameDuration); resultMetadata->addEntry(ANDROID_SENSOR_FRAME_DURATION, - &frameDuration, 1); + &duration, 1); } if (metadata.contains(controls::ScalerCrop)) { diff --git a/src/android/camera_device.h b/src/android/camera_device.h index fcd57fcd..8edbcdfd 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -139,8 +139,6 @@ private: unsigned int maxJpegBufferSize_; - int64_t lastTimestamp_; - CameraMetadata lastSettings_; };