From patchwork Fri Jul 24 14:21:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 8973 X-Patchwork-Delegate: jacopo@jmondi.org 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 104DEBD878 for ; Fri, 24 Jul 2020 14:17:55 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id DF71261220; Fri, 24 Jul 2020 16:17:54 +0200 (CEST) Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B15AB6123A for ; Fri, 24 Jul 2020 16:17:51 +0200 (CEST) X-Originating-IP: 2.224.242.101 Received: from uno.lan (2-224-242-101.ip172.fastwebnet.it [2.224.242.101]) (Authenticated sender: jacopo@jmondi.org) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 0A62360009; Fri, 24 Jul 2020 14:17:50 +0000 (UTC) From: Jacopo Mondi 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 request templates per use-case 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" Currently the request template returned from CameraDevice::constructDefaultRequestSettings() is the same for all the supported template types. To prepare to adjust the template depending on the use case, break out the template generation to dedicated function. As we currently support the PREVIEW use case only, make all the other template types use the captureTemplatePreview() function and just update the capture intent property. This requires a nasty const-cast on the generated template pack which will be removed once the functions will be properly populated. Signed-off-by: Jacopo Mondi --- src/android/camera_device.cpp | 146 +++++++++++++++++++++++++--------- src/android/camera_device.h | 7 ++ 2 files changed, 114 insertions(+), 39 deletions(-) diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp index 48f8090a93db..b8cb118a960e 100644 --- a/src/android/camera_device.cpp +++ b/src/android/camera_device.cpp @@ -821,51 +821,15 @@ const camera_metadata_t *CameraDevice::getStaticMetadata() return staticMetadata_->get(); } -/* - * Produce a metadata pack to be used as template for a capture request. - */ -const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) +const CameraMetadata *CameraDevice::captureTemplatePreview() { - auto it = requestTemplates_.find(type); - if (it != requestTemplates_.end()) - return it->second->get(); - - /* Use the capture intent matching the requested template type. */ - uint8_t captureIntent; - switch (type) { - case CAMERA3_TEMPLATE_PREVIEW: - captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; - break; - case CAMERA3_TEMPLATE_STILL_CAPTURE: - captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; - break; - case CAMERA3_TEMPLATE_VIDEO_RECORD: - captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; - break; - case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: - captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; - break; - case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: - captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; - break; - case CAMERA3_TEMPLATE_MANUAL: - captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL; - break; - default: - LOG(HAL, Error) << "Invalid template request type: " << type; - return nullptr; - } - /* * \todo Keep this in sync with the actual number of entries. * Currently: 12 entries, 15 bytes */ CameraMetadata *requestTemplate = new CameraMetadata(15, 20); - if (!requestTemplate->isValid()) { - LOG(HAL, Error) << "Failed to allocate template metadata"; - delete requestTemplate; + if (!requestTemplate->isValid()) return nullptr; - } uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; requestTemplate->addEntry(ANDROID_CONTROL_AE_MODE, @@ -911,10 +875,114 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) requestTemplate->addEntry(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, &aberrationMode, 1); + uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; requestTemplate->addEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1); - if (!requestTemplate->isValid()) { + return requestTemplate; +} + +const CameraMetadata *CameraDevice::captureTemplateStillCapture() +{ + const CameraMetadata *requestTemplate = captureTemplatePreview(); + if (!requestTemplate || !requestTemplate->isValid()) + return nullptr; + + uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; + const_cast(requestTemplate) + ->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1); + + return requestTemplate; +} + +const CameraMetadata *CameraDevice::captureTemplateVideoRecord() +{ + const CameraMetadata *requestTemplate = captureTemplatePreview(); + if (!requestTemplate || !requestTemplate->isValid()) + return nullptr; + + uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; + const_cast(requestTemplate) + ->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1); + + return requestTemplate; +} + +const CameraMetadata *CameraDevice::captureTemplateVideoSnapshot() +{ + const CameraMetadata *requestTemplate = captureTemplatePreview(); + if (!requestTemplate || !requestTemplate->isValid()) + return nullptr; + + uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; + const_cast(requestTemplate) + ->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1); + + return requestTemplate; +} + +const CameraMetadata *CameraDevice::captureTemplateZSL() +{ + const CameraMetadata *requestTemplate = captureTemplatePreview(); + if (!requestTemplate || !requestTemplate->isValid()) + return nullptr; + + uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; + const_cast(requestTemplate) + ->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1); + + return requestTemplate; +} + +const CameraMetadata *CameraDevice::captureTemplateManual() +{ + const CameraMetadata *requestTemplate = captureTemplatePreview(); + if (!requestTemplate || !requestTemplate->isValid()) + return nullptr; + + uint8_t captureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL; + const_cast(requestTemplate) + ->updateEntry(ANDROID_CONTROL_CAPTURE_INTENT, &captureIntent, 1); + + return requestTemplate; +} + +/* + * Produce a metadata pack to be used as template for a capture request. + */ +const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type) +{ + auto it = requestTemplates_.find(type); + if (it != requestTemplates_.end()) + return it->second->get(); + + /* Use the capture intent matching the requested template type. */ + const CameraMetadata *requestTemplate; + switch (type) { + case CAMERA3_TEMPLATE_PREVIEW: + requestTemplate = captureTemplatePreview(); + break; + case CAMERA3_TEMPLATE_STILL_CAPTURE: + requestTemplate = captureTemplateStillCapture(); + break; + case CAMERA3_TEMPLATE_VIDEO_RECORD: + requestTemplate = captureTemplateVideoRecord(); + break; + case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: + requestTemplate = captureTemplateVideoSnapshot(); + break; + case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: + requestTemplate = captureTemplateZSL(); + break; + case CAMERA3_TEMPLATE_MANUAL: + requestTemplate = captureTemplateManual(); + break; + default: + LOG(HAL, Error) << "Invalid template request type: " << type; + return nullptr; + } + + if (!requestTemplate || !requestTemplate->isValid()) { LOG(HAL, Error) << "Failed to construct request template"; delete requestTemplate; return nullptr; diff --git a/src/android/camera_device.h b/src/android/camera_device.h index af1b58ab6b4e..7bf68e23f7fe 100644 --- a/src/android/camera_device.h +++ b/src/android/camera_device.h @@ -87,6 +87,13 @@ private: std::unique_ptr getResultMetadata(int frame_number, int64_t timestamp); + const CameraMetadata *captureTemplatePreview(); + const CameraMetadata *captureTemplateStillCapture(); + const CameraMetadata *captureTemplateVideoRecord(); + const CameraMetadata *captureTemplateVideoSnapshot(); + const CameraMetadata *captureTemplateZSL(); + const CameraMetadata *captureTemplateManual(); + unsigned int id_; camera3_device_t camera3Device_;