{"id":12073,"url":"https://patchwork.libcamera.org/api/1.1/patches/12073/?format=json","web_url":"https://patchwork.libcamera.org/patch/12073/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20210422094102.371772-7-paul.elder@ideasonboard.com>","date":"2021-04-22T09:40:56","name":"[libcamera-devel,RFC,v2,06/12] android: camera_device: Set templates for FULL requirements","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"d124d7e8b1a9a317efcf4161626460b9274cc312","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/1.1/people/17/?format=json","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"delegate":{"id":17,"url":"https://patchwork.libcamera.org/api/1.1/users/17/?format=json","username":"epaul","first_name":"Paul","last_name":"Elder","email":"paul.elder@ideasonboard.com"},"mbox":"https://patchwork.libcamera.org/patch/12073/mbox/","series":[{"id":1962,"url":"https://patchwork.libcamera.org/api/1.1/series/1962/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=1962","date":"2021-04-22T09:40:50","name":"FULL hardware level fixes","version":2,"mbox":"https://patchwork.libcamera.org/series/1962/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/12073/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/12073/checks/","tags":{},"headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 6B338BDB17\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 22 Apr 2021 09:41:26 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 05A976886D;\n\tThu, 22 Apr 2021 11:41:26 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 146F968863\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 22 Apr 2021 11:41:24 +0200 (CEST)","from pyrite.rasen.tech (unknown\n\t[IPv6:2400:4051:61:600:2c71:1b79:d06d:5032])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B8A029DA;\n\tThu, 22 Apr 2021 11:41:22 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"K+rahmIk\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1619084483;\n\tbh=HIQgNWwm68K+0vmeDAg2/Cg12y25wiJip/8i/4BJiX4=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=K+rahmIku+X8xW+g9KpLjJhyKAfVYOdsyqiyvpx9srTR/2ZjCZ/xBwtWHm29aqMGt\n\tgnMKcAHp42NDADuHL1A2mqzMf5nc8Tp0oC3FjHSBYUeaUnQ37en9EKwZUAGSzR6pKh\n\tepV89KCua+1Q3Ev+FaeKQK7oKdFbN5B5CxQkbcu8=","From":"Paul Elder <paul.elder@ideasonboard.com>","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\n\ttemplates for FULL requirements","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"},"content":"Add separate functions for manual template and still capture template.\nSet all template values to match FULL requirements.\n\nThis patch fixes the following tests:\n- android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceCreateCaptureBuilder\n- android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceManualTemplate\n- android.hardware.camera2.cts.CameraDeviceTest#testCameraDevicePreviewTemplate\n- android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceRecordingTemplate\n- android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceStillTemplate\n- android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceVideoSnapShotTemplate\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\n\n---\nAll of the templates build off of the preview template, but there is one\ntag that the preview template doesn't initialize but the manual template\nadds, so we still have to allocate space for that one in the preview\ntemplate. Certainly there's a better way...\n---\n src/android/camera_device.cpp | 105 +++++++++++++++++++++++++++++++---\n src/android/camera_device.h   |   2 +\n 2 files changed, 99 insertions(+), 8 deletions(-)","diff":"diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\nindex 7f0f8f1a..c9d4afc3 100644\n--- a/src/android/camera_device.cpp\n+++ b/src/android/camera_device.cpp\n@@ -1596,8 +1596,9 @@ std::unique_ptr<CameraMetadata> CameraDevice::requestTemplatePreview()\n \t/*\n \t * \\todo Keep this in sync with the actual number of entries.\n \t * Currently: 20 entries, 35 bytes\n+\t * \\todo how to split this with the functions that build off of this?\n \t */\n-\tauto requestTemplate = std::make_unique<CameraMetadata>(21, 36);\n+\tauto requestTemplate = std::make_unique<CameraMetadata>(30, 65);\n \tif (!requestTemplate->isValid()) {\n \t\treturn nullptr;\n \t}\n@@ -1653,6 +1654,9 @@ std::unique_ptr<CameraMetadata> CameraDevice::requestTemplatePreview()\n \trequestTemplate->addEntry(ANDROID_CONTROL_AWB_LOCK,\n \t\t\t\t  &awbLock, 1);\n \n+\tuint8_t edgeMode = ANDROID_EDGE_MODE_FAST;\n+\trequestTemplate->addEntry(ANDROID_EDGE_MODE, &edgeMode, 1);\n+\n \tuint8_t flashMode = ANDROID_FLASH_MODE_OFF;\n \trequestTemplate->addEntry(ANDROID_FLASH_MODE,\n \t\t\t\t  &flashMode, 1);\n@@ -1661,7 +1665,8 @@ std::unique_ptr<CameraMetadata> CameraDevice::requestTemplatePreview()\n \trequestTemplate->addEntry(ANDROID_STATISTICS_FACE_DETECT_MODE,\n \t\t\t\t  &faceDetectMode, 1);\n \n-\tuint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF;\n+\t/* \\todo FULL expects this to be FAST, not OFF*/\n+\tuint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_FAST;\n \trequestTemplate->addEntry(ANDROID_NOISE_REDUCTION_MODE,\n \t\t\t\t  &noiseReduction, 1);\n \n@@ -1683,6 +1688,35 @@ std::unique_ptr<CameraMetadata> CameraDevice::requestTemplatePreview()\n \trequestTemplate->addEntry(ANDROID_CONTROL_CAPTURE_INTENT,\n \t\t\t\t  &captureIntent, 1);\n \n+\tint64_t exposureTime = 100000;\n+\trequestTemplate->addEntry(ANDROID_SENSOR_EXPOSURE_TIME,\n+\t\t\t\t  &exposureTime, 1);\n+\n+\tint32_t sensorSensitivity = 32;\n+\trequestTemplate->addEntry(ANDROID_SENSOR_SENSITIVITY,\n+\t\t\t\t  &sensorSensitivity, 1);\n+\n+\tbool blackLevelLock = false;\n+\trequestTemplate->addEntry(ANDROID_BLACK_LEVEL_LOCK,\n+\t\t\t\t  &blackLevelLock, 1);\n+\n+\t/* Hardcode this. We ignore it if it comes in as a request key. */\n+\tint64_t frameDuration = 33333333;\n+\trequestTemplate->addEntry(ANDROID_SENSOR_FRAME_DURATION,\n+\t\t\t\t  &frameDuration, 1);\n+\n+\tuint8_t shadingMapMode = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF;\n+\trequestTemplate->addEntry(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE,\n+\t\t\t\t  &shadingMapMode, 1);\n+\n+\t/* \\todo handle this */\n+\tuint8_t tonemapMode = ANDROID_TONEMAP_MODE_FAST;\n+\trequestTemplate->addEntry(ANDROID_TONEMAP_MODE, &tonemapMode, 1);\n+\n+\t/* \\todo get this from request? and set it. handle map mode too */\n+\tuint8_t shadingMode = ANDROID_SHADING_MODE_FAST;\n+\trequestTemplate->addEntry(ANDROID_SHADING_MODE, &shadingMode, 1);\n+\n \treturn requestTemplate;\n }\n \n@@ -1700,6 +1734,9 @@ std::unique_ptr<CameraMetadata> CameraDevice::requestTemplateVideo()\n \tstaticMetadata_->getEntry(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,\n \t\t\t\t  &entry);\n \n+\tuint8_t edgeMode = ANDROID_EDGE_MODE_FAST;\n+\tpreviewTemplate->updateEntry(ANDROID_EDGE_MODE, &edgeMode, 1);\n+\n \t/*\n \t * Assume the AE_AVAILABLE_TARGET_FPS_RANGE static metadata\n \t * has been assembled as {{min, max} {max, max}}.\n@@ -1710,6 +1747,58 @@ std::unique_ptr<CameraMetadata> CameraDevice::requestTemplateVideo()\n \treturn previewTemplate;\n }\n \n+std::unique_ptr<CameraMetadata> CameraDevice::requestTemplateStill()\n+{\n+\tstd::unique_ptr<CameraMetadata> previewTemplate = requestTemplatePreview();\n+\tif (!previewTemplate)\n+\t\treturn nullptr;\n+\n+\t/*\n+\t * The still template with FULL requires the noise reduction mode to be\n+\t * HIGH_QUALITY.\n+\t */\n+\tuint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY;\n+\tpreviewTemplate->updateEntry(ANDROID_NOISE_REDUCTION_MODE,\n+\t\t\t\t     &noiseReduction, 1);\n+\n+\tuint8_t edgeMode = ANDROID_EDGE_MODE_HIGH_QUALITY;\n+\tpreviewTemplate->updateEntry(ANDROID_EDGE_MODE, &edgeMode, 1);\n+\n+\tuint8_t shadingMode = ANDROID_SHADING_MODE_HIGH_QUALITY;\n+\tpreviewTemplate->updateEntry(ANDROID_SHADING_MODE, &shadingMode, 1);\n+\n+\tuint8_t tonemapMode = ANDROID_TONEMAP_MODE_HIGH_QUALITY;\n+\tpreviewTemplate->updateEntry(ANDROID_TONEMAP_MODE, &tonemapMode, 1);\n+\n+\treturn previewTemplate;\n+}\n+\n+std::unique_ptr<CameraMetadata> CameraDevice::requestTemplateManual()\n+{\n+\tstd::unique_ptr<CameraMetadata> previewTemplate = requestTemplatePreview();\n+\tif (!previewTemplate)\n+\t\treturn nullptr;\n+\n+\tuint8_t controlMode = ANDROID_CONTROL_MODE_OFF;\n+\tpreviewTemplate->updateEntry(ANDROID_CONTROL_MODE, &controlMode, 1);\n+\n+\tuint8_t aeMode = ANDROID_CONTROL_AE_MODE_OFF;\n+\tpreviewTemplate->updateEntry(ANDROID_CONTROL_AE_MODE, &aeMode, 1);\n+\n+\tuint8_t awbMode = ANDROID_CONTROL_AWB_MODE_OFF;\n+\tpreviewTemplate->updateEntry(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);\n+\n+\tuint8_t edgeMode = ANDROID_EDGE_MODE_OFF;\n+\tpreviewTemplate->updateEntry(ANDROID_EDGE_MODE, &edgeMode, 1);\n+\n+\t/* \\todo get this from available filter densities */\n+\tfloat filterDensity = 0.0f;\n+\tpreviewTemplate->addEntry(ANDROID_LENS_FILTER_DENSITY,\n+\t\t\t\t  &filterDensity, 1);\n+\n+\treturn previewTemplate;\n+}\n+\n /*\n  * Produce a metadata pack to be used as template for a capture request.\n  */\n@@ -1728,12 +1817,8 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)\n \t\trequestTemplate = requestTemplatePreview();\n \t\tbreak;\n \tcase CAMERA3_TEMPLATE_STILL_CAPTURE:\n-\t\t/*\n-\t\t * Use the preview template for still capture, they only differ\n-\t\t * for the torch mode we currently do not support.\n-\t\t */\n \t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;\n-\t\trequestTemplate = requestTemplatePreview();\n+\t\trequestTemplate = requestTemplateStill();\n \t\tbreak;\n \tcase CAMERA3_TEMPLATE_VIDEO_RECORD:\n \t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;\n@@ -1743,9 +1828,13 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)\n \t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;\n \t\trequestTemplate = requestTemplateVideo();\n \t\tbreak;\n+\tcase CAMERA3_TEMPLATE_MANUAL:\n+\t\t/* required for FULL */\n+\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;\n+\t\trequestTemplate = requestTemplateManual();\n+\t\tbreak;\n \t/* \\todo Implement templates generation for the remaining use cases. */\n \tcase CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:\n-\tcase CAMERA3_TEMPLATE_MANUAL:\n \tdefault:\n \t\tLOG(HAL, Error) << \"Unsupported template request type: \" << type;\n \t\treturn nullptr;\ndiff --git a/src/android/camera_device.h b/src/android/camera_device.h\nindex 23457e47..8edbcdfd 100644\n--- a/src/android/camera_device.h\n+++ b/src/android/camera_device.h\n@@ -104,6 +104,8 @@ private:\n \tvoid notifyError(uint32_t frameNumber, camera3_stream_t *stream);\n \tstd::unique_ptr<CameraMetadata> requestTemplatePreview();\n \tstd::unique_ptr<CameraMetadata> requestTemplateVideo();\n+\tstd::unique_ptr<CameraMetadata> requestTemplateStill();\n+\tstd::unique_ptr<CameraMetadata> requestTemplateManual();\n \tlibcamera::PixelFormat toPixelFormat(int format) const;\n \tint processControls(Camera3RequestDescriptor *descriptor);\n \tstd::unique_ptr<CameraMetadata> getResultMetadata(\n","prefixes":["libcamera-devel","RFC","v2","06/12"]}