{"id":8973,"url":"https://patchwork.libcamera.org/api/1.1/patches/8973/?format=json","web_url":"https://patchwork.libcamera.org/patch/8973/","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":"<20200724142120.95538-6-jacopo@jmondi.org>","date":"2020-07-24T14:21:19","name":"[libcamera-devel,5/6] android: camera_device: Create request templates per use-case","commit_ref":null,"pull_url":null,"state":"superseded","archived":true,"hash":"7bb2d6096ff099464b3bf251c77119aeef55f34c","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/1.1/people/3/?format=json","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"delegate":{"id":15,"url":"https://patchwork.libcamera.org/api/1.1/users/15/?format=json","username":"jmondi","first_name":"Jacopo","last_name":"Mondi","email":"jacopo@jmondi.org"},"mbox":"https://patchwork.libcamera.org/patch/8973/mbox/","series":[{"id":1137,"url":"https://patchwork.libcamera.org/api/1.1/series/1137/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=1137","date":"2020-07-24T14:21:14","name":"android: camera_device: generate templates per use-case","version":1,"mbox":"https://patchwork.libcamera.org/series/1137/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/8973/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/8973/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 104DEBD878\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 24 Jul 2020 14:17:55 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DF71261220;\n\tFri, 24 Jul 2020 16:17:54 +0200 (CEST)","from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net\n\t[217.70.183.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B15AB6123A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 24 Jul 2020 16:17:51 +0200 (CEST)","from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101])\n\t(Authenticated sender: jacopo@jmondi.org)\n\tby relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 0A62360009;\n\tFri, 24 Jul 2020 14:17:50 +0000 (UTC)"],"X-Originating-IP":"2.224.242.101","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"libcamera-devel@lists.libcamera.org","Date":"Fri, 24 Jul 2020 16:21:19 +0200","Message-Id":"<20200724142120.95538-6-jacopo@jmondi.org>","X-Mailer":"git-send-email 2.27.0","In-Reply-To":"<20200724142120.95538-1-jacopo@jmondi.org>","References":"<20200724142120.95538-1-jacopo@jmondi.org>","MIME-Version":"1.0","Subject":"[libcamera-devel] [PATCH 5/6] android: camera_device: Create\n\trequest templates per use-case","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":"Currently the request template returned from\nCameraDevice::constructDefaultRequestSettings() is the same for all\nthe supported template types.\n\nTo prepare to adjust the template depending on the use case, break out\nthe template generation to dedicated function.\n\nAs we currently support the PREVIEW use case only, make all the other\ntemplate types use the captureTemplatePreview() function and just update\nthe capture intent property. This requires a nasty const-cast on the\ngenerated template pack which will be removed once the functions will be\nproperly populated.\n\nSigned-off-by: Jacopo Mondi <jacopo@jmondi.org>\n---\n src/android/camera_device.cpp | 146 +++++++++++++++++++++++++---------\n src/android/camera_device.h   |   7 ++\n 2 files changed, 114 insertions(+), 39 deletions(-)","diff":"diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\nindex 48f8090a93db..b8cb118a960e 100644\n--- a/src/android/camera_device.cpp\n+++ b/src/android/camera_device.cpp\n@@ -821,51 +821,15 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()\n \treturn staticMetadata_->get();\n }\n \n-/*\n- * Produce a metadata pack to be used as template for a capture request.\n- */\n-const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)\n+const CameraMetadata *CameraDevice::captureTemplatePreview()\n {\n-\tauto it = requestTemplates_.find(type);\n-\tif (it != requestTemplates_.end())\n-\t\treturn it->second->get();\n-\n-\t/* Use the capture intent matching the requested template type. */\n-\tuint8_t captureIntent;\n-\tswitch (type) {\n-\tcase CAMERA3_TEMPLATE_PREVIEW:\n-\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;\n-\t\tbreak;\n-\tcase CAMERA3_TEMPLATE_STILL_CAPTURE:\n-\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;\n-\t\tbreak;\n-\tcase CAMERA3_TEMPLATE_VIDEO_RECORD:\n-\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;\n-\t\tbreak;\n-\tcase CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:\n-\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;\n-\t\tbreak;\n-\tcase CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:\n-\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;\n-\t\tbreak;\n-\tcase CAMERA3_TEMPLATE_MANUAL:\n-\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;\n-\t\tbreak;\n-\tdefault:\n-\t\tLOG(HAL, Error) << \"Invalid template request type: \" << type;\n-\t\treturn nullptr;\n-\t}\n-\n \t/*\n \t * \\todo Keep this in sync with the actual number of entries.\n \t * Currently: 12 entries, 15 bytes\n \t */\n \tCameraMetadata *requestTemplate = new CameraMetadata(15, 20);\n-\tif (!requestTemplate->isValid()) {\n-\t\tLOG(HAL, Error) << \"Failed to allocate template metadata\";\n-\t\tdelete requestTemplate;\n+\tif (!requestTemplate->isValid())\n \t\treturn nullptr;\n-\t}\n \n \tuint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;\n \trequestTemplate->addEntry(ANDROID_CONTROL_AE_MODE,\n@@ -911,10 +875,114 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)\n \trequestTemplate->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE,\n \t\t\t\t  &aberrationMode, 1);\n \n+\tuint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;\n \trequestTemplate->addEntry(ANDROID_CONTROL_CAPTURE_INTENT,\n \t\t\t\t  &captureIntent, 1);\n \n-\tif (!requestTemplate->isValid()) {\n+\treturn requestTemplate;\n+}\n+\n+const CameraMetadata *CameraDevice::captureTemplateStillCapture()\n+{\n+\tconst CameraMetadata *requestTemplate = captureTemplatePreview();\n+\tif (!requestTemplate || !requestTemplate->isValid())\n+\t\treturn nullptr;\n+\n+\tuint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;\n+\tconst_cast<CameraMetadata *>(requestTemplate)\n+\t\t->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);\n+\n+\treturn requestTemplate;\n+}\n+\n+const CameraMetadata *CameraDevice::captureTemplateVideoRecord()\n+{\n+\tconst CameraMetadata *requestTemplate = captureTemplatePreview();\n+\tif (!requestTemplate || !requestTemplate->isValid())\n+\t\treturn nullptr;\n+\n+\tuint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;\n+\tconst_cast<CameraMetadata *>(requestTemplate)\n+\t\t->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);\n+\n+\treturn requestTemplate;\n+}\n+\n+const CameraMetadata *CameraDevice::captureTemplateVideoSnapshot()\n+{\n+\tconst CameraMetadata *requestTemplate = captureTemplatePreview();\n+\tif (!requestTemplate || !requestTemplate->isValid())\n+\t\treturn nullptr;\n+\n+\tuint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;\n+\tconst_cast<CameraMetadata *>(requestTemplate)\n+\t\t->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);\n+\n+\treturn requestTemplate;\n+}\n+\n+const CameraMetadata *CameraDevice::captureTemplateZSL()\n+{\n+\tconst CameraMetadata *requestTemplate = captureTemplatePreview();\n+\tif (!requestTemplate || !requestTemplate->isValid())\n+\t\treturn nullptr;\n+\n+\tuint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;\n+\tconst_cast<CameraMetadata *>(requestTemplate)\n+\t\t->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);\n+\n+\treturn requestTemplate;\n+}\n+\n+const CameraMetadata *CameraDevice::captureTemplateManual()\n+{\n+\tconst CameraMetadata *requestTemplate = captureTemplatePreview();\n+\tif (!requestTemplate || !requestTemplate->isValid())\n+\t\treturn nullptr;\n+\n+\tuint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;\n+\tconst_cast<CameraMetadata *>(requestTemplate)\n+\t\t->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1);\n+\n+\treturn requestTemplate;\n+}\n+\n+/*\n+ * Produce a metadata pack to be used as template for a capture request.\n+ */\n+const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)\n+{\n+\tauto it = requestTemplates_.find(type);\n+\tif (it != requestTemplates_.end())\n+\t\treturn it->second->get();\n+\n+\t/* Use the capture intent matching the requested template type. */\n+\tconst CameraMetadata *requestTemplate;\n+\tswitch (type) {\n+\tcase CAMERA3_TEMPLATE_PREVIEW:\n+\t\trequestTemplate = captureTemplatePreview();\n+\t\tbreak;\n+\tcase CAMERA3_TEMPLATE_STILL_CAPTURE:\n+\t\trequestTemplate = captureTemplateStillCapture();\n+\t\tbreak;\n+\tcase CAMERA3_TEMPLATE_VIDEO_RECORD:\n+\t\trequestTemplate = captureTemplateVideoRecord();\n+\t\tbreak;\n+\tcase CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:\n+\t\trequestTemplate = captureTemplateVideoSnapshot();\n+\t\tbreak;\n+\tcase CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:\n+\t\trequestTemplate = captureTemplateZSL();\n+\t\tbreak;\n+\tcase CAMERA3_TEMPLATE_MANUAL:\n+\t\trequestTemplate = captureTemplateManual();\n+\t\tbreak;\n+\tdefault:\n+\t\tLOG(HAL, Error) << \"Invalid template request type: \" << type;\n+\t\treturn nullptr;\n+\t}\n+\n+\tif (!requestTemplate || !requestTemplate->isValid()) {\n \t\tLOG(HAL, Error) << \"Failed to construct request template\";\n \t\tdelete requestTemplate;\n \t\treturn nullptr;\ndiff --git a/src/android/camera_device.h b/src/android/camera_device.h\nindex af1b58ab6b4e..7bf68e23f7fe 100644\n--- a/src/android/camera_device.h\n+++ b/src/android/camera_device.h\n@@ -87,6 +87,13 @@ private:\n \tstd::unique_ptr<CameraMetadata> getResultMetadata(int frame_number,\n \t\t\t\t\t\t\t  int64_t timestamp);\n \n+\tconst CameraMetadata *captureTemplatePreview();\n+\tconst CameraMetadata *captureTemplateStillCapture();\n+\tconst CameraMetadata *captureTemplateVideoRecord();\n+\tconst CameraMetadata *captureTemplateVideoSnapshot();\n+\tconst CameraMetadata *captureTemplateZSL();\n+\tconst CameraMetadata *captureTemplateManual();\n+\n \tunsigned int id_;\n \tcamera3_device_t camera3Device_;\n \n","prefixes":["libcamera-devel","5/6"]}