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(